@appilots/cli 0.10.0 → 0.11.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/version.ts","../../src/config/index.ts","../../src/cli/utils/logger.ts","../../src/cli/commands/init.ts","../../../shared/src/constants/index.ts","../../src/utils/stringify.ts","../../src/services/api-client.ts","../../src/cli/utils/server-hint.ts","../../src/cli/commands/sync.ts","../../src/generators/MCPGenerator.ts","../../src/pipeline/enrichment.ts","../../src/analyzers/ReactNativePlatformAnalyzer.ts","../../src/analyzers/ScreenAnalyzer.ts","../../src/ast/parse.ts","../../src/ast/jsx/attributes.ts","../../src/ast/jsx/classify.ts","../../src/ast/functions/collect.ts","../../src/ast/functions/analyze-async.ts","../../src/ast/navigation/calls.ts","../../src/extractors/appilots/jsdoc.ts","../../src/analyzers/NavigationAnalyzer.ts","../../src/analyzers/ComponentAnalyzer.ts","../../src/analyzers/FormAnalyzer.ts","../../src/analyzers/GenericPlatformAnalyzer.ts","../../src/analyzers/web/WebScreenAnalyzer.ts","../../src/ast/jsx/web/classify.ts","../../src/ast/jsx/names.ts","../../src/ast/navigation/web-calls.ts","../../src/analyzers/web/WebNavigationAnalyzer.ts","../../src/analyzers/web/ReactWebPlatformAnalyzer.ts","../../src/manifest/loadManifest.ts","../../../../node_modules/zod/v3/external.js","../../../../node_modules/zod/v3/helpers/util.js","../../../../node_modules/zod/v3/ZodError.js","../../../../node_modules/zod/v3/locales/en.js","../../../../node_modules/zod/v3/errors.js","../../../../node_modules/zod/v3/helpers/parseUtil.js","../../../../node_modules/zod/v3/helpers/errorUtil.js","../../../../node_modules/zod/v3/types.js","../../../shared/src/validators/mcp-document.ts","../../../shared/src/validators/index.ts","../../src/pipeline/metadata-lint.ts","../../src/cli/utils/metadata-report.ts","../../src/cli/utils/remote-drift.ts","../../src/cli/utils/upload-failure.ts","../../src/cli/utils/empty-document.ts","../../src/cli/commands/watch.ts","../../src/cli/commands/generate.ts","../../src/cli/commands/annotate.ts","../../src/annotate/sites.ts","../../src/annotate/forwarding.ts","../../src/annotate/apply.ts","../../src/annotate/forward.ts","../../src/cli/commands/status.ts","../../src/cli/commands/eval.ts","../../src/eval/scenario-loader.ts","../../src/eval/matcher.ts","../../src/eval/baseline.ts","../../src/eval/scaffold.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLI_VERSION } from '../version';\nimport { loadConfig } from '../config/index';\nimport { banner, error, info } from './utils/logger';\nimport { initCommand } from './commands/init';\nimport { syncCommand } from './commands/sync';\nimport { watchCommand } from './commands/watch';\nimport { generateCommand } from './commands/generate';\nimport { annotateCommand } from './commands/annotate';\nimport { statusCommand } from './commands/status';\nimport { evalCommand } from './commands/eval';\nimport { stringifyUnknown } from '../utils/stringify';\n\nasync function main() {\n const program = new Command();\n\n program\n .name('appilots')\n .description(\n 'Analyze your React Native app and generate MCP documents for AI-powered navigation.\\n\\n' +\n 'Quick start:\\n' +\n ' $ appilots init --api-key ak_xxx\\n' +\n ' $ appilots sync\\n' +\n ' $ appilots watch',\n )\n .version(CLI_VERSION)\n .option('--verbose', 'Enable verbose logging');\n\n // Register all commands\n program.addCommand(initCommand());\n program.addCommand(syncCommand());\n program.addCommand(watchCommand());\n program.addCommand(generateCommand());\n program.addCommand(annotateCommand());\n program.addCommand(statusCommand());\n program.addCommand(evalCommand());\n\n // If no arguments, check for config and default to sync\n const args = process.argv.slice(2);\n const firstArg = args[0];\n const hasCommand = firstArg !== undefined && args.length > 0 && !firstArg.startsWith('-');\n\n if (args.length === 0) {\n const config = loadConfig();\n if (config) {\n // Default to sync when config exists\n process.argv.push('sync');\n } else {\n banner();\n info('Welcome to Appilots! Get started with:');\n info(' appilots init --api-key <your-ak_key>');\n console.log('');\n program.outputHelp();\n return;\n }\n }\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n error(stringifyUnknown(err));\n process.exit(1);\n});\n","/**\n * GENERATED by scripts/release/sync-sdk-versions.mjs — do not edit.\n *\n * The version `@appilots/cli` prints for `appilots --version` and in its\n * banner. Kept identical to package.json by the release flow;\n * `version.test.ts` fails if the two ever disagree.\n */\nexport const CLI_VERSION = '0.10.0';\n","import { readFileSync, writeFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { existsSync, statSync } from 'fs';\n\n/**\n * Where the CLI points when nothing says otherwise — the local `pnpm dev`\n * backend. Exported so commands can tell \"unreachable server\" apart from\n * \"server was never configured\".\n */\nexport const DEFAULT_SERVER_URL = 'http://localhost:4000';\n\n/**\n * Appilots configuration interface\n */\nexport interface AppilotsConfig {\n /** API key for authenticating with Appilots backend */\n apiKey: string;\n /**\n * Project ID on Appilots dashboard. Optional at load time — the API key\n * already identifies the project server-side (env-only CI workflows run\n * without a .appilotsrc), so commands must not assume it is present.\n */\n projectId?: string;\n /** Server URL for Appilots API */\n serverUrl: string;\n /** Output directory for generated files */\n outputDir?: string;\n /** Glob patterns to include in analysis */\n include?: string[];\n /** Glob patterns to exclude from analysis */\n exclude?: string[];\n /** Automatically activate generated MCP on sync */\n autoActivate?: boolean;\n /**\n * Strict screen filtering (§1).\n * When true, only files with registerScreen() calls or matching\n * screenPatterns are included as screens in the MCP document.\n * Default: true (exclude components/hooks/config files from the MCP screen map)\n */\n strictScreens?: boolean;\n /**\n * Glob patterns that identify screen files (used with strictScreens).\n * Default: ['**\\/*Screen.{ts,tsx}', '**\\/screens/**\\/*.{ts,tsx}']\n */\n screenPatterns?: string[];\n /**\n * Additional glob patterns for navigation file discovery (§5).\n * These are ADDED to the default patterns, not replacing them.\n */\n navigationInclude?: string[];\n /**\n * Glob patterns to exclude from navigation analysis (§5).\n */\n navigationExclude?: string[];\n /**\n * Target platform for source analysis (multi-platform prep). Selects\n * which `PlatformAnalyzer` the generator runs and its default globs.\n * `'react-native'` (the default when unset) runs the existing\n * Babel/JSX analyzer pipeline. `'web'` runs the React web analyzer\n * (DOM-vocabulary JSX + React Router route discovery). Any other\n * value (`'android'`, `'ios'`, a custom platform id, ...) runs a\n * no-op analyzer that does no source parsing — screens for that\n * platform come entirely from a declared manifest (see\n * `manifestPath`). Forward-compatible: unknown values degrade\n * gracefully instead of erroring.\n */\n platform?: string;\n /**\n * Path to a declared `appilots.manifest.json`, relative to the\n * project root unless absolute. Screens declared here (in the same\n * `ScreenDescriptor` shape the analyzers produce) merge on top of\n * analyzer-derived screens, winning on a name conflict. Default:\n * `appilots.manifest.json` at the project root. A missing file is not\n * an error — manifest mode is opt-in.\n */\n manifestPath?: string;\n /** `appilots eval` settings — see docs: Testing your agent between releases. */\n eval?: EvalConfig;\n}\n\nexport interface EvalConfig {\n /** Directory of `*.json` scenario files. Default: `<outputDir>/scenarios`. */\n scenariosDir?: string;\n /** Committed baseline file. Default: `<outputDir>/eval-baseline.json`. */\n baselinePath?: string;\n /** Minimum fraction of scenarios that must pass (0-1). Default: 0.95. */\n minPassRate?: number;\n /** Max fractional token increase vs baseline before it's flagged as a\n * regression on an otherwise-passing scenario. Default: 0.25 (+25%). */\n maxTokenRegression?: number;\n}\n\n/**\n * Validation result type\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n /**\n * Non-fatal problems — today, keys the CLI does not understand. A typo\n * here is silently ignored at load time and only surfaces much later as\n * a confusing failure, so it is worth saying out loud.\n */\n warnings: string[];\n}\n\n/**\n * Every key `AppilotsConfig` understands. Anything else in a .appilotsrc\n * is dead weight: it is dropped by the loader and the default is used\n * instead. Keep in sync with `AppilotsConfig` — `config.test.ts` fails if\n * a documented key is missing here.\n */\nexport const KNOWN_CONFIG_KEYS = [\n 'apiKey',\n 'projectId',\n 'serverUrl',\n 'outputDir',\n 'include',\n 'exclude',\n 'autoActivate',\n 'strictScreens',\n 'screenPatterns',\n 'navigationInclude',\n 'navigationExclude',\n 'platform',\n 'manifestPath',\n 'eval',\n] as const;\n\n/**\n * Names people reach for that mean something we do support. `apiUrl` is\n * the common one: it reads like the right key, is accepted without a\n * murmur, and leaves the CLI talking to the default localhost server.\n */\nconst KEY_ALIASES: Record<string, string> = {\n apiUrl: 'serverUrl',\n // `@appilots/sdk`'s own name for this. One `.appilotsrc` feeds both\n // packages, so an integrator who wrote the SDK's key should not be told\n // it is unrecognized.\n apiBaseUrl: 'serverUrl',\n apiURL: 'serverUrl',\n baseUrl: 'serverUrl',\n url: 'serverUrl',\n host: 'serverUrl',\n endpoint: 'serverUrl',\n server: 'serverUrl',\n key: 'apiKey',\n token: 'apiKey',\n project: 'projectId',\n sourceDir: 'include',\n srcDir: 'include',\n source: 'include',\n outDir: 'outputDir',\n};\n\n/** Levenshtein distance, used only for short config-key suggestions. */\nfunction editDistance(a: string, b: string): number {\n let previous = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n const current = [i];\n for (let j = 1; j <= b.length; j++) {\n const deletion = (previous[j] ?? 0) + 1;\n const insertion = (current[j - 1] ?? 0) + 1;\n const substitution = (previous[j - 1] ?? 0) + (a[i - 1] === b[j - 1] ? 0 : 1);\n current.push(Math.min(deletion, insertion, substitution));\n }\n previous = current;\n }\n return previous[b.length] ?? 0;\n}\n\n/**\n * Best guess for what an unrecognized key was meant to be: a known alias\n * first, then the closest known key by edit distance. Returns undefined\n * rather than guessing wildly — a bad suggestion is worse than none.\n */\nexport function suggestConfigKey(key: string): string | undefined {\n const alias = KEY_ALIASES[key];\n if (alias) return alias;\n\n const lower = key.toLowerCase();\n let best: { key: string; distance: number } | undefined;\n for (const known of KNOWN_CONFIG_KEYS) {\n const distance = editDistance(lower, known.toLowerCase());\n if (distance <= 2 && (!best || distance < best.distance)) {\n best = { key: known, distance };\n }\n }\n return best?.key;\n}\n\n/**\n * Environment overrides recognized by the CLI. Precedence when loading:\n * command-line flags (applied by each command) > env vars > .appilotsrc.\n */\nexport interface EnvOverrides {\n apiKey?: string;\n projectId?: string;\n serverUrl?: string;\n}\n\n/**\n * Reads APPILOTS_* environment variables, treating blank values as unset.\n */\nexport function getEnvOverrides(env: NodeJS.ProcessEnv = process.env): EnvOverrides {\n const clean = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n };\n return {\n apiKey: clean(env.APPILOTS_API_KEY),\n projectId: clean(env.APPILOTS_PROJECT_ID),\n serverUrl: clean(env.APPILOTS_SERVER_URL),\n };\n}\n\n/**\n * Loads configuration from the nearest .appilotsrc merged with APPILOTS_*\n * environment variables (env wins). Works without a .appilotsrc when\n * APPILOTS_API_KEY is set, so CI can run `appilots sync` with env vars only.\n *\n * @param onWarn Called once per non-fatal problem (unrecognized keys).\n * Commands pass the logger's `warn`; omitting it keeps loading silent.\n * @returns AppilotsConfig if a file or APPILOTS_API_KEY exists, null otherwise\n * @throws when the file is unparseable or the merged config fails validation\n */\nexport function loadConfig(onWarn?: (message: string) => void): AppilotsConfig | null {\n const configPath = getConfigPath();\n const env = getEnvOverrides();\n\n let fileConfig: Record<string, unknown> = {};\n if (configPath) {\n try {\n fileConfig = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch (error) {\n throw new Error(\n `Failed to parse .appilotsrc at ${configPath}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n } else if (!env.apiKey) {\n return null;\n }\n\n const merged = {\n serverUrl: DEFAULT_SERVER_URL,\n outputDir: '.appilots',\n autoActivate: true,\n strictScreens: true,\n ...fileConfig,\n ...(env.apiKey ? { apiKey: env.apiKey } : {}),\n ...(env.projectId ? { projectId: env.projectId } : {}),\n ...(env.serverUrl ? { serverUrl: env.serverUrl } : {}),\n } as AppilotsConfig;\n\n const validation = validateConfig(merged);\n if (onWarn) {\n const source = configPath ?? 'environment variables';\n for (const warning of validation.warnings) {\n onWarn(`${source}: ${warning}`);\n }\n }\n if (!validation.valid) {\n const source = configPath ?? 'environment variables';\n throw new Error(\n `Invalid Appilots configuration (${source}):\\n` +\n validation.errors.map((e) => ` - ${e}`).join('\\n') +\n '\\nFix .appilotsrc or set APPILOTS_API_KEY / APPILOTS_SERVER_URL.',\n );\n }\n\n return merged;\n}\n\n/**\n * Saves configuration to .appilotsrc in the given directory\n *\n * @param dir Directory to write .appilotsrc to\n * @param config Partial config to merge with defaults\n */\nexport function saveConfig(dir: string, config: Partial<AppilotsConfig>): void {\n const configPath = join(dir, '.appilotsrc');\n const existingConfig = getConfigPath() ? loadConfig() : null;\n\n const mergedConfig: AppilotsConfig = {\n apiKey: config.apiKey || existingConfig?.apiKey || '',\n projectId: config.projectId || existingConfig?.projectId || '',\n serverUrl: config.serverUrl || existingConfig?.serverUrl || DEFAULT_SERVER_URL,\n outputDir: config.outputDir || existingConfig?.outputDir || '.appilots',\n autoActivate:\n config.autoActivate !== undefined\n ? config.autoActivate\n : (existingConfig?.autoActivate ?? true),\n include: config.include || existingConfig?.include,\n exclude: config.exclude || existingConfig?.exclude,\n strictScreens: config.strictScreens ?? existingConfig?.strictScreens ?? true,\n screenPatterns: config.screenPatterns || existingConfig?.screenPatterns,\n navigationInclude: config.navigationInclude || existingConfig?.navigationInclude,\n navigationExclude: config.navigationExclude || existingConfig?.navigationExclude,\n platform: config.platform || existingConfig?.platform,\n manifestPath: config.manifestPath || existingConfig?.manifestPath,\n eval: config.eval || existingConfig?.eval,\n };\n\n try {\n writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2), 'utf-8');\n } catch (error) {\n throw new Error(\n `Failed to write .appilotsrc to ${configPath}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\n/**\n * Finds and returns the path to the nearest .appilotsrc file by walking up\n * the directory tree from cwd. Follows the same logic as .npmrc lookup.\n *\n * @returns Path to .appilotsrc if found, null otherwise\n */\nexport function getConfigPath(): string | null {\n let currentDir = resolve(process.cwd());\n const root = resolve('/');\n\n while (currentDir !== root) {\n const configPath = join(currentDir, '.appilotsrc');\n try {\n if (existsSync(configPath) && statSync(configPath).isFile()) {\n return configPath;\n }\n } catch {\n // Continue searching if we can't access the file\n }\n currentDir = resolve(currentDir, '..');\n }\n\n // Check root level as last resort\n const rootConfigPath = join(root, '.appilotsrc');\n try {\n if (existsSync(rootConfigPath) && statSync(rootConfigPath).isFile()) {\n return rootConfigPath;\n }\n } catch {\n // Ignore\n }\n\n return null;\n}\n\n/**\n * Validates an Appilots configuration object for required fields and types\n *\n * @param config Configuration object to validate\n * @returns ValidationResult with valid flag and array of error messages\n */\nexport function validateConfig(config: any): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!config || typeof config !== 'object') {\n return {\n valid: false,\n errors: ['Configuration must be an object'],\n warnings,\n };\n }\n\n // Unknown keys are dropped by the loader, so a typo turns into the\n // default value being used — never an error. Say it out loud.\n for (const key of Object.keys(config)) {\n if ((KNOWN_CONFIG_KEYS as readonly string[]).includes(key)) continue;\n const suggestion = suggestConfigKey(key);\n warnings.push(\n `unknown key \"${key}\" — ignored` + (suggestion ? ` (did you mean \"${suggestion}\"?)` : ''),\n );\n }\n\n // Check required fields\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n errors.push(\n 'apiKey is required and must be a string (set it in .appilotsrc or via APPILOTS_API_KEY)',\n );\n } else if (!config.apiKey.startsWith('ak_')) {\n errors.push('apiKey must start with \"ak_\"');\n }\n\n // projectId is optional (the API key identifies the project), but when\n // present it must be a non-empty string\n if (\n config.projectId !== undefined &&\n config.projectId !== '' &&\n typeof config.projectId !== 'string'\n ) {\n errors.push('projectId must be a string');\n }\n\n // Check optional fields types\n if (config.serverUrl !== undefined && typeof config.serverUrl !== 'string') {\n errors.push('serverUrl must be a string');\n }\n\n if (config.outputDir !== undefined && typeof config.outputDir !== 'string') {\n errors.push('outputDir must be a string');\n }\n\n if (config.include !== undefined && !Array.isArray(config.include)) {\n errors.push('include must be an array of strings');\n } else if (\n Array.isArray(config.include) &&\n !config.include.every((item: unknown) => typeof item === 'string')\n ) {\n errors.push('include must be an array of strings');\n }\n\n if (config.exclude !== undefined && !Array.isArray(config.exclude)) {\n errors.push('exclude must be an array of strings');\n } else if (\n Array.isArray(config.exclude) &&\n !config.exclude.every((item: unknown) => typeof item === 'string')\n ) {\n errors.push('exclude must be an array of strings');\n }\n\n if (config.autoActivate !== undefined && typeof config.autoActivate !== 'boolean') {\n errors.push('autoActivate must be a boolean');\n }\n\n if (config.strictScreens !== undefined && typeof config.strictScreens !== 'boolean') {\n errors.push('strictScreens must be a boolean');\n }\n\n for (const field of ['screenPatterns', 'navigationInclude', 'navigationExclude'] as const) {\n const value = config[field];\n if (\n value !== undefined &&\n (!Array.isArray(value) || !value.every((item: unknown) => typeof item === 'string'))\n ) {\n errors.push(`${field} must be an array of strings`);\n }\n }\n\n if (config.platform !== undefined && typeof config.platform !== 'string') {\n errors.push('platform must be a string');\n }\n\n if (config.manifestPath !== undefined && typeof config.manifestPath !== 'string') {\n errors.push('manifestPath must be a string');\n }\n\n if (config.eval !== undefined) {\n if (typeof config.eval !== 'object' || config.eval === null || Array.isArray(config.eval)) {\n errors.push('eval must be an object');\n } else {\n const evalConfig = config.eval as Record<string, unknown>;\n if (evalConfig.scenariosDir !== undefined && typeof evalConfig.scenariosDir !== 'string') {\n errors.push('eval.scenariosDir must be a string');\n }\n if (evalConfig.baselinePath !== undefined && typeof evalConfig.baselinePath !== 'string') {\n errors.push('eval.baselinePath must be a string');\n }\n if (\n evalConfig.minPassRate !== undefined &&\n (typeof evalConfig.minPassRate !== 'number' ||\n evalConfig.minPassRate < 0 ||\n evalConfig.minPassRate > 1)\n ) {\n errors.push('eval.minPassRate must be a number between 0 and 1');\n }\n if (\n evalConfig.maxTokenRegression !== undefined &&\n (typeof evalConfig.maxTokenRegression !== 'number' || evalConfig.maxTokenRegression < 0)\n ) {\n errors.push('eval.maxTokenRegression must be a non-negative number');\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n","import chalk from 'chalk';\nimport { CLI_VERSION } from '../../version';\nimport ora from 'ora';\n\n/**\n * Pretty CLI logger using chalk and ora\n */\n\nexport type LogMode = 'pretty' | 'quiet' | 'json';\n\n/**\n * Global output mode. 'quiet' silences decorative output (banner, info,\n * success, dim) keeping warnings/errors; 'json' silences everything on\n * stdout except the final JSON payload (errors go to stderr) so CI can\n * pipe the output straight into a parser.\n */\nlet mode: LogMode = 'pretty';\n\nexport function setLogMode(next: LogMode): void {\n mode = next;\n}\n\nexport function getLogMode(): LogMode {\n return mode;\n}\n\n/**\n * Prints the machine-readable result of a command. Only mode 'json'\n * emits it — pretty/quiet runs already communicated via the logger.\n */\nexport function jsonOutput(payload: unknown): void {\n if (mode === 'json') {\n console.log(JSON.stringify(payload, null, 2));\n }\n}\n\n/**\n * Creates and returns an ora spinner instance. Silent in quiet/json mode\n * (spinner control sequences would corrupt piped output).\n *\n * @param text Text to display while spinning\n * @returns Ora spinner instance\n */\nexport function createSpinner(text: string) {\n return ora({ text, isSilent: mode !== 'pretty' });\n}\n\n/**\n * Prints a success message with a green checkmark\n *\n * @param msg Message to display\n */\nexport function success(msg: string): void {\n if (mode !== 'pretty') return;\n console.log(chalk.green.bold('✓'), msg);\n}\n\n/**\n * Prints an error message with a red X. Always emitted — on stderr in\n * json mode so stdout stays parseable.\n *\n * @param msg Message to display\n */\nexport function error(msg: string): void {\n if (mode === 'json') {\n console.error(chalk.red.bold('✗'), msg);\n return;\n }\n console.log(chalk.red.bold('✗'), msg);\n}\n\n/**\n * Prints a warning message with a yellow warning symbol. Kept in quiet\n * mode; routed to stderr in json mode.\n *\n * @param msg Message to display\n */\nexport function warn(msg: string): void {\n if (mode === 'json') {\n console.error(chalk.yellow.bold('⚠'), msg);\n return;\n }\n console.log(chalk.yellow.bold('⚠'), msg);\n}\n\n/**\n * Prints an informational message with a blue info icon\n *\n * @param msg Message to display\n */\nexport function info(msg: string): void {\n if (mode !== 'pretty') return;\n console.log(chalk.blue.bold('ℹ'), msg);\n}\n\n/**\n * Prints dimmed/gray text\n *\n * @param msg Message to display\n */\nexport function dim(msg: string): void {\n if (mode !== 'pretty') return;\n console.log(chalk.dim(msg));\n}\n\n/** Inner width of the banner box, in characters — the run of `═` in its border. */\nconst BANNER_WIDTH = 39;\n\n/**\n * One `║ … ║` row, padded to the box width.\n *\n * Padding is measured on the PLAIN text and the color is applied after,\n * because a chalk-wrapped string carries ANSI escapes that `length` counts\n * and the terminal does not. The counts used to be hand-written spaces, and\n * neither row actually closed the box: the title was 2 short and the version\n * row 8, so the \"box\" rendered with a ragged right edge. Computing them also\n * means the row survives a version string of a different length — `0.4.0`\n * becoming `0.10.0` no longer shifts the border.\n */\nfunction bannerRow(plain: string, colored: string): string {\n return ` ${chalk.cyan('║')} ${colored}${' '.repeat(Math.max(0, BANNER_WIDTH - 5 - plain.length))}${chalk.cyan('║')}`;\n}\n\n/**\n * Prints the Appilots ASCII logo and header with version\n */\nexport function banner(): void {\n if (mode !== 'pretty') return;\n const title = 'Appilots MCP Generator';\n const version = `v${CLI_VERSION}`;\n const border = '═'.repeat(BANNER_WIDTH);\n const logo = [\n '',\n ` ${chalk.cyan(`╔${border}╗`)}`,\n bannerRow(title, chalk.bold.cyan(title)),\n bannerRow(version, chalk.dim(version)),\n ` ${chalk.cyan(`╚${border}╝`)}`,\n ' ',\n ].join('\\n');\n console.log(logo);\n}\n\n/**\n * Prints a section heading (plain line). Suppressed outside pretty mode.\n */\nexport function heading(msg: string): void {\n if (mode !== 'pretty') return;\n console.log(msg);\n}\n\n/**\n * Prints a simple two-column aligned table\n *\n * @param rows Array of [key, value] pairs to display\n */\nexport function table(rows: [string, string][]): void {\n if (mode !== 'pretty' || rows.length === 0) {\n return;\n }\n\n // Calculate the maximum key length for alignment\n const maxKeyLength = Math.max(...rows.map(([key]) => key.length));\n\n rows.forEach(([key, value]) => {\n const padding = ' '.repeat(maxKeyLength - key.length + 2);\n console.log(` ${chalk.bold(key)}${padding}${value}`);\n });\n}\n","import { Command } from 'commander';\nimport { AppilotsAPIClient } from '../../services/api-client';\nimport { saveConfig, getConfigPath, getEnvOverrides, DEFAULT_SERVER_URL } from '../../config/index';\nimport { banner, success, error, warn, info, dim } from '../utils/logger';\nimport { existsSync, readFileSync, appendFileSync } from 'fs';\nimport { join } from 'path';\nimport { hintUnreachableServer } from '../utils/server-hint';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface InitOptions {\n apiKey?: string;\n server?: string;\n}\n\n/**\n * .appilotsrc stores the API key in plain text, so it must never be\n * committed. Appends it to the project's .gitignore when missing;\n * returns what happened so the command can phrase the warning.\n */\nfunction ensureConfigIgnored(dir: string): 'already-ignored' | 'added' | 'no-gitignore' {\n const gitignorePath = join(dir, '.gitignore');\n if (!existsSync(gitignorePath)) {\n return 'no-gitignore';\n }\n\n const lines = readFileSync(gitignorePath, 'utf-8').split(/\\r?\\n/);\n const ignored = lines.some((line) => {\n const entry = line.trim();\n return entry === '.appilotsrc' || entry === '/.appilotsrc' || entry === '.appilotsrc/';\n });\n if (ignored) {\n return 'already-ignored';\n }\n\n appendFileSync(\n gitignorePath,\n '\\n# Appilots CLI config (contains your API key — do not commit)\\n.appilotsrc\\n',\n );\n return 'added';\n}\n\nexport function initCommand(): Command {\n return new Command('init')\n .description('Set up Appilots configuration interactively')\n .option('--api-key <key>', 'Appilots API key (ak_... format)')\n .option('--server <url>', 'Appilots server URL')\n .action(async (options: InitOptions) => {\n try {\n banner();\n\n // Check if config already exists\n const configPath = getConfigPath();\n if (configPath) {\n warn(`Found existing .appilotsrc at ${configPath}`);\n warn('Use --api-key and --server to override settings');\n }\n\n // Flag wins over environment variable\n const env = getEnvOverrides();\n const apiKey = options.apiKey || env.apiKey;\n if (!apiKey) {\n error('API key is required');\n info('Provide it with: --api-key <your-ak_...key>');\n info('Or set APPILOTS_API_KEY environment variable');\n process.exit(1);\n }\n if (!options.apiKey && env.apiKey) {\n info('Using API key from APPILOTS_API_KEY environment variable');\n }\n\n // Use provided server, then env, then default\n const serverUrl = options.server || env.serverUrl || DEFAULT_SERVER_URL;\n\n // Validate API key format\n if (!apiKey.startsWith('ak_')) {\n error('Invalid API key format. Must start with ak_');\n process.exit(1);\n }\n\n info('Validating API key...');\n const apiClient = new AppilotsAPIClient({\n serverUrl,\n apiKey,\n });\n\n // Check health\n const isHealthy = await apiClient.health();\n if (!isHealthy) {\n error(`Cannot reach Appilots server at ${serverUrl}`);\n info('Make sure the server is running and the URL is correct');\n hintUnreachableServer(serverUrl);\n process.exit(1);\n }\n\n // Get status to validate credentials and get project info\n const status = await apiClient.status();\n if (status.error) {\n error(`Failed to validate API key: ${status.error}`);\n process.exit(1);\n }\n\n if (!status.project) {\n error('Could not retrieve project information');\n process.exit(1);\n }\n\n success(`✓ Successfully connected to ${status.project.name}`);\n success(`✓ Project ID: ${status.project.id}`);\n\n // Save configuration\n const config = {\n apiKey,\n projectId: status.project.id,\n serverUrl,\n outputDir: '.appilots',\n autoActivate: true,\n };\n\n saveConfig(process.cwd(), config);\n\n success('Configuration saved to .appilotsrc');\n\n switch (ensureConfigIgnored(process.cwd())) {\n case 'added':\n success('Added .appilotsrc to .gitignore (it contains your API key)');\n break;\n case 'no-gitignore':\n warn('.appilotsrc contains your API key — make sure it is NOT committed');\n info('Add \".appilotsrc\" to your .gitignore');\n break;\n case 'already-ignored':\n break;\n }\n\n info('Next steps:');\n dim(' $ appilots sync - Analyze and upload your project');\n dim(' $ appilots watch - Watch for changes and auto-sync');\n } catch (err) {\n error(`Initialization failed: ${stringifyUnknown(err)}`);\n process.exit(1);\n }\n });\n}\n","/**\n * Shared constants used across the Appilots platform.\n */\n\n// ── API ────────────────────────────────────────────────────────\n\nexport const API_VERSION = 'v1';\n\n/**\n * The ORIGIN of the hosted API — no path. The mount prefix is added by\n * `normalizeApiBaseUrl` below; see its comment for why the two are one\n * module and not two.\n */\nexport const DEFAULT_API_BASE_URL = 'https://api.appilots.com';\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\n * The path everything the API serves is mounted under\n * (`.basePath('/api/v1')` in `apps/api/src/app.ts`). There is no rewrite\n * in front of it — `infra/api.ts` points the ALB health check at the full\n * `/api/v1/health/ready` for the same reason.\n */\nexport const APPILOTS_API_PATH_PREFIX = '/api/v1';\n\n/**\n * Turn whatever the integrator configured into a base URL that actually\n * resolves: the prefix is added when absent and left alone when present.\n *\n * This lives in `shared` because the convention had FOUR homes and they\n * disagreed. `@appilots/client-core` completed the prefix (#477);\n * `@appilots/cli` appended `/api/v1` to `serverUrl` itself, so the same\n * value that worked in the SDK produced `/api/v1/api/v1/cli/sync` and a\n * 404; and `DEFAULT_API_BASE_URL` right above carried no prefix at all.\n * One `.appilotsrc` feeds both packages, so \"which convention does this\n * field follow\" cannot have two answers.\n *\n * Completing rather than rejecting is deliberate: `http://localhost:4000`\n * is what the API answers on and what anyone would write, and the mount\n * prefix is our implementation detail. The check accepts the prefix\n * ANYWHERE in the path, because a gateway may mount us under one of its\n * own (`https://gw.acme.com/appilots/api/v1`).\n */\nexport function normalizeApiBaseUrl(configured: string | undefined | null): string {\n const raw = (configured ?? DEFAULT_API_BASE_URL).trim().replace(/\\/+$/, '');\n if (!raw) return `${DEFAULT_API_BASE_URL}${APPILOTS_API_PATH_PREFIX}`;\n if (new RegExp(`${APPILOTS_API_PATH_PREFIX}(/|$)`).test(raw)) return raw;\n return `${raw}${APPILOTS_API_PATH_PREFIX}`;\n}\n\n// ── Limits ─────────────────────────────────────────────────────\n\nexport const LIMITS = {\n MAX_MCP_DOCUMENT_SIZE_MB: 10,\n MAX_PROJECTS_PER_USER: 20,\n MAX_MESSAGE_LENGTH: 4096,\n MAX_ACTIONS_PER_MESSAGE: 10,\n SESSION_TIMEOUT_MS: 30 * 60 * 1000, // 30 minutes\n} as const;\n\n// ── MCP ────────────────────────────────────────────────────────\n\nexport const MCP_DOCUMENT_VERSION = '1.0';\nexport const MCP_SUPPORTED_FORMATS = ['json', 'yaml'] as const;\n\n// ── HTTP Status Codes ──────────────────────────────────────────\n\nexport const HTTP_STATUS = {\n OK: 200,\n CREATED: 201,\n NO_CONTENT: 204,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n CONFLICT: 409,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n INTERNAL_SERVER_ERROR: 500,\n} as const;\n","/**\n * Rendering an unknown value as text without ever printing `[object Object]`.\n *\n * `err instanceof Error ? err.message : String(err)` is the idiom this\n * replaces. It is correct for thrown `Error`s and silently useless for\n * everything else: a rejected fetch body, a `throw { code }` from a\n * dependency, or a server error envelope all collapse to eight characters\n * that say nothing. That is how `✗ Sync failed: [object Object]` reached\n * users — the failure was reported, just not identified.\n */\n\n/**\n * Text for any value. Errors keep their message, strings pass through,\n * objects become JSON — longer than `[object Object]`, and unlike it,\n * diagnostic. Falls back to `String()` only for values JSON cannot\n * represent (circular structures, BigInt).\n */\nexport function stringifyUnknown(value: unknown): string {\n if (value instanceof Error) {\n const message = value.message || value.name;\n // Node's fetch reports every transport failure as the bare string\n // \"fetch failed\" and hides the real one (ECONNREFUSED, DNS, TLS) in\n // `cause`. That is the difference between \"the server said no\" and\n // \"there is no server there\".\n const cause = (value as { cause?: unknown }).cause;\n if (cause instanceof Error && cause.message && cause.message !== message) {\n return `${message} (${cause.message})`;\n }\n return message;\n }\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return String(value);\n if (typeof value !== 'object') return String(value);\n\n try {\n const json = JSON.stringify(value);\n // `JSON.stringify` yields undefined for functions/symbols and a bare\n // `{}` for objects whose own properties are all non-enumerable —\n // neither is worth printing.\n if (json && json !== '{}') return json;\n } catch {\n // circular or BigInt — fall through\n }\n return String(value);\n}\n","/**\n * HTTP client for communicating with the Appilots API backend\n */\n\nimport { normalizeApiBaseUrl } from '@appilots/shared/constants';\nimport { stringifyUnknown } from '../utils/stringify';\n\n/**\n * Result from a sync operation\n */\nexport interface SyncResult {\n success: boolean;\n unchanged: boolean;\n /**\n * Set by the server when an unchanged upload had to re-activate a\n * document that was stored but not active — i.e. something else (an\n * older version, a hand-activated document) was in front of the agent.\n */\n activated?: boolean;\n id?: string;\n checksum?: string;\n screensCount?: number;\n formsCount?: number;\n actionsCount?: number;\n error?: string;\n /**\n * The server's `error.code`, kept structured alongside the rendered\n * `error` text so callers can branch on the failure instead of\n * matching substrings. Absent when the failure produced no envelope.\n */\n errorCode?: string;\n /** HTTP status of the failed response; 0 for network/timeout failures. */\n errorStatus?: number;\n}\n\n/**\n * One eval scenario as sent to `POST /cli/eval/run`. Shape mirrors the\n * server's `evalScenarioRequestSchema` — kept as a plain interface here\n * (no @appilots/shared import) since this package publishes standalone.\n */\nexport interface EvalScenarioRequest {\n id: string;\n screen?: string;\n observation?: unknown;\n prompt: string;\n modelOverride?: string;\n}\n\nexport interface EvalScenarioResult {\n id: string;\n content: string;\n actions: Array<{ id: string; type: string; payload: Record<string, unknown> }>;\n totalTokens: number;\n totalCostUsd: number;\n totalLatencyMs: number;\n modelUsed: string;\n}\n\n/**\n * Result from an eval run\n */\nexport interface EvalRunResult {\n results?: EvalScenarioResult[];\n error?: string;\n}\n\n/**\n * Result from a status query\n */\nexport interface StatusResult {\n project?: {\n id: string;\n name: string;\n };\n activeMcp?: {\n id: string;\n version: string;\n screensCount: number;\n formsCount: number;\n actionsCount: number;\n };\n error?: string;\n}\n\n/**\n * Appilots API client configuration\n */\ninterface APIClientConfig {\n serverUrl: string;\n apiKey: string;\n /** Per-request timeout in ms (default 30s) */\n timeoutMs?: number;\n /** Retries on network errors / 5xx (default 2) */\n maxRetries?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRY_BASE_DELAY_MS = 500;\n\n/**\n * Node's fetch collapses every connection failure into the opaque\n * \"fetch failed\" — the real reason (ECONNREFUSED, ENOTFOUND, ...) is\n * hidden on `cause`. Unwrapped, a misconfigured serverUrl reads as a\n * mystery, so rewrite it into a message that names the server we could\n * not reach and the reason we could not reach it.\n */\nfunction describeNetworkError(url: string, err: unknown): Error {\n let origin = url;\n try {\n origin = new URL(url).origin;\n } catch {\n // Not parseable — fall back to the full URL\n }\n\n const cause = (err as { cause?: { code?: string } } | undefined)?.cause;\n const code = typeof cause?.code === 'string' ? cause.code : undefined;\n const detail = code ?? stringifyUnknown(err);\n\n return new Error(`Cannot reach Appilots server at ${origin} (${detail})`);\n}\n\n/**\n * HTTP client for communicating with Appilots API\n */\n/**\n * The API answers errors as `{ error: { code, message } }`, and this client\n * used to read `errorData.error as string`. The cast was a lie: interpolating\n * the object printed `Sync failed: [object Object]`, and passing it on to\n * `hintUnreachableServer` — which calls `.includes` on it — threw\n * `message.includes is not a function`. So a failed sync reported neither\n * what went wrong nor that the reporting itself had broken; two of our own\n * bugs stacked to hide the server's answer completely.\n */\n/**\n * The envelope's `code`, when there is one. `describeApiError` folds it\n * into the human sentence; this keeps it addressable, so a caller can\n * react to WORKSPACE_INACTIVE without parsing prose.\n */\nexport function errorCodeOf(payload: unknown): string | undefined {\n const error = (payload as { error?: unknown } | null)?.error;\n if (error && typeof error === 'object') {\n const { code } = error as { code?: unknown };\n if (typeof code === 'string' && code.trim()) return code;\n }\n return undefined;\n}\n\nexport function describeApiError(payload: unknown, fallback: string): string {\n const error = (payload as { error?: unknown } | null)?.error;\n if (typeof error === 'string' && error.trim()) return error;\n if (error && typeof error === 'object') {\n const { code, message } = error as { code?: unknown; message?: unknown };\n const text = typeof message === 'string' && message.trim() ? message : undefined;\n const tag = typeof code === 'string' && code.trim() ? code : undefined;\n if (text && tag) return `${text} (${tag})`;\n if (text) return text;\n if (tag) return tag;\n }\n const message = (payload as { message?: unknown } | null)?.message;\n if (typeof message === 'string' && message.trim()) return message;\n return fallback;\n}\n\nexport class AppilotsAPIClient {\n /**\n * `serverUrl` with the API's mount prefix resolved — every path below\n * is relative to THIS, not to the configured origin.\n *\n * It used to be the raw `serverUrl` with `/api/v1` hardcoded into each\n * path, which made the field mean something different here than in the\n * SDK. Both read the same `.appilotsrc`: the SDK completes the prefix\n * when it is missing, so `https://api.appilots.com/api/v1` is correct\n * there — and here that same value produced\n * `/api/v1/api/v1/cli/sync`, a 404 whose body reads `Route not found`.\n * Sharing `normalizeApiBaseUrl` is what makes one file mean one thing:\n * with or without the prefix now works in both.\n */\n private baseUrl: string;\n private apiKey: string;\n private timeoutMs: number;\n private maxRetries: number;\n\n constructor(config: APIClientConfig) {\n this.baseUrl = normalizeApiBaseUrl(config.serverUrl);\n this.apiKey = config.apiKey;\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n }\n\n /**\n * fetch with a hard timeout and exponential-backoff retries. Retries\n * only on network failures and 5xx responses — 4xx are the caller's\n * problem and retrying them would just spam the server.\n */\n private async request(url: string, init: RequestInit): Promise<Response> {\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, RETRY_BASE_DELAY_MS * 2 ** (attempt - 1)));\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await fetch(url, { ...init, signal: controller.signal });\n if (response.status >= 500 && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}: ${response.statusText}`);\n continue;\n }\n return response;\n } catch (err) {\n lastError = controller.signal.aborted\n ? new Error(`Request timed out after ${this.timeoutMs}ms: ${url}`)\n : describeNetworkError(url, err);\n } finally {\n clearTimeout(timer);\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n /**\n * Syncs content with the Appilots backend\n *\n * @param content The MCP content object to sync\n * @param version Version string for the content\n * @param appVersion Host app version (package.json) — sent as\n * X-App-Version so the backend can associate the MCP\n * document with the app build that produced it\n * @returns SyncResult with success status and metadata\n */\n async sync(content: object, version: string, appVersion?: string): Promise<SyncResult> {\n try {\n const response = await this.request(`${this.baseUrl}/cli/sync`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...(appVersion ? { 'X-App-Version': appVersion } : {}),\n },\n body: JSON.stringify({ content, version }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n return {\n success: false,\n unchanged: false,\n error: describeApiError(errorData, `HTTP ${response.status}: ${response.statusText}`),\n errorCode: errorCodeOf(errorData),\n errorStatus: response.status,\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as Record<string, unknown>;\n return {\n success: true,\n ...inner,\n } as SyncResult;\n } catch (error) {\n return {\n success: false,\n unchanged: false,\n error: error instanceof Error ? error.message : 'Failed to sync with Appilots API',\n errorStatus: 0,\n };\n }\n }\n\n /**\n * Gets the status of the Appilots project and active MCP\n *\n * @returns StatusResult with project and active MCP information\n */\n async status(): Promise<StatusResult> {\n try {\n const response = await this.request(`${this.baseUrl}/cli/status`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n return {\n error: describeApiError(errorData, `HTTP ${response.status}: ${response.statusText}`),\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as StatusResult;\n return inner;\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Failed to fetch status from Appilots API',\n };\n }\n }\n\n /**\n * Runs a batch of eval scenarios against the project's MCP document in\n * decision/dry-run mode — no side effects, same relay path as the\n * dashboard's sandbox, authenticated with this client's API key.\n *\n * @param scenarios Scenarios to run, capped server-side at\n * EVAL_MAX_SCENARIOS_PER_RUN (currently 20) as a cost guard.\n */\n async evalRun(scenarios: EvalScenarioRequest[]): Promise<EvalRunResult> {\n try {\n const response = await this.request(`${this.baseUrl}/cli/eval/run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ scenarios }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n const errObj = errorData?.error as Record<string, unknown> | undefined;\n return {\n error:\n (errObj?.message as string | undefined) ||\n `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as { results?: EvalScenarioResult[] };\n return { results: inner.results ?? [] };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Failed to run eval against Appilots API',\n };\n }\n }\n\n /**\n * Checks if the Appilots API server is healthy\n *\n * @returns true if server is healthy, false otherwise\n */\n async health(): Promise<boolean> {\n try {\n const response = await this.request(`${this.baseUrl}/health`, {\n method: 'GET',\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n","import { DEFAULT_SERVER_URL } from '../../config/index';\nimport { info } from './logger';\n\n/**\n * `serverUrl` has a localhost default, which is right for `pnpm dev` and\n * a trap for everyone else: an unset (or misspelled) key sends the CLI to\n * a port nothing is listening on, and the failure looks like a network\n * problem rather than a missing setting. Prints what to do about it —\n * only when the unreachable server actually is that default, so a real\n * outage on a configured server is not muddied with setup advice.\n */\nexport function hintUnreachableServer(serverUrl: string, message?: unknown): void {\n if (serverUrl !== DEFAULT_SERVER_URL) return;\n // `unknown`, not `string`: the API answers errors as `{ code, message }`,\n // and a caller handed that object straight through. Calling `.includes`\n // on it threw `message.includes is not a function` — a crash in the code\n // whose entire job is to explain a failure, printed on top of the failure\n // it was explaining.\n if (typeof message === 'string' && !message.includes('Cannot reach Appilots server')) return;\n if (message !== undefined && typeof message !== 'string') return;\n\n info(`serverUrl is not set, so the CLI is using the built-in default (${DEFAULT_SERVER_URL})`);\n info('For the hosted backend, set it in .appilotsrc:');\n info(' \"serverUrl\": \"https://api.appilots.com\"');\n info('Or pass --server <url>, or set APPILOTS_SERVER_URL');\n}\n","import { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { MCPGenerator } from '../../generators/MCPGenerator';\nimport { AppilotsAPIClient } from '../../services/api-client';\nimport { loadConfig, DEFAULT_SERVER_URL } from '../../config/index';\nimport {\n banner,\n success,\n error,\n info,\n createSpinner,\n warn,\n table,\n heading,\n setLogMode,\n jsonOutput,\n} from '../utils/logger';\nimport { reportMetadataLint } from '../utils/metadata-report';\nimport { compareWithRemote, reportRemoteDrift } from '../utils/remote-drift';\nimport { explainUploadFailure } from '../utils/upload-failure';\nimport { assertDocumentHasScreens } from '../utils/empty-document';\nimport { hintUnreachableServer } from '../utils/server-hint';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface SyncOptions {\n verbose?: boolean;\n force?: boolean;\n apiKey?: string;\n projectId?: string;\n server?: string;\n json?: boolean;\n quiet?: boolean;\n strictMetadata?: boolean;\n allowEmpty?: boolean;\n}\n\nexport function syncCommand(): Command {\n return new Command('sync')\n .description('Analyze project and sync MCP documents with Appilots')\n .option('--verbose', 'Enable verbose logging', false)\n .option('--force', 'Force upload even if nothing changed', false)\n .option('--api-key <key>', 'Appilots API key (overrides .appilotsrc and APPILOTS_API_KEY)')\n .option('--project-id <id>', 'Project ID (overrides .appilotsrc and APPILOTS_PROJECT_ID)')\n .option('--server <url>', 'Appilots server URL (overrides .appilotsrc and APPILOTS_SERVER_URL)')\n .option('--json', 'Output a machine-readable JSON result (implies --quiet)', false)\n .option('--quiet', 'Suppress banner and informational output', false)\n .option(\n '--strict-metadata',\n 'Fail when mutating actions are missing effect/riskLevel metadata',\n false,\n )\n .option('--allow-empty', 'Do not fail when the application map has zero screens', false)\n .action(async (options: SyncOptions) => {\n if (options.json) setLogMode('json');\n else if (options.quiet) setLogMode('quiet');\n try {\n banner();\n\n // Load configuration (.appilotsrc merged with APPILOTS_* env vars),\n // then let explicit flags win — CI can run without any .appilotsrc.\n const loaded = loadConfig(warn);\n const apiKey = options.apiKey || loaded?.apiKey;\n if (!apiKey) {\n error('No .appilotsrc configuration found');\n info('Run: appilots init --api-key <your-key>');\n info('Or set APPILOTS_API_KEY, or pass --api-key');\n jsonOutput({ success: false, error: 'No configuration found (missing API key)' });\n process.exit(1);\n return;\n }\n const config = {\n serverUrl: DEFAULT_SERVER_URL,\n outputDir: '.appilots',\n ...loaded,\n apiKey,\n ...(options.projectId ? { projectId: options.projectId } : {}),\n ...(options.server ? { serverUrl: options.server } : {}),\n };\n\n // Initialize API client\n const apiClient = new AppilotsAPIClient({\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n });\n\n const outputDir = config.outputDir || '.appilots';\n\n // §3 fix: Read previous checksum BEFORE generating\n let previousChecksum = '';\n try {\n const checksumPath = join(outputDir, '.appilots-checksum');\n previousChecksum = (await readFile(checksumPath, 'utf-8')).trim();\n } catch {\n // No previous checksum — first run\n }\n\n // Generate MCP document\n let spinner = createSpinner('Analyzing project...');\n spinner.start();\n\n const generator = new MCPGenerator({\n rootDir: process.cwd(),\n outputDir,\n format: 'json',\n strictScreens: config.strictScreens,\n screenPatterns: config.screenPatterns,\n include: config.include,\n exclude: config.exclude,\n navigationInclude: config.navigationInclude,\n navigationExclude: config.navigationExclude,\n platform: config.platform,\n manifestPath: config.manifestPath,\n });\n\n const output = await generator.generate();\n spinner.stop();\n\n // Before anything is uploaded: an empty map on the server is\n // worse than no map, because the dashboard then looks integrated.\n assertDocumentHasScreens(output.document, {\n rootDir: process.cwd(),\n allowEmpty: Boolean(options.allowEmpty),\n });\n\n success(\n `Found ${output.document.metadata.totalScreens} screens, ` +\n `${output.document.metadata.totalForms} forms, ${output.document.metadata.totalActions} actions`,\n );\n\n // OKR-005 KR4: surface mutating actions missing effect/riskLevel\n // before upload; fatal only with --strict-metadata\n reportMetadataLint(output.document, Boolean(options.strictMetadata));\n\n // What is the server actually serving right now?\n //\n // Asked before every upload, not only when the local checksum is\n // unchanged, because the answer matters most when the upload\n // FAILS: that is the case where a stale document stays active and\n // the agent goes on being unable to see most of the app, with\n // nothing on screen saying so.\n spinner = createSpinner('Checking remote status...');\n spinner.start();\n const remote = await apiClient.status();\n spinner.stop();\n\n const remoteActive = remote.error ? null : (remote.activeMcp ?? null);\n const drift = remoteActive\n ? compareWithRemote({ screens: output.document.metadata.totalScreens }, remoteActive)\n : null;\n\n // §3 fix: Compare previous checksum with newly generated one.\n //\n // NOTE: this branch is close to dead today — the document embeds\n // `generatedAt: new Date().toISOString()` (MCPGenerator), so two\n // runs over identical source produce different checksums and the\n // equality below is false. Left in place because it is correct\n // whenever generation is deterministic, and because the drift\n // check it now guards is the part that matters.\n if (!options.force && previousChecksum && previousChecksum === output.checksum) {\n if (remote.error) {\n warn(`Could not verify remote: ${remote.error}`);\n info('Uploading anyway...');\n } else if (remoteActive) {\n // \"Local hasn't changed\" is not \"the server is serving it\".\n // An older version activated from the dashboard, or a sync\n // that went to a different server, leaves a stale document\n // active while the local checksum still matches the last\n // upload — and short-circuiting here is what lets it survive\n // a `sync` that reports success.\n if (!drift) {\n success('Already up to date (no local or remote changes)');\n jsonOutput({ success: true, unchanged: true, checksum: output.checksum });\n return;\n }\n\n reportRemoteDrift(drift);\n info('Uploading anyway...');\n }\n // No active MCP on server? Fall through to upload\n }\n\n // Upload to server\n spinner = createSpinner('Uploading to Appilots...');\n spinner.start();\n\n const syncResult = await apiClient.sync(\n output.document,\n output.document.version,\n output.document.metadata.appVersion,\n );\n spinner.stop();\n\n if (!syncResult.success) {\n error(`Sync failed: ${syncResult.error}`);\n hintUnreachableServer(config.serverUrl, syncResult.error);\n explainUploadFailure(syncResult, config.serverUrl);\n // Nothing was uploaded, so whatever was active still is. When\n // that is a fraction of the app, say so here — otherwise the\n // next thing the developer sees is an agent failing on screens\n // it cannot see, with the sync failure already scrolled off.\n if (drift?.severe) {\n reportRemoteDrift(drift, { uploadFailed: true });\n }\n jsonOutput({\n success: false,\n error: syncResult.error,\n errorCode: syncResult.errorCode,\n errorStatus: syncResult.errorStatus,\n activeDocument: remoteActive,\n drift,\n });\n process.exit(1);\n }\n\n if (syncResult.unchanged && !options.force) {\n success('Already up to date on server');\n if (syncResult.activated) {\n // The content was already stored but something else was\n // active — this call put it back in front of the agent.\n info(`Re-activated document ${syncResult.id} (it was stored but not active).`);\n }\n } else {\n success('Successfully synced MCP document');\n if (drift?.severe) {\n info(\n `Replaced the ${drift.remoteScreens}-screen document that was active ` +\n `(${drift.remoteId}) — the agent could not see the other ` +\n `${drift.localScreens - drift.remoteScreens} screens until now.`,\n );\n }\n info(`Document ID: ${syncResult.id}`);\n info(`Checksum: ${syncResult.checksum}`);\n\n if (config.projectId) {\n const dashboardUrl = `${config.serverUrl}/dashboard/projects/${config.projectId}`;\n info(`View on dashboard: ${dashboardUrl}`);\n }\n }\n\n if (options.verbose) {\n heading('\\nSync Details:');\n table([\n ['Screens', String(syncResult.screensCount || 0)],\n ['Forms', String(syncResult.formsCount || 0)],\n ['Actions', String(syncResult.actionsCount || 0)],\n ['Document ID', syncResult.id || 'N/A'],\n ['Previous checksum', previousChecksum || '(first run)'],\n ['New checksum', output.checksum],\n ['Changed', String(previousChecksum !== output.checksum)],\n ]);\n }\n\n jsonOutput({\n success: true,\n unchanged: Boolean(syncResult.unchanged),\n id: syncResult.id,\n checksum: syncResult.checksum ?? output.checksum,\n screensCount: syncResult.screensCount ?? output.document.metadata.totalScreens,\n formsCount: syncResult.formsCount ?? output.document.metadata.totalForms,\n actionsCount: syncResult.actionsCount ?? output.document.metadata.totalActions,\n });\n } catch (err) {\n error(`Sync failed: ${stringifyUnknown(err)}`);\n jsonOutput({ success: false, error: stringifyUnknown(err) });\n if (options.verbose) {\n console.error(err);\n }\n process.exit(1);\n }\n });\n}\n","import { mkdir, writeFile, readFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport type { MCPGeneratorOptions, MCPDocument, MCPOutput } from './types';\nimport type { AnalyzerConfig } from '../types';\nimport { enrichScreenForAgent } from '../pipeline/enrichment';\nimport type { PlatformAnalyzer } from '../analyzers/PlatformAnalyzer';\nimport { ReactNativePlatformAnalyzer } from '../analyzers/ReactNativePlatformAnalyzer';\nimport { GenericPlatformAnalyzer } from '../analyzers/GenericPlatformAnalyzer';\nimport { ReactWebPlatformAnalyzer } from '../analyzers/web/ReactWebPlatformAnalyzer';\nimport {\n loadManifest,\n mergeManifestScreens,\n mergeManifestNavigation,\n} from '../manifest/loadManifest';\n\n/**\n * Main generator that orchestrates analyzers and produces MCP documents.\n *\n * @example\n * ```ts\n * const generator = new MCPGenerator({\n * rootDir: './my-rn-app',\n * outputDir: '.appilots',\n * format: 'json',\n * });\n *\n * const output = await generator.generate();\n * console.log(`Generated MCP at: ${output.filePath}`);\n * ```\n */\nexport interface MCPGeneratorConfig {\n rootDir: string;\n outputDir?: string;\n format?: 'json';\n version?: string;\n includeSourcePaths?: boolean;\n splitOutput?: boolean;\n /** §1: Only include files with registerScreen() or matching screen patterns */\n strictScreens?: boolean;\n /** §1: Custom glob patterns for screen file detection */\n screenPatterns?: string[];\n /** §5: Additional navigation file patterns (added to defaults) */\n navigationInclude?: string[];\n /** §5: Exclude patterns for navigation analysis */\n navigationExclude?: string[];\n /** Source include patterns */\n include?: string[];\n /** Source exclude patterns */\n exclude?: string[];\n /**\n * Which `PlatformAnalyzer` to run against the source tree. Defaults to\n * `'react-native'` (the existing Babel/JSX analyzer pipeline). `'web'`\n * runs `ReactWebPlatformAnalyzer` (DOM-vocabulary JSX + React Router).\n * Any other value runs `GenericPlatformAnalyzer` — a safe no-op that\n * does no filesystem/AST work — so a platform with no source analyzer\n * yet still produces a valid document from a declared manifest alone.\n */\n platform?: string;\n /**\n * Optional custom analyzer instance, mainly for tests. When set,\n * `platform` is ignored for analyzer selection (but still recorded).\n */\n platformAnalyzer?: PlatformAnalyzer;\n /**\n * Path to a declared `appilots.manifest.json`, relative to `rootDir`\n * unless absolute. Defaults to `appilots.manifest.json` at the project\n * root. Manifest screens merge on top of analyzer-derived screens,\n * winning on a screen-name conflict. Missing file is not an error —\n * manifest mode is opt-in.\n */\n manifestPath?: string;\n}\n\nexport class MCPGenerator {\n private analyzerConfig: AnalyzerConfig;\n private options: MCPGeneratorOptions;\n private generatorConfig: MCPGeneratorConfig;\n private platformAnalyzer: PlatformAnalyzer;\n\n constructor(config: MCPGeneratorConfig) {\n this.generatorConfig = config;\n\n this.analyzerConfig = {\n rootDir: config.rootDir,\n include: config.include ?? ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n exclude: config.exclude ?? ['**/node_modules/**', '**/__tests__/**', '**/dist/**'],\n };\n\n this.options = {\n format: config.format ?? 'json',\n outputDir: config.outputDir ?? '.appilots',\n includeSourcePaths: config.includeSourcePaths ?? false,\n splitOutput: config.splitOutput ?? false,\n version: config.version ?? '1.0',\n };\n\n this.platformAnalyzer =\n config.platformAnalyzer ?? MCPGenerator.createPlatformAnalyzer(config.platform);\n }\n\n /**\n * Select the `PlatformAnalyzer` implementation for a `.appilotsrc`\n * `platform` value. `'react-native'` (or unset — the existing default)\n * gets the RN Babel/JSX pipeline; `'web'` gets the React web (DOM +\n * React Router) pipeline; anything else gets the no-op generic\n * analyzer, relying entirely on a declared manifest. The manifest\n * still merges on top of every analyzer's output either way.\n */\n static createPlatformAnalyzer(platform?: string): PlatformAnalyzer {\n const resolved = platform ?? 'react-native';\n if (resolved === 'react-native') return new ReactNativePlatformAnalyzer();\n if (resolved === 'web') return new ReactWebPlatformAnalyzer();\n return new GenericPlatformAnalyzer(resolved);\n }\n\n /** Generate MCP documents from the project */\n async generate(): Promise<MCPOutput> {\n console.log('[MCPGenerator] Starting generation...');\n\n // Create output directory if it doesn't exist\n const outputDir = this.options.outputDir || '.appilots';\n await mkdir(outputDir, { recursive: true });\n console.log(`[MCPGenerator] Output directory ensured: ${outputDir}`);\n\n console.log(`[MCPGenerator] Running \"${this.platformAnalyzer.platform}\" platform analyzer...`);\n const analyzed = await this.platformAnalyzer.analyze(this.analyzerConfig, {\n strictScreens: this.generatorConfig.strictScreens ?? true,\n screenPatterns: this.generatorConfig.screenPatterns,\n navigationInclude: this.generatorConfig.navigationInclude,\n navigationExclude: this.generatorConfig.navigationExclude,\n });\n\n console.log(\n `[MCPGenerator] Analyzer complete. Found ${analyzed.screens.length} screens from ${analyzed.analyzedFiles} files`,\n );\n\n // Manifest mode (§2): merge a declared appilots.manifest.json on top\n // of the analyzer output. Missing file is not an error — this is\n // opt-in. A present-but-invalid manifest throws with a clear message\n // (see loadManifest).\n const { manifest, resolvedPath: manifestResolvedPath } = await loadManifest(\n this.generatorConfig.rootDir,\n this.generatorConfig.manifestPath,\n );\n if (manifest) {\n console.log(\n `[MCPGenerator] Merged manifest at ${manifestResolvedPath} (${manifest.screens.length} declared screens)`,\n );\n }\n\n const mergedScreens = mergeManifestScreens(analyzed.screens, manifest?.screens);\n const navigation = mergeManifestNavigation(analyzed.navigation, manifest?.navigation);\n\n const agentReadyScreens = mergedScreens.map((screen) =>\n enrichScreenForAgent({\n ...screen,\n filePath: screen.filePath\n ? path.relative(this.generatorConfig.rootDir, screen.filePath)\n : screen.filePath,\n }),\n );\n\n // Get project name and app version from package.json\n const projectInfo = await this.getProjectInfo();\n const projectName = projectInfo.name;\n\n console.log(`[MCPGenerator] Project name: ${projectName}`);\n\n // Build the MCPDocument\n const document: MCPDocument = {\n version: this.options.version!,\n generatedAt: new Date().toISOString(),\n projectName,\n screens: agentReadyScreens,\n navigation,\n metadata: {\n generatorVersion: '0.1.0',\n ...(projectInfo.version ? { appVersion: projectInfo.version } : {}),\n totalScreens: agentReadyScreens.length,\n totalForms: agentReadyScreens.reduce((acc, s) => acc + s.forms.length, 0),\n totalActions: agentReadyScreens.reduce((acc, s) => acc + s.actions.length, 0),\n analyzedFiles: analyzed.analyzedFiles,\n // §D: Only set when strict mode filters out screens\n ...(analyzed.screensFilteredOut ? { screensFilteredOut: analyzed.screensFilteredOut } : {}),\n },\n };\n\n // Serialize document to JSON\n const serialized = JSON.stringify(document, null, 2);\n\n // Calculate SHA-256 checksum\n const checksum = this.calculateChecksum(serialized);\n\n // Write the document file\n const filePath = path.resolve(outputDir, `mcp-document.${this.options.format}`);\n await writeFile(filePath, serialized, 'utf-8');\n console.log(`[MCPGenerator] Document written to: ${filePath}`);\n\n // Write checksum file\n const checksumFilePath = path.resolve(outputDir, '.appilots-checksum');\n await writeFile(checksumFilePath, checksum, 'utf-8');\n console.log(`[MCPGenerator] Checksum written to: ${checksumFilePath}`);\n\n console.log('[MCPGenerator] Generation complete!');\n\n return {\n document,\n filePath,\n format: this.options.format,\n checksum,\n };\n }\n\n /**\n * Read the previously stored checksum from disk.\n * Returns null if no checksum file exists (first run).\n *\n * §4: This replaces the incomplete `hasChanged` static method.\n * To detect actual changes, compare this value with `output.checksum`\n * after calling `generate()`.\n */\n static async readPreviousChecksum(outputDir: string): Promise<string | null> {\n const checksumFilePath = path.resolve(outputDir, '.appilots-checksum');\n try {\n const content = await readFile(checksumFilePath, 'utf-8');\n return content.trim() || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Calculate SHA-256 checksum of content\n */\n private calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n }\n\n /**\n * Get project name and version from package.json in rootDir\n */\n private async getProjectInfo(): Promise<{ name: string; version?: string }> {\n try {\n const packageJsonPath = path.resolve(this.analyzerConfig.rootDir, 'package.json');\n const packageJsonContent = await readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n return {\n name: packageJson.name || 'Unknown Project',\n version: typeof packageJson.version === 'string' ? packageJson.version : undefined,\n };\n } catch (error) {\n console.warn('[MCPGenerator] Failed to read package.json, using default project name');\n return { name: 'Unknown Project' };\n }\n }\n}\n","import type {\n ActionDescriptor,\n CollectionDescriptor,\n FlowDescriptor,\n FormDescriptor,\n FormFieldDescriptor,\n ScreenAgentHints,\n ScreenDescriptor,\n TargetDescriptor,\n WaitPolicyDescriptor,\n} from '../types';\n\nexport function enrichScreenForAgent(screen: ScreenDescriptor): ScreenDescriptor {\n const targets = mergeTargets([\n ...targetsFromForms(screen.forms),\n ...targetsFromActions(screen.actions),\n ...targetsFromCollections(screen.collections ?? []),\n ]);\n const flows = synthesizeFlows(screen, targets);\n const agentHints = synthesizeAgentHints(screen, targets, flows);\n\n return {\n ...screen,\n ...(targets.length > 0 ? { targets } : {}),\n ...(flows.length > 0 ? { flows } : {}),\n ...(agentHints ? { agentHints } : {}),\n };\n}\n\nfunction targetsFromForms(forms: FormDescriptor[]): TargetDescriptor[] {\n const targets: TargetDescriptor[] = [];\n for (const form of forms) {\n for (const field of form.fields) {\n targets.push({\n id: field.locator?.id ?? field.name,\n role: fieldToRole(field),\n label: field.label,\n fieldName: field.name,\n locator: field.locator ?? { id: field.name, source: 'inferred' },\n sourceComponent: field.sourceComponent,\n });\n }\n if (form.submitAction && form.submitAction !== 'anonymous') {\n targets.push({\n id: form.submitAction,\n role: 'submit',\n actionId: form.submitAction,\n label: form.submitAction,\n });\n }\n }\n return targets;\n}\n\nfunction fieldToRole(field: FormFieldDescriptor): TargetDescriptor['role'] {\n if (field.type === 'toggle') return 'toggle';\n if (field.type === 'select') return 'select';\n if (field.type === 'date') return 'date';\n return 'input';\n}\n\nfunction targetsFromActions(actions: ActionDescriptor[]): TargetDescriptor[] {\n return actions\n .filter((action) => action.id)\n .map((action) => ({\n id: action.locator?.id ?? action.id,\n role: action.type === 'submit' ? 'submit' : 'button',\n label: action.label,\n locator: action.locator ?? { id: action.id, label: action.label, source: 'inferred' },\n actionId: action.id,\n handler: action.handler,\n targetScreen: action.targetScreen,\n destructive: action.destructive,\n requiresConfirmation: action.requiresConfirmation,\n opensModal: action.opensModal,\n opensBottomSheet: action.opensBottomSheet,\n sourceComponent: action.sourceComponent,\n }));\n}\n\nfunction targetsFromCollections(collections: CollectionDescriptor[]): TargetDescriptor[] {\n return collections.map((collection) => ({\n id: collection.id,\n role: 'list',\n label: collection.itemType ?? collection.dataSource ?? collection.id,\n locator: { id: collection.id, testID: collection.id, source: 'testID' },\n sourceComponent: collection.component,\n }));\n}\n\nfunction mergeTargets(targets: TargetDescriptor[]): TargetDescriptor[] {\n const byId = new Map<string, TargetDescriptor>();\n for (const target of targets) {\n if (!target.id) continue;\n const existing = byId.get(target.id);\n byId.set(target.id, existing ? { ...target, ...existing, locator: existing.locator ?? target.locator } : target);\n }\n return Array.from(byId.values()).sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction synthesizeFlows(screen: ScreenDescriptor, targets: TargetDescriptor[]): FlowDescriptor[] {\n const flows: FlowDescriptor[] = [];\n\n for (const form of screen.forms) {\n const submitAction = screen.actions.find((action) => action.id === form.submitAction)\n ?? screen.actions.find((action) => action.type === 'submit');\n if (!submitAction) continue;\n\n flows.push({\n id: `submit-${form.id}`,\n title: submitAction.label ? `Submit ${submitAction.label}` : `Submit ${form.id}`,\n intent: 'form_submit',\n steps: [\n ...form.fields.map((field) => ({\n type: field.type === 'select' ? 'select' : field.type === 'toggle' ? 'toggle' : 'fill',\n target: field.name,\n label: field.label,\n required: field.required,\n description: field.placeholder,\n })),\n { type: 'press', target: submitAction.id, label: submitAction.label },\n { type: 'wait', description: describeWait(submitAction) },\n ],\n waitPolicy: waitPolicyForAction(submitAction),\n safetyNotes: submitAction.requiresConfirmation || submitAction.destructive\n ? ['Requires confirmation before execution']\n : undefined,\n });\n }\n\n for (const action of screen.actions) {\n if (action.type === 'submit') continue;\n if (action.targetScreen) {\n flows.push({\n id: `navigate-${action.id}`,\n title: action.label ? `Open ${action.label}` : `Navigate to ${action.targetScreen}`,\n intent: 'navigate',\n steps: [{ type: 'press', target: action.id, label: action.label }],\n waitPolicy: waitPolicyForAction(action),\n });\n } else if (action.destructive || action.requiresConfirmation) {\n flows.push({\n id: `confirm-${action.id}`,\n title: action.label ? `Confirm ${action.label}` : `Confirm ${action.id}`,\n intent: 'destructive_action',\n steps: [\n { type: 'press', target: action.id, label: action.label },\n { type: 'confirm', description: 'Wait for native or custom confirmation before continuing' },\n { type: 'wait', description: describeWait(action) },\n ],\n waitPolicy: waitPolicyForAction(action),\n safetyNotes: ['Destructive or high-risk action'],\n });\n }\n }\n\n for (const collection of screen.collections ?? []) {\n if (collection.rowAction || (collection.rowActions && collection.rowActions.length > 0)) {\n flows.push({\n id: `list-${collection.id}`,\n title: `Act on an item in ${collection.id}`,\n intent: 'list_action',\n steps: [\n { type: 'choose-list-item', target: collection.id, description: 'Resolve the user reference to a visible or searchable row' },\n { type: 'press', description: collection.rowAction?.description ?? 'Open the row action' },\n ],\n waitPolicy: { expectedOutcome: collection.rowAction?.targetScreen ? 'navigation' : 'inline-feedback' },\n });\n }\n }\n\n return flows.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction waitPolicyForAction(action: ActionDescriptor): WaitPolicyDescriptor {\n const expectedOutcome = action.successSignal?.type === 'goBack'\n ? 'goBack'\n : action.appilotsInferred?.expectedOutcome ?? (action.targetScreen ? 'navigation' : undefined);\n const signals = [action.successSignal, action.failureSignal].filter(Boolean) as WaitPolicyDescriptor['signals'];\n return {\n ...(expectedOutcome ? { expectedOutcome } : {}),\n ...(signals && signals.length > 0 ? { signals } : {}),\n ...(action.appilotsInferred?.isAsyncTrigger ? { maxMs: 10000 } : {}),\n };\n}\n\nfunction describeWait(action: ActionDescriptor): string {\n if (action.successSignal?.description) return action.successSignal.description;\n if (action.successSignal?.type === 'goBack') return 'Wait for the app to return to the previous screen';\n if (action.targetScreen) return `Wait for navigation to ${action.targetScreen}`;\n if (action.appilotsInferred?.expectedOutcome) return `Wait for ${action.appilotsInferred.expectedOutcome}`;\n return 'Wait for the UI to settle';\n}\n\nfunction synthesizeAgentHints(\n screen: ScreenDescriptor,\n targets: TargetDescriptor[],\n flows: FlowDescriptor[],\n): ScreenAgentHints | undefined {\n const preferredTargets = targets\n .filter((target) => ['submit', 'button', 'list'].includes(target.role))\n .slice(0, 8)\n .map((target) => target.id);\n const commonTasks = flows.slice(0, 6).map((flow) => flow.title);\n const safetyNotes = screen.actions\n .filter((action) => action.destructive || action.requiresConfirmation)\n .map((action) => `${action.id} requires confirmation`);\n const firstAsyncAction = screen.actions.find((action) => action.appilotsInferred?.isAsyncTrigger);\n\n const hints: ScreenAgentHints = {\n primaryGoal: synthesizePrimaryGoal(screen),\n commonTasks,\n preferredTargets,\n ...(firstAsyncAction ? { waitPolicy: waitPolicyForAction(firstAsyncAction) } : {}),\n ...(safetyNotes.length > 0 ? { safetyNotes } : {}),\n };\n\n return hints.primaryGoal || commonTasks.length > 0 || preferredTargets.length > 0\n ? hints\n : undefined;\n}\n\nfunction synthesizePrimaryGoal(screen: ScreenDescriptor): string | undefined {\n const goals: string[] = [];\n const collections = screen.collections ?? [];\n\n if (collections.length > 0) {\n const collectionNames = collections\n .map((collection) => collection.itemType ?? collection.dataSource ?? collection.id)\n .filter(Boolean)\n .slice(0, 3);\n goals.push(\n collectionNames.length > 0\n ? `Browse and act on ${collectionNames.join(', ')} list data`\n : 'Browse and act on list data',\n );\n }\n\n const uniqueFields = new Map<string, FormFieldDescriptor>();\n for (const form of screen.forms) {\n for (const field of form.fields) {\n uniqueFields.set(field.name, field);\n }\n }\n const fieldCount = uniqueFields.size;\n if (fieldCount > 0) {\n const requiredCount = Array.from(uniqueFields.values()).filter((field) => field.required).length;\n const fieldLabel = fieldCount === 1 ? 'field' : 'fields';\n goals.push(\n requiredCount > 0\n ? `Complete a form with ${fieldCount} ${fieldLabel} (${requiredCount} required)`\n : `Complete a form with ${fieldCount} ${fieldLabel}`,\n );\n }\n\n const navigationCount = screen.actions.filter((action) => action.targetScreen).length;\n if (navigationCount > 0) {\n goals.push(`Open ${navigationCount} related screen${navigationCount === 1 ? '' : 's'}`);\n }\n\n const submitCount = screen.actions.filter((action) => action.type === 'submit').length;\n if (submitCount > 0) {\n goals.push(`Submit ${submitCount === 1 ? 'the primary form' : `${submitCount} forms/actions`}`);\n }\n\n const asyncCount = screen.actions.filter((action) => action.appilotsInferred?.isAsyncTrigger).length;\n if (asyncCount > 0) {\n goals.push(`Wait for ${asyncCount === 1 ? 'async feedback' : 'async action feedback'}`);\n }\n\n if (goals.length > 0) return goals.join('; ');\n if (screen.title) return `Screen labeled \"${screen.title}\"`;\n return undefined;\n}\n","import path from 'node:path';\nimport glob from 'fast-glob';\nimport type { AnalyzerConfig, FormDescriptor, FormFieldDescriptor, ScreenDescriptor } from '../types';\nimport { ScreenAnalyzer } from './ScreenAnalyzer';\nimport { NavigationAnalyzer } from './NavigationAnalyzer';\nimport { ComponentAnalyzer } from './ComponentAnalyzer';\nimport { FormAnalyzer } from './FormAnalyzer';\nimport type { PlatformAnalyzer, PlatformAnalyzerOptions, PlatformAnalyzerResult } from './PlatformAnalyzer';\n\n/**\n * Default `PlatformAnalyzer` implementation — the React Native Babel/JSX\n * analyzer pipeline that existed inline in `MCPGenerator` before the\n * platform-analyzer seam was introduced. This is a straight move: the\n * orchestration (run `ScreenAnalyzer` + `NavigationAnalyzer`, glob every\n * source file, run `ComponentAnalyzer` + `FormAnalyzer` per file, merge\n * their output into each screen's forms/components) is unchanged, so\n * output for existing React Native projects is byte-for-byte identical.\n */\nexport class ReactNativePlatformAnalyzer implements PlatformAnalyzer {\n readonly platform = 'react-native';\n\n async analyze(\n config: AnalyzerConfig,\n options: PlatformAnalyzerOptions,\n ): Promise<PlatformAnalyzerResult> {\n const screenAnalyzer = new ScreenAnalyzer(config, {\n strictScreens: options.strictScreens ?? true,\n screenPatterns: options.screenPatterns,\n });\n const navigationAnalyzer = new NavigationAnalyzer(config, {\n navigationInclude: options.navigationInclude,\n navigationExclude: options.navigationExclude,\n });\n const componentAnalyzer = new ComponentAnalyzer(config);\n const formAnalyzer = new FormAnalyzer(config);\n\n console.log('[ReactNativePlatformAnalyzer] Running analyzers...');\n const [screens, navigation] = await Promise.all([\n screenAnalyzer.analyze(),\n navigationAnalyzer.analyze(),\n ]);\n\n console.log(\n `[ReactNativePlatformAnalyzer] Screen and navigation analysis complete. Found ${screens.length} screens`,\n );\n\n // Find all screen files to run ComponentAnalyzer and FormAnalyzer on each\n const screenFiles = await glob(config.include || ['**/*.tsx', '**/*.ts'], {\n cwd: config.rootDir,\n ignore: config.exclude || ['**/node_modules/**'],\n });\n\n console.log(\n `[ReactNativePlatformAnalyzer] Analyzing components and forms from ${screenFiles.length} files...`,\n );\n\n // Run ComponentAnalyzer and FormAnalyzer on each screen file\n const enrichmentPromises = screenFiles.map(async (file: string) => {\n const filePath = path.resolve(config.rootDir, file);\n try {\n const [components, forms] = await Promise.all([\n componentAnalyzer.analyzeFile(filePath),\n formAnalyzer.analyzeFile(filePath),\n ]);\n return { filePath, components, forms };\n } catch (error) {\n console.warn(`[ReactNativePlatformAnalyzer] Failed to analyze ${file}:`, error);\n return { filePath, components: [], forms: [] };\n }\n });\n\n const enrichmentResults = await Promise.all(enrichmentPromises);\n\n // Create a map of file path to enrichment data\n const enrichmentMap = new Map<string, { components: any[]; forms: any[] }>();\n for (const result of enrichmentResults) {\n enrichmentMap.set(result.filePath, {\n components: result.components,\n forms: result.forms,\n });\n }\n\n // Enrich screens with components and forms from analyzers\n const enrichedScreens = screens.map((screen) => {\n const enrichment = enrichmentMap.get(screen.filePath);\n if (enrichment) {\n // Merge components (avoid duplicates)\n const existingComponentNames = new Set(screen.components.map((c) => c.name));\n const newComponents = enrichment.components.filter(\n (c: any) => !existingComponentNames.has(c.name),\n );\n\n // Merge forms. registerScreen/ScreenAnalyzer forms are the primary\n // contract; FormAnalyzer enriches them with submit/validation data.\n const mergedForms: FormDescriptor[] = screen.forms.map((form) => ({\n ...form,\n fields: [...form.fields],\n }));\n for (const newForm of enrichment.forms) {\n const existingForm =\n mergedForms.find((form) => form.id === newForm.id) ??\n this.findFormWithSharedFields(mergedForms, newForm);\n if (existingForm) {\n this.mergeForm(existingForm, newForm);\n } else {\n mergedForms.push({\n ...newForm,\n fields: [...newForm.fields],\n submitAction: this.namedSubmitAction(newForm.submitAction),\n });\n }\n }\n\n return {\n ...screen,\n components: [...screen.components, ...newComponents],\n forms: mergedForms,\n } as ScreenDescriptor;\n }\n return screen;\n });\n\n return {\n screens: enrichedScreens,\n navigation,\n analyzedFiles: screenFiles.length,\n ...(screenAnalyzer.screensFilteredOut > 0\n ? { screensFilteredOut: screenAnalyzer.screensFilteredOut }\n : {}),\n };\n }\n\n private mergeForm(target: FormDescriptor, source: FormDescriptor): void {\n for (const field of source.fields) {\n const existingField = this.findEquivalentField(target.fields, field);\n if (existingField) {\n this.mergeField(existingField, field);\n } else {\n target.fields.push(field);\n }\n }\n target.submitAction = target.submitAction ?? this.namedSubmitAction(source.submitAction);\n target.validationRules = source.validationRules\n ? { ...source.validationRules, ...(target.validationRules ?? {}) }\n : target.validationRules;\n }\n\n private findEquivalentField(\n fields: FormFieldDescriptor[],\n incoming: FormFieldDescriptor,\n ): FormFieldDescriptor | undefined {\n return fields.find((field) => {\n if (field.name && incoming.name && field.name === incoming.name) return true;\n if (field.valueBinding && incoming.valueBinding && field.valueBinding === incoming.valueBinding) return true;\n if (field.locator?.id && incoming.locator?.id && field.locator.id === incoming.locator.id) return true;\n if (field.placeholder && incoming.placeholder && field.placeholder === incoming.placeholder) return true;\n if (\n field.locator?.accessibilityLabel &&\n incoming.locator?.accessibilityLabel &&\n field.locator.accessibilityLabel === incoming.locator.accessibilityLabel\n ) {\n return true;\n }\n return false;\n });\n }\n\n private mergeField(target: FormFieldDescriptor, source: FormFieldDescriptor): void {\n if (this.isWeakInferredFieldName(target.name) && !this.isWeakInferredFieldName(source.name)) {\n target.name = source.name;\n }\n target.label = target.label ?? source.label;\n target.placeholder = target.placeholder ?? source.placeholder;\n target.options = target.options ?? source.options;\n target.locator = target.locator ?? source.locator;\n target.sourceComponent = target.sourceComponent ?? source.sourceComponent;\n target.valueBinding = target.valueBinding ?? source.valueBinding;\n target.errorBinding = target.errorBinding ?? source.errorBinding;\n target.required = target.required || source.required;\n if (target.type === 'text' && source.type !== 'text') {\n target.type = source.type;\n }\n }\n\n private namedSubmitAction(submitAction: string | undefined): string | undefined {\n return submitAction && submitAction !== 'anonymous' ? submitAction : undefined;\n }\n\n private isWeakInferredFieldName(name: string): boolean {\n return /^(text|value|input|query|search|selected|checked)$/i.test(name);\n }\n\n private findFormWithSharedFields(\n forms: FormDescriptor[],\n incoming: FormDescriptor,\n ): FormDescriptor | undefined {\n if (incoming.fields.length === 0) return undefined;\n\n let best: { form: FormDescriptor; overlap: number } | undefined;\n for (const form of forms) {\n const overlap = incoming.fields.filter((field) => this.findEquivalentField(form.fields, field)).length;\n if (overlap > 0 && (!best || overlap > best.overlap)) {\n best = { form, overlap };\n }\n }\n\n return best?.form;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport traverse from '@babel/traverse';\nimport * as BabelTypes from '@babel/types';\nimport glob from 'fast-glob';\nimport { parseSource } from '../ast/parse';\nimport { classifyJsxComponent, pressHandlerProp } from '../ast/jsx/classify';\nimport { collectFunctions } from '../ast/functions/collect';\nimport { analyzeFunctionBehavior } from '../ast/functions/analyze-async';\nimport { extractNavigationCalls } from '../ast/navigation/calls';\nimport {\n extractDestructiveJsDocTargets,\n extractPermissionsFromJsDoc,\n} from '../extractors/appilots/jsdoc';\nimport type {\n AnalyzerConfig,\n ScreenDescriptor,\n FormDescriptor,\n FormFieldDescriptor,\n ActionDescriptor,\n ComponentDescriptor,\n CollectionDescriptor,\n RowActionDescriptor,\n AppilotsInferredAction,\n LocatorDescriptor,\n} from '../types';\n\nexport {\n extractDestructiveJsDocTargets,\n extractPermissionsFromJsDoc,\n} from '../extractors/appilots/jsdoc';\n\n/**\n * Analyzes React Native source files to extract screen definitions,\n * their components, forms, and available actions.\n *\n * The analyzer uses Babel AST to:\n * 1. Extract optional registerScreen() calls (developer-provided metadata)\n * 2. Detect exported component names\n * 3. Find navigation patterns (navigation.navigate calls)\n * 4. Identify form inputs (TextInput, Input components)\n * 5. Extract button/action handlers\n *\n * §1 Strict mode: when `strictScreens` is enabled in config, only files\n * containing a `registerScreen()` call or matching `screenPatterns` globs\n * are included in the output. This avoids components/hooks/utils being\n * listed as screens.\n */\nexport class ScreenAnalyzer {\n private config: AnalyzerConfig;\n private verbose = process.env.VERBOSE === 'true';\n /** When true, only files with registerScreen or matching screen patterns are included */\n private strictScreens: boolean;\n /** Glob patterns that identify screen files in strict mode */\n private screenPatterns: string[];\n /** §D: Count of screens filtered out in strict mode (available after analyze()) */\n public screensFilteredOut = 0;\n\n constructor(\n config: AnalyzerConfig,\n options?: { strictScreens?: boolean; screenPatterns?: string[] },\n ) {\n this.config = config;\n this.strictScreens = options?.strictScreens ?? false;\n this.screenPatterns = options?.screenPatterns ?? [\n '**/*Screen.{ts,tsx}',\n '**/screens/**/*.{ts,tsx}',\n ];\n }\n\n /** Analyze all screens in the project */\n async analyze(): Promise<ScreenDescriptor[]> {\n const { include = ['src/**/*Screen.{ts,tsx}'], exclude = ['node_modules/**'] } = this.config;\n\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] Searching with patterns:`, include);\n if (this.strictScreens) {\n console.log(`[ScreenAnalyzer] Strict mode ON — screen patterns:`, this.screenPatterns);\n }\n }\n\n // Find all matching files\n const files = await glob(include, {\n cwd: this.config.rootDir,\n ignore: exclude,\n });\n\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] Found ${files.length} files`);\n }\n\n // In strict mode, pre-compute which files match screen patterns\n let screenPatternFiles: Set<string> | null = null;\n if (this.strictScreens) {\n const matched = await glob(this.screenPatterns, {\n cwd: this.config.rootDir,\n ignore: exclude,\n });\n screenPatternFiles = new Set(matched.map((f) => path.resolve(this.config.rootDir, f)));\n }\n\n const screens: ScreenDescriptor[] = [];\n this.screensFilteredOut = 0;\n\n for (const file of files) {\n const filePath = path.resolve(this.config.rootDir, file);\n try {\n const descriptor = await this.analyzeFile(filePath);\n if (!descriptor) continue;\n\n // §1+§B: In strict mode, filter out non-screen files\n // Uses actual registerScreen() call detection, not optional metadata fields\n if (this.strictScreens) {\n const hasRegisterScreen = (descriptor as any).__hasRegisterScreen === true;\n const matchesPattern = screenPatternFiles?.has(filePath) ?? false;\n\n if (!hasRegisterScreen && !matchesPattern) {\n this.screensFilteredOut++;\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] ✗ Filtered (strict): ${file}`);\n }\n continue;\n }\n }\n\n screens.push(descriptor);\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] ✓ Analyzed: ${descriptor.name} (${file})`);\n }\n } catch (error) {\n if (this.verbose) {\n console.warn(\n `[ScreenAnalyzer] Failed to parse ${file}:`,\n error instanceof Error ? error.message : error,\n );\n }\n // Skip files that fail to parse\n }\n }\n\n if (this.verbose && this.strictScreens) {\n console.log(\n `[ScreenAnalyzer] Strict mode: ${screens.length} included, ${this.screensFilteredOut} filtered out`,\n );\n }\n\n return screens;\n }\n\n /** Analyze a single file. Returns descriptor + whether registerScreen was found. */\n async analyzeFile(filePath: string): Promise<ScreenDescriptor | null> {\n const source = await fs.readFile(filePath, 'utf-8');\n const name = this.extractScreenName(filePath);\n\n // Parse the file with the shared parser so every extractor sees\n // the same syntax support and parser changes stay centralized.\n const ast = parseSource(source, this.config.parserPlugins as any);\n\n // Extract metadata from registerScreen call\n const registerScreenMeta = this.extractRegisterScreenMetadata(ast);\n\n // §B: Track whether registerScreen() was actually called in this file\n const hasRegisterScreenCall = this.detectRegisterScreenCall(ast);\n\n // Extract component name (default export)\n const componentName = this.extractDefaultComponentName(ast);\n\n // Extract navigation targets from AST\n const navigationTargets = this.extractNavigationTargets(ast);\n\n // Extract forms and fields. registerScreen metadata is the app\n // author's explicit contract, so keep it ahead of JSX inference.\n const forms = this.mergeForms(registerScreenMeta?.forms ?? [], this.extractForms(ast));\n\n // Extract components\n const components = this.extractComponents(ast);\n\n // Extract actions\n const actions = this.extractActions(ast, registerScreenMeta);\n\n // Extract list/collection semantics. This is the static complement\n // to the SDK's runtime list snapshot: it tells the agent what a row\n // represents and what pressing that row is expected to do.\n const collections = this.extractCollections(ast);\n\n // Extract @appilots-permissions / @appilots-pii JSDoc metadata\n // (BACKLOG 2.1). Reads source comments — runs against the raw\n // file text to keep the implementation simple (Babel comment\n // tokens differ between configurations).\n const permissionsFromJsDoc = extractPermissionsFromJsDoc(source);\n\n // BACKLOG 2.2 — `@appilots-destructive <action-id>[, <id>...]`\n // marks specific extracted actions as destructive. Without an\n // arg, marks ALL actions on the screen as destructive (rare,\n // but supported for screens like \"DeleteAccount\").\n const destructiveTags = extractDestructiveJsDocTargets(source);\n if (destructiveTags) {\n for (const action of actions) {\n if (destructiveTags === '*' || destructiveTags.has(action.id)) {\n action.destructive = true;\n }\n }\n }\n\n // Merge registerScreen metadata with AST analysis\n const descriptor: ScreenDescriptor = {\n name: registerScreenMeta?.name || name,\n filePath,\n title: registerScreenMeta?.title,\n description: registerScreenMeta?.description,\n components,\n forms,\n actions,\n navigationTargets,\n ...(collections.length > 0 ? { collections } : {}),\n ...(registerScreenMeta?.suggestedPrompts && registerScreenMeta.suggestedPrompts.length > 0\n ? { suggestedPrompts: registerScreenMeta.suggestedPrompts }\n : {}),\n ...(permissionsFromJsDoc\n ? {\n permissions: permissionsFromJsDoc,\n ...(permissionsFromJsDoc.isPii ? { isPii: true } : {}),\n }\n : {}),\n };\n\n // Attach flag for strict mode filtering (not part of the public type)\n (descriptor as any).__hasRegisterScreen = hasRegisterScreenCall;\n\n return descriptor;\n }\n\n /**\n * §B: Detect actual presence of registerScreen() call in the AST.\n * This is more reliable than checking for title/description which are optional.\n */\n private detectRegisterScreenCall(ast: BabelTypes.File): boolean {\n let found = false;\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n if (found) return;\n const callee = nodePath.node.callee;\n\n if (\n (BabelTypes.isIdentifier(callee) && callee.name === 'registerScreen') ||\n (BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'registerScreen')\n ) {\n found = true;\n nodePath.stop();\n }\n },\n });\n\n return found;\n }\n\n /**\n * Extract metadata from registerScreen() call\n */\n private extractRegisterScreenMetadata(\n ast: BabelTypes.File,\n ): (Partial<ScreenDescriptor> & { name: string }) | null {\n let metadata: (Partial<ScreenDescriptor> & { name: string }) | null = null;\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n const callee = nodePath.node.callee;\n\n // Check if this is a registerScreen call\n if (\n (BabelTypes.isIdentifier(callee) && callee.name === 'registerScreen') ||\n (BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'registerScreen')\n ) {\n // First argument should be an object expression\n const arg = nodePath.node.arguments[0];\n if (BabelTypes.isObjectExpression(arg)) {\n metadata = this.parseRegisterScreenObject(arg);\n }\n }\n },\n });\n\n return metadata;\n }\n\n /**\n * Parse the object passed to registerScreen()\n */\n private parseRegisterScreenObject(\n objExpr: BabelTypes.ObjectExpression,\n ): Partial<ScreenDescriptor> & { name: string } {\n const result: Partial<ScreenDescriptor> & { name: string } = {\n name: '',\n actions: [],\n forms: [],\n navigationTargets: [],\n components: [],\n };\n\n for (const prop of objExpr.properties) {\n if (!BabelTypes.isObjectProperty(prop) && !BabelTypes.isObjectMethod(prop)) {\n continue;\n }\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n if (BabelTypes.isObjectProperty(prop)) {\n const value = prop.value;\n\n if (key === 'name' && BabelTypes.isStringLiteral(value)) {\n result.name = value.value;\n } else if (key === 'title' && BabelTypes.isStringLiteral(value)) {\n result.title = value.value;\n } else if (key === 'description' && BabelTypes.isStringLiteral(value)) {\n result.description = value.value;\n } else if (key === 'actions' && BabelTypes.isArrayExpression(value)) {\n result.actions = this.parseActionsArray(value);\n } else if (key === 'fields' && BabelTypes.isArrayExpression(value)) {\n // Convert fields to forms\n const fields = this.parseFieldsArray(value);\n if (fields.length > 0) {\n result.forms = [\n {\n id: 'default',\n fields,\n },\n ];\n }\n } else if (key === 'suggestedPrompts' && BabelTypes.isArrayExpression(value)) {\n // Each entry must be a static string literal — dynamic values can't\n // be safely inlined into the MCP doc, so they're silently skipped.\n const prompts: string[] = [];\n for (const element of value.elements) {\n if (BabelTypes.isStringLiteral(element)) {\n const trimmed = element.value.trim();\n if (trimmed.length > 0) prompts.push(trimmed);\n }\n }\n if (prompts.length > 0) {\n result.suggestedPrompts = prompts;\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Parse actions array from registerScreen\n */\n private parseActionsArray(arr: BabelTypes.ArrayExpression): ActionDescriptor[] {\n const actions: ActionDescriptor[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n const action = this.parseActionObject(element);\n if (action.id) {\n actions.push(action);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Parse a single action object\n */\n private parseActionObject(obj: BabelTypes.ObjectExpression): ActionDescriptor {\n const action: ActionDescriptor = {\n id: '',\n type: 'custom',\n };\n\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n const value = prop.value;\n\n if (key === 'id' && BabelTypes.isStringLiteral(value)) {\n action.id = value.value;\n } else if (key === 'label' && BabelTypes.isStringLiteral(value)) {\n action.label = value.value;\n } else if (key === 'type' && BabelTypes.isStringLiteral(value)) {\n action.type = (value.value as any) || 'custom';\n } else if (key === 'targetScreen' && BabelTypes.isStringLiteral(value)) {\n action.targetScreen = value.value;\n } else if (key === 'description' && BabelTypes.isStringLiteral(value)) {\n action.description = value.value;\n } else if (key === 'handler' && BabelTypes.isStringLiteral(value)) {\n action.handler = value.value;\n } else if (key === 'requiresConfirmation' && BabelTypes.isBooleanLiteral(value)) {\n action.requiresConfirmation = value.value;\n } else if (key === 'destructive' && BabelTypes.isBooleanLiteral(value)) {\n action.destructive = value.value;\n } else if (key === 'effect' && BabelTypes.isStringLiteral(value)) {\n action.effect = value.value;\n } else if (key === 'riskLevel' && BabelTypes.isStringLiteral(value)) {\n action.riskLevel = value.value;\n } else if (key === 'nativeConfirmationExpected' && BabelTypes.isBooleanLiteral(value)) {\n action.nativeConfirmationExpected = value.value;\n } else if (key === 'appilotsInferred' && BabelTypes.isObjectExpression(value)) {\n action.appilotsInferred = this.parseAppilotsInferredObject(value);\n }\n }\n\n return action;\n }\n\n private parseAppilotsInferredObject(obj: BabelTypes.ObjectExpression): AppilotsInferredAction {\n const out: AppilotsInferredAction = {};\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n const value = prop.value;\n if (key === 'isAsyncTrigger' && BabelTypes.isBooleanLiteral(value)) {\n out.isAsyncTrigger = value.value;\n } else if (key === 'expectedOutcome' && BabelTypes.isStringLiteral(value)) {\n out.expectedOutcome = value.value as AppilotsInferredAction['expectedOutcome'];\n } else if (key === 'loadingStateBindings' && BabelTypes.isArrayExpression(value)) {\n out.loadingStateBindings = value.elements\n .filter((el): el is BabelTypes.StringLiteral => BabelTypes.isStringLiteral(el))\n .map((el) => el.value);\n }\n }\n return out;\n }\n\n /**\n * Parse fields array from registerScreen\n */\n private parseFieldsArray(arr: BabelTypes.ArrayExpression): FormFieldDescriptor[] {\n const fields: FormFieldDescriptor[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n const field = this.parseFieldObject(element);\n if (field.name) {\n fields.push(field);\n }\n }\n }\n\n return fields;\n }\n\n /**\n * Parse a single field object\n */\n private parseFieldObject(obj: BabelTypes.ObjectExpression): FormFieldDescriptor {\n const field: FormFieldDescriptor = {\n name: '',\n type: 'text',\n required: false,\n };\n\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n const value = prop.value;\n\n if (key === 'id' && BabelTypes.isStringLiteral(value)) {\n field.name = value.value;\n } else if (key === 'label' && BabelTypes.isStringLiteral(value)) {\n field.label = value.value;\n } else if (key === 'type' && BabelTypes.isStringLiteral(value)) {\n field.type = (value.value as any) || 'text';\n } else if (key === 'required' && BabelTypes.isBooleanLiteral(value)) {\n field.required = value.value;\n } else if (key === 'placeholder' && BabelTypes.isStringLiteral(value)) {\n field.placeholder = value.value;\n } else if (key === 'defaultValue' && BabelTypes.isExpression(value)) {\n field.defaultValue = this.extractLiteralValue(value);\n } else if (key === 'options' && BabelTypes.isArrayExpression(value)) {\n field.options = this.parseOptionsArray(value);\n }\n }\n\n return field;\n }\n\n /**\n * Parse options array for select fields\n */\n private parseOptionsArray(arr: BabelTypes.ArrayExpression): { label: string; value: string }[] {\n const options: { label: string; value: string }[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n let label = '';\n let value = '';\n\n for (const prop of element.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n if (key === 'label' && BabelTypes.isStringLiteral(prop.value)) {\n label = prop.value.value;\n } else if (key === 'value' && BabelTypes.isStringLiteral(prop.value)) {\n value = prop.value.value;\n }\n }\n\n if (label && value) {\n options.push({ label, value });\n }\n }\n }\n\n return options;\n }\n\n private mergeForms(primary: FormDescriptor[], secondary: FormDescriptor[]): FormDescriptor[] {\n const out: FormDescriptor[] = primary.map((form) => ({\n ...form,\n fields: [...form.fields],\n }));\n\n for (const form of secondary) {\n const existing =\n out.find((candidate) => candidate.id === form.id) ??\n this.findFormWithSharedFields(out, form);\n if (!existing) {\n out.push({\n ...form,\n fields: [...form.fields],\n submitAction: this.namedSubmitAction(form.submitAction),\n });\n continue;\n }\n\n for (const field of form.fields) {\n const existingField = this.findEquivalentField(existing.fields, field);\n if (existingField) {\n this.mergeFieldMetadata(existingField, field);\n } else {\n existing.fields.push(field);\n }\n }\n existing.submitAction = existing.submitAction ?? this.namedSubmitAction(form.submitAction);\n existing.validationRules = form.validationRules\n ? { ...form.validationRules, ...(existing.validationRules ?? {}) }\n : existing.validationRules;\n }\n\n return out;\n }\n\n private findEquivalentField(\n fields: FormFieldDescriptor[],\n incoming: FormFieldDescriptor,\n ): FormFieldDescriptor | undefined {\n return fields.find((field) => {\n if (field.name && incoming.name && field.name === incoming.name) return true;\n if (\n field.valueBinding &&\n incoming.valueBinding &&\n field.valueBinding === incoming.valueBinding\n )\n return true;\n if (field.locator?.id && incoming.locator?.id && field.locator.id === incoming.locator.id)\n return true;\n if (field.placeholder && incoming.placeholder && field.placeholder === incoming.placeholder)\n return true;\n if (\n field.locator?.accessibilityLabel &&\n incoming.locator?.accessibilityLabel &&\n field.locator.accessibilityLabel === incoming.locator.accessibilityLabel\n ) {\n return true;\n }\n return false;\n });\n }\n\n private namedSubmitAction(submitAction: string | undefined): string | undefined {\n return submitAction && submitAction !== 'anonymous' ? submitAction : undefined;\n }\n\n private mergeFieldMetadata(target: FormFieldDescriptor, source: FormFieldDescriptor): void {\n if (this.isWeakInferredFieldName(target.name) && !this.isWeakInferredFieldName(source.name)) {\n target.name = source.name;\n }\n target.label = target.label ?? source.label;\n target.placeholder = target.placeholder ?? source.placeholder;\n target.options = target.options ?? source.options;\n target.locator = target.locator ?? source.locator;\n if (target.locator && source.locator) {\n target.locator = this.mergeLocator(source.locator, target.locator);\n }\n target.sourceComponent = target.sourceComponent ?? source.sourceComponent;\n target.valueBinding = target.valueBinding ?? source.valueBinding;\n target.errorBinding = target.errorBinding ?? source.errorBinding;\n target.required = target.required || source.required;\n if (target.type === 'text' && source.type !== 'text') {\n target.type = source.type;\n }\n }\n\n private findFormWithSharedFields(\n forms: FormDescriptor[],\n incoming: FormDescriptor,\n ): FormDescriptor | undefined {\n if (incoming.fields.length === 0) return undefined;\n\n let best: { form: FormDescriptor; overlap: number } | undefined;\n for (const form of forms) {\n const overlap = incoming.fields.filter((field) =>\n this.findEquivalentField(form.fields, field),\n ).length;\n if (overlap > 0 && (!best || overlap > best.overlap)) {\n best = { form, overlap };\n }\n }\n\n return best?.form;\n }\n\n /**\n * Extract the name of the default exported component\n */\n private extractDefaultComponentName(ast: BabelTypes.File): string {\n let componentName = '';\n\n traverse(ast, {\n ExportDefaultDeclaration: (nodePath) => {\n const declaration = nodePath.node.declaration;\n\n if (BabelTypes.isFunctionDeclaration(declaration) && declaration.id?.name) {\n componentName = declaration.id.name;\n } else if (BabelTypes.isArrowFunctionExpression(declaration)) {\n // Arrow function export - try to get from parent variable declaration\n componentName = 'Component';\n }\n },\n VariableDeclarator: (nodePath) => {\n if (\n BabelTypes.isIdentifier(nodePath.node.id) &&\n (BabelTypes.isArrowFunctionExpression(nodePath.node.init) ||\n BabelTypes.isFunctionExpression(nodePath.node.init))\n ) {\n // Check if this is exported\n const parent = nodePath.parent;\n if (BabelTypes.isVariableDeclaration(parent) && parent.declare === true) {\n componentName = nodePath.node.id.name;\n }\n }\n },\n });\n\n return componentName;\n }\n\n /**\n * Extract navigation targets from navigation.navigate() calls\n */\n private extractNavigationTargets(ast: BabelTypes.File): string[] {\n const targets = new Set<string>();\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n const callee = nodePath.node.callee;\n\n // Match navigation.navigate('ScreenName') pattern\n if (\n BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.object) &&\n callee.object.name === 'navigation' &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'navigate'\n ) {\n const arg = nodePath.node.arguments[0];\n if (BabelTypes.isStringLiteral(arg)) {\n targets.add(arg.value);\n }\n }\n },\n });\n\n return Array.from(targets).sort();\n }\n\n /**\n * Extract form information from JSX\n */\n private extractForms(ast: BabelTypes.File): FormDescriptor[] {\n const forms: FormDescriptor[] = [];\n const fields = new Map<string, FormFieldDescriptor>();\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n // Detect native inputs and custom form controls by their prop\n // contract, not by app-specific component names.\n const role = classifyJsxComponent(componentName, element);\n if (['input', 'select', 'toggle', 'date'].includes(role)) {\n const field = this.extractFieldFromInputElement(element);\n if (field.name) {\n fields.set(field.name, field);\n }\n }\n }\n },\n });\n\n // Create a default form if we found any fields\n if (fields.size > 0) {\n forms.push({\n id: 'default',\n fields: Array.from(fields.values()),\n });\n }\n\n return forms;\n }\n\n /**\n * Extract field metadata from a TextInput/Input element\n */\n private extractFieldFromInputElement(element: BabelTypes.JSXOpeningElement): FormFieldDescriptor {\n const field: FormFieldDescriptor = {\n name: '',\n type: 'text',\n required: false,\n };\n const componentName = BabelTypes.isJSXIdentifier(element.name) ? element.name.name : '';\n const role = componentName ? classifyJsxComponent(componentName, element) : 'custom';\n field.sourceComponent = componentName || undefined;\n\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value) {\n if (BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'placeholder') {\n field.placeholder = attr.value.value;\n } else if (attrName === 'appilotsId') {\n field.name = attr.value.value;\n field.locator = this.mergeLocator(field.locator, {\n id: attr.value.value,\n appilotsId: attr.value.value,\n source: 'appilotsId',\n });\n } else if (attrName === 'testID') {\n // Use testID to derive field name if not set\n if (!field.name) {\n field.name = attr.value.value.replace(/^(input-|field-|txt-)/, '');\n }\n field.locator = this.mergeLocator(field.locator, {\n id: field.name || attr.value.value,\n testID: attr.value.value,\n source: 'testID',\n });\n } else if (attrName === 'label') {\n field.label = attr.value.value;\n } else if (attrName === 'accessibilityLabel') {\n if (!field.label) field.label = attr.value.value;\n field.locator = this.mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: this.slugifyActionId(attr.value.value) }),\n accessibilityLabel: attr.value.value,\n source: field.locator?.source ?? 'accessibilityLabel',\n });\n } else if (attrName === 'keyboardType') {\n if (attr.value.value === 'email-address' || attr.value.value === 'email')\n field.type = 'email';\n if (attr.value.value === 'phone-pad') field.type = 'phone';\n if (attr.value.value === 'numeric' || attr.value.value === 'number-pad')\n field.type = 'number';\n }\n } else if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n // Handle dynamic attributes\n if (attrName === 'value' && BabelTypes.isIdentifier(attr.value.expression)) {\n // Try to infer field name from variable name\n if (!field.name) {\n field.name = attr.value.expression.name;\n }\n field.valueBinding = attr.value.expression.name;\n } else if (attrName === 'checked' && BabelTypes.isIdentifier(attr.value.expression)) {\n if (!field.name) field.name = attr.value.expression.name;\n field.valueBinding = attr.value.expression.name;\n } else if (attrName === 'error') {\n field.errorBinding = this.expressionToBinding(attr.value.expression);\n } else if (\n attrName === 'required' &&\n BabelTypes.isBooleanLiteral(attr.value.expression)\n ) {\n field.required = attr.value.expression.value;\n }\n }\n } else if (attrName === 'required') {\n field.required = true;\n }\n }\n\n if (role === 'select') field.type = 'select';\n if (role === 'toggle') field.type = 'toggle';\n if (role === 'date') field.type = 'date';\n if (!field.name || this.isWeakInferredFieldName(field.name)) {\n const label = field.locator?.accessibilityLabel ?? field.label ?? field.placeholder;\n if (label) field.name = this.slugifyActionId(label);\n }\n if (!field.locator && field.name) {\n field.locator = { id: field.name, label: field.label, source: 'inferred' };\n } else if (field.locator && !field.locator.id && field.name) {\n field.locator = this.mergeLocator(field.locator, {\n id: field.name,\n label: field.label,\n source: field.locator.source ?? 'inferred',\n });\n }\n\n return field;\n }\n\n private isWeakInferredFieldName(name: string): boolean {\n return /^(text|value|input|query|search|selected|checked)$/i.test(name);\n }\n\n /**\n * Extract component structure from JSX\n */\n private extractComponents(ast: BabelTypes.File): ComponentDescriptor[] {\n const components: ComponentDescriptor[] = [];\n const seen = new Set<string>();\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n if (seen.has(componentName)) return;\n seen.add(componentName);\n\n const type = this.inferComponentType(componentName);\n const component: ComponentDescriptor = {\n name: componentName,\n type,\n };\n\n // Extract testID and accessibilityLabel\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value && BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'testID') {\n component.testID = attr.value.value;\n } else if (attrName === 'accessibilityLabel') {\n component.accessibilityLabel = attr.value.value;\n }\n }\n }\n\n components.push(component);\n }\n },\n });\n\n return components;\n }\n\n /**\n * Infer component type from component name\n */\n private inferComponentType(name: string): ComponentDescriptor['type'] {\n const role = classifyJsxComponent(name);\n if (role === 'select' || role === 'toggle' || role === 'date') {\n return 'input';\n }\n if (role === 'input') {\n return 'input';\n }\n if (role === 'button') {\n return 'button';\n }\n if (role === 'list') {\n return 'list';\n }\n if (role === 'modal') {\n return 'modal';\n }\n if (role === 'view') {\n return 'view';\n }\n return 'custom';\n }\n\n /**\n * Extract actions from button/touchable elements\n */\n private extractActions(\n ast: BabelTypes.File,\n registerScreenMeta: (Partial<ScreenDescriptor> & { name: string }) | null,\n ): ActionDescriptor[] {\n // Start with actions from registerScreen if available\n const actions = [...(registerScreenMeta?.actions || [])];\n const actionIds = new Set(actions.map((a) => a.id));\n const actionLabels = new Map(\n actions.filter((a) => a.label).map((a) => [this.normalizeLabel(a.label!), a] as const),\n );\n\n // Extract additional actions from JSX buttons/touchables\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n if (classifyJsxComponent(componentName, element) === 'button') {\n const action = this.extractActionFromButton(element);\n const existingByLabel = action.label\n ? actionLabels.get(this.normalizeLabel(action.label))\n : undefined;\n if (existingByLabel) {\n this.mergeActionMetadata(existingByLabel, action);\n return;\n }\n if (action.id && !actionIds.has(action.id)) {\n actions.push(action);\n actionIds.add(action.id);\n if (action.label) actionLabels.set(this.normalizeLabel(action.label), action);\n }\n }\n }\n },\n });\n\n this.enrichActionsFromHandlers(ast, actions);\n\n return actions;\n }\n\n private normalizeLabel(label: string): string {\n return label\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '');\n }\n\n private mergeActionMetadata(target: ActionDescriptor, source: ActionDescriptor): void {\n target.handler = target.handler ?? source.handler;\n target.targetScreen = target.targetScreen ?? source.targetScreen;\n target.description = target.description ?? source.description;\n target.nativeConfirmationExpected =\n target.nativeConfirmationExpected || source.nativeConfirmationExpected || undefined;\n target.requiresConfirmation =\n target.requiresConfirmation || source.requiresConfirmation || undefined;\n target.destructive = target.destructive || source.destructive || undefined;\n target.effect = target.effect ?? source.effect;\n target.riskLevel = target.riskLevel ?? source.riskLevel;\n target.appilotsInferred = target.appilotsInferred ?? source.appilotsInferred;\n }\n\n private enrichActionsFromHandlers(ast: BabelTypes.File, actions: ActionDescriptor[]): void {\n const handlerMap = this.collectHandlerInfo(ast);\n const labelToHandler = this.collectButtonHandlersByLabel(ast);\n\n for (const action of actions) {\n if (!action.handler && action.label) {\n const handler = labelToHandler.get(action.label);\n if (handler) action.handler = handler;\n }\n\n const handler = action.handler ? handlerMap.get(action.handler) : undefined;\n if (!handler) continue;\n\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n ...handler.appilotsInferred,\n };\n if (handler.nativeConfirmationExpected) action.nativeConfirmationExpected = true;\n if (handler.targetScreen && !action.targetScreen) action.targetScreen = handler.targetScreen;\n if (handler.successSignal && !action.successSignal)\n action.successSignal = handler.successSignal;\n if (handler.failureSignal && !action.failureSignal)\n action.failureSignal = handler.failureSignal;\n if (handler.opensModal && !action.opensModal) action.opensModal = handler.opensModal;\n if (\n handler.destructive ||\n action.destructive === true ||\n action.requiresConfirmation === true ||\n action.effect === 'destructive' ||\n action.riskLevel === 'high'\n ) {\n action.destructive = true;\n action.effect = action.effect ?? 'destructive';\n action.riskLevel = action.riskLevel ?? 'high';\n action.requiresConfirmation = action.requiresConfirmation ?? true;\n }\n }\n }\n\n private collectButtonHandlersByLabel(ast: BabelTypes.File): Map<string, string> {\n const out = new Map<string, string>();\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n if (!BabelTypes.isJSXIdentifier(element.name)) return;\n const componentName = element.name.name;\n if (classifyJsxComponent(componentName, element) !== 'button') return;\n // Not necessarily `onPress` — a design system spells the same\n // affordance `onRetry`, `onClose`, `onAllow`. See pressHandlerProp.\n const pressProp = pressHandlerProp(element);\n\n let label: string | undefined;\n let handler: string | undefined;\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName || !attr.value) continue;\n if (\n (attrName === 'title' || attrName === 'accessibilityLabel' || attrName === 'label') &&\n BabelTypes.isStringLiteral(attr.value)\n ) {\n label = attr.value.value;\n }\n if (\n attrName === pressProp &&\n BabelTypes.isJSXExpressionContainer(attr.value) &&\n BabelTypes.isIdentifier(attr.value.expression)\n ) {\n handler = attr.value.expression.name;\n }\n }\n if (label && handler) out.set(label, handler);\n },\n });\n return out;\n }\n\n private collectHandlerInfo(ast: BabelTypes.File): Map<\n string,\n {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: import('../types').SignalDescriptor;\n failureSignal?: import('../types').SignalDescriptor;\n opensModal?: string;\n }\n > {\n const handlers = collectFunctions(ast);\n\n const out = new Map<\n string,\n {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: import('../types').SignalDescriptor;\n failureSignal?: import('../types').SignalDescriptor;\n opensModal?: string;\n }\n >();\n\n for (const [name, fn] of handlers) {\n const info = analyzeFunctionBehavior(name, fn, handlers);\n out.set(name, info);\n }\n\n return out;\n }\n\n private analyzeHandlerFunction(\n name: string,\n fn: BabelTypes.Function,\n handlers: Map<string, BabelTypes.Function>,\n seen = new Set<string>(),\n ): {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n } {\n if (seen.has(name)) {\n return {\n appilotsInferred: { expectedOutcome: 'none' },\n destructive: false,\n nativeConfirmationExpected: false,\n };\n }\n seen.add(name);\n\n let hasAwait = fn.async === true;\n let hasThen = false;\n let hasStateSetter = false;\n let nativeConfirmationExpected = false;\n let targetScreen: string | undefined;\n let destructive = /(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(name);\n\n const inspectNode = (node: BabelTypes.Node) => {\n if (BabelTypes.isAwaitExpression(node)) hasAwait = true;\n if (\n BabelTypes.isCallExpression(node) &&\n BabelTypes.isMemberExpression(node.callee) &&\n BabelTypes.isIdentifier(node.callee.property)\n ) {\n const method = node.callee.property.name;\n if (method === 'then' || method === 'catch' || method === 'finally') hasThen = true;\n if (\n BabelTypes.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n ['navigate', 'push', 'replace'].includes(method)\n ) {\n const firstArg = node.arguments[0];\n if (BabelTypes.isStringLiteral(firstArg)) targetScreen = firstArg.value;\n }\n if (\n BabelTypes.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'Alert' &&\n method === 'alert'\n ) {\n nativeConfirmationExpected = true;\n }\n }\n if (BabelTypes.isCallExpression(node) && BabelTypes.isIdentifier(node.callee)) {\n const calleeName = node.callee.name;\n if (/^set[A-Z]/.test(calleeName)) hasStateSetter = true;\n if (/(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(calleeName)) {\n destructive = true;\n }\n const nested = handlers.get(calleeName);\n if (nested) {\n const nestedInfo = this.analyzeHandlerFunction(calleeName, nested, handlers, seen);\n hasAwait = hasAwait || nestedInfo.appilotsInferred.isAsyncTrigger === true;\n nativeConfirmationExpected ||= nestedInfo.nativeConfirmationExpected;\n destructive ||= nestedInfo.destructive;\n targetScreen = targetScreen ?? nestedInfo.targetScreen;\n }\n }\n if (\n BabelTypes.isMemberExpression(node) &&\n BabelTypes.isIdentifier(node.property) &&\n /(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(node.property.name)\n ) {\n destructive = true;\n }\n };\n\n if (fn.body) {\n traverse(\n fn.body as any,\n {\n noScope: true,\n enter: (nodePath: any) => inspectNode(nodePath.node),\n } as any,\n );\n }\n\n const expectedOutcome: AppilotsInferredAction['expectedOutcome'] = targetScreen\n ? 'navigation'\n : hasStateSetter\n ? 'inline-feedback'\n : hasAwait || hasThen\n ? 'mixed'\n : 'none';\n\n return {\n appilotsInferred: {\n isAsyncTrigger: hasAwait || hasThen || undefined,\n expectedOutcome,\n },\n destructive,\n nativeConfirmationExpected,\n targetScreen,\n };\n }\n\n /**\n * BACKLOG 2.2 — heuristic destructive detection.\n *\n * Combines several signals:\n * - JSX `destructive` boolean prop (`<Pressable destructive />`)\n * - JSX `aria-destructive` attribute\n * - Handler name contains a generic destructive verb\n * (delete/destroy/remove/discard/wipe/revoke/etc.). `cancel` is intentionally excluded —\n * too many \"Cancelar\" buttons that just dismiss modals.\n * - testID / id contains a destructive verb\n *\n * Default-allow with explicit opt-out via `@appilots-non-destructive`\n * is more dangerous than the inverse, so we default-deny: the\n * heuristic must hit OR the JSDoc tag must be present.\n */\n private isElementDestructive(\n element: BabelTypes.JSXOpeningElement,\n handlerName: string | undefined,\n actionId: string | undefined,\n ): boolean {\n const DESTRUCTIVE_VERB =\n /(delete|destroy|remove|discard|wipe|erase|drop|terminate|revoke|deactivate|disable)/i;\n\n // Explicit JSX prop wins.\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (attrName === 'destructive' || attrName === 'aria-destructive') {\n // <Btn destructive /> (no value) is true; <Btn destructive={false} />\n // turns it off.\n if (attr.value === null) return true;\n if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n const expr = attr.value.expression;\n if (BabelTypes.isBooleanLiteral(expr)) return expr.value;\n }\n if (BabelTypes.isStringLiteral(attr.value)) {\n return attr.value.value === 'true';\n }\n }\n }\n\n if (handlerName && DESTRUCTIVE_VERB.test(handlerName)) return true;\n if (actionId && DESTRUCTIVE_VERB.test(actionId)) return true;\n\n return false;\n }\n\n /**\n * Extract action metadata from a button element\n */\n private extractActionFromButton(element: BabelTypes.JSXOpeningElement): ActionDescriptor {\n const action: ActionDescriptor = {\n id: '',\n type: 'custom',\n };\n const componentName = BabelTypes.isJSXIdentifier(element.name) ? element.name.name : undefined;\n action.sourceComponent = componentName;\n // The prop that actually fires this control — `onPress` on an RN\n // primitive, `onRetry`/`onClose`/`onAllow` on a design-system one.\n const pressProp = pressHandlerProp(element) ?? 'onPress';\n let handlerName: string | undefined;\n\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value) {\n if (BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'appilotsId') {\n action.id = attr.value.value;\n action.locator = this.mergeLocator(action.locator, {\n id: attr.value.value,\n appilotsId: attr.value.value,\n source: 'appilotsId',\n });\n } else if (attrName === 'testID') {\n action.id = attr.value.value;\n action.locator = this.mergeLocator(action.locator, {\n id: attr.value.value,\n testID: attr.value.value,\n source: 'testID',\n });\n } else if (\n attrName === 'title' ||\n attrName === 'label' ||\n attrName === 'accessibilityLabel'\n ) {\n action.label = attr.value.value;\n if (attrName === 'accessibilityLabel') {\n action.locator = this.mergeLocator(action.locator, {\n accessibilityLabel: attr.value.value,\n source: 'accessibilityLabel',\n });\n }\n if (!action.id) {\n action.id = this.slugifyActionId(attr.value.value);\n }\n }\n } else if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n if (attrName === pressProp && BabelTypes.isIdentifier(attr.value.expression)) {\n // Infer action type from handler name\n handlerName = attr.value.expression.name.toLowerCase();\n action.handler = attr.value.expression.name;\n if (handlerName.includes('submit')) {\n action.type = 'submit';\n } else if (handlerName.includes('navigate')) {\n action.type = 'navigation';\n }\n } else if (attrName === pressProp) {\n const inline = this.extractInlineOnPressMetadata(attr.value.expression);\n if (inline.handler) {\n handlerName = inline.handler.toLowerCase();\n action.handler = inline.handler;\n if (handlerName.includes('submit')) action.type = 'submit';\n }\n if (inline.targetScreen) {\n action.type = 'navigation';\n action.targetScreen = inline.targetScreen;\n }\n } else if (attrName === 'loading' && BabelTypes.isIdentifier(attr.value.expression)) {\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n isAsyncTrigger: true,\n loadingStateBindings: [attr.value.expression.name],\n };\n }\n }\n } else if (attrName === 'destructive') {\n action.destructive = true;\n }\n }\n\n if (!action.locator && action.id) {\n action.locator = {\n id: action.id,\n label: action.label,\n source: action.label ? 'label' : 'inferred',\n };\n }\n\n // BACKLOG 2.2 — flag the action as destructive if the heuristic\n // detects it. Persists into the MCP doc so the runtime doesn't\n // need to re-derive on every request.\n if (this.isElementDestructive(element, handlerName, action.id)) {\n action.destructive = true;\n }\n\n return action;\n }\n\n private extractInlineOnPressMetadata(\n expr: BabelTypes.Expression | BabelTypes.JSXEmptyExpression,\n ): Pick<ActionDescriptor, 'handler' | 'targetScreen'> {\n if (BabelTypes.isJSXEmptyExpression(expr)) return {};\n const navCall = extractNavigationCalls(expr).find((call) => call.targetScreen);\n const handler = this.extractFirstHandlerName(expr);\n return {\n ...(handler ? { handler } : {}),\n ...(navCall?.targetScreen ? { targetScreen: navCall.targetScreen } : {}),\n };\n }\n\n private extractFirstHandlerName(node: BabelTypes.Node): string | undefined {\n if (BabelTypes.isIdentifier(node)) return node.name;\n if (BabelTypes.isArrowFunctionExpression(node) || BabelTypes.isFunctionExpression(node)) {\n return this.extractFirstHandlerName(node.body);\n }\n if (BabelTypes.isBlockStatement(node)) {\n for (const statement of node.body) {\n const handler = this.extractFirstHandlerName(statement);\n if (handler) return handler;\n }\n return undefined;\n }\n if (BabelTypes.isExpressionStatement(node)) {\n return this.extractFirstHandlerName(node.expression);\n }\n if (BabelTypes.isReturnStatement(node)) {\n return node.argument ? this.extractFirstHandlerName(node.argument) : undefined;\n }\n if (BabelTypes.isUnaryExpression(node)) {\n return this.extractFirstHandlerName(node.argument);\n }\n if (BabelTypes.isAwaitExpression(node)) {\n return this.extractFirstHandlerName(node.argument);\n }\n if (BabelTypes.isCallExpression(node)) {\n if (BabelTypes.isIdentifier(node.callee)) return node.callee.name;\n return undefined;\n }\n return undefined;\n }\n\n private mergeLocator(\n current: LocatorDescriptor | undefined,\n next: LocatorDescriptor,\n ): LocatorDescriptor {\n return { ...(current ?? {}), ...next };\n }\n\n private expressionToBinding(\n expr: BabelTypes.Expression | BabelTypes.JSXEmptyExpression,\n ): string | undefined {\n if (BabelTypes.isIdentifier(expr)) return expr.name;\n if (\n BabelTypes.isMemberExpression(expr) &&\n BabelTypes.isIdentifier(expr.object) &&\n BabelTypes.isIdentifier(expr.property)\n ) {\n return `${expr.object.name}.${expr.property.name}`;\n }\n return undefined;\n }\n\n private slugifyActionId(label: string): string {\n return label\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n\n private extractCollections(ast: BabelTypes.File): CollectionDescriptor[] {\n const renderItemFns = this.collectRenderItemFunctions(ast);\n const collections: CollectionDescriptor[] = [];\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n if (!BabelTypes.isJSXIdentifier(element.name)) return;\n const component = element.name.name;\n if (!['FlatList', 'SectionList', 'VirtualizedList', 'FlashList'].includes(component)) {\n return;\n }\n\n const dataSource = this.jsxExpressionIdentifier(element, 'data');\n const renderItem = this.jsxExpressionIdentifier(element, 'renderItem');\n const keyField = this.extractKeyField(element);\n const renderFn = renderItem ? renderItemFns.get(renderItem) : undefined;\n const rowAction = renderFn ? this.extractRowAction(renderFn) : undefined;\n const displayFields = renderFn ? this.extractItemFields(renderFn) : [];\n const itemType = this.inferItemType(dataSource, renderItem, displayFields);\n const identityFields = this.inferIdentityFields(keyField, displayFields);\n const searchField = this.inferSearchField(ast, dataSource);\n\n const id =\n dataSource ?? renderItem ?? `${component.toLowerCase()}-${collections.length + 1}`;\n collections.push({\n id,\n component,\n ...(itemType ? { itemType } : {}),\n ...(dataSource ? { dataSource } : {}),\n ...(keyField ? { keyField } : {}),\n ...(renderItem ? { renderItem } : {}),\n ...(displayFields.length > 0 ? { displayFields } : {}),\n ...(rowAction ? { rowAction } : {}),\n ...(rowAction ? { rowActions: [rowAction] } : {}),\n ...(identityFields.length > 0 ? { identityFields } : {}),\n ...(searchField ? { searchField } : {}),\n });\n },\n });\n\n return collections;\n }\n\n private collectRenderItemFunctions(ast: BabelTypes.File): Map<string, BabelTypes.Function> {\n const out = new Map<string, BabelTypes.Function>();\n traverse(ast, {\n VariableDeclarator: (nodePath) => {\n if (!BabelTypes.isIdentifier(nodePath.node.id)) return;\n const init = nodePath.node.init;\n if (BabelTypes.isArrowFunctionExpression(init) || BabelTypes.isFunctionExpression(init)) {\n out.set(nodePath.node.id.name, init);\n }\n },\n FunctionDeclaration: (nodePath) => {\n if (nodePath.node.id?.name) out.set(nodePath.node.id.name, nodePath.node);\n },\n });\n return out;\n }\n\n private jsxExpressionIdentifier(\n element: BabelTypes.JSXOpeningElement,\n attrName: string,\n ): string | undefined {\n const attr = element.attributes.find(\n (candidate) =>\n BabelTypes.isJSXAttribute(candidate) &&\n BabelTypes.isJSXIdentifier(candidate.name) &&\n candidate.name.name === attrName,\n );\n if (!BabelTypes.isJSXAttribute(attr) || !attr.value) return undefined;\n if (\n BabelTypes.isJSXExpressionContainer(attr.value) &&\n BabelTypes.isIdentifier(attr.value.expression)\n ) {\n return attr.value.expression.name;\n }\n if (BabelTypes.isStringLiteral(attr.value)) return attr.value.value;\n return undefined;\n }\n\n private extractKeyField(element: BabelTypes.JSXOpeningElement): string | undefined {\n const attr = element.attributes.find(\n (candidate) =>\n BabelTypes.isJSXAttribute(candidate) &&\n BabelTypes.isJSXIdentifier(candidate.name) &&\n candidate.name.name === 'keyExtractor',\n );\n if (\n !BabelTypes.isJSXAttribute(attr) ||\n !attr.value ||\n !BabelTypes.isJSXExpressionContainer(attr.value)\n ) {\n return undefined;\n }\n const expr = attr.value.expression;\n if (!BabelTypes.isArrowFunctionExpression(expr)) return undefined;\n const param = expr.params[0];\n if (!BabelTypes.isIdentifier(param)) return undefined;\n if (\n BabelTypes.isMemberExpression(expr.body) &&\n BabelTypes.isIdentifier(expr.body.object) &&\n expr.body.object.name === param.name &&\n BabelTypes.isIdentifier(expr.body.property)\n ) {\n return expr.body.property.name;\n }\n return undefined;\n }\n\n private extractRowAction(fn: BabelTypes.Function): RowActionDescriptor | undefined {\n let action: RowActionDescriptor | undefined;\n traverse(\n fn.body as any,\n {\n noScope: true,\n CallExpression: (nodePath: any) => {\n const node = nodePath.node as BabelTypes.CallExpression;\n if (\n !BabelTypes.isMemberExpression(node.callee) ||\n !BabelTypes.isIdentifier(node.callee.object) ||\n node.callee.object.name !== 'navigation' ||\n !BabelTypes.isIdentifier(node.callee.property) ||\n !['navigate', 'push', 'replace'].includes(node.callee.property.name)\n ) {\n return;\n }\n const firstArg = node.arguments[0];\n if (!BabelTypes.isStringLiteral(firstArg)) return;\n const params = this.extractNavigationParams(node.arguments[1]);\n action = {\n type: 'navigation',\n targetScreen: firstArg.value,\n ...(Object.keys(params).length > 0 ? { params } : {}),\n description: `Pressing a row opens ${firstArg.value}`,\n };\n },\n } as any,\n );\n return action;\n }\n\n private extractNavigationParams(arg: BabelTypes.Node | undefined | null): Record<string, string> {\n const params: Record<string, string> = {};\n if (!arg || !BabelTypes.isObjectExpression(arg)) return params;\n for (const prop of arg.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n const key = BabelTypes.isIdentifier(prop.key)\n ? prop.key.name\n : BabelTypes.isStringLiteral(prop.key)\n ? prop.key.value\n : undefined;\n if (!key) continue;\n if (\n BabelTypes.isMemberExpression(prop.value) &&\n BabelTypes.isIdentifier(prop.value.object) &&\n BabelTypes.isIdentifier(prop.value.property)\n ) {\n params[key] = `${prop.value.object.name}.${prop.value.property.name}`;\n } else if (BabelTypes.isIdentifier(prop.value)) {\n params[key] = prop.value.name;\n } else if (BabelTypes.isStringLiteral(prop.value)) {\n params[key] = prop.value.value;\n }\n }\n return params;\n }\n\n private extractItemFields(fn: BabelTypes.Function): string[] {\n const fields = new Set<string>();\n const itemNames = new Set<string>(['item']);\n const firstParam = fn.params[0];\n if (BabelTypes.isObjectPattern(firstParam)) {\n for (const prop of firstParam.properties) {\n if (\n BabelTypes.isObjectProperty(prop) &&\n BabelTypes.isIdentifier(prop.key) &&\n prop.key.name === 'item' &&\n BabelTypes.isIdentifier(prop.value)\n ) {\n itemNames.add(prop.value.name);\n }\n }\n } else if (BabelTypes.isIdentifier(firstParam)) {\n itemNames.add(firstParam.name);\n }\n\n traverse(\n fn.body as any,\n {\n noScope: true,\n MemberExpression: (nodePath: any) => {\n const node = nodePath.node as BabelTypes.MemberExpression;\n if (\n BabelTypes.isIdentifier(node.object) &&\n itemNames.has(node.object.name) &&\n BabelTypes.isIdentifier(node.property)\n ) {\n fields.add(node.property.name);\n }\n },\n } as any,\n );\n\n return Array.from(fields).sort();\n }\n\n private inferItemType(\n dataSource: string | undefined,\n renderItem: string | undefined,\n displayFields: string[],\n ): string | undefined {\n const source = dataSource ?? renderItem;\n if (!source) return undefined;\n const singular = source\n .replace(/^render/i, '')\n .replace(/(List|Items|Data|Rows|Sections)$/i, '')\n .replace(/s$/i, '');\n const candidate = singular.charAt(0).toUpperCase() + singular.slice(1);\n if (candidate.length > 1) return candidate;\n if (displayFields.length > 0) return 'Item';\n return undefined;\n }\n\n /**\n * Identity comes from how a field is NAMED, not from what the app\n * sells: `id`/`uuid`/`key`/`slug` are conventions any codebase uses,\n * `name`/`title`/`email` are how any row introduces itself. `plate`\n * used to sit in this list and read like one of them — but it is the\n * example app's schema, and no other tenant ever got its equivalent\n * (`mrn`, `trackingNumber`, `sku`) added here.\n */\n private inferIdentityFields(keyField: string | undefined, displayFields: string[]): string[] {\n const out = new Set<string>();\n if (keyField) out.add(keyField);\n for (const field of displayFields) {\n if (/^(id|uuid|key|name|title|email|slug)$/i.test(field)) out.add(field);\n }\n return Array.from(out);\n }\n\n private inferSearchField(\n ast: BabelTypes.File,\n dataSource: string | undefined,\n ): string | undefined {\n if (!dataSource) return undefined;\n let queryBinding: string | undefined;\n traverse(ast, {\n CallExpression: (nodePath) => {\n const node = nodePath.node;\n if (!BabelTypes.isMemberExpression(node.callee)) return;\n if (\n !BabelTypes.isIdentifier(node.callee.property) ||\n node.callee.property.name !== 'filter'\n )\n return;\n if (!BabelTypes.isIdentifier(node.callee.object) || node.callee.object.name !== dataSource)\n return;\n const fn = node.arguments[0];\n if (!BabelTypes.isArrowFunctionExpression(fn) && !BabelTypes.isFunctionExpression(fn))\n return;\n traverse(\n fn.body as any,\n {\n noScope: true,\n Identifier: (innerPath: any) => {\n const name = innerPath.node.name;\n if (/query|search|filter/i.test(name)) queryBinding = queryBinding ?? name;\n },\n } as any,\n );\n },\n });\n return queryBinding;\n }\n\n /**\n * Extract literal values from AST nodes\n */\n private extractLiteralValue(node: BabelTypes.Expression): unknown {\n if (BabelTypes.isStringLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isNumericLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isBooleanLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isNullLiteral(node)) {\n return null;\n }\n return undefined;\n }\n\n /**\n * Extract screen name from file path\n * E.g., /src/screens/ItemListScreen.tsx -> ItemListScreen\n */\n private extractScreenName(filePath: string): string {\n const basename = path.basename(filePath);\n return basename.replace(/\\.(tsx?|jsx?)$/, '');\n }\n}\n","import { parse, type ParserPlugin } from '@babel/parser';\nimport type * as t from '@babel/types';\n\nexport const DEFAULT_PARSER_PLUGINS: ParserPlugin[] = [\n 'jsx',\n 'typescript',\n ['decorators', { decoratorsBeforeExport: true }],\n 'asyncGenerators',\n ['pipelineOperator', { proposal: 'minimal' }],\n 'partialApplication',\n 'logicalAssignment',\n 'classPrivateProperties',\n 'classPrivateMethods',\n ['recordAndTuple', { syntaxType: 'hash' }],\n];\n\nexport function parseSource(source: string, parserPlugins: ParserPlugin[] = []): t.File {\n return parse(source, {\n sourceType: 'module',\n plugins: [...DEFAULT_PARSER_PLUGINS, ...parserPlugins],\n }) as t.File;\n}\n","import * as t from '@babel/types';\n\nexport function findJsxAttribute(\n element: t.JSXOpeningElement,\n name: string,\n): t.JSXAttribute | undefined {\n return element.attributes.find(\n (attr): attr is t.JSXAttribute =>\n t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name) && attr.name.name === name,\n );\n}\n\nexport function getStringAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr || !attr.value) return undefined;\n if (t.isStringLiteral(attr.value)) return attr.value.value;\n if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n return attr.value.expression.value;\n }\n return undefined;\n}\n\nexport function getBooleanAttr(\n element: t.JSXOpeningElement,\n name: string,\n): boolean | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr) return undefined;\n if (attr.value === null) return true;\n if (t.isStringLiteral(attr.value)) {\n if (attr.value.value === 'true') return true;\n if (attr.value.value === 'false') return false;\n }\n if (t.isJSXExpressionContainer(attr.value) && t.isBooleanLiteral(attr.value.expression)) {\n return attr.value.expression.value;\n }\n return undefined;\n}\n\nexport function getExpressionIdentifierAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n return t.isIdentifier(attr.value.expression) ? attr.value.expression.name : undefined;\n}\n\nexport function getMemberExpressionAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n const expr = attr.value.expression;\n if (t.isIdentifier(expr)) return expr.name;\n if (\n t.isMemberExpression(expr) &&\n t.isIdentifier(expr.object) &&\n t.isIdentifier(expr.property)\n ) {\n return `${expr.object.name}.${expr.property.name}`;\n }\n return undefined;\n}\n\nexport function hasJsxAttribute(element: t.JSXOpeningElement, name: string): boolean {\n return Boolean(findJsxAttribute(element, name));\n}\n\nexport function firstStringAttr(\n element: t.JSXOpeningElement,\n names: string[],\n): { name: string; value: string } | undefined {\n for (const name of names) {\n const value = getStringAttr(element, name);\n if (value) return { name, value };\n }\n return undefined;\n}\n","import type * as t from '@babel/types';\nimport { getExpressionIdentifierAttr, getStringAttr, hasJsxAttribute } from './attributes';\n\nexport type SemanticComponentRole =\n | 'view'\n | 'input'\n | 'button'\n | 'list'\n | 'modal'\n | 'select'\n | 'toggle'\n | 'date'\n | 'custom';\n\n/**\n * Handler props that fire from layout, scrolling or asset loading rather\n * than from a user aiming at this control. A `<ScrollView onScroll>` is not\n * something the agent can be told to press.\n */\nconst NON_INTERACTION_HANDLERS = new Set([\n 'onLayout',\n 'onScroll',\n 'onScrollBeginDrag',\n 'onScrollEndDrag',\n 'onMomentumScrollBegin',\n 'onMomentumScrollEnd',\n 'onContentSizeChange',\n 'onEndReached',\n 'onViewableItemsChanged',\n 'onLoad',\n 'onLoadStart',\n 'onLoadEnd',\n 'onError',\n 'onProgress',\n 'onFocus',\n 'onBlur',\n]);\n\n/** Handlers already read as changing a VALUE, not as a press. */\nconst VALUE_HANDLERS = new Set([\n 'onChange',\n 'onChangeText',\n 'onValueChange',\n 'onSelect',\n 'onSelectionChange',\n 'onSubmitEditing',\n]);\n\n/**\n * The prop that makes this element pressable, if any.\n *\n * `onPress` is only React Native's spelling for the ONE component it ships.\n * A design system names the same affordance after what it does: `onRetry`\n * on an error state, `onClose` on a bottom sheet, `onAllow` on a permission\n * prompt, `onAction` on an empty state. Looking for `onPress` alone made\n * every one of those invisible to the document — measured at 14 of the 23\n * addressable misses in `apps/example-app`, and that app is the friendly\n * case.\n *\n * Deliberately structural: it reads the prop shape at the CALL SITE and\n * never resolves the import. A component that takes a handler and does not\n * call it is out of reach either way, and following imports buys a much\n * smaller share of the gap than it costs.\n */\nexport function pressHandlerProp(element: t.JSXOpeningElement): string | undefined {\n let fallback: string | undefined;\n for (const attr of element.attributes) {\n if (attr.type !== 'JSXAttribute' || attr.name.type !== 'JSXIdentifier') continue;\n const name = attr.name.name;\n if (!/^on[A-Z]/.test(name)) continue;\n if (attr.value?.type !== 'JSXExpressionContainer') continue;\n // `onPress` wins outright when both are present, so a wrapper that\n // forwards an extra handler cannot displace the real one.\n if (name === 'onPress') return name;\n if (NON_INTERACTION_HANDLERS.has(name) || VALUE_HANDLERS.has(name)) continue;\n fallback ??= name;\n }\n return fallback;\n}\n\nconst VIEW_COMPONENTS = new Set(['View', 'ScrollView', 'SafeAreaView', 'KeyboardAvoidingView']);\nconst INPUT_COMPONENTS = new Set(['TextInput', 'Input', 'HocInput']);\nconst BUTTON_COMPONENTS = new Set(['TouchableOpacity', 'Pressable', 'Button']);\nconst LIST_COMPONENTS = new Set(['FlatList', 'SectionList', 'VirtualizedList', 'FlashList']);\nconst MODAL_COMPONENTS = new Set(['Modal', 'BottomSheet']);\n\nexport function classifyJsxComponent(\n name: string,\n element?: t.JSXOpeningElement,\n): SemanticComponentRole {\n if (LIST_COMPONENTS.has(name)) return 'list';\n if (MODAL_COMPONENTS.has(name)) return 'modal';\n if (/date/i.test(name)) return 'date';\n if (/(select|picker|dropdown|radio)/i.test(name)) return 'select';\n if (/(checkbox|switch|toggle)/i.test(name)) return 'toggle';\n if (INPUT_COMPONENTS.has(name)) return 'input';\n if (BUTTON_COMPONENTS.has(name)) return 'button';\n\n if (element) {\n // A choice control's option list is named after the domain as often as\n // after the pattern: `options`, but also `segments`, `choices`, `tabs`.\n // Reading only `options` sent every SegmentedControl in the testbed to\n // `custom` — including ones that carried an explicit `appilotsId`, so\n // the identity was there and only the classification was missing.\n const hasOptions =\n hasJsxAttribute(element, 'options') ||\n hasJsxAttribute(element, 'segments') ||\n hasJsxAttribute(element, 'choices') ||\n hasJsxAttribute(element, 'tabs');\n const hasValue = hasJsxAttribute(element, 'value');\n const hasChecked = hasJsxAttribute(element, 'checked') || hasJsxAttribute(element, 'selected');\n const hasOnChange =\n hasJsxAttribute(element, 'onChange') ||\n hasJsxAttribute(element, 'onValueChange') ||\n hasJsxAttribute(element, 'onChangeText');\n if (hasOptions && (hasValue || hasOnChange)) return 'select';\n if (hasChecked && hasOnChange) return 'toggle';\n if (\n hasOnChange &&\n (hasJsxAttribute(element, 'label') || hasJsxAttribute(element, 'placeholder'))\n ) {\n return 'input';\n }\n if (pressHandlerProp(element)) return 'button';\n if (getStringAttr(element, 'visible') || getExpressionIdentifierAttr(element, 'visible')) {\n return 'modal';\n }\n }\n\n if (VIEW_COMPONENTS.has(name)) return 'view';\n return 'custom';\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nexport function collectFunctions(ast: t.File): Map<string, t.Function> {\n const handlers = new Map<string, t.Function>();\n\n traverse(ast, {\n FunctionDeclaration: (nodePath) => {\n if (nodePath.node.id?.name) handlers.set(nodePath.node.id.name, nodePath.node);\n },\n VariableDeclarator: (nodePath) => {\n if (!t.isIdentifier(nodePath.node.id)) return;\n const init = nodePath.node.init;\n if (t.isArrowFunctionExpression(init) || t.isFunctionExpression(init)) {\n handlers.set(nodePath.node.id.name, init);\n }\n },\n });\n\n return handlers;\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\nimport type { AppilotsInferredAction, SignalDescriptor } from '../../types';\n\nexport interface FunctionBehavior {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: SignalDescriptor;\n failureSignal?: SignalDescriptor;\n opensModal?: string;\n loadingStateBindings?: string[];\n}\n\nconst DESTRUCTIVE_VERB =\n /(delete|destroy|remove|discard|wipe|erase|drop|terminate|revoke|deactivate|disable)/i;\n\nexport function analyzeFunctionBehavior(\n name: string,\n fn: t.Function,\n handlers: Map<string, t.Function>,\n seen = new Set<string>(),\n): FunctionBehavior {\n if (seen.has(name)) {\n return {\n appilotsInferred: { expectedOutcome: 'none' },\n destructive: false,\n nativeConfirmationExpected: false,\n };\n }\n seen.add(name);\n\n let hasAwait = fn.async === true;\n let hasThen = false;\n let hasStateSetter = false;\n let nativeConfirmationExpected = false;\n let targetScreen: string | undefined;\n let successSignal: SignalDescriptor | undefined;\n let failureSignal: SignalDescriptor | undefined;\n let opensModal: string | undefined;\n let destructive = DESTRUCTIVE_VERB.test(name);\n const loadingStateBindings = new Set<string>();\n\n const inspectCall = (node: t.CallExpression) => {\n if (t.isMemberExpression(node.callee) && t.isIdentifier(node.callee.property)) {\n const method = node.callee.property.name;\n if (method === 'then' || method === 'catch' || method === 'finally') hasThen = true;\n if (\n t.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n ['navigate', 'push', 'replace'].includes(method)\n ) {\n const firstArg = node.arguments[0];\n if (t.isStringLiteral(firstArg)) {\n targetScreen = firstArg.value;\n successSignal = { type: 'navigation', target: firstArg.value };\n }\n }\n if (\n t.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n method === 'goBack'\n ) {\n successSignal = { type: 'goBack', description: 'Action returns to the previous screen' };\n }\n if (t.isIdentifier(node.callee.object) && node.callee.object.name === 'Alert' && method === 'alert') {\n nativeConfirmationExpected = true;\n }\n if (\n t.isIdentifier(node.callee.object) &&\n /(toast|notification|snackbar)/i.test(node.callee.object.name)\n ) {\n const firstArg = node.arguments[0];\n const secondArg = node.arguments[1];\n const text = t.isStringLiteral(secondArg)\n ? secondArg.value\n : t.isStringLiteral(firstArg)\n ? firstArg.value\n : undefined;\n const signal: SignalDescriptor = { type: 'toast', description: text };\n if (/(error|danger|fail)/i.test(method) || (t.isStringLiteral(firstArg) && /error/i.test(firstArg.value))) {\n failureSignal = signal;\n } else {\n successSignal = successSignal ?? signal;\n }\n }\n }\n\n if (t.isIdentifier(node.callee)) {\n const calleeName = node.callee.name;\n if (/^set[A-Z]/.test(calleeName)) {\n hasStateSetter = true;\n const stateName = setterToStateName(calleeName);\n const firstArg = node.arguments[0];\n if (stateName && t.isBooleanLiteral(firstArg)) {\n if (/loading|submitting|saving|fetching|refreshing/i.test(stateName)) {\n loadingStateBindings.add(stateName);\n }\n if (firstArg.value === true && !/loading|submitting|saving|fetching|refreshing/i.test(stateName)) {\n opensModal = opensModal ?? stateName;\n }\n }\n }\n if (DESTRUCTIVE_VERB.test(calleeName)) destructive = true;\n\n const nested = handlers.get(calleeName);\n if (nested) {\n const nestedInfo = analyzeFunctionBehavior(calleeName, nested, handlers, seen);\n hasAwait = hasAwait || nestedInfo.appilotsInferred.isAsyncTrigger === true;\n nativeConfirmationExpected ||= nestedInfo.nativeConfirmationExpected;\n destructive ||= nestedInfo.destructive;\n targetScreen = targetScreen ?? nestedInfo.targetScreen;\n successSignal = successSignal ?? nestedInfo.successSignal;\n failureSignal = failureSignal ?? nestedInfo.failureSignal;\n opensModal = opensModal ?? nestedInfo.opensModal;\n for (const binding of nestedInfo.loadingStateBindings ?? []) {\n loadingStateBindings.add(binding);\n }\n }\n }\n };\n\n const inspectNode = (node: t.Node) => {\n if (t.isAwaitExpression(node)) hasAwait = true;\n if (t.isCallExpression(node)) inspectCall(node);\n if (t.isMemberExpression(node) && t.isIdentifier(node.property) && DESTRUCTIVE_VERB.test(node.property.name)) {\n destructive = true;\n }\n };\n\n if (fn.body) {\n traverse(fn.body as any, {\n noScope: true,\n enter: (nodePath: any) => inspectNode(nodePath.node),\n } as any);\n }\n\n const expectedOutcome: AppilotsInferredAction['expectedOutcome'] = targetScreen\n ? 'navigation'\n : successSignal?.type === 'goBack'\n ? 'navigation'\n : hasStateSetter || successSignal?.type === 'toast' || opensModal\n ? 'inline-feedback'\n : hasAwait || hasThen\n ? 'mixed'\n : 'none';\n\n return {\n appilotsInferred: {\n isAsyncTrigger: hasAwait || hasThen || undefined,\n expectedOutcome,\n ...(loadingStateBindings.size > 0\n ? { loadingStateBindings: Array.from(loadingStateBindings).sort() }\n : {}),\n },\n destructive,\n nativeConfirmationExpected,\n targetScreen,\n successSignal,\n failureSignal,\n opensModal,\n loadingStateBindings: Array.from(loadingStateBindings).sort(),\n };\n}\n\nfunction setterToStateName(setterName: string): string | undefined {\n const raw = setterName.replace(/^set/, '');\n if (!raw) return undefined;\n return raw.charAt(0).toLowerCase() + raw.slice(1);\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nexport interface NavigationCall {\n method: 'navigate' | 'push' | 'replace' | 'goBack';\n targetScreen?: string;\n params?: Record<string, string>;\n}\n\nexport function extractNavigationCalls(ast: t.File | t.Node): NavigationCall[] {\n const calls: NavigationCall[] = [];\n traverse(ast as any, {\n noScope: !t.isFile(ast),\n CallExpression: (nodePath: any) => {\n const node = nodePath.node as t.CallExpression;\n if (\n !t.isMemberExpression(node.callee) ||\n !t.isIdentifier(node.callee.object) ||\n node.callee.object.name !== 'navigation' ||\n !t.isIdentifier(node.callee.property)\n ) {\n return;\n }\n const method = node.callee.property.name;\n if (!['navigate', 'push', 'replace', 'goBack'].includes(method)) return;\n const firstArg = node.arguments[0];\n const targetScreen = t.isStringLiteral(firstArg) ? firstArg.value : undefined;\n calls.push({\n method: method as NavigationCall['method'],\n ...(targetScreen ? { targetScreen } : {}),\n params: extractNavigationParams(node.arguments[1]),\n });\n },\n } as any);\n return calls;\n}\n\nexport function extractNavigationParams(arg: t.Node | undefined | null): Record<string, string> {\n const params: Record<string, string> = {};\n if (!arg || !t.isObjectExpression(arg)) return params;\n for (const prop of arg.properties) {\n if (!t.isObjectProperty(prop)) continue;\n const key = t.isIdentifier(prop.key)\n ? prop.key.name\n : t.isStringLiteral(prop.key)\n ? prop.key.value\n : undefined;\n if (!key) continue;\n if (\n t.isMemberExpression(prop.value) &&\n t.isIdentifier(prop.value.object) &&\n t.isIdentifier(prop.value.property)\n ) {\n params[key] = `${prop.value.object.name}.${prop.value.property.name}`;\n } else if (t.isIdentifier(prop.value)) {\n params[key] = prop.value.name;\n } else if (t.isStringLiteral(prop.value)) {\n params[key] = prop.value.value;\n }\n }\n return params;\n}\n","import type { ScreenPermissionDescriptor } from '../../types';\n\nexport function extractPermissionsFromJsDoc(\n source: string,\n): ScreenPermissionDescriptor | undefined {\n if (!source.includes('@appilots-')) return undefined;\n\n const result: ScreenPermissionDescriptor = {};\n let touched = false;\n\n const permRe = /@appilots-permissions\\s+([^\\n]+)/g;\n let m: RegExpExecArray | null;\n while ((m = permRe.exec(source))) {\n const rawLine = (m[1] ?? '').replace(/\\*\\/?\\s*$/, '').trim();\n const parsed = parsePermissionLine(rawLine);\n if (parsed) {\n Object.assign(result, parsed);\n touched = true;\n break;\n }\n }\n\n if (/@appilots-pii\\b/.test(source)) {\n result.isPii = true;\n touched = true;\n }\n\n const blockedRe = /@appilots-blocked-actions\\s+([^\\n]+)/;\n const blockedMatch = blockedRe.exec(source);\n if (blockedMatch && blockedMatch[1]) {\n const ids = blockedMatch[1]\n .replace(/\\*\\/?\\s*$/, '')\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n if (ids.length > 0) {\n result.blockedActions = ids;\n touched = true;\n }\n }\n\n return touched ? result : undefined;\n}\n\nexport function extractDestructiveJsDocTargets(\n source: string,\n): Set<string> | '*' | undefined {\n if (!/@appilots-destructive\\b/.test(source)) return undefined;\n\n const out = new Set<string>();\n const re = /@appilots-destructive\\s*([^\\n]*)/g;\n let bareSeen = false;\n let m: RegExpExecArray | null;\n while ((m = re.exec(source))) {\n const rest = (m[1] ?? '').replace(/\\*\\/?\\s*$/, '').trim();\n if (!rest) {\n bareSeen = true;\n continue;\n }\n for (const id of rest.split(/[,\\s]+/).map((s) => s.trim()).filter(Boolean)) {\n out.add(id);\n }\n }\n\n if (out.size === 0) return bareSeen ? '*' : undefined;\n return out;\n}\n\nfunction parsePermissionLine(line: string): ScreenPermissionDescriptor | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('{')) {\n const candidate = trimmed.replace(/'/g, '\"');\n try {\n const obj = JSON.parse(candidate);\n if (obj && typeof obj === 'object') {\n return sanitisePermissionsObject(obj as Record<string, unknown>);\n }\n } catch {\n // Fall through to key=value parsing.\n }\n }\n\n const out: Record<string, unknown> = {};\n for (const pair of trimmed.split(/[,\\s]+/)) {\n const [k, v] = pair.split('=');\n if (!k || v === undefined) continue;\n const key = k.trim();\n const value = v.trim().replace(/^['\"]|['\"]$/g, '');\n if (value === 'true') out[key] = true;\n else if (value === 'false') out[key] = false;\n else out[key] = value;\n }\n return Object.keys(out).length > 0 ? sanitisePermissionsObject(out) : null;\n}\n\nfunction sanitisePermissionsObject(\n obj: Record<string, unknown>,\n): ScreenPermissionDescriptor {\n const out: ScreenPermissionDescriptor = {};\n if (\n typeof obj.agentAccess === 'string' &&\n (obj.agentAccess === 'read' || obj.agentAccess === 'write' || obj.agentAccess === 'none')\n ) {\n out.agentAccess = obj.agentAccess;\n }\n if (typeof obj.requiresConfirmation === 'boolean') {\n out.requiresConfirmation = obj.requiresConfirmation;\n }\n if (typeof obj.isPii === 'boolean') {\n out.isPii = obj.isPii;\n }\n if (Array.isArray(obj.blockedActions)) {\n const ids = obj.blockedActions.filter((x): x is string => typeof x === 'string' && !!x);\n if (ids.length > 0) out.blockedActions = ids;\n }\n return out;\n}\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport glob from 'fast-glob';\nimport * as parser from '@babel/parser';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport type {\n AnalyzerConfig,\n NavigationGraph,\n NavigationNode,\n NavigatorDescriptor,\n ParamDescriptor,\n} from '../types';\n\ninterface ParsedNavigator {\n name: string;\n type: 'stack' | 'tab' | 'drawer';\n screens: ParsedScreen[];\n initialRouteName?: string;\n parentNavigator?: string;\n}\n\ninterface ParsedScreen {\n name: string;\n navigatorName: string;\n navigatorType: 'stack' | 'tab' | 'drawer';\n params?: ParamDescriptor[];\n parentNavigator?: string;\n}\n\ninterface TypeExport {\n name: string;\n type: 'stack' | 'tab' | 'drawer';\n paramEntries: Map<string, ParamDescriptor[]>;\n}\n\n/**\n * Analyzes React Navigation configuration to build a navigation graph.\n */\nexport class NavigationAnalyzer {\n private config: AnalyzerConfig;\n /** Extra glob patterns for navigation file discovery (added to defaults) */\n private navigationInclude: string[];\n /** Extra glob patterns to exclude from navigation analysis */\n private navigationExclude: string[];\n\n constructor(\n config: AnalyzerConfig,\n options?: { navigationInclude?: string[]; navigationExclude?: string[] },\n ) {\n this.config = config;\n this.navigationInclude = options?.navigationInclude ?? [];\n this.navigationExclude = options?.navigationExclude ?? [];\n }\n\n /** Build the full navigation graph */\n async analyze(): Promise<NavigationGraph> {\n const navigationFiles = await this.findNavigationFiles();\n const parsedNavigators: ParsedNavigator[] = [];\n const typeExports: TypeExport[] = [];\n\n // Parse all navigation files\n for (const filePath of navigationFiles) {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const navigators = this.parseNavigators(content, filePath);\n const types = this.parseParamTypes(content, filePath);\n\n parsedNavigators.push(...navigators);\n typeExports.push(...types);\n } catch (error) {\n console.warn(`Failed to parse ${filePath}:`, error);\n }\n }\n\n // Match type exports to navigators\n this.attachParamsToNavigators(parsedNavigators, typeExports);\n\n // Build the navigation graph\n return this.buildNavigationGraph(parsedNavigators);\n }\n\n /** Find all navigation-related files */\n private async findNavigationFiles(): Promise<string[]> {\n const patterns = [\n '**/navigation/**/*.{ts,tsx}',\n '**/navigator*.{ts,tsx}',\n '**/routes*.{ts,tsx}',\n // §5: Add user-configured navigation patterns (additive, not replacing)\n ...this.navigationInclude,\n ];\n\n const excludePatterns = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n ...(this.config.exclude || []),\n // §5: Add user-configured navigation excludes\n ...this.navigationExclude,\n ];\n\n const files = await glob(patterns, {\n cwd: this.config.rootDir,\n ignore: excludePatterns,\n });\n\n return files.map((file) => path.join(this.config.rootDir, file));\n }\n\n /** Parse navigator definitions from a file */\n private parseNavigators(content: string, filePath: string): ParsedNavigator[] {\n const navigators: ParsedNavigator[] = [];\n\n try {\n const ast = parser.parse(content, {\n sourceType: 'module',\n plugins: [\n 'jsx',\n 'typescript',\n ...((this.config.parserPlugins || []) as parser.ParserPlugin[]),\n ] as parser.ParserPlugin[],\n });\n\n const navigatorCalls: Map<string, ParsedNavigator> = new Map();\n const screensByNavigator: Map<string, ParsedScreen[]> = new Map();\n\n traverse(ast, {\n // Detect createStackNavigator / createTabNavigator / createDrawerNavigator calls\n CallExpression: (nodePath) => {\n const { node } = nodePath;\n const callee = node.callee;\n\n let navigatorType: 'stack' | 'tab' | 'drawer' | null = null;\n\n if (t.isIdentifier(callee) && callee.name === 'createNativeStackNavigator') {\n navigatorType = 'stack';\n } else if (t.isIdentifier(callee) && callee.name === 'createStackNavigator') {\n navigatorType = 'stack';\n } else if (t.isIdentifier(callee) && callee.name === 'createBottomTabNavigator') {\n navigatorType = 'tab';\n } else if (t.isIdentifier(callee) && callee.name === 'createTabNavigator') {\n navigatorType = 'tab';\n } else if (t.isIdentifier(callee) && callee.name === 'createDrawerNavigator') {\n navigatorType = 'drawer';\n }\n\n if (navigatorType) {\n // Extract variable assignment\n const parent = nodePath.parent;\n if (t.isVariableDeclarator(parent) && t.isIdentifier(parent.id)) {\n const varName = parent.id.name;\n navigatorCalls.set(varName, {\n name: varName,\n type: navigatorType,\n screens: [],\n });\n }\n }\n },\n\n // Detect Stack.Navigator / Tab.Navigator JSX elements\n JSXElement: (nodePath) => {\n const { node } = nodePath;\n const openingElement = node.openingElement;\n\n if (\n t.isJSXMemberExpression(openingElement.name) &&\n t.isJSXIdentifier(openingElement.name.object)\n ) {\n const objectName = openingElement.name.object.name;\n const propertyName = t.isJSXIdentifier(openingElement.name.property)\n ? openingElement.name.property.name\n : null;\n\n if (propertyName === 'Navigator') {\n const navigator = navigatorCalls.get(objectName);\n if (navigator) {\n // Extract initialRouteName\n const initialRouteAttr = openingElement.attributes.find(\n (attr) =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === 'initialRouteName',\n );\n\n if (\n t.isJSXAttribute(initialRouteAttr) &&\n t.isStringLiteral(initialRouteAttr.value)\n ) {\n navigator.initialRouteName = initialRouteAttr.value.value;\n }\n\n // Extract screens from children\n const screens = this.extractScreensFromNavigator(node, objectName, navigator.type);\n screensByNavigator.set(objectName, screens);\n }\n }\n }\n },\n });\n\n // Build final navigator list with screens\n navigatorCalls.forEach((navigator) => {\n const screens = screensByNavigator.get(navigator.name) || [];\n navigator.screens = screens;\n navigators.push(navigator);\n });\n } catch (error) {\n console.warn(`Failed to parse navigators in ${filePath}:`, error);\n }\n\n return navigators;\n }\n\n /**\n * Is this JSX element `<navigatorVarName.MEMBER …>`?\n */\n // Deliberately NOT a type predicate (`node is t.JSXElement`): a false\n // result would then narrow `node` to \"not a JSXElement\", and the very\n // next check — the same node against a different member — would see\n // `never`. It is a question about the member name, not about the node\n // kind.\n private isNavigatorMember(node: t.Node, navigatorVarName: string, member: string): boolean {\n if (!t.isJSXElement(node)) return false;\n const name = node.openingElement.name;\n return (\n t.isJSXMemberExpression(name) &&\n t.isJSXIdentifier(name.object) &&\n name.object.name === navigatorVarName &&\n t.isJSXIdentifier(name.property) &&\n name.property.name === member\n );\n }\n\n /**\n * Flatten a navigator's JSX children into the `<X.Screen>` elements they\n * contain, unwrapping every container a real app puts in between.\n *\n * The old version compared `t.isJSXElement(child)` against the direct\n * children only. A ternary is a `JSXExpressionContainer`, so an\n * auth-gated root — the modal shape of a commercial app, and the shape\n * of this repo's own `apps/example-app` — contributed ZERO screens to\n * the graph while `appilots sync` reported success (#396).\n *\n * Both branches of a conditional are collected on purpose. The graph is\n * a design-time map of what routes EXIST, not a prediction of which one\n * a given session will render; the agent needs the destination name to\n * be there whether or not the user happens to be logged in right now.\n */\n private collectScreenElements(\n children: t.Node[],\n navigatorVarName: string,\n depth = 0,\n ): t.JSXElement[] {\n // Deep enough for any real navigator; a guard against a pathological\n // or circular AST rather than a real structural limit.\n if (depth > 12) return [];\n\n const found: t.JSXElement[] = [];\n\n const visit = (node: t.Node | null | undefined): void => {\n if (!node) return;\n\n if (this.isNavigatorMember(node, navigatorVarName, 'Screen')) {\n found.push(node as t.JSXElement);\n return;\n }\n\n // `<Stack.Group screenOptions={…}>` is react-navigation's own\n // grouping primitive: a container of routes, never a route.\n if (this.isNavigatorMember(node, navigatorVarName, 'Group')) {\n const group = node as t.JSXElement;\n found.push(...this.collectScreenElements(group.children, navigatorVarName, depth + 1));\n return;\n }\n\n // A nested `<Other.Navigator>` owns its own screens — do not steal\n // them into this navigator's list.\n if (t.isJSXElement(node)) {\n const name = node.openingElement.name;\n const isForeignNavigator =\n t.isJSXMemberExpression(name) &&\n t.isJSXIdentifier(name.property) &&\n name.property.name === 'Navigator';\n if (isForeignNavigator) return;\n found.push(...this.collectScreenElements(node.children, navigatorVarName, depth + 1));\n return;\n }\n\n if (t.isJSXFragment(node)) {\n found.push(...this.collectScreenElements(node.children, navigatorVarName, depth + 1));\n return;\n }\n\n if (t.isJSXExpressionContainer(node)) {\n visit(node.expression);\n return;\n }\n\n // `cond ? <A/> : <B/>` — take the union, see the doc comment.\n if (t.isConditionalExpression(node)) {\n visit(node.consequent);\n visit(node.alternate);\n return;\n }\n\n // `flag && <A/>` and `a ?? <B/>` — the JSX lives on one side.\n if (t.isLogicalExpression(node)) {\n visit(node.left);\n visit(node.right);\n return;\n }\n\n // `{routes.map(r => <Stack.Screen … />)}` — generated routes. The\n // `name` is usually dynamic and will not resolve to a literal, which\n // extractAttributeValue already handles by returning null.\n if (t.isCallExpression(node)) {\n for (const arg of node.arguments) {\n if (t.isArrowFunctionExpression(arg) || t.isFunctionExpression(arg)) {\n if (t.isBlockStatement(arg.body)) {\n for (const stmt of arg.body.body) {\n if (t.isReturnStatement(stmt)) visit(stmt.argument);\n }\n } else {\n visit(arg.body);\n }\n }\n }\n return;\n }\n\n if (t.isArrayExpression(node)) {\n for (const el of node.elements) visit(el);\n return;\n }\n\n // Parenthesised / type-asserted JSX.\n if (t.isTSAsExpression(node) || t.isTSNonNullExpression(node)) {\n visit(node.expression);\n }\n };\n\n for (const child of children) visit(child);\n return found;\n }\n\n /** Extract screens from a navigator JSX element */\n private extractScreensFromNavigator(\n navigatorElement: t.JSXElement,\n navigatorVarName: string,\n navigatorType: 'stack' | 'tab' | 'drawer',\n ): ParsedScreen[] {\n const screens: ParsedScreen[] = [];\n if (!navigatorElement.children) return screens;\n\n // A route declared in two branches of the same conditional (the very\n // common `Auth` fallback) is ONE route, not two.\n const seen = new Set<string>();\n\n for (const element of this.collectScreenElements(navigatorElement.children, navigatorVarName)) {\n const screenName = this.extractAttributeValue(element.openingElement.attributes, 'name');\n if (!screenName || seen.has(screenName)) continue;\n seen.add(screenName);\n screens.push({\n name: screenName,\n navigatorName: navigatorVarName,\n navigatorType,\n });\n }\n\n return screens;\n }\n\n /** Extract string attribute value from JSX attributes */\n private extractAttributeValue(\n attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[],\n attrName: string,\n ): string | null {\n const attr = attributes.find(\n (a) => t.isJSXAttribute(a) && t.isJSXIdentifier(a.name) && a.name.name === attrName,\n );\n\n if (t.isJSXAttribute(attr) && t.isStringLiteral(attr.value)) {\n return attr.value.value;\n }\n\n return null;\n }\n\n /** Parse TypeScript type exports (ParamList types) */\n private parseParamTypes(content: string, filePath: string): TypeExport[] {\n const types: TypeExport[] = [];\n\n try {\n const ast = parser.parse(content, {\n sourceType: 'module',\n plugins: [\n 'jsx',\n 'typescript',\n ...((this.config.parserPlugins || []) as parser.ParserPlugin[]),\n ] as parser.ParserPlugin[],\n });\n\n traverse(ast, {\n TSTypeAliasDeclaration: (nodePath) => {\n const { node } = nodePath;\n const typeName = node.id.name;\n\n // Match React Navigation param-list aliases such as\n // RootStackParamList, MainTabParamList, SettingsDrawerParamList,\n // or a project-specific FooParamList.\n const typeMatch = /^[A-Za-z0-9_]*(Stack|Tab|Drawer)?ParamList$/i.test(typeName);\n\n if (typeMatch && node.typeAnnotation?.type === 'TSTypeLiteral') {\n const paramEntries = this.extractParamListEntries(\n node.typeAnnotation as t.TSTypeLiteral,\n typeName,\n );\n\n const navType = this.inferTypeFromName(typeName);\n if (navType) {\n types.push({\n name: typeName,\n type: navType.type,\n paramEntries,\n });\n }\n }\n },\n });\n } catch (error) {\n console.warn(`Failed to parse types in ${filePath}:`, error);\n }\n\n return types;\n }\n\n /** Extract param entries from a TypeScript type literal */\n private extractParamListEntries(\n typeLiteral: t.TSTypeLiteral,\n typeName: string,\n ): Map<string, ParamDescriptor[]> {\n const entries = new Map<string, ParamDescriptor[]>();\n\n for (const member of typeLiteral.members) {\n if (member.type === 'TSPropertySignature' && member.key) {\n const keyName = member.key.type === 'Identifier' ? member.key.name : null;\n\n if (keyName && member.typeAnnotation) {\n const params = this.extractParamsFromType(member.typeAnnotation.typeAnnotation);\n entries.set(keyName, params);\n }\n }\n }\n\n return entries;\n }\n\n /** Extract param descriptors from a TypeScript type */\n private extractParamsFromType(typeAnnotation: t.TypeAnnotation | t.TSType): ParamDescriptor[] {\n const params: ParamDescriptor[] = [];\n\n if (typeAnnotation.type === 'TSUndefinedKeyword' || typeAnnotation.type === 'TSNullKeyword') {\n return params;\n }\n\n if (typeAnnotation.type === 'TSTypeLiteral') {\n const typeLiteral = typeAnnotation as t.TSTypeLiteral;\n for (const member of typeLiteral.members) {\n if (member.type === 'TSPropertySignature' && member.key) {\n const keyName = member.key.type === 'Identifier' ? member.key.name : null;\n\n if (keyName) {\n const typeStr = member.typeAnnotation\n ? this.typeToString(member.typeAnnotation.typeAnnotation)\n : 'unknown';\n const required = !member.optional;\n\n params.push({\n name: keyName,\n type: typeStr,\n required,\n });\n }\n }\n }\n }\n\n return params;\n }\n\n /** Convert TypeScript type annotation to string */\n private typeToString(type: t.TypeAnnotation | t.TSType): string {\n if (type.type === 'TSStringKeyword') return 'string';\n if (type.type === 'TSNumberKeyword') return 'number';\n if (type.type === 'TSBooleanKeyword') return 'boolean';\n if (type.type === 'TSUndefinedKeyword') return 'undefined';\n if (type.type === 'TSNullKeyword') return 'null';\n\n if (type.type === 'TSUnionType') {\n return (type as t.TSUnionType).types.map((t) => this.typeToString(t)).join(' | ');\n }\n\n if (type.type === 'TSTypeLiteral') {\n return 'object';\n }\n\n if (type.type === 'TSTypeReference' && (type as t.TSTypeReference).typeName) {\n const name = (type as t.TSTypeReference).typeName;\n return name.type === 'Identifier' ? name.name : 'unknown';\n }\n\n return 'unknown';\n }\n\n /** Infer navigator type from type name */\n private inferTypeFromName(typeName: string): { type: 'stack' | 'tab' | 'drawer' } | null {\n if (/stack/i.test(typeName)) return { type: 'stack' };\n if (/tab/i.test(typeName)) return { type: 'tab' };\n if (/drawer/i.test(typeName)) return { type: 'drawer' };\n return null;\n }\n\n /** Attach parsed type params to navigator screens */\n private attachParamsToNavigators(navigators: ParsedNavigator[], types: TypeExport[]): void {\n for (const navigator of navigators) {\n // Try to find a matching type export\n const matchingType = types.find((t) => t.type === navigator.type);\n\n if (matchingType) {\n for (const screen of navigator.screens) {\n const screenParams = matchingType.paramEntries.get(screen.name);\n if (screenParams) {\n screen.params = screenParams;\n }\n }\n }\n }\n }\n\n /** Build the complete navigation graph */\n private buildNavigationGraph(parsedNavigators: ParsedNavigator[]): NavigationGraph {\n const screens: Record<string, NavigationNode> = {};\n const navigators: NavigatorDescriptor[] = [];\n let initialScreen = '';\n\n // First pass: create navigator descriptors and identify root navigator\n for (const navigator of parsedNavigators) {\n const screenNames = navigator.screens.map((s) => s.name);\n\n // A declared navigator that yielded no routes is a parse miss, not\n // an empty navigator — nobody ships `<Stack.Navigator>` with nothing\n // in it. This is the signal that would have surfaced #396 years\n // earlier: the root navigator of this repo's own example app sat at\n // zero screens while its siblings had six, and every assertion in\n // the suite was `length > 0` over the TOTAL, so it stayed green.\n if (screenNames.length === 0) {\n console.warn(\n `[MCPGenerator] navigator \"${navigator.name}\" (${navigator.type}) declared ` +\n `no reachable screens. Its routes will be missing from the app map, so the ` +\n `agent will have no destination name for them. If the screens are there in ` +\n `the source, this is a parser gap — please report it with the file.`,\n );\n }\n\n navigators.push({\n name: navigator.name,\n type: navigator.type,\n screens: screenNames,\n parentNavigator: navigator.parentNavigator,\n });\n\n // Root navigator is likely the one that contains 'Auth' or 'Main' screens\n // or the first navigator with an initialRouteName\n if (\n !initialScreen &&\n navigator.initialRouteName &&\n (navigator.name.includes('Root') || screenNames.some((s) => s === 'Auth' || s === 'Main'))\n ) {\n initialScreen = navigator.initialRouteName;\n }\n }\n\n // Second pass: create navigation nodes with reachability\n for (const navigator of parsedNavigators) {\n for (const screen of navigator.screens) {\n const screenKey = screen.name;\n\n // Calculate reachable screens\n const reachableTo: string[] = [];\n const reachableFrom: string[] = [];\n\n // For screens in the same navigator\n for (const otherScreen of navigator.screens) {\n if (otherScreen.name !== screen.name) {\n if (navigator.type === 'tab') {\n // Tab screens can reach all other screens in the same tab\n reachableTo.push(otherScreen.name);\n reachableFrom.push(otherScreen.name);\n } else {\n // Stack screens can reach other screens via navigation\n reachableTo.push(otherScreen.name);\n }\n }\n }\n\n screens[screenKey] = {\n screenName: screen.name,\n navigatorType: navigator.type,\n parentNavigator: navigator.name,\n reachableFrom,\n reachableTo,\n params: screen.params,\n };\n }\n }\n\n // If no initial screen identified, use the first screen from the root navigator\n if (!initialScreen && parsedNavigators.length > 0) {\n const firstNavigator = parsedNavigators[0];\n const rootNavigator = parsedNavigators.find(\n (n) => n.name.includes('Root') || (firstNavigator && n.name === firstNavigator.name),\n );\n if (rootNavigator && rootNavigator.screens && rootNavigator.screens.length > 0) {\n const firstScreen = rootNavigator.screens[0];\n initialScreen = firstScreen?.name || '';\n }\n }\n\n return {\n screens,\n initialScreen,\n navigators,\n };\n }\n}\n","import type { AnalyzerConfig, ComponentDescriptor } from '../types';\nimport { readFileSync } from 'fs';\nimport * as parser from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\n/**\n * Analyzes React Native components to extract their semantic meaning,\n * props, and interaction points.\n */\nexport class ComponentAnalyzer {\n private config: AnalyzerConfig;\n\n constructor(config: AnalyzerConfig) {\n this.config = config;\n }\n\n /** Analyze components in a file */\n async analyzeFile(filePath: string): Promise<ComponentDescriptor[]> {\n try {\n const code = readFileSync(filePath, 'utf-8');\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', ['decorators', { decoratorsBeforeExport: true }]],\n });\n\n const components: ComponentDescriptor[] = [];\n\n traverse(ast, {\n JSXElement: (path) => {\n const component = this.extractComponentFromJSXElement(path.node);\n if (component) {\n components.push(component);\n }\n },\n });\n\n return components;\n } catch (error) {\n console.error(`Failed to analyze file ${filePath}:`, error);\n return [];\n }\n }\n\n private extractComponentFromJSXElement(\n element: t.JSXElement\n ): ComponentDescriptor | null {\n const elementName = this.getElementName(element.openingElement);\n if (!elementName) return null;\n\n const type = this.determineComponentType(elementName);\n const props = this.extractProps(element.openingElement);\n const { testID, accessibilityLabel } = this.extractAccessibilityProps(element.openingElement);\n const children = this.extractChildren(element.children);\n\n return {\n name: elementName,\n type,\n props: Object.keys(props).length > 0 ? props : undefined,\n children: children.length > 0 ? children : undefined,\n testID,\n accessibilityLabel,\n };\n }\n\n private getElementName(openingElement: t.JSXOpeningElement): string | null {\n if (t.isJSXIdentifier(openingElement.name)) {\n return openingElement.name.name;\n }\n if (t.isJSXMemberExpression(openingElement.name)) {\n const parts: string[] = [];\n let current: t.JSXNamespacedName | t.JSXMemberExpression | t.JSXIdentifier =\n openingElement.name;\n while (t.isJSXMemberExpression(current)) {\n if (t.isJSXIdentifier(current.property)) {\n parts.unshift(current.property.name);\n }\n current = current.object as t.JSXNamespacedName | t.JSXMemberExpression | t.JSXIdentifier;\n }\n if (t.isJSXIdentifier(current)) {\n parts.unshift(current.name);\n }\n return parts.join('.');\n }\n return null;\n }\n\n private determineComponentType(\n name: string\n ): 'view' | 'input' | 'button' | 'list' | 'modal' | 'custom' {\n const viewComponents = ['View', 'ScrollView', 'SafeAreaView', 'KeyboardAvoidingView'];\n const inputComponents = ['TextInput', 'Input'];\n const buttonComponents = ['TouchableOpacity', 'Pressable', 'Button'];\n const listComponents = ['FlatList', 'SectionList'];\n const modalComponents = ['Modal', 'BottomSheet'];\n\n if (viewComponents.includes(name)) return 'view';\n if (inputComponents.includes(name)) return 'input';\n if (buttonComponents.includes(name)) return 'button';\n if (listComponents.includes(name)) return 'list';\n if (modalComponents.includes(name)) return 'modal';\n\n return 'custom';\n }\n\n private extractProps(openingElement: t.JSXOpeningElement): Record<string, string> {\n const props: Record<string, string> = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if (attr.value === null) {\n // Boolean prop\n props[propName] = 'true';\n } else if (t.isStringLiteral(attr.value)) {\n props[propName] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n props[propName] = attr.value.expression.value;\n }\n }\n }\n\n return props;\n }\n\n private extractAccessibilityProps(openingElement: t.JSXOpeningElement): {\n testID?: string;\n accessibilityLabel?: string;\n } {\n const result: { testID?: string; accessibilityLabel?: string } = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if ((propName === 'testID' || propName === 'accessibilityLabel') && attr.value) {\n if (t.isStringLiteral(attr.value)) {\n result[propName as keyof typeof result] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n result[propName as keyof typeof result] = attr.value.expression.value;\n }\n }\n }\n }\n\n return result;\n }\n\n private extractChildren(\n children: Array<t.JSXElement[\"children\"][number]>,\n depth: number = 0,\n maxDepth: number = 3\n ): ComponentDescriptor[] {\n if (depth >= maxDepth) return [];\n\n const extracted: ComponentDescriptor[] = [];\n\n for (const child of children) {\n if (t.isJSXElement(child)) {\n const component = this.extractComponentFromJSXElement(child);\n if (component) {\n extracted.push(component);\n }\n }\n }\n\n return extracted;\n }\n}\n","import type { AnalyzerConfig, FormDescriptor, FormFieldDescriptor } from '../types';\nimport { readFileSync } from 'fs';\nimport * as parser from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport * as t from '@babel/types';\nimport * as path from 'path';\n\n/**\n * Analyzes form structures in React Native screens, extracting\n * field definitions, validation rules, and submit actions.\n */\nexport class FormAnalyzer {\n private config: AnalyzerConfig;\n private stateVariables: Map<string, { varName: string; type: string }> = new Map();\n private inputElements: Array<{\n varName: string;\n appilotsId?: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n }> = [];\n private submitButtons: Array<{ label?: string; handler?: string }> = [];\n\n constructor(config: AnalyzerConfig) {\n this.config = config;\n }\n\n /** Analyze forms in a file */\n async analyzeFile(filePath: string): Promise<FormDescriptor[]> {\n try {\n const code = readFileSync(filePath, 'utf-8');\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', ['decorators', { decoratorsBeforeExport: true }]],\n });\n\n this.stateVariables.clear();\n this.inputElements = [];\n this.submitButtons = [];\n\n // First pass: extract state variables\n traverse(ast, {\n CallExpression: (path) => {\n this.extractStateVariables(path.node);\n },\n });\n\n // Second pass: extract input elements and buttons\n traverse(ast, {\n JSXElement: (path) => {\n this.extractFormElements(path.node);\n },\n });\n\n // Third pass: extract validation rules\n const validationRules = this.extractValidationRules(ast);\n\n // Build forms from extracted data\n return this.buildForms(filePath, validationRules);\n } catch (error) {\n console.error(`Failed to analyze forms in file ${filePath}:`, error);\n return [];\n }\n }\n\n private extractStateVariables(node: t.CallExpression): void {\n if (\n t.isIdentifier(node.callee) &&\n node.callee.name === 'useState' &&\n node.arguments.length > 0\n ) {\n // Try to find the assignment: const [varName, setVarName] = useState(...)\n // This is found in VariableDeclarator context\n return;\n }\n }\n\n private extractFormElements(element: t.JSXElement): void {\n const elementName = this.getElementName(element.openingElement);\n\n if (!elementName) return;\n\n // Detect input elements\n if (elementName === 'TextInput' || elementName === 'Input') {\n const inputInfo = this.extractInputInfo(element.openingElement);\n this.inputElements.push(inputInfo);\n }\n\n // Detect submit buttons (TouchableOpacity, Pressable, Button with onPress at end)\n if (['TouchableOpacity', 'Pressable', 'Button'].includes(elementName)) {\n const buttonInfo = this.extractButtonInfo(element.openingElement);\n if (buttonInfo) {\n this.submitButtons.push(buttonInfo);\n }\n }\n }\n\n private extractInputInfo(\n openingElement: t.JSXOpeningElement\n ): {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n } {\n const info: {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n } = { varName: '' };\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n const propValue = this.extractAttributeValue(attr.value);\n\n switch (propName) {\n case 'label':\n info.label = propValue;\n break;\n case 'placeholder':\n info.placeholder = propValue;\n break;\n case 'keyboardType':\n info.keyboardType = propValue;\n break;\n case 'testID':\n info.testID = propValue;\n break;\n case 'appilotsId':\n info.appilotsId = propValue;\n if (propValue) info.varName = propValue;\n break;\n case 'value':\n // Try to extract variable name from value binding\n if (attr.value && t.isJSXExpressionContainer(attr.value) && t.isIdentifier(attr.value.expression)) {\n info.varName = attr.value.expression.name;\n }\n break;\n }\n }\n }\n\n return info;\n }\n\n private extractButtonInfo(\n openingElement: t.JSXOpeningElement\n ): { label?: string; handler?: string } | null {\n const info: { label?: string; handler?: string } = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if (propName === 'title' || propName === 'label') {\n info.label = this.extractAttributeValue(attr.value);\n }\n\n if (propName === 'onPress') {\n if (attr.value && t.isJSXExpressionContainer(attr.value)) {\n if (t.isIdentifier(attr.value.expression)) {\n info.handler = attr.value.expression.name;\n } else if (t.isArrowFunctionExpression(attr.value.expression) || t.isFunctionExpression(attr.value.expression)) {\n info.handler = 'anonymous';\n }\n }\n }\n }\n }\n\n return Object.keys(info).length > 0 ? info : null;\n }\n\n private extractAttributeValue(value: t.JSXAttribute['value']): string | undefined {\n if (value === null) return undefined;\n if (t.isStringLiteral(value)) return value.value;\n if (t.isJSXExpressionContainer(value) && t.isStringLiteral(value.expression)) {\n return value.expression.value;\n }\n return undefined;\n }\n\n private getElementName(openingElement: t.JSXOpeningElement): string | null {\n if (t.isJSXIdentifier(openingElement.name)) {\n return openingElement.name.name;\n }\n return null;\n }\n\n private extractValidationRules(ast: t.File): Record<string, string> {\n const rules: Record<string, string> = {};\n\n traverse(ast, {\n IfStatement: (path) => {\n const test = path.node.test;\n const rule = this.extractRuleFromCondition(test);\n if (rule) {\n const { field, description } = rule;\n if (field && description) {\n rules[field] = description;\n }\n }\n },\n });\n\n return rules;\n }\n\n private extractRuleFromCondition(\n test: t.Expression\n ): { field: string; description: string } | null {\n let fieldName = '';\n let description = '';\n\n // Pattern: !varName.trim() or varName.length < N\n if (t.isUnaryExpression(test) && test.operator === '!') {\n if (t.isCallExpression(test.argument)) {\n const callExpr = test.argument;\n if (t.isMemberExpression(callExpr.callee)) {\n const memberExpr = callExpr.callee;\n if (t.isIdentifier(memberExpr.object)) {\n fieldName = memberExpr.object.name;\n description = `${fieldName} is required`;\n }\n }\n } else if (t.isIdentifier(test.argument)) {\n fieldName = test.argument.name;\n description = `${fieldName} is required`;\n }\n }\n\n // Pattern: varName.length < N\n if (t.isBinaryExpression(test) && (test.operator === '<' || test.operator === '<=')) {\n if (t.isMemberExpression(test.left)) {\n const memberExpr = test.left;\n if (t.isIdentifier(memberExpr.object)) {\n fieldName = memberExpr.object.name;\n if (t.isNumericLiteral(test.right)) {\n description = `${fieldName} must be at least ${test.right.value} characters`;\n }\n }\n }\n }\n\n // Pattern: !varName.includes('@')\n if (t.isUnaryExpression(test) && test.operator === '!') {\n if (t.isCallExpression(test.argument) && t.isMemberExpression(test.argument.callee)) {\n const methodName = t.isIdentifier(test.argument.callee.property)\n ? test.argument.callee.property.name\n : null;\n if (methodName === 'includes' && t.isIdentifier(test.argument.callee.object)) {\n fieldName = test.argument.callee.object.name;\n description = `${fieldName} format is invalid`;\n }\n }\n }\n\n return fieldName && description ? { field: fieldName, description } : null;\n }\n\n private buildForms(filePath: string, validationRules: Record<string, string>): FormDescriptor[] {\n if (this.inputElements.length === 0) return [];\n\n const fileName = path.basename(filePath, path.extname(filePath));\n const formId = `${fileName}Form`.replace(/Screen$/, '').toLowerCase();\n\n const fields: FormFieldDescriptor[] = this.inputElements.map((input) => {\n const fieldType = this.inferFieldType(input);\n const required = this.isFieldRequired(input.varName, validationRules);\n\n return {\n name: input.appilotsId || input.varName || input.testID || 'field',\n label: input.label,\n type: fieldType,\n required,\n placeholder: input.placeholder,\n };\n });\n\n const lastButton = this.submitButtons[this.submitButtons.length - 1];\n const submitAction = lastButton?.handler;\n\n return [\n {\n id: formId,\n fields,\n submitAction,\n validationRules: Object.keys(validationRules).length > 0 ? validationRules : undefined,\n },\n ];\n }\n\n private inferFieldType(input: {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n }): FormFieldDescriptor['type'] {\n const lowerVarName = input.varName.toLowerCase();\n const lowerLabel = input.label?.toLowerCase() || '';\n const lowerPlaceholder = input.placeholder?.toLowerCase() || '';\n const combined = `${lowerVarName} ${lowerLabel} ${lowerPlaceholder}`;\n\n // Check keyboardType first\n if (input.keyboardType === 'email-address' || input.keyboardType === 'email') {\n return 'email';\n }\n if (input.keyboardType === 'phone-pad' || input.keyboardType === 'numeric') {\n return input.keyboardType === 'numeric' ? 'number' : 'phone';\n }\n\n // Check variable/label/placeholder names\n if (combined.includes('email')) return 'email';\n if (combined.includes('phone') || combined.includes('tel')) return 'phone';\n if (combined.includes('password')) return 'text';\n if (combined.includes('number') || combined.includes('numeric')) return 'number';\n if (combined.includes('date')) return 'date';\n if (combined.includes('toggle') || combined.includes('check')) return 'toggle';\n if (combined.includes('select') || combined.includes('choice')) return 'select';\n\n return 'text';\n }\n\n private isFieldRequired(fieldName: string, rules: Record<string, string>): boolean {\n const rule = rules[fieldName];\n return rule !== undefined && rule.includes('required');\n }\n}\n","import type { AnalyzerConfig } from '../types';\nimport type { PlatformAnalyzer, PlatformAnalyzerOptions, PlatformAnalyzerResult } from './PlatformAnalyzer';\n\n/**\n * `PlatformAnalyzer` for a platform with no source-level analyzer yet\n * (anything other than `'react-native'` — Android/Kotlin, iOS/Swift, a\n * web SPA, ...). It does zero filesystem work — no glob, no parsing — so\n * it's safe to run on a project that has no JS/TSX at all. Screens for\n * these platforms come entirely from the declared manifest\n * (`appilots.manifest.json`); `MCPGenerator` merges the manifest on top\n * of whatever this analyzer returns (nothing).\n *\n * This keeps the manifest-only integration path (deliverable §2) fully\n * decoupled from `react-native`-specific tooling: a new platform can\n * ship its own generator days before anyone writes a real AST analyzer\n * for it.\n */\nexport class GenericPlatformAnalyzer implements PlatformAnalyzer {\n constructor(readonly platform: string) {}\n\n async analyze(\n _config: AnalyzerConfig,\n _options: PlatformAnalyzerOptions,\n ): Promise<PlatformAnalyzerResult> {\n return {\n screens: [],\n navigation: { screens: {}, initialScreen: '', navigators: [] },\n analyzedFiles: 0,\n };\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport glob from 'fast-glob';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { parseSource } from '../../ast/parse';\nimport { classifyWebJsxComponent } from '../../ast/jsx/web/classify';\nimport { getJsxElementName } from '../../ast/jsx/names';\nimport { getStringAttr, hasJsxAttribute } from '../../ast/jsx/attributes';\nimport { collectFunctions } from '../../ast/functions/collect';\nimport { analyzeFunctionBehavior, type FunctionBehavior } from '../../ast/functions/analyze-async';\nimport { extractWebNavigationCalls, staticRoutePath } from '../../ast/navigation/web-calls';\nimport {\n extractDestructiveJsDocTargets,\n extractPermissionsFromJsDoc,\n} from '../../extractors/appilots/jsdoc';\nimport type {\n ActionDescriptor,\n AnalyzerConfig,\n CollectionDescriptor,\n ComponentDescriptor,\n FormDescriptor,\n FormFieldDescriptor,\n LocatorDescriptor,\n RowActionDescriptor,\n ScreenDescriptor,\n} from '../../types';\n\n/**\n * One analyzed source file, before strict-screen filtering. The\n * orchestrator (`ReactWebPlatformAnalyzer`) decides inclusion — it also\n * knows the route table, so a file can qualify as a screen by being a\n * route component even when it matches no glob pattern.\n */\nexport interface WebScreenCandidate {\n descriptor: ScreenDescriptor;\n hasRegisterScreen: boolean;\n matchesScreenPattern: boolean;\n}\n\nexport interface WebScreenAnalysis {\n candidates: WebScreenCandidate[];\n /** Files matched by the include globs (before screen filtering). */\n analyzedFiles: number;\n}\n\n/**\n * Default glob patterns that identify screen files in a web project —\n * the RN defaults (`*Screen.tsx`, `screens/**`) don't match how web\n * apps are laid out, so the web dialect looks at the conventional\n * page/route/view directories instead.\n */\nexport const DEFAULT_WEB_SCREEN_PATTERNS = [\n '**/pages/**/*.{ts,tsx,js,jsx}',\n '**/routes/**/*.{ts,tsx,js,jsx}',\n '**/views/**/*.{ts,tsx,js,jsx}',\n '**/app/**/*.{ts,tsx,js,jsx}',\n '**/*Page.{ts,tsx,js,jsx}',\n '**/*Screen.{ts,tsx,js,jsx}',\n '**/*View.{ts,tsx,js,jsx}',\n];\n\nconst DESTRUCTIVE_VERB =\n /(delete|destroy|remove|discard|wipe|erase|drop|terminate|revoke|deactivate|disable)/i;\n\nconst LISTISH_TAGS = new Set(['ul', 'ol', 'dl', 'table', 'tbody']);\n\n/**\n * Web (DOM/JSX) sibling of `ScreenAnalyzer`. Same output contract\n * (`ScreenDescriptor`), web-native vocabulary:\n *\n * - actions come from `onClick`/`onSubmit` (not `onPress`)\n * - locators come from `data-testid`, `id`, `name`, `aria-label`, and\n * `<label htmlFor>` association (plus `appilotsId`, shared with RN)\n * - field types come from `type=` / `inputMode=` (not `keyboardType`)\n * - navigation targets come from React Router (`useNavigate`'s\n * `navigate('/x')`, `<Link to>`, `<Navigate to>`, internal `href`s);\n * they are recorded as ROUTE PATHS here and resolved to screen names\n * by the orchestrator, which owns the route table\n */\nexport class WebScreenAnalyzer {\n private config: AnalyzerConfig;\n private verbose = process.env.VERBOSE === 'true';\n private screenPatterns: string[];\n\n constructor(config: AnalyzerConfig, options?: { screenPatterns?: string[] }) {\n this.config = config;\n this.screenPatterns = options?.screenPatterns ?? DEFAULT_WEB_SCREEN_PATTERNS;\n }\n\n async analyze(): Promise<WebScreenAnalysis> {\n const {\n include = ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n exclude = ['**/node_modules/**', '**/dist/**', '**/build/**'],\n } = this.config;\n\n // `.d.ts` files are dropped unconditionally rather than via the `exclude`\n // default above, because `exclude` is overridable by config and this is not\n // a preference: a declaration file has no JSX, no components and no\n // handlers, so it can never yield a screen — it can only inflate\n // `analyzedFiles`.\n //\n // Found through a test that counted the fixture's files and expected 6.\n // Any developer who had run `sst` locally got 7 and a failure that read\n // like a product regression: SST writes a generated, GITIGNORED\n // `sst-env.d.ts` into every directory with a package.json, including\n // test/fixtures/web-app. CI never has that file, so this only ever failed\n // on a workstation.\n const files = (await glob(include, { cwd: this.config.rootDir, ignore: exclude })).filter(\n (file) => !file.endsWith('.d.ts'),\n );\n const patternMatches = await glob(this.screenPatterns, {\n cwd: this.config.rootDir,\n ignore: exclude,\n });\n const patternSet = new Set(patternMatches.map((f) => path.resolve(this.config.rootDir, f)));\n\n const candidates: WebScreenCandidate[] = [];\n for (const file of files) {\n const filePath = path.resolve(this.config.rootDir, file);\n try {\n const candidate = await this.analyzeFile(filePath);\n if (!candidate) continue;\n candidate.matchesScreenPattern = patternSet.has(filePath);\n candidates.push(candidate);\n if (this.verbose) {\n console.log(`[WebScreenAnalyzer] ✓ Analyzed: ${candidate.descriptor.name} (${file})`);\n }\n } catch (error) {\n if (this.verbose) {\n console.warn(\n `[WebScreenAnalyzer] Failed to parse ${file}:`,\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n\n return { candidates, analyzedFiles: files.length };\n }\n\n async analyzeFile(filePath: string): Promise<WebScreenCandidate | null> {\n const source = await fs.readFile(filePath, 'utf-8');\n const ast = parseSource(source, this.config.parserPlugins as any);\n\n const registerScreenMeta = this.extractRegisterScreenMetadata(ast);\n const componentName = this.extractComponentName(ast);\n const labelsByHtmlFor = this.collectHtmlForLabels(ast);\n const handlerBehaviors = this.collectWebHandlerBehaviors(ast);\n\n const forms = this.mergeForms(\n registerScreenMeta?.forms ?? [],\n this.extractForms(ast, labelsByHtmlFor),\n );\n const actions = this.extractActions(ast, registerScreenMeta, handlerBehaviors);\n const components = this.extractComponents(ast);\n const collections = this.extractCollections(ast);\n const navigationTargets = this.extractNavigationTargets(ast);\n\n const permissionsFromJsDoc = extractPermissionsFromJsDoc(source);\n const destructiveTags = extractDestructiveJsDocTargets(source);\n if (destructiveTags) {\n for (const action of actions) {\n if (destructiveTags === '*' || destructiveTags.has(action.id)) {\n action.destructive = true;\n }\n }\n }\n\n const name =\n registerScreenMeta?.name ||\n componentName ||\n path.basename(filePath).replace(/\\.(tsx?|jsx?)$/, '');\n\n const descriptor: ScreenDescriptor = {\n name,\n filePath,\n title: registerScreenMeta?.title,\n description: registerScreenMeta?.description,\n components,\n forms,\n actions,\n navigationTargets,\n ...(collections.length > 0 ? { collections } : {}),\n ...(registerScreenMeta?.suggestedPrompts && registerScreenMeta.suggestedPrompts.length > 0\n ? { suggestedPrompts: registerScreenMeta.suggestedPrompts }\n : {}),\n ...(permissionsFromJsDoc\n ? {\n permissions: permissionsFromJsDoc,\n ...(permissionsFromJsDoc.isPii ? { isPii: true } : {}),\n }\n : {}),\n };\n\n return {\n descriptor,\n hasRegisterScreen: registerScreenMeta !== null || this.detectRegisterScreenCall(ast),\n matchesScreenPattern: false,\n };\n }\n\n // ── registerScreen ────────────────────────────────────────────────\n\n private detectRegisterScreenCall(ast: t.File): boolean {\n let found = false;\n traverse(ast, {\n CallExpression: (nodePath) => {\n if (found) return;\n if (isRegisterScreenCallee(nodePath.node.callee)) {\n found = true;\n nodePath.stop();\n }\n },\n });\n return found;\n }\n\n private extractRegisterScreenMetadata(\n ast: t.File,\n ): (Partial<ScreenDescriptor> & { name: string }) | null {\n let plain: Record<string, unknown> | null = null;\n traverse(ast, {\n CallExpression: (nodePath) => {\n if (!isRegisterScreenCallee(nodePath.node.callee)) return;\n const arg = nodePath.node.arguments[0];\n if (t.isObjectExpression(arg)) {\n plain = literalToPlain(arg) as Record<string, unknown>;\n }\n },\n });\n if (!plain) return null;\n const meta = plain as Record<string, unknown>;\n\n const result: Partial<ScreenDescriptor> & { name: string } = {\n name: typeof meta.name === 'string' ? meta.name : '',\n actions: [],\n forms: [],\n navigationTargets: [],\n components: [],\n };\n if (typeof meta.title === 'string') result.title = meta.title;\n if (typeof meta.description === 'string') result.description = meta.description;\n if (Array.isArray(meta.suggestedPrompts)) {\n const prompts = meta.suggestedPrompts\n .filter((p): p is string => typeof p === 'string')\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n if (prompts.length > 0) result.suggestedPrompts = prompts;\n }\n if (Array.isArray(meta.actions)) {\n result.actions = meta.actions\n .filter((a): a is Record<string, unknown> => typeof a === 'object' && a !== null)\n .filter((a) => typeof a.id === 'string' && a.id.length > 0)\n .map((a) => ({ type: 'custom', ...a }) as ActionDescriptor);\n }\n if (Array.isArray(meta.fields)) {\n const fields = meta.fields\n .filter((f): f is Record<string, unknown> => typeof f === 'object' && f !== null)\n .filter((f) => typeof f.id === 'string' && f.id.length > 0)\n .map(\n (f) =>\n ({\n name: f.id,\n type: typeof f.type === 'string' ? f.type : 'text',\n required: f.required === true,\n ...(typeof f.label === 'string' ? { label: f.label } : {}),\n ...(typeof f.placeholder === 'string' ? { placeholder: f.placeholder } : {}),\n ...(f.defaultValue !== undefined ? { defaultValue: f.defaultValue } : {}),\n ...(Array.isArray(f.options) ? { options: f.options } : {}),\n }) as FormFieldDescriptor,\n );\n if (fields.length > 0) result.forms = [{ id: 'default', fields }];\n }\n return result;\n }\n\n // ── Component name / structure ────────────────────────────────────\n\n /** Default-exported component name, else the first exported capitalized function. */\n private extractComponentName(ast: t.File): string {\n let defaultName = '';\n let firstExported = '';\n\n traverse(ast, {\n ExportDefaultDeclaration: (nodePath) => {\n const declaration = nodePath.node.declaration;\n if (t.isFunctionDeclaration(declaration) && declaration.id?.name) {\n defaultName = declaration.id.name;\n } else if (t.isIdentifier(declaration)) {\n defaultName = declaration.name;\n }\n },\n ExportNamedDeclaration: (nodePath) => {\n if (firstExported) return;\n const declaration = nodePath.node.declaration;\n if (\n t.isFunctionDeclaration(declaration) &&\n declaration.id &&\n /^[A-Z]/.test(declaration.id.name)\n ) {\n firstExported = declaration.id.name;\n } else if (t.isVariableDeclaration(declaration)) {\n for (const declarator of declaration.declarations) {\n if (\n t.isIdentifier(declarator.id) &&\n /^[A-Z]/.test(declarator.id.name) &&\n (t.isArrowFunctionExpression(declarator.init) ||\n t.isFunctionExpression(declarator.init))\n ) {\n firstExported = declarator.id.name;\n break;\n }\n }\n }\n },\n });\n\n return defaultName || firstExported;\n }\n\n private extractComponents(ast: t.File): ComponentDescriptor[] {\n const components: ComponentDescriptor[] = [];\n const seen = new Set<string>();\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element);\n if (!name || seen.has(name)) return;\n seen.add(name);\n\n const role = classifyWebJsxComponent(name, element);\n const type: ComponentDescriptor['type'] =\n role === 'select' || role === 'toggle' || role === 'date'\n ? 'input'\n : role === 'input' ||\n role === 'button' ||\n role === 'list' ||\n role === 'modal' ||\n role === 'view'\n ? (role as ComponentDescriptor['type'])\n : 'custom';\n\n const component: ComponentDescriptor = { name, type };\n const testId = getStringAttr(element, 'data-testid') ?? getStringAttr(element, 'testID');\n const ariaLabel = getStringAttr(element, 'aria-label');\n if (testId) component.testID = testId;\n if (ariaLabel) component.accessibilityLabel = ariaLabel;\n components.push(component);\n },\n });\n\n return components;\n }\n\n // ── <label htmlFor> association ───────────────────────────────────\n\n private collectHtmlForLabels(ast: t.File): Map<string, string> {\n const labels = new Map<string, string>();\n traverse(ast, {\n JSXElement: (nodePath) => {\n const element = nodePath.node;\n if (getJsxElementName(element.openingElement) !== 'label') return;\n const htmlFor = getStringAttr(element.openingElement, 'htmlFor');\n if (!htmlFor) return;\n const text = jsxTextContent(element);\n if (text) labels.set(htmlFor, text);\n },\n });\n return labels;\n }\n\n // ── Forms ─────────────────────────────────────────────────────────\n\n private extractForms(ast: t.File, labelsByHtmlFor: Map<string, string>): FormDescriptor[] {\n interface FormBucket {\n id: string;\n fields: Map<string, FormFieldDescriptor>;\n submitAction?: string;\n }\n const formBuckets = new Map<t.JSXElement | null, FormBucket>();\n const usedIds = new Set<string>();\n let formCount = 0;\n\n // Form ids address a form in the MCP doc, so they have to stay\n // unique even when the markup gives us nothing to name them by\n // (two anonymous <form>s, or an anonymous form alongside inputs\n // that live outside any form).\n const uniqueId = (preferred: string): string => {\n if (!usedIds.has(preferred)) {\n usedIds.add(preferred);\n return preferred;\n }\n let suffix = 2;\n while (usedIds.has(`${preferred}-${suffix}`)) suffix += 1;\n const id = `${preferred}-${suffix}`;\n usedIds.add(id);\n return id;\n };\n\n const bucketFor = (formElement: t.JSXElement | null): FormBucket => {\n let bucket = formBuckets.get(formElement);\n if (bucket) return bucket;\n formCount += 1;\n let preferred = 'default';\n let submitAction: string | undefined;\n if (formElement) {\n const opening = formElement.openingElement;\n preferred =\n getStringAttr(opening, 'id') ??\n getStringAttr(opening, 'name') ??\n getStringAttr(opening, 'data-testid') ??\n (formCount === 1 ? 'default' : `form-${formCount}`);\n submitAction = this.handlerNameFromAttr(opening, 'onSubmit');\n }\n bucket = { id: uniqueId(preferred), fields: new Map(), submitAction };\n formBuckets.set(formElement, bucket);\n return bucket;\n };\n\n traverse(ast, {\n JSXElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element.openingElement);\n if (!name) return;\n const role = classifyWebJsxComponent(name, element.openingElement);\n if (!['input', 'select', 'toggle', 'date'].includes(role)) return;\n // <option> elements classify as 'select' via ARIA mapping — they\n // are values of their parent <select>, not fields themselves.\n if (name === 'option') return;\n\n const field = this.extractField(element, role, labelsByHtmlFor);\n if (!field.name) return;\n\n const formParent = nodePath.findParent(\n (p) =>\n p.isJSXElement() &&\n (getJsxElementName(p.node.openingElement) === 'form' ||\n getStringAttr(p.node.openingElement, 'role') === 'form'),\n ) as NodePath<t.JSXElement> | null;\n const bucket = bucketFor(formParent ? formParent.node : null);\n if (!bucket.fields.has(field.name)) bucket.fields.set(field.name, field);\n },\n });\n\n // Submit buttons: attach the LAST submit-capable button's handler to\n // its form when the form has no onSubmit of its own.\n traverse(ast, {\n JSXElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element.openingElement);\n if (!name) return;\n if (!this.isSubmitElement(name, element.openingElement)) return;\n const formParent = nodePath.findParent(\n (p) => p.isJSXElement() && getJsxElementName(p.node.openingElement) === 'form',\n ) as NodePath<t.JSXElement> | null;\n if (!formParent) return;\n const bucket = formBuckets.get(formParent.node);\n if (!bucket) return;\n const handler = this.handlerNameFromAttr(element.openingElement, 'onClick');\n if (!bucket.submitAction && handler) bucket.submitAction = handler;\n },\n });\n\n return Array.from(formBuckets.values())\n .filter((bucket) => bucket.fields.size > 0)\n .map((bucket) => ({\n id: bucket.id,\n fields: Array.from(bucket.fields.values()),\n ...(bucket.submitAction && bucket.submitAction !== 'anonymous'\n ? { submitAction: bucket.submitAction }\n : {}),\n }));\n }\n\n private isSubmitElement(name: string, opening: t.JSXOpeningElement): boolean {\n const type = getStringAttr(opening, 'type');\n if (name === 'button') return type === 'submit' || type === undefined;\n if (name === 'input') return type === 'submit';\n return false;\n }\n\n private extractField(\n element: t.JSXElement,\n role: string,\n labelsByHtmlFor: Map<string, string>,\n ): FormFieldDescriptor {\n const opening = element.openingElement;\n const componentName = getJsxElementName(opening) ?? undefined;\n const field: FormFieldDescriptor = {\n name: '',\n type: 'text',\n required: false,\n sourceComponent: componentName,\n };\n\n const appilotsId = getStringAttr(opening, 'appilotsId');\n const dataTestId = getStringAttr(opening, 'data-testid');\n const domId = getStringAttr(opening, 'id');\n const nameAttr = getStringAttr(opening, 'name');\n const ariaLabel = getStringAttr(opening, 'aria-label');\n const placeholder = getStringAttr(opening, 'placeholder');\n\n if (placeholder) field.placeholder = placeholder;\n if (ariaLabel) field.label = ariaLabel;\n if (domId && labelsByHtmlFor.has(domId)) field.label = labelsByHtmlFor.get(domId);\n\n // Name precedence: explicit appilotsId > form `name` > `id` >\n // data-testid (with common prefixes stripped) > value binding > a\n // slug of the label/placeholder.\n if (appilotsId) {\n field.name = appilotsId;\n field.locator = mergeLocator(field.locator, {\n id: appilotsId,\n appilotsId,\n source: 'appilotsId',\n });\n }\n if (dataTestId) {\n if (!field.name) field.name = dataTestId.replace(/^(input-|field-|txt-)/, '');\n field.locator = mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: dataTestId }),\n testID: dataTestId,\n source: field.locator?.source ?? 'data-testid',\n });\n }\n if (nameAttr && !field.name) field.name = nameAttr;\n if (domId) {\n if (!field.name) field.name = domId;\n field.locator = mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: domId }),\n source: field.locator?.source ?? 'id',\n });\n }\n if (ariaLabel) {\n field.locator = mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: slugify(ariaLabel) }),\n accessibilityLabel: ariaLabel,\n source: field.locator?.source ?? 'aria-label',\n });\n }\n\n // Bindings and required.\n for (const attr of opening.attributes) {\n if (!t.isJSXAttribute(attr) || !t.isJSXIdentifier(attr.name)) continue;\n const attrName = attr.name.name;\n if (attrName === 'required') {\n if (attr.value === null) field.required = true;\n else if (\n t.isJSXExpressionContainer(attr.value) &&\n t.isBooleanLiteral(attr.value.expression)\n ) {\n field.required = attr.value.expression.value;\n }\n }\n if (\n (attrName === 'value' || attrName === 'checked') &&\n attr.value &&\n t.isJSXExpressionContainer(attr.value) &&\n t.isIdentifier(attr.value.expression)\n ) {\n field.valueBinding = attr.value.expression.name;\n if (!field.name) field.name = attr.value.expression.name;\n }\n }\n if (getStringAttr(opening, 'aria-required') === 'true') field.required = true;\n\n // Field type: semantic role, then type= / inputMode=, then wording.\n if (role === 'select') field.type = 'select';\n else if (role === 'toggle') field.type = 'toggle';\n else if (role === 'date') field.type = 'date';\n else {\n field.type = this.inferInputType(opening, field);\n }\n\n // <select> static options.\n if (componentName === 'select') {\n const options = this.extractSelectOptions(element);\n if (options.length > 0) field.options = options;\n }\n\n if (!field.name || isWeakInferredFieldName(field.name)) {\n const labelish = field.label ?? field.placeholder;\n if (labelish) field.name = slugify(labelish);\n }\n if (!field.locator && field.name) {\n field.locator = { id: field.name, label: field.label, source: 'inferred' };\n } else if (field.locator && !field.locator.id && field.name) {\n field.locator = mergeLocator(field.locator, {\n id: field.name,\n label: field.label,\n source: field.locator.source ?? 'inferred',\n });\n }\n\n return field;\n }\n\n private inferInputType(\n opening: t.JSXOpeningElement,\n field: FormFieldDescriptor,\n ): FormFieldDescriptor['type'] {\n const type = getStringAttr(opening, 'type');\n if (type === 'email') return 'email';\n if (type === 'tel') return 'phone';\n if (type === 'number') return 'number';\n if (type === 'date' || type === 'datetime-local' || type === 'month' || type === 'week')\n return 'date';\n\n const inputMode = getStringAttr(opening, 'inputMode') ?? getStringAttr(opening, 'inputmode');\n if (inputMode === 'email') return 'email';\n if (inputMode === 'tel') return 'phone';\n if (inputMode === 'numeric' || inputMode === 'decimal') return 'number';\n\n const combined = `${field.name} ${field.label ?? ''} ${field.placeholder ?? ''}`.toLowerCase();\n if (combined.includes('email')) return 'email';\n if (combined.includes('phone') || combined.includes('tel')) return 'phone';\n return 'text';\n }\n\n private extractSelectOptions(selectElement: t.JSXElement): { label: string; value: string }[] {\n const options: { label: string; value: string }[] = [];\n for (const child of selectElement.children) {\n if (!t.isJSXElement(child)) continue;\n if (getJsxElementName(child.openingElement) !== 'option') continue;\n const value = getStringAttr(child.openingElement, 'value');\n const label = jsxTextContent(child) || value || '';\n if (label && value) options.push({ label, value });\n }\n return options;\n }\n\n private mergeForms(primary: FormDescriptor[], secondary: FormDescriptor[]): FormDescriptor[] {\n const out: FormDescriptor[] = primary.map((form) => ({ ...form, fields: [...form.fields] }));\n for (const form of secondary) {\n const existing = out.find((candidate) => candidate.id === form.id);\n if (!existing) {\n out.push({ ...form, fields: [...form.fields] });\n continue;\n }\n for (const field of form.fields) {\n const existingField = existing.fields.find((candidate) => candidate.name === field.name);\n if (!existingField) {\n existing.fields.push(field);\n continue;\n }\n existingField.label = existingField.label ?? field.label;\n existingField.placeholder = existingField.placeholder ?? field.placeholder;\n existingField.options = existingField.options ?? field.options;\n existingField.locator = existingField.locator ?? field.locator;\n existingField.sourceComponent = existingField.sourceComponent ?? field.sourceComponent;\n existingField.valueBinding = existingField.valueBinding ?? field.valueBinding;\n existingField.required = existingField.required || field.required;\n if (existingField.type === 'text' && field.type !== 'text') existingField.type = field.type;\n }\n existing.submitAction = existing.submitAction ?? form.submitAction;\n }\n return out;\n }\n\n // ── Actions ───────────────────────────────────────────────────────\n\n private extractActions(\n ast: t.File,\n registerScreenMeta: (Partial<ScreenDescriptor> & { name: string }) | null,\n handlerBehaviors: Map<string, WebHandlerBehavior>,\n ): ActionDescriptor[] {\n const actions = [...(registerScreenMeta?.actions ?? [])];\n const actionIds = new Set(actions.map((a) => a.id));\n const actionLabels = new Map(\n actions.filter((a) => a.label).map((a) => [normalizeLabel(a.label!), a] as const),\n );\n\n traverse(ast, {\n JSXElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element.openingElement);\n if (!name) return;\n if (classifyWebJsxComponent(name, element.openingElement) !== 'button') return;\n\n const action = this.extractActionFromElement(element, nodePath);\n if (!action) return;\n\n const existingByLabel = action.label\n ? actionLabels.get(normalizeLabel(action.label))\n : undefined;\n if (existingByLabel) {\n this.mergeActionMetadata(existingByLabel, action);\n return;\n }\n if (action.id && !actionIds.has(action.id)) {\n actions.push(action);\n actionIds.add(action.id);\n if (action.label) actionLabels.set(normalizeLabel(action.label), action);\n }\n },\n });\n\n this.enrichActionsFromHandlers(actions, handlerBehaviors);\n return actions;\n }\n\n private extractActionFromElement(\n element: t.JSXElement,\n nodePath: NodePath<t.JSXElement>,\n ): ActionDescriptor | null {\n const opening = element.openingElement;\n const componentName = getJsxElementName(opening) ?? undefined;\n const action: ActionDescriptor = { id: '', type: 'custom', sourceComponent: componentName };\n\n // Label: aria-label > text content > value= (input[type=submit]) > title=.\n const ariaLabel = getStringAttr(opening, 'aria-label');\n const label =\n ariaLabel ??\n jsxTextContent(element) ??\n getStringAttr(opening, 'value') ??\n getStringAttr(opening, 'title');\n if (label) action.label = label;\n if (ariaLabel) {\n action.locator = mergeLocator(action.locator, {\n accessibilityLabel: ariaLabel,\n source: 'aria-label',\n });\n }\n\n // Locator/id: appilotsId > data-testid > id > slug(label).\n const appilotsId = getStringAttr(opening, 'appilotsId');\n const dataTestId = getStringAttr(opening, 'data-testid');\n const domId = getStringAttr(opening, 'id');\n if (appilotsId) {\n action.id = appilotsId;\n action.locator = mergeLocator(action.locator, {\n id: appilotsId,\n appilotsId,\n source: 'appilotsId',\n });\n } else if (dataTestId) {\n action.id = dataTestId;\n action.locator = mergeLocator(action.locator, {\n id: dataTestId,\n testID: dataTestId,\n source: 'data-testid',\n });\n } else if (domId) {\n action.id = domId;\n action.locator = mergeLocator(action.locator, { id: domId, source: 'id' });\n } else if (action.label) {\n action.id = slugify(action.label);\n }\n if (!action.id) return null;\n\n // Navigation declared on the element itself: <Link to>, <a href>.\n const to = routePathAttr(opening, 'to') ?? routePathAttr(opening, 'href');\n if (to && to.startsWith('/')) {\n action.type = 'navigation';\n // Route path — the orchestrator resolves it to a screen name.\n action.targetScreen = to;\n } else if (to && !to.startsWith('/') && !hasJsxAttribute(opening, 'onClick')) {\n // External link with no handler — not an agent action.\n return null;\n }\n\n // Handler: onClick (identifier or inline).\n let handlerName: string | undefined;\n const onClickAttr = opening.attributes.find(\n (attr): attr is t.JSXAttribute =>\n t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name) && attr.name.name === 'onClick',\n );\n if (onClickAttr?.value && t.isJSXExpressionContainer(onClickAttr.value)) {\n const expr = onClickAttr.value.expression;\n if (t.isIdentifier(expr)) {\n handlerName = expr.name;\n action.handler = expr.name;\n } else if (!t.isJSXEmptyExpression(expr)) {\n const inlineNavCalls = extractWebNavigationCalls(expr);\n const inlineNav = inlineNavCalls.find((call) => call.targetPath);\n if (inlineNav?.targetPath) {\n action.type = 'navigation';\n action.targetScreen = inlineNav.targetPath;\n } else if (inlineNavCalls.some((call) => call.method === 'goBack')) {\n // `onClick={() => navigate(-1)}` — no target to resolve, but\n // the agent still needs to know a route change is coming.\n action.type = 'navigation';\n action.successSignal = {\n type: 'goBack',\n description: 'Action returns to the previous page',\n };\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n expectedOutcome: 'navigation',\n };\n }\n const inlineHandler = firstCalledFunctionName(expr);\n if (inlineHandler) {\n handlerName = inlineHandler;\n action.handler = inlineHandler;\n }\n }\n }\n if (handlerName) {\n const lower = handlerName.toLowerCase();\n if (lower.includes('submit')) action.type = 'submit';\n else if (lower.includes('navigate') && action.type === 'custom') action.type = 'navigation';\n }\n\n // Submit semantics: type=\"submit\" (or a default-type button) inside a\n // <form> submits it; inherit the form's onSubmit handler.\n if (componentName && this.isSubmitElement(componentName, opening)) {\n const formParent = nodePath.findParent(\n (p) => p.isJSXElement() && getJsxElementName(p.node.openingElement) === 'form',\n ) as NodePath<t.JSXElement> | null;\n if (formParent) {\n action.type = 'submit';\n if (!action.handler) {\n const formHandler = this.handlerNameFromAttr(formParent.node.openingElement, 'onSubmit');\n if (formHandler && formHandler !== 'anonymous') {\n action.handler = formHandler;\n handlerName = formHandler;\n }\n }\n }\n }\n\n // Destructive heuristics — explicit prop wins, then verb matching.\n if (hasJsxAttribute(opening, 'destructive') || hasJsxAttribute(opening, 'aria-destructive')) {\n const value =\n getStringAttr(opening, 'destructive') ?? getStringAttr(opening, 'aria-destructive');\n action.destructive = value !== 'false';\n } else if (\n (handlerName && DESTRUCTIVE_VERB.test(handlerName)) ||\n DESTRUCTIVE_VERB.test(action.id)\n ) {\n action.destructive = true;\n }\n\n if (!action.locator && action.id) {\n action.locator = {\n id: action.id,\n label: action.label,\n source: action.label ? 'label' : 'inferred',\n };\n }\n\n return action;\n }\n\n private mergeActionMetadata(target: ActionDescriptor, source: ActionDescriptor): void {\n target.handler = target.handler ?? source.handler;\n target.targetScreen = target.targetScreen ?? source.targetScreen;\n target.description = target.description ?? source.description;\n target.locator = target.locator ?? source.locator;\n target.nativeConfirmationExpected =\n target.nativeConfirmationExpected || source.nativeConfirmationExpected || undefined;\n target.requiresConfirmation =\n target.requiresConfirmation || source.requiresConfirmation || undefined;\n target.destructive = target.destructive || source.destructive || undefined;\n target.effect = target.effect ?? source.effect;\n target.riskLevel = target.riskLevel ?? source.riskLevel;\n target.appilotsInferred = target.appilotsInferred ?? source.appilotsInferred;\n }\n\n private enrichActionsFromHandlers(\n actions: ActionDescriptor[],\n behaviors: Map<string, WebHandlerBehavior>,\n ): void {\n for (const action of actions) {\n const behavior = action.handler ? behaviors.get(action.handler) : undefined;\n if (!behavior) continue;\n\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n ...behavior.base.appilotsInferred,\n };\n if (behavior.nativeConfirmationExpected || behavior.base.nativeConfirmationExpected) {\n action.nativeConfirmationExpected = true;\n }\n if (behavior.targetPath && !action.targetScreen) {\n action.targetScreen = behavior.targetPath;\n if (action.type === 'custom') action.type = 'navigation';\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n expectedOutcome: 'navigation',\n };\n }\n if (behavior.base.successSignal && !action.successSignal) {\n action.successSignal = behavior.base.successSignal;\n }\n if (behavior.base.failureSignal && !action.failureSignal) {\n action.failureSignal = behavior.base.failureSignal;\n }\n if (behavior.base.opensModal && !action.opensModal) {\n action.opensModal = behavior.base.opensModal;\n }\n if (\n behavior.base.destructive ||\n action.destructive === true ||\n action.requiresConfirmation === true ||\n action.effect === 'destructive' ||\n action.riskLevel === 'high'\n ) {\n action.destructive = true;\n action.effect = action.effect ?? 'destructive';\n action.riskLevel = action.riskLevel ?? 'high';\n action.requiresConfirmation = action.requiresConfirmation ?? true;\n }\n }\n }\n\n /**\n * Handler behavior via the shared, platform-neutral analyzer\n * (async/await, `.then`, state setters, toasts, destructive verbs)\n * plus the web-only signals: React Router navigation targets and\n * `window.confirm(...)` as the native confirmation dialog.\n */\n private collectWebHandlerBehaviors(ast: t.File): Map<string, WebHandlerBehavior> {\n const handlers = collectFunctions(ast);\n const out = new Map<string, WebHandlerBehavior>();\n\n for (const [name, fn] of handlers) {\n const base = analyzeFunctionBehavior(name, fn, handlers);\n const navCalls = fn.body ? extractWebNavigationCalls(fn.body) : [];\n const firstNav = navCalls.find((call) => call.targetPath);\n const goesBack = navCalls.some((call) => call.method === 'goBack');\n out.set(name, {\n base: {\n ...base,\n ...(goesBack && !base.successSignal\n ? {\n successSignal: {\n type: 'goBack',\n description: 'Action returns to the previous page',\n },\n }\n : {}),\n },\n targetPath: firstNav?.targetPath,\n nativeConfirmationExpected: fn.body ? containsWindowConfirm(fn.body) : false,\n });\n }\n return out;\n }\n\n private handlerNameFromAttr(opening: t.JSXOpeningElement, attrName: string): string | undefined {\n const attr = opening.attributes.find(\n (candidate): candidate is t.JSXAttribute =>\n t.isJSXAttribute(candidate) &&\n t.isJSXIdentifier(candidate.name) &&\n candidate.name.name === attrName,\n );\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n const expr = attr.value.expression;\n if (t.isIdentifier(expr)) return expr.name;\n if (t.isArrowFunctionExpression(expr) || t.isFunctionExpression(expr)) {\n return firstCalledFunctionName(expr) ?? 'anonymous';\n }\n return undefined;\n }\n\n // ── Navigation targets (route paths — resolved by the orchestrator) ─\n\n private extractNavigationTargets(ast: t.File): string[] {\n const targets = new Set<string>();\n\n for (const call of extractWebNavigationCalls(ast)) {\n if (call.targetPath && call.targetPath.startsWith('/')) targets.add(call.targetPath);\n }\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element);\n if (name === 'Link' || name === 'NavLink' || name === 'Navigate') {\n const to = routePathAttr(element, 'to');\n if (to && to.startsWith('/')) targets.add(to);\n }\n if (name === 'a') {\n const href = routePathAttr(element, 'href');\n if (href && href.startsWith('/')) targets.add(href);\n }\n },\n });\n\n return Array.from(targets).sort();\n }\n\n // ── Collections ───────────────────────────────────────────────────\n\n private extractCollections(ast: t.File): CollectionDescriptor[] {\n const collections: CollectionDescriptor[] = [];\n const seen = new Set<string>();\n\n traverse(ast, {\n JSXExpressionContainer: (nodePath) => {\n const expr = nodePath.node.expression;\n if (\n !t.isCallExpression(expr) ||\n !t.isMemberExpression(expr.callee) ||\n !t.isIdentifier(expr.callee.object) ||\n !t.isIdentifier(expr.callee.property) ||\n expr.callee.property.name !== 'map'\n ) {\n return;\n }\n const callback = expr.arguments[0];\n if (!t.isArrowFunctionExpression(callback) && !t.isFunctionExpression(callback)) return;\n\n const enclosing = nodePath.findParent((p) =>\n p.isJSXElement(),\n ) as NodePath<t.JSXElement> | null;\n const enclosingName = enclosing ? getJsxElementName(enclosing.node.openingElement) : null;\n const enclosingRole =\n enclosing && enclosingName\n ? classifyWebJsxComponent(enclosingName, enclosing.node.openingElement)\n : null;\n const returnsListItem = callbackReturnsTag(callback, new Set(['li', 'tr']));\n\n // Only treat as a data collection when it renders list rows —\n // maps over <option>s belong to the select field, maps over\n // arbitrary JSX are usually layout.\n if (enclosingName === 'select') return;\n const isListContext =\n (enclosingName !== null && LISTISH_TAGS.has(enclosingName)) ||\n enclosingRole === 'list' ||\n returnsListItem;\n if (!isListContext) return;\n\n const dataSource = expr.callee.object.name;\n if (seen.has(dataSource)) return;\n seen.add(dataSource);\n\n const itemNames = collectionItemNames(callback);\n const displayFields = collectionDisplayFields(callback, itemNames);\n const keyField = collectionKeyField(callback, itemNames);\n const rowAction = collectionRowAction(callback);\n const itemType = inferItemType(dataSource, displayFields);\n const identityFields = inferIdentityFields(keyField, displayFields);\n\n collections.push({\n id: dataSource,\n component: enclosingName ?? 'list',\n ...(itemType ? { itemType } : {}),\n dataSource,\n ...(keyField ? { keyField } : {}),\n ...(displayFields.length > 0 ? { displayFields } : {}),\n ...(rowAction ? { rowAction, rowActions: [rowAction] } : {}),\n ...(identityFields.length > 0 ? { identityFields } : {}),\n });\n },\n });\n\n return collections;\n }\n}\n\ninterface WebHandlerBehavior {\n base: FunctionBehavior;\n /** Route path this handler navigates to, when statically detectable. */\n targetPath?: string;\n /** True when the handler calls `window.confirm(...)` / `confirm(...)`. */\n nativeConfirmationExpected: boolean;\n}\n\n// ── Module-level helpers (web dialect) ─────────────────────────────\n\nfunction isRegisterScreenCallee(callee: t.Expression | t.V8IntrinsicIdentifier): boolean {\n return (\n (t.isIdentifier(callee) && callee.name === 'registerScreen') ||\n (t.isMemberExpression(callee) &&\n t.isIdentifier(callee.property) &&\n callee.property.name === 'registerScreen')\n );\n}\n\n/** Literal-only AST → plain JS value; non-literal parts become undefined. */\nfunction literalToPlain(node: t.Node): unknown {\n if (t.isStringLiteral(node) || t.isNumericLiteral(node) || t.isBooleanLiteral(node)) {\n return node.value;\n }\n if (t.isNullLiteral(node)) return null;\n if (t.isArrayExpression(node)) {\n return node.elements\n .filter((el): el is t.Expression => el !== null && t.isExpression(el))\n .map((el) => literalToPlain(el))\n .filter((value) => value !== undefined);\n }\n if (t.isObjectExpression(node)) {\n const out: Record<string, unknown> = {};\n for (const prop of node.properties) {\n if (!t.isObjectProperty(prop)) continue;\n const key = t.isIdentifier(prop.key)\n ? prop.key.name\n : t.isStringLiteral(prop.key)\n ? prop.key.value\n : undefined;\n if (!key || !t.isExpression(prop.value)) continue;\n const value = literalToPlain(prop.value);\n if (value !== undefined) out[key] = value;\n }\n return out;\n }\n return undefined;\n}\n\n/** Concatenated, trimmed JSXText (plus string-literal expressions) of an element. */\nfunction jsxTextContent(element: t.JSXElement): string | undefined {\n const parts: string[] = [];\n const walk = (children: t.JSXElement['children']) => {\n for (const child of children) {\n if (t.isJSXText(child)) {\n const trimmed = child.value.replace(/\\s+/g, ' ').trim();\n if (trimmed) parts.push(trimmed);\n } else if (t.isJSXExpressionContainer(child) && t.isStringLiteral(child.expression)) {\n parts.push(child.expression.value);\n } else if (t.isJSXElement(child)) {\n walk(child.children);\n }\n }\n };\n walk(element.children);\n const text = parts.join(' ').trim();\n return text.length > 0 ? text : undefined;\n}\n\n/** First named function called inside an inline handler body. */\nfunction firstCalledFunctionName(node: t.Node): string | undefined {\n if (t.isIdentifier(node)) return node.name;\n if (t.isArrowFunctionExpression(node) || t.isFunctionExpression(node)) {\n return firstCalledFunctionName(node.body);\n }\n if (t.isBlockStatement(node)) {\n for (const statement of node.body) {\n const handler = firstCalledFunctionName(statement);\n if (handler) return handler;\n }\n return undefined;\n }\n if (t.isExpressionStatement(node)) return firstCalledFunctionName(node.expression);\n if (t.isReturnStatement(node)) {\n return node.argument ? firstCalledFunctionName(node.argument) : undefined;\n }\n if (t.isAwaitExpression(node) || t.isUnaryExpression(node)) {\n return firstCalledFunctionName(node.argument);\n }\n if (t.isCallExpression(node)) {\n // navigate('/x')/confirm() are signals, not user-level handlers.\n if (t.isIdentifier(node.callee) && !/^(navigate|confirm|alert)$/.test(node.callee.name)) {\n return node.callee.name;\n }\n return undefined;\n }\n return undefined;\n}\n\nfunction containsWindowConfirm(body: t.Node): boolean {\n let found = false;\n traverse(\n body as any,\n {\n noScope: true,\n CallExpression: (nodePath: any) => {\n const callee = (nodePath.node as t.CallExpression).callee;\n if (t.isIdentifier(callee) && callee.name === 'confirm') found = true;\n if (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object) &&\n callee.object.name === 'window' &&\n t.isIdentifier(callee.property) &&\n callee.property.name === 'confirm'\n ) {\n found = true;\n }\n },\n } as any,\n );\n return found;\n}\n\nfunction mergeLocator(\n current: LocatorDescriptor | undefined,\n next: LocatorDescriptor,\n): LocatorDescriptor {\n return { ...(current ?? {}), ...next };\n}\n\n/**\n * Route path from a JSX attribute (`to=`, `href=`), accepting both a\n * plain string and a template literal (`` to={`/vehicles/${id}`} ``,\n * which yields the route pattern `/vehicles/:id`).\n */\nfunction routePathAttr(opening: t.JSXOpeningElement, attrName: string): string | undefined {\n const literal = getStringAttr(opening, attrName);\n if (literal) return literal;\n const attr = opening.attributes.find(\n (candidate): candidate is t.JSXAttribute =>\n t.isJSXAttribute(candidate) &&\n t.isJSXIdentifier(candidate.name) &&\n candidate.name.name === attrName,\n );\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n return staticRoutePath(attr.value.expression);\n}\n\nfunction slugify(label: string): string {\n return label\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction normalizeLabel(label: string): string {\n return label\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '');\n}\n\nfunction isWeakInferredFieldName(name: string): boolean {\n return /^(text|value|input|query|search|selected|checked)$/i.test(name);\n}\n\n// ── Collection helpers ─────────────────────────────────────────────\n\nfunction collectionItemNames(callback: t.Function): Set<string> {\n const names = new Set<string>(['item']);\n const firstParam = callback.params[0];\n if (t.isIdentifier(firstParam)) names.add(firstParam.name);\n if (t.isObjectPattern(firstParam)) {\n for (const prop of firstParam.properties) {\n if (t.isObjectProperty(prop) && t.isIdentifier(prop.key) && t.isIdentifier(prop.value)) {\n names.add(prop.value.name);\n }\n }\n }\n return names;\n}\n\nfunction collectionDisplayFields(callback: t.Function, itemNames: Set<string>): string[] {\n const fields = new Set<string>();\n if (!callback.body) return [];\n traverse(\n callback.body as any,\n {\n noScope: true,\n MemberExpression: (nodePath: any) => {\n const node = nodePath.node as t.MemberExpression;\n if (\n t.isIdentifier(node.object) &&\n itemNames.has(node.object.name) &&\n t.isIdentifier(node.property)\n ) {\n fields.add(node.property.name);\n }\n },\n } as any,\n );\n return Array.from(fields).sort();\n}\n\nfunction collectionKeyField(callback: t.Function, itemNames: Set<string>): string | undefined {\n let keyField: string | undefined;\n if (!callback.body) return undefined;\n traverse(\n callback.body as any,\n {\n noScope: true,\n JSXAttribute: (nodePath: any) => {\n const attr = nodePath.node as t.JSXAttribute;\n if (!t.isJSXIdentifier(attr.name) || attr.name.name !== 'key') return;\n if (!attr.value || !t.isJSXExpressionContainer(attr.value)) return;\n const expr = attr.value.expression;\n if (\n t.isMemberExpression(expr) &&\n t.isIdentifier(expr.object) &&\n itemNames.has(expr.object.name) &&\n t.isIdentifier(expr.property)\n ) {\n keyField = keyField ?? expr.property.name;\n }\n },\n } as any,\n );\n return keyField;\n}\n\nfunction collectionRowAction(callback: t.Function): RowActionDescriptor | undefined {\n if (!callback.body) return undefined;\n const navCall = extractWebNavigationCalls(callback.body).find((call) => call.targetPath);\n if (!navCall?.targetPath) return undefined;\n return {\n type: 'navigation',\n // Route path — the orchestrator resolves it to a screen name.\n targetScreen: navCall.targetPath,\n description: `Clicking a row opens ${navCall.targetPath}`,\n };\n}\n\nfunction callbackReturnsTag(callback: t.Function, tags: Set<string>): boolean {\n let found = false;\n const inspect = (node: t.Node | null | undefined) => {\n if (!node || found) return;\n if (t.isJSXElement(node)) {\n const name = getJsxElementName(node.openingElement);\n if (name && tags.has(name)) found = true;\n return;\n }\n if (t.isBlockStatement(node)) {\n for (const statement of node.body) {\n if (t.isReturnStatement(statement)) inspect(statement.argument);\n }\n }\n if (t.isParenthesizedExpression(node)) inspect(node.expression);\n if (t.isConditionalExpression(node)) {\n inspect(node.consequent);\n inspect(node.alternate);\n }\n };\n inspect(callback.body);\n return found;\n}\n\nfunction inferItemType(dataSource: string, displayFields: string[]): string | undefined {\n const singular = dataSource\n .replace(/^render/i, '')\n .replace(/(List|Items|Data|Rows|Sections)$/i, '')\n .replace(/s$/i, '');\n const candidate = singular.charAt(0).toUpperCase() + singular.slice(1);\n if (candidate.length > 1) return candidate;\n if (displayFields.length > 0) return 'Item';\n return undefined;\n}\n\n/** Naming conventions only — see the native analyzer for why `plate` left. */\nfunction inferIdentityFields(keyField: string | undefined, displayFields: string[]): string[] {\n const out = new Set<string>();\n if (keyField) out.add(keyField);\n for (const field of displayFields) {\n if (/^(id|uuid|key|name|title|email|slug)$/i.test(field)) out.add(field);\n }\n return Array.from(out);\n}\n","import type * as t from '@babel/types';\nimport {\n getExpressionIdentifierAttr,\n getStringAttr,\n hasJsxAttribute,\n} from '../attributes';\nimport type { SemanticComponentRole } from '../classify';\n\n/**\n * Web (DOM/ARIA) counterpart of `classifyJsxComponent`. Lives in its own\n * module so the React Native vocabulary in `../classify.ts` stays\n * byte-identical for the RN pipeline (output-parity guarded); the two\n * share the `SemanticComponentRole` result type so downstream consumers\n * (field typing, action extraction) are dialect-agnostic.\n *\n * Classification precedence:\n * 1. Explicit ARIA `role` attribute (the author's declared semantics).\n * 2. Intrinsic DOM tag vocabulary (`button`, `input[type=...]`, ...).\n * 3. Well-known component names (React Router's `Link`, `Select`, ...).\n * 4. The same prop-contract heuristics the RN classifier uses, with\n * `onClick` in place of `onPress`.\n */\n\nconst VIEW_TAGS = new Set([\n 'div', 'span', 'section', 'main', 'article', 'aside', 'header', 'footer',\n 'nav', 'fieldset', 'form', 'p',\n]);\nconst LIST_TAGS = new Set(['ul', 'ol', 'dl', 'table', 'tbody']);\nconst BUTTON_TAGS = new Set(['button']);\nconst INPUT_TAGS = new Set(['input', 'textarea']);\nconst MODAL_TAGS = new Set(['dialog']);\n\n/** Component names that are buttons by convention (React Router links). */\nconst BUTTON_COMPONENTS = new Set(['Button', 'IconButton', 'Link', 'NavLink']);\nconst INPUT_COMPONENTS = new Set(['Input', 'TextField', 'TextArea', 'Textarea']);\nconst LIST_COMPONENTS = new Set(['List', 'Table', 'DataGrid', 'DataTable']);\nconst MODAL_COMPONENTS = new Set(['Modal', 'Dialog', 'Drawer', 'Popover', 'BottomSheet']);\n\nconst ARIA_ROLE_TO_SEMANTIC: Record<string, SemanticComponentRole> = {\n button: 'button',\n link: 'button',\n tab: 'button',\n menuitem: 'button',\n textbox: 'input',\n searchbox: 'input',\n spinbutton: 'input',\n listbox: 'select',\n combobox: 'select',\n radiogroup: 'select',\n radio: 'select',\n option: 'select',\n checkbox: 'toggle',\n switch: 'toggle',\n dialog: 'modal',\n alertdialog: 'modal',\n list: 'list',\n table: 'list',\n grid: 'list',\n form: 'view',\n};\n\n/** `input[type=...]` → semantic role. Anything unlisted stays 'input'. */\nconst INPUT_TYPE_TO_SEMANTIC: Record<string, SemanticComponentRole> = {\n checkbox: 'toggle',\n radio: 'select',\n date: 'date',\n 'datetime-local': 'date',\n month: 'date',\n week: 'date',\n time: 'date',\n submit: 'button',\n button: 'button',\n reset: 'button',\n image: 'button',\n hidden: 'custom',\n range: 'input',\n file: 'input',\n color: 'input',\n};\n\nexport function classifyWebJsxComponent(\n name: string,\n element?: t.JSXOpeningElement,\n): SemanticComponentRole {\n // 1. Explicit ARIA role wins — it's the author's declared semantics.\n if (element) {\n const role = getStringAttr(element, 'role');\n if (role && ARIA_ROLE_TO_SEMANTIC[role]) return ARIA_ROLE_TO_SEMANTIC[role];\n }\n\n // 2. Intrinsic DOM tags (lowercase in JSX).\n if (/^[a-z]/.test(name)) {\n if (name === 'input') {\n const type = element ? getStringAttr(element, 'type') : undefined;\n if (type && INPUT_TYPE_TO_SEMANTIC[type]) return INPUT_TYPE_TO_SEMANTIC[type];\n return 'input';\n }\n if (INPUT_TAGS.has(name)) return 'input';\n if (name === 'select') return 'select';\n if (BUTTON_TAGS.has(name)) return 'button';\n if (name === 'a') {\n // A link is only an interaction target when it goes somewhere or\n // does something; a bare anchor is layout.\n if (element && (hasJsxAttribute(element, 'href') || hasJsxAttribute(element, 'onClick'))) {\n return 'button';\n }\n return 'view';\n }\n if (LIST_TAGS.has(name)) return 'list';\n if (MODAL_TAGS.has(name)) return 'modal';\n if (VIEW_TAGS.has(name)) return 'view';\n return 'custom';\n }\n\n // 3. Well-known component names (same name heuristics as RN, plus the\n // React Router navigation components).\n if (LIST_COMPONENTS.has(name)) return 'list';\n if (MODAL_COMPONENTS.has(name)) return 'modal';\n if (/date/i.test(name)) return 'date';\n if (/(select|picker|dropdown|radio)/i.test(name)) return 'select';\n if (/(checkbox|switch|toggle)/i.test(name)) return 'toggle';\n if (INPUT_COMPONENTS.has(name)) return 'input';\n if (BUTTON_COMPONENTS.has(name)) return 'button';\n\n // 4. Prop-contract heuristics — the RN classifier's, with onClick.\n if (element) {\n const hasOptions = hasJsxAttribute(element, 'options');\n const hasValue = hasJsxAttribute(element, 'value');\n const hasChecked = hasJsxAttribute(element, 'checked') || hasJsxAttribute(element, 'selected');\n const hasOnChange = hasJsxAttribute(element, 'onChange') || hasJsxAttribute(element, 'onValueChange');\n const hasOnClick = hasJsxAttribute(element, 'onClick');\n\n if (hasOptions && (hasValue || hasOnChange)) return 'select';\n if (hasChecked && hasOnChange) return 'toggle';\n if (hasOnChange && (hasJsxAttribute(element, 'label') || hasJsxAttribute(element, 'placeholder'))) {\n return 'input';\n }\n if (hasOnClick) return 'button';\n if (\n getStringAttr(element, 'open') ||\n getExpressionIdentifierAttr(element, 'open') ||\n getExpressionIdentifierAttr(element, 'isOpen')\n ) {\n return 'modal';\n }\n }\n\n return 'custom';\n}\n","import * as t from '@babel/types';\n\nexport function getJsxElementName(\n openingElement: t.JSXOpeningElement,\n): string | null {\n return getJsxName(openingElement.name);\n}\n\nexport function getJsxName(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n): string | null {\n if (t.isJSXIdentifier(name)) return name.name;\n if (t.isJSXNamespacedName(name)) return `${name.namespace.name}:${name.name.name}`;\n if (t.isJSXMemberExpression(name)) {\n const objectName = getJsxName(name.object as any);\n const propertyName = t.isJSXIdentifier(name.property) ? name.property.name : null;\n return objectName && propertyName ? `${objectName}.${propertyName}` : null;\n }\n return null;\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\n/**\n * Web dialect of `extractNavigationCalls` — React Router / browser\n * history verbs instead of React Navigation's `navigation.*` object.\n * Kept in its own module (like `web/classify.ts`) so `calls.ts` stays\n * untouched for the RN pipeline.\n */\nexport interface WebNavigationCall {\n method: 'navigate' | 'replace' | 'goBack';\n /** Route path, e.g. `'/vehicles/new'`. Absent for `navigate(-1)`. */\n targetPath?: string;\n}\n\n/** Identifiers whose `.push()`/`.replace()`/`.back()` mean routing. */\nconst ROUTERISH_OBJECTS = /^(router|history|navigation)$/;\n\n/**\n * Static route path of an expression, when there is one. Handles the two\n * shapes a route target takes in real code:\n *\n * - a string literal: `'/vehicles/new'`\n * - a template literal: `` `/vehicles/${item.id}` `` → `/vehicles/:id`,\n * i.e. the ROUTE PATTERN it instantiates. The interpolated property\n * name becomes the param name (`:param` when it isn't a simple\n * member/identifier), which is what makes such a path matchable\n * against a `:vehicleId`-style route declaration.\n */\nexport function staticRoutePath(node: t.Node | null | undefined): string | undefined {\n if (!node) return undefined;\n if (t.isStringLiteral(node)) return node.value;\n if (t.isTemplateLiteral(node)) {\n let path = '';\n node.quasis.forEach((quasi, index) => {\n path += quasi.value.cooked ?? quasi.value.raw;\n const expr = node.expressions[index];\n if (expr) path += `:${paramNameOf(expr)}`;\n });\n return path;\n }\n return undefined;\n}\n\nfunction paramNameOf(expr: t.Node): string {\n if (t.isIdentifier(expr)) return expr.name;\n if (t.isMemberExpression(expr) && t.isIdentifier(expr.property)) return expr.property.name;\n return 'param';\n}\n\nexport function extractWebNavigationCalls(ast: t.File | t.Node): WebNavigationCall[] {\n const calls: WebNavigationCall[] = [];\n\n const inspect = (node: t.Node) => {\n if (t.isCallExpression(node)) {\n // navigate('/x'), navigate('/x', { replace: true }), navigate(-1)\n if (t.isIdentifier(node.callee) && node.callee.name === 'navigate') {\n const first = node.arguments[0];\n const targetPath = staticRoutePath(first);\n if (targetPath !== undefined) {\n calls.push({\n method: hasReplaceOption(node.arguments[1]) ? 'replace' : 'navigate',\n targetPath,\n });\n } else if (t.isNumericLiteral(first) || (t.isUnaryExpression(first) && first.operator === '-')) {\n calls.push({ method: 'goBack' });\n }\n return;\n }\n // router.push('/x') / history.replace('/x') / history.back()\n if (\n t.isMemberExpression(node.callee) &&\n t.isIdentifier(node.callee.object) &&\n ROUTERISH_OBJECTS.test(node.callee.object.name) &&\n t.isIdentifier(node.callee.property)\n ) {\n const method = node.callee.property.name;\n const targetPath = staticRoutePath(node.arguments[0]);\n if ((method === 'push' || method === 'navigate') && targetPath !== undefined) {\n calls.push({ method: 'navigate', targetPath });\n } else if (method === 'replace' && targetPath !== undefined) {\n calls.push({ method: 'replace', targetPath });\n } else if (method === 'back' || method === 'goBack') {\n calls.push({ method: 'goBack' });\n }\n }\n return;\n }\n // window.location.href = '/x' (and location.assign/replace are calls,\n // handled above only for routerish objects — cover them here).\n if (\n t.isAssignmentExpression(node) &&\n t.isMemberExpression(node.left) &&\n t.isIdentifier(node.left.property) &&\n node.left.property.name === 'href' &&\n isLocationExpression(node.left.object) &&\n t.isStringLiteral(node.right) &&\n node.right.value.startsWith('/')\n ) {\n calls.push({ method: 'navigate', targetPath: node.right.value });\n }\n };\n\n traverse(ast as any, {\n noScope: !t.isFile(ast as t.Node),\n enter: (nodePath: any) => inspect(nodePath.node),\n } as any);\n\n return calls;\n}\n\nfunction hasReplaceOption(arg: t.Node | undefined | null): boolean {\n if (!arg || !t.isObjectExpression(arg)) return false;\n return arg.properties.some(\n (prop) =>\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n prop.key.name === 'replace' &&\n t.isBooleanLiteral(prop.value) &&\n prop.value.value === true,\n );\n}\n\nfunction isLocationExpression(node: t.Node): boolean {\n if (t.isIdentifier(node)) return node.name === 'location';\n return (\n t.isMemberExpression(node) &&\n t.isIdentifier(node.object) &&\n node.object.name === 'window' &&\n t.isIdentifier(node.property) &&\n node.property.name === 'location'\n );\n}\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport glob from 'fast-glob';\nimport traverse from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { parseSource } from '../../ast/parse';\nimport { getStringAttr, hasJsxAttribute } from '../../ast/jsx/attributes';\nimport { getJsxElementName } from '../../ast/jsx/names';\nimport type {\n AnalyzerConfig,\n NavigationGraph,\n NavigationNode,\n ParamDescriptor,\n} from '../../types';\n\n/**\n * A single resolved React Router route: its full URL path and the screen\n * (component) it renders. This is the web analog of a React Navigation\n * `<Stack.Screen name=...>` entry.\n */\nexport interface WebRoute {\n /** Full path with parent segments joined, e.g. `/vehicles/:id`. */\n path: string;\n /** Screen name — the route component's name, or derived from the path. */\n screenName: string;\n /** Path params extracted from `:segment` placeholders. */\n params?: ParamDescriptor[];\n /** True for `<Route index>` / `{ index: true }` routes. */\n index?: boolean;\n /**\n * True when this route has child routes — it renders a layout wrapper\n * around them, not a page of its own. A layout route loses to its own\n * `index` child when both resolve to the same path, since the index\n * child is what the user actually lands on.\n */\n layout?: boolean;\n}\n\nexport interface WebNavigationResult {\n graph: NavigationGraph;\n routes: WebRoute[];\n}\n\n/**\n * Web navigatorType for `NavigationNode`/`NavigatorDescriptor`. The wire\n * schema's `navigatorTypeSchema` is an open union, so this validates\n * as-is; the relay degrades unknown types to generic handling.\n */\nexport const WEB_NAVIGATOR_TYPE = 'route';\n\n/**\n * Analyzes React Router route configuration to build a navigation graph\n * — the sibling of `NavigationAnalyzer` (which is 100% react-navigation\n * and never runs for `platform: 'web'`). Understands both declaration\n * styles:\n *\n * - JSX: `<Routes><Route path=\"/x\" element={<X/>}/></Routes>` (nested\n * `<Route>` children join their parent's path)\n * - Object config: `createBrowserRouter([{ path, element, children }])`\n * (also `createHashRouter`, `createMemoryRouter`, `useRoutes`)\n */\nexport class WebNavigationAnalyzer {\n private config: AnalyzerConfig;\n private navigationInclude: string[];\n private navigationExclude: string[];\n\n constructor(\n config: AnalyzerConfig,\n options?: { navigationInclude?: string[]; navigationExclude?: string[] },\n ) {\n this.config = config;\n this.navigationInclude = options?.navigationInclude ?? [];\n this.navigationExclude = options?.navigationExclude ?? [];\n }\n\n async analyze(): Promise<WebNavigationResult> {\n const files = await this.findRouteFiles();\n const routes: WebRoute[] = [];\n\n for (const filePath of files) {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n // Cheap pre-filter: skip files with no router vocabulary at all.\n if (!/createBrowserRouter|createHashRouter|createMemoryRouter|useRoutes|<Route[\\s>]/.test(content)) {\n continue;\n }\n const ast = parseSource(content, this.config.parserPlugins as any);\n routes.push(...this.extractJsxRoutes(ast));\n routes.push(...this.extractObjectRoutes(ast));\n } catch (error) {\n console.warn(`[WebNavigationAnalyzer] Failed to parse ${filePath}:`, error);\n }\n }\n\n const deduped = this.dedupeRoutes(routes);\n return { graph: this.buildGraph(deduped), routes: deduped };\n }\n\n /** Files likely to contain route configuration. */\n private async findRouteFiles(): Promise<string[]> {\n const patterns = [\n '**/*{router,routes,Router,Routes}*.{ts,tsx,js,jsx}',\n '**/App.{ts,tsx,js,jsx}',\n '**/app.{ts,tsx,js,jsx}',\n '**/main.{ts,tsx,js,jsx}',\n '**/index.{ts,tsx,js,jsx}',\n ...this.navigationInclude,\n ];\n const ignore = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n ...(this.config.exclude || []),\n ...this.navigationExclude,\n ];\n const files = await glob(patterns, { cwd: this.config.rootDir, ignore });\n return files.map((file) => path.join(this.config.rootDir, file));\n }\n\n // ── JSX <Route> style ────────────────────────────────────────────\n\n private extractJsxRoutes(ast: t.File): WebRoute[] {\n const routes: WebRoute[] = [];\n\n const visitRoute = (element: t.JSXElement, parentPath: string) => {\n const opening = element.openingElement;\n const name = getJsxElementName(opening);\n if (name !== 'Route') {\n // Non-Route wrappers (<Routes>, fragments, layouts) — descend.\n for (const child of element.children) {\n if (t.isJSXElement(child)) visitRoute(child, parentPath);\n }\n return;\n }\n\n const segment = getStringAttr(opening, 'path');\n const isIndex = hasJsxAttribute(opening, 'index') && !segment;\n const fullPath = this.joinPaths(parentPath, segment, isIndex);\n const componentName =\n this.componentNameFromElementAttr(opening) ?? undefined;\n\n const isLeaf = !element.children.some(\n (child) => t.isJSXElement(child) && getJsxElementName(child.openingElement) === 'Route',\n );\n\n if ((segment || isIndex) && (componentName || isLeaf)) {\n routes.push(this.buildRoute(fullPath, componentName, isIndex, !isLeaf));\n }\n\n for (const child of element.children) {\n if (t.isJSXElement(child)) visitRoute(child, fullPath);\n }\n };\n\n traverse(ast, {\n JSXElement: (nodePath) => {\n const name = getJsxElementName(nodePath.node.openingElement);\n if (name !== 'Routes' && name !== 'Route') return;\n // Only start from the outermost router element; nested ones are\n // reached through visitRoute's own recursion.\n if (nodePath.findParent((p) => {\n if (!p.isJSXElement()) return false;\n const parentName = getJsxElementName(p.node.openingElement);\n return parentName === 'Routes' || parentName === 'Route';\n })) {\n return;\n }\n visitRoute(nodePath.node, '');\n },\n });\n\n return routes;\n }\n\n /** `element={<VehicleList/>}` or `Component={VehicleList}`. */\n private componentNameFromElementAttr(opening: t.JSXOpeningElement): string | null {\n for (const attr of opening.attributes) {\n if (!t.isJSXAttribute(attr) || !t.isJSXIdentifier(attr.name)) continue;\n if (attr.name.name === 'element' && t.isJSXExpressionContainer(attr.value)) {\n const expr = attr.value.expression;\n if (t.isJSXElement(expr)) return getJsxElementName(expr.openingElement);\n }\n if (attr.name.name === 'Component' && t.isJSXExpressionContainer(attr.value)) {\n if (t.isIdentifier(attr.value.expression)) return attr.value.expression.name;\n }\n }\n return null;\n }\n\n // ── createBrowserRouter([...]) / useRoutes([...]) style ──────────\n\n private extractObjectRoutes(ast: t.File): WebRoute[] {\n const routes: WebRoute[] = [];\n const ROUTER_FACTORIES = new Set([\n 'createBrowserRouter',\n 'createHashRouter',\n 'createMemoryRouter',\n 'useRoutes',\n ]);\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n const callee = nodePath.node.callee;\n if (!t.isIdentifier(callee) || !ROUTER_FACTORIES.has(callee.name)) return;\n const first = nodePath.node.arguments[0];\n if (!t.isArrayExpression(first)) return;\n this.visitRouteObjects(first, '', routes);\n },\n });\n\n return routes;\n }\n\n private visitRouteObjects(arr: t.ArrayExpression, parentPath: string, out: WebRoute[]): void {\n for (const element of arr.elements) {\n if (!t.isObjectExpression(element)) continue;\n\n let segment: string | undefined;\n let isIndex = false;\n let componentName: string | undefined;\n let children: t.ArrayExpression | undefined;\n\n for (const prop of element.properties) {\n if (!t.isObjectProperty(prop) || !t.isIdentifier(prop.key)) continue;\n const key = prop.key.name;\n if (key === 'path' && t.isStringLiteral(prop.value)) segment = prop.value.value;\n if (key === 'index' && t.isBooleanLiteral(prop.value)) isIndex = prop.value.value;\n if (key === 'element' && t.isJSXElement(prop.value)) {\n componentName = getJsxElementName(prop.value.openingElement) ?? undefined;\n }\n if (key === 'Component' && t.isIdentifier(prop.value)) componentName = prop.value.name;\n if (key === 'children' && t.isArrayExpression(prop.value)) children = prop.value;\n }\n\n const fullPath = this.joinPaths(parentPath, segment, isIndex);\n if ((segment !== undefined || isIndex) && (componentName || !children)) {\n out.push(this.buildRoute(fullPath, componentName, isIndex, Boolean(children)));\n }\n if (children) this.visitRouteObjects(children, fullPath, out);\n }\n }\n\n // ── Shared route building ────────────────────────────────────────\n\n private joinPaths(parent: string, segment: string | undefined, isIndex: boolean): string {\n if (isIndex || segment === undefined) return parent || '/';\n if (segment.startsWith('/')) return this.normalizePath(segment);\n return this.normalizePath(`${parent === '/' ? '' : parent}/${segment}`);\n }\n\n private normalizePath(p: string): string {\n const cleaned = `/${p}`.replace(/\\/+/g, '/');\n return cleaned.length > 1 ? cleaned.replace(/\\/$/, '') : cleaned;\n }\n\n private buildRoute(\n fullPath: string,\n componentName: string | undefined,\n isIndex: boolean,\n isLayout: boolean,\n ): WebRoute {\n const params = this.paramsFromPath(fullPath);\n return {\n path: fullPath,\n screenName: componentName ?? screenNameFromPath(fullPath),\n ...(params.length > 0 ? { params } : {}),\n ...(isIndex ? { index: true } : {}),\n ...(isLayout ? { layout: true } : {}),\n };\n }\n\n private paramsFromPath(routePath: string): ParamDescriptor[] {\n const params: ParamDescriptor[] = [];\n for (const segment of routePath.split('/')) {\n if (!segment.startsWith(':')) continue;\n const optional = segment.endsWith('?');\n const name = segment.slice(1, optional ? -1 : undefined);\n if (name) params.push({ name, type: 'string', required: !optional });\n }\n return params;\n }\n\n /**\n * One entry per path. When several declarations resolve to the same\n * path, keep the one that best describes what the user lands on: a\n * page beats a layout wrapper (an `index` child and its parent layout\n * share a path), and a resolved component name beats a name derived\n * from the path.\n */\n private dedupeRoutes(routes: WebRoute[]): WebRoute[] {\n const byPath = new Map<string, WebRoute>();\n for (const route of routes) {\n const existing = byPath.get(route.path);\n if (!existing || routeScore(route) > routeScore(existing)) {\n byPath.set(route.path, route);\n }\n }\n return Array.from(byPath.values());\n }\n\n private buildGraph(routes: WebRoute[]): NavigationGraph {\n const screens: Record<string, NavigationNode> = {};\n const navigatorName = 'router';\n const screenNames = routes.map((r) => r.screenName);\n\n for (const route of routes) {\n const others = screenNames.filter((name) => name !== route.screenName);\n screens[route.screenName] = {\n screenName: route.screenName,\n // Open-union value — web routes, not a RN stack/tab/drawer.\n navigatorType: WEB_NAVIGATOR_TYPE as NavigationNode['navigatorType'],\n parentNavigator: navigatorName,\n // Any route is one URL away from any other — both directions,\n // like the RN analyzer models tab navigators.\n reachableFrom: others,\n reachableTo: others,\n ...(route.params ? { params: route.params } : {}),\n };\n }\n\n const initialRoute =\n routes.find((r) => r.path === '/') ?? routes.find((r) => r.index) ?? routes[0];\n\n return {\n screens,\n initialScreen: initialRoute?.screenName ?? '',\n navigators: routes.length > 0\n ? [{\n name: navigatorName,\n type: WEB_NAVIGATOR_TYPE as NavigationGraph['navigators'][number]['type'],\n screens: screenNames,\n }]\n : [],\n };\n }\n}\n\n/** `/vehicles/:id/edit` → `VehiclesIdEdit`; `/` → `Home`. */\nexport function screenNameFromPath(routePath: string): string {\n if (routePath === '/' || routePath === '') return 'Home';\n return routePath\n .split('/')\n .filter(Boolean)\n .map((segment) => segment.replace(/^:/, '').replace(/\\?$/, ''))\n .map((segment) =>\n segment\n .split(/[-_.]/)\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(''),\n )\n .join('');\n}\n\n/** Higher wins in `dedupeRoutes`. */\nfunction routeScore(route: WebRoute): number {\n const isPage = route.layout ? 0 : 2;\n const hasRealName = route.screenName === screenNameFromPath(route.path) ? 0 : 1;\n return isPage + hasRealName;\n}\n\n/**\n * Match a navigated-to concrete path (e.g. `/vehicles/123`) against the\n * route table, honoring `:param` segments. Returns the matched screen\n * name, or undefined.\n */\nexport function resolvePathToScreen(routes: WebRoute[], target: string): string | undefined {\n const normalized = `/${target}`.replace(/\\/+/g, '/').replace(/\\?.*$/, '').replace(/#.*$/, '');\n const cleaned = normalized.length > 1 ? normalized.replace(/\\/$/, '') : normalized;\n\n const exact = routes.find((r) => r.path === cleaned);\n if (exact) return exact.screenName;\n\n const targetSegments = cleaned.split('/').filter(Boolean);\n for (const route of routes) {\n const routeSegments = route.path.split('/').filter(Boolean);\n if (routeSegments.length !== targetSegments.length) continue;\n const matches = routeSegments.every(\n (seg, i) => seg.startsWith(':') || seg === '*' || seg === targetSegments[i],\n );\n if (matches) return route.screenName;\n }\n return undefined;\n}\n","import type { ActionDescriptor, AnalyzerConfig, ScreenDescriptor } from '../../types';\nimport type {\n PlatformAnalyzer,\n PlatformAnalyzerOptions,\n PlatformAnalyzerResult,\n} from '../PlatformAnalyzer';\nimport { WebScreenAnalyzer, type WebScreenCandidate } from './WebScreenAnalyzer';\nimport { WebNavigationAnalyzer, resolvePathToScreen, type WebRoute } from './WebNavigationAnalyzer';\n\n/**\n * `PlatformAnalyzer` for React web apps (`.appilotsrc` `platform:\n * \"web\"`) — source-level inference instead of the manifest-only path\n * `GenericPlatformAnalyzer` provides. Orchestrates:\n *\n * - `WebScreenAnalyzer` — screens, forms, actions, collections from\n * DOM-vocabulary JSX (`onClick`, `data-testid`, `type=`, ...)\n * - `WebNavigationAnalyzer` — a navigation graph from React Router\n * configuration (`createBrowserRouter`, `<Route path element>`)\n *\n * The screen analyzer records navigation targets as ROUTE PATHS\n * (`/vehicles/new`); this orchestrator owns the route table and\n * resolves them to screen names, leaving unresolved paths as-is (still\n * useful to the agent, and valid against the wire schema).\n *\n * Strict-screen filtering (on by default, like RN): a file counts as a\n * screen when it calls `registerScreen()`, matches a screen glob\n * (web defaults: `pages/`, `routes/`, `views/`, `app/`, `*Page`/\n * `*Screen`/`*View`), or its component is rendered by a detected route\n * — that last rule is what \"the detected route patterns\" adds over\n * static globs.\n *\n * A declared `appilots.manifest.json` still merges ON TOP of this\n * analyzer's output in `MCPGenerator` (manifest wins on a screen-name\n * conflict) — same precedence as every other platform.\n */\nexport class ReactWebPlatformAnalyzer implements PlatformAnalyzer {\n readonly platform = 'web';\n\n async analyze(\n config: AnalyzerConfig,\n options: PlatformAnalyzerOptions,\n ): Promise<PlatformAnalyzerResult> {\n const screenAnalyzer = new WebScreenAnalyzer(config, {\n screenPatterns: options.screenPatterns,\n });\n const navigationAnalyzer = new WebNavigationAnalyzer(config, {\n navigationInclude: options.navigationInclude,\n navigationExclude: options.navigationExclude,\n });\n\n console.log('[ReactWebPlatformAnalyzer] Running analyzers...');\n const [screenAnalysis, navigationResult] = await Promise.all([\n screenAnalyzer.analyze(),\n navigationAnalyzer.analyze(),\n ]);\n\n const routeScreenNames = new Set(navigationResult.routes.map((route) => route.screenName));\n const strictScreens = options.strictScreens ?? true;\n\n let screensFilteredOut = 0;\n const included: WebScreenCandidate[] = [];\n for (const candidate of screenAnalysis.candidates) {\n if (!strictScreens || this.isScreen(candidate, routeScreenNames)) {\n included.push(candidate);\n } else {\n screensFilteredOut++;\n }\n }\n\n const screens = included.map((candidate) =>\n this.resolveRoutePaths(candidate.descriptor, navigationResult.routes),\n );\n\n console.log(\n `[ReactWebPlatformAnalyzer] Screen and navigation analysis complete. Found ${screens.length} screens, ${navigationResult.routes.length} routes`,\n );\n\n return {\n screens,\n navigation: navigationResult.graph,\n analyzedFiles: screenAnalysis.analyzedFiles,\n ...(screensFilteredOut > 0 ? { screensFilteredOut } : {}),\n };\n }\n\n private isScreen(candidate: WebScreenCandidate, routeScreenNames: Set<string>): boolean {\n return (\n candidate.hasRegisterScreen ||\n candidate.matchesScreenPattern ||\n routeScreenNames.has(candidate.descriptor.name)\n );\n }\n\n /** Replace route-path references with screen names where the route table resolves them. */\n private resolveRoutePaths(screen: ScreenDescriptor, routes: WebRoute[]): ScreenDescriptor {\n const resolve = (target: string | undefined): string | undefined => {\n if (!target || !target.startsWith('/')) return target;\n return resolvePathToScreen(routes, target) ?? target;\n };\n\n const navigationTargets = Array.from(\n new Set(\n screen.navigationTargets\n .map((target) => resolve(target)!)\n // A screen linking to itself isn't a navigation the agent cares about.\n .filter((target) => target !== screen.name),\n ),\n ).sort();\n\n const actions = screen.actions.map((action): ActionDescriptor => {\n const resolved = resolve(action.targetScreen);\n return resolved === action.targetScreen ? action : { ...action, targetScreen: resolved };\n });\n\n const collections = screen.collections?.map((collection) => {\n const resolveRow = (row: typeof collection.rowAction) => {\n if (!row?.targetScreen) return row;\n const resolved = resolve(row.targetScreen);\n if (resolved === row.targetScreen) return row;\n return {\n ...row,\n targetScreen: resolved,\n ...(row.description ? { description: `Clicking a row opens ${resolved}` } : {}),\n };\n };\n const rowAction = resolveRow(collection.rowAction);\n return {\n ...collection,\n ...(rowAction ? { rowAction } : {}),\n ...(collection.rowActions\n ? { rowActions: collection.rowActions.map((row) => resolveRow(row)!) }\n : {}),\n };\n });\n\n return {\n ...screen,\n navigationTargets,\n actions,\n ...(collections ? { collections } : {}),\n };\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { screenDescriptorSchema, navigationGraphSchema } from '@appilots/shared/validators';\nimport type { NavigationGraph, ScreenDescriptor } from '../types';\nimport { stringifyUnknown } from '../utils/stringify';\n\n/**\n * Default manifest filename, resolved relative to the project's\n * `rootDir` unless `.appilotsrc`'s `manifestPath` overrides it.\n */\nexport const DEFAULT_MANIFEST_FILENAME = 'appilots.manifest.json';\n\n/**\n * A declared, hand-authored (or externally generated) application\n * structure map — the manifest-mode integration path for any platform\n * that doesn't have a source-level `PlatformAnalyzer` yet. Screens here\n * use the exact same `ScreenDescriptor` shape the AST analyzers produce\n * (validated against `@appilots/shared`'s `screenDescriptorSchema`, the\n * same schema the formal `MCPDocument` wire contract uses), so a\n * manifest and an AST-derived screen merge without any shape\n * translation.\n */\nexport interface AppilotsManifest {\n /** Informational; not the MCPDocument's own `version` field. */\n version?: string;\n screens: ScreenDescriptor[];\n /** Optional — merged into the analyzer-derived navigation graph. */\n navigation?: Partial<NavigationGraph>;\n}\n\nconst manifestSchema = z\n .object({\n version: z.string().optional(),\n screens: z.array(screenDescriptorSchema).default([]),\n navigation: navigationGraphSchema.partial().optional(),\n })\n .passthrough();\n\nexport interface LoadManifestResult {\n /** `null` when no manifest file exists at the resolved path — not an error. */\n manifest: AppilotsManifest | null;\n /** Absolute path the manifest was (or would be) read from. */\n resolvedPath: string;\n}\n\n/**\n * Resolve and load `appilots.manifest.json` (or `manifestPath` from\n * `.appilotsrc`) from `rootDir`. Returns `{ manifest: null }` when the\n * file doesn't exist — manifest mode is opt-in, not required — but\n * throws a descriptive error when the file exists and is unparseable\n * JSON or fails `screenDescriptorSchema`/`navigationGraphSchema`\n * validation, so a typo'd manifest fails loudly instead of silently\n * contributing zero screens.\n */\nexport async function loadManifest(\n rootDir: string,\n manifestPath?: string,\n): Promise<LoadManifestResult> {\n const resolvedPath = path.resolve(rootDir, manifestPath || DEFAULT_MANIFEST_FILENAME);\n\n let raw: string;\n try {\n raw = await readFile(resolvedPath, 'utf-8');\n } catch (error: any) {\n if (error?.code === 'ENOENT') {\n return { manifest: null, resolvedPath };\n }\n throw new Error(\n `Failed to read Appilots manifest at ${resolvedPath}: ${stringifyUnknown(error)}`,\n );\n }\n\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(raw);\n } catch (error) {\n throw new Error(\n `Appilots manifest at ${resolvedPath} is not valid JSON: ${stringifyUnknown(error)}`,\n );\n }\n\n const result = manifestSchema.safeParse(parsedJson);\n if (!result.success) {\n const issues = result.error.issues\n .slice(0, 10)\n .map((issue) => ` - ${issue.path.join('.') || '(root)'}: ${issue.message}`)\n .join('\\n');\n throw new Error(\n `Appilots manifest at ${resolvedPath} failed validation:\\n${issues}\\n` +\n 'Each entry in \"screens\" must match the ScreenDescriptor shape (see docs/platform-integration.md).',\n );\n }\n\n return { manifest: result.data as AppilotsManifest, resolvedPath };\n}\n\n/**\n * Merge one declared screen on top of the analyzer's screen of the same\n * name, KEY BY KEY.\n *\n * Whole-screen replacement is what this used to do, and it made the\n * manifest useless for the case it is most needed in: naming the handful\n * of controls the analyzer could not name. Declaring two `targets` on a\n * screen the analyzer already understood threw away its components,\n * forms, actions and navigation — so the only safe way to add one target\n * was to restate the entire screen by hand and keep it in sync forever.\n * A declaration that rots the moment it is written is worse than no\n * declaration, because the model believes it.\n *\n * The rules, in the order a reader will ask about them:\n *\n * - A key the manifest does not declare is inherited from the analyzer.\n * - `targets` and `actions` merge BY `id` — the manifest entry wins for\n * an id both sides know, and ids only the manifest knows are appended.\n * This is the whole point: \"add the back button the analyzer missed\"\n * must not mean \"forget the twelve it found\".\n * - `agentHints` merges per key, for the same reason: declaring\n * `safetyNotes` must not silently drop `primaryGoal`.\n * - Every other declared key replaces wholesale. Those arrays have no\n * stable identity to merge on, so anything cleverer would be guessing.\n *\n * An EMPTY array in the manifest means \"nothing to add\", not \"delete what\n * the analyzer found\". `screenDescriptorSchema` defaults `components`,\n * `forms`, `actions` and `navigationTargets` to `[]`, so after parsing\n * there is no way to tell an omitted key from one declared empty — and\n * of the two readings, inheriting is the one that cannot silently\n * destroy a screen.\n */\nfunction mergeScreen(base: ScreenDescriptor, declared: ScreenDescriptor): ScreenDescriptor {\n const fields: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(declared)) {\n if (value === undefined) continue;\n if (Array.isArray(value) && value.length === 0) continue;\n fields[key] = value;\n }\n\n const merged = fields as unknown as ScreenDescriptor;\n\n merged.targets = mergeById(base.targets, markManifestOrigin(declared.targets));\n merged.actions = mergeById(base.actions, declared.actions) ?? [];\n\n if (base.agentHints || declared.agentHints) {\n merged.agentHints = { ...base.agentHints, ...declared.agentHints };\n }\n\n return merged;\n}\n\n/**\n * Merge two id-bearing lists, overlay winning per id, order stable:\n * base order first, then the overlay-only entries in declaration order.\n */\nfunction mergeById<T extends { id: string }>(\n base: T[] | undefined,\n overlay: T[] | undefined,\n): T[] | undefined {\n if (!overlay || overlay.length === 0) return base;\n if (!base || base.length === 0) return overlay;\n\n const byId = new Map<string, T>();\n for (const entry of base) byId.set(entry.id, entry);\n for (const entry of overlay) {\n const existing = byId.get(entry.id);\n byId.set(entry.id, existing ? { ...existing, ...entry } : entry);\n }\n return Array.from(byId.values());\n}\n\n/**\n * Stamp `origin: 'manifest'` on hand-declared targets.\n *\n * The runtime already refuses to let an inferred identifier pass for a\n * declared one (`provenance` on the snapshot). A target read out of the\n * source and a target somebody typed into a JSON file are just as\n * different, and the document is the only place that difference can be\n * recorded — the analyzer cannot see the manifest, and the manifest\n * cannot see the source. A declaration that no longer matches the app is\n * the failure mode here, so the model must be able to tell which claims\n * were never checked against code.\n */\nfunction markManifestOrigin(targets: ScreenDescriptor['targets']): ScreenDescriptor['targets'] {\n if (!targets || targets.length === 0) return targets;\n return targets.map((target) => ({ origin: 'manifest' as const, ...target }));\n}\n\n/**\n * Merge a declared manifest's screens on top of analyzer-derived screens.\n * A screen only one side knows about passes through unchanged; a screen\n * both sides know is merged key by key (see `mergeScreen`).\n */\nexport function mergeManifestScreens(\n analyzerScreens: ScreenDescriptor[],\n manifestScreens: ScreenDescriptor[] | undefined,\n): ScreenDescriptor[] {\n if (!manifestScreens || manifestScreens.length === 0) return analyzerScreens;\n\n const byName = new Map<string, ScreenDescriptor>();\n for (const screen of analyzerScreens) byName.set(screen.name, screen);\n for (const declared of manifestScreens) {\n const base = byName.get(declared.name);\n byName.set(\n declared.name,\n base\n ? mergeScreen(base, declared)\n : { ...declared, targets: markManifestOrigin(declared.targets) },\n );\n }\n return Array.from(byName.values());\n}\n\n/**\n * Merge a declared manifest's (partial) navigation graph on top of the\n * analyzer-derived one. Manifest entries win per-key; arrays are\n * concatenated (manifest navigators appended after analyzer ones).\n */\nexport function mergeManifestNavigation(\n analyzerNavigation: NavigationGraph,\n manifestNavigation: Partial<NavigationGraph> | undefined,\n): NavigationGraph {\n if (!manifestNavigation) return analyzerNavigation;\n return {\n initialScreen: manifestNavigation.initialScreen ?? analyzerNavigation.initialScreen,\n screens: { ...analyzerNavigation.screens, ...(manifestNavigation.screens ?? {}) },\n navigators: [...analyzerNavigation.navigators, ...(manifestNavigation.navigators ?? [])],\n };\n}\n","export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n","export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n","import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n","import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n","import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n","export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n","import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n","/**\n * Formal, versioned schema for the MCP Document — the design-time\n * \"application structure\" map the CLI (`@appilots/cli`, published from\n * `packages/mcp-generator`) uploads via `POST /cli/sync`, and that the\n * relay/prompt/grounding pipeline in `apps/api` reads at request time.\n *\n * This mirrors the TypeScript interfaces in\n * `packages/mcp-generator/src/types/index.ts` and\n * `packages/mcp-generator/src/generators/types.ts` — those files stay the\n * generator's own authoring types (produced by the React-Native-specific\n * analyzer), while THIS module is the wire contract every producer\n * (today's RN analyzer, and any future platform generator) is validated\n * against at the API boundary.\n *\n * Design rules (multi-platform prep, additive/backward-compatible):\n * - Every object uses `.passthrough()` so a newer generator can add\n * fields without the server rejecting the whole document.\n * - Fields with a known closed set (`navigatorType`, `locator.source`,\n * ...) are modeled as `z.enum([...]).or(z.string())` — the known\n * values get autocomplete/docs, but an unrecognized string (e.g. a\n * future native adapter's own locator source) still validates.\n * - Nothing here is renamed relative to the existing MCPDocument shape\n * the CLI already emits — this schema DESCRIBES today's wire shape,\n * it does not change it.\n * - `/cli/sync` validates documents LENIENTLY (see apps/api's cli\n * routes): a document that fails this schema is still accepted and\n * stored, just logged as a structured warning. This schema is a\n * documentation + observability tool first, an enforcement gate\n * later (once every generator in the wild is known to conform).\n */\n\nimport { z } from 'zod';\n\n// ── Version ──────────────────────────────────────────────────────\n\n/**\n * Schema version of THIS module (the wire contract), independent of the\n * `MCPDocument.version` field (the generator's own doc version, e.g.\n * \"1.0\"). Bump when a breaking change is made to this file — additive\n * changes (new optional fields) do not require a bump.\n */\nexport const MCP_DOCUMENT_SCHEMA_VERSION = '1.0.0';\n\n// ── Locator ──────────────────────────────────────────────────────\n\n/**\n * Known locator sources today are React-Native-flavored\n * (`appilotsId`/`testID`/`accessibilityLabel`), but the field has always\n * been an open string on the TS side. This schema keeps it open and adds\n * documented values a non-RN platform is expected to use: native\n * accessibility identifiers (iOS `accessibilityIdentifier`), Android\n * `resource-id`, and web `data-*` / `aria-*` attributes. No renaming —\n * these are additional ACCEPTED VALUES for the existing `source` field.\n */\nexport const locatorSourceSchema = z\n .enum([\n 'appilotsId',\n 'testID',\n 'accessibilityLabel',\n 'label',\n 'inferred',\n // Non-RN platform values (additive — see module docstring):\n 'accessibilityIdentifier', // iOS (XCUITest / UIAccessibility)\n 'resource-id', // Android (UiAutomator / Espresso)\n 'data-testid', // Web (Testing Library convention)\n 'aria-label', // Web (ARIA)\n ])\n .or(z.string().min(1).max(60));\n\nexport const locatorDescriptorSchema = z\n .object({\n id: z.string().optional(),\n appilotsId: z.string().optional(),\n testID: z.string().optional(),\n accessibilityLabel: z.string().optional(),\n label: z.string().optional(),\n source: locatorSourceSchema.optional(),\n })\n .passthrough();\n\n// ── Signals / wait policy ──────────────────────────────────────────\n\nexport const signalDescriptorSchema = z\n .object({\n type: z\n .enum([\n 'navigation',\n 'goBack',\n 'toast',\n 'modal',\n 'inline-error',\n 'data-arrival',\n 'loading',\n 'none',\n ])\n .or(z.string().min(1).max(60)),\n target: z.string().optional(),\n description: z.string().optional(),\n })\n .passthrough();\n\nexport const appilotsInferredActionSchema = z\n .object({\n isAsyncTrigger: z.boolean().optional(),\n expectedOutcome: z\n .enum(['navigation', 'inline-feedback', 'data-arrival', 'mixed', 'none'])\n .optional(),\n loadingStateBindings: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport const waitPolicyDescriptorSchema = z\n .object({\n expectedOutcome: z.string().optional(),\n signals: z.array(signalDescriptorSchema).optional(),\n maxMs: z.number().finite().optional(),\n })\n .passthrough();\n\n// ── Targets / flows ──────────────────────────────────────────────\n\nexport const targetDescriptorRoleSchema = z\n .enum([\n 'button',\n 'submit',\n 'input',\n 'toggle',\n 'select',\n 'date',\n 'list',\n 'row',\n 'menuItem',\n 'modal',\n 'custom',\n ])\n .or(z.string().min(1).max(60));\n\n/**\n * Who put this target in the document.\n *\n * `analyzer` = read out of the app's own source, so it was true of the\n * code at generation time. `manifest` = hand-declared in\n * `appilots.manifest.json`, which nothing verifies against the source —\n * it stays in the document after the control it names is renamed or\n * deleted.\n *\n * This is the document-side twin of `identityProvenance` on the runtime\n * snapshot, and it exists for the same reason: a claim nobody checked\n * must not read like one that was checked. ABSENT is not `analyzer` —\n * every document generated before this field existed omits it, and\n * reading a missing value as verified would make an old document look\n * more trustworthy than a new one that admits where its targets came\n * from.\n *\n * Open-ended like the other descriptor enums, so a future non-AST source\n * (a recorded session, a design file) can name itself rather than being\n * rejected.\n */\nexport const targetOriginSchema = z.enum(['analyzer', 'manifest']).or(z.string().min(1).max(40));\n\nexport const targetDescriptorSchema = z\n .object({\n id: z.string(),\n role: targetDescriptorRoleSchema,\n label: z.string().optional(),\n locator: locatorDescriptorSchema.optional(),\n handler: z.string().optional(),\n actionId: z.string().optional(),\n fieldName: z.string().optional(),\n targetScreen: z.string().optional(),\n destructive: z.boolean().optional(),\n requiresConfirmation: z.boolean().optional(),\n opensModal: z.string().optional(),\n opensBottomSheet: z.string().optional(),\n sourceComponent: z.string().optional(),\n origin: targetOriginSchema.optional(),\n })\n .passthrough();\n\nexport const flowStepDescriptorSchema = z\n .object({\n type: z\n .enum([\n 'navigate',\n 'fill',\n 'press',\n 'select',\n 'toggle',\n 'wait',\n 'confirm',\n 'choose-list-item',\n ])\n .or(z.string().min(1).max(60)),\n target: z.string().optional(),\n label: z.string().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n })\n .passthrough();\n\nexport const flowDescriptorSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n intent: z\n .enum(['navigate', 'form_submit', 'list_action', 'destructive_action', 'inline_action'])\n .or(z.string().min(1).max(60)),\n steps: z.array(flowStepDescriptorSchema),\n waitPolicy: waitPolicyDescriptorSchema.optional(),\n safetyNotes: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport const screenAgentHintsSchema = z\n .object({\n primaryGoal: z.string().optional(),\n commonTasks: z.array(z.string()).optional(),\n preferredTargets: z.array(z.string()).optional(),\n waitPolicy: waitPolicyDescriptorSchema.optional(),\n safetyNotes: z.array(z.string()).optional(),\n })\n .passthrough();\n\n// ── Components ─────────────────────────────────────────────────────\n\nexport interface ComponentDescriptorShape {\n name: string;\n type?: string;\n props?: Record<string, string>;\n children?: ComponentDescriptorShape[];\n testID?: string;\n accessibilityLabel?: string;\n [key: string]: unknown;\n}\n\n/** Recursive — a component may nest children of the same shape. */\nexport const componentDescriptorSchema: z.ZodType<ComponentDescriptorShape> = z.lazy(() =>\n z\n .object({\n name: z.string(),\n type: z\n .enum(['view', 'input', 'button', 'list', 'modal', 'custom'])\n .or(z.string())\n .optional(),\n props: z.record(z.string()).optional(),\n children: z.array(componentDescriptorSchema).optional(),\n testID: z.string().optional(),\n accessibilityLabel: z.string().optional(),\n })\n .passthrough(),\n);\n\n// ── Forms ──────────────────────────────────────────────────────────\n\nexport const formFieldDescriptorSchema = z\n .object({\n name: z.string(),\n label: z.string().optional(),\n type: z\n .enum(['text', 'number', 'email', 'phone', 'select', 'toggle', 'date', 'custom'])\n .or(z.string()),\n required: z.boolean(),\n placeholder: z.string().optional(),\n options: z.array(z.object({ label: z.string(), value: z.string() }).passthrough()).optional(),\n defaultValue: z.unknown().optional(),\n locator: locatorDescriptorSchema.optional(),\n sourceComponent: z.string().optional(),\n valueBinding: z.string().optional(),\n errorBinding: z.string().optional(),\n })\n .passthrough();\n\nexport const formDescriptorSchema = z\n .object({\n id: z.string(),\n fields: z.array(formFieldDescriptorSchema),\n submitAction: z.string().optional(),\n validationRules: z.record(z.string()).optional(),\n })\n .passthrough();\n\n// ── Collections / lists ──────────────────────────────────────────\n\nexport const rowActionDescriptorSchema = z\n .object({\n type: z.enum(['navigation', 'custom']).or(z.string()),\n targetScreen: z.string().optional(),\n params: z.record(z.string()).optional(),\n handler: z.string().optional(),\n description: z.string().optional(),\n })\n .passthrough();\n\nexport const collectionDescriptorSchema = z\n .object({\n id: z.string(),\n // Known RN component names, plus an open string for non-RN\n // collection/list implementations (e.g. a web virtualized grid).\n component: z\n .enum(['FlatList', 'SectionList', 'VirtualizedList', 'FlashList', 'ScrollView'])\n .or(z.string()),\n itemType: z.string().optional(),\n dataSource: z.string().optional(),\n keyField: z.string().optional(),\n renderItem: z.string().optional(),\n displayFields: z.array(z.string()).optional(),\n rowAction: rowActionDescriptorSchema.optional(),\n rowActions: z.array(rowActionDescriptorSchema).optional(),\n identityFields: z.array(z.string()).optional(),\n searchField: z.string().optional(),\n })\n .passthrough();\n\n// ── Actions ──────────────────────────────────────────────────────\n\nexport const actionDescriptorSchema = z\n .object({\n id: z.string(),\n type: z.enum(['navigation', 'submit', 'api_call', 'state_change', 'custom']).or(z.string()),\n label: z.string().optional(),\n description: z.string().optional(),\n targetScreen: z.string().optional(),\n handler: z.string().optional(),\n locator: locatorDescriptorSchema.optional(),\n sourceComponent: z.string().optional(),\n opensModal: z.string().optional(),\n opensBottomSheet: z.string().optional(),\n successSignal: signalDescriptorSchema.optional(),\n failureSignal: signalDescriptorSchema.optional(),\n nativeConfirmationExpected: z.boolean().optional(),\n destructive: z.boolean().optional(),\n effect: z.enum(['read', 'write', 'destructive']).or(z.string()).optional(),\n riskLevel: z.enum(['low', 'medium', 'high']).or(z.string()).optional(),\n requiresConfirmation: z.boolean().optional(),\n appilotsInferred: appilotsInferredActionSchema.optional(),\n })\n .passthrough();\n\n// ── Screens ──────────────────────────────────────────────────────\n\nexport const screenPermissionDescriptorSchema = z\n .object({\n agentAccess: z.enum(['read', 'write', 'none']).optional(),\n requiresConfirmation: z.boolean().optional(),\n blockedActions: z.array(z.string()).optional(),\n isPii: z.boolean().optional(),\n })\n .passthrough();\n\nexport const screenDescriptorSchema = z\n .object({\n name: z.string(),\n filePath: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n components: z.array(componentDescriptorSchema).default([]),\n forms: z.array(formDescriptorSchema).default([]),\n actions: z.array(actionDescriptorSchema).default([]),\n navigationTargets: z.array(z.string()).default([]),\n agentHints: screenAgentHintsSchema.optional(),\n targets: z.array(targetDescriptorSchema).optional(),\n flows: z.array(flowDescriptorSchema).optional(),\n collections: z.array(collectionDescriptorSchema).optional(),\n suggestedPrompts: z.array(z.string()).optional(),\n permissions: screenPermissionDescriptorSchema.optional(),\n isPii: z.boolean().optional(),\n })\n .passthrough();\n\n// ── Navigation ─────────────────────────────────────────────────────\n\n/**\n * Known values are the React Navigation container types. The union\n * stays open (item 3a of the multi-platform contract effort) so a\n * non-RN generator can describe its own container semantics\n * (e.g. `'navigation-stack'` for iOS UIKit, `'fragment-backstack'` for\n * Android) without the schema rejecting the document. Server-side, the\n * relay special-cases `'stack' | 'tab' | 'drawer'` (RN nested-nav path\n * inference) and, for `context.platform === 'web'`, reads the\n * documented web convention `'route'` + a `path` template on the node\n * (see `navigationNodeSchema.path`); anything else degrades to generic\n * handling (see apps/api's relay/platform module).\n */\nexport const navigatorTypeSchema = z.enum(['stack', 'tab', 'drawer']).or(z.string().min(1).max(60));\n\nexport const paramDescriptorSchema = z\n .object({\n name: z.string(),\n type: z.string(),\n required: z.boolean(),\n defaultValue: z.unknown().optional(),\n })\n .passthrough();\n\n/**\n * `navigationAction` semantics (see `navigationPayloadSchema` in\n * `validators/index.ts`) map to React Navigation verbs 1:1 today. For a\n * future non-RN adapter, the intended mapping is:\n *\n * - `push` → push a new screen onto the current stack/back-stack\n * (iOS `UINavigationController.pushViewController`,\n * Android `FragmentTransaction.addToBackStack` / Jetpack\n * Navigation `navigate` with default launchSingleTop, web\n * `history.pushState`).\n * - `navigate` → go to a screen, reusing an existing instance in the\n * stack if already present (React Navigation's own\n * dedupe behavior) — no exact native equivalent; the\n * safest non-RN mapping is \"pop to it if present in the\n * back-stack, else push\".\n * - `replace` → swap the current top screen instead of stacking\n * (iOS `setViewControllers` replacing the last element,\n * Android `FragmentTransaction.replace`, web\n * `history.replaceState`).\n * - `goBack` → pop one entry (iOS `popViewController`, Android\n * `onBackPressed` / `NavController.popBackStack`, web\n * `history.back()`).\n * - `reset` → clear the stack/back-stack and set new root(s) (iOS\n * `setViewControllers([...], animated:)`, Android\n * `popBackStack` to root + `navigate` with\n * `popUpTo(graph.id) { inclusive = true }`, web\n * `history.replaceState` after clearing SPA route\n * state).\n */\nexport const navigationNodeSchema = z\n .object({\n screenName: z.string(),\n navigatorType: navigatorTypeSchema,\n parentNavigator: z.string().optional(),\n reachableFrom: z.array(z.string()).default([]),\n reachableTo: z.array(z.string()).default([]),\n params: z.array(paramDescriptorSchema).optional(),\n /**\n * Web clients only (documented convention, additive — previously\n * round-tripped via `.passthrough()`): the screen's URL route\n * template, e.g. `/users/:id`. Param segments use `:name` (the\n * relay also accepts `[name]` / `{name}`). When present and the\n * request's `context.platform` is `'web'`, the relay resolves\n * `navigate` targets against these templates and injects the\n * concrete URL segments as the navigate payload's `path` — the web\n * equivalent of RN's nested-navigation path injection. See\n * docs/agent-contract.md (\"Web clients\" section).\n */\n path: z.string().max(500).optional(),\n })\n .passthrough();\n\nexport const navigatorDescriptorSchema = z\n .object({\n name: z.string(),\n type: navigatorTypeSchema,\n screens: z.array(z.string()),\n parentNavigator: z.string().optional(),\n })\n .passthrough();\n\nexport const navigationGraphSchema = z\n .object({\n screens: z.record(navigationNodeSchema).default({}),\n initialScreen: z.string(),\n navigators: z.array(navigatorDescriptorSchema).default([]),\n /**\n * Dev-declared escape hatch (see `buildScreenPathMap` in\n * apps/api's grounding module) — explicit screenName → nav-path\n * overrides for apps whose navigator convention the heuristics\n * can't infer. Not part of the original TS interface (it's read\n * ad-hoc as `mcpContent.navigation.pathOverrides`), included here\n * so it round-trips through validation instead of silently\n * surviving only via `.passthrough()`.\n */\n pathOverrides: z.record(z.array(z.string())).optional(),\n })\n .passthrough();\n\n// ── Metadata ───────────────────────────────────────────────────────\n\nexport const mcpMetadataSchema = z\n .object({\n generatorVersion: z.string(),\n appVersion: z.string().optional(),\n totalScreens: z.number().int().nonnegative(),\n totalForms: z.number().int().nonnegative(),\n totalActions: z.number().int().nonnegative(),\n analyzedFiles: z.number().int().nonnegative(),\n screensFilteredOut: z.number().int().nonnegative().optional(),\n })\n .passthrough();\n\n// ── Document ───────────────────────────────────────────────────────\n\nexport const mcpDocumentSchema = z\n .object({\n version: z.string(),\n generatedAt: z.string(),\n projectName: z.string(),\n screens: z.array(screenDescriptorSchema).default([]),\n navigation: navigationGraphSchema,\n metadata: mcpMetadataSchema,\n })\n .passthrough();\n\nexport type LocatorDescriptor = z.infer<typeof locatorDescriptorSchema>;\nexport type SignalDescriptor = z.infer<typeof signalDescriptorSchema>;\nexport type TargetDescriptor = z.infer<typeof targetDescriptorSchema>;\nexport type TargetOrigin = z.infer<typeof targetOriginSchema>;\nexport type FlowStepDescriptor = z.infer<typeof flowStepDescriptorSchema>;\nexport type FlowDescriptor = z.infer<typeof flowDescriptorSchema>;\nexport type ScreenAgentHints = z.infer<typeof screenAgentHintsSchema>;\nexport type FormFieldDescriptor = z.infer<typeof formFieldDescriptorSchema>;\nexport type FormDescriptor = z.infer<typeof formDescriptorSchema>;\nexport type CollectionDescriptor = z.infer<typeof collectionDescriptorSchema>;\nexport type ActionDescriptor = z.infer<typeof actionDescriptorSchema>;\nexport type ScreenDescriptor = z.infer<typeof screenDescriptorSchema>;\nexport type NavigationNode = z.infer<typeof navigationNodeSchema>;\nexport type NavigatorDescriptor = z.infer<typeof navigatorDescriptorSchema>;\nexport type NavigationGraph = z.infer<typeof navigationGraphSchema>;\nexport type MCPMetadata = z.infer<typeof mcpMetadataSchema>;\nexport type MCPDocument = z.infer<typeof mcpDocumentSchema>;\n","/**\n * Shared validation schemas using Zod.\n */\n\nimport { z } from 'zod';\n\n// ── MCP Document (formal, versioned contract) ───────────────────\n// See ./mcp-document.ts — the schema for the design-time \"application\n// structure\" doc the CLI uploads via POST /cli/sync. Re-exported here so\n// existing `@appilots/shared/validators` imports (e.g. apps/api's cli\n// routes) can pull it in without a new subpath.\nexport * from './mcp-document';\n\n// ── Auth ───────────────────────────────────────────────────────\n\nexport const loginSchema = z.object({\n email: z.string().email('Invalid email address'),\n password: z.string().min(8, 'Password must be at least 8 characters'),\n});\n\nexport const registerSchema = loginSchema.extend({\n name: z.string().min(2, 'Name must be at least 2 characters').max(100),\n});\n\n// Self-service profile edit (PATCH /auth/me). Email changes are out of\n// scope until an email provider is picked (no verification flow yet).\nexport const updateMeSchema = z\n .object({\n name: z.string().min(2, 'Name must be at least 2 characters').max(100).optional(),\n avatarUrl: z.string().url('Invalid URL').max(2048).nullable().optional(),\n })\n .refine((v) => v.name !== undefined || v.avatarUrl !== undefined, {\n message: 'At least one field must be provided',\n });\n\nexport const changePasswordSchema = z.object({\n currentPassword: z.string().min(1, 'Current password is required'),\n newPassword: z.string().min(8, 'Password must be at least 8 characters'),\n});\n\n// ── MFA (TOTP, RFC 6238) ───────────────────────────────────────\n// A six-digit TOTP code. Kept loose on formatting (spaces are stripped\n// server-side) but strict on shape so a recovery code never lands in a\n// field that only checks TOTP.\nexport const totpCodeSchema = z\n .string()\n .transform((v) => v.replace(/\\s/g, ''))\n .pipe(z.string().regex(/^\\d{6}$/, 'Code must be 6 digits'));\n\n// `xxxxx-xxxxx` over an unambiguous alphabet; the dash and case are\n// optional because people retype these off paper.\nexport const recoveryCodeSchema = z\n .string()\n .transform((v) => v.toUpperCase().replace(/[^A-Z0-9]/g, ''))\n .pipe(z.string().regex(/^[23456789BCDFGHJKMNPQRSTVWXYZ]{10}$/, 'Invalid recovery code'));\n\n/** Confirming setup — only a TOTP code proves the app was enrolled. */\nexport const mfaVerifySchema = z.object({\n code: totpCodeSchema,\n});\n\n/**\n * Second factor at login. Exactly one of the two: a recovery code is a\n * legitimate way in when the authenticator is gone, but accepting both\n * at once would let a caller probe the two namespaces in one request.\n */\nexport const mfaChallengeSchema = z\n .object({\n challengeToken: z.string().min(1, 'Challenge token is required'),\n code: totpCodeSchema.optional(),\n recoveryCode: recoveryCodeSchema.optional(),\n })\n .refine((v) => Boolean(v.code) !== Boolean(v.recoveryCode), {\n message: 'Provide either a TOTP code or a recovery code',\n path: ['code'],\n });\n\n/**\n * Turning MFA off, and re-minting recovery codes, both need the current\n * password AND a second factor: a hijacked session must not be able to\n * strip the protection it is supposed to be defeating.\n */\nexport const mfaDisableSchema = z\n .object({\n password: z.string().min(1, 'Password is required'),\n code: totpCodeSchema.optional(),\n recoveryCode: recoveryCodeSchema.optional(),\n })\n .refine((v) => Boolean(v.code) !== Boolean(v.recoveryCode), {\n message: 'Provide either a TOTP code or a recovery code',\n path: ['code'],\n });\n\nexport const mfaRegenerateRecoveryCodesSchema = z.object({\n password: z.string().min(1, 'Password is required'),\n code: totpCodeSchema,\n});\n\n// ── Account deletion (LGPD art. 18, VI) ────────────────────────\n// `DELETE /users/me`. Unlike `mfaDisableSchema`, the second factor is\n// optional HERE and required by the ROUTE only when the account\n// actually has MFA enabled — the schema cannot know that, and demanding\n// a code from an account without MFA would make the endpoint\n// unreachable for most users. At most one of the two, same as\n// everywhere else that spends a factor.\n//\n// `confirm` is a literal, not a boolean: a client that sends\n// `{confirm: true}` by accident (a checkbox bound to the wrong field, a\n// JSON default) does not delete an account, and the string it must send\n// spells out what is about to happen.\nexport const deleteAccountSchema = z\n .object({\n password: z.string().min(1, 'Password is required'),\n code: totpCodeSchema.optional(),\n recoveryCode: recoveryCodeSchema.optional(),\n confirm: z.literal('DELETE MY ACCOUNT'),\n })\n .refine((v) => !(v.code && v.recoveryCode), {\n message: 'Provide either a TOTP code or a recovery code, not both',\n path: ['code'],\n });\n\n// ── Project ────────────────────────────────────────────────────\n\nexport const createProjectSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n // Reference to a tenant-scoped provider (preferred). Optional at\n // creation so a project can be created and configured later.\n providerId: z.string().min(1).optional(),\n systemPrompt: z.string().max(4096).optional(),\n});\n\nexport const updateProjectSchema = createProjectSchema.partial();\n\n// ── Provider ───────────────────────────────────────────────────\n\nexport const providerKindSchema = z.enum(['openai', 'anthropic', 'custom']);\n\nexport const createProviderSchema = z\n .object({\n name: z.string().min(1).max(100),\n provider: providerKindSchema,\n model: z.string().min(1).max(200),\n baseUrl: z.string().url().optional(),\n apiKey: z.string().min(1),\n isDefault: z.boolean().optional(),\n })\n .refine((v) => v.provider !== 'custom' || !!v.baseUrl, {\n message: 'baseUrl is required when provider is \"custom\"',\n path: ['baseUrl'],\n });\n\n// On update everything is optional. apiKey is omitted unless rotating.\nexport const updateProviderSchema = z.object({\n name: z.string().min(1).max(100).optional(),\n provider: providerKindSchema.optional(),\n model: z.string().min(1).max(200).optional(),\n baseUrl: z.string().url().nullable().optional(),\n apiKey: z.string().min(1).optional(),\n isDefault: z.boolean().optional(),\n});\n\n// ── MCP Document ───────────────────────────────────────────────\n\nexport const uploadMCPDocumentSchema = z.object({\n projectId: z.string().min(1),\n version: z.string().default('1.0'),\n content: z.record(z.unknown()),\n});\n\n// ── API Key ────────────────────────────────────────────────────\n\n/**\n * `sdk` — mints the existing project-scoped key that drives the mobile\n * agent surface. `operator` — mints a workspace-wide key (no project)\n * that lets a customer's own systems act as a human-support operator\n * against the escalation routes (Operator API feature).\n */\nexport const apiKeyScopeSchema = z.enum(['sdk', 'operator']);\n\n/**\n * Which environment the key speaks for — the ONE fact about a request\n * the caller cannot decline to send, because the key is what\n * authenticates it (#335).\n *\n * `test` — integration, evals, manual QA. Free on every plan and never\n * invoiced. `live` — production. Needs an active plan and bills.\n *\n * No default here on purpose: the route picks it from the workspace's\n * own entitlement, because handing a free workspace a `live` key would\n * hand it a key that 402s on the first session.\n */\nexport const apiKeyEnvironmentSchema = z.enum(['test', 'live']);\n\nexport const createApiKeySchema = z\n .object({\n name: z.string().min(1).max(100),\n // Required for `sdk` (default), forbidden/ignored for `operator` —\n // enforced by the `.refine` below rather than the field itself so a\n // missing scope still validates as the pre-existing SDK shape.\n projectId: z.string().min(1).optional(),\n scope: apiKeyScopeSchema.default('sdk'),\n environment: apiKeyEnvironmentSchema.optional(),\n expiresAt: z.string().datetime().optional(),\n })\n .refine((v) => v.scope !== 'sdk' || !!v.projectId, {\n message: 'projectId is required for scope \"sdk\"',\n path: ['projectId'],\n });\n\n// ── Agent observation context (canonical contract) ─────────────\n//\n// The runtime `context` the SDK sends with /agent/message and\n// /agent/continue — the observation the server grounds action targets\n// against. It used to be accepted as `z.record(z.unknown())` (issue\n// #169): fully client-controlled and unbounded, so a caller could feed an\n// arbitrarily large or malformed observation straight into the relay and\n// the LLM prompt. This schema BOUNDS it (array + string caps = DoS guard)\n// and TYPES the known fields, while staying forward-compatible: every\n// field is optional and nested objects `.passthrough()`, so new SDK\n// snapshot fields never reject a valid client. It is the single shape the\n// relay and every future platform adapter (web, native) can target.\n//\n// Mirrors `RelayRequest['context']` in apps/api ai-relay.ts — keep them in\n// sync when either changes.\n\nconst boundedString = (max: number) => z.string().max(max);\n\n/**\n * Client platform the observation/context was captured on. Additive,\n * optional field for the multi-platform contract effort — existing SDKs\n * (React Native) never send it, and the server treats an ABSENT value as\n * `'react-native'` everywhere it branches on platform (see\n * `resolvePlatformProfile` in apps/api's relay/platform module). Known\n * values get an enum for editor autocomplete / docs; the `.or(z.string())`\n * keeps the field open so a brand-new adapter (e.g. `'flutter'`) can start\n * sending it before the enum is updated, without ever failing validation.\n */\nexport const clientPlatformSchema = z\n .enum(['react-native', 'web', 'android', 'ios'])\n .or(z.string().min(1).max(40));\n\n/**\n * How much a client actually knows about an element's identifier.\n *\n * `declared` = the app wrote the id down (testID / data-testid /\n * accessibilityLabel / aria-label). `derived` = folded out of text the user\n * can read. `positional` = an ordinal valid for one observation only.\n *\n * Open-ended like `clientPlatformSchema`, so a non-React-Native adapter can\n * report a mechanism this enum has not met yet rather than being rejected.\n *\n * ABSENT is not `declared`. Every client published before this field existed\n * omits it, and the server must treat a missing value as UNKNOWN — reading\n * it as the most trustworthy option would make an old SDK look safer than a\n * new one that admits it is guessing.\n */\nexport const identityProvenanceSchema = z\n .enum(['declared', 'derived', 'positional'])\n .or(z.string().min(1).max(40));\n\nconst snapshotInputSchema = z\n .object({\n id: boundedString(160).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n label: boundedString(300).optional(),\n value: boundedString(4096).optional(),\n placeholder: boundedString(300).optional(),\n editable: z.boolean().optional(),\n secure: z.boolean().optional(),\n submitsOnReturn: z.boolean().optional(),\n type: boundedString(40).optional(),\n required: z.boolean().optional(),\n invalid: z.boolean().optional(),\n inModal: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotButtonSchema = z\n .object({\n id: boundedString(160).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n label: boundedString(300).optional(),\n disabled: z.boolean().optional(),\n inModal: z.boolean().optional(),\n risk: boundedString(40).optional(),\n destructive: z.boolean().optional(),\n requiresConfirmation: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotToggleSchema = z\n .object({\n id: boundedString(160).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n label: boundedString(300).optional(),\n value: z.boolean().optional(),\n inModal: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotSliderSchema = z\n .object({\n id: boundedString(160).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n label: boundedString(300).optional(),\n value: z.number().finite().optional(),\n min: z.number().finite().optional(),\n max: z.number().finite().optional(),\n step: z.number().finite().optional(),\n disabled: z.boolean().optional(),\n inModal: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotListSchema = z\n .object({\n index: z.number().int().optional(),\n id: boundedString(160).optional(),\n containerType: boundedString(60).optional(),\n /**\n * Free-form provenance tag for how the SDK discovered this list\n * (today: `'fiber' | 'auto-tracked' | 'registry'` from the RN\n * walker). Left as an open bounded string, not an enum, so a\n * non-RN adapter (web DOM walker, native accessibility-tree walker)\n * can report its own discovery mechanism without a schema change.\n */\n source: boundedString(40).optional(),\n itemCount: z.number().int().optional(),\n visibleItemCount: z.number().int().optional(),\n refreshing: z.boolean().optional(),\n empty: z.boolean().optional(),\n label: boundedString(300).optional(),\n dataPreview: z\n .array(\n z\n .object({\n index: z.number().int().optional(),\n key: boundedString(160).optional(),\n text: boundedString(500).optional(),\n })\n .passthrough(),\n )\n .max(500)\n .optional(),\n scrollOffsetY: z.number().finite().optional(),\n canScrollUp: z.boolean().optional(),\n canScrollDown: z.boolean().optional(),\n // Items/options are bounded by count but passthrough per-item: the SDK\n // adds fields (nested actions, absolute index) faster than this schema\n // should chase, and the relay only reads a known subset.\n items: z.array(z.record(z.unknown())).max(500).optional(),\n })\n .passthrough();\n\n/**\n * A scrollable surface with no rows — a form or detail screen inside a\n * `ScrollView`. Kept apart from `lists` on purpose: an agent told this\n * is a list with zero items will try ordinals against it.\n */\n/**\n * A platform dialog covering the screen. Reported apart from everything\n * else because it lives outside React and nothing behind it is\n * touchable while it is up.\n */\nconst snapshotNativeDialogSchema = z\n .object({\n id: boundedString(160),\n title: boundedString(300).optional(),\n message: boundedString(2000).optional(),\n buttons: z\n .array(\n z\n .object({\n label: boundedString(160),\n style: z.enum(['default', 'cancel', 'destructive']).optional(),\n })\n .passthrough(),\n )\n .max(10),\n })\n .passthrough();\n\nconst snapshotScrollableSchema = z\n .object({\n id: boundedString(160),\n containerType: boundedString(60).optional(),\n label: boundedString(300).optional(),\n scrollOffsetY: z.number().finite().optional(),\n canScrollUp: z.boolean().optional(),\n canScrollDown: z.boolean().optional(),\n horizontal: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotChoiceGroupSchema = z\n .object({\n index: z.number().int().optional(),\n id: boundedString(160).optional(),\n label: boundedString(300).optional(),\n source: boundedString(40).optional(),\n options: z.array(z.record(z.unknown())).max(200).optional(),\n })\n .passthrough();\n\nconst snapshotElementSchema = z\n .object({\n id: boundedString(160).optional(),\n role: boundedString(40).optional(),\n label: boundedString(300).optional(),\n texts: z.array(boundedString(500)).max(50).optional(),\n actions: z.array(boundedString(40)).max(20).optional(),\n disabled: z.boolean().optional(),\n selected: z.boolean().optional(),\n source: boundedString(40).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n targetId: boundedString(160).optional(),\n listContext: z.record(z.unknown()).optional(),\n inModal: z.boolean().optional(),\n })\n .passthrough();\n\nexport const agentSnapshotSchema = z\n .object({\n route: boundedString(200).nullish(),\n title: boundedString(200).nullish(),\n texts: z.array(boundedString(2000)).max(500).optional(),\n inputs: z.array(snapshotInputSchema).max(300).optional(),\n buttons: z.array(snapshotButtonSchema).max(300).optional(),\n toggles: z.array(snapshotToggleSchema).max(300).optional(),\n sliders: z.array(snapshotSliderSchema).max(100).optional(),\n loading: z.boolean().optional(),\n modalOpen: z.boolean().optional(),\n lists: z.array(snapshotListSchema).max(100).optional(),\n choiceGroups: z.array(snapshotChoiceGroupSchema).max(100).optional(),\n scrollables: z.array(snapshotScrollableSchema).max(20).optional(),\n nativeDialog: snapshotNativeDialogSchema.optional(),\n elements: z.array(snapshotElementSchema).max(1000).optional(),\n /**\n * The client clamped this observation to the caps above and lost\n * data doing it (`clampSnapshotToWireLimits` in\n * `@appilots/client-core`). Read by the prompt serializer so the\n * model is told the view is partial — a screen truncated at 500\n * texts must not be read as a screen that only has 500 things on\n * it. Optional: older SDKs never clamp and never send it.\n */\n truncated: z.boolean().optional(),\n /**\n * How many of this screen's controls the client could name, split by\n * `identityProvenance`. Diagnostic only — the relay never grounds an\n * action on it — but it is the number that says whether an app needs\n * annotating, and comparing it between a debug and a release build is\n * the first direct measurement of what minification costs the agent.\n */\n stats: z\n .object({\n visitedFibers: z.number().int().nonnegative().optional(),\n skippedHidden: z.number().int().nonnegative().optional(),\n identity: z\n .object({\n declared: z.number().int().nonnegative().optional(),\n derived: z.number().int().nonnegative().optional(),\n positional: z.number().int().nonnegative().optional(),\n })\n .passthrough()\n .optional(),\n })\n .passthrough()\n .optional(),\n })\n .passthrough();\n\nexport const agentContextSchema = z\n .object({\n /**\n * Client platform this observation was captured on. Optional and\n * additive (see `clientPlatformSchema`) — absent means\n * `'react-native'` for every downstream consumer, so pre-existing\n * SDKs that never set this field keep byte-identical behavior.\n */\n platform: clientPlatformSchema.optional(),\n currentScreen: boundedString(200).optional(),\n formState: z.record(z.unknown()).optional(),\n navigationState: z\n .object({\n currentRouteName: boundedString(200).optional(),\n activePath: z.array(boundedString(200)).max(50).optional(),\n rootRouteNames: z.array(boundedString(200)).max(200).optional(),\n currentRouteNames: z.array(boundedString(200)).max(200).optional(),\n routeNames: z.array(boundedString(200)).max(500).optional(),\n canGoBack: z.boolean().optional(),\n })\n .passthrough()\n .optional(),\n screenMetadata: z\n .object({\n name: boundedString(200).optional(),\n title: boundedString(200).optional(),\n description: boundedString(2000).optional(),\n fields: z.array(z.record(z.unknown())).max(200).optional(),\n actions: z\n .array(z.union([boundedString(200), z.record(z.unknown())]))\n .max(200)\n .optional(),\n })\n .passthrough()\n .optional(),\n snapshot: agentSnapshotSchema.optional(),\n registeredComponents: z\n .array(\n z\n .object({\n id: boundedString(160).optional(),\n kind: boundedString(40).optional(),\n screen: boundedString(200).optional(),\n label: boundedString(300).optional(),\n })\n .passthrough(),\n )\n .max(500)\n .optional(),\n registeredLists: z\n .array(\n z\n .object({\n id: boundedString(160).optional(),\n component: boundedString(200).optional(),\n kind: boundedString(40).optional(),\n itemCount: z.number().int().optional(),\n label: boundedString(300).optional(),\n screen: boundedString(200).optional(),\n refreshing: z.boolean().optional(),\n empty: z.boolean().optional(),\n })\n .passthrough(),\n )\n .max(200)\n .optional(),\n loadingPending: z.boolean().optional(),\n })\n .passthrough();\n\n// ── Introspection health ───────────────────────────────────────\n\n/**\n * Why the SDK could not read the host app's UI tree.\n *\n * - `sentinel-missing-internals`: the SDK mounted but the React runtime\n * did not expose the fiber it needs — a React version we have not\n * validated against. `reactVersion` identifies it.\n * - `never-mounted`: a snapshot was requested before the provider\n * committed, or from outside it. An integration mistake, not a\n * version problem.\n * - `render-crashed`: the SDK's own render surface threw and its error\n * boundary degraded it, unmounting the fiber sentinel. Unlike the\n * other two this is OUR bug, so the server attributes it to `infra`\n * rather than to the customer's app config.\n * - `names-mangled`: the app's bundler renamed the React Native\n * components the walker matches by name (#386). Capture itself\n * SUCCEEDED — one of two reasons that arrive with `captured: true` —\n * but detection is running on its structural fallbacks, so the\n * reading is coarser than usual.\n * - `walk-recognized-nothing`: the walker crossed a substantial tree\n * and not one of its detectors matched (#388). Also arrives with\n * `captured: true`, and it is the reason the observation the agent\n * received was empty while the user was looking at a populated\n * screen. Its cause is whatever `appilotsSelfCheck()` shows on the\n * device — mangled names, a wrapper component, an RN version the\n * walker has not met.\n *\n * Values are only ever ADDED here. An older server rejecting a reason a\n * newer SDK sends would fail the whole message, so this schema must\n * reach production before an SDK that can emit the new value ships —\n * the deploy-then-publish order in CLAUDE.md.\n */\nexport const introspectionFailureReasonSchema = z.enum([\n 'sentinel-missing-internals',\n 'never-mounted',\n 'render-crashed',\n 'names-mangled',\n 'walk-recognized-nothing',\n]);\n\nexport const introspectionDiagnosticsSchema = z.object({\n captured: z.boolean(),\n failureReason: introspectionFailureReasonSchema.nullish(),\n reactVersion: boundedString(32).nullish(),\n failureCount: z.number().int().min(0).max(1_000_000).optional(),\n});\n\n// ── Chat Message ───────────────────────────────────────────────\n\nexport const sendMessageSchema = z.object({\n content: z.string().min(1).max(4096),\n sessionId: z.string().optional(),\n context: agentContextSchema.optional(),\n /**\n * MCP doc version the SDK was bundled with. Server compares against\n * the active MCP doc and emits `mcp_version_mismatch` telemetry when\n * they differ. Optional — older SDKs simply skip the check.\n */\n mcpVersion: z.string().max(64).optional(),\n /**\n * SDK-side introspection health. Only sent when it FAILED — a client\n * that reached the React tree omits the field entirely, so the happy\n * path costs nothing on the wire.\n *\n * Without this, an app whose introspection is dead sends a snapshot\n * that is empty but perfectly well-formed, indistinguishable from a\n * genuinely empty screen. The server emits\n * `introspection_unavailable` so the failure is visible to us instead\n * of waiting for a bug report. Optional — older SDKs simply never\n * send it.\n */\n introspection: introspectionDiagnosticsSchema.optional(),\n});\n\n// ── Agent actions ──────────────────────────────────────────────\n// Canonical wire contract for actions emitted by the API and executed\n// by the SDK. Runtime code may still accept legacy aliases for backward\n// compatibility, but new payloads should prefer these shapes.\n\nexport const agentActionTypeSchema = z.enum([\n 'navigate',\n 'form_fill',\n 'ui_interaction',\n 'scroll_list',\n 'confirm',\n 'custom',\n]);\n\nexport const navigationPayloadSchema = z\n .object({\n // Optional ONLY so `goBack` can exist (#398): it returns to whatever\n // is beneath on the stack and has no destination to name. Every other\n // action is still required to carry one — enforced by the refine\n // below rather than by the field, so the error names the real problem\n // (\"navigate needs a screenName\") instead of a missing key.\n screenName: z.string().min(1).optional(),\n params: z.record(z.unknown()).optional(),\n navigationAction: z\n .enum(['push', 'navigate', 'replace', 'goBack', 'reset'])\n .default('navigate')\n .optional(),\n path: z.array(z.string().min(1)).optional(),\n })\n .passthrough()\n .refine(\n (payload) =>\n payload.navigationAction === 'goBack' ||\n (typeof payload.screenName === 'string' && payload.screenName.length > 0),\n {\n message: 'screenName is required for every navigationAction except \"goBack\"',\n path: ['screenName'],\n },\n );\n\nexport const formFillFieldSchema = z\n .object({\n fieldId: z.string().min(1),\n fieldType: z\n .enum(['text', 'select', 'toggle', 'date', 'number', 'custom'])\n .default('text')\n .optional(),\n value: z.unknown(),\n label: z.string().optional(),\n })\n .passthrough();\n\nexport const formFillPayloadSchema = z\n .object({\n screenName: z.string().optional(),\n fields: z.array(formFillFieldSchema),\n submitAfterFill: z.boolean().optional(),\n })\n .passthrough();\n\nexport const uiInteractionPayloadSchema = z\n .object({\n action: z\n .enum(['press', 'longPress', 'scroll', 'swipe', 'focus', 'set_value'])\n .default('press')\n .optional(),\n // `targetId` is the canonical server/LLM field. SDK runtimes still\n // accept `componentId` as a compatibility alias.\n targetId: z.string().min(1),\n componentId: z.string().min(1).optional(),\n /**\n * Numeric value for `set_value` (sliders / adjustable controls).\n * The SDK executor clamps it to the target's min/max and snaps it\n * to the step exposed in the observation.\n */\n value: z.number().finite().optional(),\n params: z.record(z.unknown()).optional(),\n })\n .passthrough()\n .refine((p) => p.action !== 'set_value' || typeof p.value === 'number', {\n message: 'set_value requires a numeric `value`',\n path: ['value'],\n });\n\n// Scroll a list/collection so off-screen (virtualized) rows mount and\n// become visible in the next observation. `toIndex` is the 1-based\n// position in the list's DATA (not just the mounted rows); `direction`\n// pages roughly one viewport at a time when no specific index is known.\nexport const scrollListPayloadSchema = z\n .object({\n /** Runtime list id (from the observation's \"Lists visible\" block). */\n listId: z.string().min(1).optional(),\n /** 1-based data index to scroll to (e.g. 42 = the 42nd item). */\n toIndex: z.number().int().min(1).optional(),\n /** Coarse paging when no target index is known. */\n direction: z.enum(['up', 'down']).optional(),\n })\n .passthrough();\n\nexport const confirmPayloadSchema = z\n .object({\n title: z.string().optional(),\n message: z.string().optional(),\n actionDescription: z.string().optional(),\n severity: z.enum(['warning', 'danger']).optional(),\n destructive: z.boolean().optional(),\n confirmLabel: z.string().optional(),\n cancelLabel: z.string().optional(),\n gatedActionId: z.string().optional(),\n gatedActionType: agentActionTypeSchema.optional(),\n injectedBy: z.enum(['permissions', 'sdk-local']).optional(),\n })\n .passthrough();\n\nexport const agentActionSchema = z.discriminatedUnion('type', [\n z.object({\n id: z.string().min(1),\n type: z.literal('navigate'),\n payload: navigationPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('form_fill'),\n payload: formFillPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('ui_interaction'),\n payload: uiInteractionPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('scroll_list'),\n payload: scrollListPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('confirm'),\n payload: confirmPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('custom'),\n payload: z.record(z.unknown()).default({}),\n }),\n]);\n\nexport const agentActionListSchema = z.array(agentActionSchema);\n\n// ── Agent continuation ─────────────────────────────────────────\n// Sent by the SDK after a batch of actions completes, so the model\n// can observe the outcomes + fresh screen state and decide what to\n// do next (instead of being a one-shot per user turn).\n\n/**\n * Structured diagnosis attached to a failed action result (BACKLOG 3.2).\n *\n * The recovery loop in `apps/api/src/modules/agents/routes.ts` reads\n * these fields to (a) classify whether a retry is worth attempting and\n * (b) feed the model an actionable observation instead of a generic\n * \"action failed\". The categories mirror the failure types the SDK can\n * detect — anything genuinely unknown becomes `unknown` and we lean on\n * the visible message + error string for context.\n */\nexport const actionFailureCategorySchema = z.enum([\n // The targeted button/input/toggle wasn't found in registry or fiber\n 'component-not-found',\n // The button exists but is currently disabled (e.g. invalid form)\n 'disabled',\n // Inline validation message visible (e.g. \"email inválido\")\n 'validation',\n // Network 5xx — likely transient, worth a retry with backoff\n 'network-5xx',\n // Network 4xx — semantic error from the backend; reporting is right\n 'network-4xx',\n // Screen took too long to mount after a navigate\n 'screen-timeout',\n // Multiple targets tied, or list row exposes only destructive nested controls\n 'ambiguous-target',\n // Action ran but the SDK couldn't tell what broke\n 'unknown',\n]);\n\nexport const actionDiagnoseSchema = z.object({\n category: actionFailureCategorySchema,\n /** Visible validation message read from the screen, when available */\n visibleMessage: z.string().optional(),\n /** Field id on the screen — for form_fill failures */\n fieldId: z.string().optional(),\n /** Component / button / toggle id — for ui_interaction failures */\n targetId: z.string().optional(),\n /** Screen the action ran on (route name) when available */\n screen: z.string().optional(),\n /** HTTP status when category is `network-*` */\n httpStatus: z.number().int().optional(),\n /**\n * When resolution failed because MULTIPLE on-screen targets matched\n * with equal confidence, the SDK lists the candidate ids/labels here\n * so the recovery hop can pick one instead of guessing blindly.\n */\n candidates: z.array(z.string().min(1)).max(8).optional(),\n /**\n * Optional generic recovery signal from newer SDKs. Old SDKs omit it\n * and the server derives the policy from `category`.\n */\n recoverable: z.boolean().optional(),\n /**\n * True when the app needs the human to provide or fix data before a\n * safe retry is possible. This is state, not language.\n */\n requiresUserInput: z.boolean().optional(),\n});\n\nexport const actionResultSchema = z.object({\n actionId: z.string(),\n type: z.string(),\n success: z.boolean(),\n error: z.string().optional(),\n /** Brief one-line description of what was attempted, for prompt readability */\n summary: z.string().optional(),\n /**\n * BACKLOG 3.2 — structured failure detail. Present only on failures.\n * The continue route uses `diagnose.category` to decide whether to\n * attempt a recovery hop and `visibleMessage` / `fieldId` to brief\n * the model.\n */\n diagnose: actionDiagnoseSchema.optional(),\n /**\n * BACKLOG 3.2 — how many times this *same* action (matched by\n * fingerprint of type+payload) has been retried already. 0 means\n * this is the first attempt; 2 means the SDK has already retried\n * twice and the server should give up.\n */\n recoveryAttempt: z.number().int().min(0).max(5).optional(),\n /**\n * BACKLOG 3.2 — set by the SDK when the per-action retry cap is hit.\n * The server must NOT call the LLM again for this action; instead\n * it surfaces the friendly \"couldn't complete\" message.\n */\n recoveryExhausted: z.boolean().optional(),\n /**\n * Set by the SDK when an action was reported as successful by the\n * handler (no exception, no diagnose) BUT the side-effect that the\n * SDK expected to observe didn't actually happen. Today only fires\n * for navigate actions when `getCurrentScreen()` didn't change after\n * the settle window — the silent-failure mode where the LLM thinks\n * it acted but reality says otherwise. The server emits a\n * `tool_without_effect` agent_event so it can be graphed.\n */\n toolWithoutEffect: z.boolean().optional(),\n /**\n * Optional structured effect signal for newer SDKs. This lets the\n * agent distinguish \"the handler ran\" from \"the app visibly changed\"\n * without parsing localized text.\n */\n effect: z.enum(['unknown', 'none', 'partial', 'changed', 'completed']).optional(),\n /** Optional localized UI status key emitted by newer SDKs. */\n userVisibleStatusKey: z.string().optional(),\n});\n\nexport const continueAgentSchema = z.object({\n sessionId: z.string(),\n results: z.array(actionResultSchema).min(1),\n // issue #169 — the observation the server grounds targets against, now\n // validated + bounded at the border instead of z.record(z.unknown()).\n context: agentContextSchema.optional(),\n /** Hop counter — server enforces a cap to prevent runaway loops */\n hop: z.number().int().min(1).max(10).optional(),\n});\n\n// ── Permissions (BACKLOG 2.1) ──────────────────────────────────\n// Three-level permission model: project defaults, screen overrides\n// (in this object), and action-level overrides (on the MCP itself).\n\nexport const agentAccessLevelSchema = z.enum(['read', 'write', 'none']);\n\n/**\n * One screen-override entry. All fields optional — anything left out\n * inherits from the project default.\n */\nexport const screenPermissionSchema = z\n .object({\n agentAccess: agentAccessLevelSchema.optional(),\n requiresConfirmation: z.boolean().optional(),\n blockedActions: z.array(z.string().min(1)).optional(),\n isPii: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Permissions configuration as returned by GET /projects/:id/permissions\n * and accepted by PATCH. The API layer guarantees a row exists per\n * project (auto-created on first read), so the response always has\n * the project-level fields populated.\n */\nexport const projectPermissionsSchema = z.object({\n agentCanWrite: z.boolean(),\n blockPiiScreens: z.boolean(),\n confirmDestructive: z.boolean(),\n /**\n * Map of screenName → override. Keys must be non-empty strings.\n * Limited to 200 entries to keep the JSON column small and editable\n * in the dashboard table view.\n */\n screenOverrides: z.record(screenPermissionSchema).default({}),\n /**\n * BACKLOG 2.2 — action ids that should NEVER trigger an auto-confirm\n * even if marked destructive. Lets a dev opt out of the prompt for\n * specific actions (\"Confirma cada delete\" cansa). Order doesn't\n * matter; matched against `action.id`, `action.payload.targetId`,\n * and `action.payload.fieldId`.\n */\n neverConfirmActions: z.array(z.string().min(1)).default([]),\n});\n\n/**\n * PATCH payload — every field optional, including the screenOverrides\n * map. To remove an override, send `screenOverrides: { [screen]: {} }`\n * with all fields stripped (or pass an explicit `null` — the API drops\n * the entry).\n */\nexport const updateProjectPermissionsSchema = z\n .object({\n agentCanWrite: z.boolean().optional(),\n blockPiiScreens: z.boolean().optional(),\n confirmDestructive: z.boolean().optional(),\n screenOverrides: z.record(screenPermissionSchema.nullable()).optional(),\n neverConfirmActions: z.array(z.string().min(1)).optional(),\n })\n .strict();\n\n/**\n * Schema applied to `permissions` blocks embedded in MCP documents\n * (output of the mcp-generator when it sees a `@appilots-permissions`\n * JSDoc tag). Same shape as a screen-level override but with a\n * required `screen` field — used at runtime to merge with the\n * dashboard-configured overrides.\n */\nexport const mcpScreenPermissionsSchema = screenPermissionSchema;\n\n// ── Budget enforcement (BACKLOG 3.1) ────────────────────────────\n// Shape returned by `GET /projects/:id/budget` and accepted (partially)\n// by PATCH. The cap and mode are persisted on the `projects` row;\n// runtime metrics (spend, percent, projected, period) are computed on\n// each GET so the dashboard widget can render without a separate fetch.\n\nexport const budgetModeSchema = z.enum(['alert-only', 'block', 'degrade']);\n\n/**\n * One element of the runtime metric block. Numbers are in USD with\n * sub-cent precision; the dashboard rounds for display.\n */\nexport const budgetMetricsSchema = z.object({\n /** YYYY-MM the metrics apply to. */\n period: z.string().regex(/^\\d{4}-\\d{2}$/),\n /** Sum of estimatedCost across the period so far, USD. */\n currentSpend: z.number().min(0),\n /** Active cap in USD, null when disabled. */\n cap: z.number().positive().nullable(),\n /** 0–1 ratio currentSpend/cap. Null when cap is null. */\n percent: z.number().nullable(),\n /**\n * Linear extrapolation: currentSpend / daysElapsed * daysInMonth.\n * Returned only when at least one day of data is in the bucket.\n */\n projectedSpend: z.number().nullable(),\n /** True when the runtime currently degrades or blocks new requests. */\n enforcing: z.boolean(),\n});\n\n/**\n * GET response shape — config + computed runtime metrics. PATCH only\n * accepts the config subset (see `updateProjectBudgetSchema`).\n */\nexport const projectBudgetSchema = z.object({\n monthlyBudgetUsd: z.number().positive().nullable(),\n budgetMode: budgetModeSchema,\n budgetAlertEmails: z.array(z.string().email()).default([]),\n budgetWebhookUrl: z.string().url().nullable(),\n metrics: budgetMetricsSchema,\n});\n\n/**\n * PATCH payload. To remove the cap, send `monthlyBudgetUsd: null`\n * (the runtime treats null as \"feature off\"). Emails replace (not merge)\n * — the dashboard sends the canonical full list every save.\n */\nexport const updateProjectBudgetSchema = z\n .object({\n /** null = disable budgeting, undefined = leave unchanged. */\n monthlyBudgetUsd: z.number().positive().nullable().optional(),\n budgetMode: budgetModeSchema.optional(),\n budgetAlertEmails: z.array(z.string().email()).max(20).optional(),\n /** null = remove webhook, undefined = leave unchanged. */\n budgetWebhookUrl: z.string().url().nullable().optional(),\n })\n .strict();\n\n// ── Personalization (BACKLOG 4.1) ──────────────────────────────\n// Per-project knobs for theming, branding, persona and i18n. Every\n// field is optional on the wire — missing values fall back to the\n// SDK's bundled defaults at render time.\n\n/**\n * Locales the SDK ships translation bundles for. Adding a locale here\n * also requires shipping `packages/sdk/src/i18n/bundles/<locale>.ts`.\n */\nexport const localeSchema = z.enum(['pt-BR', 'en', 'es']);\n\n/**\n * Hex color string, e.g. `#6366f1`. Allows 3-, 6- or 8-digit forms so\n * the dashboard color picker output (always 6-digit) and short-hand\n * tokens copied from a Tailwind config both validate.\n */\nconst hexColorSchema = z.string().regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, {\n message: 'Must be a hex color like #6366f1',\n});\n\n/**\n * Theme tokens. Every field optional — partials are merged on top of\n * the SDK's default light/dark token tree.\n */\nexport const themeTokensSchema = z\n .object({\n colors: z\n .object({\n primary: hexColorSchema.optional(),\n secondary: hexColorSchema.optional(),\n background: hexColorSchema.optional(),\n surface: hexColorSchema.optional(),\n text: hexColorSchema.optional(),\n textSecondary: hexColorSchema.optional(),\n border: hexColorSchema.optional(),\n success: hexColorSchema.optional(),\n warning: hexColorSchema.optional(),\n error: hexColorSchema.optional(),\n buttonText: hexColorSchema.optional(),\n bubbleText: hexColorSchema.optional(),\n userBubbleText: hexColorSchema.optional(),\n })\n .strict()\n .optional(),\n typography: z\n .object({\n fontFamily: z.string().min(1).max(120).optional(),\n fontSizeXs: z.number().int().min(8).max(48).optional(),\n fontSizeSm: z.number().int().min(8).max(48).optional(),\n fontSizeBase: z.number().int().min(8).max(48).optional(),\n fontSizeLg: z.number().int().min(8).max(48).optional(),\n })\n .strict()\n .optional(),\n radii: z\n .object({\n sm: z.number().int().min(0).max(64).optional(),\n md: z.number().int().min(0).max(64).optional(),\n lg: z.number().int().min(0).max(64).optional(),\n })\n .strict()\n .optional(),\n /**\n * `auto` (default) follows the device color scheme. `light`/`dark`\n * force the theme regardless of system setting.\n */\n mode: z.enum(['auto', 'light', 'dark']).optional(),\n })\n .strict();\n\n/**\n * GET /projects/:id/personalization response. Same shape that the SDK\n * later receives via the runtime config endpoint, so the dashboard can\n * preview faithfully without a separate fetch.\n */\nexport const projectPersonalizationSchema = z.object({\n /** Tone / persona instructions appended to the system prompt. */\n personaPrompt: z.string().max(2048).nullable(),\n /** Display name in the chat header (e.g. \"Aria\"). */\n assistantName: z.string().max(60).nullable(),\n /** URL or remote asset id for the avatar shown next to assistant turns. */\n assistantAvatar: z.string().max(500).nullable(),\n /** Emoji or image URL for the empty-state icon. Auto-detected by prefix. */\n emptyStateIcon: z.string().max(500).nullable(),\n /** First-message text shown in the empty state. */\n welcomeMessage: z.string().max(500).nullable(),\n /** Title rendered at the top of the chat. */\n chatTitle: z.string().max(60).nullable(),\n /** Pro+ tier toggle for the \"Powered by Appilots\" footer. */\n poweredByVisible: z.boolean(),\n /** Partial token tree, merged onto the SDK defaults at render time. */\n theme: themeTokensSchema.nullable(),\n /** Locale used when the SDK doesn't receive one as a prop. */\n defaultLocale: localeSchema.nullable(),\n /** Chat-open FAB background color. Null falls back to theme.colors.primary. */\n triggerButtonColor: hexColorSchema.nullable(),\n /** Image URL rendered inside the FAB instead of the default chat-bubble icon. */\n triggerButtonImageUrl: z.string().max(500).nullable(),\n});\n\n/**\n * PATCH payload. Every field optional. Send `null` to clear a value\n * (the SDK then falls back to the bundled defaults). Send `undefined`\n * (or omit) to leave the existing value untouched.\n */\nexport const updateProjectPersonalizationSchema = z\n .object({\n personaPrompt: z.string().max(2048).nullable().optional(),\n assistantName: z.string().max(60).nullable().optional(),\n assistantAvatar: z.string().max(500).nullable().optional(),\n emptyStateIcon: z.string().max(500).nullable().optional(),\n welcomeMessage: z.string().max(500).nullable().optional(),\n chatTitle: z.string().max(60).nullable().optional(),\n poweredByVisible: z.boolean().optional(),\n theme: themeTokensSchema.nullable().optional(),\n defaultLocale: localeSchema.nullable().optional(),\n triggerButtonColor: hexColorSchema.nullable().optional(),\n triggerButtonImageUrl: z.string().max(500).nullable().optional(),\n })\n .strict();\n\n// ── Sandbox / Test-preview mode (BACKLOG 4.2) ──────────────────\n\n/**\n * Snapshot the dashboard sends to mimic an SDK observation. Same general\n * shape as the runtime `observation` produced by the SDK, but everything\n * is optional so the dev can fill only what they care about. Loose\n * `record(unknown)` slots cover edge cases (custom selectors, internal\n * widget state) without forcing the dashboard schema to chase the SDK.\n */\nexport const sandboxObservationSchema = z\n .object({\n route: z.string().max(200).optional(),\n /** Screen title as rendered (the SDK snapshot carries it; the relay\n * compactor forwards it into VISIBLE STATE). */\n title: z.string().max(200).optional(),\n texts: z.array(z.string().max(500)).max(200).optional(),\n inputs: z\n .array(\n z.object({\n id: z.string().max(120),\n provenance: identityProvenanceSchema.optional(),\n onScreen: z.boolean().optional(),\n label: z.string().max(200).optional(),\n value: z.string().max(2000).optional(),\n disabled: z.boolean().optional(),\n required: z.boolean().optional(),\n type: z.string().max(40).optional(),\n placeholder: z.string().max(200).optional(),\n /** Inline validation state (SDK snapshot field). */\n invalid: z.boolean().optional(),\n }),\n )\n .max(100)\n .optional(),\n buttons: z\n .array(\n z.object({\n id: z.string().max(120),\n provenance: identityProvenanceSchema.optional(),\n onScreen: z.boolean().optional(),\n label: z.string().max(200).optional(),\n disabled: z.boolean().optional(),\n /** Risk metadata (e.g. \"high\") the SDK forwards for danger UI. */\n risk: z.string().max(40).optional(),\n /**\n * Selected/active state for grouped, mutually-exclusive options\n * (SegmentedControl, RadioGroup) — read from\n * `accessibilityState.selected` by the SDK walker.\n */\n selected: z.boolean().optional(),\n }),\n )\n .max(100)\n .optional(),\n /**\n * Sliders / adjustable numeric controls exactly as the SDK snapshot\n * reports them (captureSnapshot.ts merges registry-driven sliders).\n * min/max/step are the executable contract: the relay renders them\n * into VISIBLE STATE so the model can emit `set_value` within range.\n */\n sliders: z\n .array(\n z.object({\n id: z.string().max(120),\n provenance: identityProvenanceSchema.optional(),\n onScreen: z.boolean().optional(),\n label: z.string().max(200).optional(),\n value: z.number().finite().optional(),\n min: z.number().finite().optional(),\n max: z.number().finite().optional(),\n step: z.number().finite().positive().optional(),\n disabled: z.boolean().optional(),\n }),\n )\n .max(40)\n .optional(),\n /**\n * List containers exactly as the SDK snapshot reports them\n * (captureSnapshot.ts). The relay compactor renders these into the\n * VISIBLE STATE block (ordinal list-N-item-M ids), so the sandbox /\n * eval suite must be able to declare them too. Items are passthrough:\n * the SDK adds fields (nested actions, absolute index) faster than\n * this schema should have to chase.\n */\n lists: z\n .array(\n z\n .object({\n index: z.number().int().nonnegative().optional(),\n containerType: z.string().max(60).optional(),\n items: z\n .array(\n z\n .object({\n index: z.number().int().optional(),\n syntheticId: z.string().max(120).optional(),\n texts: z.array(z.string().max(500)).max(50).optional(),\n })\n .passthrough(),\n )\n .max(200)\n .optional(),\n })\n .passthrough(),\n )\n .max(20)\n .optional(),\n /**\n * Toggles exactly as the SDK snapshot reports them (#390).\n *\n * Their absence is why `generality-component-control-smarthome`\n * came back `errored` with a 422 instead of measuring anything:\n * this schema is `.strict()`, so a scenario that declares a switch\n * is rejected before the agent is ever asked. Which means the\n * corpus could not express the single control behind failure 02 of\n * the functional audit — \"disable an agent; the switch never\n * moves\". The one defect the eval most needed to catch was the one\n * shape it could not describe.\n */\n toggles: z\n .array(\n z.object({\n id: z.string().max(120),\n provenance: identityProvenanceSchema.optional(),\n onScreen: z.boolean().optional(),\n label: z.string().max(200).optional(),\n value: z.boolean().optional(),\n disabled: z.boolean().optional(),\n }),\n )\n .max(100)\n .optional(),\n /**\n * The interaction graph — the `el:*` ids the prompt tells the model\n * to prefer over ordinal handles. Passthrough per entry for the\n * same reason `lists` is: the SDK adds fields faster than this\n * schema should chase them.\n */\n elements: z\n .array(\n z\n .object({\n id: z.string().max(160),\n role: z.string().max(40).optional(),\n label: z.string().max(300).optional(),\n })\n .passthrough(),\n )\n .max(500)\n .optional(),\n /** Screen-level state the relay renders and branches on. */\n loading: z.boolean().optional(),\n modalOpen: z.boolean().optional(),\n extra: z.record(z.unknown()).optional(),\n })\n .strict();\n\n/**\n * Body of `POST /projects/:id/sandbox/run`.\n * `screen` is the screen name the dev is simulating standing on. `prompt`\n * is the user message. `observation` overrides the runtime snapshot.\n * `modelOverride` lets the dev test a non-default model without changing\n * the project's saved AI config.\n */\nexport const sandboxRunRequestSchema = z\n .object({\n screen: z.string().max(120).optional(),\n observation: sandboxObservationSchema.optional(),\n prompt: z.string().min(1).max(4000),\n /**\n * Optional. Overrides `projects.aiModel` for this run only. Free-form\n * string because MODEL_CATALOG owns the canonical list and we don't\n * want the validator to fall behind catalog updates.\n */\n modelOverride: z.string().max(120).optional(),\n /**\n * When true, the run does not bump `usage_daily` rows at all (not\n * even with `kind='sandbox'`). Useful for very fast iteration where\n * the dev doesn't want their tokens metered.\n */\n silent: z.boolean().optional(),\n /**\n * Prior turns of the conversation, in order, that precede `prompt`.\n * Lets a driver run the agent loop hop-by-hop headlessly (the multi-\n * hop agentic eval — tests/agentic/fixtures/trajectory.ts) by replaying\n * the assistant's previous replies and the synthetic recovery /\n * continuation observations as text, exactly as the production\n * `/agent/continue` flow threads them. Empty / absent → single-hop\n * behavior, unchanged. The final user `prompt` is always appended\n * after this history.\n */\n history: z\n .array(\n z.object({\n role: z.enum(['user', 'assistant', 'system']),\n content: z.string().max(8000),\n }),\n )\n .max(40)\n .optional(),\n /**\n * Pass-through to the relay's recovery branch. When true the relay\n * treats this call as a continuation/recovery hop (drops first-turn\n * heuristics, forces tool choice when the last user message carries a\n * failure marker). Only meaningful alongside `history`.\n */\n isRecoveryHop: z.boolean().optional(),\n /**\n * Run this call against the application structure supplied here\n * instead of the project's active MCP document.\n *\n * Sandbox-only, and the relay honours it only on a `dryRun` call —\n * see `resolveMcpOverride` in apps/api. It exists because the eval\n * corpus could otherwise only ever describe ONE app: every scenario\n * resolves to the same seeded project, so every navigate destination,\n * every screen title and every bit of domain priming in the prompt\n * came from the same vehicle-management demo. A suite that can only\n * pose questions about one app cannot measure whether the agent works\n * on another one.\n *\n * Deliberately loose (`z.record`): the MCP document's shape is owned\n * by the generator, and pinning it here would turn every additive\n * generator change into a 422 in the sandbox.\n */\n applicationStructure: z.record(z.unknown()).optional(),\n })\n .strict();\n\n/**\n * One entry per agent hop, mirroring the structure the dev would see in\n * a real session. `reasoningPreview` is a short trimmed preview of the\n * model's content (full text already lives on the assistant message).\n */\n/**\n * SPEC-046 — relay guard telemetry. Mirrors the `RelayDiagnostics`\n * interface in `../bench`; kept here so the sandbox response schema can\n * validate it without the validators module depending on the bench one.\n */\nexport const relayDiagnosticsSchema = z.object({\n unverifiedTargets: z.array(z.string()),\n guardsFired: z.array(z.object({ guard: z.string(), detail: z.string().optional() })),\n repairMode: z.enum(['repair', 'strict', 'disabled']),\n promptVersion: z.string(),\n // Defaulted for producers that predate the field: before it existed\n // every response had reached the model, so `true` is the correct\n // backfill.\n modelInvoked: z.boolean().default(true),\n});\n\nexport const sandboxTraceHopSchema = z.object({\n hop: z.number().int().nonnegative(),\n inputPreview: z.string(),\n reasoningPreview: z.string(),\n actions: z.array(\n z.object({\n id: z.string(),\n type: z.string(),\n payload: z.record(z.unknown()),\n destructive: z.boolean().optional(),\n }),\n ),\n tokensUsed: z.number().int().nonnegative(),\n latencyMs: z.number().nonnegative(),\n modelUsed: z.string(),\n});\n\nexport const sandboxRunResponseSchema = z.object({\n /** Final assistant text (last hop). */\n content: z.string(),\n /** Planned actions from the final hop. None of them are executed. */\n actions: z.array(\n z.object({\n id: z.string(),\n type: z.string(),\n payload: z.record(z.unknown()),\n destructive: z.boolean().optional(),\n }),\n ),\n /** Full system prompt (instructions + MCP slice + persona) used for the run. */\n systemPrompt: z.string(),\n /** Aggregate metrics across all hops. */\n totalTokens: z.number().int().nonnegative(),\n totalCostUsd: z.number().nonnegative(),\n totalLatencyMs: z.number().nonnegative(),\n modelUsed: z.string(),\n /** Hop-by-hop trace. Always at least one entry. */\n trace: z.array(sandboxTraceHopSchema),\n /** True when the run was a no-op (e.g. project has no MCP yet). */\n warning: z.string().optional(),\n /**\n * SPEC-046 — guard / hallucination telemetry for the run.\n *\n * ADDITIVE AND OPTIONAL, permanently: SDK and dashboard consumers\n * predate it, and older API deployments will not send it. Consumers\n * must treat an absent block as \"no information\", never as \"no guards\n * fired\".\n */\n diagnostics: relayDiagnosticsSchema.optional(),\n});\n\n/**\n * \"Salvar como teste\" payload — captures the same fields as a run plus\n * a name + description for later replay.\n */\nexport const saveSandboxTestSchema = z\n .object({\n name: z.string().min(1).max(120),\n description: z.string().max(500).optional(),\n screen: z.string().max(120).optional(),\n observation: sandboxObservationSchema.optional(),\n prompt: z.string().min(1).max(4000),\n })\n .strict();\n\n/** Response shape for the listed/saved test. */\nexport const sandboxTestSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n screen: z.string().nullable(),\n observation: sandboxObservationSchema.nullable(),\n prompt: z.string(),\n createdBy: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\n// ── Client-facing agent eval (BACKLOG whole-product gap #1) ────\n//\n// `POST /cli/eval/run` — the customer-facing counterpart to\n// `/sandbox/run`. Same dry-run/decision-mode relay call, but authed via\n// `sdkAuthMiddleware` (project API key) instead of a dashboard session,\n// and batched: the CLI posts every scenario from `.appilots/scenarios/`\n// in one request instead of one round-trip per scenario. Each scenario\n// is otherwise the same shape as a sandbox run.\n\n/** Hard cap on scenarios per `/cli/eval/run` call — a cost guard so a\n * misconfigured CI job can't fan out an unbounded number of LLM calls\n * on someone else's API key. */\nexport const EVAL_MAX_SCENARIOS_PER_RUN = 20;\n\nexport const evalScenarioRequestSchema = z\n .object({\n /** Caller-supplied identifier (the scenario file's `name`, typically)\n * so the response can be matched back up client-side. */\n id: z.string().min(1).max(200),\n screen: z.string().max(120).optional(),\n observation: sandboxObservationSchema.optional(),\n prompt: z.string().min(1).max(4000),\n modelOverride: z.string().max(120).optional(),\n })\n .strict();\n\nexport const evalRunRequestSchema = z\n .object({\n scenarios: z.array(evalScenarioRequestSchema).min(1).max(EVAL_MAX_SCENARIOS_PER_RUN),\n })\n .strict();\n\nexport const evalScenarioResultSchema = z.object({\n id: z.string(),\n content: z.string(),\n actions: z.array(\n z.object({\n id: z.string(),\n type: z.string(),\n payload: z.record(z.unknown()),\n }),\n ),\n totalTokens: z.number().int().nonnegative(),\n totalCostUsd: z.number().nonnegative(),\n totalLatencyMs: z.number().nonnegative(),\n modelUsed: z.string(),\n});\n\nexport const evalRunResponseSchema = z.object({\n results: z.array(evalScenarioResultSchema),\n});\n\n// ── Insights / Observability (BACKLOG 4.3) ─────────────────────\n//\n// Read-side schemas for the Insights dashboard page. The four widgets\n// (top prompts, funnel, screens heatmap, models comparison) each have\n// their own endpoint and their own response shape so the dashboard can\n// fetch independently and render skeletons per-card.\n//\n// All four accept the same `from`/`to` query params; absent values\n// default to the last 30 days on the server side.\n\n/**\n * `from`/`to` are YYYY-MM-DD UTC. The server clamps `to` to today and\n * `from` to a 90-day floor (rollup retention guarantees 365d but the\n * dashboard widgets are tuned for 7/30/90d windows).\n */\nexport const insightsRangeSchema = z.object({\n from: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: 'from must be YYYY-MM-DD' })\n .optional(),\n to: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: 'to must be YYYY-MM-DD' })\n .optional(),\n});\n\n/**\n * `GET /projects/:id/insights/top-prompts` — most common user prompts\n * (truncated, case-insensitive grouped) over the requested window.\n */\nexport const insightsTopPromptsResponseSchema = z.object({\n /** Date window the result covers, inclusive. */\n from: z.string(),\n to: z.string(),\n prompts: z.array(\n z.object({\n /** Truncated representative casing (max 160 chars). */\n prompt: z.string(),\n count: z.number().int().nonnegative(),\n /** Top 1-3 screens this prompt was sent from. */\n topScreens: z.array(z.string()).max(3),\n }),\n ),\n});\n\n/**\n * `GET /projects/:id/insights/funnel` — request → action_decided →\n * action_executed → success funnel. Counts are absolute; the dashboard\n * computes percentages.\n */\nexport const insightsFunnelResponseSchema = z.object({\n from: z.string(),\n to: z.string(),\n requests: z.number().int().nonnegative(),\n actionsDecided: z.number().int().nonnegative(),\n actionsExecuted: z.number().int().nonnegative(),\n actionsSucceeded: z.number().int().nonnegative(),\n actionsFailed: z.number().int().nonnegative(),\n clarificationsAsked: z.number().int().nonnegative(),\n recoveriesAttempted: z.number().int().nonnegative(),\n recoveriesSucceeded: z.number().int().nonnegative(),\n recoveriesExhausted: z.number().int().nonnegative(),\n});\n\n/**\n * `GET /projects/:id/insights/screens` — per-screen heatmap. Sorted by\n * problem rate (failures / total events) descending so the dashboard\n * can highlight troubled screens first.\n */\nexport const insightsScreensResponseSchema = z.object({\n from: z.string(),\n to: z.string(),\n screens: z.array(\n z.object({\n screen: z.string(),\n requests: z.number().int().nonnegative(),\n actionsExecuted: z.number().int().nonnegative(),\n actionsFailed: z.number().int().nonnegative(),\n /** 0–1 ratio: failed / (executed + failed). Null when neither. */\n problemRate: z.number().min(0).max(1).nullable(),\n /** Top error categories observed on this screen. */\n topErrors: z.array(\n z.object({\n category: z.string(),\n count: z.number().int().nonnegative(),\n }),\n ),\n }),\n ),\n});\n\n/**\n * `GET /projects/:id/insights/models` — head-to-head model comparison.\n * Useful when the project rotated providers mid-month. Returns one row\n * per modelId observed in the window.\n */\nexport const insightsModelsResponseSchema = z.object({\n from: z.string(),\n to: z.string(),\n models: z.array(\n z.object({\n modelId: z.string(),\n requests: z.number().int().nonnegative(),\n actionsDecided: z.number().int().nonnegative(),\n actionsSucceeded: z.number().int().nonnegative(),\n actionsFailed: z.number().int().nonnegative(),\n avgLatencyMs: z.number().nullable(),\n tokensTotal: z.number().int().nonnegative(),\n costUsd: z.number().nonnegative(),\n /** 0–1 ratio: succeeded / (succeeded + failed). Null when neither. */\n successRate: z.number().min(0).max(1).nullable(),\n }),\n ),\n});\n\n/**\n * `GET /projects/:id/insights/missions` — whole-session mission\n * completion, sourced from `agent_sessions.missionOutcome` (resolved\n * once per session at close, NOT inferred from the event funnel).\n * Answers \"of all missions started in this window, how many actually\n * completed?\" — `missionsStarted` counts sessions by `startedAt`\n * falling in [from, to], regardless of when they were later resolved.\n */\nexport const insightsMissionsResponseSchema = z.object({\n from: z.string(),\n to: z.string(),\n missionsStarted: z.number().int().nonnegative(),\n missionsCompleted: z.number().int().nonnegative(),\n missionsFailed: z.number().int().nonnegative(),\n missionsAbandoned: z.number().int().nonnegative(),\n /** Sessions started in-window that haven't resolved (or resolved ambiguously) yet. */\n missionsUnknown: z.number().int().nonnegative(),\n /** 0–1 ratio: completed / missionsStarted. Null when missionsStarted is 0. */\n completionRate: z.number().min(0).max(1).nullable(),\n});\n\n// ── Agent action audit trail ────────────────────────────────────\n// `GET /projects/:id/agent-actions` — reads `agent_actions` directly so\n// an operator can answer \"what did the agent do here?\" without needing\n// an open escalation. Cursor pagination mirrors /activity (createdAt of\n// the oldest row on the page).\n\nexport const agentActionStatusSchema = z.enum([\n 'pending',\n 'executing',\n 'completed',\n 'failed',\n 'cancelled',\n]);\n\nexport const agentActionsQuerySchema = z.object({\n sessionId: z.string().max(64).optional(),\n /** CSV of agentActionStatusSchema values. */\n status: z.string().optional(),\n /** CSV of agentActionTypeSchema values. */\n type: z.string().optional(),\n from: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: 'from must be YYYY-MM-DD' })\n .optional(),\n to: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: 'to must be YYYY-MM-DD' })\n .optional(),\n /** Older-than cursor for infinite scroll — ISO datetime of createdAt. */\n cursor: z.string().optional(),\n /** Page size hint — the route clamps this to [1, 100], same as /activity. */\n limit: z.coerce.number().int().optional(),\n});\n\nexport const agentActionEntrySchema = z.object({\n id: z.string(),\n sessionId: z.string(),\n externalUserId: z.string().nullable(),\n screen: z.string().nullable(),\n type: z.string(),\n status: agentActionStatusSchema,\n error: z.string().nullable(),\n /**\n * Value-free summary of the action payload (identifiers and flags\n * only — e.g. fieldIds/submitAfterFill for form_fill). The raw\n * payload can carry end-user-typed values and never crosses the API\n * boundary; see apps/api common/services/action-view.ts.\n */\n detail: z.record(z.unknown()),\n executedAt: z.string().nullable(),\n completedAt: z.string().nullable(),\n createdAt: z.string(),\n});\n\nexport const agentActionsResponseSchema = z.object({\n entries: z.array(agentActionEntrySchema),\n nextCursor: z.string().nullable(),\n});\n\n// ── Human escalation (handoff) ─────────────────────────────────\n// Wire contract for the human-escalation feature — see\n// docs/human-escalation.md. The SDK creates escalations and exchanges\n// messages over API-key routes; the dashboard consumes the queue over\n// JWT routes. Both sides validate with these schemas at the border.\n\nexport const escalationStatusSchema = z.enum(['pending', 'active', 'resolved']);\n\nexport const escalationReasonSchema = z.enum(['user_requested', 'agent_gave_up']);\n\nexport const createEscalationSchema = z.object({\n /** Omitted when the chat has no session yet — the server creates one. */\n sessionId: z.string().max(64).optional(),\n reason: escalationReasonSchema,\n /** Optional context: last failure message, current screen, etc. */\n note: z.string().max(2000).optional(),\n});\n\n/**\n * One chat message crossing the escalation channel (either direction).\n * `operatorName` is Operator-API-only (docs/human-escalation.md,\n * Operator API feature): an optional per-reply display-name override\n * for external operators authenticating with an operator API key — the\n * SDK-side (user → operator) and existing dashboard (JWT) call sites\n * simply never send it.\n */\nexport const escalationMessageSchema = z.object({\n content: z.string().min(1).max(4096),\n operatorName: z.string().min(1).max(120).optional(),\n});\n\n/**\n * Claim body — Operator-API-only. Lets an external operator (key auth)\n * attach a display name (e.g. \"Zendesk Bridge\") at claim time; the\n * dashboard (JWT) claim route ignores this field, so it stays optional\n * and backwards-compatible with the pre-existing empty-body claim call.\n */\nexport const claimEscalationSchema = z.object({\n operatorName: z.string().min(1).max(120).optional(),\n});\n\nexport const escalationListQuerySchema = z.object({\n /** `open` = pending + active (default); `resolved` = history. */\n status: z.enum(['open', 'resolved']).optional(),\n});\n\n// ── End users (identify / registry) ────────────────────────────\n// The app company's own users registered on Appilots so operators can\n// put a name on an externalUserId. Identifier VALUES are free-form\n// strings (email, phone, internal ids, ...) — bounded to keep the\n// jsonb payload sane.\n\nexport const endUserIdentifiersSchema = z\n .record(z.string().min(1).max(40), z.string().min(1).max(200))\n .refine((map) => Object.keys(map).length <= 10, {\n message: 'At most 10 identifiers per user',\n });\n\n/** SDK-side identify: may only describe the session's OWN user. */\nexport const identifyUserSchema = z.object({\n userId: z.string().min(1).max(128),\n name: z.string().min(1).max(200).optional(),\n identifiers: endUserIdentifiersSchema.optional(),\n});\n\n/** The longest `externalUserId` we will carry — same bound as identify. */\nexport const MAX_EXTERNAL_USER_ID_LENGTH = 128;\n\n/**\n * Normalise the SDK's `userId` into \"an end-user id, or nothing\".\n *\n * This is NOT a validator that rejects — and that is the whole design.\n * `POST /agent/session` opens the chat inside a customer's shipped app;\n * a 422 there turns the assistant off for an end user who never chose\n * anything, and `CLAUDE.md` requires the backend to stay\n * backward-compatible with SDKs already in the wild. So every input\n * either becomes a usable id or becomes absent, and nothing 4xxs.\n *\n * The rules, and why each one:\n * - trimmed; blank → absent. An empty string is not an identity, and\n * letting one through means the billing gate (a truthiness check)\n * and the dedup rule disagree about the same session (#331).\n * - number → its decimal string. Plenty of apps key users by integer,\n * and the column is text; coercing here beats each reader coercing\n * differently.\n * - longer than `MAX_EXTERNAL_USER_ID_LENGTH` → absent, never\n * truncated. Truncation would merge two distinct users onto one id,\n * which corrupts both billing dedup and escalation attribution —\n * strictly worse than having no id at all.\n * - anything else (object, array, boolean, null) → absent.\n */\nexport function normalizeExternalUserId(value: unknown): string | undefined {\n let raw: string;\n if (typeof value === 'string') raw = value;\n else if (typeof value === 'number' && Number.isFinite(value)) raw = String(value);\n else return undefined;\n\n const trimmed = raw.trim();\n if (!trimmed) return undefined;\n if (trimmed.length > MAX_EXTERNAL_USER_ID_LENGTH) return undefined;\n return trimmed;\n}\n\n/** Serialized ceiling for `device_info`. Device metadata is a handful of short strings. */\nexport const MAX_DEVICE_INFO_BYTES = 4096;\n\n/**\n * Device metadata the SDK reports.\n *\n * `passthrough`, NOT stripped to the four fields\n * `agent_sessions.device_info` declares. Those four are what the\n * dashboard reads today, but `AppilotsClient.createSession` takes\n * `Record<string, unknown>` — so apps in the wild legitimately send\n * other keys, and silently dropping them would lose diagnostic data\n * from exactly the sessions someone is trying to debug.\n *\n * What it does enforce is a ceiling: this is jsonb on a route\n * authenticated by an API key, so without one the payload has no bound\n * at all. Over the ceiling the field becomes absent (via `.catch` at the\n * use site) rather than a 4xx — losing device metadata is survivable,\n * failing to open the session is not.\n */\nexport const sessionDeviceInfoSchema = z\n .object({\n platform: z.string().max(64).optional(),\n osVersion: z.string().max(64).optional(),\n appVersion: z.string().max(64).optional(),\n sdkVersion: z.string().max(64).optional(),\n })\n .passthrough()\n .refine((info) => JSON.stringify(info).length <= MAX_DEVICE_INFO_BYTES, {\n message: `device_info exceeds ${MAX_DEVICE_INFO_BYTES} bytes`,\n });\n\n/** Body of `POST /agent/session`. Read it through `parseCreateAgentSessionBody`. */\nexport const createAgentSessionSchema = z.object({\n userId: z.preprocess(normalizeExternalUserId, z.string().optional()),\n deviceInfo: sessionDeviceInfoSchema.optional().catch(undefined),\n});\n\nexport interface CreateAgentSessionBody {\n userId?: string;\n deviceInfo?: z.infer<typeof sessionDeviceInfoSchema>;\n}\n\n/**\n * Read the session-create body. TOTAL — it cannot throw and cannot\n * reject, so the route has no error branch to get wrong.\n *\n * The non-object guard is not paranoia: `c.req.json()` returns whatever\n * valid JSON arrived, and `\"hello\"` or `[1,2]` are valid JSON that\n * `z.object()` would throw on. A malformed body means \"we learned\n * nothing about the end user\", not \"refuse to open the session\".\n */\nexport function parseCreateAgentSessionBody(body: unknown): CreateAgentSessionBody {\n const source = body !== null && typeof body === 'object' && !Array.isArray(body) ? body : {};\n const parsed = createAgentSessionSchema.safeParse(source);\n return parsed.success ? parsed.data : {};\n}\n\n/** Dashboard / server-to-server upsert (keyed by projectId+externalId). */\nexport const upsertEndUserSchema = z.object({\n projectId: z.string().min(1).max(64),\n externalId: z.string().min(1).max(128),\n name: z.string().min(1).max(200).optional(),\n identifiers: endUserIdentifiersSchema.optional(),\n});\n\n// ── Type exports ───────────────────────────────────────────────\n\nexport type LoginInput = z.infer<typeof loginSchema>;\nexport type RegisterInput = z.infer<typeof registerSchema>;\nexport type MfaVerifyInput = z.infer<typeof mfaVerifySchema>;\nexport type MfaChallengeInput = z.infer<typeof mfaChallengeSchema>;\nexport type MfaDisableInput = z.infer<typeof mfaDisableSchema>;\nexport type DeleteAccountInput = z.infer<typeof deleteAccountSchema>;\nexport type CreateProjectInput = z.infer<typeof createProjectSchema>;\nexport type UpdateProjectInput = z.infer<typeof updateProjectSchema>;\nexport type UploadMCPDocumentInput = z.infer<typeof uploadMCPDocumentSchema>;\nexport type ApiKeyScope = z.infer<typeof apiKeyScopeSchema>;\nexport type CreateApiKeyInput = z.infer<typeof createApiKeySchema>;\nexport type ApiKeyEnvironment = z.infer<typeof apiKeyEnvironmentSchema>;\nexport type SendMessageInput = z.infer<typeof sendMessageSchema>;\nexport type IntrospectionDiagnosticsInput = z.infer<typeof introspectionDiagnosticsSchema>;\nexport type IntrospectionFailureReason = z.infer<typeof introspectionFailureReasonSchema>;\nexport type ActionResult = z.infer<typeof actionResultSchema>;\nexport type ScrollListPayload = z.infer<typeof scrollListPayloadSchema>;\nexport type ContinueAgentInput = z.infer<typeof continueAgentSchema>;\n/** Canonical agent observation context (issue #169). */\nexport type AgentContext = z.infer<typeof agentContextSchema>;\nexport type ClientPlatform = z.infer<typeof clientPlatformSchema>;\nexport type AgentSnapshot = z.infer<typeof agentSnapshotSchema>;\nexport type ProviderKind = z.infer<typeof providerKindSchema>;\nexport type CreateProviderInput = z.infer<typeof createProviderSchema>;\nexport type UpdateProviderInput = z.infer<typeof updateProviderSchema>;\nexport type AgentAccessLevel = z.infer<typeof agentAccessLevelSchema>;\nexport type ScreenPermission = z.infer<typeof screenPermissionSchema>;\nexport type ProjectPermissionsConfig = z.infer<typeof projectPermissionsSchema>;\nexport type UpdateProjectPermissionsInput = z.infer<typeof updateProjectPermissionsSchema>;\nexport type McpScreenPermissions = z.infer<typeof mcpScreenPermissionsSchema>;\nexport type BudgetMode = z.infer<typeof budgetModeSchema>;\nexport type BudgetMetrics = z.infer<typeof budgetMetricsSchema>;\nexport type ProjectBudget = z.infer<typeof projectBudgetSchema>;\nexport type UpdateProjectBudgetInput = z.infer<typeof updateProjectBudgetSchema>;\nexport type ActionFailureCategory = z.infer<typeof actionFailureCategorySchema>;\nexport type ActionDiagnose = z.infer<typeof actionDiagnoseSchema>;\nexport type Locale = z.infer<typeof localeSchema>;\nexport type ThemeTokens = z.infer<typeof themeTokensSchema>;\nexport type ProjectPersonalization = z.infer<typeof projectPersonalizationSchema>;\nexport type UpdateProjectPersonalizationInput = z.infer<typeof updateProjectPersonalizationSchema>;\nexport type SandboxObservation = z.infer<typeof sandboxObservationSchema>;\nexport type SandboxRunRequest = z.infer<typeof sandboxRunRequestSchema>;\nexport type SandboxRunResponse = z.infer<typeof sandboxRunResponseSchema>;\nexport type SandboxTraceHop = z.infer<typeof sandboxTraceHopSchema>;\nexport type SaveSandboxTestInput = z.infer<typeof saveSandboxTestSchema>;\nexport type SandboxTest = z.infer<typeof sandboxTestSchema>;\nexport type EvalScenarioRequest = z.infer<typeof evalScenarioRequestSchema>;\nexport type EvalRunRequest = z.infer<typeof evalRunRequestSchema>;\nexport type EvalScenarioResult = z.infer<typeof evalScenarioResultSchema>;\nexport type EvalRunResponse = z.infer<typeof evalRunResponseSchema>;\nexport type InsightsRange = z.infer<typeof insightsRangeSchema>;\nexport type InsightsTopPromptsResponse = z.infer<typeof insightsTopPromptsResponseSchema>;\nexport type InsightsFunnelResponse = z.infer<typeof insightsFunnelResponseSchema>;\nexport type InsightsScreensResponse = z.infer<typeof insightsScreensResponseSchema>;\nexport type InsightsModelsResponse = z.infer<typeof insightsModelsResponseSchema>;\nexport type InsightsMissionsResponse = z.infer<typeof insightsMissionsResponseSchema>;\nexport type AgentActionType = z.infer<typeof agentActionTypeSchema>;\nexport type AgentActionStatus = z.infer<typeof agentActionStatusSchema>;\nexport type AgentActionsQuery = z.infer<typeof agentActionsQuerySchema>;\nexport type AgentActionEntry = z.infer<typeof agentActionEntrySchema>;\nexport type AgentActionsResponse = z.infer<typeof agentActionsResponseSchema>;\nexport type EscalationStatus = z.infer<typeof escalationStatusSchema>;\nexport type EscalationReason = z.infer<typeof escalationReasonSchema>;\nexport type CreateEscalationInput = z.infer<typeof createEscalationSchema>;\nexport type EscalationMessageInput = z.infer<typeof escalationMessageSchema>;\nexport type ClaimEscalationInput = z.infer<typeof claimEscalationSchema>;\nexport type IdentifyUserInput = z.infer<typeof identifyUserSchema>;\nexport type UpsertEndUserInput = z.infer<typeof upsertEndUserSchema>;\n","import type { MCPDocument } from '../generators/types';\nimport type { ActionDescriptor } from '../types/index';\n\n/**\n * Metadata lint (OKR-005 KR4) — every mutating action registered in the\n * MCP document should declare `effect` and `riskLevel` so the runtime can\n * enforce safety policy without parsing labels. The generator extracts\n * these fields when declared in registerScreen(); this lint surfaces the\n * ones that were not, instead of letting them pass silently.\n */\n\nexport interface MetadataLintWarning {\n screen: string;\n actionId: string;\n actionType: ActionDescriptor['type'];\n missing: ('effect' | 'riskLevel')[];\n reason: string;\n}\n\n/**\n * Verbs that indicate an action changes state even when its `type` alone\n * doesn't say so (custom handlers, api_call wrappers, etc.). Mirrors the\n * destructive-verb heuristic used by ScreenAnalyzer for the\n * `destructive` flag, plus non-destructive mutation verbs.\n */\nconst MUTATION_VERB_RE =\n /\\b(delete|destroy|remove|discard|wipe|revoke|cancel|reset|clear|create|add|register|save|submit|update|edit|change|toggle|pay|send|confirm|subscribe|unsubscribe|renew|downgrade|upgrade|transfer)\\w*/i;\n\nfunction isMutating(action: ActionDescriptor): { mutating: boolean; reason: string } {\n if (action.destructive || action.effect === 'destructive') {\n return { mutating: true, reason: 'flagged destructive' };\n }\n if (action.type === 'submit' || action.type === 'state_change') {\n return { mutating: true, reason: `type \"${action.type}\"` };\n }\n const haystack = `${action.id} ${action.label ?? ''} ${action.handler ?? ''}`;\n if ((action.type === 'api_call' || action.type === 'custom') && MUTATION_VERB_RE.test(haystack)) {\n return { mutating: true, reason: 'mutation verb in id/label/handler' };\n }\n return { mutating: false, reason: '' };\n}\n\n/**\n * Scans every screen action and returns one warning per mutating action\n * that is missing `effect` and/or `riskLevel`.\n */\nexport function lintActionMetadata(document: MCPDocument): MetadataLintWarning[] {\n const warnings: MetadataLintWarning[] = [];\n\n for (const screen of document.screens) {\n for (const action of screen.actions ?? []) {\n const { mutating, reason } = isMutating(action);\n if (!mutating) continue;\n\n const missing: MetadataLintWarning['missing'] = [];\n if (!action.effect) missing.push('effect');\n if (!action.riskLevel) missing.push('riskLevel');\n if (missing.length === 0) continue;\n\n warnings.push({\n screen: screen.name,\n actionId: action.id,\n actionType: action.type,\n missing,\n reason,\n });\n }\n }\n\n return warnings;\n}\n\n/**\n * Formats lint warnings for terminal output: one line per action plus an\n * aggregate line, e.g.\n * VehicleDetails.deleteVehicle (submit): missing effect, riskLevel\n */\nexport function formatMetadataWarnings(warnings: MetadataLintWarning[]): string[] {\n return warnings.map(\n (w) => `${w.screen}.${w.actionId} (${w.actionType}, ${w.reason}): missing ${w.missing.join(', ')}`\n );\n}\n","import type { MCPDocument } from '../../generators/types';\nimport { lintActionMetadata, formatMetadataWarnings } from '../../pipeline/metadata-lint';\nimport { warn, dim, error, success } from './logger';\n\n/**\n * Prints the metadata lint result for a generated document. In strict\n * mode (--strict-metadata) any warning is fatal so CI can gate on full\n * effect/riskLevel coverage (OKR-005 KR4).\n */\nexport function reportMetadataLint(document: MCPDocument, strict: boolean): void {\n const warnings = lintActionMetadata(document);\n\n if (warnings.length === 0) {\n success('Metadata lint: all mutating actions declare effect + riskLevel');\n return;\n }\n\n warn(`Metadata lint: ${warnings.length} mutating action(s) missing effect/riskLevel`);\n for (const line of formatMetadataWarnings(warnings)) {\n dim(` ${line}`);\n }\n dim(' Declare them in registerScreen(): actions: [{ id, effect: \"write\" | \"destructive\", riskLevel: \"low\" | \"medium\" | \"high\" }]');\n\n if (strict) {\n error('--strict-metadata: failing due to missing action metadata');\n process.exit(1);\n }\n}\n","/**\n * Is the agent looking at this app, or at an older copy of it?\n *\n * The agent navigates by the MCP document that is ACTIVE on the server,\n * which is not necessarily the one this CLI last generated. They come\n * apart quietly: someone activates an older version from the dashboard,\n * a sync went to a different server than the one being tested, or the\n * database predates the seed learning to refuse partial documents\n * (apps/api/src/database/seeds/index.ts — \"seeding a two-screen stub is\n * what made the agent answer 'essa tela não está mapeada' for the rest\n * of the app\").\n *\n * However it happens, the failure that follows looks like a model\n * problem — missions fail on screens the agent \"should\" know — and gets\n * debugged as one. What it actually is: most of the app does not exist\n * as far as the agent is concerned.\n *\n * This module compares what the analyzer just found against what the\n * server says is active, and names the discrepancy out loud.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { warn, info } from './logger';\n\n/** The server's view, as returned by `GET /cli/status`. */\nexport interface RemoteActiveDocument {\n id: string;\n version: string;\n screensCount: number;\n}\n\nexport interface RemoteDrift {\n /** Screens in the document just generated locally. */\n localScreens: number;\n /** Screens in the document currently active on the server. */\n remoteScreens: number;\n remoteId: string;\n /**\n * The remote document is not merely different, it is drastically\n * smaller — the shape of a stub standing in for a real application map.\n */\n severe: boolean;\n}\n\n/**\n * A remote document with at most this fraction of the local screen count\n * is a different app, not a slightly older version of this one.\n *\n * Half, not a tenth: the stubs this guards against are small — 2 screens\n * for the example app, 5 for the QA personas — and 5 of 25 would slip\n * under an order-of-magnitude rule. Being wrong in this direction costs\n * a warning that a real upload immediately resolves; being wrong in the\n * other direction costs a debugging session aimed at the model.\n */\nconst STUB_RATIO = 0.5;\n\n/**\n * Compare the freshly generated document with the server's active one.\n *\n * Screen counts, deliberately — NOT checksums, even though both sides\n * have one. They are not comparable: the CLI hashes the pretty-printed\n * file it writes to disk (`JSON.stringify(doc, null, 2)`) while the\n * server hashes the compact body it received, so the two never agree and\n * a checksum comparison would report drift on every single call. Screen\n * count is coarse, and it is exactly the axis the failure this guards\n * against moves along: a stub has a handful of screens where the app has\n * dozens.\n *\n * Returns `null` when the counts match — as close to \"the agent is\n * looking at this app\" as this can honestly get.\n */\nexport function compareWithRemote(\n local: { screens: number },\n remote: RemoteActiveDocument,\n): RemoteDrift | null {\n if (remote.screensCount === local.screens) return null;\n\n return {\n localScreens: local.screens,\n remoteScreens: remote.screensCount,\n remoteId: remote.id,\n severe: local.screens > 0 && remote.screensCount <= local.screens * STUB_RATIO,\n };\n}\n\n/**\n * The last document this CLI generated, read back from `outputDir`.\n *\n * Lets `status` answer the question that matters before an e2e run —\n * \"is the server serving this app's map?\" — without re-analyzing the\n * source. Returns null when nothing has been generated yet, or when the\n * files are unreadable: a missing local artifact is not a drift finding.\n */\nexport function readLocalDocumentSummary(outputDir: string): { screens: number } | null {\n try {\n const raw = readFileSync(join(outputDir, 'mcp-document.json'), 'utf-8');\n const parsed = JSON.parse(raw) as { metadata?: { totalScreens?: number } };\n if (typeof parsed?.metadata?.totalScreens !== 'number') return null;\n return { screens: parsed.metadata.totalScreens };\n } catch {\n return null;\n }\n}\n\n/**\n * Print the drift. Loud for a stub, matter-of-fact for a plain version\n * difference (which `sync` is about to resolve by uploading anyway).\n *\n * `uploadFailed` changes the tense from \"this is what is active\" to\n * \"this is what is STILL active\", which is the whole point of reporting\n * it on a failed sync.\n */\nexport function reportRemoteDrift(\n drift: RemoteDrift,\n options: { uploadFailed?: boolean } = {},\n): void {\n if (!drift.severe) {\n info(\n `Server's active document differs from what was just generated ` +\n `(active: ${drift.remoteId}, ${drift.remoteScreens} screens).`,\n );\n return;\n }\n\n warn(\n `The agent is ${options.uploadFailed ? 'still ' : ''}running on a ` +\n `${drift.remoteScreens}-screen document while this app has ` +\n `${drift.localScreens} screens.`,\n );\n info(` Active on server: ${drift.remoteId} (${drift.remoteScreens} screens)`);\n info(` Just generated: ${drift.localScreens} screens`);\n info('');\n info('While a document that small is active the agent cannot see the other');\n info('screens, and missions that need them fail in ways that read as model');\n info('errors. The usual causes: an older version activated from the');\n info('dashboard, a sync that went to a different server, or a database');\n info('seeded before the seed learned to refuse partial documents.');\n info('');\n if (options.uploadFailed) {\n info('Nothing was uploaded just now, so this is unchanged. Fix the error');\n info('above and run sync again — e2e runs before that will fail on');\n info('navigation, not on anything the model did.');\n } else {\n info('Uploading now replaces it.');\n }\n}\n","/**\n * What to do about an upload that failed.\n *\n * The server's `code` and `message` say what happened; these lines say\n * what to change. Complements `hintUnreachableServer`, which covers the\n * one case of a `serverUrl` never set — this covers the ones where the\n * server answered and said no.\n */\n\nimport { info } from './logger';\n\nexport interface UploadFailure {\n error?: string;\n errorCode?: string;\n errorStatus?: number;\n}\n\n/** Print remediation for a failed `POST /cli/sync`. */\nexport function explainUploadFailure(failure: UploadFailure, serverUrl?: string): void {\n const status = failure.errorStatus ?? 0;\n\n if (status === 401) {\n info('');\n info('`sync` authenticates with the project API key (`ak_…`) — the same key');\n info('the SDK uses. Check that it is the key for THIS project, is still');\n info('active, and reaches the server you meant:');\n info(` Server: ${serverUrl ?? '(default)'}`);\n info('Set it in .appilotsrc (`apiKey`), via APPILOTS_API_KEY, or --api-key.');\n info('');\n info('A dashboard login token will not work here and is not needed: the CLI');\n info(\"talks to /cli/sync, not the dashboard's /mcp-documents.\");\n return;\n }\n\n if (failure.errorCode === 'WORKSPACE_INACTIVE') {\n info('');\n info('The workspace is deactivated. Re-activate it in the dashboard');\n info('(Settings → Workspace) and run sync again.');\n return;\n }\n\n if (status === 404) {\n info('');\n info(`No /cli/sync at ${serverUrl ?? '(default)'} — check serverUrl points at`);\n info('an Appilots API (and one recent enough to serve the CLI routes).');\n return;\n }\n\n if (status === 422) {\n info('');\n info('The server rejected the document itself. Inspect what was generated:');\n info(' .appilots/mcp-document.json');\n return;\n }\n\n if (status >= 500) {\n info('');\n info('The server failed to process the upload. It was retried already —');\n info('if it persists, the API logs hold the matching request id.');\n }\n}\n","/**\n * #400 — an application map with no screens is a failed integration, not\n * a result.\n *\n * `npx create-expo-app` has generated Expo Router by default for about\n * three years, so it is the modal shape of a new React Native app. Those\n * projects have no `NavigationContainer` and no `Stack.Screen`, which is\n * what the analyzer looks for. They install clean, build clean, and sync\n * clean — and get a map with zero screens and a null `currentScreen`.\n *\n * Nothing anywhere in that path told the customer they had integrated\n * something that does not work. That silence is the bug; this is the\n * noise.\n */\n\nimport type { MCPDocument } from '../../generators/types';\nimport { error, info } from './logger';\n\nexport interface EmptyDocumentOptions {\n /** Where the analyzer looked, for the message. */\n rootDir?: string;\n /** Set by `--allow-empty` for the rare app that means it. */\n allowEmpty?: boolean;\n}\n\n/**\n * Fail loudly when the generated document declares no screens.\n *\n * Deliberately fatal rather than a warning: a warning scrolls past in CI\n * and the customer is left with a working-looking pipeline producing an\n * agent that cannot navigate anywhere.\n */\nexport function assertDocumentHasScreens(\n document: MCPDocument,\n options: EmptyDocumentOptions = {},\n): void {\n if ((document.metadata?.totalScreens ?? 0) > 0) return;\n if (options.allowEmpty) {\n info('No screens found, continuing because --allow-empty was passed.');\n return;\n }\n\n error('No screens found — this application map would give the agent nothing to navigate.');\n info('');\n info('The analyzer looks for React Navigation: a <NavigationContainer> and');\n info('<Stack.Screen> / <Tab.Screen> declarations. It found none.');\n info('');\n info('The two usual causes:');\n info(' • The app uses Expo Router (or another file-based router). It is the');\n info(' default for `npx create-expo-app` and the analyzer cannot read it.');\n info(' • The screens live outside the analyzed paths — check `include`,');\n info(' `exclude` and `screenPatterns` in your Appilots config.');\n info('');\n info('The escape hatch, which works for any router: declare your screens in');\n info('an `appilots.manifest.json` at the project root. Its screens are merged');\n info('on top of whatever the analyzer found, so a fully declared app needs no');\n info('React Navigation at all. See the CLI docs for the shape.');\n info('');\n info('If an empty map really is what you want, pass --allow-empty.');\n process.exit(1);\n}\n","import { Command } from 'commander';\nimport { watch } from 'node:fs';\nimport { join } from 'node:path';\nimport { MCPGenerator } from '../../generators/MCPGenerator';\nimport { AppilotsAPIClient } from '../../services/api-client';\nimport { loadConfig } from '../../config/index';\nimport { banner, success, error, info, createSpinner, dim, warn } from '../utils/logger';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface WatchOptions {\n verbose?: boolean;\n}\n\nexport function watchCommand(): Command {\n return new Command('watch')\n .description('Watch project for changes and auto-sync MCP documents')\n .option('--verbose', 'Enable verbose logging', false)\n .action(async (options: WatchOptions) => {\n try {\n banner();\n\n // Load configuration\n const config = loadConfig(warn);\n if (!config) {\n error('No .appilotsrc configuration found');\n info('Run: appilots init --api-key <your-key>');\n process.exit(1);\n }\n\n // Initialize API client\n const apiClient = new AppilotsAPIClient({\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n });\n\n // Do initial sync\n info('Performing initial sync...');\n const generatorConfig = {\n rootDir: process.cwd(),\n outputDir: config.outputDir || '.appilots',\n format: 'json' as const,\n strictScreens: config.strictScreens,\n screenPatterns: config.screenPatterns,\n include: config.include,\n exclude: config.exclude,\n navigationInclude: config.navigationInclude,\n navigationExclude: config.navigationExclude,\n // Same analyzer selection `generate` and `sync` already do —\n // without these, watching a non-`react-native` project would\n // silently run the RN analyzers and ignore the manifest.\n platform: config.platform,\n manifestPath: config.manifestPath,\n };\n\n const generator = new MCPGenerator(generatorConfig);\n\n const initialOutput = await generator.generate();\n const initialSync = await apiClient.sync(\n initialOutput.document,\n initialOutput.document.version,\n );\n\n if (!initialSync.success) {\n error(`Initial sync failed: ${initialSync.error}`);\n process.exit(1);\n }\n\n success('Initial sync completed');\n info(`Watching for changes in ${config.outputDir || '.appilots'}...`);\n dim('Press Ctrl+C to stop\\n');\n\n // Set up file watcher\n let debounceTimer: NodeJS.Timeout | null = null;\n const DEBOUNCE_MS = 500;\n\n const watcher = watch(process.cwd(), { recursive: true }, async (eventType, filename) => {\n if (!filename) return;\n\n // Skip hidden files, node_modules, and output directory\n if (\n filename.startsWith('.') ||\n filename.includes('node_modules') ||\n filename.includes(config.outputDir || '.appilots')\n ) {\n return;\n }\n\n // Debounce rapid changes\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n try {\n if (options.verbose) {\n info(`Change detected: ${filename}`);\n }\n\n const spinner = createSpinner('Re-analyzing project...');\n spinner.start();\n\n const newGenerator = new MCPGenerator(generatorConfig);\n\n const output = await newGenerator.generate();\n spinner.text = 'Uploading changes...';\n\n const syncResult = await apiClient.sync(output.document, output.document.version);\n spinner.stop();\n\n if (!syncResult.success) {\n error(`Sync failed: ${syncResult.error}`);\n } else if (syncResult.unchanged) {\n info('Changes synced (no content changes detected)');\n } else {\n success('Changes synced successfully');\n info(\n `${output.document.metadata.totalScreens} screens, ` +\n `${output.document.metadata.totalForms} forms, ` +\n `${output.document.metadata.totalActions} actions`,\n );\n }\n } catch (err) {\n error(`Watch sync failed: ${stringifyUnknown(err)}`);\n }\n }, DEBOUNCE_MS);\n });\n\n // Handle graceful shutdown\n process.on('SIGINT', () => {\n info('Stopping watcher...');\n watcher.close();\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n process.exit(0);\n });\n } catch (err) {\n error(`Watch failed: ${stringifyUnknown(err)}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { MCPGenerator } from '../../generators/MCPGenerator';\nimport { loadConfig } from '../../config/index';\nimport { banner, success, error, info, createSpinner, warn } from '../utils/logger';\nimport { reportMetadataLint } from '../utils/metadata-report';\nimport { assertDocumentHasScreens } from '../utils/empty-document';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface GenerateOptions {\n output?: string;\n format?: string;\n strictMetadata?: boolean;\n allowEmpty?: boolean;\n}\n\nexport function generateCommand(): Command {\n return new Command('generate')\n .description('Generate MCP documents from project source (local only)')\n .option('-o, --output <path>', 'Output directory for MCP documents', '.appilots')\n .option('-f, --format <format>', 'Output format (only json supported)', 'json')\n .option(\n '--strict-metadata',\n 'Fail when mutating actions are missing effect/riskLevel metadata',\n false,\n )\n .option('--allow-empty', 'Do not fail when the application map has zero screens', false)\n .action(async (options: GenerateOptions) => {\n try {\n banner();\n\n // §2: Reject unsupported formats explicitly\n if (options.format && options.format !== 'json') {\n error(`Format \"${options.format}\" is not supported yet. Only \"json\" is available.`);\n process.exit(1);\n }\n\n const spinner = createSpinner('Analyzing project...');\n spinner.start();\n\n // Best-effort: `generate` works local-only, without an API key, so\n // a missing/invalid .appilotsrc must not block it. Only the new\n // `platform`/`manifestPath` fields are threaded through here —\n // every other MCPGenerator option keeps `generate`'s pre-existing\n // behavior (defaults only) so this doesn't change output for\n // projects that already have a .appilotsrc with unrelated fields set.\n let loaded: ReturnType<typeof loadConfig> = null;\n try {\n loaded = loadConfig(warn);\n } catch {\n loaded = null;\n }\n\n const generator = new MCPGenerator({\n rootDir: process.cwd(),\n outputDir: options.output || '.appilots',\n format: 'json',\n platform: loaded?.platform,\n manifestPath: loaded?.manifestPath,\n });\n\n const output = await generator.generate();\n spinner.stop();\n\n assertDocumentHasScreens(output.document, {\n rootDir: process.cwd(),\n allowEmpty: Boolean(options.allowEmpty),\n });\n\n success(\n `Generated MCP document with ${output.document.metadata.totalScreens} screens, ` +\n `${output.document.metadata.totalForms} forms, ${output.document.metadata.totalActions} actions`,\n );\n info(`Written to: ${output.filePath}`);\n info(`Checksum: ${output.checksum}`);\n\n reportMetadataLint(output.document, Boolean(options.strictMetadata));\n } catch (err) {\n error(`Generation failed: ${stringifyUnknown(err)}`);\n process.exit(1);\n }\n });\n}\n","/**\n * `appilots annotate` — write the missing testIDs, as a reviewable diff.\n *\n * Dry run is the DEFAULT, and `--write` is the only way to touch a file.\n * Nothing else in this CLI edits a customer's source, and the failure mode\n * of getting it wrong is not a bad suggestion — it is an unexplained diff in\n * someone else's repository.\n */\n\nimport { readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { Command } from 'commander';\nimport glob from 'fast-glob';\n\nimport { loadConfig } from '../../config/index';\nimport { findAnnotationSites } from '../../annotate/sites';\nimport { applyToFile, type FileEdit, type PlannedSite } from '../../annotate/apply';\nimport { resetForwardingCache, resolveRelativeImport } from '../../annotate/forwarding';\nimport { applyForward, planForward, type ForwardPlan } from '../../annotate/forward';\nimport {\n banner,\n createSpinner,\n dim,\n error,\n heading,\n info,\n jsonOutput,\n setLogMode,\n success,\n warn,\n} from '../utils/logger';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface AnnotateOptions {\n write?: boolean;\n forward?: boolean;\n include?: string[];\n json?: boolean;\n quiet?: boolean;\n}\n\n/**\n * Screens only, by default.\n *\n * A shared component is the wrong place for a literal `testID`: every\n * instance of `<Card>` would answer to the same name, which is the tie the\n * matcher refuses. What a shared component needs is to FORWARD the prop —\n * exactly what the \"skipped\" report asks its author to add — so that each\n * call site can name its own instance.\n *\n * `--include` widens this deliberately, for the case where someone really\n * does want to annotate a one-off component.\n */\nconst DEFAULT_INCLUDE = ['src/**/*Screen.{tsx,jsx}', 'src/**/screens/**/*.{tsx,jsx}'];\nconst DEFAULT_EXCLUDE = ['**/node_modules/**', '**/dist/**', '**/*.test.*', '**/__tests__/**'];\n\nexport function annotateCommand(): Command {\n return new Command('annotate')\n .description(\n 'Add missing testIDs to interactive elements so the agent can address them (dry run by default)',\n )\n .option('--write', 'Actually modify the files (default: report only)', false)\n .option(\n '--forward',\n 'Also teach a shared component to accept and pass through testID, when its call sites are blocked only by that',\n false,\n )\n .option('-i, --include <globs...>', 'Glob patterns to scan', undefined)\n .option('--json', 'Emit a machine-readable report', false)\n .option('--quiet', 'Only warnings and errors', false)\n .action(async (options: AnnotateOptions) => {\n try {\n if (options.json) setLogMode('json');\n else if (options.quiet) setLogMode('quiet');\n banner();\n\n let loaded: ReturnType<typeof loadConfig> = null;\n try {\n loaded = loadConfig(warn);\n } catch {\n loaded = null;\n }\n\n const rootDir = process.cwd();\n // NOT `loaded.include`: that is the generator's ANALYSIS scope (the\n // whole tree, so component files inform the document). Writing to\n // every file it reads is a different and much larger promise.\n const include = options.include ?? DEFAULT_INCLUDE;\n const exclude = loaded?.exclude ?? DEFAULT_EXCLUDE;\n\n const spinner = createSpinner('Scanning for unaddressable controls...');\n spinner.start();\n\n resetForwardingCache();\n const files = await glob(include, { cwd: rootDir, ignore: exclude, absolute: true });\n\n const scan = async (): Promise<FileEdit[]> => {\n const out: FileEdit[] = [];\n for (const file of files) {\n const source = await readFile(file, 'utf-8');\n const sites = findAnnotationSites(source, file);\n if (sites.length === 0) continue;\n out.push(applyToFile(source, sites));\n }\n return out;\n };\n\n let edits = await scan();\n let forwards: ForwardPlan[] = [];\n\n if (options.forward) {\n forwards = await planForwards(edits, rootDir);\n const applied = forwards.filter((plan) => !plan.refusal);\n if (options.write && applied.length > 0) {\n for (const plan of applied) {\n const before = await readFile(plan.file, 'utf-8');\n await writeFile(plan.file, applyForward(before, plan), 'utf-8');\n }\n // Those components now carry the prop, so their call sites are\n // no longer blocked. Re-scan rather than reason about it: the\n // second pass reads the file we just wrote.\n resetForwardingCache();\n edits = await scan();\n }\n }\n\n spinner.stop();\n\n const written = edits.flatMap((edit) => edit.written);\n const blocked = edits.flatMap((edit) => edit.blocked);\n const touched = edits.filter((edit) => edit.written.length > 0);\n\n if (written.length === 0 && blocked.length === 0) {\n success('Every interactive control already has something to address it by.');\n if (options.json) {\n jsonOutput({ ok: true, scanned: files.length, annotated: 0, blocked: 0, sites: [] });\n }\n return;\n }\n\n if (options.write) {\n for (const edit of touched) {\n await writeFile(edit.file, edit.content, 'utf-8');\n }\n }\n\n reportSites(rootDir, touched, blocked, options.write === true, forwards);\n\n if (options.json) {\n jsonOutput({\n ok: true,\n scanned: files.length,\n written: options.write === true,\n annotated: written.length,\n blocked: blocked.length,\n files: touched.map((edit) => path.relative(rootDir, edit.file)),\n sites: [...written, ...blocked].map((site) => ({\n file: path.relative(rootDir, site.file),\n line: site.line,\n component: site.component,\n role: site.role,\n testId: site.testId,\n outcome: site.outcome,\n reason: site.blockedReason,\n })),\n });\n }\n } catch (err) {\n error(`Annotate failed: ${stringifyUnknown(err)}`);\n process.exit(1);\n }\n });\n}\n\n/**\n * For each component blocking call sites, work out whether it can be taught\n * to carry the prop. Keyed by component name so a component rendered on ten\n * screens is planned once — the edit is to its definition, not to the uses.\n */\nasync function planForwards(edits: FileEdit[], rootDir: string): Promise<ForwardPlan[]> {\n const seen = new Set<string>();\n const plans: ForwardPlan[] = [];\n\n for (const edit of edits) {\n for (const site of edit.blocked) {\n if (site.outcome !== 'blocked-swallows') continue;\n if (seen.has(site.component)) continue;\n seen.add(site.component);\n\n const source = await readFile(site.file, 'utf-8');\n const origin = findImportSource(source, site.component);\n // No import means the component is defined in this same screen file.\n const target = origin ? resolveRelativeImport(site.file, origin) : site.file;\n if (!target) {\n plans.push({\n file: site.file,\n component: site.component,\n edits: [],\n roots: 0,\n refusal: `cannot locate the source of <${site.component}>`,\n });\n continue;\n }\n plans.push(planForward(target, site.component));\n }\n }\n\n void rootDir;\n return plans;\n}\n\n/** The module specifier a named binding was imported from, if any. */\nfunction findImportSource(source: string, name: string): string | undefined {\n const pattern = new RegExp(\n String.raw`import\\s*\\{[^}]*\\b${name}\\b[^}]*\\}\\s*from\\s*['\"]([^'\"]+)['\"]`,\n );\n return pattern.exec(source)?.[1];\n}\n\nfunction reportSites(\n rootDir: string,\n touched: FileEdit[],\n blocked: PlannedSite[],\n didWrite: boolean,\n forwards: ForwardPlan[],\n): void {\n const written = touched.flatMap((edit) => edit.written);\n\n if (written.length > 0) {\n heading(didWrite ? 'Added' : 'Would add');\n for (const edit of touched) {\n info(path.relative(rootDir, edit.file));\n for (const site of edit.written) {\n dim(` ${String(site.line).padStart(4)} <${site.component}> testID=\"${site.testId}\"`);\n }\n }\n }\n\n const teachable = new Map(\n forwards.filter((plan) => !plan.refusal).map((plan) => [plan.component, plan]),\n );\n\n if (teachable.size > 0) {\n heading(didWrite ? 'Taught to carry testID' : 'Would teach to carry testID');\n for (const plan of teachable.values()) {\n info(`<${plan.component}> ${path.relative(rootDir, plan.file)}`);\n for (const edit of plan.edits) {\n dim(` ${edit.what}: ${edit.text.trim()}`);\n }\n }\n }\n\n if (blocked.length > 0) {\n // Grouped by component: the fix is one edit to that component, not one\n // per call site, and a list of 12 identical lines hides that.\n heading('Skipped — the prop would not survive to the runtime');\n const byComponent = new Map<string, PlannedSite[]>();\n for (const site of blocked) {\n const group = byComponent.get(site.component) ?? [];\n group.push(site);\n byComponent.set(site.component, group);\n }\n for (const [component, group] of byComponent) {\n if (teachable.has(component)) continue;\n warn(`<${component}> — ${group.length} site${group.length === 1 ? '' : 's'}`);\n const refusal = forwards.find((plan) => plan.component === component)?.refusal;\n dim(` ${group[0]!.blockedReason}`);\n if (refusal) dim(` --forward cannot do it either: ${refusal}`);\n }\n }\n\n if (!didWrite && written.length > 0) {\n info('');\n info(`Nothing was written. Re-run with --write to apply ${written.length} change(s).`);\n } else if (didWrite) {\n success(`Wrote ${written.length} testID(s) across ${touched.length} file(s).`);\n info('Re-run `appilots generate` so the document picks them up.');\n }\n}\n","/**\n * Where a `testID` is missing, and what it should say.\n *\n * The work queue comes straight out of the coverage measurement: of the 37\n * interaction sites `apps/example-app` still hides from the document, 33\n * carry no declared identity at all — no `testID`, no `appilotsId`, no\n * `accessibilityLabel`. Classification is no longer what is missing (see\n * `classify.ts`); identity is. This is the only thing that writes identity\n * where there is none.\n *\n * What is deliberately NOT queued: a control the runtime can already name.\n * `<Button title=\"Salvar\" onPress={save} />` needs nothing — the walker\n * folds the visible text into `salvar` — and adding a redundant `testID`\n * would be churn in someone else's repository for no capability gained.\n */\n\nimport _traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nimport { parseSource } from '../ast/parse';\nimport { classifyJsxComponent, pressHandlerProp } from '../ast/jsx/classify';\nimport { findJsxAttribute, getStringAttr } from '../ast/jsx/attributes';\nimport { canCarryTestId, collectImports, type CarrierVerdict } from './forwarding';\n\nconst traverse = (_traverse as unknown as { default?: typeof _traverse }).default ?? _traverse;\n\n/** Props whose string value already gives the runtime something to match on. */\nconst LABEL_PROPS = ['title', 'label', 'placeholder'] as const;\n/** Props that already declare an identity. */\nconst IDENTITY_PROPS = ['testID', 'appilotsId', 'accessibilityLabel'] as const;\n\nexport interface AnnotationSite {\n file: string;\n line: number;\n column: number;\n component: string;\n role: string;\n /** The prop that fires it, when it is a press-like control. */\n pressProp?: string;\n /** Named handler at the call site, when it is not an inline arrow. */\n handler?: string;\n /** The id we would write. */\n testId: string;\n /** Whether the component can actually deliver the prop to the runtime. */\n carrier: CarrierVerdict;\n /** Byte offset just after the element's name, where the prop is inserted. */\n insertAt: number;\n /**\n * The exact text to splice in at `insertAt`.\n *\n * Computed here rather than in the writer because it depends on how the\n * element is laid out, and getting it wrong is not cosmetic: appending\n * inline to a MULTI-LINE element yields `<RefreshControl testID=\"x\"` with\n * the remaining props below it, which Prettier immediately reformats — so\n * a repository with a format check would fail CI on our diff.\n */\n insertText: string;\n}\n\nfunction kebab(text: string): string {\n return text\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/** `handleAddMileage` → `add-mileage`; `onRetry` → `retry`; `load` → `load`. */\nfunction verbOf(name: string): string {\n return kebab(name.replace(/^(handle|on)(?=[A-Z])/, ''));\n}\n\n/** `InvoiceListScreen.tsx` → `invoice-list`; `index.tsx` → its directory. */\nexport function scopeSlugForFile(file: string): string {\n const base = file.replace(/\\\\/g, '/').split('/').pop() ?? file;\n const name = base.replace(/\\.[jt]sx?$/, '');\n if (name.toLowerCase() === 'index') {\n const dir = file.replace(/\\\\/g, '/').split('/').slice(-2, -1)[0] ?? '';\n return kebab(dir);\n }\n return kebab(name.replace(/Screen$/, ''));\n}\n\n/**\n * Drop a word the composition already used.\n *\n * Adjacency is not enough: `RefreshControl` + `onRefresh` produces\n * `refresh-control-refresh`, where the repeat is two tokens apart. Keeping\n * the FIRST occurrence preserves reading order, so `invoice-list` +\n * `ListFooter` + `retry` still reads `invoice-list-footer-retry`.\n */\nfunction collapseRepeats(slug: string): string {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const token of slug.split('-')) {\n if (!token || seen.has(token)) continue;\n seen.add(token);\n out.push(token);\n }\n return out.join('-');\n}\n\n/**\n * Compose an id a human would recognize in a diff — and that no other\n * element on the device answers to.\n *\n * The screen scope is not decoration. `testID` is a RUNTIME-global name,\n * and nine screens in the testbed render an `<ErrorState onRetry>`: without\n * the prefix this minted `error-state-retry` nine times, and a duplicate id\n * is worse than a missing one — the shared matcher refuses on a tie, so the\n * agent would go from \"cannot see it\" to \"can see nine of it\".\n *\n * After the scope: a purpose-named prop already says what the control does\n * (`invoice-list-error-state-retry`), a plain `onPress` says nothing so the\n * handler carries the meaning (`home-card-open-invoice`), and with neither\n * the ordinal is what is left.\n */\nexport function deriveTestId(site: {\n scope: string;\n component: string;\n pressProp?: string;\n handler?: string;\n ordinal: number;\n}): string {\n const base = [site.scope, kebab(site.component)].filter(Boolean).join('-');\n if (site.pressProp && site.pressProp !== 'onPress') {\n return collapseRepeats(`${base}-${verbOf(site.pressProp)}`);\n }\n if (site.handler) {\n const verb = verbOf(site.handler);\n return collapseRepeats(verb ? `${base}-${verb}` : base);\n }\n return collapseRepeats(`${base}-${site.ordinal}`);\n}\n\nfunction hasAnyProp(element: t.JSXOpeningElement, names: readonly string[]): boolean {\n return names.some((name) => findJsxAttribute(element, name) !== undefined);\n}\n\nfunction hasLabelText(element: t.JSXOpeningElement): boolean {\n return LABEL_PROPS.some((name) => {\n const value = getStringAttr(element, name);\n return typeof value === 'string' && value.trim().length > 0;\n });\n}\n\nfunction namedHandler(element: t.JSXOpeningElement, prop: string | undefined): string | undefined {\n if (!prop) return undefined;\n const attr = findJsxAttribute(element, prop);\n if (!attr || !t.isJSXExpressionContainer(attr.value)) return undefined;\n return t.isIdentifier(attr.value.expression) ? attr.value.expression.name : undefined;\n}\n\n/** Roles worth addressing. `view` and `custom` are not controls. */\nconst ANNOTATABLE_ROLES = new Set(['button', 'input', 'select', 'toggle', 'date', 'list']);\n\n/**\n * Is this element rendered once PER ITEM?\n *\n * A literal `testID` inside a `.map()` or a `renderItem` is one name for N\n * runtime elements — the same duplicate-id failure the screen scope was\n * added to prevent, arriving from a different direction. Caught live: the\n * first `--forward` run put `testID=\"home-card-1\"` on a `<Card>` inside\n * `vehicles.slice(0, 3).map(…)`, which would have given three cards the\n * same handle and made the matcher refuse all three.\n *\n * These are not stranded, which is why refusing costs little: the walker\n * already addresses list rows positionally (`list-0-item-2`), and the row's\n * own text disambiguates it. What they need is a COMPUTED id, and choosing\n * which field keys it is the developer's call, not ours.\n */\nfunction isPerItemRender(nodePath: {\n parentPath?: { node: t.Node; parentPath?: unknown } | null;\n}): boolean {\n let current = nodePath.parentPath as { node: t.Node; parentPath?: unknown } | null | undefined;\n while (current) {\n const node = current.node;\n if (\n t.isCallExpression(node) &&\n t.isMemberExpression(node.callee) &&\n t.isIdentifier(node.callee.property) &&\n (node.callee.property.name === 'map' || node.callee.property.name === 'flatMap')\n ) {\n return true;\n }\n if (\n t.isJSXAttribute(node) &&\n t.isJSXIdentifier(node.name) &&\n /^render[A-Z]|^ListHeaderComponent$|^ListFooterComponent$/.test(node.name.name) &&\n node.name.name !== 'renderScrollComponent'\n ) {\n // `renderItem` renders per row; `ListFooterComponent` renders once, so\n // only the per-row ones count.\n return /^renderItem$|^renderSectionHeader$|^renderSectionFooter$/.test(node.name.name);\n }\n current = current.parentPath as { node: t.Node; parentPath?: unknown } | null | undefined;\n }\n return false;\n}\n\nexport function findAnnotationSites(source: string, file: string): AnnotationSite[] {\n let ast: t.File;\n try {\n ast = parseSource(source);\n } catch {\n return [];\n }\n\n const imports = collectImports(ast);\n const scope = scopeSlugForFile(file);\n const sites: AnnotationSite[] = [];\n const perComponent = new Map<string, number>();\n const usedIds = new Set<string>();\n\n // Ids already spoken for in this file — never mint a collision with one.\n traverse(ast as never, {\n JSXOpeningElement(nodePath: { node: t.JSXOpeningElement }) {\n for (const prop of IDENTITY_PROPS) {\n const existing = getStringAttr(nodePath.node, prop);\n if (existing) usedIds.add(existing);\n }\n },\n });\n\n traverse(ast as never, {\n JSXOpeningElement(nodePath: {\n node: t.JSXOpeningElement;\n parentPath?: { node: t.Node; parentPath?: unknown } | null;\n }) {\n const element = nodePath.node;\n if (!t.isJSXIdentifier(element.name)) return;\n const component = element.name.name;\n\n const role = classifyJsxComponent(component, element);\n if (!ANNOTATABLE_ROLES.has(role)) return;\n\n // Already addressable — declared id, or visible text the walker folds.\n if (hasAnyProp(element, IDENTITY_PROPS)) return;\n if (role === 'button' && hasLabelText(element)) return;\n\n const carrier = canCarryTestId(component, file, imports);\n // The component already publishes an identity of its own. A second\n // one competing with it is a tie, and the matcher refuses ties.\n if (carrier === 'derives') return;\n // One literal name cannot serve N rendered instances.\n if (isPerItemRender(nodePath)) return;\n\n const pressProp = pressHandlerProp(element) ?? undefined;\n const handler = namedHandler(element, pressProp);\n const ordinal = (perComponent.get(component) ?? 0) + 1;\n perComponent.set(component, ordinal);\n\n let testId = deriveTestId({ scope, component, pressProp, handler, ordinal });\n if (usedIds.has(testId)) {\n let suffix = 2;\n while (usedIds.has(`${testId}-${suffix}`)) suffix += 1;\n testId = `${testId}-${suffix}`;\n }\n usedIds.add(testId);\n\n const line = element.loc?.start.line ?? 0;\n const nameEndLine = element.name.loc?.end.line ?? line;\n const firstAttr = element.attributes[0];\n const firstAttrLoc = firstAttr?.loc?.start;\n const isMultiline = !!firstAttrLoc && firstAttrLoc.line !== nameEndLine;\n const insertText = isMultiline\n ? `\\n${' '.repeat(firstAttrLoc.column)}testID=\"${testId}\"`\n : ` testID=\"${testId}\"`;\n\n sites.push({\n file,\n line,\n column: element.loc?.start.column ?? 0,\n component,\n role,\n pressProp,\n handler,\n testId,\n carrier,\n // Just past the element name — before any existing attribute, so a\n // multi-line element keeps its formatting and the new prop reads\n // first in the diff.\n insertAt: element.name.end ?? element.start ?? 0,\n insertText,\n });\n },\n });\n\n return sites;\n}\n","/**\n * Can this component actually carry a `testID` to the runtime?\n *\n * The question exists because writing the prop is not the same as the prop\n * arriving. React silently drops an unknown prop on a function component —\n * it is only an object key nobody read. So:\n *\n * <Card onPress={open} testID=\"card-1\" />\n *\n * looks annotated, compiles, renders, and reaches the device as nothing at\n * all, because `Card` destructures `{ children, onPress, style, variant }`\n * and never passes `testID` down. The MCP document would then advertise\n * `card-1`, the agent would aim at it, and the walker would have no such\n * element. That is the same confident-failure shape the whole provenance\n * effort exists to prevent — manufactured by the tool meant to fix it.\n *\n * Both halves of the check are shallow and local. Following the import one\n * level is worth it HERE, where the answer is verifiable and bounded to one\n * lookup per distinct component, in a way it was not worth it for\n * classification (see `classify.ts`).\n */\n\nimport path from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nimport _traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nimport { parseSource } from '../ast/parse';\n\nconst traverse = (_traverse as unknown as { default?: typeof _traverse }).default ?? _traverse;\n\nexport type CarrierVerdict =\n /** A React Native host primitive — `testID` is part of its contract. */\n | 'rn-primitive'\n /** A local component whose source accepts or spreads `testID`. */\n | 'forwards'\n /**\n * The component names ITSELF, from its own props — `testID={\\`toggle-${id}\\`}`,\n * `accessibilityLabel={label}`, a `useAppilotsTarget` registration.\n *\n * Its call sites need nothing. Annotating one would hand the element a\n * SECOND identity competing with the one it already publishes, and the\n * shared matcher refuses on a tie — so the \"fix\" would make the control\n * less addressable, not more.\n *\n * Every component the first version of this check reported as blocked in\n * `apps/example-app` turned out to be this: `ToggleRow`, `SettingToggle`\n * and `RadioOptionRow` all build a testID from a prop. All 15 \"blocked\"\n * sites were false positives.\n */\n | 'derives'\n /** A local component that destructures its props and drops `testID`. */\n | 'swallows'\n /** Imported from a package we cannot read, or resolved to no file. */\n | 'unverifiable';\n\n/**\n * React Native components that take `testID` as part of their public API.\n * Only the ones an app actually annotates — this is not a full inventory,\n * and anything missing merely falls through to the import check.\n */\nexport const RN_TESTID_CARRIERS = new Set([\n 'View',\n 'Text',\n 'TextInput',\n 'Image',\n 'ImageBackground',\n 'ScrollView',\n 'FlatList',\n 'SectionList',\n 'VirtualizedList',\n 'TouchableOpacity',\n 'TouchableHighlight',\n 'TouchableWithoutFeedback',\n 'TouchableNativeFeedback',\n 'Pressable',\n 'Button',\n 'Switch',\n 'Modal',\n 'RefreshControl',\n 'ActivityIndicator',\n 'SafeAreaView',\n 'KeyboardAvoidingView',\n 'Slider',\n]);\n\nexport interface ImportOrigin {\n /** Module specifier, e.g. `react-native` or `../../components`. */\n source: string;\n /** Name in the importing file, after any `as` rename. */\n local: string;\n /** Name in the exporting module (`default` for a default import). */\n imported: string;\n}\n\n/** Map every imported binding in a file to where it came from. */\nexport function collectImports(ast: t.File): Map<string, ImportOrigin> {\n const out = new Map<string, ImportOrigin>();\n traverse(ast as never, {\n ImportDeclaration(nodePath: { node: t.ImportDeclaration }) {\n const source = nodePath.node.source.value;\n for (const spec of nodePath.node.specifiers) {\n if (t.isImportSpecifier(spec)) {\n const imported = t.isIdentifier(spec.imported) ? spec.imported.name : spec.imported.value;\n out.set(spec.local.name, { source, local: spec.local.name, imported });\n } else if (t.isImportDefaultSpecifier(spec)) {\n out.set(spec.local.name, { source, local: spec.local.name, imported: 'default' });\n }\n }\n },\n });\n return out;\n}\n\nconst EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js'];\n\n/**\n * Resolve a relative import to a file on disk. Deliberately does NOT\n * implement Node resolution: only relative specifiers, only the four\n * extensions the analyzers already parse, plus `index.*` for a directory.\n * Anything else is `unverifiable`, which is a reported outcome rather than\n * a silent one.\n */\nexport function resolveRelativeImport(fromFile: string, source: string): string | undefined {\n if (!source.startsWith('.')) return undefined;\n const base = path.resolve(path.dirname(fromFile), source);\n\n for (const ext of EXTENSIONS) {\n const candidate = `${base}${ext}`;\n if (existsSync(candidate)) return candidate;\n }\n for (const ext of EXTENSIONS) {\n const candidate = path.join(base, `index${ext}`);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/**\n * Does the source of a module hand `testID` onward?\n *\n * Three shapes count, and the first two are what a hand-written component\n * looks like:\n *\n * function Card({ testID, onPress }) { … } // destructured\n * interface CardProps { testID?: string } // declared in props\n * function Card(props) { return <View {...props} /> } // spread onward\n *\n * A barrel (`export { Card } from './Card'`) is followed one hop, because\n * `../../components` is how every screen in a real app imports.\n */\ninterface ModuleIdentity {\n /** Accepts or spreads `testID`, so a call site can name the instance. */\n forwards: boolean;\n /** Publishes an identity built from its own props — nothing to annotate. */\n derives: boolean;\n}\n\n/** Hooks that register a control with the SDK under a computed id. */\nconst IDENTITY_HOOKS = new Set([\n 'useAppilotsTarget',\n 'useAppilotsField',\n 'useAppilotsToggle',\n 'useAppilotsSlider',\n]);\n\nfunction inspectModule(file: string, exportName: string, depth = 0): ModuleIdentity {\n const none: ModuleIdentity = { forwards: false, derives: false };\n if (depth > 2) return none;\n let source: string;\n try {\n source = readFileSync(file, 'utf-8');\n } catch {\n return none;\n }\n\n // Cheap pre-check: a file that names no identity, spreads nothing and\n // registers nothing cannot do either.\n const mentionsIdentity =\n source.includes('testID') ||\n source.includes('accessibilityLabel') ||\n source.includes('useAppilots') ||\n /\\{\\s*\\.\\.\\./.test(source);\n if (!mentionsIdentity && !/export\\s*\\{[^}]*\\}\\s*from/.test(source)) return none;\n\n let ast: t.File;\n try {\n ast = parseSource(source);\n } catch {\n return none;\n }\n\n let forwards = false;\n let derives = false;\n let barrelTarget: string | undefined;\n\n traverse(ast as never, {\n // `export { Card } from './Card'` — follow one hop.\n ExportNamedDeclaration(nodePath: { node: t.ExportNamedDeclaration }) {\n const from = nodePath.node.source?.value;\n if (!from) return;\n const named = nodePath.node.specifiers.some(\n (spec) =>\n t.isExportSpecifier(spec) &&\n (t.isIdentifier(spec.exported) ? spec.exported.name : spec.exported.value) === exportName,\n );\n if (named) barrelTarget = from;\n },\n ExportAllDeclaration(nodePath: { node: t.ExportAllDeclaration }) {\n barrelTarget ??= nodePath.node.source.value;\n },\n // `interface CardProps { testID?: string }` / `type Props = { testID… }`\n TSPropertySignature(nodePath: { node: t.TSPropertySignature }) {\n if (t.isIdentifier(nodePath.node.key) && nodePath.node.key.name === 'testID') forwards = true;\n },\n // `function Card({ testID }) {}` — the destructured parameter.\n ObjectProperty(nodePath: { node: t.ObjectProperty }) {\n if (t.isIdentifier(nodePath.node.key) && nodePath.node.key.name === 'testID') forwards = true;\n },\n // `<View {...props} />` — anything spread onto JSX carries it along.\n JSXSpreadAttribute() {\n forwards = true;\n },\n // `testID={`toggle-${id}`}` / `accessibilityLabel={label}` — the\n // component naming itself from a prop. A STRING literal does not count:\n // that is one hardcoded name shared by every instance, which is the\n // duplicate-id problem rather than a solution to it.\n JSXAttribute(nodePath: { node: t.JSXAttribute }) {\n const name = t.isJSXIdentifier(nodePath.node.name) ? nodePath.node.name.name : '';\n if (name !== 'testID' && name !== 'accessibilityLabel') return;\n const value = nodePath.node.value;\n if (!t.isJSXExpressionContainer(value)) return;\n if (t.isStringLiteral(value.expression)) return;\n derives = true;\n },\n // `useAppilotsTarget(`${groupId}-${option.value}`, …)`\n CallExpression(nodePath: { node: t.CallExpression }) {\n const callee = nodePath.node.callee;\n if (t.isIdentifier(callee) && IDENTITY_HOOKS.has(callee.name)) derives = true;\n },\n });\n\n if (forwards || derives) return { forwards, derives };\n if (barrelTarget) {\n const next = resolveRelativeImport(file, barrelTarget);\n if (next) return inspectModule(next, exportName, depth + 1);\n }\n return none;\n}\n\n/** Cache keyed by `<file>#<export>` — a barrel is read once per run. */\nconst verdictCache = new Map<string, ModuleIdentity>();\n\n/**\n * Can `componentName`, as used in `fromFile`, carry a `testID`?\n *\n * A component defined in the SAME file (a local sub-component, very common\n * in screens) is checked against that file's own source.\n */\nexport function canCarryTestId(\n componentName: string,\n fromFile: string,\n imports: Map<string, ImportOrigin>,\n): CarrierVerdict {\n const origin = imports.get(componentName);\n\n if (origin?.source === 'react-native') {\n return RN_TESTID_CARRIERS.has(origin.imported) ? 'rn-primitive' : 'unverifiable';\n }\n // Not imported at all — defined locally in this same file.\n const target = origin ? resolveRelativeImport(fromFile, origin.source) : fromFile;\n if (!target) return 'unverifiable';\n\n const exportName = origin?.imported ?? componentName;\n const key = `${target}#${exportName}`;\n let identity = verdictCache.get(key);\n if (identity === undefined) {\n identity = inspectModule(target, exportName);\n verdictCache.set(key, identity);\n }\n // Forwarding wins: it lets the call site name its own instance, which is\n // strictly more precise than whatever the component derives for itself.\n if (identity.forwards) return 'forwards';\n if (identity.derives) return 'derives';\n return 'swallows';\n}\n\n/** Test seam — the cache is process-lifetime otherwise. */\nexport function resetForwardingCache(): void {\n verdictCache.clear();\n}\n","/**\n * Writing the props, and deciding what not to write.\n *\n * This is the only code in the repository that edits a customer's own\n * source. The one precedent — `ensureConfigIgnored` in `cli/commands/init.ts`\n * appending to a `.gitignore` — sets the shape worth copying: the edit is\n * idempotent, and the function returns WHAT IT DID so the command can say\n * so out loud instead of leaving the developer to diff for it.\n *\n * `magic-string` rather than a printer: every edit here is a single prop\n * insertion at a known offset. Regenerating the file from an AST would\n * reformat code nobody asked us to touch and bury the two characters that\n * matter in a diff of hundreds — which is the difference between a PR a\n * reviewer approves and one they close.\n */\n\nimport MagicString from 'magic-string';\n\nimport type { AnnotationSite } from './sites';\n\nexport type SiteOutcome =\n /** Written (or would be, in a dry run). */\n | 'annotated'\n /** The component drops the prop before it reaches the runtime. */\n | 'blocked-swallows'\n /** Imported from a package we cannot read — we will not guess. */\n | 'blocked-unverifiable';\n\nexport interface PlannedSite extends AnnotationSite {\n outcome: SiteOutcome;\n /** Why we refused, phrased as something the developer can act on. */\n blockedReason?: string;\n}\n\nexport function planSite(site: AnnotationSite): PlannedSite {\n if (site.carrier === 'rn-primitive' || site.carrier === 'forwards') {\n return { ...site, outcome: 'annotated' };\n }\n if (site.carrier === 'swallows') {\n return {\n ...site,\n outcome: 'blocked-swallows',\n blockedReason:\n `<${site.component}> does not accept testID, so React would drop the prop and the ` +\n `agent would be told about an element that never reaches the screen. Add ` +\n `testID?: string to its props and pass it to the element it renders, then re-run.`,\n };\n }\n return {\n ...site,\n outcome: 'blocked-unverifiable',\n blockedReason:\n `<${site.component}> comes from a package whose source is not readable from here, so ` +\n `whether it forwards testID cannot be checked. Annotate it by hand if it does.`,\n };\n}\n\nexport interface FileEdit {\n file: string;\n /** The rewritten source. Identical to the input when nothing was written. */\n content: string;\n written: PlannedSite[];\n blocked: PlannedSite[];\n}\n\n/**\n * Apply every writable site in one file.\n *\n * Insertions are collected at distinct offsets and `magic-string` keeps them\n * independent, so the order of `sites` does not matter and no offset needs\n * adjusting after an earlier edit — the reason for using it over hand-rolled\n * slicing.\n */\nexport function applyToFile(source: string, sites: AnnotationSite[]): FileEdit {\n const planned = sites.map(planSite);\n const written = planned.filter((site) => site.outcome === 'annotated');\n const blocked = planned.filter((site) => site.outcome !== 'annotated');\n\n if (written.length === 0) {\n return { file: sites[0]?.file ?? '', content: source, written, blocked };\n }\n\n const magic = new MagicString(source);\n for (const site of written) {\n magic.appendLeft(site.insertAt, site.insertText);\n }\n\n return { file: written[0]!.file, content: magic.toString(), written, blocked };\n}\n","/**\n * Teaching a component to carry a `testID`.\n *\n * This is the most invasive thing the CLI does: it changes the SIGNATURE of\n * a shared component in someone else's repository. Everything here is built\n * to refuse rather than guess, because a wrong edit is not a bad suggestion\n * — it is a compile error, or worse, a silent behaviour change in a\n * component every screen renders.\n *\n * Three edits, all of which must be possible or none are made:\n *\n * interface CardProps { … testID?: string } // the contract\n * function Card({ children, onPress, testID }: CardProps) // the parameter\n * <TouchableOpacity … testID={testID}> // the delivery\n *\n * The third is the one that decides whether this is worth doing at all. A\n * component whose root is ANOTHER custom component would only relocate the\n * problem one level down, so that is a refusal, not a chain to follow.\n */\n\nimport { readFileSync } from 'node:fs';\n\nimport MagicString from 'magic-string';\nimport _traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nimport { parseSource } from '../ast/parse';\nimport { RN_TESTID_CARRIERS, collectImports, resolveRelativeImport } from './forwarding';\n\nconst traverse = (_traverse as unknown as { default?: typeof _traverse }).default ?? _traverse;\n\nexport interface ForwardEdit {\n at: number;\n text: string;\n what: 'props-type' | 'parameter' | 'root';\n}\n\nexport interface ForwardPlan {\n file: string;\n component: string;\n /** Empty when `refusal` is set. */\n edits: ForwardEdit[];\n /** Present when the component cannot be taught safely. */\n refusal?: string;\n /** How many JSX roots will start receiving the prop. */\n roots: number;\n}\n\n/** The function or arrow whose name matches, plus its enclosing statement. */\nfunction findComponent(ast: t.File, name: string): { params: t.Node[]; body: t.Node } | undefined {\n let found: { params: t.Node[]; body: t.Node } | undefined;\n\n traverse(ast as never, {\n FunctionDeclaration(nodePath: { node: t.FunctionDeclaration }) {\n if (nodePath.node.id?.name === name) {\n found ??= { params: nodePath.node.params, body: nodePath.node.body };\n }\n },\n VariableDeclarator(nodePath: { node: t.VariableDeclarator }) {\n if (!t.isIdentifier(nodePath.node.id) || nodePath.node.id.name !== name) return;\n const init = nodePath.node.init;\n if (t.isArrowFunctionExpression(init) || t.isFunctionExpression(init)) {\n found ??= { params: init.params, body: init.body };\n }\n },\n });\n\n return found;\n}\n\n/** Collect the JSX elements this component actually returns. */\nfunction findReturnedRoots(body: t.Node): t.JSXOpeningElement[] | undefined {\n const roots: t.JSXOpeningElement[] = [];\n let unsupported = false;\n\n const record = (node: t.Node | null | undefined): void => {\n if (!node) return;\n if (t.isParenthesizedExpression(node)) return record(node.expression);\n if (t.isJSXElement(node)) {\n roots.push(node.openingElement);\n return;\n }\n if (t.isConditionalExpression(node)) {\n record(node.consequent);\n record(node.alternate);\n return;\n }\n if (t.isJSXFragment(node)) {\n // A fragment is not an element; there is nothing to hang an id on.\n unsupported = true;\n return;\n }\n if (t.isNullLiteral(node)) return;\n unsupported = true;\n };\n\n if (t.isBlockStatement(body)) {\n traverse(\n t.file(t.program([t.expressionStatement(t.functionExpression(null, [], body))])) as never,\n {\n ReturnStatement(nodePath: { node: t.ReturnStatement }) {\n record(nodePath.node.argument);\n },\n },\n );\n } else {\n // Concise arrow body: `const Row = (p) => <View />`\n record(body);\n }\n\n if (unsupported || roots.length === 0) return undefined;\n return roots;\n}\n\nfunction isCarrierRoot(\n element: t.JSXOpeningElement,\n imports: ReturnType<typeof collectImports>,\n): boolean {\n if (!t.isJSXIdentifier(element.name)) return false;\n const name = element.name.name;\n const origin = imports.get(name);\n if (origin?.source !== 'react-native') return false;\n return RN_TESTID_CARRIERS.has(origin.imported);\n}\n\nfunction hasProp(element: t.JSXOpeningElement, name: string): boolean {\n return element.attributes.some(\n (attr) => t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name) && attr.name.name === name,\n );\n}\n\n/** Indentation of the line a node starts on. */\nfunction indentOf(source: string, offset: number): string {\n const lineStart = source.lastIndexOf('\\n', offset - 1) + 1;\n const match = /^[ \\t]*/.exec(source.slice(lineStart, offset));\n return match?.[0] ?? '';\n}\n\n/**\n * Insert into an object pattern or a type body, matching its layout.\n *\n * `separator` is load-bearing and differs between the two: a destructuring\n * pattern separates with `,`, a TypeScript type body with `;`. Getting it\n * wrong on a SINGLE-LINE interface produced\n * `onPress?: () => void testID?: string` — invalid TypeScript, and invisible\n * on the testbed because its props interface happens to be multi-line.\n */\nfunction insertAfterLastMember(\n source: string,\n members: t.Node[],\n text: string,\n closingBrace: number,\n separator: ',' | ';',\n): { at: number; text: string } {\n const last = members[members.length - 1];\n if (!last || typeof last.end !== 'number' || typeof last.start !== 'number') {\n return { at: closingBrace, text };\n }\n\n // Where the separator lives differs by node type, and both cases are real:\n // `variant?: 'a' | 'b';` — Babel puts the `;` INSIDE the property's\n // range, so looking after `end` sees nothing\n // and a second `;` gets added.\n // `{ a, b, }` — a trailing comma sits AFTER the range, so\n // inserting at `end` lands before it.\n // Handle both: step past a separator that follows, and only add one when\n // neither side already has it.\n const trailing = /^\\s*[,;]/.exec(source.slice(last.end, closingBrace));\n const at = last.end + (trailing?.[0].length ?? 0);\n const endsWithSeparator = source.slice(0, last.end).trimEnd().endsWith(separator);\n const lead = trailing || endsWithSeparator ? '' : separator;\n\n const openLine = source.lastIndexOf('\\n', last.start);\n const multiline = openLine !== -1 && openLine > source.lastIndexOf('{', last.start);\n if (!multiline) return { at, text: `${lead} ${text}` };\n\n const indent = indentOf(source, last.start);\n return { at, text: `${lead}\\n${indent}${text}` };\n}\n\n/**\n * `export { Card } from './Card'` — the shape every `components/index.ts`\n * has, and the reason the first version of this reported \"no function named\n * Card in this file\": the import resolved to the barrel, which defines\n * nothing.\n */\nfunction followBarrel(file: string, ast: t.File, component: string): string | undefined {\n let target: string | undefined;\n traverse(ast as never, {\n ExportNamedDeclaration(nodePath: { node: t.ExportNamedDeclaration }) {\n const from = nodePath.node.source?.value;\n if (!from) return;\n const named = nodePath.node.specifiers.some(\n (spec) =>\n t.isExportSpecifier(spec) &&\n (t.isIdentifier(spec.exported) ? spec.exported.name : spec.exported.value) === component,\n );\n if (named) target ??= from;\n },\n });\n return target ? resolveRelativeImport(file, target) : undefined;\n}\n\nexport function planForward(file: string, component: string, depth = 0): ForwardPlan {\n const base: ForwardPlan = { file, component, edits: [], roots: 0 };\n let source: string;\n try {\n source = readFileSync(file, 'utf-8');\n } catch {\n return { ...base, refusal: `cannot read ${file}` };\n }\n\n let ast: t.File;\n try {\n ast = parseSource(source);\n } catch {\n return { ...base, refusal: `cannot parse ${file}` };\n }\n\n const found = findComponent(ast, component);\n if (!found) {\n const barrel = depth < 2 ? followBarrel(file, ast, component) : undefined;\n if (barrel) return planForward(barrel, component, depth + 1);\n return { ...base, refusal: `no function named ${component} in this file` };\n }\n\n const param = found.params[0];\n if (!t.isObjectPattern(param)) {\n return {\n ...base,\n refusal:\n `${component} does not destructure its props, so there is no safe place to add one ` +\n `without knowing what the parameter is called downstream`,\n };\n }\n\n const roots = findReturnedRoots(found.body);\n if (!roots) {\n return {\n ...base,\n refusal: `${component} returns something other than a JSX element (a fragment, or a value this cannot follow)`,\n };\n }\n\n const imports = collectImports(ast);\n const nonCarrier = roots.find((root) => !isCarrierRoot(root, imports));\n if (nonCarrier) {\n const name = t.isJSXIdentifier(nonCarrier.name) ? nonCarrier.name.name : 'its root';\n return {\n ...base,\n refusal:\n `${component} renders <${name}> at its root, which is not a React Native element known ` +\n `to accept testID. Forwarding into it would move the problem down a level, not fix it`,\n };\n }\n\n const edits: ForwardEdit[] = [];\n\n // 1. The parameter.\n const alreadyDestructured = param.properties.some(\n (prop) => t.isObjectProperty(prop) && t.isIdentifier(prop.key) && prop.key.name === 'testID',\n );\n if (!alreadyDestructured) {\n const insert = insertAfterLastMember(source, param.properties, 'testID', param.end ?? 0, ',');\n edits.push({ ...insert, what: 'parameter' });\n }\n\n // 2. The contract, when there is one to update.\n const annotation = param.typeAnnotation;\n if (t.isTSTypeAnnotation(annotation)) {\n const declared = annotation.typeAnnotation;\n let body: t.TSTypeElement[] | undefined;\n let closing = 0;\n\n if (t.isTSTypeLiteral(declared)) {\n body = declared.members;\n closing = declared.end ?? 0;\n } else if (t.isTSTypeReference(declared) && t.isIdentifier(declared.typeName)) {\n const typeName = declared.typeName.name;\n traverse(ast as never, {\n TSInterfaceDeclaration(nodePath: { node: t.TSInterfaceDeclaration }) {\n if (nodePath.node.id.name !== typeName) return;\n body = nodePath.node.body.body;\n closing = nodePath.node.body.end ?? 0;\n },\n TSTypeAliasDeclaration(nodePath: { node: t.TSTypeAliasDeclaration }) {\n if (\n nodePath.node.id.name !== typeName ||\n !t.isTSTypeLiteral(nodePath.node.typeAnnotation)\n )\n return;\n body = nodePath.node.typeAnnotation.members;\n closing = nodePath.node.typeAnnotation.end ?? 0;\n },\n });\n\n if (!body) {\n return {\n ...base,\n refusal:\n `${component}'s props type \\`${typeName}\\` is not declared in this file, so adding a ` +\n `field to it would edit a contract shared with code this cannot see`,\n };\n }\n }\n\n if (body) {\n const declaresTestId = body.some(\n (member) =>\n t.isTSPropertySignature(member) &&\n t.isIdentifier(member.key) &&\n member.key.name === 'testID',\n );\n if (!declaresTestId) {\n const insert = insertAfterLastMember(source, body, 'testID?: string;', closing, ';');\n edits.push({ ...insert, what: 'props-type' });\n }\n }\n }\n\n // 3. The delivery.\n let delivered = 0;\n for (const root of roots) {\n if (hasProp(root, 'testID')) continue;\n edits.push({\n at: root.name.end ?? root.start ?? 0,\n text: ' testID={testID}',\n what: 'root',\n });\n delivered += 1;\n }\n\n if (edits.length === 0) {\n return { ...base, refusal: `${component} already forwards testID` };\n }\n\n return { file, component, edits, roots: delivered };\n}\n\nexport function applyForward(source: string, plan: ForwardPlan): string {\n if (plan.refusal || plan.edits.length === 0) return source;\n const magic = new MagicString(source);\n for (const edit of plan.edits) magic.appendLeft(edit.at, edit.text);\n return magic.toString();\n}\n","import { Command } from 'commander';\nimport { AppilotsAPIClient } from '../../services/api-client';\nimport { loadConfig } from '../../config/index';\nimport {\n banner,\n success,\n error,\n info,\n table,\n warn,\n heading,\n setLogMode,\n jsonOutput,\n} from '../utils/logger';\nimport {\n compareWithRemote,\n readLocalDocumentSummary,\n reportRemoteDrift,\n type RemoteDrift,\n} from '../utils/remote-drift';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface StatusOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function statusCommand(): Command {\n return new Command('status')\n .description('Show current project and MCP document status')\n .option('--json', 'Output a machine-readable JSON result (implies --quiet)', false)\n .option('--quiet', 'Suppress banner and informational output', false)\n .action(async (options: StatusOptions) => {\n if (options.json) setLogMode('json');\n else if (options.quiet) setLogMode('quiet');\n try {\n banner();\n\n // Load configuration\n const config = loadConfig(warn);\n if (!config) {\n error('No .appilotsrc configuration found');\n info('Run: appilots init --api-key <your-key>');\n jsonOutput({ success: false, error: 'No .appilotsrc configuration found' });\n process.exit(1);\n return;\n }\n\n // Initialize API client\n const apiClient = new AppilotsAPIClient({\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n });\n\n // Get status from server\n const status = await apiClient.status();\n\n if (status.error) {\n error(`Failed to fetch status: ${status.error}`);\n jsonOutput({ success: false, error: status.error });\n process.exit(1);\n }\n\n // Display local configuration\n heading('\\n📋 Local Configuration:');\n table([\n ['API Server', config.serverUrl],\n ['Project ID', config.projectId || '(resolved from API key)'],\n ['Output Directory', config.outputDir || '.appilots'],\n ['Auto Activate', String(config.autoActivate ?? true)],\n ]);\n\n // Display project info\n if (status.project) {\n heading('\\n📌 Project Info:');\n table([\n ['Name', status.project.name],\n ['ID', status.project.id],\n ]);\n }\n\n // Display active MCP info\n const outputDir = config.outputDir || '.appilots';\n let drift: RemoteDrift | null = null;\n\n if (status.activeMcp) {\n heading('\\n✅ Active MCP Document:');\n table([\n ['Document ID', status.activeMcp.id],\n ['Version', status.activeMcp.version],\n ['Screens', String(status.activeMcp.screensCount)],\n ['Forms', String(status.activeMcp.formsCount)],\n ['Actions', String(status.activeMcp.actionsCount)],\n ]);\n\n // The pre-flight an e2e run wants: is the document the agent\n // reasons over the one generated from this checkout? Compared\n // against the last local generation, so `status` stays a cheap\n // read — no re-analysis of the source tree.\n const local = readLocalDocumentSummary(outputDir);\n if (local) {\n drift = compareWithRemote(local, status.activeMcp);\n if (drift) {\n heading('');\n reportRemoteDrift(drift);\n }\n }\n } else {\n heading('\\n⚠️ No active MCP document');\n info('Run: appilots sync');\n }\n\n success('Status retrieved successfully');\n jsonOutput({\n success: true,\n local: {\n serverUrl: config.serverUrl,\n projectId: config.projectId || null,\n outputDir,\n },\n project: status.project ?? null,\n activeMcp: status.activeMcp ?? null,\n drift,\n });\n } catch (err) {\n error(`Status check failed: ${stringifyUnknown(err)}`);\n jsonOutput({ success: false, error: stringifyUnknown(err) });\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { AppilotsAPIClient, type EvalScenarioRequest } from '../../services/api-client';\nimport { loadConfig, DEFAULT_SERVER_URL } from '../../config/index';\nimport {\n banner,\n success,\n error,\n info,\n warn,\n dim,\n table,\n heading,\n createSpinner,\n setLogMode,\n jsonOutput,\n} from '../utils/logger';\nimport { loadScenarios } from '../../eval/scenario-loader';\nimport { matchActions } from '../../eval/matcher';\nimport {\n loadBaseline,\n saveBaseline,\n buildBaseline,\n diffAgainstBaseline,\n} from '../../eval/baseline';\nimport { EXAMPLE_SCENARIO } from '../../eval/scaffold';\nimport { stringifyUnknown } from '../../utils/stringify';\n\nconst DEFAULT_MIN_PASS_RATE = 0.95;\nconst DEFAULT_MAX_TOKEN_REGRESSION = 0.25;\n\ninterface EvalOptions {\n init?: boolean;\n force?: boolean;\n dir?: string;\n baseline?: string;\n updateBaseline?: boolean;\n minPassRate?: string;\n maxTokenRegression?: string;\n model?: string;\n apiKey?: string;\n projectId?: string;\n server?: string;\n json?: boolean;\n quiet?: boolean;\n}\n\n/** Parses a numeric CLI flag, falling back (with a warning) on garbage input\n * instead of silently comparing against NaN. */\nfunction parseRate(raw: string | undefined, fallback: number, flagName: string): number {\n if (raw === undefined) return fallback;\n const n = Number(raw);\n if (Number.isNaN(n)) {\n warn(`Ignoring invalid ${flagName} value \"${raw}\" — using ${fallback}`);\n return fallback;\n }\n return n;\n}\n\nexport function evalCommand(): Command {\n return new Command('eval')\n .description(\n 'Run agent eval scenarios against the current MCP document in dry-run mode and check for regressions vs a committed baseline',\n )\n .option('--init', 'Scaffold an example scenario in the scenarios directory', false)\n .option('--force', 'With --init, overwrite an existing example scenario', false)\n .option('--dir <path>', 'Scenarios directory (default: <outputDir>/scenarios)')\n .option('--baseline <path>', 'Baseline file path (default: <outputDir>/eval-baseline.json)')\n .option(\n '--update-baseline',\n 'Record this run as the new baseline (refuses if pass rate is below the threshold)',\n false,\n )\n .option(\n '--min-pass-rate <n>',\n 'Minimum fraction of scenarios that must pass, 0-1 (default: 0.95)',\n )\n .option(\n '--max-token-regression <n>',\n 'Max fractional token increase before a passing scenario is flagged, e.g. 0.25 for +25% (default: 0.25)',\n )\n .option('--model <id>', 'Model override for scenarios that do not set their own modelOverride')\n .option('--api-key <key>', 'Appilots API key (overrides .appilotsrc and APPILOTS_API_KEY)')\n .option('--project-id <id>', 'Project ID (overrides .appilotsrc and APPILOTS_PROJECT_ID)')\n .option('--server <url>', 'Appilots server URL (overrides .appilotsrc and APPILOTS_SERVER_URL)')\n .option('--json', 'Output a machine-readable JSON result (implies --quiet)', false)\n .option('--quiet', 'Suppress banner and informational output', false)\n .action(async (options: EvalOptions) => {\n if (options.json) setLogMode('json');\n else if (options.quiet) setLogMode('quiet');\n try {\n banner();\n\n const loaded = loadConfig(warn);\n const outputDir = loaded?.outputDir || '.appilots';\n const scenariosDir =\n options.dir || loaded?.eval?.scenariosDir || join(outputDir, 'scenarios');\n\n if (options.init) {\n mkdirSync(scenariosDir, { recursive: true });\n const examplePath = join(scenariosDir, 'example.json');\n if (existsSync(examplePath) && !options.force) {\n warn(`${examplePath} already exists — pass --force to overwrite`);\n } else {\n writeFileSync(examplePath, `${JSON.stringify(EXAMPLE_SCENARIO, null, 2)}\\n`, 'utf-8');\n success(`Wrote example scenario to ${examplePath}`);\n }\n info('Edit it to match a real screen in your app, then:');\n dim(' $ appilots eval --update-baseline # capture the current (good) behavior');\n dim(' $ appilots eval # check for regressions on future runs');\n jsonOutput({ success: true, scenariosDir, examplePath });\n return;\n }\n\n const apiKey = options.apiKey || loaded?.apiKey;\n if (!apiKey) {\n error('No .appilotsrc configuration found');\n info('Run: appilots init --api-key <your-key>');\n info('Or set APPILOTS_API_KEY, or pass --api-key');\n jsonOutput({ success: false, error: 'No configuration found (missing API key)' });\n process.exit(1);\n return;\n }\n const config = {\n serverUrl: DEFAULT_SERVER_URL,\n ...loaded,\n apiKey,\n ...(options.projectId ? { projectId: options.projectId } : {}),\n ...(options.server ? { serverUrl: options.server } : {}),\n };\n\n const baselinePath =\n options.baseline || loaded?.eval?.baselinePath || join(outputDir, 'eval-baseline.json');\n const minPassRate = parseRate(\n options.minPassRate,\n loaded?.eval?.minPassRate ?? DEFAULT_MIN_PASS_RATE,\n '--min-pass-rate',\n );\n const maxTokenRegression = parseRate(\n options.maxTokenRegression,\n loaded?.eval?.maxTokenRegression ?? DEFAULT_MAX_TOKEN_REGRESSION,\n '--max-token-regression',\n );\n\n const loadedScenarios = loadScenarios(scenariosDir);\n if (loadedScenarios.errors.length > 0) {\n for (const scenarioError of loadedScenarios.errors) {\n error(`${scenarioError.file}: ${scenarioError.error}`);\n }\n jsonOutput({\n success: false,\n error: 'One or more scenario files failed to load',\n details: loadedScenarios.errors,\n });\n process.exit(1);\n return;\n }\n if (loadedScenarios.scenarios.length === 0) {\n error(`No scenarios found in ${scenariosDir}`);\n info('Run: appilots eval --init');\n jsonOutput({ success: false, error: `No scenarios found in ${scenariosDir}` });\n process.exit(1);\n return;\n }\n\n const nameCounts = new Map<string, number>();\n for (const { scenario } of loadedScenarios.scenarios) {\n nameCounts.set(scenario.name, (nameCounts.get(scenario.name) ?? 0) + 1);\n }\n const duplicates = [...nameCounts.entries()]\n .filter(([, count]) => count > 1)\n .map(([name]) => name);\n if (duplicates.length > 0) {\n error(\n `Duplicate scenario name(s) — \"name\" must be unique across all scenario files: ${duplicates.join(', ')}`,\n );\n jsonOutput({\n success: false,\n error: `Duplicate scenario names: ${duplicates.join(', ')}`,\n });\n process.exit(1);\n return;\n }\n\n const apiClient = new AppilotsAPIClient({\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n });\n\n const requests: EvalScenarioRequest[] = loadedScenarios.scenarios.map(({ scenario }) => ({\n id: scenario.name,\n screen: scenario.given?.screen,\n observation: scenario.given?.observation,\n prompt: scenario.when,\n modelOverride: scenario.modelOverride || options.model,\n }));\n\n const spinner = createSpinner(`Running ${requests.length} scenario(s)...`);\n spinner.start();\n const runResult = await apiClient.evalRun(requests);\n spinner.stop();\n\n if (runResult.error) {\n error(`Eval run failed: ${runResult.error}`);\n jsonOutput({ success: false, error: runResult.error });\n process.exit(1);\n return;\n }\n\n const resultsById = new Map((runResult.results ?? []).map((r) => [r.id, r]));\n const outcomes = loadedScenarios.scenarios.map(({ scenario }) => {\n const result = resultsById.get(scenario.name);\n if (!result) {\n return {\n name: scenario.name,\n status: 'failed' as const,\n totalTokens: 0,\n failureReason: 'no result returned by the API for this scenario',\n };\n }\n const match = matchActions(scenario.expect, result.actions, result.content);\n return {\n name: scenario.name,\n status: (match.ok ? 'passed' : 'failed') as 'passed' | 'failed',\n totalTokens: result.totalTokens,\n failureReason: match.ok ? undefined : match.reason,\n };\n });\n\n const passed = outcomes.filter((o) => o.status === 'passed').length;\n const total = outcomes.length;\n const passRate = total > 0 ? passed / total : 1;\n\n heading('\\nResults:');\n table(\n outcomes.map((o) => [\n o.status === 'passed' ? `✓ ${o.name}` : `✗ ${o.name}`,\n o.status === 'passed' ? `${o.totalTokens} tokens` : o.failureReason || 'failed',\n ]),\n );\n\n const baseline = loadBaseline(baselinePath);\n let regressions: ReturnType<typeof diffAgainstBaseline> = [];\n if (!options.updateBaseline) {\n regressions = diffAgainstBaseline(outcomes, baseline, maxTokenRegression);\n if (regressions.length > 0) {\n heading('\\nRegressions vs baseline:');\n table(regressions.map((r) => [r.name, `${r.kind}: ${r.detail}`]));\n }\n }\n\n const passRatePct = Math.round(passRate * 1000) / 10;\n const minPassRatePct = Math.round(minPassRate * 1000) / 10;\n heading(`\\nPass rate: ${passed}/${total} (${passRatePct}%) — threshold ${minPassRatePct}%`);\n\n if (options.updateBaseline) {\n if (passRate < minPassRate) {\n error(\n `Refusing to update baseline: pass rate ${passRatePct}% is below the ${minPassRatePct}% threshold`,\n );\n info('Fix the failing scenario(s) first, then re-run with --update-baseline.');\n jsonOutput({ success: false, passRate, minPassRate, total, passed, results: outcomes });\n process.exit(1);\n return;\n }\n const newBaseline = buildBaseline(outcomes, {\n generatedAt: new Date().toISOString(),\n gitSha: process.env.GIT_SHA ?? null,\n });\n saveBaseline(baselinePath, newBaseline);\n success(`Updated baseline at ${baselinePath}`);\n jsonOutput({ success: true, passRate, minPassRate, total, passed, results: outcomes });\n return;\n }\n\n const ok = passRate >= minPassRate && regressions.length === 0;\n jsonOutput({\n success: ok,\n passRate,\n minPassRate,\n total,\n passed,\n failed: total - passed,\n regressions,\n results: outcomes,\n });\n\n if (!ok) {\n if (passRate < minPassRate) {\n error(`Pass rate ${passRatePct}% is below the ${minPassRatePct}% threshold`);\n }\n if (regressions.length > 0) {\n error(`${regressions.length} regression(s) vs baseline`);\n }\n process.exit(1);\n } else {\n success('Eval passed');\n }\n } catch (err) {\n error(`Eval failed: ${stringifyUnknown(err)}`);\n jsonOutput({ success: false, error: stringifyUnknown(err) });\n process.exit(1);\n }\n });\n}\n","import { readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport type { EvalScenario } from './types';\nimport { stringifyUnknown } from '../utils/stringify';\n\nexport interface LoadedScenario {\n file: string;\n scenario: EvalScenario;\n}\n\nexport interface ScenarioLoadError {\n file: string;\n error: string;\n}\n\nexport interface ScenarioLoadResult {\n scenarios: LoadedScenario[];\n errors: ScenarioLoadError[];\n}\n\n/**\n * Minimal shape validation — enough to give the dev a precise error\n * pointing at the offending file, without pulling in a full JSON-schema\n * validator for a handful of required fields.\n */\nfunction validateScenarioShape(raw: unknown): string | null {\n if (!raw || typeof raw !== 'object') return 'scenario must be a JSON object';\n const s = raw as Record<string, unknown>;\n if (typeof s.name !== 'string' || !s.name.trim()) {\n return '\"name\" is required and must be a non-empty string';\n }\n if (typeof s.when !== 'string' || !s.when.trim()) {\n return '\"when\" is required and must be a non-empty string (the user prompt)';\n }\n if (!s.expect || typeof s.expect !== 'object') {\n return '\"expect\" is required and must be an object (see docs: Testing your agent between releases)';\n }\n return null;\n}\n\n/**\n * Loads every `*.json` scenario file from `dir`, sorted by filename for a\n * stable run order. Returns an empty result (no error) when `dir` doesn't\n * exist yet — the caller decides whether that's fatal.\n */\nexport function loadScenarios(dir: string): ScenarioLoadResult {\n const scenarios: LoadedScenario[] = [];\n const errors: ScenarioLoadError[] = [];\n\n let files: string[];\n try {\n files = readdirSync(dir)\n .filter((f) => f.endsWith('.json'))\n .sort();\n } catch {\n return { scenarios, errors };\n }\n\n for (const file of files) {\n const full = join(dir, file);\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(full, 'utf-8'));\n } catch (err) {\n errors.push({ file, error: `invalid JSON: ${stringifyUnknown(err)}` });\n continue;\n }\n const shapeError = validateScenarioShape(raw);\n if (shapeError) {\n errors.push({ file, error: shapeError });\n continue;\n }\n scenarios.push({ file, scenario: raw as EvalScenario });\n }\n\n return { scenarios, errors };\n}\n","/**\n * Action matchers — tolerate LLM variability while still asserting on\n * structurally meaningful behavior.\n *\n * Ported from the monorepo's internal tests/agentic/fixtures/matchers.ts\n * (same semantics) so the published @appilots/cli package doesn't take a\n * dependency on the private @appilots/shared workspace package.\n *\n * Match modes:\n * - \"any\" — every expected action appears somewhere in the actual\n * actions (default; most lenient)\n * - \"first\" — the first actual action matches the first expected one;\n * remaining expected actions just need to appear somewhere\n * - \"exact\" — actual.length === expected.length AND each pair matches\n * in order\n * - \"none\" — zero actions emitted (security / clarification probes)\n *\n * Payload constraints are matched as PARTIAL: every key in the expected\n * payload must equal the actual, but the actual can have extra keys.\n * Form-fill fields are matched by `fieldId` regardless of order, and only\n * the listed fields are required (extras are allowed).\n */\nimport type { EvalActualAction, EvalExpectedAction, EvalExpectedActions } from './types';\n\nexport interface MatchResult {\n ok: boolean;\n reason?: string;\n}\n\nfunction normalizeReply(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase();\n}\n\nfunction partialMatch(\n expected: Record<string, unknown> | undefined,\n actual: Record<string, unknown> | undefined,\n): boolean {\n if (!expected) return true;\n if (!actual) return false;\n\n for (const key of Object.keys(expected)) {\n const exp = expected[key];\n const act = actual[key];\n\n // Special case: form_fill.fields — array of { fieldId, value }.\n // Each expected field must appear in actual; order not required.\n if (key === 'fields' && Array.isArray(exp) && Array.isArray(act)) {\n for (const expField of exp as Array<Record<string, unknown>>) {\n const fieldId = expField.fieldId;\n const matched = (act as Array<Record<string, unknown>>).find(\n (f) => f.fieldId === fieldId,\n );\n if (!matched) return false;\n if (expField.value !== undefined && matched.value !== expField.value) {\n return false;\n }\n }\n continue;\n }\n\n if (typeof exp === 'object' && exp !== null && !Array.isArray(exp)) {\n if (typeof act !== 'object' || act === null) return false;\n if (!partialMatch(exp as Record<string, unknown>, act as Record<string, unknown>)) {\n return false;\n }\n continue;\n }\n\n if (exp !== act) return false;\n }\n return true;\n}\n\nfunction matchesOne(expected: EvalExpectedAction, actual: EvalActualAction): boolean {\n if (expected.type !== actual.type) return false;\n return partialMatch(expected.payload, actual.payload);\n}\n\nexport function matchActions(\n expected: EvalExpectedActions,\n actual: EvalActualAction[],\n /** Assistant's visible reply — required by `replyMustContain` blocks. */\n reply = '',\n): MatchResult {\n if (expected.anyOf && expected.anyOf.length > 0) {\n const reasons: string[] = [];\n for (const branch of expected.anyOf) {\n const res = matchActions(branch, actual, reply);\n if (res.ok) return res;\n reasons.push(res.reason ?? 'no reason');\n }\n return {\n ok: false,\n reason: `anyOf: no branch matched — ${reasons.map((r, i) => `[${i}] ${r}`).join(' · ')}`,\n };\n }\n\n if (expected.forbidActionTypes && expected.forbidActionTypes.length > 0) {\n const forbidden = actual.find((a) => expected.forbidActionTypes!.includes(a.type));\n if (forbidden) {\n return {\n ok: false,\n reason: `forbidActionTypes: action of type=${forbidden.type} was emitted`,\n };\n }\n }\n\n if (expected.replyMustNotContain && expected.replyMustNotContain.length > 0) {\n const hay = normalizeReply(reply);\n const leaked = expected.replyMustNotContain.find((needle) =>\n hay.includes(normalizeReply(needle)),\n );\n if (leaked) {\n return {\n ok: false,\n reason: `replyMustNotContain: \"${leaked}\" was echoed in the reply \"${reply.slice(0, 120)}\"`,\n };\n }\n }\n\n if (expected.replyMustContain && expected.replyMustContain.length > 0) {\n const hay = normalizeReply(reply);\n const hit = expected.replyMustContain.some((needle) => hay.includes(normalizeReply(needle)));\n if (!hit) {\n return {\n ok: false,\n reason: `replyMustContain: none of [${expected.replyMustContain.join(', ')}] found in reply \"${reply.slice(0, 120)}\"`,\n };\n }\n }\n\n const mode = expected.mode ?? 'any';\n const expectedActions = expected.actions ?? [];\n\n if (mode === 'none') {\n if (actual.length === 0) return { ok: true };\n return {\n ok: false,\n reason: `none mode: expected 0 actions, got ${actual.length} (${actual.map((a) => a.type).join(', ')})`,\n };\n }\n\n if (mode === 'exact') {\n if (actual.length !== expectedActions.length) {\n return {\n ok: false,\n reason: `exact mode: expected ${expectedActions.length} action(s), got ${actual.length}`,\n };\n }\n for (let i = 0; i < expectedActions.length; i++) {\n if (!matchesOne(expectedActions[i]!, actual[i]!)) {\n return {\n ok: false,\n reason: `exact mode: action[${i}] mismatch — expected type=${expectedActions[i]!.type}, got type=${actual[i]!.type}`,\n };\n }\n }\n return { ok: true };\n }\n\n if (mode === 'first') {\n const first = actual[0];\n if (!first) {\n return { ok: false, reason: 'first mode: no actions emitted' };\n }\n if (!expectedActions[0] || !matchesOne(expectedActions[0], first)) {\n return {\n ok: false,\n reason: `first mode: first action did not match — expected type=${expectedActions[0]?.type}, got type=${first.type}`,\n };\n }\n for (const exp of expectedActions.slice(1)) {\n if (!actual.some((a) => matchesOne(exp, a))) {\n return {\n ok: false,\n reason: `first mode: expected action of type=${exp.type} not found in remaining actions`,\n };\n }\n }\n return { ok: true };\n }\n\n // any: every expected action appears somewhere in actual\n for (const exp of expectedActions) {\n if (!actual.some((a) => matchesOne(exp, a))) {\n return {\n ok: false,\n reason: `any mode: expected action of type=${exp.type} not found`,\n };\n }\n }\n return { ok: true };\n}\n\nexport function summarizeActions(actions: EvalActualAction[]): string {\n if (actions.length === 0) return '<no actions>';\n return actions\n .map((a, i) => {\n const summary = JSON.stringify(a.payload).slice(0, 200);\n return ` [${i}] ${a.type} ${summary}`;\n })\n .join('\\n');\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\n\nexport interface BaselineScenarioResult {\n status: 'passed' | 'failed';\n totalTokens: number;\n failureReason?: string;\n}\n\nexport interface EvalBaseline {\n generatedAt: string | null;\n gitSha?: string | null;\n perScenario: Record<string, BaselineScenarioResult>;\n}\n\nconst EMPTY_BASELINE: EvalBaseline = { generatedAt: null, gitSha: null, perScenario: {} };\n\n/** Returns an empty baseline (not an error) when the file doesn't exist\n * yet — that's the expected state before the first `--update-baseline`. */\nexport function loadBaseline(path: string): EvalBaseline {\n if (!existsSync(path)) return { ...EMPTY_BASELINE, perScenario: {} };\n try {\n const raw = JSON.parse(readFileSync(path, 'utf-8')) as Partial<EvalBaseline>;\n return {\n generatedAt: raw.generatedAt ?? null,\n gitSha: raw.gitSha ?? null,\n perScenario: raw.perScenario ?? {},\n };\n } catch {\n return { ...EMPTY_BASELINE, perScenario: {} };\n }\n}\n\nexport function saveBaseline(path: string, baseline: EvalBaseline): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(baseline, null, 2)}\\n`, 'utf-8');\n}\n\nexport interface ScenarioRunOutcome {\n name: string;\n status: 'passed' | 'failed';\n totalTokens: number;\n failureReason?: string;\n}\n\nexport function buildBaseline(\n outcomes: ScenarioRunOutcome[],\n meta: { generatedAt: string; gitSha?: string | null },\n): EvalBaseline {\n const perScenario: Record<string, BaselineScenarioResult> = {};\n for (const o of outcomes) {\n perScenario[o.name] = {\n status: o.status,\n totalTokens: o.totalTokens,\n ...(o.failureReason ? { failureReason: o.failureReason } : {}),\n };\n }\n return { generatedAt: meta.generatedAt, gitSha: meta.gitSha ?? null, perScenario };\n}\n\nexport type RegressionKind = 'newly-failing' | 'token-regression';\n\nexport interface RegressionEntry {\n name: string;\n kind: RegressionKind;\n detail: string;\n}\n\n/**\n * Two regression signals, mirroring the internal\n * scripts/qa/eval-baseline-compare.ts logic at a scenario level:\n * - a scenario that passed on the baseline now fails\n * - a scenario that still passes but costs meaningfully more tokens\n * than it used to (>`maxTokenRegression` fractional increase)\n *\n * A scenario with no baseline entry (new scenario, or first run) never\n * regresses — there's nothing to compare against yet.\n */\nexport function diffAgainstBaseline(\n outcomes: ScenarioRunOutcome[],\n baseline: EvalBaseline,\n maxTokenRegression: number,\n): RegressionEntry[] {\n const regressions: RegressionEntry[] = [];\n\n for (const outcome of outcomes) {\n const prior = baseline.perScenario[outcome.name];\n if (!prior) continue;\n\n if (outcome.status === 'failed' && prior.status === 'passed') {\n regressions.push({\n name: outcome.name,\n kind: 'newly-failing',\n detail: outcome.failureReason ?? 'scenario now fails (previously passed)',\n });\n continue;\n }\n\n if (\n outcome.status === 'passed' &&\n prior.status === 'passed' &&\n prior.totalTokens > 0 &&\n outcome.totalTokens > prior.totalTokens * (1 + maxTokenRegression)\n ) {\n const pct = Math.round(((outcome.totalTokens - prior.totalTokens) / prior.totalTokens) * 100);\n regressions.push({\n name: outcome.name,\n kind: 'token-regression',\n detail: `tokens ${prior.totalTokens} → ${outcome.totalTokens} (+${pct}%, threshold +${Math.round(maxTokenRegression * 100)}%)`,\n });\n }\n }\n\n return regressions;\n}\n","/**\n * Example scenario written by `appilots eval --init`. Deliberately small\n * and heavily commented via the `description` field rather than JSON\n * comments (JSON has none) — see docs: \"Testing your agent between\n * releases\" for the full field reference.\n */\nexport const EXAMPLE_SCENARIO = {\n name: 'agent-fills-signup-form',\n description:\n 'The agent should fill the visible signup form fields from a single spoken instruction. Edit `given.observation` to match a real screen in your app, and `when` to a prompt your users would actually say.',\n given: {\n screen: 'SignupScreen',\n observation: {\n route: 'SignupScreen',\n texts: ['Create your account'],\n inputs: [\n { id: 'email', label: 'Email', required: true },\n { id: 'name', label: 'Full name', required: true },\n ],\n buttons: [{ id: 'btn-submit-signup', label: 'Sign up' }],\n },\n },\n when: 'My name is Jane Doe and my email is jane@example.com',\n expect: {\n mode: 'any',\n actions: [\n {\n type: 'form_fill',\n payload: {\n fields: [{ fieldId: 'name' }, { fieldId: 'email' }],\n },\n },\n ],\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,oBAAwB;;;ACOjB,IAAM,cAAc;;;ACP3B,gBAA4C;AAC5C,kBAA8B;AAC9B,IAAAC,aAAqC;AAO9B,IAAM,qBAAqB;AAuG3B,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOA,IAAM,cAAsC;AAAA,EAC1C,QAAQ;AAAA;AAAA;AAAA;AAAA,EAIR,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAGA,SAAS,aAAa,GAAW,GAAmB;AAClD,MAAI,WAAW,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAC/D,WAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,UAAM,UAAU,CAAC,CAAC;AAClB,aAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,YAAM,YAAY,SAAS,CAAC,KAAK,KAAK;AACtC,YAAM,aAAa,QAAQ,IAAI,CAAC,KAAK,KAAK;AAC1C,YAAM,gBAAgB,SAAS,IAAI,CAAC,KAAK,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AAC3E,cAAQ,KAAK,KAAK,IAAI,UAAU,WAAW,YAAY,CAAC;AAAA,IAC1D;AACA,eAAW;AAAA,EACb;AACA,SAAO,SAAS,EAAE,MAAM,KAAK;AAC/B;AAOO,SAAS,iBAAiB,KAAiC;AAChE,QAAM,QAAQ,YAAY,GAAG;AAC7B,MAAI,MAAO,QAAO;AAElB,QAAM,QAAQ,IAAI,YAAY;AAC9B,MAAI;AACJ,aAAW,SAAS,mBAAmB;AACrC,UAAM,WAAW,aAAa,OAAO,MAAM,YAAY,CAAC;AACxD,QAAI,YAAY,MAAM,CAAC,QAAQ,WAAW,KAAK,WAAW;AACxD,aAAO,EAAE,KAAK,OAAO,SAAS;AAAA,IAChC;AAAA,EACF;AACA,SAAO,MAAM;AACf;AAeO,SAAS,gBAAgB,MAAyB,QAAQ,KAAmB;AAClF,QAAM,QAAQ,CAAC,UAAkD;AAC/D,UAAM,UAAU,OAAO,KAAK;AAC5B,WAAO,UAAU,UAAU;AAAA,EAC7B;AACA,SAAO;AAAA,IACL,QAAQ,MAAM,IAAI,gBAAgB;AAAA,IAClC,WAAW,MAAM,IAAI,mBAAmB;AAAA,IACxC,WAAW,MAAM,IAAI,mBAAmB;AAAA,EAC1C;AACF;AAYO,SAAS,WAAW,QAA2D;AACpF,QAAM,aAAa,cAAc;AACjC,QAAM,MAAM,gBAAgB;AAE5B,MAAI,aAAsC,CAAC;AAC3C,MAAI,YAAY;AACd,QAAI;AACF,mBAAa,KAAK,UAAM,wBAAa,YAAY,OAAO,CAAC;AAAA,IAC3D,SAASC,QAAO;AACd,YAAM,IAAI;AAAA,QACR,kCAAkC,UAAU,KAAKA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AAAA,MAC3G;AAAA,IACF;AAAA,EACF,WAAW,CAAC,IAAI,QAAQ;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe;AAAA,IACf,GAAG;AAAA,IACH,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,IAC3C,GAAI,IAAI,YAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;AAAA,IACpD,GAAI,IAAI,YAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;AAAA,EACtD;AAEA,QAAM,aAAa,eAAe,MAAM;AACxC,MAAI,QAAQ;AACV,UAAM,SAAS,cAAc;AAC7B,eAAW,WAAW,WAAW,UAAU;AACzC,aAAO,GAAG,MAAM,KAAK,OAAO,EAAE;AAAA,IAChC;AAAA,EACF;AACA,MAAI,CAAC,WAAW,OAAO;AACrB,UAAM,SAAS,cAAc;AAC7B,UAAM,IAAI;AAAA,MACR,mCAAmC,MAAM;AAAA,IACvC,WAAW,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI,IAClD;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;AAQO,SAAS,WAAW,KAAa,QAAuC;AAC7E,QAAM,iBAAa,kBAAK,KAAK,aAAa;AAC1C,QAAM,iBAAiB,cAAc,IAAI,WAAW,IAAI;AAExD,QAAM,eAA+B;AAAA,IACnC,QAAQ,OAAO,UAAU,gBAAgB,UAAU;AAAA,IACnD,WAAW,OAAO,aAAa,gBAAgB,aAAa;AAAA,IAC5D,WAAW,OAAO,aAAa,gBAAgB,aAAa;AAAA,IAC5D,WAAW,OAAO,aAAa,gBAAgB,aAAa;AAAA,IAC5D,cACE,OAAO,iBAAiB,SACpB,OAAO,eACN,gBAAgB,gBAAgB;AAAA,IACvC,SAAS,OAAO,WAAW,gBAAgB;AAAA,IAC3C,SAAS,OAAO,WAAW,gBAAgB;AAAA,IAC3C,eAAe,OAAO,iBAAiB,gBAAgB,iBAAiB;AAAA,IACxE,gBAAgB,OAAO,kBAAkB,gBAAgB;AAAA,IACzD,mBAAmB,OAAO,qBAAqB,gBAAgB;AAAA,IAC/D,mBAAmB,OAAO,qBAAqB,gBAAgB;AAAA,IAC/D,UAAU,OAAO,YAAY,gBAAgB;AAAA,IAC7C,cAAc,OAAO,gBAAgB,gBAAgB;AAAA,IACrD,MAAM,OAAO,QAAQ,gBAAgB;AAAA,EACvC;AAEA,MAAI;AACF,iCAAc,YAAY,KAAK,UAAU,cAAc,MAAM,CAAC,GAAG,OAAO;AAAA,EAC1E,SAASA,QAAO;AACd,UAAM,IAAI;AAAA,MACR,kCAAkC,UAAU,KAAKA,kBAAiB,QAAQA,OAAM,UAAU,eAAe;AAAA,IAC3G;AAAA,EACF;AACF;AAQO,SAAS,gBAA+B;AAC7C,MAAI,iBAAa,qBAAQ,QAAQ,IAAI,CAAC;AACtC,QAAM,WAAO,qBAAQ,GAAG;AAExB,SAAO,eAAe,MAAM;AAC1B,UAAM,iBAAa,kBAAK,YAAY,aAAa;AACjD,QAAI;AACF,cAAI,uBAAW,UAAU,SAAK,qBAAS,UAAU,EAAE,OAAO,GAAG;AAC3D,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AACA,qBAAa,qBAAQ,YAAY,IAAI;AAAA,EACvC;AAGA,QAAM,qBAAiB,kBAAK,MAAM,aAAa;AAC/C,MAAI;AACF,YAAI,uBAAW,cAAc,SAAK,qBAAS,cAAc,EAAE,OAAO,GAAG;AACnE,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAQO,SAAS,eAAe,QAA+B;AAC5D,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAE5B,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ,CAAC,iCAAiC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAIA,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,QAAK,kBAAwC,SAAS,GAAG,EAAG;AAC5D,UAAM,aAAa,iBAAiB,GAAG;AACvC,aAAS;AAAA,MACP,gBAAgB,GAAG,sBAAiB,aAAa,mBAAmB,UAAU,QAAQ;AAAA,IACxF;AAAA,EACF;AAGA,MAAI,CAAC,OAAO,UAAU,OAAO,OAAO,WAAW,UAAU;AACvD,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,WAAW,CAAC,OAAO,OAAO,WAAW,KAAK,GAAG;AAC3C,WAAO,KAAK,8BAA8B;AAAA,EAC5C;AAIA,MACE,OAAO,cAAc,UACrB,OAAO,cAAc,MACrB,OAAO,OAAO,cAAc,UAC5B;AACA,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAGA,MAAI,OAAO,cAAc,UAAa,OAAO,OAAO,cAAc,UAAU;AAC1E,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAEA,MAAI,OAAO,cAAc,UAAa,OAAO,OAAO,cAAc,UAAU;AAC1E,WAAO,KAAK,4BAA4B;AAAA,EAC1C;AAEA,MAAI,OAAO,YAAY,UAAa,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AAClE,WAAO,KAAK,qCAAqC;AAAA,EACnD,WACE,MAAM,QAAQ,OAAO,OAAO,KAC5B,CAAC,OAAO,QAAQ,MAAM,CAAC,SAAkB,OAAO,SAAS,QAAQ,GACjE;AACA,WAAO,KAAK,qCAAqC;AAAA,EACnD;AAEA,MAAI,OAAO,YAAY,UAAa,CAAC,MAAM,QAAQ,OAAO,OAAO,GAAG;AAClE,WAAO,KAAK,qCAAqC;AAAA,EACnD,WACE,MAAM,QAAQ,OAAO,OAAO,KAC5B,CAAC,OAAO,QAAQ,MAAM,CAAC,SAAkB,OAAO,SAAS,QAAQ,GACjE;AACA,WAAO,KAAK,qCAAqC;AAAA,EACnD;AAEA,MAAI,OAAO,iBAAiB,UAAa,OAAO,OAAO,iBAAiB,WAAW;AACjF,WAAO,KAAK,gCAAgC;AAAA,EAC9C;AAEA,MAAI,OAAO,kBAAkB,UAAa,OAAO,OAAO,kBAAkB,WAAW;AACnF,WAAO,KAAK,iCAAiC;AAAA,EAC/C;AAEA,aAAW,SAAS,CAAC,kBAAkB,qBAAqB,mBAAmB,GAAY;AACzF,UAAM,QAAQ,OAAO,KAAK;AAC1B,QACE,UAAU,WACT,CAAC,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,MAAM,CAAC,SAAkB,OAAO,SAAS,QAAQ,IAClF;AACA,aAAO,KAAK,GAAG,KAAK,8BAA8B;AAAA,IACpD;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,UAAa,OAAO,OAAO,aAAa,UAAU;AACxE,WAAO,KAAK,2BAA2B;AAAA,EACzC;AAEA,MAAI,OAAO,iBAAiB,UAAa,OAAO,OAAO,iBAAiB,UAAU;AAChF,WAAO,KAAK,+BAA+B;AAAA,EAC7C;AAEA,MAAI,OAAO,SAAS,QAAW;AAC7B,QAAI,OAAO,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ,MAAM,QAAQ,OAAO,IAAI,GAAG;AACzF,aAAO,KAAK,wBAAwB;AAAA,IACtC,OAAO;AACL,YAAM,aAAa,OAAO;AAC1B,UAAI,WAAW,iBAAiB,UAAa,OAAO,WAAW,iBAAiB,UAAU;AACxF,eAAO,KAAK,oCAAoC;AAAA,MAClD;AACA,UAAI,WAAW,iBAAiB,UAAa,OAAO,WAAW,iBAAiB,UAAU;AACxF,eAAO,KAAK,oCAAoC;AAAA,MAClD;AACA,UACE,WAAW,gBAAgB,WAC1B,OAAO,WAAW,gBAAgB,YACjC,WAAW,cAAc,KACzB,WAAW,cAAc,IAC3B;AACA,eAAO,KAAK,mDAAmD;AAAA,MACjE;AACA,UACE,WAAW,uBAAuB,WACjC,OAAO,WAAW,uBAAuB,YAAY,WAAW,qBAAqB,IACtF;AACA,eAAO,KAAK,uDAAuD;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;;;ACheA,mBAAkB;AAElB,iBAAgB;AAchB,IAAI,OAAgB;AAEb,SAAS,WAAW,MAAqB;AAC9C,SAAO;AACT;AAUO,SAAS,WAAW,SAAwB;AACjD,MAAI,SAAS,QAAQ;AACnB,YAAQ,IAAI,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,EAC9C;AACF;AASO,SAAS,cAAc,MAAc;AAC1C,aAAO,WAAAC,SAAI,EAAE,MAAM,UAAU,SAAS,SAAS,CAAC;AAClD;AAOO,SAAS,QAAQ,KAAmB;AACzC,MAAI,SAAS,SAAU;AACvB,UAAQ,IAAI,aAAAC,QAAM,MAAM,KAAK,QAAG,GAAG,GAAG;AACxC;AAQO,SAAS,MAAM,KAAmB;AACvC,MAAI,SAAS,QAAQ;AACnB,YAAQ,MAAM,aAAAA,QAAM,IAAI,KAAK,QAAG,GAAG,GAAG;AACtC;AAAA,EACF;AACA,UAAQ,IAAI,aAAAA,QAAM,IAAI,KAAK,QAAG,GAAG,GAAG;AACtC;AAQO,SAAS,KAAK,KAAmB;AACtC,MAAI,SAAS,QAAQ;AACnB,YAAQ,MAAM,aAAAA,QAAM,OAAO,KAAK,QAAG,GAAG,GAAG;AACzC;AAAA,EACF;AACA,UAAQ,IAAI,aAAAA,QAAM,OAAO,KAAK,QAAG,GAAG,GAAG;AACzC;AAOO,SAAS,KAAK,KAAmB;AACtC,MAAI,SAAS,SAAU;AACvB,UAAQ,IAAI,aAAAA,QAAM,KAAK,KAAK,QAAG,GAAG,GAAG;AACvC;AAOO,SAAS,IAAI,KAAmB;AACrC,MAAI,SAAS,SAAU;AACvB,UAAQ,IAAI,aAAAA,QAAM,IAAI,GAAG,CAAC;AAC5B;AAGA,IAAM,eAAe;AAarB,SAAS,UAAU,OAAe,SAAyB;AACzD,SAAO,KAAK,aAAAA,QAAM,KAAK,QAAG,CAAC,QAAQ,OAAO,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,eAAe,IAAI,MAAM,MAAM,CAAC,CAAC,GAAG,aAAAA,QAAM,KAAK,QAAG,CAAC;AACzH;AAKO,SAAS,SAAe;AAC7B,MAAI,SAAS,SAAU;AACvB,QAAM,QAAQ;AACd,QAAM,UAAU,IAAI,WAAW;AAC/B,QAAM,SAAS,SAAI,OAAO,YAAY;AACtC,QAAM,OAAO;AAAA,IACX;AAAA,IACA,KAAK,aAAAA,QAAM,KAAK,SAAI,MAAM,QAAG,CAAC;AAAA,IAC9B,UAAU,OAAO,aAAAA,QAAM,KAAK,KAAK,KAAK,CAAC;AAAA,IACvC,UAAU,SAAS,aAAAA,QAAM,IAAI,OAAO,CAAC;AAAA,IACrC,KAAK,aAAAA,QAAM,KAAK,SAAI,MAAM,QAAG,CAAC;AAAA,IAC9B;AAAA,EACF,EAAE,KAAK,IAAI;AACX,UAAQ,IAAI,IAAI;AAClB;AAKO,SAAS,QAAQ,KAAmB;AACzC,MAAI,SAAS,SAAU;AACvB,UAAQ,IAAI,GAAG;AACjB;AAOO,SAAS,MAAM,MAAgC;AACpD,MAAI,SAAS,YAAY,KAAK,WAAW,GAAG;AAC1C;AAAA,EACF;AAGA,QAAM,eAAe,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;AAEhE,OAAK,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7B,UAAM,UAAU,IAAI,OAAO,eAAe,IAAI,SAAS,CAAC;AACxD,YAAQ,IAAI,KAAK,aAAAA,QAAM,KAAK,GAAG,CAAC,GAAG,OAAO,GAAG,KAAK,EAAE;AAAA,EACtD,CAAC;AACH;;;ACvKA,uBAAwB;;;ACajB,IAAM,uBAAuB;AAS7B,IAAM,2BAA2B;AAoBjC,SAAS,oBAAoB,YAA+C;AACjF,QAAM,OAAO,cAAc,sBAAsB,KAAA,EAAO,QAAQ,QAAQ,EAAE;AAC1E,MAAI,CAAC,IAAK,QAAO,GAAG,oBAAoB,GAAG,wBAAwB;AACnE,MAAI,IAAI,OAAO,GAAG,wBAAwB,OAAO,EAAE,KAAK,GAAG,EAAG,QAAO;AACrE,SAAO,GAAG,GAAG,GAAG,wBAAwB;AAC1C;AAIO,IAAM,SAAS;EACpB,0BAA0B;EAC1B,uBAAuB;EACvB,oBAAoB;EACpB,yBAAyB;EACzB,oBAAoB,KAAK,KAAK;;AAChC;;;ACxCO,SAAS,iBAAiB,OAAwB;AACvD,MAAI,iBAAiB,OAAO;AAC1B,UAAM,UAAU,MAAM,WAAW,MAAM;AAKvC,UAAM,QAAS,MAA8B;AAC7C,QAAI,iBAAiB,SAAS,MAAM,WAAW,MAAM,YAAY,SAAS;AACxE,aAAO,GAAG,OAAO,KAAK,MAAM,OAAO;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO,OAAO,KAAK;AAC9D,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAElD,MAAI;AACF,UAAM,OAAO,KAAK,UAAU,KAAK;AAIjC,QAAI,QAAQ,SAAS,KAAM,QAAO;AAAA,EACpC,QAAQ;AAAA,EAER;AACA,SAAO,OAAO,KAAK;AACrB;;;ACoDA,IAAMC,sBAAqB;AAC3B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAS5B,SAAS,qBAAqB,KAAa,KAAqB;AAC9D,MAAI,SAAS;AACb,MAAI;AACF,aAAS,IAAI,IAAI,GAAG,EAAE;AAAA,EACxB,QAAQ;AAAA,EAER;AAEA,QAAM,QAAS,KAAmD;AAClE,QAAM,OAAO,OAAO,OAAO,SAAS,WAAW,MAAM,OAAO;AAC5D,QAAM,SAAS,QAAQ,iBAAiB,GAAG;AAE3C,SAAO,IAAI,MAAM,mCAAmC,MAAM,KAAK,MAAM,GAAG;AAC1E;AAmBO,SAAS,YAAY,SAAsC;AAChE,QAAMC,SAAS,SAAwC;AACvD,MAAIA,UAAS,OAAOA,WAAU,UAAU;AACtC,UAAM,EAAE,KAAK,IAAIA;AACjB,QAAI,OAAO,SAAS,YAAY,KAAK,KAAK,EAAG,QAAO;AAAA,EACtD;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,SAAkB,UAA0B;AAC3E,QAAMA,SAAS,SAAwC;AACvD,MAAI,OAAOA,WAAU,YAAYA,OAAM,KAAK,EAAG,QAAOA;AACtD,MAAIA,UAAS,OAAOA,WAAU,UAAU;AACtC,UAAM,EAAE,MAAM,SAAAC,SAAQ,IAAID;AAC1B,UAAM,OAAO,OAAOC,aAAY,YAAYA,SAAQ,KAAK,IAAIA,WAAU;AACvE,UAAM,MAAM,OAAO,SAAS,YAAY,KAAK,KAAK,IAAI,OAAO;AAC7D,QAAI,QAAQ,IAAK,QAAO,GAAG,IAAI,KAAK,GAAG;AACvC,QAAI,KAAM,QAAO;AACjB,QAAI,IAAK,QAAO;AAAA,EAClB;AACA,QAAM,UAAW,SAA0C;AAC3D,MAAI,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAG,QAAO;AAC1D,SAAO;AACT;AAEO,IAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAyB;AACnC,SAAK,UAAU,oBAAoB,OAAO,SAAS;AACnD,SAAK,SAAS,OAAO;AACrB,SAAK,YAAY,OAAO,aAAaF;AACrC,SAAK,aAAa,OAAO,cAAc;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,QAAQ,KAAa,MAAsC;AACvE,QAAI;AACJ,aAAS,UAAU,GAAG,WAAW,KAAK,YAAY,WAAW;AAC3D,UAAI,UAAU,GAAG;AACf,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,sBAAsB,MAAM,UAAU,EAAE,CAAC;AAAA,MAClF;AACA,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,SAAS;AACjE,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,WAAW,OAAO,CAAC;AACxE,YAAI,SAAS,UAAU,OAAO,UAAU,KAAK,YAAY;AACvD,sBAAY,IAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AACvE;AAAA,QACF;AACA,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,oBAAY,WAAW,OAAO,UAC1B,IAAI,MAAM,2BAA2B,KAAK,SAAS,OAAO,GAAG,EAAE,IAC/D,qBAAqB,KAAK,GAAG;AAAA,MACnC,UAAE;AACA,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AACA,UAAM,qBAAqB,QAAQ,YAAY,IAAI,MAAM,OAAO,SAAS,CAAC;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,KAAK,SAAiB,SAAiB,YAA0C;AACrF,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,aAAa;AAAA,QAC9D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK,MAAM;AAAA,UACpC,GAAI,aAAa,EAAE,iBAAiB,WAAW,IAAI,CAAC;AAAA,QACtD;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,SAAS,QAAQ,CAAC;AAAA,MAC3C,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACzD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,WAAW;AAAA,UACX,OAAO,iBAAiB,WAAW,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,UACpF,WAAW,YAAY,SAAS;AAAA,UAChC,aAAa,SAAS;AAAA,QACxB;AAAA,MACF;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,QAAS,KAAK,QAAQ;AAC5B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,GAAG;AAAA,MACL;AAAA,IACF,SAASC,QAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,QACX,OAAOA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,QAChD,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAgC;AACpC,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,eAAe;AAAA,QAChE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,eAAe,UAAU,KAAK,MAAM;AAAA,QACtC;AAAA,MACF,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACzD,eAAO;AAAA,UACL,OAAO,iBAAiB,WAAW,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,QACtF;AAAA,MACF;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,QAAS,KAAK,QAAQ;AAC5B,aAAO;AAAA,IACT,SAASA,QAAO;AACd,aAAO;AAAA,QACL,OAAOA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,QAAQ,WAA0D;AACtE,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,iBAAiB;AAAA,QAClE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK,MAAM;AAAA,QACtC;AAAA,QACA,MAAM,KAAK,UAAU,EAAE,UAAU,CAAC;AAAA,MACpC,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,cAAM,YAAa,MAAM,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE;AACzD,cAAM,SAAS,WAAW;AAC1B,eAAO;AAAA,UACL,OACG,QAAQ,WACT,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU;AAAA,QACnD;AAAA,MACF;AAEA,YAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,YAAM,QAAS,KAAK,QAAQ;AAC5B,aAAO,EAAE,SAAS,MAAM,WAAW,CAAC,EAAE;AAAA,IACxC,SAASA,QAAO;AACd,aAAO;AAAA,QACL,OAAOA,kBAAiB,QAAQA,OAAM,UAAU;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAA2B;AAC/B,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,WAAW;AAAA,QAC5D,QAAQ;AAAA,MACV,CAAC;AACD,aAAO,SAAS;AAAA,IAClB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AH/VA,IAAAE,aAAyD;AACzD,IAAAC,eAAqB;;;AIMd,SAAS,sBAAsB,WAAmB,SAAyB;AAChF,MAAI,cAAc,mBAAoB;AAMtC,MAAI,OAAO,YAAY,YAAY,CAAC,QAAQ,SAAS,8BAA8B,EAAG;AACtF,MAAI,YAAY,UAAa,OAAO,YAAY,SAAU;AAE1D,OAAK,mEAAmE,kBAAkB,GAAG;AAC7F,OAAK,gDAAgD;AACrD,OAAK,2CAA2C;AAChD,OAAK,oDAAoD;AAC3D;;;AJNA,SAAS,oBAAoB,KAA2D;AACtF,QAAM,oBAAgB,mBAAK,KAAK,YAAY;AAC5C,MAAI,KAAC,uBAAW,aAAa,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,YAAQ,yBAAa,eAAe,OAAO,EAAE,MAAM,OAAO;AAChE,QAAM,UAAU,MAAM,KAAK,CAAC,SAAS;AACnC,UAAM,QAAQ,KAAK,KAAK;AACxB,WAAO,UAAU,iBAAiB,UAAU,kBAAkB,UAAU;AAAA,EAC1E,CAAC;AACD,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA;AAAA,IACE;AAAA,IACA;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAuB;AACrC,SAAO,IAAI,yBAAQ,MAAM,EACtB,YAAY,6CAA6C,EACzD,OAAO,mBAAmB,kCAAkC,EAC5D,OAAO,kBAAkB,qBAAqB,EAC9C,OAAO,OAAO,YAAyB;AACtC,QAAI;AACF,aAAO;AAGP,YAAM,aAAa,cAAc;AACjC,UAAI,YAAY;AACd,aAAK,iCAAiC,UAAU,EAAE;AAClD,aAAK,iDAAiD;AAAA,MACxD;AAGA,YAAM,MAAM,gBAAgB;AAC5B,YAAM,SAAS,QAAQ,UAAU,IAAI;AACrC,UAAI,CAAC,QAAQ;AACX,cAAM,qBAAqB;AAC3B,aAAK,6CAA6C;AAClD,aAAK,8CAA8C;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,UAAI,CAAC,QAAQ,UAAU,IAAI,QAAQ;AACjC,aAAK,0DAA0D;AAAA,MACjE;AAGA,YAAM,YAAY,QAAQ,UAAU,IAAI,aAAa;AAGrD,UAAI,CAAC,OAAO,WAAW,KAAK,GAAG;AAC7B,cAAM,6CAA6C;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,WAAK,uBAAuB;AAC5B,YAAM,YAAY,IAAI,kBAAkB;AAAA,QACtC;AAAA,QACA;AAAA,MACF,CAAC;AAGD,YAAM,YAAY,MAAM,UAAU,OAAO;AACzC,UAAI,CAAC,WAAW;AACd,cAAM,mCAAmC,SAAS,EAAE;AACpD,aAAK,wDAAwD;AAC7D,8BAAsB,SAAS;AAC/B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,SAAS,MAAM,UAAU,OAAO;AACtC,UAAI,OAAO,OAAO;AAChB,cAAM,+BAA+B,OAAO,KAAK,EAAE;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,wCAAwC;AAC9C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,oCAA+B,OAAO,QAAQ,IAAI,EAAE;AAC5D,cAAQ,sBAAiB,OAAO,QAAQ,EAAE,EAAE;AAG5C,YAAM,SAAS;AAAA,QACb;AAAA,QACA,WAAW,OAAO,QAAQ;AAAA,QAC1B;AAAA,QACA,WAAW;AAAA,QACX,cAAc;AAAA,MAChB;AAEA,iBAAW,QAAQ,IAAI,GAAG,MAAM;AAEhC,cAAQ,oCAAoC;AAE5C,cAAQ,oBAAoB,QAAQ,IAAI,CAAC,GAAG;AAAA,QAC1C,KAAK;AACH,kBAAQ,4DAA4D;AACpE;AAAA,QACF,KAAK;AACH,eAAK,wEAAmE;AACxE,eAAK,sCAAsC;AAC3C;AAAA,QACF,KAAK;AACH;AAAA,MACJ;AAEA,WAAK,aAAa;AAClB,UAAI,sDAAsD;AAC1D,UAAI,sDAAsD;AAAA,IAC5D,SAAS,KAAK;AACZ,YAAM,0BAA0B,iBAAiB,GAAG,CAAC,EAAE;AACvD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AK9IA,IAAAC,oBAAwB;AACxB,IAAAC,mBAAyB;AACzB,IAAAC,oBAAqB;;;ACFrB,IAAAC,mBAA2C;AAC3C,yBAA2B;AAC3B,IAAAC,oBAAiB;;;ACUV,SAAS,qBAAqB,QAA4C;AAC/E,QAAM,UAAU,aAAa;AAAA,IAC3B,GAAG,iBAAiB,OAAO,KAAK;AAAA,IAChC,GAAG,mBAAmB,OAAO,OAAO;AAAA,IACpC,GAAG,uBAAuB,OAAO,eAAe,CAAC,CAAC;AAAA,EACpD,CAAC;AACD,QAAM,QAAQ,gBAAgB,QAAQ,OAAO;AAC7C,QAAM,aAAa,qBAAqB,QAAQ,SAAS,KAAK;AAE9D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IACxC,GAAI,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IACpC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,EACrC;AACF;AAEA,SAAS,iBAAiB,OAA6C;AACrE,QAAM,UAA8B,CAAC;AACrC,aAAW,QAAQ,OAAO;AACxB,eAAW,SAAS,KAAK,QAAQ;AAC/B,cAAQ,KAAK;AAAA,QACX,IAAI,MAAM,SAAS,MAAM,MAAM;AAAA,QAC/B,MAAM,YAAY,KAAK;AAAA,QACvB,OAAO,MAAM;AAAA,QACb,WAAW,MAAM;AAAA,QACjB,SAAS,MAAM,WAAW,EAAE,IAAI,MAAM,MAAM,QAAQ,WAAW;AAAA,QAC/D,iBAAiB,MAAM;AAAA,MACzB,CAAC;AAAA,IACH;AACA,QAAI,KAAK,gBAAgB,KAAK,iBAAiB,aAAa;AAC1D,cAAQ,KAAK;AAAA,QACX,IAAI,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,OAAsD;AACzE,MAAI,MAAM,SAAS,SAAU,QAAO;AACpC,MAAI,MAAM,SAAS,SAAU,QAAO;AACpC,MAAI,MAAM,SAAS,OAAQ,QAAO;AAClC,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAiD;AAC3E,SAAO,QACJ,OAAO,CAAC,WAAW,OAAO,EAAE,EAC5B,IAAI,CAAC,YAAY;AAAA,IAChB,IAAI,OAAO,SAAS,MAAM,OAAO;AAAA,IACjC,MAAM,OAAO,SAAS,WAAW,WAAW;AAAA,IAC5C,OAAO,OAAO;AAAA,IACd,SAAS,OAAO,WAAW,EAAE,IAAI,OAAO,IAAI,OAAO,OAAO,OAAO,QAAQ,WAAW;AAAA,IACpF,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO;AAAA,IAChB,cAAc,OAAO;AAAA,IACrB,aAAa,OAAO;AAAA,IACpB,sBAAsB,OAAO;AAAA,IAC7B,YAAY,OAAO;AAAA,IACnB,kBAAkB,OAAO;AAAA,IACzB,iBAAiB,OAAO;AAAA,EAC1B,EAAE;AACN;AAEA,SAAS,uBAAuB,aAAyD;AACvF,SAAO,YAAY,IAAI,CAAC,gBAAgB;AAAA,IACtC,IAAI,WAAW;AAAA,IACf,MAAM;AAAA,IACN,OAAO,WAAW,YAAY,WAAW,cAAc,WAAW;AAAA,IAClE,SAAS,EAAE,IAAI,WAAW,IAAI,QAAQ,WAAW,IAAI,QAAQ,SAAS;AAAA,IACtE,iBAAiB,WAAW;AAAA,EAC9B,EAAE;AACJ;AAEA,SAAS,aAAa,SAAiD;AACrE,QAAM,OAAO,oBAAI,IAA8B;AAC/C,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,GAAI;AAChB,UAAM,WAAW,KAAK,IAAI,OAAO,EAAE;AACnC,SAAK,IAAI,OAAO,IAAI,WAAW,EAAE,GAAG,QAAQ,GAAG,UAAU,SAAS,SAAS,WAAW,OAAO,QAAQ,IAAI,MAAM;AAAA,EACjH;AACA,SAAO,MAAM,KAAK,KAAK,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AAC1E;AAEA,SAAS,gBAAgB,QAA0B,SAA+C;AAChG,QAAM,QAA0B,CAAC;AAEjC,aAAW,QAAQ,OAAO,OAAO;AAC/B,UAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,KAAK,YAAY,KAC/E,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,QAAQ;AAC7D,QAAI,CAAC,aAAc;AAEnB,UAAM,KAAK;AAAA,MACT,IAAI,UAAU,KAAK,EAAE;AAAA,MACrB,OAAO,aAAa,QAAQ,UAAU,aAAa,KAAK,KAAK,UAAU,KAAK,EAAE;AAAA,MAC9E,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,GAAG,KAAK,OAAO,IAAI,CAAC,WAAW;AAAA,UAC7B,MAAM,MAAM,SAAS,WAAW,WAAW,MAAM,SAAS,WAAW,WAAW;AAAA,UAChF,QAAQ,MAAM;AAAA,UACd,OAAO,MAAM;AAAA,UACb,UAAU,MAAM;AAAA,UAChB,aAAa,MAAM;AAAA,QACrB,EAAE;AAAA,QACF,EAAE,MAAM,SAAS,QAAQ,aAAa,IAAI,OAAO,aAAa,MAAM;AAAA,QACpE,EAAE,MAAM,QAAQ,aAAa,aAAa,YAAY,EAAE;AAAA,MAC1D;AAAA,MACA,YAAY,oBAAoB,YAAY;AAAA,MAC5C,aAAa,aAAa,wBAAwB,aAAa,cAC3D,CAAC,wCAAwC,IACzC;AAAA,IACN,CAAC;AAAA,EACH;AAEA,aAAW,UAAU,OAAO,SAAS;AACnC,QAAI,OAAO,SAAS,SAAU;AAC9B,QAAI,OAAO,cAAc;AACvB,YAAM,KAAK;AAAA,QACT,IAAI,YAAY,OAAO,EAAE;AAAA,QACzB,OAAO,OAAO,QAAQ,QAAQ,OAAO,KAAK,KAAK,eAAe,OAAO,YAAY;AAAA,QACjF,QAAQ;AAAA,QACR,OAAO,CAAC,EAAE,MAAM,SAAS,QAAQ,OAAO,IAAI,OAAO,OAAO,MAAM,CAAC;AAAA,QACjE,YAAY,oBAAoB,MAAM;AAAA,MACxC,CAAC;AAAA,IACH,WAAW,OAAO,eAAe,OAAO,sBAAsB;AAC5D,YAAM,KAAK;AAAA,QACT,IAAI,WAAW,OAAO,EAAE;AAAA,QACxB,OAAO,OAAO,QAAQ,WAAW,OAAO,KAAK,KAAK,WAAW,OAAO,EAAE;AAAA,QACtE,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,EAAE,MAAM,SAAS,QAAQ,OAAO,IAAI,OAAO,OAAO,MAAM;AAAA,UACxD,EAAE,MAAM,WAAW,aAAa,2DAA2D;AAAA,UAC3F,EAAE,MAAM,QAAQ,aAAa,aAAa,MAAM,EAAE;AAAA,QACpD;AAAA,QACA,YAAY,oBAAoB,MAAM;AAAA,QACtC,aAAa,CAAC,iCAAiC;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,cAAc,OAAO,eAAe,CAAC,GAAG;AACjD,QAAI,WAAW,aAAc,WAAW,cAAc,WAAW,WAAW,SAAS,GAAI;AACvF,YAAM,KAAK;AAAA,QACT,IAAI,QAAQ,WAAW,EAAE;AAAA,QACzB,OAAO,qBAAqB,WAAW,EAAE;AAAA,QACzC,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,EAAE,MAAM,oBAAoB,QAAQ,WAAW,IAAI,aAAa,4DAA4D;AAAA,UAC5H,EAAE,MAAM,SAAS,aAAa,WAAW,WAAW,eAAe,sBAAsB;AAAA,QAC3F;AAAA,QACA,YAAY,EAAE,iBAAiB,WAAW,WAAW,eAAe,eAAe,kBAAkB;AAAA,MACvG,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;AACtD;AAEA,SAAS,oBAAoB,QAAgD;AAC3E,QAAM,kBAAkB,OAAO,eAAe,SAAS,WACnD,WACA,OAAO,kBAAkB,oBAAoB,OAAO,eAAe,eAAe;AACtF,QAAM,UAAU,CAAC,OAAO,eAAe,OAAO,aAAa,EAAE,OAAO,OAAO;AAC3E,SAAO;AAAA,IACL,GAAI,kBAAkB,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC7C,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;AAAA,IACnD,GAAI,OAAO,kBAAkB,iBAAiB,EAAE,OAAO,IAAM,IAAI,CAAC;AAAA,EACpE;AACF;AAEA,SAAS,aAAa,QAAkC;AACtD,MAAI,OAAO,eAAe,YAAa,QAAO,OAAO,cAAc;AACnE,MAAI,OAAO,eAAe,SAAS,SAAU,QAAO;AACpD,MAAI,OAAO,aAAc,QAAO,0BAA0B,OAAO,YAAY;AAC7E,MAAI,OAAO,kBAAkB,gBAAiB,QAAO,YAAY,OAAO,iBAAiB,eAAe;AACxG,SAAO;AACT;AAEA,SAAS,qBACP,QACA,SACA,OAC8B;AAC9B,QAAM,mBAAmB,QACtB,OAAO,CAAC,WAAW,CAAC,UAAU,UAAU,MAAM,EAAE,SAAS,OAAO,IAAI,CAAC,EACrE,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,WAAW,OAAO,EAAE;AAC5B,QAAM,cAAc,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;AAC9D,QAAM,cAAc,OAAO,QACxB,OAAO,CAAC,WAAW,OAAO,eAAe,OAAO,oBAAoB,EACpE,IAAI,CAAC,WAAW,GAAG,OAAO,EAAE,wBAAwB;AACvD,QAAM,mBAAmB,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,kBAAkB,cAAc;AAEhG,QAAM,QAA0B;AAAA,IAC9B,aAAa,sBAAsB,MAAM;AAAA,IACzC;AAAA,IACA;AAAA,IACA,GAAI,mBAAmB,EAAE,YAAY,oBAAoB,gBAAgB,EAAE,IAAI,CAAC;AAAA,IAChF,GAAI,YAAY,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;AAAA,EAClD;AAEA,SAAO,MAAM,eAAe,YAAY,SAAS,KAAK,iBAAiB,SAAS,IAC5E,QACA;AACN;AAEA,SAAS,sBAAsB,QAA8C;AAC3E,QAAM,QAAkB,CAAC;AACzB,QAAM,cAAc,OAAO,eAAe,CAAC;AAE3C,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,kBAAkB,YACrB,IAAI,CAAC,eAAe,WAAW,YAAY,WAAW,cAAc,WAAW,EAAE,EACjF,OAAO,OAAO,EACd,MAAM,GAAG,CAAC;AACb,UAAM;AAAA,MACJ,gBAAgB,SAAS,IACrB,qBAAqB,gBAAgB,KAAK,IAAI,CAAC,eAC/C;AAAA,IACN;AAAA,EACF;AAEA,QAAM,eAAe,oBAAI,IAAiC;AAC1D,aAAW,QAAQ,OAAO,OAAO;AAC/B,eAAW,SAAS,KAAK,QAAQ;AAC/B,mBAAa,IAAI,MAAM,MAAM,KAAK;AAAA,IACpC;AAAA,EACF;AACA,QAAM,aAAa,aAAa;AAChC,MAAI,aAAa,GAAG;AAClB,UAAM,gBAAgB,MAAM,KAAK,aAAa,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,QAAQ,EAAE;AAC1F,UAAM,aAAa,eAAe,IAAI,UAAU;AAChD,UAAM;AAAA,MACJ,gBAAgB,IACZ,wBAAwB,UAAU,IAAI,UAAU,KAAK,aAAa,eAClE,wBAAwB,UAAU,IAAI,UAAU;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,kBAAkB,OAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,YAAY,EAAE;AAC/E,MAAI,kBAAkB,GAAG;AACvB,UAAM,KAAK,QAAQ,eAAe,kBAAkB,oBAAoB,IAAI,KAAK,GAAG,EAAE;AAAA,EACxF;AAEA,QAAM,cAAc,OAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,SAAS,QAAQ,EAAE;AAChF,MAAI,cAAc,GAAG;AACnB,UAAM,KAAK,UAAU,gBAAgB,IAAI,qBAAqB,GAAG,WAAW,gBAAgB,EAAE;AAAA,EAChG;AAEA,QAAM,aAAa,OAAO,QAAQ,OAAO,CAAC,WAAW,OAAO,kBAAkB,cAAc,EAAE;AAC9F,MAAI,aAAa,GAAG;AAClB,UAAM,KAAK,YAAY,eAAe,IAAI,mBAAmB,uBAAuB,EAAE;AAAA,EACxF;AAEA,MAAI,MAAM,SAAS,EAAG,QAAO,MAAM,KAAK,IAAI;AAC5C,MAAI,OAAO,MAAO,QAAO,mBAAmB,OAAO,KAAK;AACxD,SAAO;AACT;;;ACjRA,uBAAiB;AACjB,IAAAC,oBAAiB;;;ACDjB,sBAAe;AACf,IAAAC,eAAiB;AACjB,IAAAC,mBAAqB;AACrB,iBAA4B;AAC5B,uBAAiB;;;ACJjB,oBAAyC;AAGlC,IAAM,yBAAyC;AAAA,EACpD;AAAA,EACA;AAAA,EACA,CAAC,cAAc,EAAE,wBAAwB,KAAK,CAAC;AAAA,EAC/C;AAAA,EACA,CAAC,oBAAoB,EAAE,UAAU,UAAU,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,CAAC,kBAAkB,EAAE,YAAY,OAAO,CAAC;AAC3C;AAEO,SAAS,YAAY,QAAgB,gBAAgC,CAAC,GAAW;AACtF,aAAO,qBAAM,QAAQ;AAAA,IACnB,YAAY;AAAA,IACZ,SAAS,CAAC,GAAG,wBAAwB,GAAG,aAAa;AAAA,EACvD,CAAC;AACH;;;ACrBA,QAAmB;AAEZ,SAAS,iBACd,SACA,MAC4B;AAC5B,SAAO,QAAQ,WAAW;AAAA,IACxB,CAAC,SACG,iBAAe,IAAI,KAAO,kBAAgB,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS;AAAA,EACjF;AACF;AAEO,SAAS,cACd,SACA,MACoB;AACpB,QAAM,OAAO,iBAAiB,SAAS,IAAI;AAC3C,MAAI,CAAC,QAAQ,CAAC,KAAK,MAAO,QAAO;AACjC,MAAM,kBAAgB,KAAK,KAAK,EAAG,QAAO,KAAK,MAAM;AACrD,MAAM,2BAAyB,KAAK,KAAK,KAAO,kBAAgB,KAAK,MAAM,UAAU,GAAG;AACtF,WAAO,KAAK,MAAM,WAAW;AAAA,EAC/B;AACA,SAAO;AACT;AAmBO,SAAS,4BACd,SACA,MACoB;AACpB,QAAM,OAAO,iBAAiB,SAAS,IAAI;AAC3C,MAAI,CAAC,MAAM,SAAS,CAAG,2BAAyB,KAAK,KAAK,EAAG,QAAO;AACpE,SAAS,eAAa,KAAK,MAAM,UAAU,IAAI,KAAK,MAAM,WAAW,OAAO;AAC9E;AAoBO,SAAS,gBAAgB,SAA8B,MAAuB;AACnF,SAAO,QAAQ,iBAAiB,SAAS,IAAI,CAAC;AAChD;;;ACpDA,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAkBM,SAAS,iBAAiB,SAAkD;AACjF,MAAI;AACJ,aAAW,QAAQ,QAAQ,YAAY;AACrC,QAAI,KAAK,SAAS,kBAAkB,KAAK,KAAK,SAAS,gBAAiB;AACxE,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,CAAC,WAAW,KAAK,IAAI,EAAG;AAC5B,QAAI,KAAK,OAAO,SAAS,yBAA0B;AAGnD,QAAI,SAAS,UAAW,QAAO;AAC/B,QAAI,yBAAyB,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,EAAG;AACpE,iBAAa;AAAA,EACf;AACA,SAAO;AACT;AAEA,IAAM,kBAAkB,oBAAI,IAAI,CAAC,QAAQ,cAAc,gBAAgB,sBAAsB,CAAC;AAC9F,IAAM,mBAAmB,oBAAI,IAAI,CAAC,aAAa,SAAS,UAAU,CAAC;AACnE,IAAM,oBAAoB,oBAAI,IAAI,CAAC,oBAAoB,aAAa,QAAQ,CAAC;AAC7E,IAAM,kBAAkB,oBAAI,IAAI,CAAC,YAAY,eAAe,mBAAmB,WAAW,CAAC;AAC3F,IAAM,mBAAmB,oBAAI,IAAI,CAAC,SAAS,aAAa,CAAC;AAElD,SAAS,qBACd,MACA,SACuB;AACvB,MAAI,gBAAgB,IAAI,IAAI,EAAG,QAAO;AACtC,MAAI,iBAAiB,IAAI,IAAI,EAAG,QAAO;AACvC,MAAI,QAAQ,KAAK,IAAI,EAAG,QAAO;AAC/B,MAAI,kCAAkC,KAAK,IAAI,EAAG,QAAO;AACzD,MAAI,4BAA4B,KAAK,IAAI,EAAG,QAAO;AACnD,MAAI,iBAAiB,IAAI,IAAI,EAAG,QAAO;AACvC,MAAI,kBAAkB,IAAI,IAAI,EAAG,QAAO;AAExC,MAAI,SAAS;AAMX,UAAM,aACJ,gBAAgB,SAAS,SAAS,KAClC,gBAAgB,SAAS,UAAU,KACnC,gBAAgB,SAAS,SAAS,KAClC,gBAAgB,SAAS,MAAM;AACjC,UAAM,WAAW,gBAAgB,SAAS,OAAO;AACjD,UAAM,aAAa,gBAAgB,SAAS,SAAS,KAAK,gBAAgB,SAAS,UAAU;AAC7F,UAAM,cACJ,gBAAgB,SAAS,UAAU,KACnC,gBAAgB,SAAS,eAAe,KACxC,gBAAgB,SAAS,cAAc;AACzC,QAAI,eAAe,YAAY,aAAc,QAAO;AACpD,QAAI,cAAc,YAAa,QAAO;AACtC,QACE,gBACC,gBAAgB,SAAS,OAAO,KAAK,gBAAgB,SAAS,aAAa,IAC5E;AACA,aAAO;AAAA,IACT;AACA,QAAI,iBAAiB,OAAO,EAAG,QAAO;AACtC,QAAI,cAAc,SAAS,SAAS,KAAK,4BAA4B,SAAS,SAAS,GAAG;AACxF,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,gBAAgB,IAAI,IAAI,EAAG,QAAO;AACtC,SAAO;AACT;;;ACnIA,sBAAqB;AACrB,IAAAC,KAAmB;AAEZ,SAAS,iBAAiB,KAAsC;AACrE,QAAM,WAAW,oBAAI,IAAwB;AAE7C,sBAAAC,SAAS,KAAK;AAAA,IACZ,qBAAqB,CAAC,aAAa;AACjC,UAAI,SAAS,KAAK,IAAI,KAAM,UAAS,IAAI,SAAS,KAAK,GAAG,MAAM,SAAS,IAAI;AAAA,IAC/E;AAAA,IACA,oBAAoB,CAAC,aAAa;AAChC,UAAI,CAAG,gBAAa,SAAS,KAAK,EAAE,EAAG;AACvC,YAAM,OAAO,SAAS,KAAK;AAC3B,UAAM,6BAA0B,IAAI,KAAO,wBAAqB,IAAI,GAAG;AACrE,iBAAS,IAAI,SAAS,KAAK,GAAG,MAAM,IAAI;AAAA,MAC1C;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACpBA,IAAAC,mBAAqB;AACrB,IAAAC,KAAmB;AAcnB,IAAM,mBACJ;AAEK,SAAS,wBACd,MACA,IACA,UACA,OAAO,oBAAI,IAAY,GACL;AAClB,MAAI,KAAK,IAAI,IAAI,GAAG;AAClB,WAAO;AAAA,MACL,kBAAkB,EAAE,iBAAiB,OAAO;AAAA,MAC5C,aAAa;AAAA,MACb,4BAA4B;AAAA,IAC9B;AAAA,EACF;AACA,OAAK,IAAI,IAAI;AAEb,MAAI,WAAW,GAAG,UAAU;AAC5B,MAAI,UAAU;AACd,MAAI,iBAAiB;AACrB,MAAI,6BAA6B;AACjC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,cAAc,iBAAiB,KAAK,IAAI;AAC5C,QAAM,uBAAuB,oBAAI,IAAY;AAE7C,QAAM,cAAc,CAAC,SAA2B;AAC9C,QAAM,sBAAmB,KAAK,MAAM,KAAO,gBAAa,KAAK,OAAO,QAAQ,GAAG;AAC7E,YAAM,SAAS,KAAK,OAAO,SAAS;AACpC,UAAI,WAAW,UAAU,WAAW,WAAW,WAAW,UAAW,WAAU;AAC/E,UACI,gBAAa,KAAK,OAAO,MAAM,KACjC,KAAK,OAAO,OAAO,SAAS,gBAC5B,CAAC,YAAY,QAAQ,SAAS,EAAE,SAAS,MAAM,GAC/C;AACA,cAAM,WAAW,KAAK,UAAU,CAAC;AACjC,YAAM,mBAAgB,QAAQ,GAAG;AAC/B,yBAAe,SAAS;AACxB,0BAAgB,EAAE,MAAM,cAAc,QAAQ,SAAS,MAAM;AAAA,QAC/D;AAAA,MACF;AACA,UACI,gBAAa,KAAK,OAAO,MAAM,KACjC,KAAK,OAAO,OAAO,SAAS,gBAC5B,WAAW,UACX;AACA,wBAAgB,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,MACzF;AACA,UAAM,gBAAa,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,OAAO,SAAS,WAAW,WAAW,SAAS;AACnG,qCAA6B;AAAA,MAC/B;AACA,UACI,gBAAa,KAAK,OAAO,MAAM,KACjC,iCAAiC,KAAK,KAAK,OAAO,OAAO,IAAI,GAC7D;AACA,cAAM,WAAW,KAAK,UAAU,CAAC;AACjC,cAAM,YAAY,KAAK,UAAU,CAAC;AAClC,cAAM,OAAS,mBAAgB,SAAS,IACpC,UAAU,QACR,mBAAgB,QAAQ,IACxB,SAAS,QACT;AACN,cAAM,SAA2B,EAAE,MAAM,SAAS,aAAa,KAAK;AACpE,YAAI,uBAAuB,KAAK,MAAM,KAAQ,mBAAgB,QAAQ,KAAK,SAAS,KAAK,SAAS,KAAK,GAAI;AACzG,0BAAgB;AAAA,QAClB,OAAO;AACL,0BAAgB,iBAAiB;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA,QAAM,gBAAa,KAAK,MAAM,GAAG;AAC/B,YAAM,aAAa,KAAK,OAAO;AAC/B,UAAI,YAAY,KAAK,UAAU,GAAG;AAChC,yBAAiB;AACjB,cAAM,YAAY,kBAAkB,UAAU;AAC9C,cAAM,WAAW,KAAK,UAAU,CAAC;AACjC,YAAI,aAAe,oBAAiB,QAAQ,GAAG;AAC7C,cAAI,iDAAiD,KAAK,SAAS,GAAG;AACpE,iCAAqB,IAAI,SAAS;AAAA,UACpC;AACA,cAAI,SAAS,UAAU,QAAQ,CAAC,iDAAiD,KAAK,SAAS,GAAG;AAChG,yBAAa,cAAc;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,UAAI,iBAAiB,KAAK,UAAU,EAAG,eAAc;AAErD,YAAM,SAAS,SAAS,IAAI,UAAU;AACtC,UAAI,QAAQ;AACV,cAAM,aAAa,wBAAwB,YAAY,QAAQ,UAAU,IAAI;AAC7E,mBAAW,YAAY,WAAW,iBAAiB,mBAAmB;AACtE,uCAA+B,WAAW;AAC1C,wBAAgB,WAAW;AAC3B,uBAAe,gBAAgB,WAAW;AAC1C,wBAAgB,iBAAiB,WAAW;AAC5C,wBAAgB,iBAAiB,WAAW;AAC5C,qBAAa,cAAc,WAAW;AACtC,mBAAW,WAAW,WAAW,wBAAwB,CAAC,GAAG;AAC3D,+BAAqB,IAAI,OAAO;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,SAAiB;AACpC,QAAM,qBAAkB,IAAI,EAAG,YAAW;AAC1C,QAAM,oBAAiB,IAAI,EAAG,aAAY,IAAI;AAC9C,QAAM,sBAAmB,IAAI,KAAO,gBAAa,KAAK,QAAQ,KAAK,iBAAiB,KAAK,KAAK,SAAS,IAAI,GAAG;AAC5G,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,GAAG,MAAM;AACX,yBAAAC,SAAS,GAAG,MAAa;AAAA,MACvB,SAAS;AAAA,MACT,OAAO,CAAC,aAAkB,YAAY,SAAS,IAAI;AAAA,IACrD,CAAQ;AAAA,EACV;AAEA,QAAM,kBAA6D,eAC/D,eACA,eAAe,SAAS,WACtB,eACA,kBAAkB,eAAe,SAAS,WAAW,aACnD,oBACA,YAAY,UACV,UACA;AAEV,SAAO;AAAA,IACL,kBAAkB;AAAA,MAChB,gBAAgB,YAAY,WAAW;AAAA,MACvC;AAAA,MACA,GAAI,qBAAqB,OAAO,IAC5B,EAAE,sBAAsB,MAAM,KAAK,oBAAoB,EAAE,KAAK,EAAE,IAChE,CAAC;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB,MAAM,KAAK,oBAAoB,EAAE,KAAK;AAAA,EAC9D;AACF;AAEA,SAAS,kBAAkB,YAAwC;AACjE,QAAM,MAAM,WAAW,QAAQ,QAAQ,EAAE;AACzC,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,IAAI,OAAO,CAAC,EAAE,YAAY,IAAI,IAAI,MAAM,CAAC;AAClD;;;AC1KA,IAAAC,mBAAqB;AACrB,IAAAC,KAAmB;AAQZ,SAAS,uBAAuB,KAAwC;AAC7E,QAAM,QAA0B,CAAC;AACjC,uBAAAC,SAAS,KAAY;AAAA,IACnB,SAAS,CAAG,UAAO,GAAG;AAAA,IACtB,gBAAgB,CAAC,aAAkB;AACjC,YAAM,OAAO,SAAS;AACtB,UACE,CAAG,sBAAmB,KAAK,MAAM,KACjC,CAAG,gBAAa,KAAK,OAAO,MAAM,KAClC,KAAK,OAAO,OAAO,SAAS,gBAC5B,CAAG,gBAAa,KAAK,OAAO,QAAQ,GACpC;AACA;AAAA,MACF;AACA,YAAM,SAAS,KAAK,OAAO,SAAS;AACpC,UAAI,CAAC,CAAC,YAAY,QAAQ,WAAW,QAAQ,EAAE,SAAS,MAAM,EAAG;AACjE,YAAM,WAAW,KAAK,UAAU,CAAC;AACjC,YAAM,eAAiB,mBAAgB,QAAQ,IAAI,SAAS,QAAQ;AACpE,YAAM,KAAK;AAAA,QACT;AAAA,QACA,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,QACvC,QAAQ,wBAAwB,KAAK,UAAU,CAAC,CAAC;AAAA,MACnD,CAAC;AAAA,IACH;AAAA,EACF,CAAQ;AACR,SAAO;AACT;AAEO,SAAS,wBAAwB,KAAwD;AAC9F,QAAM,SAAiC,CAAC;AACxC,MAAI,CAAC,OAAO,CAAG,sBAAmB,GAAG,EAAG,QAAO;AAC/C,aAAW,QAAQ,IAAI,YAAY;AACjC,QAAI,CAAG,oBAAiB,IAAI,EAAG;AAC/B,UAAM,MAAQ,gBAAa,KAAK,GAAG,IAC/B,KAAK,IAAI,OACP,mBAAgB,KAAK,GAAG,IACxB,KAAK,IAAI,QACT;AACN,QAAI,CAAC,IAAK;AACV,QACI,sBAAmB,KAAK,KAAK,KAC7B,gBAAa,KAAK,MAAM,MAAM,KAC9B,gBAAa,KAAK,MAAM,QAAQ,GAClC;AACA,aAAO,GAAG,IAAI,GAAG,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,MAAM,SAAS,IAAI;AAAA,IACrE,WAAa,gBAAa,KAAK,KAAK,GAAG;AACrC,aAAO,GAAG,IAAI,KAAK,MAAM;AAAA,IAC3B,WAAa,mBAAgB,KAAK,KAAK,GAAG;AACxC,aAAO,GAAG,IAAI,KAAK,MAAM;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AACT;;;AC3DO,SAAS,4BACd,QACwC;AACxC,MAAI,CAAC,OAAO,SAAS,YAAY,EAAG,QAAO;AAE3C,QAAM,SAAqC,CAAC;AAC5C,MAAI,UAAU;AAEd,QAAM,SAAS;AACf,MAAI;AACJ,SAAQ,IAAI,OAAO,KAAK,MAAM,GAAI;AAChC,UAAM,WAAW,EAAE,CAAC,KAAK,IAAI,QAAQ,aAAa,EAAE,EAAE,KAAK;AAC3D,UAAM,SAAS,oBAAoB,OAAO;AAC1C,QAAI,QAAQ;AACV,aAAO,OAAO,QAAQ,MAAM;AAC5B,gBAAU;AACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,KAAK,MAAM,GAAG;AAClC,WAAO,QAAQ;AACf,cAAU;AAAA,EACZ;AAEA,QAAM,YAAY;AAClB,QAAM,eAAe,UAAU,KAAK,MAAM;AAC1C,MAAI,gBAAgB,aAAa,CAAC,GAAG;AACnC,UAAM,MAAM,aAAa,CAAC,EACvB,QAAQ,aAAa,EAAE,EACvB,MAAM,QAAQ,EACd,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,QAAI,IAAI,SAAS,GAAG;AAClB,aAAO,iBAAiB;AACxB,gBAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,UAAU,SAAS;AAC5B;AAEO,SAAS,+BACd,QAC+B;AAC/B,MAAI,CAAC,0BAA0B,KAAK,MAAM,EAAG,QAAO;AAEpD,QAAM,MAAM,oBAAI,IAAY;AAC5B,QAAM,KAAK;AACX,MAAI,WAAW;AACf,MAAI;AACJ,SAAQ,IAAI,GAAG,KAAK,MAAM,GAAI;AAC5B,UAAM,QAAQ,EAAE,CAAC,KAAK,IAAI,QAAQ,aAAa,EAAE,EAAE,KAAK;AACxD,QAAI,CAAC,MAAM;AACT,iBAAW;AACX;AAAA,IACF;AACA,eAAW,MAAM,KAAK,MAAM,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,GAAG;AAC1E,UAAI,IAAI,EAAE;AAAA,IACZ;AAAA,EACF;AAEA,MAAI,IAAI,SAAS,EAAG,QAAO,WAAW,MAAM;AAC5C,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAiD;AAC5E,QAAM,UAAU,KAAK,KAAK;AAC1B,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,UAAM,YAAY,QAAQ,QAAQ,MAAM,GAAG;AAC3C,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,SAAS;AAChC,UAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,eAAO,0BAA0B,GAA8B;AAAA,MACjE;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,MAA+B,CAAC;AACtC,aAAW,QAAQ,QAAQ,MAAM,QAAQ,GAAG;AAC1C,UAAM,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,KAAK,MAAM,OAAW;AAC3B,UAAM,MAAM,EAAE,KAAK;AACnB,UAAM,QAAQ,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACjD,QAAI,UAAU,OAAQ,KAAI,GAAG,IAAI;AAAA,aACxB,UAAU,QAAS,KAAI,GAAG,IAAI;AAAA,QAClC,KAAI,GAAG,IAAI;AAAA,EAClB;AACA,SAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,0BAA0B,GAAG,IAAI;AACxE;AAEA,SAAS,0BACP,KAC4B;AAC5B,QAAM,MAAkC,CAAC;AACzC,MACE,OAAO,IAAI,gBAAgB,aAC1B,IAAI,gBAAgB,UAAU,IAAI,gBAAgB,WAAW,IAAI,gBAAgB,SAClF;AACA,QAAI,cAAc,IAAI;AAAA,EACxB;AACA,MAAI,OAAO,IAAI,yBAAyB,WAAW;AACjD,QAAI,uBAAuB,IAAI;AAAA,EACjC;AACA,MAAI,OAAO,IAAI,UAAU,WAAW;AAClC,QAAI,QAAQ,IAAI;AAAA,EAClB;AACA,MAAI,MAAM,QAAQ,IAAI,cAAc,GAAG;AACrC,UAAM,MAAM,IAAI,eAAe,OAAO,CAAC,MAAmB,OAAO,MAAM,YAAY,CAAC,CAAC,CAAC;AACtF,QAAI,IAAI,SAAS,EAAG,KAAI,iBAAiB;AAAA,EAC3C;AACA,SAAO;AACT;;;APrEO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA,UAAU,QAAQ,IAAI,YAAY;AAAA;AAAA,EAElC;AAAA;AAAA,EAEA;AAAA;AAAA,EAED,qBAAqB;AAAA,EAE5B,YACE,QACA,SACA;AACA,SAAK,SAAS;AACd,SAAK,gBAAgB,SAAS,iBAAiB;AAC/C,SAAK,iBAAiB,SAAS,kBAAkB;AAAA,MAC/C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,UAAuC;AAC3C,UAAM,EAAE,UAAU,CAAC,yBAAyB,GAAG,UAAU,CAAC,iBAAiB,EAAE,IAAI,KAAK;AAEtF,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,6CAA6C,OAAO;AAChE,UAAI,KAAK,eAAe;AACtB,gBAAQ,IAAI,2DAAsD,KAAK,cAAc;AAAA,MACvF;AAAA,IACF;AAGA,UAAM,QAAQ,UAAM,iBAAAC,SAAK,SAAS;AAAA,MAChC,KAAK,KAAK,OAAO;AAAA,MACjB,QAAQ;AAAA,IACV,CAAC;AAED,QAAI,KAAK,SAAS;AAChB,cAAQ,IAAI,0BAA0B,MAAM,MAAM,QAAQ;AAAA,IAC5D;AAGA,QAAI,qBAAyC;AAC7C,QAAI,KAAK,eAAe;AACtB,YAAM,UAAU,UAAM,iBAAAA,SAAK,KAAK,gBAAgB;AAAA,QAC9C,KAAK,KAAK,OAAO;AAAA,QACjB,QAAQ;AAAA,MACV,CAAC;AACD,2BAAqB,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,aAAAC,QAAK,QAAQ,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;AAAA,IACvF;AAEA,UAAM,UAA8B,CAAC;AACrC,SAAK,qBAAqB;AAE1B,eAAWC,SAAQ,OAAO;AACxB,YAAM,WAAW,aAAAD,QAAK,QAAQ,KAAK,OAAO,SAASC,KAAI;AACvD,UAAI;AACF,cAAM,aAAa,MAAM,KAAK,YAAY,QAAQ;AAClD,YAAI,CAAC,WAAY;AAIjB,YAAI,KAAK,eAAe;AACtB,gBAAM,oBAAqB,WAAmB,wBAAwB;AACtE,gBAAM,iBAAiB,oBAAoB,IAAI,QAAQ,KAAK;AAE5D,cAAI,CAAC,qBAAqB,CAAC,gBAAgB;AACzC,iBAAK;AACL,gBAAI,KAAK,SAAS;AAChB,sBAAQ,IAAI,8CAAyCA,KAAI,EAAE;AAAA,YAC7D;AACA;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,KAAK,UAAU;AACvB,YAAI,KAAK,SAAS;AAChB,kBAAQ,IAAI,qCAAgC,WAAW,IAAI,KAAKA,KAAI,GAAG;AAAA,QACzE;AAAA,MACF,SAASC,QAAO;AACd,YAAI,KAAK,SAAS;AAChB,kBAAQ;AAAA,YACN,oCAAoCD,KAAI;AAAA,YACxCC,kBAAiB,QAAQA,OAAM,UAAUA;AAAA,UAC3C;AAAA,QACF;AAAA,MAEF;AAAA,IACF;AAEA,QAAI,KAAK,WAAW,KAAK,eAAe;AACtC,cAAQ;AAAA,QACN,iCAAiC,QAAQ,MAAM,cAAc,KAAK,kBAAkB;AAAA,MACtF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,YAAY,UAAoD;AACpE,UAAM,SAAS,MAAM,gBAAAC,QAAG,SAAS,UAAU,OAAO;AAClD,UAAM,OAAO,KAAK,kBAAkB,QAAQ;AAI5C,UAAM,MAAM,YAAY,QAAQ,KAAK,OAAO,aAAoB;AAGhE,UAAM,qBAAqB,KAAK,8BAA8B,GAAG;AAGjE,UAAM,wBAAwB,KAAK,yBAAyB,GAAG;AAG/D,UAAM,gBAAgB,KAAK,4BAA4B,GAAG;AAG1D,UAAM,oBAAoB,KAAK,yBAAyB,GAAG;AAI3D,UAAM,QAAQ,KAAK,WAAW,oBAAoB,SAAS,CAAC,GAAG,KAAK,aAAa,GAAG,CAAC;AAGrF,UAAM,aAAa,KAAK,kBAAkB,GAAG;AAG7C,UAAM,UAAU,KAAK,eAAe,KAAK,kBAAkB;AAK3D,UAAM,cAAc,KAAK,mBAAmB,GAAG;AAM/C,UAAM,uBAAuB,4BAA4B,MAAM;AAM/D,UAAM,kBAAkB,+BAA+B,MAAM;AAC7D,QAAI,iBAAiB;AACnB,iBAAW,UAAU,SAAS;AAC5B,YAAI,oBAAoB,OAAO,gBAAgB,IAAI,OAAO,EAAE,GAAG;AAC7D,iBAAO,cAAc;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAA+B;AAAA,MACnC,MAAM,oBAAoB,QAAQ;AAAA,MAClC;AAAA,MACA,OAAO,oBAAoB;AAAA,MAC3B,aAAa,oBAAoB;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,YAAY,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;AAAA,MAChD,GAAI,oBAAoB,oBAAoB,mBAAmB,iBAAiB,SAAS,IACrF,EAAE,kBAAkB,mBAAmB,iBAAiB,IACxD,CAAC;AAAA,MACL,GAAI,uBACA;AAAA,QACE,aAAa;AAAA,QACb,GAAI,qBAAqB,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,MACtD,IACA,CAAC;AAAA,IACP;AAGA,IAAC,WAAmB,sBAAsB;AAE1C,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,KAA+B;AAC9D,QAAI,QAAQ;AAEZ,yBAAAC,SAAS,KAAK;AAAA,MACZ,gBAAgB,CAAC,aAAa;AAC5B,YAAI,MAAO;AACX,cAAM,SAAS,SAAS,KAAK;AAE7B,YACc,wBAAa,MAAM,KAAK,OAAO,SAAS,oBACxC,8BAAmB,MAAM,KACxB,wBAAa,OAAO,QAAQ,KACvC,OAAO,SAAS,SAAS,kBAC3B;AACA,kBAAQ;AACR,mBAAS,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,8BACN,KACuD;AACvD,QAAI,WAAkE;AAEtE,yBAAAA,SAAS,KAAK;AAAA,MACZ,gBAAgB,CAAC,aAAa;AAC5B,cAAM,SAAS,SAAS,KAAK;AAG7B,YACc,wBAAa,MAAM,KAAK,OAAO,SAAS,oBACxC,8BAAmB,MAAM,KACxB,wBAAa,OAAO,QAAQ,KACvC,OAAO,SAAS,SAAS,kBAC3B;AAEA,gBAAM,MAAM,SAAS,KAAK,UAAU,CAAC;AACrC,cAAe,8BAAmB,GAAG,GAAG;AACtC,uBAAW,KAAK,0BAA0B,GAAG;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,0BACN,SAC8C;AAC9C,UAAM,SAAuD;AAAA,MAC3D,MAAM;AAAA,MACN,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,MACR,mBAAmB,CAAC;AAAA,MACpB,YAAY,CAAC;AAAA,IACf;AAEA,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAI,CAAY,4BAAiB,IAAI,KAAK,CAAY,0BAAe,IAAI,GAAG;AAC1E;AAAA,MACF;AAEA,YAAM,MAAiB,wBAAa,KAAK,GAAG,IAAI,KAAK,IAAI,OAAO;AAChE,UAAI,CAAC,IAAK;AAEV,UAAe,4BAAiB,IAAI,GAAG;AACrC,cAAM,QAAQ,KAAK;AAEnB,YAAI,QAAQ,UAAqB,2BAAgB,KAAK,GAAG;AACvD,iBAAO,OAAO,MAAM;AAAA,QACtB,WAAW,QAAQ,WAAsB,2BAAgB,KAAK,GAAG;AAC/D,iBAAO,QAAQ,MAAM;AAAA,QACvB,WAAW,QAAQ,iBAA4B,2BAAgB,KAAK,GAAG;AACrE,iBAAO,cAAc,MAAM;AAAA,QAC7B,WAAW,QAAQ,aAAwB,6BAAkB,KAAK,GAAG;AACnE,iBAAO,UAAU,KAAK,kBAAkB,KAAK;AAAA,QAC/C,WAAW,QAAQ,YAAuB,6BAAkB,KAAK,GAAG;AAElE,gBAAM,SAAS,KAAK,iBAAiB,KAAK;AAC1C,cAAI,OAAO,SAAS,GAAG;AACrB,mBAAO,QAAQ;AAAA,cACb;AAAA,gBACE,IAAI;AAAA,gBACJ;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,QAAQ,sBAAiC,6BAAkB,KAAK,GAAG;AAG5E,gBAAM,UAAoB,CAAC;AAC3B,qBAAW,WAAW,MAAM,UAAU;AACpC,gBAAe,2BAAgB,OAAO,GAAG;AACvC,oBAAM,UAAU,QAAQ,MAAM,KAAK;AACnC,kBAAI,QAAQ,SAAS,EAAG,SAAQ,KAAK,OAAO;AAAA,YAC9C;AAAA,UACF;AACA,cAAI,QAAQ,SAAS,GAAG;AACtB,mBAAO,mBAAmB;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAAqD;AAC7E,UAAM,UAA8B,CAAC;AAErC,eAAW,WAAW,IAAI,UAAU;AAClC,UAAe,8BAAmB,OAAO,GAAG;AAC1C,cAAM,SAAS,KAAK,kBAAkB,OAAO;AAC7C,YAAI,OAAO,IAAI;AACb,kBAAQ,KAAK,MAAM;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAAoD;AAC5E,UAAM,SAA2B;AAAA,MAC/B,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AAEA,eAAW,QAAQ,IAAI,YAAY;AACjC,UAAI,CAAY,4BAAiB,IAAI,EAAG;AAExC,YAAM,MAAiB,wBAAa,KAAK,GAAG,IAAI,KAAK,IAAI,OAAO;AAChE,UAAI,CAAC,IAAK;AAEV,YAAM,QAAQ,KAAK;AAEnB,UAAI,QAAQ,QAAmB,2BAAgB,KAAK,GAAG;AACrD,eAAO,KAAK,MAAM;AAAA,MACpB,WAAW,QAAQ,WAAsB,2BAAgB,KAAK,GAAG;AAC/D,eAAO,QAAQ,MAAM;AAAA,MACvB,WAAW,QAAQ,UAAqB,2BAAgB,KAAK,GAAG;AAC9D,eAAO,OAAQ,MAAM,SAAiB;AAAA,MACxC,WAAW,QAAQ,kBAA6B,2BAAgB,KAAK,GAAG;AACtE,eAAO,eAAe,MAAM;AAAA,MAC9B,WAAW,QAAQ,iBAA4B,2BAAgB,KAAK,GAAG;AACrE,eAAO,cAAc,MAAM;AAAA,MAC7B,WAAW,QAAQ,aAAwB,2BAAgB,KAAK,GAAG;AACjE,eAAO,UAAU,MAAM;AAAA,MACzB,WAAW,QAAQ,0BAAqC,4BAAiB,KAAK,GAAG;AAC/E,eAAO,uBAAuB,MAAM;AAAA,MACtC,WAAW,QAAQ,iBAA4B,4BAAiB,KAAK,GAAG;AACtE,eAAO,cAAc,MAAM;AAAA,MAC7B,WAAW,QAAQ,YAAuB,2BAAgB,KAAK,GAAG;AAChE,eAAO,SAAS,MAAM;AAAA,MACxB,WAAW,QAAQ,eAA0B,2BAAgB,KAAK,GAAG;AACnE,eAAO,YAAY,MAAM;AAAA,MAC3B,WAAW,QAAQ,gCAA2C,4BAAiB,KAAK,GAAG;AACrF,eAAO,6BAA6B,MAAM;AAAA,MAC5C,WAAW,QAAQ,sBAAiC,8BAAmB,KAAK,GAAG;AAC7E,eAAO,mBAAmB,KAAK,4BAA4B,KAAK;AAAA,MAClE;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,4BAA4B,KAA0D;AAC5F,UAAM,MAA8B,CAAC;AACrC,eAAW,QAAQ,IAAI,YAAY;AACjC,UAAI,CAAY,4BAAiB,IAAI,EAAG;AACxC,YAAM,MAAiB,wBAAa,KAAK,GAAG,IAAI,KAAK,IAAI,OAAO;AAChE,UAAI,CAAC,IAAK;AACV,YAAM,QAAQ,KAAK;AACnB,UAAI,QAAQ,oBAA+B,4BAAiB,KAAK,GAAG;AAClE,YAAI,iBAAiB,MAAM;AAAA,MAC7B,WAAW,QAAQ,qBAAgC,2BAAgB,KAAK,GAAG;AACzE,YAAI,kBAAkB,MAAM;AAAA,MAC9B,WAAW,QAAQ,0BAAqC,6BAAkB,KAAK,GAAG;AAChF,YAAI,uBAAuB,MAAM,SAC9B,OAAO,CAAC,OAAkD,2BAAgB,EAAE,CAAC,EAC7E,IAAI,CAAC,OAAO,GAAG,KAAK;AAAA,MACzB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,KAAwD;AAC/E,UAAM,SAAgC,CAAC;AAEvC,eAAW,WAAW,IAAI,UAAU;AAClC,UAAe,8BAAmB,OAAO,GAAG;AAC1C,cAAM,QAAQ,KAAK,iBAAiB,OAAO;AAC3C,YAAI,MAAM,MAAM;AACd,iBAAO,KAAK,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,KAAuD;AAC9E,UAAM,QAA6B;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAEA,eAAW,QAAQ,IAAI,YAAY;AACjC,UAAI,CAAY,4BAAiB,IAAI,EAAG;AAExC,YAAM,MAAiB,wBAAa,KAAK,GAAG,IAAI,KAAK,IAAI,OAAO;AAChE,UAAI,CAAC,IAAK;AAEV,YAAM,QAAQ,KAAK;AAEnB,UAAI,QAAQ,QAAmB,2BAAgB,KAAK,GAAG;AACrD,cAAM,OAAO,MAAM;AAAA,MACrB,WAAW,QAAQ,WAAsB,2BAAgB,KAAK,GAAG;AAC/D,cAAM,QAAQ,MAAM;AAAA,MACtB,WAAW,QAAQ,UAAqB,2BAAgB,KAAK,GAAG;AAC9D,cAAM,OAAQ,MAAM,SAAiB;AAAA,MACvC,WAAW,QAAQ,cAAyB,4BAAiB,KAAK,GAAG;AACnE,cAAM,WAAW,MAAM;AAAA,MACzB,WAAW,QAAQ,iBAA4B,2BAAgB,KAAK,GAAG;AACrE,cAAM,cAAc,MAAM;AAAA,MAC5B,WAAW,QAAQ,kBAA6B,wBAAa,KAAK,GAAG;AACnE,cAAM,eAAe,KAAK,oBAAoB,KAAK;AAAA,MACrD,WAAW,QAAQ,aAAwB,6BAAkB,KAAK,GAAG;AACnE,cAAM,UAAU,KAAK,kBAAkB,KAAK;AAAA,MAC9C;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAAqE;AAC7F,UAAM,UAA8C,CAAC;AAErD,eAAW,WAAW,IAAI,UAAU;AAClC,UAAe,8BAAmB,OAAO,GAAG;AAC1C,YAAI,QAAQ;AACZ,YAAI,QAAQ;AAEZ,mBAAW,QAAQ,QAAQ,YAAY;AACrC,cAAI,CAAY,4BAAiB,IAAI,EAAG;AAExC,gBAAM,MAAiB,wBAAa,KAAK,GAAG,IAAI,KAAK,IAAI,OAAO;AAChE,cAAI,CAAC,IAAK;AAEV,cAAI,QAAQ,WAAsB,2BAAgB,KAAK,KAAK,GAAG;AAC7D,oBAAQ,KAAK,MAAM;AAAA,UACrB,WAAW,QAAQ,WAAsB,2BAAgB,KAAK,KAAK,GAAG;AACpE,oBAAQ,KAAK,MAAM;AAAA,UACrB;AAAA,QACF;AAEA,YAAI,SAAS,OAAO;AAClB,kBAAQ,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,SAA2B,WAA+C;AAC3F,UAAM,MAAwB,QAAQ,IAAI,CAAC,UAAU;AAAA,MACnD,GAAG;AAAA,MACH,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,IACzB,EAAE;AAEF,eAAW,QAAQ,WAAW;AAC5B,YAAM,WACJ,IAAI,KAAK,CAAC,cAAc,UAAU,OAAO,KAAK,EAAE,KAChD,KAAK,yBAAyB,KAAK,IAAI;AACzC,UAAI,CAAC,UAAU;AACb,YAAI,KAAK;AAAA,UACP,GAAG;AAAA,UACH,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,UACvB,cAAc,KAAK,kBAAkB,KAAK,YAAY;AAAA,QACxD,CAAC;AACD;AAAA,MACF;AAEA,iBAAW,SAAS,KAAK,QAAQ;AAC/B,cAAM,gBAAgB,KAAK,oBAAoB,SAAS,QAAQ,KAAK;AACrE,YAAI,eAAe;AACjB,eAAK,mBAAmB,eAAe,KAAK;AAAA,QAC9C,OAAO;AACL,mBAAS,OAAO,KAAK,KAAK;AAAA,QAC5B;AAAA,MACF;AACA,eAAS,eAAe,SAAS,gBAAgB,KAAK,kBAAkB,KAAK,YAAY;AACzF,eAAS,kBAAkB,KAAK,kBAC5B,EAAE,GAAG,KAAK,iBAAiB,GAAI,SAAS,mBAAmB,CAAC,EAAG,IAC/D,SAAS;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBACN,QACA,UACiC;AACjC,WAAO,OAAO,KAAK,CAAC,UAAU;AAC5B,UAAI,MAAM,QAAQ,SAAS,QAAQ,MAAM,SAAS,SAAS,KAAM,QAAO;AACxE,UACE,MAAM,gBACN,SAAS,gBACT,MAAM,iBAAiB,SAAS;AAEhC,eAAO;AACT,UAAI,MAAM,SAAS,MAAM,SAAS,SAAS,MAAM,MAAM,QAAQ,OAAO,SAAS,QAAQ;AACrF,eAAO;AACT,UAAI,MAAM,eAAe,SAAS,eAAe,MAAM,gBAAgB,SAAS;AAC9E,eAAO;AACT,UACE,MAAM,SAAS,sBACf,SAAS,SAAS,sBAClB,MAAM,QAAQ,uBAAuB,SAAS,QAAQ,oBACtD;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB,cAAsD;AAC9E,WAAO,gBAAgB,iBAAiB,cAAc,eAAe;AAAA,EACvE;AAAA,EAEQ,mBAAmB,QAA6B,QAAmC;AACzF,QAAI,KAAK,wBAAwB,OAAO,IAAI,KAAK,CAAC,KAAK,wBAAwB,OAAO,IAAI,GAAG;AAC3F,aAAO,OAAO,OAAO;AAAA,IACvB;AACA,WAAO,QAAQ,OAAO,SAAS,OAAO;AACtC,WAAO,cAAc,OAAO,eAAe,OAAO;AAClD,WAAO,UAAU,OAAO,WAAW,OAAO;AAC1C,WAAO,UAAU,OAAO,WAAW,OAAO;AAC1C,QAAI,OAAO,WAAW,OAAO,SAAS;AACpC,aAAO,UAAU,KAAK,aAAa,OAAO,SAAS,OAAO,OAAO;AAAA,IACnE;AACA,WAAO,kBAAkB,OAAO,mBAAmB,OAAO;AAC1D,WAAO,eAAe,OAAO,gBAAgB,OAAO;AACpD,WAAO,eAAe,OAAO,gBAAgB,OAAO;AACpD,WAAO,WAAW,OAAO,YAAY,OAAO;AAC5C,QAAI,OAAO,SAAS,UAAU,OAAO,SAAS,QAAQ;AACpD,aAAO,OAAO,OAAO;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,yBACN,OACA,UAC4B;AAC5B,QAAI,SAAS,OAAO,WAAW,EAAG,QAAO;AAEzC,QAAI;AACJ,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,SAAS,OAAO;AAAA,QAAO,CAAC,UACtC,KAAK,oBAAoB,KAAK,QAAQ,KAAK;AAAA,MAC7C,EAAE;AACF,UAAI,UAAU,MAAM,CAAC,QAAQ,UAAU,KAAK,UAAU;AACpD,eAAO,EAAE,MAAM,QAAQ;AAAA,MACzB;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAA4B,KAA8B;AAChE,QAAI,gBAAgB;AAEpB,yBAAAA,SAAS,KAAK;AAAA,MACZ,0BAA0B,CAAC,aAAa;AACtC,cAAM,cAAc,SAAS,KAAK;AAElC,YAAe,iCAAsB,WAAW,KAAK,YAAY,IAAI,MAAM;AACzE,0BAAgB,YAAY,GAAG;AAAA,QACjC,WAAsB,qCAA0B,WAAW,GAAG;AAE5D,0BAAgB;AAAA,QAClB;AAAA,MACF;AAAA,MACA,oBAAoB,CAAC,aAAa;AAChC,YACa,wBAAa,SAAS,KAAK,EAAE,MAC5B,qCAA0B,SAAS,KAAK,IAAI,KAC3C,gCAAqB,SAAS,KAAK,IAAI,IACpD;AAEA,gBAAM,SAAS,SAAS;AACxB,cAAe,iCAAsB,MAAM,KAAK,OAAO,YAAY,MAAM;AACvE,4BAAgB,SAAS,KAAK,GAAG;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,KAAgC;AAC/D,UAAM,UAAU,oBAAI,IAAY;AAEhC,yBAAAA,SAAS,KAAK;AAAA,MACZ,gBAAgB,CAAC,aAAa;AAC5B,cAAM,SAAS,SAAS,KAAK;AAG7B,YACa,8BAAmB,MAAM,KACzB,wBAAa,OAAO,MAAM,KACrC,OAAO,OAAO,SAAS,gBACZ,wBAAa,OAAO,QAAQ,KACvC,OAAO,SAAS,SAAS,YACzB;AACA,gBAAM,MAAM,SAAS,KAAK,UAAU,CAAC;AACrC,cAAe,2BAAgB,GAAG,GAAG;AACnC,oBAAQ,IAAI,IAAI,KAAK;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,KAAK,OAAO,EAAE,KAAK;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,KAAwC;AAC3D,UAAM,QAA0B,CAAC;AACjC,UAAM,SAAS,oBAAI,IAAiC;AAEpD,yBAAAA,SAAS,KAAK;AAAA,MACZ,mBAAmB,CAAC,aAAa;AAC/B,cAAM,UAAU,SAAS;AAEzB,YAAe,2BAAgB,QAAQ,IAAI,GAAG;AAC5C,gBAAM,gBAAgB,QAAQ,KAAK;AAInC,gBAAM,OAAO,qBAAqB,eAAe,OAAO;AACxD,cAAI,CAAC,SAAS,UAAU,UAAU,MAAM,EAAE,SAAS,IAAI,GAAG;AACxD,kBAAM,QAAQ,KAAK,6BAA6B,OAAO;AACvD,gBAAI,MAAM,MAAM;AACd,qBAAO,IAAI,MAAM,MAAM,KAAK;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAGD,QAAI,OAAO,OAAO,GAAG;AACnB,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,QAAQ,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,6BAA6B,SAA4D;AAC/F,UAAM,QAA6B;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AACA,UAAM,gBAA2B,2BAAgB,QAAQ,IAAI,IAAI,QAAQ,KAAK,OAAO;AACrF,UAAM,OAAO,gBAAgB,qBAAqB,eAAe,OAAO,IAAI;AAC5E,UAAM,kBAAkB,iBAAiB;AAEzC,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAI,CAAY,0BAAe,IAAI,EAAG;AAEtC,YAAM,WAAsB,2BAAgB,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAC1E,UAAI,CAAC,SAAU;AAEf,UAAI,KAAK,OAAO;AACd,YAAe,2BAAgB,KAAK,KAAK,GAAG;AAC1C,cAAI,aAAa,eAAe;AAC9B,kBAAM,cAAc,KAAK,MAAM;AAAA,UACjC,WAAW,aAAa,cAAc;AACpC,kBAAM,OAAO,KAAK,MAAM;AACxB,kBAAM,UAAU,KAAK,aAAa,MAAM,SAAS;AAAA,cAC/C,IAAI,KAAK,MAAM;AAAA,cACf,YAAY,KAAK,MAAM;AAAA,cACvB,QAAQ;AAAA,YACV,CAAC;AAAA,UACH,WAAW,aAAa,UAAU;AAEhC,gBAAI,CAAC,MAAM,MAAM;AACf,oBAAM,OAAO,KAAK,MAAM,MAAM,QAAQ,yBAAyB,EAAE;AAAA,YACnE;AACA,kBAAM,UAAU,KAAK,aAAa,MAAM,SAAS;AAAA,cAC/C,IAAI,MAAM,QAAQ,KAAK,MAAM;AAAA,cAC7B,QAAQ,KAAK,MAAM;AAAA,cACnB,QAAQ;AAAA,YACV,CAAC;AAAA,UACH,WAAW,aAAa,SAAS;AAC/B,kBAAM,QAAQ,KAAK,MAAM;AAAA,UAC3B,WAAW,aAAa,sBAAsB;AAC5C,gBAAI,CAAC,MAAM,MAAO,OAAM,QAAQ,KAAK,MAAM;AAC3C,kBAAM,UAAU,KAAK,aAAa,MAAM,SAAS;AAAA,cAC/C,GAAI,MAAM,SAAS,KAAK,CAAC,IAAI,EAAE,IAAI,KAAK,gBAAgB,KAAK,MAAM,KAAK,EAAE;AAAA,cAC1E,oBAAoB,KAAK,MAAM;AAAA,cAC/B,QAAQ,MAAM,SAAS,UAAU;AAAA,YACnC,CAAC;AAAA,UACH,WAAW,aAAa,gBAAgB;AACtC,gBAAI,KAAK,MAAM,UAAU,mBAAmB,KAAK,MAAM,UAAU;AAC/D,oBAAM,OAAO;AACf,gBAAI,KAAK,MAAM,UAAU,YAAa,OAAM,OAAO;AACnD,gBAAI,KAAK,MAAM,UAAU,aAAa,KAAK,MAAM,UAAU;AACzD,oBAAM,OAAO;AAAA,UACjB;AAAA,QACF,WAAsB,oCAAyB,KAAK,KAAK,GAAG;AAE1D,cAAI,aAAa,WAAsB,wBAAa,KAAK,MAAM,UAAU,GAAG;AAE1E,gBAAI,CAAC,MAAM,MAAM;AACf,oBAAM,OAAO,KAAK,MAAM,WAAW;AAAA,YACrC;AACA,kBAAM,eAAe,KAAK,MAAM,WAAW;AAAA,UAC7C,WAAW,aAAa,aAAwB,wBAAa,KAAK,MAAM,UAAU,GAAG;AACnF,gBAAI,CAAC,MAAM,KAAM,OAAM,OAAO,KAAK,MAAM,WAAW;AACpD,kBAAM,eAAe,KAAK,MAAM,WAAW;AAAA,UAC7C,WAAW,aAAa,SAAS;AAC/B,kBAAM,eAAe,KAAK,oBAAoB,KAAK,MAAM,UAAU;AAAA,UACrE,WACE,aAAa,cACF,4BAAiB,KAAK,MAAM,UAAU,GACjD;AACA,kBAAM,WAAW,KAAK,MAAM,WAAW;AAAA,UACzC;AAAA,QACF;AAAA,MACF,WAAW,aAAa,YAAY;AAClC,cAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,SAAS,SAAU,OAAM,OAAO;AACpC,QAAI,SAAS,SAAU,OAAM,OAAO;AACpC,QAAI,SAAS,OAAQ,OAAM,OAAO;AAClC,QAAI,CAAC,MAAM,QAAQ,KAAK,wBAAwB,MAAM,IAAI,GAAG;AAC3D,YAAM,QAAQ,MAAM,SAAS,sBAAsB,MAAM,SAAS,MAAM;AACxE,UAAI,MAAO,OAAM,OAAO,KAAK,gBAAgB,KAAK;AAAA,IACpD;AACA,QAAI,CAAC,MAAM,WAAW,MAAM,MAAM;AAChC,YAAM,UAAU,EAAE,IAAI,MAAM,MAAM,OAAO,MAAM,OAAO,QAAQ,WAAW;AAAA,IAC3E,WAAW,MAAM,WAAW,CAAC,MAAM,QAAQ,MAAM,MAAM,MAAM;AAC3D,YAAM,UAAU,KAAK,aAAa,MAAM,SAAS;AAAA,QAC/C,IAAI,MAAM;AAAA,QACV,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM,QAAQ,UAAU;AAAA,MAClC,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,MAAuB;AACrD,WAAO,sDAAsD,KAAK,IAAI;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,KAA6C;AACrE,UAAM,aAAoC,CAAC;AAC3C,UAAM,OAAO,oBAAI,IAAY;AAE7B,yBAAAA,SAAS,KAAK;AAAA,MACZ,mBAAmB,CAAC,aAAa;AAC/B,cAAM,UAAU,SAAS;AAEzB,YAAe,2BAAgB,QAAQ,IAAI,GAAG;AAC5C,gBAAM,gBAAgB,QAAQ,KAAK;AAEnC,cAAI,KAAK,IAAI,aAAa,EAAG;AAC7B,eAAK,IAAI,aAAa;AAEtB,gBAAM,OAAO,KAAK,mBAAmB,aAAa;AAClD,gBAAM,YAAiC;AAAA,YACrC,MAAM;AAAA,YACN;AAAA,UACF;AAGA,qBAAW,QAAQ,QAAQ,YAAY;AACrC,gBAAI,CAAY,0BAAe,IAAI,EAAG;AAEtC,kBAAM,WAAsB,2BAAgB,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAC1E,gBAAI,CAAC,SAAU;AAEf,gBAAI,KAAK,SAAoB,2BAAgB,KAAK,KAAK,GAAG;AACxD,kBAAI,aAAa,UAAU;AACzB,0BAAU,SAAS,KAAK,MAAM;AAAA,cAChC,WAAW,aAAa,sBAAsB;AAC5C,0BAAU,qBAAqB,KAAK,MAAM;AAAA,cAC5C;AAAA,YACF;AAAA,UACF;AAEA,qBAAW,KAAK,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,MAA2C;AACpE,UAAM,OAAO,qBAAqB,IAAI;AACtC,QAAI,SAAS,YAAY,SAAS,YAAY,SAAS,QAAQ;AAC7D,aAAO;AAAA,IACT;AACA,QAAI,SAAS,SAAS;AACpB,aAAO;AAAA,IACT;AACA,QAAI,SAAS,UAAU;AACrB,aAAO;AAAA,IACT;AACA,QAAI,SAAS,QAAQ;AACnB,aAAO;AAAA,IACT;AACA,QAAI,SAAS,SAAS;AACpB,aAAO;AAAA,IACT;AACA,QAAI,SAAS,QAAQ;AACnB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,KACA,oBACoB;AAEpB,UAAM,UAAU,CAAC,GAAI,oBAAoB,WAAW,CAAC,CAAE;AACvD,UAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAClD,UAAM,eAAe,IAAI;AAAA,MACvB,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,eAAe,EAAE,KAAM,GAAG,CAAC,CAAU;AAAA,IACvF;AAGA,yBAAAA,SAAS,KAAK;AAAA,MACZ,mBAAmB,CAAC,aAAa;AAC/B,cAAM,UAAU,SAAS;AAEzB,YAAe,2BAAgB,QAAQ,IAAI,GAAG;AAC5C,gBAAM,gBAAgB,QAAQ,KAAK;AAEnC,cAAI,qBAAqB,eAAe,OAAO,MAAM,UAAU;AAC7D,kBAAM,SAAS,KAAK,wBAAwB,OAAO;AACnD,kBAAM,kBAAkB,OAAO,QAC3B,aAAa,IAAI,KAAK,eAAe,OAAO,KAAK,CAAC,IAClD;AACJ,gBAAI,iBAAiB;AACnB,mBAAK,oBAAoB,iBAAiB,MAAM;AAChD;AAAA,YACF;AACA,gBAAI,OAAO,MAAM,CAAC,UAAU,IAAI,OAAO,EAAE,GAAG;AAC1C,sBAAQ,KAAK,MAAM;AACnB,wBAAU,IAAI,OAAO,EAAE;AACvB,kBAAI,OAAO,MAAO,cAAa,IAAI,KAAK,eAAe,OAAO,KAAK,GAAG,MAAM;AAAA,YAC9E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,0BAA0B,KAAK,OAAO;AAE3C,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,OAAuB;AAC5C,WAAO,MACJ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAY,EACZ,QAAQ,cAAc,EAAE;AAAA,EAC7B;AAAA,EAEQ,oBAAoB,QAA0B,QAAgC;AACpF,WAAO,UAAU,OAAO,WAAW,OAAO;AAC1C,WAAO,eAAe,OAAO,gBAAgB,OAAO;AACpD,WAAO,cAAc,OAAO,eAAe,OAAO;AAClD,WAAO,6BACL,OAAO,8BAA8B,OAAO,8BAA8B;AAC5E,WAAO,uBACL,OAAO,wBAAwB,OAAO,wBAAwB;AAChE,WAAO,cAAc,OAAO,eAAe,OAAO,eAAe;AACjE,WAAO,SAAS,OAAO,UAAU,OAAO;AACxC,WAAO,YAAY,OAAO,aAAa,OAAO;AAC9C,WAAO,mBAAmB,OAAO,oBAAoB,OAAO;AAAA,EAC9D;AAAA,EAEQ,0BAA0B,KAAsB,SAAmC;AACzF,UAAM,aAAa,KAAK,mBAAmB,GAAG;AAC9C,UAAM,iBAAiB,KAAK,6BAA6B,GAAG;AAE5D,eAAW,UAAU,SAAS;AAC5B,UAAI,CAAC,OAAO,WAAW,OAAO,OAAO;AACnC,cAAMC,WAAU,eAAe,IAAI,OAAO,KAAK;AAC/C,YAAIA,SAAS,QAAO,UAAUA;AAAA,MAChC;AAEA,YAAM,UAAU,OAAO,UAAU,WAAW,IAAI,OAAO,OAAO,IAAI;AAClE,UAAI,CAAC,QAAS;AAEd,aAAO,mBAAmB;AAAA,QACxB,GAAI,OAAO,oBAAoB,CAAC;AAAA,QAChC,GAAG,QAAQ;AAAA,MACb;AACA,UAAI,QAAQ,2BAA4B,QAAO,6BAA6B;AAC5E,UAAI,QAAQ,gBAAgB,CAAC,OAAO,aAAc,QAAO,eAAe,QAAQ;AAChF,UAAI,QAAQ,iBAAiB,CAAC,OAAO;AACnC,eAAO,gBAAgB,QAAQ;AACjC,UAAI,QAAQ,iBAAiB,CAAC,OAAO;AACnC,eAAO,gBAAgB,QAAQ;AACjC,UAAI,QAAQ,cAAc,CAAC,OAAO,WAAY,QAAO,aAAa,QAAQ;AAC1E,UACE,QAAQ,eACR,OAAO,gBAAgB,QACvB,OAAO,yBAAyB,QAChC,OAAO,WAAW,iBAClB,OAAO,cAAc,QACrB;AACA,eAAO,cAAc;AACrB,eAAO,SAAS,OAAO,UAAU;AACjC,eAAO,YAAY,OAAO,aAAa;AACvC,eAAO,uBAAuB,OAAO,wBAAwB;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,6BAA6B,KAA2C;AAC9E,UAAM,MAAM,oBAAI,IAAoB;AACpC,yBAAAD,SAAS,KAAK;AAAA,MACZ,mBAAmB,CAAC,aAAa;AAC/B,cAAM,UAAU,SAAS;AACzB,YAAI,CAAY,2BAAgB,QAAQ,IAAI,EAAG;AAC/C,cAAM,gBAAgB,QAAQ,KAAK;AACnC,YAAI,qBAAqB,eAAe,OAAO,MAAM,SAAU;AAG/D,cAAM,YAAY,iBAAiB,OAAO;AAE1C,YAAI;AACJ,YAAI;AACJ,mBAAW,QAAQ,QAAQ,YAAY;AACrC,cAAI,CAAY,0BAAe,IAAI,EAAG;AACtC,gBAAM,WAAsB,2BAAgB,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAC1E,cAAI,CAAC,YAAY,CAAC,KAAK,MAAO;AAC9B,eACG,aAAa,WAAW,aAAa,wBAAwB,aAAa,YAChE,2BAAgB,KAAK,KAAK,GACrC;AACA,oBAAQ,KAAK,MAAM;AAAA,UACrB;AACA,cACE,aAAa,aACF,oCAAyB,KAAK,KAAK,KACnC,wBAAa,KAAK,MAAM,UAAU,GAC7C;AACA,sBAAU,KAAK,MAAM,WAAW;AAAA,UAClC;AAAA,QACF;AACA,YAAI,SAAS,QAAS,KAAI,IAAI,OAAO,OAAO;AAAA,MAC9C;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,KAWzB;AACA,UAAM,WAAW,iBAAiB,GAAG;AAErC,UAAM,MAAM,oBAAI,IAWd;AAEF,eAAW,CAAC,MAAM,EAAE,KAAK,UAAU;AACjC,YAAME,QAAO,wBAAwB,MAAM,IAAI,QAAQ;AACvD,UAAI,IAAI,MAAMA,KAAI;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,uBACN,MACA,IACA,UACA,OAAO,oBAAI,IAAY,GAMvB;AACA,QAAI,KAAK,IAAI,IAAI,GAAG;AAClB,aAAO;AAAA,QACL,kBAAkB,EAAE,iBAAiB,OAAO;AAAA,QAC5C,aAAa;AAAA,QACb,4BAA4B;AAAA,MAC9B;AAAA,IACF;AACA,SAAK,IAAI,IAAI;AAEb,QAAI,WAAW,GAAG,UAAU;AAC5B,QAAI,UAAU;AACd,QAAI,iBAAiB;AACrB,QAAI,6BAA6B;AACjC,QAAI;AACJ,QAAI,cAAc,uDAAuD,KAAK,IAAI;AAElF,UAAM,cAAc,CAAC,SAA0B;AAC7C,UAAe,6BAAkB,IAAI,EAAG,YAAW;AACnD,UACa,4BAAiB,IAAI,KACrB,8BAAmB,KAAK,MAAM,KAC9B,wBAAa,KAAK,OAAO,QAAQ,GAC5C;AACA,cAAM,SAAS,KAAK,OAAO,SAAS;AACpC,YAAI,WAAW,UAAU,WAAW,WAAW,WAAW,UAAW,WAAU;AAC/E,YACa,wBAAa,KAAK,OAAO,MAAM,KAC1C,KAAK,OAAO,OAAO,SAAS,gBAC5B,CAAC,YAAY,QAAQ,SAAS,EAAE,SAAS,MAAM,GAC/C;AACA,gBAAM,WAAW,KAAK,UAAU,CAAC;AACjC,cAAe,2BAAgB,QAAQ,EAAG,gBAAe,SAAS;AAAA,QACpE;AACA,YACa,wBAAa,KAAK,OAAO,MAAM,KAC1C,KAAK,OAAO,OAAO,SAAS,WAC5B,WAAW,SACX;AACA,uCAA6B;AAAA,QAC/B;AAAA,MACF;AACA,UAAe,4BAAiB,IAAI,KAAgB,wBAAa,KAAK,MAAM,GAAG;AAC7E,cAAM,aAAa,KAAK,OAAO;AAC/B,YAAI,YAAY,KAAK,UAAU,EAAG,kBAAiB;AACnD,YAAI,uDAAuD,KAAK,UAAU,GAAG;AAC3E,wBAAc;AAAA,QAChB;AACA,cAAM,SAAS,SAAS,IAAI,UAAU;AACtC,YAAI,QAAQ;AACV,gBAAM,aAAa,KAAK,uBAAuB,YAAY,QAAQ,UAAU,IAAI;AACjF,qBAAW,YAAY,WAAW,iBAAiB,mBAAmB;AACtE,yCAA+B,WAAW;AAC1C,0BAAgB,WAAW;AAC3B,yBAAe,gBAAgB,WAAW;AAAA,QAC5C;AAAA,MACF;AACA,UACa,8BAAmB,IAAI,KACvB,wBAAa,KAAK,QAAQ,KACrC,uDAAuD,KAAK,KAAK,SAAS,IAAI,GAC9E;AACA,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,GAAG,MAAM;AACX,2BAAAF;AAAA,QACE,GAAG;AAAA,QACH;AAAA,UACE,SAAS;AAAA,UACT,OAAO,CAAC,aAAkB,YAAY,SAAS,IAAI;AAAA,QACrD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,kBAA6D,eAC/D,eACA,iBACE,oBACA,YAAY,UACV,UACA;AAER,WAAO;AAAA,MACL,kBAAkB;AAAA,QAChB,gBAAgB,YAAY,WAAW;AAAA,QACvC;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,qBACN,SACA,aACA,UACS;AACT,UAAMG,oBACJ;AAGF,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAI,CAAY,0BAAe,IAAI,EAAG;AACtC,YAAM,WAAsB,2BAAgB,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAC1E,UAAI,aAAa,iBAAiB,aAAa,oBAAoB;AAGjE,YAAI,KAAK,UAAU,KAAM,QAAO;AAChC,YAAe,oCAAyB,KAAK,KAAK,GAAG;AACnD,gBAAM,OAAO,KAAK,MAAM;AACxB,cAAe,4BAAiB,IAAI,EAAG,QAAO,KAAK;AAAA,QACrD;AACA,YAAe,2BAAgB,KAAK,KAAK,GAAG;AAC1C,iBAAO,KAAK,MAAM,UAAU;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,eAAeA,kBAAiB,KAAK,WAAW,EAAG,QAAO;AAC9D,QAAI,YAAYA,kBAAiB,KAAK,QAAQ,EAAG,QAAO;AAExD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,SAAyD;AACvF,UAAM,SAA2B;AAAA,MAC/B,IAAI;AAAA,MACJ,MAAM;AAAA,IACR;AACA,UAAM,gBAA2B,2BAAgB,QAAQ,IAAI,IAAI,QAAQ,KAAK,OAAO;AACrF,WAAO,kBAAkB;AAGzB,UAAM,YAAY,iBAAiB,OAAO,KAAK;AAC/C,QAAI;AAEJ,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAI,CAAY,0BAAe,IAAI,EAAG;AAEtC,YAAM,WAAsB,2BAAgB,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO;AAC1E,UAAI,CAAC,SAAU;AAEf,UAAI,KAAK,OAAO;AACd,YAAe,2BAAgB,KAAK,KAAK,GAAG;AAC1C,cAAI,aAAa,cAAc;AAC7B,mBAAO,KAAK,KAAK,MAAM;AACvB,mBAAO,UAAU,KAAK,aAAa,OAAO,SAAS;AAAA,cACjD,IAAI,KAAK,MAAM;AAAA,cACf,YAAY,KAAK,MAAM;AAAA,cACvB,QAAQ;AAAA,YACV,CAAC;AAAA,UACH,WAAW,aAAa,UAAU;AAChC,mBAAO,KAAK,KAAK,MAAM;AACvB,mBAAO,UAAU,KAAK,aAAa,OAAO,SAAS;AAAA,cACjD,IAAI,KAAK,MAAM;AAAA,cACf,QAAQ,KAAK,MAAM;AAAA,cACnB,QAAQ;AAAA,YACV,CAAC;AAAA,UACH,WACE,aAAa,WACb,aAAa,WACb,aAAa,sBACb;AACA,mBAAO,QAAQ,KAAK,MAAM;AAC1B,gBAAI,aAAa,sBAAsB;AACrC,qBAAO,UAAU,KAAK,aAAa,OAAO,SAAS;AAAA,gBACjD,oBAAoB,KAAK,MAAM;AAAA,gBAC/B,QAAQ;AAAA,cACV,CAAC;AAAA,YACH;AACA,gBAAI,CAAC,OAAO,IAAI;AACd,qBAAO,KAAK,KAAK,gBAAgB,KAAK,MAAM,KAAK;AAAA,YACnD;AAAA,UACF;AAAA,QACF,WAAsB,oCAAyB,KAAK,KAAK,GAAG;AAC1D,cAAI,aAAa,aAAwB,wBAAa,KAAK,MAAM,UAAU,GAAG;AAE5E,0BAAc,KAAK,MAAM,WAAW,KAAK,YAAY;AACrD,mBAAO,UAAU,KAAK,MAAM,WAAW;AACvC,gBAAI,YAAY,SAAS,QAAQ,GAAG;AAClC,qBAAO,OAAO;AAAA,YAChB,WAAW,YAAY,SAAS,UAAU,GAAG;AAC3C,qBAAO,OAAO;AAAA,YAChB;AAAA,UACF,WAAW,aAAa,WAAW;AACjC,kBAAM,SAAS,KAAK,6BAA6B,KAAK,MAAM,UAAU;AACtE,gBAAI,OAAO,SAAS;AAClB,4BAAc,OAAO,QAAQ,YAAY;AACzC,qBAAO,UAAU,OAAO;AACxB,kBAAI,YAAY,SAAS,QAAQ,EAAG,QAAO,OAAO;AAAA,YACpD;AACA,gBAAI,OAAO,cAAc;AACvB,qBAAO,OAAO;AACd,qBAAO,eAAe,OAAO;AAAA,YAC/B;AAAA,UACF,WAAW,aAAa,aAAwB,wBAAa,KAAK,MAAM,UAAU,GAAG;AACnF,mBAAO,mBAAmB;AAAA,cACxB,GAAI,OAAO,oBAAoB,CAAC;AAAA,cAChC,gBAAgB;AAAA,cAChB,sBAAsB,CAAC,KAAK,MAAM,WAAW,IAAI;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAAA,MACF,WAAW,aAAa,eAAe;AACrC,eAAO,cAAc;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,WAAW,OAAO,IAAI;AAChC,aAAO,UAAU;AAAA,QACf,IAAI,OAAO;AAAA,QACX,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO,QAAQ,UAAU;AAAA,MACnC;AAAA,IACF;AAKA,QAAI,KAAK,qBAAqB,SAAS,aAAa,OAAO,EAAE,GAAG;AAC9D,aAAO,cAAc;AAAA,IACvB;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,6BACN,MACoD;AACpD,QAAe,gCAAqB,IAAI,EAAG,QAAO,CAAC;AACnD,UAAM,UAAU,uBAAuB,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,YAAY;AAC7E,UAAM,UAAU,KAAK,wBAAwB,IAAI;AACjD,WAAO;AAAA,MACL,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC7B,GAAI,SAAS,eAAe,EAAE,cAAc,QAAQ,aAAa,IAAI,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEQ,wBAAwB,MAA2C;AACzE,QAAe,wBAAa,IAAI,EAAG,QAAO,KAAK;AAC/C,QAAe,qCAA0B,IAAI,KAAgB,gCAAqB,IAAI,GAAG;AACvF,aAAO,KAAK,wBAAwB,KAAK,IAAI;AAAA,IAC/C;AACA,QAAe,4BAAiB,IAAI,GAAG;AACrC,iBAAW,aAAa,KAAK,MAAM;AACjC,cAAM,UAAU,KAAK,wBAAwB,SAAS;AACtD,YAAI,QAAS,QAAO;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AACA,QAAe,iCAAsB,IAAI,GAAG;AAC1C,aAAO,KAAK,wBAAwB,KAAK,UAAU;AAAA,IACrD;AACA,QAAe,6BAAkB,IAAI,GAAG;AACtC,aAAO,KAAK,WAAW,KAAK,wBAAwB,KAAK,QAAQ,IAAI;AAAA,IACvE;AACA,QAAe,6BAAkB,IAAI,GAAG;AACtC,aAAO,KAAK,wBAAwB,KAAK,QAAQ;AAAA,IACnD;AACA,QAAe,6BAAkB,IAAI,GAAG;AACtC,aAAO,KAAK,wBAAwB,KAAK,QAAQ;AAAA,IACnD;AACA,QAAe,4BAAiB,IAAI,GAAG;AACrC,UAAe,wBAAa,KAAK,MAAM,EAAG,QAAO,KAAK,OAAO;AAC7D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,aACN,SACA,MACmB;AACnB,WAAO,EAAE,GAAI,WAAW,CAAC,GAAI,GAAG,KAAK;AAAA,EACvC;AAAA,EAEQ,oBACN,MACoB;AACpB,QAAe,wBAAa,IAAI,EAAG,QAAO,KAAK;AAC/C,QACa,8BAAmB,IAAI,KACvB,wBAAa,KAAK,MAAM,KACxB,wBAAa,KAAK,QAAQ,GACrC;AACA,aAAO,GAAG,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,IAAI;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,OAAuB;AAC7C,WAAO,MACJ,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAAA,EAC3B;AAAA,EAEQ,mBAAmB,KAA8C;AACvE,UAAM,gBAAgB,KAAK,2BAA2B,GAAG;AACzD,UAAM,cAAsC,CAAC;AAE7C,yBAAAH,SAAS,KAAK;AAAA,MACZ,mBAAmB,CAAC,aAAa;AAC/B,cAAM,UAAU,SAAS;AACzB,YAAI,CAAY,2BAAgB,QAAQ,IAAI,EAAG;AAC/C,cAAM,YAAY,QAAQ,KAAK;AAC/B,YAAI,CAAC,CAAC,YAAY,eAAe,mBAAmB,WAAW,EAAE,SAAS,SAAS,GAAG;AACpF;AAAA,QACF;AAEA,cAAM,aAAa,KAAK,wBAAwB,SAAS,MAAM;AAC/D,cAAM,aAAa,KAAK,wBAAwB,SAAS,YAAY;AACrE,cAAM,WAAW,KAAK,gBAAgB,OAAO;AAC7C,cAAM,WAAW,aAAa,cAAc,IAAI,UAAU,IAAI;AAC9D,cAAM,YAAY,WAAW,KAAK,iBAAiB,QAAQ,IAAI;AAC/D,cAAM,gBAAgB,WAAW,KAAK,kBAAkB,QAAQ,IAAI,CAAC;AACrE,cAAM,WAAW,KAAK,cAAc,YAAY,YAAY,aAAa;AACzE,cAAM,iBAAiB,KAAK,oBAAoB,UAAU,aAAa;AACvE,cAAM,cAAc,KAAK,iBAAiB,KAAK,UAAU;AAEzD,cAAM,KACJ,cAAc,cAAc,GAAG,UAAU,YAAY,CAAC,IAAI,YAAY,SAAS,CAAC;AAClF,oBAAY,KAAK;AAAA,UACf;AAAA,UACA;AAAA,UACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,UAC/B,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,UACnC,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,UAC/B,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,UACnC,GAAI,cAAc,SAAS,IAAI,EAAE,cAAc,IAAI,CAAC;AAAA,UACpD,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,UACjC,GAAI,YAAY,EAAE,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;AAAA,UAC/C,GAAI,eAAe,SAAS,IAAI,EAAE,eAAe,IAAI,CAAC;AAAA,UACtD,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,2BAA2B,KAAwD;AACzF,UAAM,MAAM,oBAAI,IAAiC;AACjD,yBAAAA,SAAS,KAAK;AAAA,MACZ,oBAAoB,CAAC,aAAa;AAChC,YAAI,CAAY,wBAAa,SAAS,KAAK,EAAE,EAAG;AAChD,cAAM,OAAO,SAAS,KAAK;AAC3B,YAAe,qCAA0B,IAAI,KAAgB,gCAAqB,IAAI,GAAG;AACvF,cAAI,IAAI,SAAS,KAAK,GAAG,MAAM,IAAI;AAAA,QACrC;AAAA,MACF;AAAA,MACA,qBAAqB,CAAC,aAAa;AACjC,YAAI,SAAS,KAAK,IAAI,KAAM,KAAI,IAAI,SAAS,KAAK,GAAG,MAAM,SAAS,IAAI;AAAA,MAC1E;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,wBACN,SACA,UACoB;AACpB,UAAM,OAAO,QAAQ,WAAW;AAAA,MAC9B,CAAC,cACY,0BAAe,SAAS,KACxB,2BAAgB,UAAU,IAAI,KACzC,UAAU,KAAK,SAAS;AAAA,IAC5B;AACA,QAAI,CAAY,0BAAe,IAAI,KAAK,CAAC,KAAK,MAAO,QAAO;AAC5D,QACa,oCAAyB,KAAK,KAAK,KACnC,wBAAa,KAAK,MAAM,UAAU,GAC7C;AACA,aAAO,KAAK,MAAM,WAAW;AAAA,IAC/B;AACA,QAAe,2BAAgB,KAAK,KAAK,EAAG,QAAO,KAAK,MAAM;AAC9D,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,SAA2D;AACjF,UAAM,OAAO,QAAQ,WAAW;AAAA,MAC9B,CAAC,cACY,0BAAe,SAAS,KACxB,2BAAgB,UAAU,IAAI,KACzC,UAAU,KAAK,SAAS;AAAA,IAC5B;AACA,QACE,CAAY,0BAAe,IAAI,KAC/B,CAAC,KAAK,SACN,CAAY,oCAAyB,KAAK,KAAK,GAC/C;AACA,aAAO;AAAA,IACT;AACA,UAAM,OAAO,KAAK,MAAM;AACxB,QAAI,CAAY,qCAA0B,IAAI,EAAG,QAAO;AACxD,UAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,QAAI,CAAY,wBAAa,KAAK,EAAG,QAAO;AAC5C,QACa,8BAAmB,KAAK,IAAI,KAC5B,wBAAa,KAAK,KAAK,MAAM,KACxC,KAAK,KAAK,OAAO,SAAS,MAAM,QACrB,wBAAa,KAAK,KAAK,QAAQ,GAC1C;AACA,aAAO,KAAK,KAAK,SAAS;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,IAA0D;AACjF,QAAI;AACJ,yBAAAA;AAAA,MACE,GAAG;AAAA,MACH;AAAA,QACE,SAAS;AAAA,QACT,gBAAgB,CAAC,aAAkB;AACjC,gBAAM,OAAO,SAAS;AACtB,cACE,CAAY,8BAAmB,KAAK,MAAM,KAC1C,CAAY,wBAAa,KAAK,OAAO,MAAM,KAC3C,KAAK,OAAO,OAAO,SAAS,gBAC5B,CAAY,wBAAa,KAAK,OAAO,QAAQ,KAC7C,CAAC,CAAC,YAAY,QAAQ,SAAS,EAAE,SAAS,KAAK,OAAO,SAAS,IAAI,GACnE;AACA;AAAA,UACF;AACA,gBAAM,WAAW,KAAK,UAAU,CAAC;AACjC,cAAI,CAAY,2BAAgB,QAAQ,EAAG;AAC3C,gBAAM,SAAS,KAAK,wBAAwB,KAAK,UAAU,CAAC,CAAC;AAC7D,mBAAS;AAAA,YACP,MAAM;AAAA,YACN,cAAc,SAAS;AAAA,YACvB,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,YACnD,aAAa,wBAAwB,SAAS,KAAK;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,KAAiE;AAC/F,UAAM,SAAiC,CAAC;AACxC,QAAI,CAAC,OAAO,CAAY,8BAAmB,GAAG,EAAG,QAAO;AACxD,eAAW,QAAQ,IAAI,YAAY;AACjC,UAAI,CAAY,4BAAiB,IAAI,EAAG;AACxC,YAAM,MAAiB,wBAAa,KAAK,GAAG,IACxC,KAAK,IAAI,OACE,2BAAgB,KAAK,GAAG,IACjC,KAAK,IAAI,QACT;AACN,UAAI,CAAC,IAAK;AACV,UACa,8BAAmB,KAAK,KAAK,KAC7B,wBAAa,KAAK,MAAM,MAAM,KAC9B,wBAAa,KAAK,MAAM,QAAQ,GAC3C;AACA,eAAO,GAAG,IAAI,GAAG,KAAK,MAAM,OAAO,IAAI,IAAI,KAAK,MAAM,SAAS,IAAI;AAAA,MACrE,WAAsB,wBAAa,KAAK,KAAK,GAAG;AAC9C,eAAO,GAAG,IAAI,KAAK,MAAM;AAAA,MAC3B,WAAsB,2BAAgB,KAAK,KAAK,GAAG;AACjD,eAAO,GAAG,IAAI,KAAK,MAAM;AAAA,MAC3B;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,IAAmC;AAC3D,UAAM,SAAS,oBAAI,IAAY;AAC/B,UAAM,YAAY,oBAAI,IAAY,CAAC,MAAM,CAAC;AAC1C,UAAM,aAAa,GAAG,OAAO,CAAC;AAC9B,QAAe,2BAAgB,UAAU,GAAG;AAC1C,iBAAW,QAAQ,WAAW,YAAY;AACxC,YACa,4BAAiB,IAAI,KACrB,wBAAa,KAAK,GAAG,KAChC,KAAK,IAAI,SAAS,UACP,wBAAa,KAAK,KAAK,GAClC;AACA,oBAAU,IAAI,KAAK,MAAM,IAAI;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,WAAsB,wBAAa,UAAU,GAAG;AAC9C,gBAAU,IAAI,WAAW,IAAI;AAAA,IAC/B;AAEA,yBAAAA;AAAA,MACE,GAAG;AAAA,MACH;AAAA,QACE,SAAS;AAAA,QACT,kBAAkB,CAAC,aAAkB;AACnC,gBAAM,OAAO,SAAS;AACtB,cACa,wBAAa,KAAK,MAAM,KACnC,UAAU,IAAI,KAAK,OAAO,IAAI,KACnB,wBAAa,KAAK,QAAQ,GACrC;AACA,mBAAO,IAAI,KAAK,SAAS,IAAI;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,MAAM,EAAE,KAAK;AAAA,EACjC;AAAA,EAEQ,cACN,YACA,YACA,eACoB;AACpB,UAAM,SAAS,cAAc;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,WAAW,OACd,QAAQ,YAAY,EAAE,EACtB,QAAQ,qCAAqC,EAAE,EAC/C,QAAQ,OAAO,EAAE;AACpB,UAAM,YAAY,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC;AACrE,QAAI,UAAU,SAAS,EAAG,QAAO;AACjC,QAAI,cAAc,SAAS,EAAG,QAAO;AACrC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,oBAAoB,UAA8B,eAAmC;AAC3F,UAAM,MAAM,oBAAI,IAAY;AAC5B,QAAI,SAAU,KAAI,IAAI,QAAQ;AAC9B,eAAW,SAAS,eAAe;AACjC,UAAI,yCAAyC,KAAK,KAAK,EAAG,KAAI,IAAI,KAAK;AAAA,IACzE;AACA,WAAO,MAAM,KAAK,GAAG;AAAA,EACvB;AAAA,EAEQ,iBACN,KACA,YACoB;AACpB,QAAI,CAAC,WAAY,QAAO;AACxB,QAAI;AACJ,yBAAAA,SAAS,KAAK;AAAA,MACZ,gBAAgB,CAAC,aAAa;AAC5B,cAAM,OAAO,SAAS;AACtB,YAAI,CAAY,8BAAmB,KAAK,MAAM,EAAG;AACjD,YACE,CAAY,wBAAa,KAAK,OAAO,QAAQ,KAC7C,KAAK,OAAO,SAAS,SAAS;AAE9B;AACF,YAAI,CAAY,wBAAa,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,OAAO,SAAS;AAC9E;AACF,cAAM,KAAK,KAAK,UAAU,CAAC;AAC3B,YAAI,CAAY,qCAA0B,EAAE,KAAK,CAAY,gCAAqB,EAAE;AAClF;AACF,6BAAAA;AAAA,UACE,GAAG;AAAA,UACH;AAAA,YACE,SAAS;AAAA,YACT,YAAY,CAAC,cAAmB;AAC9B,oBAAM,OAAO,UAAU,KAAK;AAC5B,kBAAI,uBAAuB,KAAK,IAAI,EAAG,gBAAe,gBAAgB;AAAA,YACxE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,MAAsC;AAChE,QAAe,2BAAgB,IAAI,GAAG;AACpC,aAAO,KAAK;AAAA,IACd;AACA,QAAe,4BAAiB,IAAI,GAAG;AACrC,aAAO,KAAK;AAAA,IACd;AACA,QAAe,4BAAiB,IAAI,GAAG;AACrC,aAAO,KAAK;AAAA,IACd;AACA,QAAe,yBAAc,IAAI,GAAG;AAClC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,UAA0B;AAClD,UAAMI,YAAW,aAAAR,QAAK,SAAS,QAAQ;AACvC,WAAOQ,UAAS,QAAQ,kBAAkB,EAAE;AAAA,EAC9C;AACF;;;AQhsDA,IAAAC,aAA+B;AAC/B,IAAAC,eAAiB;AACjB,IAAAC,oBAAiB;AACjB,aAAwB;AACxB,IAAAC,mBAAwC;AACxC,IAAAC,KAAmB;AAkCZ,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAER,YACE,QACA,SACA;AACA,SAAK,SAAS;AACd,SAAK,oBAAoB,SAAS,qBAAqB,CAAC;AACxD,SAAK,oBAAoB,SAAS,qBAAqB,CAAC;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAM,UAAoC;AACxC,UAAM,kBAAkB,MAAM,KAAK,oBAAoB;AACvD,UAAM,mBAAsC,CAAC;AAC7C,UAAM,cAA4B,CAAC;AAGnC,eAAW,YAAY,iBAAiB;AACtC,UAAI;AACF,cAAM,UAAU,MAAM,WAAAC,SAAG,SAAS,UAAU,OAAO;AACnD,cAAM,aAAa,KAAK,gBAAgB,SAAS,QAAQ;AACzD,cAAM,QAAQ,KAAK,gBAAgB,SAAS,QAAQ;AAEpD,yBAAiB,KAAK,GAAG,UAAU;AACnC,oBAAY,KAAK,GAAG,KAAK;AAAA,MAC3B,SAASC,QAAO;AACd,gBAAQ,KAAK,mBAAmB,QAAQ,KAAKA,MAAK;AAAA,MACpD;AAAA,IACF;AAGA,SAAK,yBAAyB,kBAAkB,WAAW;AAG3D,WAAO,KAAK,qBAAqB,gBAAgB;AAAA,EACnD;AAAA;AAAA,EAGA,MAAc,sBAAyC;AACrD,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MAEA,GAAG,KAAK;AAAA,IACV;AAEA,UAAM,kBAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,KAAK,OAAO,WAAW,CAAC;AAAA;AAAA,MAE5B,GAAG,KAAK;AAAA,IACV;AAEA,UAAM,QAAQ,UAAM,kBAAAC,SAAK,UAAU;AAAA,MACjC,KAAK,KAAK,OAAO;AAAA,MACjB,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,MAAM,IAAI,CAACC,UAAS,aAAAC,QAAK,KAAK,KAAK,OAAO,SAASD,KAAI,CAAC;AAAA,EACjE;AAAA;AAAA,EAGQ,gBAAgB,SAAiB,UAAqC;AAC5E,UAAM,aAAgC,CAAC;AAEvC,QAAI;AACF,YAAM,MAAa,aAAM,SAAS;AAAA,QAChC,YAAY;AAAA,QACZ,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,GAAK,KAAK,OAAO,iBAAiB,CAAC;AAAA,QACrC;AAAA,MACF,CAAC;AAED,YAAM,iBAA+C,oBAAI,IAAI;AAC7D,YAAM,qBAAkD,oBAAI,IAAI;AAEhE,2BAAAE,SAAS,KAAK;AAAA;AAAA,QAEZ,gBAAgB,CAAC,aAAa;AAC5B,gBAAM,EAAE,KAAK,IAAI;AACjB,gBAAM,SAAS,KAAK;AAEpB,cAAI,gBAAmD;AAEvD,cAAM,gBAAa,MAAM,KAAK,OAAO,SAAS,8BAA8B;AAC1E,4BAAgB;AAAA,UAClB,WAAa,gBAAa,MAAM,KAAK,OAAO,SAAS,wBAAwB;AAC3E,4BAAgB;AAAA,UAClB,WAAa,gBAAa,MAAM,KAAK,OAAO,SAAS,4BAA4B;AAC/E,4BAAgB;AAAA,UAClB,WAAa,gBAAa,MAAM,KAAK,OAAO,SAAS,sBAAsB;AACzE,4BAAgB;AAAA,UAClB,WAAa,gBAAa,MAAM,KAAK,OAAO,SAAS,yBAAyB;AAC5E,4BAAgB;AAAA,UAClB;AAEA,cAAI,eAAe;AAEjB,kBAAM,SAAS,SAAS;AACxB,gBAAM,wBAAqB,MAAM,KAAO,gBAAa,OAAO,EAAE,GAAG;AAC/D,oBAAM,UAAU,OAAO,GAAG;AAC1B,6BAAe,IAAI,SAAS;AAAA,gBAC1B,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,SAAS,CAAC;AAAA,cACZ,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA;AAAA,QAGA,YAAY,CAAC,aAAa;AACxB,gBAAM,EAAE,KAAK,IAAI;AACjB,gBAAM,iBAAiB,KAAK;AAE5B,cACI,yBAAsB,eAAe,IAAI,KACzC,mBAAgB,eAAe,KAAK,MAAM,GAC5C;AACA,kBAAM,aAAa,eAAe,KAAK,OAAO;AAC9C,kBAAM,eAAiB,mBAAgB,eAAe,KAAK,QAAQ,IAC/D,eAAe,KAAK,SAAS,OAC7B;AAEJ,gBAAI,iBAAiB,aAAa;AAChC,oBAAM,YAAY,eAAe,IAAI,UAAU;AAC/C,kBAAI,WAAW;AAEb,sBAAM,mBAAmB,eAAe,WAAW;AAAA,kBACjD,CAAC,SACG,kBAAe,IAAI,KACnB,mBAAgB,KAAK,IAAI,KAC3B,KAAK,KAAK,SAAS;AAAA,gBACvB;AAEA,oBACI,kBAAe,gBAAgB,KAC/B,mBAAgB,iBAAiB,KAAK,GACxC;AACA,4BAAU,mBAAmB,iBAAiB,MAAM;AAAA,gBACtD;AAGA,sBAAM,UAAU,KAAK,4BAA4B,MAAM,YAAY,UAAU,IAAI;AACjF,mCAAmB,IAAI,YAAY,OAAO;AAAA,cAC5C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAGD,qBAAe,QAAQ,CAAC,cAAc;AACpC,cAAM,UAAU,mBAAmB,IAAI,UAAU,IAAI,KAAK,CAAC;AAC3D,kBAAU,UAAU;AACpB,mBAAW,KAAK,SAAS;AAAA,MAC3B,CAAC;AAAA,IACH,SAASJ,QAAO;AACd,cAAQ,KAAK,iCAAiC,QAAQ,KAAKA,MAAK;AAAA,IAClE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,kBAAkB,MAAc,kBAA0B,QAAyB;AACzF,QAAI,CAAG,gBAAa,IAAI,EAAG,QAAO;AAClC,UAAM,OAAO,KAAK,eAAe;AACjC,WACI,yBAAsB,IAAI,KAC1B,mBAAgB,KAAK,MAAM,KAC7B,KAAK,OAAO,SAAS,oBACnB,mBAAgB,KAAK,QAAQ,KAC/B,KAAK,SAAS,SAAS;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBQ,sBACN,UACA,kBACA,QAAQ,GACQ;AAGhB,QAAI,QAAQ,GAAI,QAAO,CAAC;AAExB,UAAM,QAAwB,CAAC;AAE/B,UAAM,QAAQ,CAAC,SAA0C;AACvD,UAAI,CAAC,KAAM;AAEX,UAAI,KAAK,kBAAkB,MAAM,kBAAkB,QAAQ,GAAG;AAC5D,cAAM,KAAK,IAAoB;AAC/B;AAAA,MACF;AAIA,UAAI,KAAK,kBAAkB,MAAM,kBAAkB,OAAO,GAAG;AAC3D,cAAM,QAAQ;AACd,cAAM,KAAK,GAAG,KAAK,sBAAsB,MAAM,UAAU,kBAAkB,QAAQ,CAAC,CAAC;AACrF;AAAA,MACF;AAIA,UAAM,gBAAa,IAAI,GAAG;AACxB,cAAM,OAAO,KAAK,eAAe;AACjC,cAAM,qBACF,yBAAsB,IAAI,KAC1B,mBAAgB,KAAK,QAAQ,KAC/B,KAAK,SAAS,SAAS;AACzB,YAAI,mBAAoB;AACxB,cAAM,KAAK,GAAG,KAAK,sBAAsB,KAAK,UAAU,kBAAkB,QAAQ,CAAC,CAAC;AACpF;AAAA,MACF;AAEA,UAAM,iBAAc,IAAI,GAAG;AACzB,cAAM,KAAK,GAAG,KAAK,sBAAsB,KAAK,UAAU,kBAAkB,QAAQ,CAAC,CAAC;AACpF;AAAA,MACF;AAEA,UAAM,4BAAyB,IAAI,GAAG;AACpC,cAAM,KAAK,UAAU;AACrB;AAAA,MACF;AAGA,UAAM,2BAAwB,IAAI,GAAG;AACnC,cAAM,KAAK,UAAU;AACrB,cAAM,KAAK,SAAS;AACpB;AAAA,MACF;AAGA,UAAM,uBAAoB,IAAI,GAAG;AAC/B,cAAM,KAAK,IAAI;AACf,cAAM,KAAK,KAAK;AAChB;AAAA,MACF;AAKA,UAAM,oBAAiB,IAAI,GAAG;AAC5B,mBAAW,OAAO,KAAK,WAAW;AAChC,cAAM,6BAA0B,GAAG,KAAO,wBAAqB,GAAG,GAAG;AACnE,gBAAM,oBAAiB,IAAI,IAAI,GAAG;AAChC,yBAAW,QAAQ,IAAI,KAAK,MAAM;AAChC,oBAAM,qBAAkB,IAAI,EAAG,OAAM,KAAK,QAAQ;AAAA,cACpD;AAAA,YACF,OAAO;AACL,oBAAM,IAAI,IAAI;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAM,qBAAkB,IAAI,GAAG;AAC7B,mBAAW,MAAM,KAAK,SAAU,OAAM,EAAE;AACxC;AAAA,MACF;AAGA,UAAM,oBAAiB,IAAI,KAAO,yBAAsB,IAAI,GAAG;AAC7D,cAAM,KAAK,UAAU;AAAA,MACvB;AAAA,IACF;AAEA,eAAW,SAAS,SAAU,OAAM,KAAK;AACzC,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,4BACN,kBACA,kBACA,eACgB;AAChB,UAAM,UAA0B,CAAC;AACjC,QAAI,CAAC,iBAAiB,SAAU,QAAO;AAIvC,UAAM,OAAO,oBAAI,IAAY;AAE7B,eAAW,WAAW,KAAK,sBAAsB,iBAAiB,UAAU,gBAAgB,GAAG;AAC7F,YAAM,aAAa,KAAK,sBAAsB,QAAQ,eAAe,YAAY,MAAM;AACvF,UAAI,CAAC,cAAc,KAAK,IAAI,UAAU,EAAG;AACzC,WAAK,IAAI,UAAU;AACnB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,eAAe;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,sBACN,YACA,UACe;AACf,UAAM,OAAO,WAAW;AAAA,MACtB,CAAC,MAAQ,kBAAe,CAAC,KAAO,mBAAgB,EAAE,IAAI,KAAK,EAAE,KAAK,SAAS;AAAA,IAC7E;AAEA,QAAM,kBAAe,IAAI,KAAO,mBAAgB,KAAK,KAAK,GAAG;AAC3D,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,gBAAgB,SAAiB,UAAgC;AACvE,UAAM,QAAsB,CAAC;AAE7B,QAAI;AACF,YAAM,MAAa,aAAM,SAAS;AAAA,QAChC,YAAY;AAAA,QACZ,SAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA,GAAK,KAAK,OAAO,iBAAiB,CAAC;AAAA,QACrC;AAAA,MACF,CAAC;AAED,2BAAAI,SAAS,KAAK;AAAA,QACZ,wBAAwB,CAAC,aAAa;AACpC,gBAAM,EAAE,KAAK,IAAI;AACjB,gBAAM,WAAW,KAAK,GAAG;AAKzB,gBAAM,YAAY,+CAA+C,KAAK,QAAQ;AAE9E,cAAI,aAAa,KAAK,gBAAgB,SAAS,iBAAiB;AAC9D,kBAAM,eAAe,KAAK;AAAA,cACxB,KAAK;AAAA,cACL;AAAA,YACF;AAEA,kBAAM,UAAU,KAAK,kBAAkB,QAAQ;AAC/C,gBAAI,SAAS;AACX,oBAAM,KAAK;AAAA,gBACT,MAAM;AAAA,gBACN,MAAM,QAAQ;AAAA,gBACd;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,SAASJ,QAAO;AACd,cAAQ,KAAK,4BAA4B,QAAQ,KAAKA,MAAK;AAAA,IAC7D;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,wBACN,aACA,UACgC;AAChC,UAAM,UAAU,oBAAI,IAA+B;AAEnD,eAAW,UAAU,YAAY,SAAS;AACxC,UAAI,OAAO,SAAS,yBAAyB,OAAO,KAAK;AACvD,cAAM,UAAU,OAAO,IAAI,SAAS,eAAe,OAAO,IAAI,OAAO;AAErE,YAAI,WAAW,OAAO,gBAAgB;AACpC,gBAAM,SAAS,KAAK,sBAAsB,OAAO,eAAe,cAAc;AAC9E,kBAAQ,IAAI,SAAS,MAAM;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,sBAAsB,gBAAgE;AAC5F,UAAM,SAA4B,CAAC;AAEnC,QAAI,eAAe,SAAS,wBAAwB,eAAe,SAAS,iBAAiB;AAC3F,aAAO;AAAA,IACT;AAEA,QAAI,eAAe,SAAS,iBAAiB;AAC3C,YAAM,cAAc;AACpB,iBAAW,UAAU,YAAY,SAAS;AACxC,YAAI,OAAO,SAAS,yBAAyB,OAAO,KAAK;AACvD,gBAAM,UAAU,OAAO,IAAI,SAAS,eAAe,OAAO,IAAI,OAAO;AAErE,cAAI,SAAS;AACX,kBAAM,UAAU,OAAO,iBACnB,KAAK,aAAa,OAAO,eAAe,cAAc,IACtD;AACJ,kBAAM,WAAW,CAAC,OAAO;AAEzB,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,MAAM;AAAA,cACN;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,aAAa,MAA2C;AAC9D,QAAI,KAAK,SAAS,kBAAmB,QAAO;AAC5C,QAAI,KAAK,SAAS,kBAAmB,QAAO;AAC5C,QAAI,KAAK,SAAS,mBAAoB,QAAO;AAC7C,QAAI,KAAK,SAAS,qBAAsB,QAAO;AAC/C,QAAI,KAAK,SAAS,gBAAiB,QAAO;AAE1C,QAAI,KAAK,SAAS,eAAe;AAC/B,aAAQ,KAAuB,MAAM,IAAI,CAACF,QAAM,KAAK,aAAaA,GAAC,CAAC,EAAE,KAAK,KAAK;AAAA,IAClF;AAEA,QAAI,KAAK,SAAS,iBAAiB;AACjC,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,SAAS,qBAAsB,KAA2B,UAAU;AAC3E,YAAM,OAAQ,KAA2B;AACzC,aAAO,KAAK,SAAS,eAAe,KAAK,OAAO;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,kBAAkB,UAA+D;AACvF,QAAI,SAAS,KAAK,QAAQ,EAAG,QAAO,EAAE,MAAM,QAAQ;AACpD,QAAI,OAAO,KAAK,QAAQ,EAAG,QAAO,EAAE,MAAM,MAAM;AAChD,QAAI,UAAU,KAAK,QAAQ,EAAG,QAAO,EAAE,MAAM,SAAS;AACtD,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,yBAAyB,YAA+B,OAA2B;AACzF,eAAW,aAAa,YAAY;AAElC,YAAM,eAAe,MAAM,KAAK,CAACA,QAAMA,IAAE,SAAS,UAAU,IAAI;AAEhE,UAAI,cAAc;AAChB,mBAAW,UAAU,UAAU,SAAS;AACtC,gBAAM,eAAe,aAAa,aAAa,IAAI,OAAO,IAAI;AAC9D,cAAI,cAAc;AAChB,mBAAO,SAAS;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,qBAAqB,kBAAsD;AACjF,UAAM,UAA0C,CAAC;AACjD,UAAM,aAAoC,CAAC;AAC3C,QAAI,gBAAgB;AAGpB,eAAW,aAAa,kBAAkB;AACxC,YAAM,cAAc,UAAU,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAQvD,UAAI,YAAY,WAAW,GAAG;AAC5B,gBAAQ;AAAA,UACN,6BAA6B,UAAU,IAAI,MAAM,UAAU,IAAI;AAAA,QAIjE;AAAA,MACF;AAEA,iBAAW,KAAK;AAAA,QACd,MAAM,UAAU;AAAA,QAChB,MAAM,UAAU;AAAA,QAChB,SAAS;AAAA,QACT,iBAAiB,UAAU;AAAA,MAC7B,CAAC;AAID,UACE,CAAC,iBACD,UAAU,qBACT,UAAU,KAAK,SAAS,MAAM,KAAK,YAAY,KAAK,CAAC,MAAM,MAAM,UAAU,MAAM,MAAM,IACxF;AACA,wBAAgB,UAAU;AAAA,MAC5B;AAAA,IACF;AAGA,eAAW,aAAa,kBAAkB;AACxC,iBAAW,UAAU,UAAU,SAAS;AACtC,cAAM,YAAY,OAAO;AAGzB,cAAM,cAAwB,CAAC;AAC/B,cAAM,gBAA0B,CAAC;AAGjC,mBAAW,eAAe,UAAU,SAAS;AAC3C,cAAI,YAAY,SAAS,OAAO,MAAM;AACpC,gBAAI,UAAU,SAAS,OAAO;AAE5B,0BAAY,KAAK,YAAY,IAAI;AACjC,4BAAc,KAAK,YAAY,IAAI;AAAA,YACrC,OAAO;AAEL,0BAAY,KAAK,YAAY,IAAI;AAAA,YACnC;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,SAAS,IAAI;AAAA,UACnB,YAAY,OAAO;AAAA,UACnB,eAAe,UAAU;AAAA,UACzB,iBAAiB,UAAU;AAAA,UAC3B;AAAA,UACA;AAAA,UACA,QAAQ,OAAO;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,iBAAiB,iBAAiB,SAAS,GAAG;AACjD,YAAM,iBAAiB,iBAAiB,CAAC;AACzC,YAAM,gBAAgB,iBAAiB;AAAA,QACrC,CAAC,MAAM,EAAE,KAAK,SAAS,MAAM,KAAM,kBAAkB,EAAE,SAAS,eAAe;AAAA,MACjF;AACA,UAAI,iBAAiB,cAAc,WAAW,cAAc,QAAQ,SAAS,GAAG;AAC9E,cAAM,cAAc,cAAc,QAAQ,CAAC;AAC3C,wBAAgB,aAAa,QAAQ;AAAA,MACvC;AAAA,IACF;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC1nBA,IAAAO,aAA6B;AAC7B,IAAAC,UAAwB;AACxB,IAAAC,mBAAqB;AACrB,IAAAC,KAAmB;AAMZ,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EAER,YAAY,QAAwB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,YAAY,UAAkD;AAClE,QAAI;AACF,YAAM,WAAO,yBAAa,UAAU,OAAO;AAC3C,YAAM,MAAa,cAAM,MAAM;AAAA,QAC7B,YAAY;AAAA,QACZ,SAAS,CAAC,OAAO,cAAc,CAAC,cAAc,EAAE,wBAAwB,KAAK,CAAC,CAAC;AAAA,MACjF,CAAC;AAED,YAAM,aAAoC,CAAC;AAE3C,2BAAAC,SAAS,KAAK;AAAA,QACZ,YAAY,CAACC,WAAS;AACpB,gBAAM,YAAY,KAAK,+BAA+BA,OAAK,IAAI;AAC/D,cAAI,WAAW;AACb,uBAAW,KAAK,SAAS;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT,SAASC,QAAO;AACd,cAAQ,MAAM,0BAA0B,QAAQ,KAAKA,MAAK;AAC1D,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,+BACN,SAC4B;AAC5B,UAAM,cAAc,KAAK,eAAe,QAAQ,cAAc;AAC9D,QAAI,CAAC,YAAa,QAAO;AAEzB,UAAM,OAAO,KAAK,uBAAuB,WAAW;AACpD,UAAM,QAAQ,KAAK,aAAa,QAAQ,cAAc;AACtD,UAAM,EAAE,QAAQ,mBAAmB,IAAI,KAAK,0BAA0B,QAAQ,cAAc;AAC5F,UAAM,WAAW,KAAK,gBAAgB,QAAQ,QAAQ;AAEtD,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,OAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AAAA,MAC/C,UAAU,SAAS,SAAS,IAAI,WAAW;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,gBAAoD;AACzE,QAAM,mBAAgB,eAAe,IAAI,GAAG;AAC1C,aAAO,eAAe,KAAK;AAAA,IAC7B;AACA,QAAM,yBAAsB,eAAe,IAAI,GAAG;AAChD,YAAM,QAAkB,CAAC;AACzB,UAAI,UACF,eAAe;AACjB,aAAS,yBAAsB,OAAO,GAAG;AACvC,YAAM,mBAAgB,QAAQ,QAAQ,GAAG;AACvC,gBAAM,QAAQ,QAAQ,SAAS,IAAI;AAAA,QACrC;AACA,kBAAU,QAAQ;AAAA,MACpB;AACA,UAAM,mBAAgB,OAAO,GAAG;AAC9B,cAAM,QAAQ,QAAQ,IAAI;AAAA,MAC5B;AACA,aAAO,MAAM,KAAK,GAAG;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,uBACN,MAC2D;AAC3D,UAAM,iBAAiB,CAAC,QAAQ,cAAc,gBAAgB,sBAAsB;AACpF,UAAM,kBAAkB,CAAC,aAAa,OAAO;AAC7C,UAAM,mBAAmB,CAAC,oBAAoB,aAAa,QAAQ;AACnE,UAAM,iBAAiB,CAAC,YAAY,aAAa;AACjD,UAAM,kBAAkB,CAAC,SAAS,aAAa;AAE/C,QAAI,eAAe,SAAS,IAAI,EAAG,QAAO;AAC1C,QAAI,gBAAgB,SAAS,IAAI,EAAG,QAAO;AAC3C,QAAI,iBAAiB,SAAS,IAAI,EAAG,QAAO;AAC5C,QAAI,eAAe,SAAS,IAAI,EAAG,QAAO;AAC1C,QAAI,gBAAgB,SAAS,IAAI,EAAG,QAAO;AAE3C,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,gBAA6D;AAChF,UAAM,QAAgC,CAAC;AAEvC,eAAW,QAAQ,eAAe,YAAY;AAC5C,UAAM,kBAAe,IAAI,KAAO,mBAAgB,KAAK,IAAI,GAAG;AAC1D,cAAM,WAAW,KAAK,KAAK;AAE3B,YAAI,KAAK,UAAU,MAAM;AAEvB,gBAAM,QAAQ,IAAI;AAAA,QACpB,WAAa,mBAAgB,KAAK,KAAK,GAAG;AACxC,gBAAM,QAAQ,IAAI,KAAK,MAAM;AAAA,QAC/B,WAAa,4BAAyB,KAAK,KAAK,KAAO,mBAAgB,KAAK,MAAM,UAAU,GAAG;AAC7F,gBAAM,QAAQ,IAAI,KAAK,MAAM,WAAW;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,gBAGhC;AACA,UAAM,SAA2D,CAAC;AAElE,eAAW,QAAQ,eAAe,YAAY;AAC5C,UAAM,kBAAe,IAAI,KAAO,mBAAgB,KAAK,IAAI,GAAG;AAC1D,cAAM,WAAW,KAAK,KAAK;AAE3B,aAAK,aAAa,YAAY,aAAa,yBAAyB,KAAK,OAAO;AAC9E,cAAM,mBAAgB,KAAK,KAAK,GAAG;AACjC,mBAAO,QAA+B,IAAI,KAAK,MAAM;AAAA,UACvD,WAAa,4BAAyB,KAAK,KAAK,KAAO,mBAAgB,KAAK,MAAM,UAAU,GAAG;AAC7F,mBAAO,QAA+B,IAAI,KAAK,MAAM,WAAW;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,gBACN,UACA,QAAgB,GAChB,WAAmB,GACI;AACvB,QAAI,SAAS,SAAU,QAAO,CAAC;AAE/B,UAAM,YAAmC,CAAC;AAE1C,eAAW,SAAS,UAAU;AAC5B,UAAM,gBAAa,KAAK,GAAG;AACzB,cAAM,YAAY,KAAK,+BAA+B,KAAK;AAC3D,YAAI,WAAW;AACb,oBAAU,KAAK,SAAS;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACxKA,IAAAC,aAA6B;AAC7B,IAAAC,UAAwB;AACxB,IAAAC,mBAAqB;AACrB,IAAAC,KAAmB;AACnB,IAAAC,QAAsB;AAMf,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA,iBAAiE,oBAAI,IAAI;AAAA,EACzE,gBAOH,CAAC;AAAA,EACE,gBAA6D,CAAC;AAAA,EAEtE,YAAY,QAAwB;AAClC,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA,EAGA,MAAM,YAAY,UAA6C;AAC7D,QAAI;AACF,YAAM,WAAO,yBAAa,UAAU,OAAO;AAC3C,YAAM,MAAa,cAAM,MAAM;AAAA,QAC7B,YAAY;AAAA,QACZ,SAAS,CAAC,OAAO,cAAc,CAAC,cAAc,EAAE,wBAAwB,KAAK,CAAC,CAAC;AAAA,MACjF,CAAC;AAED,WAAK,eAAe,MAAM;AAC1B,WAAK,gBAAgB,CAAC;AACtB,WAAK,gBAAgB,CAAC;AAGtB,2BAAAC,SAAS,KAAK;AAAA,QACZ,gBAAgB,CAACD,WAAS;AACxB,eAAK,sBAAsBA,OAAK,IAAI;AAAA,QACtC;AAAA,MACF,CAAC;AAGD,2BAAAC,SAAS,KAAK;AAAA,QACZ,YAAY,CAACD,WAAS;AACpB,eAAK,oBAAoBA,OAAK,IAAI;AAAA,QACpC;AAAA,MACF,CAAC;AAGD,YAAM,kBAAkB,KAAK,uBAAuB,GAAG;AAGvD,aAAO,KAAK,WAAW,UAAU,eAAe;AAAA,IAClD,SAASE,QAAO;AACd,cAAQ,MAAM,mCAAmC,QAAQ,KAAKA,MAAK;AACnE,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,sBAAsB,MAA8B;AAC1D,QACI,gBAAa,KAAK,MAAM,KAC1B,KAAK,OAAO,SAAS,cACrB,KAAK,UAAU,SAAS,GACxB;AAGA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,SAA6B;AACvD,UAAM,cAAc,KAAK,eAAe,QAAQ,cAAc;AAE9D,QAAI,CAAC,YAAa;AAGlB,QAAI,gBAAgB,eAAe,gBAAgB,SAAS;AAC1D,YAAM,YAAY,KAAK,iBAAiB,QAAQ,cAAc;AAC9D,WAAK,cAAc,KAAK,SAAS;AAAA,IACnC;AAGA,QAAI,CAAC,oBAAoB,aAAa,QAAQ,EAAE,SAAS,WAAW,GAAG;AACrE,YAAM,aAAa,KAAK,kBAAkB,QAAQ,cAAc;AAChE,UAAI,YAAY;AACd,aAAK,cAAc,KAAK,UAAU;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBACN,gBAQA;AACA,UAAMC,QAOF,EAAE,SAAS,GAAG;AAElB,eAAW,QAAQ,eAAe,YAAY;AAC5C,UAAM,kBAAe,IAAI,KAAO,mBAAgB,KAAK,IAAI,GAAG;AAC1D,cAAM,WAAW,KAAK,KAAK;AAC3B,cAAM,YAAY,KAAK,sBAAsB,KAAK,KAAK;AAEvD,gBAAQ,UAAU;AAAA,UAChB,KAAK;AACH,YAAAA,MAAK,QAAQ;AACb;AAAA,UACF,KAAK;AACH,YAAAA,MAAK,cAAc;AACnB;AAAA,UACF,KAAK;AACH,YAAAA,MAAK,eAAe;AACpB;AAAA,UACF,KAAK;AACH,YAAAA,MAAK,SAAS;AACd;AAAA,UACF,KAAK;AACH,YAAAA,MAAK,aAAa;AAClB,gBAAI,UAAW,CAAAA,MAAK,UAAU;AAC9B;AAAA,UACF,KAAK;AAEH,gBAAI,KAAK,SAAW,4BAAyB,KAAK,KAAK,KAAO,gBAAa,KAAK,MAAM,UAAU,GAAG;AACjG,cAAAA,MAAK,UAAU,KAAK,MAAM,WAAW;AAAA,YACvC;AACA;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAEA,WAAOA;AAAA,EACT;AAAA,EAEQ,kBACN,gBAC6C;AAC7C,UAAMA,QAA6C,CAAC;AAEpD,eAAW,QAAQ,eAAe,YAAY;AAC5C,UAAM,kBAAe,IAAI,KAAO,mBAAgB,KAAK,IAAI,GAAG;AAC1D,cAAM,WAAW,KAAK,KAAK;AAE3B,YAAI,aAAa,WAAW,aAAa,SAAS;AAChD,UAAAA,MAAK,QAAQ,KAAK,sBAAsB,KAAK,KAAK;AAAA,QACpD;AAEA,YAAI,aAAa,WAAW;AAC1B,cAAI,KAAK,SAAW,4BAAyB,KAAK,KAAK,GAAG;AACxD,gBAAM,gBAAa,KAAK,MAAM,UAAU,GAAG;AACzC,cAAAA,MAAK,UAAU,KAAK,MAAM,WAAW;AAAA,YACvC,WAAa,6BAA0B,KAAK,MAAM,UAAU,KAAO,wBAAqB,KAAK,MAAM,UAAU,GAAG;AAC9G,cAAAA,MAAK,UAAU;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,OAAO,KAAKA,KAAI,EAAE,SAAS,IAAIA,QAAO;AAAA,EAC/C;AAAA,EAEQ,sBAAsB,OAAoD;AAChF,QAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,mBAAgB,KAAK,EAAG,QAAO,MAAM;AAC3C,QAAM,4BAAyB,KAAK,KAAO,mBAAgB,MAAM,UAAU,GAAG;AAC5E,aAAO,MAAM,WAAW;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,gBAAoD;AACzE,QAAM,mBAAgB,eAAe,IAAI,GAAG;AAC1C,aAAO,eAAe,KAAK;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,KAAqC;AAClE,UAAM,QAAgC,CAAC;AAEvC,yBAAAF,SAAS,KAAK;AAAA,MACZ,aAAa,CAACD,WAAS;AACrB,cAAM,OAAOA,OAAK,KAAK;AACvB,cAAM,OAAO,KAAK,yBAAyB,IAAI;AAC/C,YAAI,MAAM;AACR,gBAAM,EAAE,OAAO,YAAY,IAAI;AAC/B,cAAI,SAAS,aAAa;AACxB,kBAAM,KAAK,IAAI;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,yBACN,MAC+C;AAC/C,QAAI,YAAY;AAChB,QAAI,cAAc;AAGlB,QAAM,qBAAkB,IAAI,KAAK,KAAK,aAAa,KAAK;AACtD,UAAM,oBAAiB,KAAK,QAAQ,GAAG;AACrC,cAAM,WAAW,KAAK;AACtB,YAAM,sBAAmB,SAAS,MAAM,GAAG;AACzC,gBAAM,aAAa,SAAS;AAC5B,cAAM,gBAAa,WAAW,MAAM,GAAG;AACrC,wBAAY,WAAW,OAAO;AAC9B,0BAAc,GAAG,SAAS;AAAA,UAC5B;AAAA,QACF;AAAA,MACF,WAAa,gBAAa,KAAK,QAAQ,GAAG;AACxC,oBAAY,KAAK,SAAS;AAC1B,sBAAc,GAAG,SAAS;AAAA,MAC5B;AAAA,IACF;AAGA,QAAM,sBAAmB,IAAI,MAAM,KAAK,aAAa,OAAO,KAAK,aAAa,OAAO;AACnF,UAAM,sBAAmB,KAAK,IAAI,GAAG;AACnC,cAAM,aAAa,KAAK;AACxB,YAAM,gBAAa,WAAW,MAAM,GAAG;AACrC,sBAAY,WAAW,OAAO;AAC9B,cAAM,oBAAiB,KAAK,KAAK,GAAG;AAClC,0BAAc,GAAG,SAAS,qBAAqB,KAAK,MAAM,KAAK;AAAA,UACjE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAM,qBAAkB,IAAI,KAAK,KAAK,aAAa,KAAK;AACtD,UAAM,oBAAiB,KAAK,QAAQ,KAAO,sBAAmB,KAAK,SAAS,MAAM,GAAG;AACnF,cAAM,aAAe,gBAAa,KAAK,SAAS,OAAO,QAAQ,IAC3D,KAAK,SAAS,OAAO,SAAS,OAC9B;AACJ,YAAI,eAAe,cAAgB,gBAAa,KAAK,SAAS,OAAO,MAAM,GAAG;AAC5E,sBAAY,KAAK,SAAS,OAAO,OAAO;AACxC,wBAAc,GAAG,SAAS;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,WAAO,aAAa,cAAc,EAAE,OAAO,WAAW,YAAY,IAAI;AAAA,EACxE;AAAA,EAEQ,WAAW,UAAkB,iBAA2D;AAC9F,QAAI,KAAK,cAAc,WAAW,EAAG,QAAO,CAAC;AAE7C,UAAM,WAAgB,eAAS,UAAe,cAAQ,QAAQ,CAAC;AAC/D,UAAM,SAAS,GAAG,QAAQ,OAAO,QAAQ,WAAW,EAAE,EAAE,YAAY;AAEpE,UAAM,SAAgC,KAAK,cAAc,IAAI,CAAC,UAAU;AACtE,YAAM,YAAY,KAAK,eAAe,KAAK;AAC3C,YAAM,WAAW,KAAK,gBAAgB,MAAM,SAAS,eAAe;AAEpE,aAAO;AAAA,QACL,MAAM,MAAM,cAAc,MAAM,WAAW,MAAM,UAAU;AAAA,QAC3D,OAAO,MAAM;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,aAAa,MAAM;AAAA,MACrB;AAAA,IACF,CAAC;AAED,UAAM,aAAa,KAAK,cAAc,KAAK,cAAc,SAAS,CAAC;AACnE,UAAM,eAAe,YAAY;AAEjC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA,iBAAiB,OAAO,KAAK,eAAe,EAAE,SAAS,IAAI,kBAAkB;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,OAOS;AAC9B,UAAM,eAAe,MAAM,QAAQ,YAAY;AAC/C,UAAM,aAAa,MAAM,OAAO,YAAY,KAAK;AACjD,UAAM,mBAAmB,MAAM,aAAa,YAAY,KAAK;AAC7D,UAAM,WAAW,GAAG,YAAY,IAAI,UAAU,IAAI,gBAAgB;AAGlE,QAAI,MAAM,iBAAiB,mBAAmB,MAAM,iBAAiB,SAAS;AAC5E,aAAO;AAAA,IACT;AACA,QAAI,MAAM,iBAAiB,eAAe,MAAM,iBAAiB,WAAW;AAC1E,aAAO,MAAM,iBAAiB,YAAY,WAAW;AAAA,IACvD;AAGA,QAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,QAAI,SAAS,SAAS,OAAO,KAAK,SAAS,SAAS,KAAK,EAAG,QAAO;AACnE,QAAI,SAAS,SAAS,UAAU,EAAG,QAAO;AAC1C,QAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,SAAS,EAAG,QAAO;AACxE,QAAI,SAAS,SAAS,MAAM,EAAG,QAAO;AACtC,QAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,OAAO,EAAG,QAAO;AACtE,QAAI,SAAS,SAAS,QAAQ,KAAK,SAAS,SAAS,QAAQ,EAAG,QAAO;AAEvE,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,WAAmB,OAAwC;AACjF,UAAM,OAAO,MAAM,SAAS;AAC5B,WAAO,SAAS,UAAa,KAAK,SAAS,UAAU;AAAA,EACvD;AACF;;;AX9TO,IAAM,8BAAN,MAA8D;AAAA,EAC1D,WAAW;AAAA,EAEpB,MAAM,QACJ,QACA,SACiC;AACjC,UAAM,iBAAiB,IAAI,eAAe,QAAQ;AAAA,MAChD,eAAe,QAAQ,iBAAiB;AAAA,MACxC,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AACD,UAAM,qBAAqB,IAAI,mBAAmB,QAAQ;AAAA,MACxD,mBAAmB,QAAQ;AAAA,MAC3B,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AACD,UAAM,oBAAoB,IAAI,kBAAkB,MAAM;AACtD,UAAM,eAAe,IAAI,aAAa,MAAM;AAE5C,YAAQ,IAAI,oDAAoD;AAChE,UAAM,CAAC,SAAS,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC9C,eAAe,QAAQ;AAAA,MACvB,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AAED,YAAQ;AAAA,MACN,gFAAgF,QAAQ,MAAM;AAAA,IAChG;AAGA,UAAM,cAAc,UAAM,kBAAAI,SAAK,OAAO,WAAW,CAAC,YAAY,SAAS,GAAG;AAAA,MACxE,KAAK,OAAO;AAAA,MACZ,QAAQ,OAAO,WAAW,CAAC,oBAAoB;AAAA,IACjD,CAAC;AAED,YAAQ;AAAA,MACN,qEAAqE,YAAY,MAAM;AAAA,IACzF;AAGA,UAAM,qBAAqB,YAAY,IAAI,OAAOC,UAAiB;AACjE,YAAM,WAAW,iBAAAC,QAAK,QAAQ,OAAO,SAASD,KAAI;AAClD,UAAI;AACF,cAAM,CAAC,YAAY,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC5C,kBAAkB,YAAY,QAAQ;AAAA,UACtC,aAAa,YAAY,QAAQ;AAAA,QACnC,CAAC;AACD,eAAO,EAAE,UAAU,YAAY,MAAM;AAAA,MACvC,SAASE,QAAO;AACd,gBAAQ,KAAK,mDAAmDF,KAAI,KAAKE,MAAK;AAC9E,eAAO,EAAE,UAAU,YAAY,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,MAC/C;AAAA,IACF,CAAC;AAED,UAAM,oBAAoB,MAAM,QAAQ,IAAI,kBAAkB;AAG9D,UAAM,gBAAgB,oBAAI,IAAiD;AAC3E,eAAW,UAAU,mBAAmB;AACtC,oBAAc,IAAI,OAAO,UAAU;AAAA,QACjC,YAAY,OAAO;AAAA,QACnB,OAAO,OAAO;AAAA,MAChB,CAAC;AAAA,IACH;AAGA,UAAM,kBAAkB,QAAQ,IAAI,CAAC,WAAW;AAC9C,YAAM,aAAa,cAAc,IAAI,OAAO,QAAQ;AACpD,UAAI,YAAY;AAEd,cAAM,yBAAyB,IAAI,IAAI,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC3E,cAAM,gBAAgB,WAAW,WAAW;AAAA,UAC1C,CAAC,MAAW,CAAC,uBAAuB,IAAI,EAAE,IAAI;AAAA,QAChD;AAIA,cAAM,cAAgC,OAAO,MAAM,IAAI,CAAC,UAAU;AAAA,UAChE,GAAG;AAAA,UACH,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,QACzB,EAAE;AACF,mBAAW,WAAW,WAAW,OAAO;AACtC,gBAAM,eACJ,YAAY,KAAK,CAAC,SAAS,KAAK,OAAO,QAAQ,EAAE,KACjD,KAAK,yBAAyB,aAAa,OAAO;AACpD,cAAI,cAAc;AAChB,iBAAK,UAAU,cAAc,OAAO;AAAA,UACtC,OAAO;AACL,wBAAY,KAAK;AAAA,cACf,GAAG;AAAA,cACH,QAAQ,CAAC,GAAG,QAAQ,MAAM;AAAA,cAC1B,cAAc,KAAK,kBAAkB,QAAQ,YAAY;AAAA,YAC3D,CAAC;AAAA,UACH;AAAA,QACF;AAEA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,YAAY,CAAC,GAAG,OAAO,YAAY,GAAG,aAAa;AAAA,UACnD,OAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAED,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,eAAe,YAAY;AAAA,MAC3B,GAAI,eAAe,qBAAqB,IACpC,EAAE,oBAAoB,eAAe,mBAAmB,IACxD,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,UAAU,QAAwB,QAA8B;AACtE,eAAW,SAAS,OAAO,QAAQ;AACjC,YAAM,gBAAgB,KAAK,oBAAoB,OAAO,QAAQ,KAAK;AACnE,UAAI,eAAe;AACjB,aAAK,WAAW,eAAe,KAAK;AAAA,MACtC,OAAO;AACL,eAAO,OAAO,KAAK,KAAK;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,eAAe,OAAO,gBAAgB,KAAK,kBAAkB,OAAO,YAAY;AACvF,WAAO,kBAAkB,OAAO,kBAC5B,EAAE,GAAG,OAAO,iBAAiB,GAAI,OAAO,mBAAmB,CAAC,EAAG,IAC/D,OAAO;AAAA,EACb;AAAA,EAEQ,oBACN,QACA,UACiC;AACjC,WAAO,OAAO,KAAK,CAAC,UAAU;AAC5B,UAAI,MAAM,QAAQ,SAAS,QAAQ,MAAM,SAAS,SAAS,KAAM,QAAO;AACxE,UAAI,MAAM,gBAAgB,SAAS,gBAAgB,MAAM,iBAAiB,SAAS,aAAc,QAAO;AACxG,UAAI,MAAM,SAAS,MAAM,SAAS,SAAS,MAAM,MAAM,QAAQ,OAAO,SAAS,QAAQ,GAAI,QAAO;AAClG,UAAI,MAAM,eAAe,SAAS,eAAe,MAAM,gBAAgB,SAAS,YAAa,QAAO;AACpG,UACE,MAAM,SAAS,sBACf,SAAS,SAAS,sBAClB,MAAM,QAAQ,uBAAuB,SAAS,QAAQ,oBACtD;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEQ,WAAW,QAA6B,QAAmC;AACjF,QAAI,KAAK,wBAAwB,OAAO,IAAI,KAAK,CAAC,KAAK,wBAAwB,OAAO,IAAI,GAAG;AAC3F,aAAO,OAAO,OAAO;AAAA,IACvB;AACA,WAAO,QAAQ,OAAO,SAAS,OAAO;AACtC,WAAO,cAAc,OAAO,eAAe,OAAO;AAClD,WAAO,UAAU,OAAO,WAAW,OAAO;AAC1C,WAAO,UAAU,OAAO,WAAW,OAAO;AAC1C,WAAO,kBAAkB,OAAO,mBAAmB,OAAO;AAC1D,WAAO,eAAe,OAAO,gBAAgB,OAAO;AACpD,WAAO,eAAe,OAAO,gBAAgB,OAAO;AACpD,WAAO,WAAW,OAAO,YAAY,OAAO;AAC5C,QAAI,OAAO,SAAS,UAAU,OAAO,SAAS,QAAQ;AACpD,aAAO,OAAO,OAAO;AAAA,IACvB;AAAA,EACF;AAAA,EAEQ,kBAAkB,cAAsD;AAC9E,WAAO,gBAAgB,iBAAiB,cAAc,eAAe;AAAA,EACvE;AAAA,EAEQ,wBAAwB,MAAuB;AACrD,WAAO,sDAAsD,KAAK,IAAI;AAAA,EACxE;AAAA,EAEQ,yBACN,OACA,UAC4B;AAC5B,QAAI,SAAS,OAAO,WAAW,EAAG,QAAO;AAEzC,QAAI;AACJ,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,SAAS,OAAO,OAAO,CAAC,UAAU,KAAK,oBAAoB,KAAK,QAAQ,KAAK,CAAC,EAAE;AAChG,UAAI,UAAU,MAAM,CAAC,QAAQ,UAAU,KAAK,UAAU;AACpD,eAAO,EAAE,MAAM,QAAQ;AAAA,MACzB;AAAA,IACF;AAEA,WAAO,MAAM;AAAA,EACf;AACF;;;AY/LO,IAAM,0BAAN,MAA0D;AAAA,EAC/D,YAAqB,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAErB,MAAM,QACJ,SACA,UACiC;AACjC,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,YAAY,EAAE,SAAS,CAAC,GAAG,eAAe,IAAI,YAAY,CAAC,EAAE;AAAA,MAC7D,eAAe;AAAA,IACjB;AAAA,EACF;AACF;;;AC9BA,IAAAC,mBAAe;AACf,IAAAC,eAAiB;AACjB,IAAAC,oBAAiB;AACjB,IAAAC,mBAAwC;AACxC,IAAAC,MAAmB;;;ACmBnB,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAS;AAAA,EAAU;AAAA,EAChE;AAAA,EAAO;AAAA,EAAY;AAAA,EAAQ;AAC7B,CAAC;AACD,IAAM,YAAY,oBAAI,IAAI,CAAC,MAAM,MAAM,MAAM,SAAS,OAAO,CAAC;AAC9D,IAAM,cAAc,oBAAI,IAAI,CAAC,QAAQ,CAAC;AACtC,IAAM,aAAa,oBAAI,IAAI,CAAC,SAAS,UAAU,CAAC;AAChD,IAAM,aAAa,oBAAI,IAAI,CAAC,QAAQ,CAAC;AAGrC,IAAMC,qBAAoB,oBAAI,IAAI,CAAC,UAAU,cAAc,QAAQ,SAAS,CAAC;AAC7E,IAAMC,oBAAmB,oBAAI,IAAI,CAAC,SAAS,aAAa,YAAY,UAAU,CAAC;AAC/E,IAAMC,mBAAkB,oBAAI,IAAI,CAAC,QAAQ,SAAS,YAAY,WAAW,CAAC;AAC1E,IAAMC,oBAAmB,oBAAI,IAAI,CAAC,SAAS,UAAU,UAAU,WAAW,aAAa,CAAC;AAExF,IAAM,wBAA+D;AAAA,EACnE,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,UAAU;AAAA,EACV,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAGA,IAAM,yBAAgE;AAAA,EACpE,UAAU;AAAA,EACV,OAAO;AAAA,EACP,MAAM;AAAA,EACN,kBAAkB;AAAA,EAClB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AACT;AAEO,SAAS,wBACd,MACA,SACuB;AAEvB,MAAI,SAAS;AACX,UAAM,OAAO,cAAc,SAAS,MAAM;AAC1C,QAAI,QAAQ,sBAAsB,IAAI,EAAG,QAAO,sBAAsB,IAAI;AAAA,EAC5E;AAGA,MAAI,SAAS,KAAK,IAAI,GAAG;AACvB,QAAI,SAAS,SAAS;AACpB,YAAM,OAAO,UAAU,cAAc,SAAS,MAAM,IAAI;AACxD,UAAI,QAAQ,uBAAuB,IAAI,EAAG,QAAO,uBAAuB,IAAI;AAC5E,aAAO;AAAA,IACT;AACA,QAAI,WAAW,IAAI,IAAI,EAAG,QAAO;AACjC,QAAI,SAAS,SAAU,QAAO;AAC9B,QAAI,YAAY,IAAI,IAAI,EAAG,QAAO;AAClC,QAAI,SAAS,KAAK;AAGhB,UAAI,YAAY,gBAAgB,SAAS,MAAM,KAAK,gBAAgB,SAAS,SAAS,IAAI;AACxF,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,QAAI,UAAU,IAAI,IAAI,EAAG,QAAO;AAChC,QAAI,WAAW,IAAI,IAAI,EAAG,QAAO;AACjC,QAAI,UAAU,IAAI,IAAI,EAAG,QAAO;AAChC,WAAO;AAAA,EACT;AAIA,MAAID,iBAAgB,IAAI,IAAI,EAAG,QAAO;AACtC,MAAIC,kBAAiB,IAAI,IAAI,EAAG,QAAO;AACvC,MAAI,QAAQ,KAAK,IAAI,EAAG,QAAO;AAC/B,MAAI,kCAAkC,KAAK,IAAI,EAAG,QAAO;AACzD,MAAI,4BAA4B,KAAK,IAAI,EAAG,QAAO;AACnD,MAAIF,kBAAiB,IAAI,IAAI,EAAG,QAAO;AACvC,MAAID,mBAAkB,IAAI,IAAI,EAAG,QAAO;AAGxC,MAAI,SAAS;AACX,UAAM,aAAa,gBAAgB,SAAS,SAAS;AACrD,UAAM,WAAW,gBAAgB,SAAS,OAAO;AACjD,UAAM,aAAa,gBAAgB,SAAS,SAAS,KAAK,gBAAgB,SAAS,UAAU;AAC7F,UAAM,cAAc,gBAAgB,SAAS,UAAU,KAAK,gBAAgB,SAAS,eAAe;AACpG,UAAM,aAAa,gBAAgB,SAAS,SAAS;AAErD,QAAI,eAAe,YAAY,aAAc,QAAO;AACpD,QAAI,cAAc,YAAa,QAAO;AACtC,QAAI,gBAAgB,gBAAgB,SAAS,OAAO,KAAK,gBAAgB,SAAS,aAAa,IAAI;AACjG,aAAO;AAAA,IACT;AACA,QAAI,WAAY,QAAO;AACvB,QACE,cAAc,SAAS,MAAM,KAC7B,4BAA4B,SAAS,MAAM,KAC3C,4BAA4B,SAAS,QAAQ,GAC7C;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;;ACpJA,IAAAI,KAAmB;AAEZ,SAAS,kBACd,gBACe;AACf,SAAO,WAAW,eAAe,IAAI;AACvC;AAEO,SAAS,WACd,MACe;AACf,MAAM,mBAAgB,IAAI,EAAG,QAAO,KAAK;AACzC,MAAM,uBAAoB,IAAI,EAAG,QAAO,GAAG,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK,IAAI;AAChF,MAAM,yBAAsB,IAAI,GAAG;AACjC,UAAM,aAAa,WAAW,KAAK,MAAa;AAChD,UAAM,eAAiB,mBAAgB,KAAK,QAAQ,IAAI,KAAK,SAAS,OAAO;AAC7E,WAAO,cAAc,eAAe,GAAG,UAAU,IAAI,YAAY,KAAK;AAAA,EACxE;AACA,SAAO;AACT;;;ACnBA,IAAAC,mBAAqB;AACrB,IAAAC,KAAmB;AAenB,IAAM,oBAAoB;AAanB,SAAS,gBAAgB,MAAqD;AACnF,MAAI,CAAC,KAAM,QAAO;AAClB,MAAM,mBAAgB,IAAI,EAAG,QAAO,KAAK;AACzC,MAAM,qBAAkB,IAAI,GAAG;AAC7B,QAAIC,SAAO;AACX,SAAK,OAAO,QAAQ,CAAC,OAAO,UAAU;AACpC,MAAAA,UAAQ,MAAM,MAAM,UAAU,MAAM,MAAM;AAC1C,YAAM,OAAO,KAAK,YAAY,KAAK;AACnC,UAAI,KAAM,CAAAA,UAAQ,IAAI,YAAY,IAAI,CAAC;AAAA,IACzC,CAAC;AACD,WAAOA;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAsB;AACzC,MAAM,gBAAa,IAAI,EAAG,QAAO,KAAK;AACtC,MAAM,sBAAmB,IAAI,KAAO,gBAAa,KAAK,QAAQ,EAAG,QAAO,KAAK,SAAS;AACtF,SAAO;AACT;AAEO,SAAS,0BAA0B,KAA2C;AACnF,QAAM,QAA6B,CAAC;AAEpC,QAAM,UAAU,CAAC,SAAiB;AAChC,QAAM,oBAAiB,IAAI,GAAG;AAE5B,UAAM,gBAAa,KAAK,MAAM,KAAK,KAAK,OAAO,SAAS,YAAY;AAClE,cAAM,QAAQ,KAAK,UAAU,CAAC;AAC9B,cAAM,aAAa,gBAAgB,KAAK;AACxC,YAAI,eAAe,QAAW;AAC5B,gBAAM,KAAK;AAAA,YACT,QAAQ,iBAAiB,KAAK,UAAU,CAAC,CAAC,IAAI,YAAY;AAAA,YAC1D;AAAA,UACF,CAAC;AAAA,QACH,WAAa,oBAAiB,KAAK,KAAQ,qBAAkB,KAAK,KAAK,MAAM,aAAa,KAAM;AAC9F,gBAAM,KAAK,EAAE,QAAQ,SAAS,CAAC;AAAA,QACjC;AACA;AAAA,MACF;AAEA,UACI,sBAAmB,KAAK,MAAM,KAC9B,gBAAa,KAAK,OAAO,MAAM,KACjC,kBAAkB,KAAK,KAAK,OAAO,OAAO,IAAI,KAC5C,gBAAa,KAAK,OAAO,QAAQ,GACnC;AACA,cAAM,SAAS,KAAK,OAAO,SAAS;AACpC,cAAM,aAAa,gBAAgB,KAAK,UAAU,CAAC,CAAC;AACpD,aAAK,WAAW,UAAU,WAAW,eAAe,eAAe,QAAW;AAC5E,gBAAM,KAAK,EAAE,QAAQ,YAAY,WAAW,CAAC;AAAA,QAC/C,WAAW,WAAW,aAAa,eAAe,QAAW;AAC3D,gBAAM,KAAK,EAAE,QAAQ,WAAW,WAAW,CAAC;AAAA,QAC9C,WAAW,WAAW,UAAU,WAAW,UAAU;AACnD,gBAAM,KAAK,EAAE,QAAQ,SAAS,CAAC;AAAA,QACjC;AAAA,MACF;AACA;AAAA,IACF;AAGA,QACI,0BAAuB,IAAI,KAC3B,sBAAmB,KAAK,IAAI,KAC5B,gBAAa,KAAK,KAAK,QAAQ,KACjC,KAAK,KAAK,SAAS,SAAS,UAC5B,qBAAqB,KAAK,KAAK,MAAM,KACnC,mBAAgB,KAAK,KAAK,KAC5B,KAAK,MAAM,MAAM,WAAW,GAAG,GAC/B;AACA,YAAM,KAAK,EAAE,QAAQ,YAAY,YAAY,KAAK,MAAM,MAAM,CAAC;AAAA,IACjE;AAAA,EACF;AAEA,uBAAAC,SAAS,KAAY;AAAA,IACnB,SAAS,CAAG,UAAO,GAAa;AAAA,IAChC,OAAO,CAAC,aAAkB,QAAQ,SAAS,IAAI;AAAA,EACjD,CAAQ;AAER,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAyC;AACjE,MAAI,CAAC,OAAO,CAAG,sBAAmB,GAAG,EAAG,QAAO;AAC/C,SAAO,IAAI,WAAW;AAAA,IACpB,CAAC,SACG,oBAAiB,IAAI,KACrB,gBAAa,KAAK,GAAG,KACvB,KAAK,IAAI,SAAS,aAChB,oBAAiB,KAAK,KAAK,KAC7B,KAAK,MAAM,UAAU;AAAA,EACzB;AACF;AAEA,SAAS,qBAAqB,MAAuB;AACnD,MAAM,gBAAa,IAAI,EAAG,QAAO,KAAK,SAAS;AAC/C,SACI,sBAAmB,IAAI,KACvB,gBAAa,KAAK,MAAM,KAC1B,KAAK,OAAO,SAAS,YACnB,gBAAa,KAAK,QAAQ,KAC5B,KAAK,SAAS,SAAS;AAE3B;;;AHhFO,IAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAMC,oBACJ;AAEF,IAAM,eAAe,oBAAI,IAAI,CAAC,MAAM,MAAM,MAAM,SAAS,OAAO,CAAC;AAe1D,IAAM,oBAAN,MAAwB;AAAA,EACrB;AAAA,EACA,UAAU,QAAQ,IAAI,YAAY;AAAA,EAClC;AAAA,EAER,YAAY,QAAwB,SAAyC;AAC3E,SAAK,SAAS;AACd,SAAK,iBAAiB,SAAS,kBAAkB;AAAA,EACnD;AAAA,EAEA,MAAM,UAAsC;AAC1C,UAAM;AAAA,MACJ,UAAU,CAAC,YAAY,WAAW,YAAY,SAAS;AAAA,MACvD,UAAU,CAAC,sBAAsB,cAAc,aAAa;AAAA,IAC9D,IAAI,KAAK;AAcT,UAAM,SAAS,UAAM,kBAAAC,SAAK,SAAS,EAAE,KAAK,KAAK,OAAO,SAAS,QAAQ,QAAQ,CAAC,GAAG;AAAA,MACjF,CAACC,UAAS,CAACA,MAAK,SAAS,OAAO;AAAA,IAClC;AACA,UAAM,iBAAiB,UAAM,kBAAAD,SAAK,KAAK,gBAAgB;AAAA,MACrD,KAAK,KAAK,OAAO;AAAA,MACjB,QAAQ;AAAA,IACV,CAAC;AACD,UAAM,aAAa,IAAI,IAAI,eAAe,IAAI,CAAC,MAAM,aAAAE,QAAK,QAAQ,KAAK,OAAO,SAAS,CAAC,CAAC,CAAC;AAE1F,UAAM,aAAmC,CAAC;AAC1C,eAAWD,SAAQ,OAAO;AACxB,YAAM,WAAW,aAAAC,QAAK,QAAQ,KAAK,OAAO,SAASD,KAAI;AACvD,UAAI;AACF,cAAM,YAAY,MAAM,KAAK,YAAY,QAAQ;AACjD,YAAI,CAAC,UAAW;AAChB,kBAAU,uBAAuB,WAAW,IAAI,QAAQ;AACxD,mBAAW,KAAK,SAAS;AACzB,YAAI,KAAK,SAAS;AAChB,kBAAQ,IAAI,wCAAmC,UAAU,WAAW,IAAI,KAAKA,KAAI,GAAG;AAAA,QACtF;AAAA,MACF,SAASE,QAAO;AACd,YAAI,KAAK,SAAS;AAChB,kBAAQ;AAAA,YACN,uCAAuCF,KAAI;AAAA,YAC3CE,kBAAiB,QAAQA,OAAM,UAAUA;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,YAAY,eAAe,MAAM,OAAO;AAAA,EACnD;AAAA,EAEA,MAAM,YAAY,UAAsD;AACtE,UAAM,SAAS,MAAM,iBAAAC,QAAG,SAAS,UAAU,OAAO;AAClD,UAAM,MAAM,YAAY,QAAQ,KAAK,OAAO,aAAoB;AAEhE,UAAM,qBAAqB,KAAK,8BAA8B,GAAG;AACjE,UAAM,gBAAgB,KAAK,qBAAqB,GAAG;AACnD,UAAM,kBAAkB,KAAK,qBAAqB,GAAG;AACrD,UAAM,mBAAmB,KAAK,2BAA2B,GAAG;AAE5D,UAAM,QAAQ,KAAK;AAAA,MACjB,oBAAoB,SAAS,CAAC;AAAA,MAC9B,KAAK,aAAa,KAAK,eAAe;AAAA,IACxC;AACA,UAAM,UAAU,KAAK,eAAe,KAAK,oBAAoB,gBAAgB;AAC7E,UAAM,aAAa,KAAK,kBAAkB,GAAG;AAC7C,UAAM,cAAc,KAAK,mBAAmB,GAAG;AAC/C,UAAM,oBAAoB,KAAK,yBAAyB,GAAG;AAE3D,UAAM,uBAAuB,4BAA4B,MAAM;AAC/D,UAAM,kBAAkB,+BAA+B,MAAM;AAC7D,QAAI,iBAAiB;AACnB,iBAAW,UAAU,SAAS;AAC5B,YAAI,oBAAoB,OAAO,gBAAgB,IAAI,OAAO,EAAE,GAAG;AAC7D,iBAAO,cAAc;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OACJ,oBAAoB,QACpB,iBACA,aAAAF,QAAK,SAAS,QAAQ,EAAE,QAAQ,kBAAkB,EAAE;AAEtD,UAAM,aAA+B;AAAA,MACnC;AAAA,MACA;AAAA,MACA,OAAO,oBAAoB;AAAA,MAC3B,aAAa,oBAAoB;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,YAAY,SAAS,IAAI,EAAE,YAAY,IAAI,CAAC;AAAA,MAChD,GAAI,oBAAoB,oBAAoB,mBAAmB,iBAAiB,SAAS,IACrF,EAAE,kBAAkB,mBAAmB,iBAAiB,IACxD,CAAC;AAAA,MACL,GAAI,uBACA;AAAA,QACE,aAAa;AAAA,QACb,GAAI,qBAAqB,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,MACtD,IACA,CAAC;AAAA,IACP;AAEA,WAAO;AAAA,MACL;AAAA,MACA,mBAAmB,uBAAuB,QAAQ,KAAK,yBAAyB,GAAG;AAAA,MACnF,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAIQ,yBAAyB,KAAsB;AACrD,QAAI,QAAQ;AACZ,yBAAAG,SAAS,KAAK;AAAA,MACZ,gBAAgB,CAAC,aAAa;AAC5B,YAAI,MAAO;AACX,YAAI,uBAAuB,SAAS,KAAK,MAAM,GAAG;AAChD,kBAAQ;AACR,mBAAS,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,8BACN,KACuD;AACvD,QAAI,QAAwC;AAC5C,yBAAAA,SAAS,KAAK;AAAA,MACZ,gBAAgB,CAAC,aAAa;AAC5B,YAAI,CAAC,uBAAuB,SAAS,KAAK,MAAM,EAAG;AACnD,cAAM,MAAM,SAAS,KAAK,UAAU,CAAC;AACrC,YAAM,uBAAmB,GAAG,GAAG;AAC7B,kBAAQ,eAAe,GAAG;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAC;AACD,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,OAAO;AAEb,UAAM,SAAuD;AAAA,MAC3D,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AAAA,MAClD,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,MACR,mBAAmB,CAAC;AAAA,MACpB,YAAY,CAAC;AAAA,IACf;AACA,QAAI,OAAO,KAAK,UAAU,SAAU,QAAO,QAAQ,KAAK;AACxD,QAAI,OAAO,KAAK,gBAAgB,SAAU,QAAO,cAAc,KAAK;AACpE,QAAI,MAAM,QAAQ,KAAK,gBAAgB,GAAG;AACxC,YAAM,UAAU,KAAK,iBAClB,OAAO,CAAC,MAAmB,OAAO,MAAM,QAAQ,EAChD,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,UAAI,QAAQ,SAAS,EAAG,QAAO,mBAAmB;AAAA,IACpD;AACA,QAAI,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC/B,aAAO,UAAU,KAAK,QACnB,OAAO,CAAC,MAAoC,OAAO,MAAM,YAAY,MAAM,IAAI,EAC/E,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,YAAY,EAAE,GAAG,SAAS,CAAC,EACzD,IAAI,CAAC,OAAO,EAAE,MAAM,UAAU,GAAG,EAAE,EAAsB;AAAA,IAC9D;AACA,QAAI,MAAM,QAAQ,KAAK,MAAM,GAAG;AAC9B,YAAM,SAAS,KAAK,OACjB,OAAO,CAAC,MAAoC,OAAO,MAAM,YAAY,MAAM,IAAI,EAC/E,OAAO,CAAC,MAAM,OAAO,EAAE,OAAO,YAAY,EAAE,GAAG,SAAS,CAAC,EACzD;AAAA,QACC,CAAC,OACE;AAAA,UACC,MAAM,EAAE;AAAA,UACR,MAAM,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO;AAAA,UAC5C,UAAU,EAAE,aAAa;AAAA,UACzB,GAAI,OAAO,EAAE,UAAU,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAAA,UACxD,GAAI,OAAO,EAAE,gBAAgB,WAAW,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,UAC1E,GAAI,EAAE,iBAAiB,SAAY,EAAE,cAAc,EAAE,aAAa,IAAI,CAAC;AAAA,UACvE,GAAI,MAAM,QAAQ,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC3D;AAAA,MACJ;AACF,UAAI,OAAO,SAAS,EAAG,QAAO,QAAQ,CAAC,EAAE,IAAI,WAAW,OAAO,CAAC;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAKQ,qBAAqB,KAAqB;AAChD,QAAI,cAAc;AAClB,QAAI,gBAAgB;AAEpB,yBAAAA,SAAS,KAAK;AAAA,MACZ,0BAA0B,CAAC,aAAa;AACtC,cAAM,cAAc,SAAS,KAAK;AAClC,YAAM,0BAAsB,WAAW,KAAK,YAAY,IAAI,MAAM;AAChE,wBAAc,YAAY,GAAG;AAAA,QAC/B,WAAa,iBAAa,WAAW,GAAG;AACtC,wBAAc,YAAY;AAAA,QAC5B;AAAA,MACF;AAAA,MACA,wBAAwB,CAAC,aAAa;AACpC,YAAI,cAAe;AACnB,cAAM,cAAc,SAAS,KAAK;AAClC,YACI,0BAAsB,WAAW,KACnC,YAAY,MACZ,SAAS,KAAK,YAAY,GAAG,IAAI,GACjC;AACA,0BAAgB,YAAY,GAAG;AAAA,QACjC,WAAa,0BAAsB,WAAW,GAAG;AAC/C,qBAAW,cAAc,YAAY,cAAc;AACjD,gBACI,iBAAa,WAAW,EAAE,KAC5B,SAAS,KAAK,WAAW,GAAG,IAAI,MAC7B,8BAA0B,WAAW,IAAI,KACxC,yBAAqB,WAAW,IAAI,IACxC;AACA,8BAAgB,WAAW,GAAG;AAC9B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,eAAe;AAAA,EACxB;AAAA,EAEQ,kBAAkB,KAAoC;AAC5D,UAAM,aAAoC,CAAC;AAC3C,UAAM,OAAO,oBAAI,IAAY;AAE7B,yBAAAA,SAAS,KAAK;AAAA,MACZ,mBAAmB,CAAC,aAAa;AAC/B,cAAM,UAAU,SAAS;AACzB,cAAM,OAAO,kBAAkB,OAAO;AACtC,YAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,EAAG;AAC7B,aAAK,IAAI,IAAI;AAEb,cAAM,OAAO,wBAAwB,MAAM,OAAO;AAClD,cAAM,OACJ,SAAS,YAAY,SAAS,YAAY,SAAS,SAC/C,UACA,SAAS,WACP,SAAS,YACT,SAAS,UACT,SAAS,WACT,SAAS,SACR,OACD;AAER,cAAM,YAAiC,EAAE,MAAM,KAAK;AACpD,cAAM,SAAS,cAAc,SAAS,aAAa,KAAK,cAAc,SAAS,QAAQ;AACvF,cAAM,YAAY,cAAc,SAAS,YAAY;AACrD,YAAI,OAAQ,WAAU,SAAS;AAC/B,YAAI,UAAW,WAAU,qBAAqB;AAC9C,mBAAW,KAAK,SAAS;AAAA,MAC3B;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,qBAAqB,KAAkC;AAC7D,UAAM,SAAS,oBAAI,IAAoB;AACvC,yBAAAA,SAAS,KAAK;AAAA,MACZ,YAAY,CAAC,aAAa;AACxB,cAAM,UAAU,SAAS;AACzB,YAAI,kBAAkB,QAAQ,cAAc,MAAM,QAAS;AAC3D,cAAM,UAAU,cAAc,QAAQ,gBAAgB,SAAS;AAC/D,YAAI,CAAC,QAAS;AACd,cAAM,OAAO,eAAe,OAAO;AACnC,YAAI,KAAM,QAAO,IAAI,SAAS,IAAI;AAAA,MACpC;AAAA,IACF,CAAC;AACD,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,aAAa,KAAa,iBAAwD;AAMxF,UAAM,cAAc,oBAAI,IAAqC;AAC7D,UAAM,UAAU,oBAAI,IAAY;AAChC,QAAI,YAAY;AAMhB,UAAM,WAAW,CAAC,cAA8B;AAC9C,UAAI,CAAC,QAAQ,IAAI,SAAS,GAAG;AAC3B,gBAAQ,IAAI,SAAS;AACrB,eAAO;AAAA,MACT;AACA,UAAI,SAAS;AACb,aAAO,QAAQ,IAAI,GAAG,SAAS,IAAI,MAAM,EAAE,EAAG,WAAU;AACxD,YAAM,KAAK,GAAG,SAAS,IAAI,MAAM;AACjC,cAAQ,IAAI,EAAE;AACd,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,CAAC,gBAAiD;AAClE,UAAI,SAAS,YAAY,IAAI,WAAW;AACxC,UAAI,OAAQ,QAAO;AACnB,mBAAa;AACb,UAAI,YAAY;AAChB,UAAI;AACJ,UAAI,aAAa;AACf,cAAM,UAAU,YAAY;AAC5B,oBACE,cAAc,SAAS,IAAI,KAC3B,cAAc,SAAS,MAAM,KAC7B,cAAc,SAAS,aAAa,MACnC,cAAc,IAAI,YAAY,QAAQ,SAAS;AAClD,uBAAe,KAAK,oBAAoB,SAAS,UAAU;AAAA,MAC7D;AACA,eAAS,EAAE,IAAI,SAAS,SAAS,GAAG,QAAQ,oBAAI,IAAI,GAAG,aAAa;AACpE,kBAAY,IAAI,aAAa,MAAM;AACnC,aAAO;AAAA,IACT;AAEA,yBAAAA,SAAS,KAAK;AAAA,MACZ,YAAY,CAAC,aAAa;AACxB,cAAM,UAAU,SAAS;AACzB,cAAM,OAAO,kBAAkB,QAAQ,cAAc;AACrD,YAAI,CAAC,KAAM;AACX,cAAM,OAAO,wBAAwB,MAAM,QAAQ,cAAc;AACjE,YAAI,CAAC,CAAC,SAAS,UAAU,UAAU,MAAM,EAAE,SAAS,IAAI,EAAG;AAG3D,YAAI,SAAS,SAAU;AAEvB,cAAM,QAAQ,KAAK,aAAa,SAAS,MAAM,eAAe;AAC9D,YAAI,CAAC,MAAM,KAAM;AAEjB,cAAM,aAAa,SAAS;AAAA,UAC1B,CAAC,MACC,EAAE,aAAa,MACd,kBAAkB,EAAE,KAAK,cAAc,MAAM,UAC5C,cAAc,EAAE,KAAK,gBAAgB,MAAM,MAAM;AAAA,QACvD;AACA,cAAM,SAAS,UAAU,aAAa,WAAW,OAAO,IAAI;AAC5D,YAAI,CAAC,OAAO,OAAO,IAAI,MAAM,IAAI,EAAG,QAAO,OAAO,IAAI,MAAM,MAAM,KAAK;AAAA,MACzE;AAAA,IACF,CAAC;AAID,yBAAAA,SAAS,KAAK;AAAA,MACZ,YAAY,CAAC,aAAa;AACxB,cAAM,UAAU,SAAS;AACzB,cAAM,OAAO,kBAAkB,QAAQ,cAAc;AACrD,YAAI,CAAC,KAAM;AACX,YAAI,CAAC,KAAK,gBAAgB,MAAM,QAAQ,cAAc,EAAG;AACzD,cAAM,aAAa,SAAS;AAAA,UAC1B,CAAC,MAAM,EAAE,aAAa,KAAK,kBAAkB,EAAE,KAAK,cAAc,MAAM;AAAA,QAC1E;AACA,YAAI,CAAC,WAAY;AACjB,cAAM,SAAS,YAAY,IAAI,WAAW,IAAI;AAC9C,YAAI,CAAC,OAAQ;AACb,cAAM,UAAU,KAAK,oBAAoB,QAAQ,gBAAgB,SAAS;AAC1E,YAAI,CAAC,OAAO,gBAAgB,QAAS,QAAO,eAAe;AAAA,MAC7D;AAAA,IACF,CAAC;AAED,WAAO,MAAM,KAAK,YAAY,OAAO,CAAC,EACnC,OAAO,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,EACzC,IAAI,CAAC,YAAY;AAAA,MAChB,IAAI,OAAO;AAAA,MACX,QAAQ,MAAM,KAAK,OAAO,OAAO,OAAO,CAAC;AAAA,MACzC,GAAI,OAAO,gBAAgB,OAAO,iBAAiB,cAC/C,EAAE,cAAc,OAAO,aAAa,IACpC,CAAC;AAAA,IACP,EAAE;AAAA,EACN;AAAA,EAEQ,gBAAgB,MAAc,SAAuC;AAC3E,UAAM,OAAO,cAAc,SAAS,MAAM;AAC1C,QAAI,SAAS,SAAU,QAAO,SAAS,YAAY,SAAS;AAC5D,QAAI,SAAS,QAAS,QAAO,SAAS;AACtC,WAAO;AAAA,EACT;AAAA,EAEQ,aACN,SACA,MACA,iBACqB;AACrB,UAAM,UAAU,QAAQ;AACxB,UAAM,gBAAgB,kBAAkB,OAAO,KAAK;AACpD,UAAM,QAA6B;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,iBAAiB;AAAA,IACnB;AAEA,UAAM,aAAa,cAAc,SAAS,YAAY;AACtD,UAAM,aAAa,cAAc,SAAS,aAAa;AACvD,UAAM,QAAQ,cAAc,SAAS,IAAI;AACzC,UAAM,WAAW,cAAc,SAAS,MAAM;AAC9C,UAAM,YAAY,cAAc,SAAS,YAAY;AACrD,UAAM,cAAc,cAAc,SAAS,aAAa;AAExD,QAAI,YAAa,OAAM,cAAc;AACrC,QAAI,UAAW,OAAM,QAAQ;AAC7B,QAAI,SAAS,gBAAgB,IAAI,KAAK,EAAG,OAAM,QAAQ,gBAAgB,IAAI,KAAK;AAKhF,QAAI,YAAY;AACd,YAAM,OAAO;AACb,YAAM,UAAU,aAAa,MAAM,SAAS;AAAA,QAC1C,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,YAAY;AACd,UAAI,CAAC,MAAM,KAAM,OAAM,OAAO,WAAW,QAAQ,yBAAyB,EAAE;AAC5E,YAAM,UAAU,aAAa,MAAM,SAAS;AAAA,QAC1C,GAAI,MAAM,SAAS,KAAK,CAAC,IAAI,EAAE,IAAI,WAAW;AAAA,QAC9C,QAAQ;AAAA,QACR,QAAQ,MAAM,SAAS,UAAU;AAAA,MACnC,CAAC;AAAA,IACH;AACA,QAAI,YAAY,CAAC,MAAM,KAAM,OAAM,OAAO;AAC1C,QAAI,OAAO;AACT,UAAI,CAAC,MAAM,KAAM,OAAM,OAAO;AAC9B,YAAM,UAAU,aAAa,MAAM,SAAS;AAAA,QAC1C,GAAI,MAAM,SAAS,KAAK,CAAC,IAAI,EAAE,IAAI,MAAM;AAAA,QACzC,QAAQ,MAAM,SAAS,UAAU;AAAA,MACnC,CAAC;AAAA,IACH;AACA,QAAI,WAAW;AACb,YAAM,UAAU,aAAa,MAAM,SAAS;AAAA,QAC1C,GAAI,MAAM,SAAS,KAAK,CAAC,IAAI,EAAE,IAAI,QAAQ,SAAS,EAAE;AAAA,QACtD,oBAAoB;AAAA,QACpB,QAAQ,MAAM,SAAS,UAAU;AAAA,MACnC,CAAC;AAAA,IACH;AAGA,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAI,CAAG,mBAAe,IAAI,KAAK,CAAG,oBAAgB,KAAK,IAAI,EAAG;AAC9D,YAAM,WAAW,KAAK,KAAK;AAC3B,UAAI,aAAa,YAAY;AAC3B,YAAI,KAAK,UAAU,KAAM,OAAM,WAAW;AAAA,iBAEtC,6BAAyB,KAAK,KAAK,KACnC,qBAAiB,KAAK,MAAM,UAAU,GACxC;AACA,gBAAM,WAAW,KAAK,MAAM,WAAW;AAAA,QACzC;AAAA,MACF;AACA,WACG,aAAa,WAAW,aAAa,cACtC,KAAK,SACH,6BAAyB,KAAK,KAAK,KACnC,iBAAa,KAAK,MAAM,UAAU,GACpC;AACA,cAAM,eAAe,KAAK,MAAM,WAAW;AAC3C,YAAI,CAAC,MAAM,KAAM,OAAM,OAAO,KAAK,MAAM,WAAW;AAAA,MACtD;AAAA,IACF;AACA,QAAI,cAAc,SAAS,eAAe,MAAM,OAAQ,OAAM,WAAW;AAGzE,QAAI,SAAS,SAAU,OAAM,OAAO;AAAA,aAC3B,SAAS,SAAU,OAAM,OAAO;AAAA,aAChC,SAAS,OAAQ,OAAM,OAAO;AAAA,SAClC;AACH,YAAM,OAAO,KAAK,eAAe,SAAS,KAAK;AAAA,IACjD;AAGA,QAAI,kBAAkB,UAAU;AAC9B,YAAM,UAAU,KAAK,qBAAqB,OAAO;AACjD,UAAI,QAAQ,SAAS,EAAG,OAAM,UAAU;AAAA,IAC1C;AAEA,QAAI,CAAC,MAAM,QAAQ,wBAAwB,MAAM,IAAI,GAAG;AACtD,YAAM,WAAW,MAAM,SAAS,MAAM;AACtC,UAAI,SAAU,OAAM,OAAO,QAAQ,QAAQ;AAAA,IAC7C;AACA,QAAI,CAAC,MAAM,WAAW,MAAM,MAAM;AAChC,YAAM,UAAU,EAAE,IAAI,MAAM,MAAM,OAAO,MAAM,OAAO,QAAQ,WAAW;AAAA,IAC3E,WAAW,MAAM,WAAW,CAAC,MAAM,QAAQ,MAAM,MAAM,MAAM;AAC3D,YAAM,UAAU,aAAa,MAAM,SAAS;AAAA,QAC1C,IAAI,MAAM;AAAA,QACV,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM,QAAQ,UAAU;AAAA,MAClC,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eACN,SACA,OAC6B;AAC7B,UAAM,OAAO,cAAc,SAAS,MAAM;AAC1C,QAAI,SAAS,QAAS,QAAO;AAC7B,QAAI,SAAS,MAAO,QAAO;AAC3B,QAAI,SAAS,SAAU,QAAO;AAC9B,QAAI,SAAS,UAAU,SAAS,oBAAoB,SAAS,WAAW,SAAS;AAC/E,aAAO;AAET,UAAM,YAAY,cAAc,SAAS,WAAW,KAAK,cAAc,SAAS,WAAW;AAC3F,QAAI,cAAc,QAAS,QAAO;AAClC,QAAI,cAAc,MAAO,QAAO;AAChC,QAAI,cAAc,aAAa,cAAc,UAAW,QAAO;AAE/D,UAAM,WAAW,GAAG,MAAM,IAAI,IAAI,MAAM,SAAS,EAAE,IAAI,MAAM,eAAe,EAAE,GAAG,YAAY;AAC7F,QAAI,SAAS,SAAS,OAAO,EAAG,QAAO;AACvC,QAAI,SAAS,SAAS,OAAO,KAAK,SAAS,SAAS,KAAK,EAAG,QAAO;AACnE,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,eAAiE;AAC5F,UAAM,UAA8C,CAAC;AACrD,eAAW,SAAS,cAAc,UAAU;AAC1C,UAAI,CAAG,iBAAa,KAAK,EAAG;AAC5B,UAAI,kBAAkB,MAAM,cAAc,MAAM,SAAU;AAC1D,YAAM,QAAQ,cAAc,MAAM,gBAAgB,OAAO;AACzD,YAAM,QAAQ,eAAe,KAAK,KAAK,SAAS;AAChD,UAAI,SAAS,MAAO,SAAQ,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,SAA2B,WAA+C;AAC3F,UAAM,MAAwB,QAAQ,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,KAAK,MAAM,EAAE,EAAE;AAC3F,eAAW,QAAQ,WAAW;AAC5B,YAAM,WAAW,IAAI,KAAK,CAAC,cAAc,UAAU,OAAO,KAAK,EAAE;AACjE,UAAI,CAAC,UAAU;AACb,YAAI,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;AAC9C;AAAA,MACF;AACA,iBAAW,SAAS,KAAK,QAAQ;AAC/B,cAAM,gBAAgB,SAAS,OAAO,KAAK,CAAC,cAAc,UAAU,SAAS,MAAM,IAAI;AACvF,YAAI,CAAC,eAAe;AAClB,mBAAS,OAAO,KAAK,KAAK;AAC1B;AAAA,QACF;AACA,sBAAc,QAAQ,cAAc,SAAS,MAAM;AACnD,sBAAc,cAAc,cAAc,eAAe,MAAM;AAC/D,sBAAc,UAAU,cAAc,WAAW,MAAM;AACvD,sBAAc,UAAU,cAAc,WAAW,MAAM;AACvD,sBAAc,kBAAkB,cAAc,mBAAmB,MAAM;AACvE,sBAAc,eAAe,cAAc,gBAAgB,MAAM;AACjE,sBAAc,WAAW,cAAc,YAAY,MAAM;AACzD,YAAI,cAAc,SAAS,UAAU,MAAM,SAAS,OAAQ,eAAc,OAAO,MAAM;AAAA,MACzF;AACA,eAAS,eAAe,SAAS,gBAAgB,KAAK;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,eACN,KACA,oBACA,kBACoB;AACpB,UAAM,UAAU,CAAC,GAAI,oBAAoB,WAAW,CAAC,CAAE;AACvD,UAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAClD,UAAM,eAAe,IAAI;AAAA,MACvB,QAAQ,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,KAAM,GAAG,CAAC,CAAU;AAAA,IAClF;AAEA,yBAAAA,SAAS,KAAK;AAAA,MACZ,YAAY,CAAC,aAAa;AACxB,cAAM,UAAU,SAAS;AACzB,cAAM,OAAO,kBAAkB,QAAQ,cAAc;AACrD,YAAI,CAAC,KAAM;AACX,YAAI,wBAAwB,MAAM,QAAQ,cAAc,MAAM,SAAU;AAExE,cAAM,SAAS,KAAK,yBAAyB,SAAS,QAAQ;AAC9D,YAAI,CAAC,OAAQ;AAEb,cAAM,kBAAkB,OAAO,QAC3B,aAAa,IAAI,eAAe,OAAO,KAAK,CAAC,IAC7C;AACJ,YAAI,iBAAiB;AACnB,eAAK,oBAAoB,iBAAiB,MAAM;AAChD;AAAA,QACF;AACA,YAAI,OAAO,MAAM,CAAC,UAAU,IAAI,OAAO,EAAE,GAAG;AAC1C,kBAAQ,KAAK,MAAM;AACnB,oBAAU,IAAI,OAAO,EAAE;AACvB,cAAI,OAAO,MAAO,cAAa,IAAI,eAAe,OAAO,KAAK,GAAG,MAAM;AAAA,QACzE;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,0BAA0B,SAAS,gBAAgB;AACxD,WAAO;AAAA,EACT;AAAA,EAEQ,yBACN,SACA,UACyB;AACzB,UAAM,UAAU,QAAQ;AACxB,UAAM,gBAAgB,kBAAkB,OAAO,KAAK;AACpD,UAAM,SAA2B,EAAE,IAAI,IAAI,MAAM,UAAU,iBAAiB,cAAc;AAG1F,UAAM,YAAY,cAAc,SAAS,YAAY;AACrD,UAAM,QACJ,aACA,eAAe,OAAO,KACtB,cAAc,SAAS,OAAO,KAC9B,cAAc,SAAS,OAAO;AAChC,QAAI,MAAO,QAAO,QAAQ;AAC1B,QAAI,WAAW;AACb,aAAO,UAAU,aAAa,OAAO,SAAS;AAAA,QAC5C,oBAAoB;AAAA,QACpB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,UAAM,aAAa,cAAc,SAAS,YAAY;AACtD,UAAM,aAAa,cAAc,SAAS,aAAa;AACvD,UAAM,QAAQ,cAAc,SAAS,IAAI;AACzC,QAAI,YAAY;AACd,aAAO,KAAK;AACZ,aAAO,UAAU,aAAa,OAAO,SAAS;AAAA,QAC5C,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,WAAW,YAAY;AACrB,aAAO,KAAK;AACZ,aAAO,UAAU,aAAa,OAAO,SAAS;AAAA,QAC5C,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,WAAW,OAAO;AAChB,aAAO,KAAK;AACZ,aAAO,UAAU,aAAa,OAAO,SAAS,EAAE,IAAI,OAAO,QAAQ,KAAK,CAAC;AAAA,IAC3E,WAAW,OAAO,OAAO;AACvB,aAAO,KAAK,QAAQ,OAAO,KAAK;AAAA,IAClC;AACA,QAAI,CAAC,OAAO,GAAI,QAAO;AAGvB,UAAM,KAAK,cAAc,SAAS,IAAI,KAAK,cAAc,SAAS,MAAM;AACxE,QAAI,MAAM,GAAG,WAAW,GAAG,GAAG;AAC5B,aAAO,OAAO;AAEd,aAAO,eAAe;AAAA,IACxB,WAAW,MAAM,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,gBAAgB,SAAS,SAAS,GAAG;AAE5E,aAAO;AAAA,IACT;AAGA,QAAI;AACJ,UAAM,cAAc,QAAQ,WAAW;AAAA,MACrC,CAAC,SACG,mBAAe,IAAI,KAAO,oBAAgB,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS;AAAA,IACjF;AACA,QAAI,aAAa,SAAW,6BAAyB,YAAY,KAAK,GAAG;AACvE,YAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,iBAAa,IAAI,GAAG;AACxB,sBAAc,KAAK;AACnB,eAAO,UAAU,KAAK;AAAA,MACxB,WAAW,CAAG,yBAAqB,IAAI,GAAG;AACxC,cAAM,iBAAiB,0BAA0B,IAAI;AACrD,cAAM,YAAY,eAAe,KAAK,CAAC,SAAS,KAAK,UAAU;AAC/D,YAAI,WAAW,YAAY;AACzB,iBAAO,OAAO;AACd,iBAAO,eAAe,UAAU;AAAA,QAClC,WAAW,eAAe,KAAK,CAAC,SAAS,KAAK,WAAW,QAAQ,GAAG;AAGlE,iBAAO,OAAO;AACd,iBAAO,gBAAgB;AAAA,YACrB,MAAM;AAAA,YACN,aAAa;AAAA,UACf;AACA,iBAAO,mBAAmB;AAAA,YACxB,GAAI,OAAO,oBAAoB,CAAC;AAAA,YAChC,iBAAiB;AAAA,UACnB;AAAA,QACF;AACA,cAAM,gBAAgB,wBAAwB,IAAI;AAClD,YAAI,eAAe;AACjB,wBAAc;AACd,iBAAO,UAAU;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AACA,QAAI,aAAa;AACf,YAAM,QAAQ,YAAY,YAAY;AACtC,UAAI,MAAM,SAAS,QAAQ,EAAG,QAAO,OAAO;AAAA,eACnC,MAAM,SAAS,UAAU,KAAK,OAAO,SAAS,SAAU,QAAO,OAAO;AAAA,IACjF;AAIA,QAAI,iBAAiB,KAAK,gBAAgB,eAAe,OAAO,GAAG;AACjE,YAAM,aAAa,SAAS;AAAA,QAC1B,CAAC,MAAM,EAAE,aAAa,KAAK,kBAAkB,EAAE,KAAK,cAAc,MAAM;AAAA,MAC1E;AACA,UAAI,YAAY;AACd,eAAO,OAAO;AACd,YAAI,CAAC,OAAO,SAAS;AACnB,gBAAM,cAAc,KAAK,oBAAoB,WAAW,KAAK,gBAAgB,UAAU;AACvF,cAAI,eAAe,gBAAgB,aAAa;AAC9C,mBAAO,UAAU;AACjB,0BAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,gBAAgB,SAAS,aAAa,KAAK,gBAAgB,SAAS,kBAAkB,GAAG;AAC3F,YAAM,QACJ,cAAc,SAAS,aAAa,KAAK,cAAc,SAAS,kBAAkB;AACpF,aAAO,cAAc,UAAU;AAAA,IACjC,WACG,eAAeN,kBAAiB,KAAK,WAAW,KACjDA,kBAAiB,KAAK,OAAO,EAAE,GAC/B;AACA,aAAO,cAAc;AAAA,IACvB;AAEA,QAAI,CAAC,OAAO,WAAW,OAAO,IAAI;AAChC,aAAO,UAAU;AAAA,QACf,IAAI,OAAO;AAAA,QACX,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO,QAAQ,UAAU;AAAA,MACnC;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,QAA0B,QAAgC;AACpF,WAAO,UAAU,OAAO,WAAW,OAAO;AAC1C,WAAO,eAAe,OAAO,gBAAgB,OAAO;AACpD,WAAO,cAAc,OAAO,eAAe,OAAO;AAClD,WAAO,UAAU,OAAO,WAAW,OAAO;AAC1C,WAAO,6BACL,OAAO,8BAA8B,OAAO,8BAA8B;AAC5E,WAAO,uBACL,OAAO,wBAAwB,OAAO,wBAAwB;AAChE,WAAO,cAAc,OAAO,eAAe,OAAO,eAAe;AACjE,WAAO,SAAS,OAAO,UAAU,OAAO;AACxC,WAAO,YAAY,OAAO,aAAa,OAAO;AAC9C,WAAO,mBAAmB,OAAO,oBAAoB,OAAO;AAAA,EAC9D;AAAA,EAEQ,0BACN,SACA,WACM;AACN,eAAW,UAAU,SAAS;AAC5B,YAAM,WAAW,OAAO,UAAU,UAAU,IAAI,OAAO,OAAO,IAAI;AAClE,UAAI,CAAC,SAAU;AAEf,aAAO,mBAAmB;AAAA,QACxB,GAAI,OAAO,oBAAoB,CAAC;AAAA,QAChC,GAAG,SAAS,KAAK;AAAA,MACnB;AACA,UAAI,SAAS,8BAA8B,SAAS,KAAK,4BAA4B;AACnF,eAAO,6BAA6B;AAAA,MACtC;AACA,UAAI,SAAS,cAAc,CAAC,OAAO,cAAc;AAC/C,eAAO,eAAe,SAAS;AAC/B,YAAI,OAAO,SAAS,SAAU,QAAO,OAAO;AAC5C,eAAO,mBAAmB;AAAA,UACxB,GAAI,OAAO,oBAAoB,CAAC;AAAA,UAChC,iBAAiB;AAAA,QACnB;AAAA,MACF;AACA,UAAI,SAAS,KAAK,iBAAiB,CAAC,OAAO,eAAe;AACxD,eAAO,gBAAgB,SAAS,KAAK;AAAA,MACvC;AACA,UAAI,SAAS,KAAK,iBAAiB,CAAC,OAAO,eAAe;AACxD,eAAO,gBAAgB,SAAS,KAAK;AAAA,MACvC;AACA,UAAI,SAAS,KAAK,cAAc,CAAC,OAAO,YAAY;AAClD,eAAO,aAAa,SAAS,KAAK;AAAA,MACpC;AACA,UACE,SAAS,KAAK,eACd,OAAO,gBAAgB,QACvB,OAAO,yBAAyB,QAChC,OAAO,WAAW,iBAClB,OAAO,cAAc,QACrB;AACA,eAAO,cAAc;AACrB,eAAO,SAAS,OAAO,UAAU;AACjC,eAAO,YAAY,OAAO,aAAa;AACvC,eAAO,uBAAuB,OAAO,wBAAwB;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,2BAA2B,KAA8C;AAC/E,UAAM,WAAW,iBAAiB,GAAG;AACrC,UAAM,MAAM,oBAAI,IAAgC;AAEhD,eAAW,CAAC,MAAM,EAAE,KAAK,UAAU;AACjC,YAAM,OAAO,wBAAwB,MAAM,IAAI,QAAQ;AACvD,YAAM,WAAW,GAAG,OAAO,0BAA0B,GAAG,IAAI,IAAI,CAAC;AACjE,YAAM,WAAW,SAAS,KAAK,CAAC,SAAS,KAAK,UAAU;AACxD,YAAM,WAAW,SAAS,KAAK,CAAC,SAAS,KAAK,WAAW,QAAQ;AACjE,UAAI,IAAI,MAAM;AAAA,QACZ,MAAM;AAAA,UACJ,GAAG;AAAA,UACH,GAAI,YAAY,CAAC,KAAK,gBAClB;AAAA,YACE,eAAe;AAAA,cACb,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,UACF,IACA,CAAC;AAAA,QACP;AAAA,QACA,YAAY,UAAU;AAAA,QACtB,4BAA4B,GAAG,OAAO,sBAAsB,GAAG,IAAI,IAAI;AAAA,MACzE,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,SAA8B,UAAsC;AAC9F,UAAM,OAAO,QAAQ,WAAW;AAAA,MAC9B,CAAC,cACG,mBAAe,SAAS,KACxB,oBAAgB,UAAU,IAAI,KAChC,UAAU,KAAK,SAAS;AAAA,IAC5B;AACA,QAAI,CAAC,MAAM,SAAS,CAAG,6BAAyB,KAAK,KAAK,EAAG,QAAO;AACpE,UAAM,OAAO,KAAK,MAAM;AACxB,QAAM,iBAAa,IAAI,EAAG,QAAO,KAAK;AACtC,QAAM,8BAA0B,IAAI,KAAO,yBAAqB,IAAI,GAAG;AACrE,aAAO,wBAAwB,IAAI,KAAK;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,yBAAyB,KAAuB;AACtD,UAAM,UAAU,oBAAI,IAAY;AAEhC,eAAW,QAAQ,0BAA0B,GAAG,GAAG;AACjD,UAAI,KAAK,cAAc,KAAK,WAAW,WAAW,GAAG,EAAG,SAAQ,IAAI,KAAK,UAAU;AAAA,IACrF;AAEA,yBAAAM,SAAS,KAAK;AAAA,MACZ,mBAAmB,CAAC,aAAa;AAC/B,cAAM,UAAU,SAAS;AACzB,cAAM,OAAO,kBAAkB,OAAO;AACtC,YAAI,SAAS,UAAU,SAAS,aAAa,SAAS,YAAY;AAChE,gBAAM,KAAK,cAAc,SAAS,IAAI;AACtC,cAAI,MAAM,GAAG,WAAW,GAAG,EAAG,SAAQ,IAAI,EAAE;AAAA,QAC9C;AACA,YAAI,SAAS,KAAK;AAChB,gBAAM,OAAO,cAAc,SAAS,MAAM;AAC1C,cAAI,QAAQ,KAAK,WAAW,GAAG,EAAG,SAAQ,IAAI,IAAI;AAAA,QACpD;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,KAAK,OAAO,EAAE,KAAK;AAAA,EAClC;AAAA;AAAA,EAIQ,mBAAmB,KAAqC;AAC9D,UAAM,cAAsC,CAAC;AAC7C,UAAM,OAAO,oBAAI,IAAY;AAE7B,yBAAAA,SAAS,KAAK;AAAA,MACZ,wBAAwB,CAAC,aAAa;AACpC,cAAM,OAAO,SAAS,KAAK;AAC3B,YACE,CAAG,qBAAiB,IAAI,KACxB,CAAG,uBAAmB,KAAK,MAAM,KACjC,CAAG,iBAAa,KAAK,OAAO,MAAM,KAClC,CAAG,iBAAa,KAAK,OAAO,QAAQ,KACpC,KAAK,OAAO,SAAS,SAAS,OAC9B;AACA;AAAA,QACF;AACA,cAAM,WAAW,KAAK,UAAU,CAAC;AACjC,YAAI,CAAG,8BAA0B,QAAQ,KAAK,CAAG,yBAAqB,QAAQ,EAAG;AAEjF,cAAM,YAAY,SAAS;AAAA,UAAW,CAAC,MACrC,EAAE,aAAa;AAAA,QACjB;AACA,cAAM,gBAAgB,YAAY,kBAAkB,UAAU,KAAK,cAAc,IAAI;AACrF,cAAM,gBACJ,aAAa,gBACT,wBAAwB,eAAe,UAAU,KAAK,cAAc,IACpE;AACN,cAAM,kBAAkB,mBAAmB,UAAU,oBAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;AAK1E,YAAI,kBAAkB,SAAU;AAChC,cAAM,gBACH,kBAAkB,QAAQ,aAAa,IAAI,aAAa,KACzD,kBAAkB,UAClB;AACF,YAAI,CAAC,cAAe;AAEpB,cAAM,aAAa,KAAK,OAAO,OAAO;AACtC,YAAI,KAAK,IAAI,UAAU,EAAG;AAC1B,aAAK,IAAI,UAAU;AAEnB,cAAM,YAAY,oBAAoB,QAAQ;AAC9C,cAAM,gBAAgB,wBAAwB,UAAU,SAAS;AACjE,cAAM,WAAW,mBAAmB,UAAU,SAAS;AACvD,cAAM,YAAY,oBAAoB,QAAQ;AAC9C,cAAM,WAAW,cAAc,YAAY,aAAa;AACxD,cAAM,iBAAiB,oBAAoB,UAAU,aAAa;AAElE,oBAAY,KAAK;AAAA,UACf,IAAI;AAAA,UACJ,WAAW,iBAAiB;AAAA,UAC5B,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,UAC/B;AAAA,UACA,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,UAC/B,GAAI,cAAc,SAAS,IAAI,EAAE,cAAc,IAAI,CAAC;AAAA,UACpD,GAAI,YAAY,EAAE,WAAW,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC;AAAA,UAC1D,GAAI,eAAe,SAAS,IAAI,EAAE,eAAe,IAAI,CAAC;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AACF;AAYA,SAAS,uBAAuB,QAAyD;AACvF,SACK,iBAAa,MAAM,KAAK,OAAO,SAAS,oBACxC,uBAAmB,MAAM,KACxB,iBAAa,OAAO,QAAQ,KAC9B,OAAO,SAAS,SAAS;AAE/B;AAGA,SAAS,eAAe,MAAuB;AAC7C,MAAM,oBAAgB,IAAI,KAAO,qBAAiB,IAAI,KAAO,qBAAiB,IAAI,GAAG;AACnF,WAAO,KAAK;AAAA,EACd;AACA,MAAM,kBAAc,IAAI,EAAG,QAAO;AAClC,MAAM,sBAAkB,IAAI,GAAG;AAC7B,WAAO,KAAK,SACT,OAAO,CAAC,OAA2B,OAAO,QAAU,iBAAa,EAAE,CAAC,EACpE,IAAI,CAAC,OAAO,eAAe,EAAE,CAAC,EAC9B,OAAO,CAAC,UAAU,UAAU,MAAS;AAAA,EAC1C;AACA,MAAM,uBAAmB,IAAI,GAAG;AAC9B,UAAM,MAA+B,CAAC;AACtC,eAAW,QAAQ,KAAK,YAAY;AAClC,UAAI,CAAG,qBAAiB,IAAI,EAAG;AAC/B,YAAM,MAAQ,iBAAa,KAAK,GAAG,IAC/B,KAAK,IAAI,OACP,oBAAgB,KAAK,GAAG,IACxB,KAAK,IAAI,QACT;AACN,UAAI,CAAC,OAAO,CAAG,iBAAa,KAAK,KAAK,EAAG;AACzC,YAAM,QAAQ,eAAe,KAAK,KAAK;AACvC,UAAI,UAAU,OAAW,KAAI,GAAG,IAAI;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGA,SAAS,eAAe,SAA2C;AACjE,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,CAAC,aAAuC;AACnD,eAAW,SAAS,UAAU;AAC5B,UAAM,cAAU,KAAK,GAAG;AACtB,cAAM,UAAU,MAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACtD,YAAI,QAAS,OAAM,KAAK,OAAO;AAAA,MACjC,WAAa,6BAAyB,KAAK,KAAO,oBAAgB,MAAM,UAAU,GAAG;AACnF,cAAM,KAAK,MAAM,WAAW,KAAK;AAAA,MACnC,WAAa,iBAAa,KAAK,GAAG;AAChC,aAAK,MAAM,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACA,OAAK,QAAQ,QAAQ;AACrB,QAAM,OAAO,MAAM,KAAK,GAAG,EAAE,KAAK;AAClC,SAAO,KAAK,SAAS,IAAI,OAAO;AAClC;AAGA,SAAS,wBAAwB,MAAkC;AACjE,MAAM,iBAAa,IAAI,EAAG,QAAO,KAAK;AACtC,MAAM,8BAA0B,IAAI,KAAO,yBAAqB,IAAI,GAAG;AACrE,WAAO,wBAAwB,KAAK,IAAI;AAAA,EAC1C;AACA,MAAM,qBAAiB,IAAI,GAAG;AAC5B,eAAW,aAAa,KAAK,MAAM;AACjC,YAAM,UAAU,wBAAwB,SAAS;AACjD,UAAI,QAAS,QAAO;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AACA,MAAM,0BAAsB,IAAI,EAAG,QAAO,wBAAwB,KAAK,UAAU;AACjF,MAAM,sBAAkB,IAAI,GAAG;AAC7B,WAAO,KAAK,WAAW,wBAAwB,KAAK,QAAQ,IAAI;AAAA,EAClE;AACA,MAAM,sBAAkB,IAAI,KAAO,sBAAkB,IAAI,GAAG;AAC1D,WAAO,wBAAwB,KAAK,QAAQ;AAAA,EAC9C;AACA,MAAM,qBAAiB,IAAI,GAAG;AAE5B,QAAM,iBAAa,KAAK,MAAM,KAAK,CAAC,6BAA6B,KAAK,KAAK,OAAO,IAAI,GAAG;AACvF,aAAO,KAAK,OAAO;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,sBAAsB,MAAuB;AACpD,MAAI,QAAQ;AACZ,uBAAAA;AAAA,IACE;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,gBAAgB,CAAC,aAAkB;AACjC,cAAM,SAAU,SAAS,KAA0B;AACnD,YAAM,iBAAa,MAAM,KAAK,OAAO,SAAS,UAAW,SAAQ;AACjE,YACI,uBAAmB,MAAM,KACzB,iBAAa,OAAO,MAAM,KAC5B,OAAO,OAAO,SAAS,YACrB,iBAAa,OAAO,QAAQ,KAC9B,OAAO,SAAS,SAAS,WACzB;AACA,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aACP,SACA,MACmB;AACnB,SAAO,EAAE,GAAI,WAAW,CAAC,GAAI,GAAG,KAAK;AACvC;AAOA,SAAS,cAAc,SAA8B,UAAsC;AACzF,QAAM,UAAU,cAAc,SAAS,QAAQ;AAC/C,MAAI,QAAS,QAAO;AACpB,QAAM,OAAO,QAAQ,WAAW;AAAA,IAC9B,CAAC,cACG,mBAAe,SAAS,KACxB,oBAAgB,UAAU,IAAI,KAChC,UAAU,KAAK,SAAS;AAAA,EAC5B;AACA,MAAI,CAAC,MAAM,SAAS,CAAG,6BAAyB,KAAK,KAAK,EAAG,QAAO;AACpE,SAAO,gBAAgB,KAAK,MAAM,UAAU;AAC9C;AAEA,SAAS,QAAQ,OAAuB;AACtC,SAAO,MACJ,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MACJ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAY,EACZ,QAAQ,cAAc,EAAE;AAC7B;AAEA,SAAS,wBAAwB,MAAuB;AACtD,SAAO,sDAAsD,KAAK,IAAI;AACxE;AAIA,SAAS,oBAAoB,UAAmC;AAC9D,QAAM,QAAQ,oBAAI,IAAY,CAAC,MAAM,CAAC;AACtC,QAAM,aAAa,SAAS,OAAO,CAAC;AACpC,MAAM,iBAAa,UAAU,EAAG,OAAM,IAAI,WAAW,IAAI;AACzD,MAAM,oBAAgB,UAAU,GAAG;AACjC,eAAW,QAAQ,WAAW,YAAY;AACxC,UAAM,qBAAiB,IAAI,KAAO,iBAAa,KAAK,GAAG,KAAO,iBAAa,KAAK,KAAK,GAAG;AACtF,cAAM,IAAI,KAAK,MAAM,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,UAAsB,WAAkC;AACvF,QAAM,SAAS,oBAAI,IAAY;AAC/B,MAAI,CAAC,SAAS,KAAM,QAAO,CAAC;AAC5B,uBAAAA;AAAA,IACE,SAAS;AAAA,IACT;AAAA,MACE,SAAS;AAAA,MACT,kBAAkB,CAAC,aAAkB;AACnC,cAAM,OAAO,SAAS;AACtB,YACI,iBAAa,KAAK,MAAM,KAC1B,UAAU,IAAI,KAAK,OAAO,IAAI,KAC5B,iBAAa,KAAK,QAAQ,GAC5B;AACA,iBAAO,IAAI,KAAK,SAAS,IAAI;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,MAAM,EAAE,KAAK;AACjC;AAEA,SAAS,mBAAmB,UAAsB,WAA4C;AAC5F,MAAI;AACJ,MAAI,CAAC,SAAS,KAAM,QAAO;AAC3B,uBAAAA;AAAA,IACE,SAAS;AAAA,IACT;AAAA,MACE,SAAS;AAAA,MACT,cAAc,CAAC,aAAkB;AAC/B,cAAM,OAAO,SAAS;AACtB,YAAI,CAAG,oBAAgB,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,MAAO;AAC/D,YAAI,CAAC,KAAK,SAAS,CAAG,6BAAyB,KAAK,KAAK,EAAG;AAC5D,cAAM,OAAO,KAAK,MAAM;AACxB,YACI,uBAAmB,IAAI,KACvB,iBAAa,KAAK,MAAM,KAC1B,UAAU,IAAI,KAAK,OAAO,IAAI,KAC5B,iBAAa,KAAK,QAAQ,GAC5B;AACA,qBAAW,YAAY,KAAK,SAAS;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,UAAuD;AAClF,MAAI,CAAC,SAAS,KAAM,QAAO;AAC3B,QAAM,UAAU,0BAA0B,SAAS,IAAI,EAAE,KAAK,CAAC,SAAS,KAAK,UAAU;AACvF,MAAI,CAAC,SAAS,WAAY,QAAO;AACjC,SAAO;AAAA,IACL,MAAM;AAAA;AAAA,IAEN,cAAc,QAAQ;AAAA,IACtB,aAAa,wBAAwB,QAAQ,UAAU;AAAA,EACzD;AACF;AAEA,SAAS,mBAAmB,UAAsB,MAA4B;AAC5E,MAAI,QAAQ;AACZ,QAAM,UAAU,CAAC,SAAoC;AACnD,QAAI,CAAC,QAAQ,MAAO;AACpB,QAAM,iBAAa,IAAI,GAAG;AACxB,YAAM,OAAO,kBAAkB,KAAK,cAAc;AAClD,UAAI,QAAQ,KAAK,IAAI,IAAI,EAAG,SAAQ;AACpC;AAAA,IACF;AACA,QAAM,qBAAiB,IAAI,GAAG;AAC5B,iBAAW,aAAa,KAAK,MAAM;AACjC,YAAM,sBAAkB,SAAS,EAAG,SAAQ,UAAU,QAAQ;AAAA,MAChE;AAAA,IACF;AACA,QAAM,8BAA0B,IAAI,EAAG,SAAQ,KAAK,UAAU;AAC9D,QAAM,4BAAwB,IAAI,GAAG;AACnC,cAAQ,KAAK,UAAU;AACvB,cAAQ,KAAK,SAAS;AAAA,IACxB;AAAA,EACF;AACA,UAAQ,SAAS,IAAI;AACrB,SAAO;AACT;AAEA,SAAS,cAAc,YAAoB,eAA6C;AACtF,QAAM,WAAW,WACd,QAAQ,YAAY,EAAE,EACtB,QAAQ,qCAAqC,EAAE,EAC/C,QAAQ,OAAO,EAAE;AACpB,QAAM,YAAY,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,SAAS,MAAM,CAAC;AACrE,MAAI,UAAU,SAAS,EAAG,QAAO;AACjC,MAAI,cAAc,SAAS,EAAG,QAAO;AACrC,SAAO;AACT;AAGA,SAAS,oBAAoB,UAA8B,eAAmC;AAC5F,QAAM,MAAM,oBAAI,IAAY;AAC5B,MAAI,SAAU,KAAI,IAAI,QAAQ;AAC9B,aAAW,SAAS,eAAe;AACjC,QAAI,yCAAyC,KAAK,KAAK,EAAG,KAAI,IAAI,KAAK;AAAA,EACzE;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;;;AI/zCA,IAAAC,aAA+B;AAC/B,IAAAC,eAAiB;AACjB,IAAAC,oBAAiB;AACjB,IAAAC,oBAAqB;AACrB,IAAAC,MAAmB;AA4CZ,IAAM,qBAAqB;AAa3B,IAAM,wBAAN,MAA4B;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YACE,QACA,SACA;AACA,SAAK,SAAS;AACd,SAAK,oBAAoB,SAAS,qBAAqB,CAAC;AACxD,SAAK,oBAAoB,SAAS,qBAAqB,CAAC;AAAA,EAC1D;AAAA,EAEA,MAAM,UAAwC;AAC5C,UAAM,QAAQ,MAAM,KAAK,eAAe;AACxC,UAAM,SAAqB,CAAC;AAE5B,eAAW,YAAY,OAAO;AAC5B,UAAI;AACF,cAAM,UAAU,MAAM,WAAAC,SAAG,SAAS,UAAU,OAAO;AAEnD,YAAI,CAAC,gFAAgF,KAAK,OAAO,GAAG;AAClG;AAAA,QACF;AACA,cAAM,MAAM,YAAY,SAAS,KAAK,OAAO,aAAoB;AACjE,eAAO,KAAK,GAAG,KAAK,iBAAiB,GAAG,CAAC;AACzC,eAAO,KAAK,GAAG,KAAK,oBAAoB,GAAG,CAAC;AAAA,MAC9C,SAASC,QAAO;AACd,gBAAQ,KAAK,2CAA2C,QAAQ,KAAKA,MAAK;AAAA,MAC5E;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,aAAa,MAAM;AACxC,WAAO,EAAE,OAAO,KAAK,WAAW,OAAO,GAAG,QAAQ,QAAQ;AAAA,EAC5D;AAAA;AAAA,EAGA,MAAc,iBAAoC;AAChD,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,KAAK;AAAA,IACV;AACA,UAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,KAAK,OAAO,WAAW,CAAC;AAAA,MAC5B,GAAG,KAAK;AAAA,IACV;AACA,UAAM,QAAQ,UAAM,kBAAAC,SAAK,UAAU,EAAE,KAAK,KAAK,OAAO,SAAS,OAAO,CAAC;AACvE,WAAO,MAAM,IAAI,CAACC,UAAS,aAAAC,QAAK,KAAK,KAAK,OAAO,SAASD,KAAI,CAAC;AAAA,EACjE;AAAA;AAAA,EAIQ,iBAAiB,KAAyB;AAChD,UAAM,SAAqB,CAAC;AAE5B,UAAM,aAAa,CAAC,SAAuB,eAAuB;AAChE,YAAM,UAAU,QAAQ;AACxB,YAAM,OAAO,kBAAkB,OAAO;AACtC,UAAI,SAAS,SAAS;AAEpB,mBAAW,SAAS,QAAQ,UAAU;AACpC,cAAM,iBAAa,KAAK,EAAG,YAAW,OAAO,UAAU;AAAA,QACzD;AACA;AAAA,MACF;AAEA,YAAM,UAAU,cAAc,SAAS,MAAM;AAC7C,YAAM,UAAU,gBAAgB,SAAS,OAAO,KAAK,CAAC;AACtD,YAAM,WAAW,KAAK,UAAU,YAAY,SAAS,OAAO;AAC5D,YAAM,gBACJ,KAAK,6BAA6B,OAAO,KAAK;AAEhD,YAAM,SAAS,CAAC,QAAQ,SAAS;AAAA,QAC/B,CAAC,UAAY,iBAAa,KAAK,KAAK,kBAAkB,MAAM,cAAc,MAAM;AAAA,MAClF;AAEA,WAAK,WAAW,aAAa,iBAAiB,SAAS;AACrD,eAAO,KAAK,KAAK,WAAW,UAAU,eAAe,SAAS,CAAC,MAAM,CAAC;AAAA,MACxE;AAEA,iBAAW,SAAS,QAAQ,UAAU;AACpC,YAAM,iBAAa,KAAK,EAAG,YAAW,OAAO,QAAQ;AAAA,MACvD;AAAA,IACF;AAEA,0BAAAE,SAAS,KAAK;AAAA,MACZ,YAAY,CAAC,aAAa;AACxB,cAAM,OAAO,kBAAkB,SAAS,KAAK,cAAc;AAC3D,YAAI,SAAS,YAAY,SAAS,QAAS;AAG3C,YAAI,SAAS,WAAW,CAAC,MAAM;AAC7B,cAAI,CAAC,EAAE,aAAa,EAAG,QAAO;AAC9B,gBAAM,aAAa,kBAAkB,EAAE,KAAK,cAAc;AAC1D,iBAAO,eAAe,YAAY,eAAe;AAAA,QACnD,CAAC,GAAG;AACF;AAAA,QACF;AACA,mBAAW,SAAS,MAAM,EAAE;AAAA,MAC9B;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,6BAA6B,SAA6C;AAChF,eAAW,QAAQ,QAAQ,YAAY;AACrC,UAAI,CAAG,mBAAe,IAAI,KAAK,CAAG,oBAAgB,KAAK,IAAI,EAAG;AAC9D,UAAI,KAAK,KAAK,SAAS,aAAe,6BAAyB,KAAK,KAAK,GAAG;AAC1E,cAAM,OAAO,KAAK,MAAM;AACxB,YAAM,iBAAa,IAAI,EAAG,QAAO,kBAAkB,KAAK,cAAc;AAAA,MACxE;AACA,UAAI,KAAK,KAAK,SAAS,eAAiB,6BAAyB,KAAK,KAAK,GAAG;AAC5E,YAAM,iBAAa,KAAK,MAAM,UAAU,EAAG,QAAO,KAAK,MAAM,WAAW;AAAA,MAC1E;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,oBAAoB,KAAyB;AACnD,UAAM,SAAqB,CAAC;AAC5B,UAAM,mBAAmB,oBAAI,IAAI;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,0BAAAA,SAAS,KAAK;AAAA,MACZ,gBAAgB,CAAC,aAAa;AAC5B,cAAM,SAAS,SAAS,KAAK;AAC7B,YAAI,CAAG,iBAAa,MAAM,KAAK,CAAC,iBAAiB,IAAI,OAAO,IAAI,EAAG;AACnE,cAAM,QAAQ,SAAS,KAAK,UAAU,CAAC;AACvC,YAAI,CAAG,sBAAkB,KAAK,EAAG;AACjC,aAAK,kBAAkB,OAAO,IAAI,MAAM;AAAA,MAC1C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,KAAwB,YAAoB,KAAuB;AAC3F,eAAW,WAAW,IAAI,UAAU;AAClC,UAAI,CAAG,uBAAmB,OAAO,EAAG;AAEpC,UAAI;AACJ,UAAI,UAAU;AACd,UAAI;AACJ,UAAI;AAEJ,iBAAW,QAAQ,QAAQ,YAAY;AACrC,YAAI,CAAG,qBAAiB,IAAI,KAAK,CAAG,iBAAa,KAAK,GAAG,EAAG;AAC5D,cAAM,MAAM,KAAK,IAAI;AACrB,YAAI,QAAQ,UAAY,oBAAgB,KAAK,KAAK,EAAG,WAAU,KAAK,MAAM;AAC1E,YAAI,QAAQ,WAAa,qBAAiB,KAAK,KAAK,EAAG,WAAU,KAAK,MAAM;AAC5E,YAAI,QAAQ,aAAe,iBAAa,KAAK,KAAK,GAAG;AACnD,0BAAgB,kBAAkB,KAAK,MAAM,cAAc,KAAK;AAAA,QAClE;AACA,YAAI,QAAQ,eAAiB,iBAAa,KAAK,KAAK,EAAG,iBAAgB,KAAK,MAAM;AAClF,YAAI,QAAQ,cAAgB,sBAAkB,KAAK,KAAK,EAAG,YAAW,KAAK;AAAA,MAC7E;AAEA,YAAM,WAAW,KAAK,UAAU,YAAY,SAAS,OAAO;AAC5D,WAAK,YAAY,UAAa,aAAa,iBAAiB,CAAC,WAAW;AACtE,YAAI,KAAK,KAAK,WAAW,UAAU,eAAe,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAC/E;AACA,UAAI,SAAU,MAAK,kBAAkB,UAAU,UAAU,GAAG;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA,EAIQ,UAAU,QAAgB,SAA6B,SAA0B;AACvF,QAAI,WAAW,YAAY,OAAW,QAAO,UAAU;AACvD,QAAI,QAAQ,WAAW,GAAG,EAAG,QAAO,KAAK,cAAc,OAAO;AAC9D,WAAO,KAAK,cAAc,GAAG,WAAW,MAAM,KAAK,MAAM,IAAI,OAAO,EAAE;AAAA,EACxE;AAAA,EAEQ,cAAc,GAAmB;AACvC,UAAM,UAAU,IAAI,CAAC,GAAG,QAAQ,QAAQ,GAAG;AAC3C,WAAO,QAAQ,SAAS,IAAI,QAAQ,QAAQ,OAAO,EAAE,IAAI;AAAA,EAC3D;AAAA,EAEQ,WACN,UACA,eACA,SACA,UACU;AACV,UAAM,SAAS,KAAK,eAAe,QAAQ;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY,iBAAiB,mBAAmB,QAAQ;AAAA,MACxD,GAAI,OAAO,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,MACtC,GAAI,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,MACjC,GAAI,WAAW,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AAAA,EAEQ,eAAe,WAAsC;AAC3D,UAAM,SAA4B,CAAC;AACnC,eAAW,WAAW,UAAU,MAAM,GAAG,GAAG;AAC1C,UAAI,CAAC,QAAQ,WAAW,GAAG,EAAG;AAC9B,YAAM,WAAW,QAAQ,SAAS,GAAG;AACrC,YAAM,OAAO,QAAQ,MAAM,GAAG,WAAW,KAAK,MAAS;AACvD,UAAI,KAAM,QAAO,KAAK,EAAE,MAAM,MAAM,UAAU,UAAU,CAAC,SAAS,CAAC;AAAA,IACrE;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,aAAa,QAAgC;AACnD,UAAM,SAAS,oBAAI,IAAsB;AACzC,eAAW,SAAS,QAAQ;AAC1B,YAAM,WAAW,OAAO,IAAI,MAAM,IAAI;AACtC,UAAI,CAAC,YAAY,WAAW,KAAK,IAAI,WAAW,QAAQ,GAAG;AACzD,eAAO,IAAI,MAAM,MAAM,KAAK;AAAA,MAC9B;AAAA,IACF;AACA,WAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AAAA,EACnC;AAAA,EAEQ,WAAW,QAAqC;AACtD,UAAM,UAA0C,CAAC;AACjD,UAAM,gBAAgB;AACtB,UAAM,cAAc,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU;AAElD,eAAW,SAAS,QAAQ;AAC1B,YAAM,SAAS,YAAY,OAAO,CAAC,SAAS,SAAS,MAAM,UAAU;AACrE,cAAQ,MAAM,UAAU,IAAI;AAAA,QAC1B,YAAY,MAAM;AAAA;AAAA,QAElB,eAAe;AAAA,QACf,iBAAiB;AAAA;AAAA;AAAA,QAGjB,eAAe;AAAA,QACf,aAAa;AAAA,QACb,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,eACJ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK,KAAK,OAAO,CAAC;AAE/E,WAAO;AAAA,MACL;AAAA,MACA,eAAe,cAAc,cAAc;AAAA,MAC3C,YAAY,OAAO,SAAS,IACxB,CAAC;AAAA,QACC,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX,CAAC,IACD,CAAC;AAAA,IACP;AAAA,EACF;AACF;AAGO,SAAS,mBAAmB,WAA2B;AAC5D,MAAI,cAAc,OAAO,cAAc,GAAI,QAAO;AAClD,SAAO,UACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAAC,YAAY,QAAQ,QAAQ,MAAM,EAAE,EAAE,QAAQ,OAAO,EAAE,CAAC,EAC7D;AAAA,IAAI,CAAC,YACJ,QACG,MAAM,OAAO,EACb,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AAAA,EACZ,EACC,KAAK,EAAE;AACZ;AAGA,SAAS,WAAW,OAAyB;AAC3C,QAAM,SAAS,MAAM,SAAS,IAAI;AAClC,QAAM,cAAc,MAAM,eAAe,mBAAmB,MAAM,IAAI,IAAI,IAAI;AAC9E,SAAO,SAAS;AAClB;AAOO,SAAS,oBAAoB,QAAoB,QAAoC;AAC1F,QAAM,aAAa,IAAI,MAAM,GAAG,QAAQ,QAAQ,GAAG,EAAE,QAAQ,SAAS,EAAE,EAAE,QAAQ,QAAQ,EAAE;AAC5F,QAAM,UAAU,WAAW,SAAS,IAAI,WAAW,QAAQ,OAAO,EAAE,IAAI;AAExE,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AACnD,MAAI,MAAO,QAAO,MAAM;AAExB,QAAM,iBAAiB,QAAQ,MAAM,GAAG,EAAE,OAAO,OAAO;AACxD,aAAW,SAAS,QAAQ;AAC1B,UAAM,gBAAgB,MAAM,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC1D,QAAI,cAAc,WAAW,eAAe,OAAQ;AACpD,UAAM,UAAU,cAAc;AAAA,MAC5B,CAAC,KAAK,MAAM,IAAI,WAAW,GAAG,KAAK,QAAQ,OAAO,QAAQ,eAAe,CAAC;AAAA,IAC5E;AACA,QAAI,QAAS,QAAO,MAAM;AAAA,EAC5B;AACA,SAAO;AACT;;;AC5VO,IAAM,2BAAN,MAA2D;AAAA,EACvD,WAAW;AAAA,EAEpB,MAAM,QACJ,QACA,SACiC;AACjC,UAAM,iBAAiB,IAAI,kBAAkB,QAAQ;AAAA,MACnD,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AACD,UAAM,qBAAqB,IAAI,sBAAsB,QAAQ;AAAA,MAC3D,mBAAmB,QAAQ;AAAA,MAC3B,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AAED,YAAQ,IAAI,iDAAiD;AAC7D,UAAM,CAAC,gBAAgB,gBAAgB,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC3D,eAAe,QAAQ;AAAA,MACvB,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AAED,UAAM,mBAAmB,IAAI,IAAI,iBAAiB,OAAO,IAAI,CAAC,UAAU,MAAM,UAAU,CAAC;AACzF,UAAM,gBAAgB,QAAQ,iBAAiB;AAE/C,QAAI,qBAAqB;AACzB,UAAM,WAAiC,CAAC;AACxC,eAAW,aAAa,eAAe,YAAY;AACjD,UAAI,CAAC,iBAAiB,KAAK,SAAS,WAAW,gBAAgB,GAAG;AAChE,iBAAS,KAAK,SAAS;AAAA,MACzB,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,SAAS;AAAA,MAAI,CAAC,cAC5B,KAAK,kBAAkB,UAAU,YAAY,iBAAiB,MAAM;AAAA,IACtE;AAEA,YAAQ;AAAA,MACN,6EAA6E,QAAQ,MAAM,aAAa,iBAAiB,OAAO,MAAM;AAAA,IACxI;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY,iBAAiB;AAAA,MAC7B,eAAe,eAAe;AAAA,MAC9B,GAAI,qBAAqB,IAAI,EAAE,mBAAmB,IAAI,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,SAAS,WAA+B,kBAAwC;AACtF,WACE,UAAU,qBACV,UAAU,wBACV,iBAAiB,IAAI,UAAU,WAAW,IAAI;AAAA,EAElD;AAAA;AAAA,EAGQ,kBAAkB,QAA0B,QAAsC;AACxF,UAAMC,WAAU,CAAC,WAAmD;AAClE,UAAI,CAAC,UAAU,CAAC,OAAO,WAAW,GAAG,EAAG,QAAO;AAC/C,aAAO,oBAAoB,QAAQ,MAAM,KAAK;AAAA,IAChD;AAEA,UAAM,oBAAoB,MAAM;AAAA,MAC9B,IAAI;AAAA,QACF,OAAO,kBACJ,IAAI,CAAC,WAAWA,SAAQ,MAAM,CAAE,EAEhC,OAAO,CAAC,WAAW,WAAW,OAAO,IAAI;AAAA,MAC9C;AAAA,IACF,EAAE,KAAK;AAEP,UAAM,UAAU,OAAO,QAAQ,IAAI,CAAC,WAA6B;AAC/D,YAAM,WAAWA,SAAQ,OAAO,YAAY;AAC5C,aAAO,aAAa,OAAO,eAAe,SAAS,EAAE,GAAG,QAAQ,cAAc,SAAS;AAAA,IACzF,CAAC;AAED,UAAM,cAAc,OAAO,aAAa,IAAI,CAAC,eAAe;AAC1D,YAAM,aAAa,CAAC,QAAqC;AACvD,YAAI,CAAC,KAAK,aAAc,QAAO;AAC/B,cAAM,WAAWA,SAAQ,IAAI,YAAY;AACzC,YAAI,aAAa,IAAI,aAAc,QAAO;AAC1C,eAAO;AAAA,UACL,GAAG;AAAA,UACH,cAAc;AAAA,UACd,GAAI,IAAI,cAAc,EAAE,aAAa,wBAAwB,QAAQ,GAAG,IAAI,CAAC;AAAA,QAC/E;AAAA,MACF;AACA,YAAM,YAAY,WAAW,WAAW,SAAS;AACjD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,QACjC,GAAI,WAAW,aACX,EAAE,YAAY,WAAW,WAAW,IAAI,CAAC,QAAQ,WAAW,GAAG,CAAE,EAAE,IACnE,CAAC;AAAA,MACP;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACvC;AAAA,EACF;AACF;;;AC9IA,IAAAC,mBAAyB;AACzB,IAAAC,oBAAiB;;;ACDjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAI;AAAA,CACV,SAAUC,OAAM;AACb,EAAAA,MAAK,cAAc,CAAC,MAAM;AAAA,EAAE;AAC5B,WAAS,SAAS,MAAM;AAAA,EAAE;AAC1B,EAAAA,MAAK,WAAW;AAChB,WAAS,YAAY,IAAI;AACrB,UAAM,IAAI,MAAM;AAAA,EACpB;AACA,EAAAA,MAAK,cAAc;AACnB,EAAAA,MAAK,cAAc,CAAC,UAAU;AAC1B,UAAM,MAAM,CAAC;AACb,eAAW,QAAQ,OAAO;AACtB,UAAI,IAAI,IAAI;AAAA,IAChB;AACA,WAAO;AAAA,EACX;AACA,EAAAA,MAAK,qBAAqB,CAAC,QAAQ;AAC/B,UAAM,YAAYA,MAAK,WAAW,GAAG,EAAE,OAAO,CAAC,MAAM,OAAO,IAAI,IAAI,CAAC,CAAC,MAAM,QAAQ;AACpF,UAAM,WAAW,CAAC;AAClB,eAAW,KAAK,WAAW;AACvB,eAAS,CAAC,IAAI,IAAI,CAAC;AAAA,IACvB;AACA,WAAOA,MAAK,aAAa,QAAQ;AAAA,EACrC;AACA,EAAAA,MAAK,eAAe,CAAC,QAAQ;AACzB,WAAOA,MAAK,WAAW,GAAG,EAAE,IAAI,SAAU,GAAG;AACzC,aAAO,IAAI,CAAC;AAAA,IAChB,CAAC;AAAA,EACL;AACA,EAAAA,MAAK,aAAa,OAAO,OAAO,SAAS,aACnC,CAAC,QAAQ,OAAO,KAAK,GAAG,IACxB,CAAC,WAAW;AACV,UAAM,OAAO,CAAC;AACd,eAAW,OAAO,QAAQ;AACtB,UAAI,OAAO,UAAU,eAAe,KAAK,QAAQ,GAAG,GAAG;AACnD,aAAK,KAAK,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACJ,EAAAA,MAAK,OAAO,CAAC,KAAK,YAAY;AAC1B,eAAW,QAAQ,KAAK;AACpB,UAAI,QAAQ,IAAI;AACZ,eAAO;AAAA,IACf;AACA,WAAO;AAAA,EACX;AACA,EAAAA,MAAK,YAAY,OAAO,OAAO,cAAc,aACvC,CAAC,QAAQ,OAAO,UAAU,GAAG,IAC7B,CAAC,QAAQ,OAAO,QAAQ,YAAY,OAAO,SAAS,GAAG,KAAK,KAAK,MAAM,GAAG,MAAM;AACtF,WAAS,WAAW,OAAO,YAAY,OAAO;AAC1C,WAAO,MAAM,IAAI,CAAC,QAAS,OAAO,QAAQ,WAAW,IAAI,GAAG,MAAM,GAAI,EAAE,KAAK,SAAS;AAAA,EAC1F;AACA,EAAAA,MAAK,aAAa;AAClB,EAAAA,MAAK,wBAAwB,CAAC,GAAG,UAAU;AACvC,QAAI,OAAO,UAAU,UAAU;AAC3B,aAAO,MAAM,SAAS;AAAA,IAC1B;AACA,WAAO;AAAA,EACX;AACJ,GAAG,SAAS,OAAO,CAAC,EAAE;AACf,IAAI;AAAA,CACV,SAAUC,aAAY;AACnB,EAAAA,YAAW,cAAc,CAAC,OAAO,WAAW;AACxC,WAAO;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA;AAAA,IACP;AAAA,EACJ;AACJ,GAAG,eAAe,aAAa,CAAC,EAAE;AAC3B,IAAM,gBAAgB,KAAK,YAAY;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACM,IAAM,gBAAgB,CAAC,SAAS;AACnC,QAAMC,MAAI,OAAO;AACjB,UAAQA,KAAG;AAAA,IACP,KAAK;AACD,aAAO,cAAc;AAAA,IACzB,KAAK;AACD,aAAO,cAAc;AAAA,IACzB,KAAK;AACD,aAAO,OAAO,MAAM,IAAI,IAAI,cAAc,MAAM,cAAc;AAAA,IAClE,KAAK;AACD,aAAO,cAAc;AAAA,IACzB,KAAK;AACD,aAAO,cAAc;AAAA,IACzB,KAAK;AACD,aAAO,cAAc;AAAA,IACzB,KAAK;AACD,aAAO,cAAc;AAAA,IACzB,KAAK;AACD,UAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,eAAO,cAAc;AAAA,MACzB;AACA,UAAI,SAAS,MAAM;AACf,eAAO,cAAc;AAAA,MACzB;AACA,UAAI,KAAK,QAAQ,OAAO,KAAK,SAAS,cAAc,KAAK,SAAS,OAAO,KAAK,UAAU,YAAY;AAChG,eAAO,cAAc;AAAA,MACzB;AACA,UAAI,OAAO,QAAQ,eAAe,gBAAgB,KAAK;AACnD,eAAO,cAAc;AAAA,MACzB;AACA,UAAI,OAAO,QAAQ,eAAe,gBAAgB,KAAK;AACnD,eAAO,cAAc;AAAA,MACzB;AACA,UAAI,OAAO,SAAS,eAAe,gBAAgB,MAAM;AACrD,eAAO,cAAc;AAAA,MACzB;AACA,aAAO,cAAc;AAAA,IACzB;AACI,aAAO,cAAc;AAAA,EAC7B;AACJ;;;ACnIO,IAAM,eAAe,KAAK,YAAY;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;AACM,IAAM,gBAAgB,CAAC,QAAQ;AAClC,QAAM,OAAO,KAAK,UAAU,KAAK,MAAM,CAAC;AACxC,SAAO,KAAK,QAAQ,eAAe,KAAK;AAC5C;AACO,IAAM,WAAN,MAAM,kBAAiB,MAAM;AAAA,EAChC,IAAI,SAAS;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,YAAY,QAAQ;AAChB,UAAM;AACN,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,CAAC,QAAQ;AACrB,WAAK,SAAS,CAAC,GAAG,KAAK,QAAQ,GAAG;AAAA,IACtC;AACA,SAAK,YAAY,CAAC,OAAO,CAAC,MAAM;AAC5B,WAAK,SAAS,CAAC,GAAG,KAAK,QAAQ,GAAG,IAAI;AAAA,IAC1C;AACA,UAAM,cAAc,WAAW;AAC/B,QAAI,OAAO,gBAAgB;AAEvB,aAAO,eAAe,MAAM,WAAW;AAAA,IAC3C,OACK;AACD,WAAK,YAAY;AAAA,IACrB;AACA,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAClB;AAAA,EACA,OAAO,SAAS;AACZ,UAAM,SAAS,WACX,SAAU,OAAO;AACb,aAAO,MAAM;AAAA,IACjB;AACJ,UAAM,cAAc,EAAE,SAAS,CAAC,EAAE;AAClC,UAAM,eAAe,CAACC,WAAU;AAC5B,iBAAW,SAASA,OAAM,QAAQ;AAC9B,YAAI,MAAM,SAAS,iBAAiB;AAChC,gBAAM,YAAY,IAAI,YAAY;AAAA,QACtC,WACS,MAAM,SAAS,uBAAuB;AAC3C,uBAAa,MAAM,eAAe;AAAA,QACtC,WACS,MAAM,SAAS,qBAAqB;AACzC,uBAAa,MAAM,cAAc;AAAA,QACrC,WACS,MAAM,KAAK,WAAW,GAAG;AAC9B,sBAAY,QAAQ,KAAK,OAAO,KAAK,CAAC;AAAA,QAC1C,OACK;AACD,cAAI,OAAO;AACX,cAAI,IAAI;AACR,iBAAO,IAAI,MAAM,KAAK,QAAQ;AAC1B,kBAAM,KAAK,MAAM,KAAK,CAAC;AACvB,kBAAM,WAAW,MAAM,MAAM,KAAK,SAAS;AAC3C,gBAAI,CAAC,UAAU;AACX,mBAAK,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE;AAAA,YAQzC,OACK;AACD,mBAAK,EAAE,IAAI,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE;AACrC,mBAAK,EAAE,EAAE,QAAQ,KAAK,OAAO,KAAK,CAAC;AAAA,YACvC;AACA,mBAAO,KAAK,EAAE;AACd;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AACA,iBAAa,IAAI;AACjB,WAAO;AAAA,EACX;AAAA,EACA,OAAO,OAAO,OAAO;AACjB,QAAI,EAAE,iBAAiB,YAAW;AAC9B,YAAM,IAAI,MAAM,mBAAmB,KAAK,EAAE;AAAA,IAC9C;AAAA,EACJ;AAAA,EACA,WAAW;AACP,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK,UAAU,KAAK,QAAQ,KAAK,uBAAuB,CAAC;AAAA,EACpE;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK,OAAO,WAAW;AAAA,EAClC;AAAA,EACA,QAAQ,SAAS,CAAC,UAAU,MAAM,SAAS;AACvC,UAAM,cAAc,CAAC;AACrB,UAAM,aAAa,CAAC;AACpB,eAAW,OAAO,KAAK,QAAQ;AAC3B,UAAI,IAAI,KAAK,SAAS,GAAG;AACrB,cAAM,UAAU,IAAI,KAAK,CAAC;AAC1B,oBAAY,OAAO,IAAI,YAAY,OAAO,KAAK,CAAC;AAChD,oBAAY,OAAO,EAAE,KAAK,OAAO,GAAG,CAAC;AAAA,MACzC,OACK;AACD,mBAAW,KAAK,OAAO,GAAG,CAAC;AAAA,MAC/B;AAAA,IACJ;AACA,WAAO,EAAE,YAAY,YAAY;AAAA,EACrC;AAAA,EACA,IAAI,aAAa;AACb,WAAO,KAAK,QAAQ;AAAA,EACxB;AACJ;AACA,SAAS,SAAS,CAAC,WAAW;AAC1B,QAAMA,SAAQ,IAAI,SAAS,MAAM;AACjC,SAAOA;AACX;;;AClIA,IAAM,WAAW,CAAC,OAAO,SAAS;AAC9B,MAAI;AACJ,UAAQ,MAAM,MAAM;AAAA,IAChB,KAAK,aAAa;AACd,UAAI,MAAM,aAAa,cAAc,WAAW;AAC5C,kBAAU;AAAA,MACd,OACK;AACD,kBAAU,YAAY,MAAM,QAAQ,cAAc,MAAM,QAAQ;AAAA,MACpE;AACA;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU,mCAAmC,KAAK,UAAU,MAAM,UAAU,KAAK,qBAAqB,CAAC;AACvG;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU,kCAAkC,KAAK,WAAW,MAAM,MAAM,IAAI,CAAC;AAC7E;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU;AACV;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU,yCAAyC,KAAK,WAAW,MAAM,OAAO,CAAC;AACjF;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU,gCAAgC,KAAK,WAAW,MAAM,OAAO,CAAC,eAAe,MAAM,QAAQ;AACrG;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU;AACV;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU;AACV;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU;AACV;AAAA,IACJ,KAAK,aAAa;AACd,UAAI,OAAO,MAAM,eAAe,UAAU;AACtC,YAAI,cAAc,MAAM,YAAY;AAChC,oBAAU,gCAAgC,MAAM,WAAW,QAAQ;AACnE,cAAI,OAAO,MAAM,WAAW,aAAa,UAAU;AAC/C,sBAAU,GAAG,OAAO,sDAAsD,MAAM,WAAW,QAAQ;AAAA,UACvG;AAAA,QACJ,WACS,gBAAgB,MAAM,YAAY;AACvC,oBAAU,mCAAmC,MAAM,WAAW,UAAU;AAAA,QAC5E,WACS,cAAc,MAAM,YAAY;AACrC,oBAAU,iCAAiC,MAAM,WAAW,QAAQ;AAAA,QACxE,OACK;AACD,eAAK,YAAY,MAAM,UAAU;AAAA,QACrC;AAAA,MACJ,WACS,MAAM,eAAe,SAAS;AACnC,kBAAU,WAAW,MAAM,UAAU;AAAA,MACzC,OACK;AACD,kBAAU;AAAA,MACd;AACA;AAAA,IACJ,KAAK,aAAa;AACd,UAAI,MAAM,SAAS;AACf,kBAAU,sBAAsB,MAAM,QAAQ,YAAY,MAAM,YAAY,aAAa,WAAW,IAAI,MAAM,OAAO;AAAA,eAChH,MAAM,SAAS;AACpB,kBAAU,uBAAuB,MAAM,QAAQ,YAAY,MAAM,YAAY,aAAa,MAAM,IAAI,MAAM,OAAO;AAAA,eAC5G,MAAM,SAAS;AACpB,kBAAU,kBAAkB,MAAM,QAAQ,sBAAsB,MAAM,YAAY,8BAA8B,eAAe,GAAG,MAAM,OAAO;AAAA,eAC1I,MAAM,SAAS;AACpB,kBAAU,kBAAkB,MAAM,QAAQ,sBAAsB,MAAM,YAAY,8BAA8B,eAAe,GAAG,MAAM,OAAO;AAAA,eAC1I,MAAM,SAAS;AACpB,kBAAU,gBAAgB,MAAM,QAAQ,sBAAsB,MAAM,YAAY,8BAA8B,eAAe,GAAG,IAAI,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC;AAAA;AAE/J,kBAAU;AACd;AAAA,IACJ,KAAK,aAAa;AACd,UAAI,MAAM,SAAS;AACf,kBAAU,sBAAsB,MAAM,QAAQ,YAAY,MAAM,YAAY,YAAY,WAAW,IAAI,MAAM,OAAO;AAAA,eAC/G,MAAM,SAAS;AACpB,kBAAU,uBAAuB,MAAM,QAAQ,YAAY,MAAM,YAAY,YAAY,OAAO,IAAI,MAAM,OAAO;AAAA,eAC5G,MAAM,SAAS;AACpB,kBAAU,kBAAkB,MAAM,QAAQ,YAAY,MAAM,YAAY,0BAA0B,WAAW,IAAI,MAAM,OAAO;AAAA,eACzH,MAAM,SAAS;AACpB,kBAAU,kBAAkB,MAAM,QAAQ,YAAY,MAAM,YAAY,0BAA0B,WAAW,IAAI,MAAM,OAAO;AAAA,eACzH,MAAM,SAAS;AACpB,kBAAU,gBAAgB,MAAM,QAAQ,YAAY,MAAM,YAAY,6BAA6B,cAAc,IAAI,IAAI,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC;AAAA;AAEpJ,kBAAU;AACd;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU;AACV;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU;AACV;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU,gCAAgC,MAAM,UAAU;AAC1D;AAAA,IACJ,KAAK,aAAa;AACd,gBAAU;AACV;AAAA,IACJ;AACI,gBAAU,KAAK;AACf,WAAK,YAAY,KAAK;AAAA,EAC9B;AACA,SAAO,EAAE,QAAQ;AACrB;AACA,IAAO,aAAQ;;;AC3Gf,IAAI,mBAAmB;AAEhB,SAAS,YAAY,KAAK;AAC7B,qBAAmB;AACvB;AACO,SAAS,cAAc;AAC1B,SAAO;AACX;;;ACNO,IAAM,YAAY,CAAC,WAAW;AACjC,QAAM,EAAE,MAAM,MAAAC,QAAM,WAAW,UAAU,IAAI;AAC7C,QAAM,WAAW,CAAC,GAAGA,QAAM,GAAI,UAAU,QAAQ,CAAC,CAAE;AACpD,QAAM,YAAY;AAAA,IACd,GAAG;AAAA,IACH,MAAM;AAAA,EACV;AACA,MAAI,UAAU,YAAY,QAAW;AACjC,WAAO;AAAA,MACH,GAAG;AAAA,MACH,MAAM;AAAA,MACN,SAAS,UAAU;AAAA,IACvB;AAAA,EACJ;AACA,MAAI,eAAe;AACnB,QAAM,OAAO,UACR,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EACjB,MAAM,EACN,QAAQ;AACb,aAAW,OAAO,MAAM;AACpB,mBAAe,IAAI,WAAW,EAAE,MAAM,cAAc,aAAa,CAAC,EAAE;AAAA,EACxE;AACA,SAAO;AAAA,IACH,GAAG;AAAA,IACH,MAAM;AAAA,IACN,SAAS;AAAA,EACb;AACJ;AACO,IAAM,aAAa,CAAC;AACpB,SAAS,kBAAkB,KAAK,WAAW;AAC9C,QAAM,cAAc,YAAY;AAChC,QAAM,QAAQ,UAAU;AAAA,IACpB;AAAA,IACA,MAAM,IAAI;AAAA,IACV,MAAM,IAAI;AAAA,IACV,WAAW;AAAA,MACP,IAAI,OAAO;AAAA;AAAA,MACX,IAAI;AAAA;AAAA,MACJ;AAAA;AAAA,MACA,gBAAgB,aAAkB,SAAY;AAAA;AAAA,IAClD,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,EACvB,CAAC;AACD,MAAI,OAAO,OAAO,KAAK,KAAK;AAChC;AACO,IAAM,cAAN,MAAM,aAAY;AAAA,EACrB,cAAc;AACV,SAAK,QAAQ;AAAA,EACjB;AAAA,EACA,QAAQ;AACJ,QAAI,KAAK,UAAU;AACf,WAAK,QAAQ;AAAA,EACrB;AAAA,EACA,QAAQ;AACJ,QAAI,KAAK,UAAU;AACf,WAAK,QAAQ;AAAA,EACrB;AAAA,EACA,OAAO,WAAW,QAAQ,SAAS;AAC/B,UAAM,aAAa,CAAC;AACpB,eAAW,KAAK,SAAS;AACrB,UAAI,EAAE,WAAW;AACb,eAAO;AACX,UAAI,EAAE,WAAW;AACb,eAAO,MAAM;AACjB,iBAAW,KAAK,EAAE,KAAK;AAAA,IAC3B;AACA,WAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,WAAW;AAAA,EACrD;AAAA,EACA,aAAa,iBAAiB,QAAQ,OAAO;AACzC,UAAM,YAAY,CAAC;AACnB,eAAW,QAAQ,OAAO;AACtB,YAAM,MAAM,MAAM,KAAK;AACvB,YAAM,QAAQ,MAAM,KAAK;AACzB,gBAAU,KAAK;AAAA,QACX;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AACA,WAAO,aAAY,gBAAgB,QAAQ,SAAS;AAAA,EACxD;AAAA,EACA,OAAO,gBAAgB,QAAQ,OAAO;AAClC,UAAM,cAAc,CAAC;AACrB,eAAW,QAAQ,OAAO;AACtB,YAAM,EAAE,KAAK,MAAM,IAAI;AACvB,UAAI,IAAI,WAAW;AACf,eAAO;AACX,UAAI,MAAM,WAAW;AACjB,eAAO;AACX,UAAI,IAAI,WAAW;AACf,eAAO,MAAM;AACjB,UAAI,MAAM,WAAW;AACjB,eAAO,MAAM;AACjB,UAAI,IAAI,UAAU,gBAAgB,OAAO,MAAM,UAAU,eAAe,KAAK,YAAY;AACrF,oBAAY,IAAI,KAAK,IAAI,MAAM;AAAA,MACnC;AAAA,IACJ;AACA,WAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,YAAY;AAAA,EACtD;AACJ;AACO,IAAM,UAAU,OAAO,OAAO;AAAA,EACjC,QAAQ;AACZ,CAAC;AACM,IAAM,QAAQ,CAAC,WAAW,EAAE,QAAQ,SAAS,MAAM;AACnD,IAAM,KAAK,CAAC,WAAW,EAAE,QAAQ,SAAS,MAAM;AAChD,IAAM,YAAY,CAAC,MAAM,EAAE,WAAW;AACtC,IAAM,UAAU,CAAC,MAAM,EAAE,WAAW;AACpC,IAAM,UAAU,CAAC,MAAM,EAAE,WAAW;AACpC,IAAM,UAAU,CAAC,MAAM,OAAO,YAAY,eAAe,aAAa;;;AC5GtE,IAAI;AAAA,CACV,SAAUC,YAAW;AAClB,EAAAA,WAAU,WAAW,CAAC,YAAY,OAAO,YAAY,WAAW,EAAE,QAAQ,IAAI,WAAW,CAAC;AAE1F,EAAAA,WAAU,WAAW,CAAC,YAAY,OAAO,YAAY,WAAW,UAAU,SAAS;AACvF,GAAG,cAAc,YAAY,CAAC,EAAE;;;ACAhC,IAAM,qBAAN,MAAyB;AAAA,EACrB,YAAY,QAAQ,OAAOC,QAAM,KAAK;AAClC,SAAK,cAAc,CAAC;AACpB,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,QAAQA;AACb,SAAK,OAAO;AAAA,EAChB;AAAA,EACA,IAAI,OAAO;AACP,QAAI,CAAC,KAAK,YAAY,QAAQ;AAC1B,UAAI,MAAM,QAAQ,KAAK,IAAI,GAAG;AAC1B,aAAK,YAAY,KAAK,GAAG,KAAK,OAAO,GAAG,KAAK,IAAI;AAAA,MACrD,OACK;AACD,aAAK,YAAY,KAAK,GAAG,KAAK,OAAO,KAAK,IAAI;AAAA,MAClD;AAAA,IACJ;AACA,WAAO,KAAK;AAAA,EAChB;AACJ;AACA,IAAM,eAAe,CAAC,KAAK,WAAW;AAClC,MAAI,QAAQ,MAAM,GAAG;AACjB,WAAO,EAAE,SAAS,MAAM,MAAM,OAAO,MAAM;AAAA,EAC/C,OACK;AACD,QAAI,CAAC,IAAI,OAAO,OAAO,QAAQ;AAC3B,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC/D;AACA,WAAO;AAAA,MACH,SAAS;AAAA,MACT,IAAI,QAAQ;AACR,YAAI,KAAK;AACL,iBAAO,KAAK;AAChB,cAAMC,SAAQ,IAAI,SAAS,IAAI,OAAO,MAAM;AAC5C,aAAK,SAASA;AACd,eAAO,KAAK;AAAA,MAChB;AAAA,IACJ;AAAA,EACJ;AACJ;AACA,SAAS,oBAAoB,QAAQ;AACjC,MAAI,CAAC;AACD,WAAO,CAAC;AACZ,QAAM,EAAE,UAAAC,WAAU,oBAAoB,gBAAgB,YAAY,IAAI;AACtE,MAAIA,cAAa,sBAAsB,iBAAiB;AACpD,UAAM,IAAI,MAAM,0FAA0F;AAAA,EAC9G;AACA,MAAIA;AACA,WAAO,EAAE,UAAUA,WAAU,YAAY;AAC7C,QAAM,YAAY,CAAC,KAAK,QAAQ;AAC5B,UAAM,EAAE,QAAQ,IAAI;AACpB,QAAI,IAAI,SAAS,sBAAsB;AACnC,aAAO,EAAE,SAAS,WAAW,IAAI,aAAa;AAAA,IAClD;AACA,QAAI,OAAO,IAAI,SAAS,aAAa;AACjC,aAAO,EAAE,SAAS,WAAW,kBAAkB,IAAI,aAAa;AAAA,IACpE;AACA,QAAI,IAAI,SAAS;AACb,aAAO,EAAE,SAAS,IAAI,aAAa;AACvC,WAAO,EAAE,SAAS,WAAW,sBAAsB,IAAI,aAAa;AAAA,EACxE;AACA,SAAO,EAAE,UAAU,WAAW,YAAY;AAC9C;AACO,IAAM,UAAN,MAAc;AAAA,EACjB,IAAI,cAAc;AACd,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,SAAS,OAAO;AACZ,WAAO,cAAc,MAAM,IAAI;AAAA,EACnC;AAAA,EACA,gBAAgB,OAAO,KAAK;AACxB,WAAQ,OAAO;AAAA,MACX,QAAQ,MAAM,OAAO;AAAA,MACrB,MAAM,MAAM;AAAA,MACZ,YAAY,cAAc,MAAM,IAAI;AAAA,MACpC,gBAAgB,KAAK,KAAK;AAAA,MAC1B,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,IAClB;AAAA,EACJ;AAAA,EACA,oBAAoB,OAAO;AACvB,WAAO;AAAA,MACH,QAAQ,IAAI,YAAY;AAAA,MACxB,KAAK;AAAA,QACD,QAAQ,MAAM,OAAO;AAAA,QACrB,MAAM,MAAM;AAAA,QACZ,YAAY,cAAc,MAAM,IAAI;AAAA,QACpC,gBAAgB,KAAK,KAAK;AAAA,QAC1B,MAAM,MAAM;AAAA,QACZ,QAAQ,MAAM;AAAA,MAClB;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,WAAW,OAAO;AACd,UAAM,SAAS,KAAK,OAAO,KAAK;AAChC,QAAI,QAAQ,MAAM,GAAG;AACjB,YAAM,IAAI,MAAM,wCAAwC;AAAA,IAC5D;AACA,WAAO;AAAA,EACX;AAAA,EACA,YAAY,OAAO;AACf,UAAM,SAAS,KAAK,OAAO,KAAK;AAChC,WAAO,QAAQ,QAAQ,MAAM;AAAA,EACjC;AAAA,EACA,MAAM,MAAM,QAAQ;AAChB,UAAM,SAAS,KAAK,UAAU,MAAM,MAAM;AAC1C,QAAI,OAAO;AACP,aAAO,OAAO;AAClB,UAAM,OAAO;AAAA,EACjB;AAAA,EACA,UAAU,MAAM,QAAQ;AACpB,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,QACJ,QAAQ,CAAC;AAAA,QACT,OAAO,QAAQ,SAAS;AAAA,QACxB,oBAAoB,QAAQ;AAAA,MAChC;AAAA,MACA,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACvB,gBAAgB,KAAK,KAAK;AAAA,MAC1B,QAAQ;AAAA,MACR;AAAA,MACA,YAAY,cAAc,IAAI;AAAA,IAClC;AACA,UAAM,SAAS,KAAK,WAAW,EAAE,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC;AACpE,WAAO,aAAa,KAAK,MAAM;AAAA,EACnC;AAAA,EACA,YAAY,MAAM;AACd,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,QACJ,QAAQ,CAAC;AAAA,QACT,OAAO,CAAC,CAAC,KAAK,WAAW,EAAE;AAAA,MAC/B;AAAA,MACA,MAAM,CAAC;AAAA,MACP,gBAAgB,KAAK,KAAK;AAAA,MAC1B,QAAQ;AAAA,MACR;AAAA,MACA,YAAY,cAAc,IAAI;AAAA,IAClC;AACA,QAAI,CAAC,KAAK,WAAW,EAAE,OAAO;AAC1B,UAAI;AACA,cAAM,SAAS,KAAK,WAAW,EAAE,MAAM,MAAM,CAAC,GAAG,QAAQ,IAAI,CAAC;AAC9D,eAAO,QAAQ,MAAM,IACf;AAAA,UACE,OAAO,OAAO;AAAA,QAClB,IACE;AAAA,UACE,QAAQ,IAAI,OAAO;AAAA,QACvB;AAAA,MACR,SACO,KAAK;AACR,YAAI,KAAK,SAAS,YAAY,GAAG,SAAS,aAAa,GAAG;AACtD,eAAK,WAAW,EAAE,QAAQ;AAAA,QAC9B;AACA,YAAI,SAAS;AAAA,UACT,QAAQ,CAAC;AAAA,UACT,OAAO;AAAA,QACX;AAAA,MACJ;AAAA,IACJ;AACA,WAAO,KAAK,YAAY,EAAE,MAAM,MAAM,CAAC,GAAG,QAAQ,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,QAAQ,MAAM,IAClF;AAAA,MACE,OAAO,OAAO;AAAA,IAClB,IACE;AAAA,MACE,QAAQ,IAAI,OAAO;AAAA,IACvB,CAAC;AAAA,EACT;AAAA,EACA,MAAM,WAAW,MAAM,QAAQ;AAC3B,UAAM,SAAS,MAAM,KAAK,eAAe,MAAM,MAAM;AACrD,QAAI,OAAO;AACP,aAAO,OAAO;AAClB,UAAM,OAAO;AAAA,EACjB;AAAA,EACA,MAAM,eAAe,MAAM,QAAQ;AAC/B,UAAM,MAAM;AAAA,MACR,QAAQ;AAAA,QACJ,QAAQ,CAAC;AAAA,QACT,oBAAoB,QAAQ;AAAA,QAC5B,OAAO;AAAA,MACX;AAAA,MACA,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACvB,gBAAgB,KAAK,KAAK;AAAA,MAC1B,QAAQ;AAAA,MACR;AAAA,MACA,YAAY,cAAc,IAAI;AAAA,IAClC;AACA,UAAM,mBAAmB,KAAK,OAAO,EAAE,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC;AAC1E,UAAM,SAAS,OAAO,QAAQ,gBAAgB,IAAI,mBAAmB,QAAQ,QAAQ,gBAAgB;AACrG,WAAO,aAAa,KAAK,MAAM;AAAA,EACnC;AAAA,EACA,OAAO,OAAO,SAAS;AACnB,UAAM,qBAAqB,CAAC,QAAQ;AAChC,UAAI,OAAO,YAAY,YAAY,OAAO,YAAY,aAAa;AAC/D,eAAO,EAAE,QAAQ;AAAA,MACrB,WACS,OAAO,YAAY,YAAY;AACpC,eAAO,QAAQ,GAAG;AAAA,MACtB,OACK;AACD,eAAO;AAAA,MACX;AAAA,IACJ;AACA,WAAO,KAAK,YAAY,CAAC,KAAK,QAAQ;AAClC,YAAM,SAAS,MAAM,GAAG;AACxB,YAAM,WAAW,MAAM,IAAI,SAAS;AAAA,QAChC,MAAM,aAAa;AAAA,QACnB,GAAG,mBAAmB,GAAG;AAAA,MAC7B,CAAC;AACD,UAAI,OAAO,YAAY,eAAe,kBAAkB,SAAS;AAC7D,eAAO,OAAO,KAAK,CAAC,SAAS;AACzB,cAAI,CAAC,MAAM;AACP,qBAAS;AACT,mBAAO;AAAA,UACX,OACK;AACD,mBAAO;AAAA,UACX;AAAA,QACJ,CAAC;AAAA,MACL;AACA,UAAI,CAAC,QAAQ;AACT,iBAAS;AACT,eAAO;AAAA,MACX,OACK;AACD,eAAO;AAAA,MACX;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,WAAW,OAAO,gBAAgB;AAC9B,WAAO,KAAK,YAAY,CAAC,KAAK,QAAQ;AAClC,UAAI,CAAC,MAAM,GAAG,GAAG;AACb,YAAI,SAAS,OAAO,mBAAmB,aAAa,eAAe,KAAK,GAAG,IAAI,cAAc;AAC7F,eAAO;AAAA,MACX,OACK;AACD,eAAO;AAAA,MACX;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,YAAY,YAAY;AACpB,WAAO,IAAI,WAAW;AAAA,MAClB,QAAQ;AAAA,MACR,UAAU,sBAAsB;AAAA,MAChC,QAAQ,EAAE,MAAM,cAAc,WAAW;AAAA,IAC7C,CAAC;AAAA,EACL;AAAA,EACA,YAAY,YAAY;AACpB,WAAO,KAAK,YAAY,UAAU;AAAA,EACtC;AAAA,EACA,YAAY,KAAK;AAEb,SAAK,MAAM,KAAK;AAChB,SAAK,OAAO;AACZ,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,YAAY,KAAK,UAAU,KAAK,IAAI;AACzC,SAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAC3C,SAAK,iBAAiB,KAAK,eAAe,KAAK,IAAI;AACnD,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,SAAS,KAAK,OAAO,KAAK,IAAI;AACnC,SAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAC3C,SAAK,cAAc,KAAK,YAAY,KAAK,IAAI;AAC7C,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;AACrC,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;AACrC,SAAK,KAAK,KAAK,GAAG,KAAK,IAAI;AAC3B,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,YAAY,KAAK,UAAU,KAAK,IAAI;AACzC,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;AACrC,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAC/B,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAC3C,SAAK,aAAa,KAAK,WAAW,KAAK,IAAI;AAC3C,SAAK,WAAW,IAAI;AAAA,MAChB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU,CAAC,SAAS,KAAK,WAAW,EAAE,IAAI;AAAA,IAC9C;AAAA,EACJ;AAAA,EACA,WAAW;AACP,WAAO,YAAY,OAAO,MAAM,KAAK,IAAI;AAAA,EAC7C;AAAA,EACA,WAAW;AACP,WAAO,YAAY,OAAO,MAAM,KAAK,IAAI;AAAA,EAC7C;AAAA,EACA,UAAU;AACN,WAAO,KAAK,SAAS,EAAE,SAAS;AAAA,EACpC;AAAA,EACA,QAAQ;AACJ,WAAO,SAAS,OAAO,IAAI;AAAA,EAC/B;AAAA,EACA,UAAU;AACN,WAAO,WAAW,OAAO,MAAM,KAAK,IAAI;AAAA,EAC5C;AAAA,EACA,GAAG,QAAQ;AACP,WAAO,SAAS,OAAO,CAAC,MAAM,MAAM,GAAG,KAAK,IAAI;AAAA,EACpD;AAAA,EACA,IAAI,UAAU;AACV,WAAO,gBAAgB,OAAO,MAAM,UAAU,KAAK,IAAI;AAAA,EAC3D;AAAA,EACA,UAAU,WAAW;AACjB,WAAO,IAAI,WAAW;AAAA,MAClB,GAAG,oBAAoB,KAAK,IAAI;AAAA,MAChC,QAAQ;AAAA,MACR,UAAU,sBAAsB;AAAA,MAChC,QAAQ,EAAE,MAAM,aAAa,UAAU;AAAA,IAC3C,CAAC;AAAA,EACL;AAAA,EACA,QAAQ,KAAK;AACT,UAAM,mBAAmB,OAAO,QAAQ,aAAa,MAAM,MAAM;AACjE,WAAO,IAAI,WAAW;AAAA,MAClB,GAAG,oBAAoB,KAAK,IAAI;AAAA,MAChC,WAAW;AAAA,MACX,cAAc;AAAA,MACd,UAAU,sBAAsB;AAAA,IACpC,CAAC;AAAA,EACL;AAAA,EACA,QAAQ;AACJ,WAAO,IAAI,WAAW;AAAA,MAClB,UAAU,sBAAsB;AAAA,MAChC,MAAM;AAAA,MACN,GAAG,oBAAoB,KAAK,IAAI;AAAA,IACpC,CAAC;AAAA,EACL;AAAA,EACA,MAAM,KAAK;AACP,UAAM,iBAAiB,OAAO,QAAQ,aAAa,MAAM,MAAM;AAC/D,WAAO,IAAI,SAAS;AAAA,MAChB,GAAG,oBAAoB,KAAK,IAAI;AAAA,MAChC,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU,sBAAsB;AAAA,IACpC,CAAC;AAAA,EACL;AAAA,EACA,SAAS,aAAa;AAClB,UAAM,OAAO,KAAK;AAClB,WAAO,IAAI,KAAK;AAAA,MACZ,GAAG,KAAK;AAAA,MACR;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,KAAK,QAAQ;AACT,WAAO,YAAY,OAAO,MAAM,MAAM;AAAA,EAC1C;AAAA,EACA,WAAW;AACP,WAAO,YAAY,OAAO,IAAI;AAAA,EAClC;AAAA,EACA,aAAa;AACT,WAAO,KAAK,UAAU,MAAS,EAAE;AAAA,EACrC;AAAA,EACA,aAAa;AACT,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAChC;AACJ;AACA,IAAM,YAAY;AAClB,IAAM,aAAa;AACnB,IAAM,YAAY;AAGlB,IAAM,YAAY;AAClB,IAAM,cAAc;AACpB,IAAM,WAAW;AACjB,IAAM,gBAAgB;AAatB,IAAM,aAAa;AAInB,IAAM,cAAc;AACpB,IAAI;AAEJ,IAAM,YAAY;AAClB,IAAM,gBAAgB;AAGtB,IAAM,YAAY;AAClB,IAAM,gBAAgB;AAEtB,IAAM,cAAc;AAEpB,IAAM,iBAAiB;AAMvB,IAAM,kBAAkB;AACxB,IAAM,YAAY,IAAI,OAAO,IAAI,eAAe,GAAG;AACnD,SAAS,gBAAgB,MAAM;AAC3B,MAAI,qBAAqB;AACzB,MAAI,KAAK,WAAW;AAChB,yBAAqB,GAAG,kBAAkB,UAAU,KAAK,SAAS;AAAA,EACtE,WACS,KAAK,aAAa,MAAM;AAC7B,yBAAqB,GAAG,kBAAkB;AAAA,EAC9C;AACA,QAAM,oBAAoB,KAAK,YAAY,MAAM;AACjD,SAAO,8BAA8B,kBAAkB,IAAI,iBAAiB;AAChF;AACA,SAAS,UAAU,MAAM;AACrB,SAAO,IAAI,OAAO,IAAI,gBAAgB,IAAI,CAAC,GAAG;AAClD;AAEO,SAAS,cAAc,MAAM;AAChC,MAAI,QAAQ,GAAG,eAAe,IAAI,gBAAgB,IAAI,CAAC;AACvD,QAAM,OAAO,CAAC;AACd,OAAK,KAAK,KAAK,QAAQ,OAAO,GAAG;AACjC,MAAI,KAAK;AACL,SAAK,KAAK,sBAAsB;AACpC,UAAQ,GAAG,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC;AAClC,SAAO,IAAI,OAAO,IAAI,KAAK,GAAG;AAClC;AACA,SAAS,UAAU,IAAI,SAAS;AAC5B,OAAK,YAAY,QAAQ,CAAC,YAAY,UAAU,KAAK,EAAE,GAAG;AACtD,WAAO;AAAA,EACX;AACA,OAAK,YAAY,QAAQ,CAAC,YAAY,UAAU,KAAK,EAAE,GAAG;AACtD,WAAO;AAAA,EACX;AACA,SAAO;AACX;AACA,SAAS,WAAW,KAAK,KAAK;AAC1B,MAAI,CAAC,SAAS,KAAK,GAAG;AAClB,WAAO;AACX,MAAI;AACA,UAAM,CAAC,MAAM,IAAI,IAAI,MAAM,GAAG;AAC9B,QAAI,CAAC;AACD,aAAO;AAEX,UAAM,SAAS,OACV,QAAQ,MAAM,GAAG,EACjB,QAAQ,MAAM,GAAG,EACjB,OAAO,OAAO,UAAW,IAAK,OAAO,SAAS,KAAM,GAAI,GAAG;AAChE,UAAM,UAAU,KAAK,MAAM,KAAK,MAAM,CAAC;AACvC,QAAI,OAAO,YAAY,YAAY,YAAY;AAC3C,aAAO;AACX,QAAI,SAAS,WAAW,SAAS,QAAQ;AACrC,aAAO;AACX,QAAI,CAAC,QAAQ;AACT,aAAO;AACX,QAAI,OAAO,QAAQ,QAAQ;AACvB,aAAO;AACX,WAAO;AAAA,EACX,QACM;AACF,WAAO;AAAA,EACX;AACJ;AACA,SAAS,YAAY,IAAI,SAAS;AAC9B,OAAK,YAAY,QAAQ,CAAC,YAAY,cAAc,KAAK,EAAE,GAAG;AAC1D,WAAO;AAAA,EACX;AACA,OAAK,YAAY,QAAQ,CAAC,YAAY,cAAc,KAAK,EAAE,GAAG;AAC1D,WAAO;AAAA,EACX;AACA,SAAO;AACX;AACO,IAAM,YAAN,MAAM,mBAAkB,QAAQ;AAAA,EACnC,OAAO,OAAO;AACV,QAAI,KAAK,KAAK,QAAQ;AAClB,YAAM,OAAO,OAAO,MAAM,IAAI;AAAA,IAClC;AACA,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,QAAQ;AACrC,YAAMC,OAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkBA,MAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAUA,KAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,SAAS,IAAI,YAAY;AAC/B,QAAI,MAAM;AACV,eAAW,SAAS,KAAK,KAAK,QAAQ;AAClC,UAAI,MAAM,SAAS,OAAO;AACtB,YAAI,MAAM,KAAK,SAAS,MAAM,OAAO;AACjC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,YACf,MAAM;AAAA,YACN,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,OAAO;AAC3B,YAAI,MAAM,KAAK,SAAS,MAAM,OAAO;AACjC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,YACf,MAAM;AAAA,YACN,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,UAAU;AAC9B,cAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AACzC,cAAM,WAAW,MAAM,KAAK,SAAS,MAAM;AAC3C,YAAI,UAAU,UAAU;AACpB,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,cAAI,QAAQ;AACR,8BAAkB,KAAK;AAAA,cACnB,MAAM,aAAa;AAAA,cACnB,SAAS,MAAM;AAAA,cACf,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,cACP,SAAS,MAAM;AAAA,YACnB,CAAC;AAAA,UACL,WACS,UAAU;AACf,8BAAkB,KAAK;AAAA,cACnB,MAAM,aAAa;AAAA,cACnB,SAAS,MAAM;AAAA,cACf,MAAM;AAAA,cACN,WAAW;AAAA,cACX,OAAO;AAAA,cACP,SAAS,MAAM;AAAA,YACnB,CAAC;AAAA,UACL;AACA,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,SAAS;AAC7B,YAAI,CAAC,WAAW,KAAK,MAAM,IAAI,GAAG;AAC9B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,SAAS;AAC7B,YAAI,CAAC,YAAY;AACb,uBAAa,IAAI,OAAO,aAAa,GAAG;AAAA,QAC5C;AACA,YAAI,CAAC,WAAW,KAAK,MAAM,IAAI,GAAG;AAC9B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,QAAQ;AAC5B,YAAI,CAAC,UAAU,KAAK,MAAM,IAAI,GAAG;AAC7B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,UAAU;AAC9B,YAAI,CAAC,YAAY,KAAK,MAAM,IAAI,GAAG;AAC/B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,QAAQ;AAC5B,YAAI,CAAC,UAAU,KAAK,MAAM,IAAI,GAAG;AAC7B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,SAAS;AAC7B,YAAI,CAAC,WAAW,KAAK,MAAM,IAAI,GAAG;AAC9B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,QAAQ;AAC5B,YAAI,CAAC,UAAU,KAAK,MAAM,IAAI,GAAG;AAC7B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,OAAO;AAC3B,YAAI;AACA,cAAI,IAAI,MAAM,IAAI;AAAA,QACtB,QACM;AACF,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,SAAS;AAC7B,cAAM,MAAM,YAAY;AACxB,cAAM,aAAa,MAAM,MAAM,KAAK,MAAM,IAAI;AAC9C,YAAI,CAAC,YAAY;AACb,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,QAAQ;AAC5B,cAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MACjC,WACS,MAAM,SAAS,YAAY;AAChC,YAAI,CAAC,MAAM,KAAK,SAAS,MAAM,OAAO,MAAM,QAAQ,GAAG;AACnD,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,YAAY,EAAE,UAAU,MAAM,OAAO,UAAU,MAAM,SAAS;AAAA,YAC9D,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,eAAe;AACnC,cAAM,OAAO,MAAM,KAAK,YAAY;AAAA,MACxC,WACS,MAAM,SAAS,eAAe;AACnC,cAAM,OAAO,MAAM,KAAK,YAAY;AAAA,MACxC,WACS,MAAM,SAAS,cAAc;AAClC,YAAI,CAAC,MAAM,KAAK,WAAW,MAAM,KAAK,GAAG;AACrC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,YAAY,EAAE,YAAY,MAAM,MAAM;AAAA,YACtC,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,YAAY;AAChC,YAAI,CAAC,MAAM,KAAK,SAAS,MAAM,KAAK,GAAG;AACnC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,YAAY,EAAE,UAAU,MAAM,MAAM;AAAA,YACpC,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,YAAY;AAChC,cAAM,QAAQ,cAAc,KAAK;AACjC,YAAI,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG;AACzB,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,YAAY;AAAA,YACZ,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,QAAQ;AAC5B,cAAM,QAAQ;AACd,YAAI,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG;AACzB,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,YAAY;AAAA,YACZ,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,QAAQ;AAC5B,cAAM,QAAQ,UAAU,KAAK;AAC7B,YAAI,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG;AACzB,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,YAAY;AAAA,YACZ,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,YAAY;AAChC,YAAI,CAAC,cAAc,KAAK,MAAM,IAAI,GAAG;AACjC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,MAAM;AAC1B,YAAI,CAAC,UAAU,MAAM,MAAM,MAAM,OAAO,GAAG;AACvC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,OAAO;AAC3B,YAAI,CAAC,WAAW,MAAM,MAAM,MAAM,GAAG,GAAG;AACpC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,QAAQ;AAC5B,YAAI,CAAC,YAAY,MAAM,MAAM,MAAM,OAAO,GAAG;AACzC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,UAAU;AAC9B,YAAI,CAAC,YAAY,KAAK,MAAM,IAAI,GAAG;AAC/B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,aAAa;AACjC,YAAI,CAAC,eAAe,KAAK,MAAM,IAAI,GAAG;AAClC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,YAAY;AAAA,YACZ,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,OACK;AACD,aAAK,YAAY,KAAK;AAAA,MAC1B;AAAA,IACJ;AACA,WAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,MAAM,KAAK;AAAA,EACrD;AAAA,EACA,OAAO,OAAO,YAAY,SAAS;AAC/B,WAAO,KAAK,WAAW,CAAC,SAAS,MAAM,KAAK,IAAI,GAAG;AAAA,MAC/C;AAAA,MACA,MAAM,aAAa;AAAA,MACnB,GAAG,UAAU,SAAS,OAAO;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EACA,UAAU,OAAO;AACb,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,KAAK;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,MAAM,SAAS;AACX,WAAO,KAAK,UAAU,EAAE,MAAM,SAAS,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC3E;AAAA,EACA,IAAI,SAAS;AACT,WAAO,KAAK,UAAU,EAAE,MAAM,OAAO,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EACzE;AAAA,EACA,MAAM,SAAS;AACX,WAAO,KAAK,UAAU,EAAE,MAAM,SAAS,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC3E;AAAA,EACA,KAAK,SAAS;AACV,WAAO,KAAK,UAAU,EAAE,MAAM,QAAQ,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC1E;AAAA,EACA,OAAO,SAAS;AACZ,WAAO,KAAK,UAAU,EAAE,MAAM,UAAU,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC5E;AAAA,EACA,KAAK,SAAS;AACV,WAAO,KAAK,UAAU,EAAE,MAAM,QAAQ,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC1E;AAAA,EACA,MAAM,SAAS;AACX,WAAO,KAAK,UAAU,EAAE,MAAM,SAAS,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC3E;AAAA,EACA,KAAK,SAAS;AACV,WAAO,KAAK,UAAU,EAAE,MAAM,QAAQ,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC1E;AAAA,EACA,OAAO,SAAS;AACZ,WAAO,KAAK,UAAU,EAAE,MAAM,UAAU,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC5E;AAAA,EACA,UAAU,SAAS;AAEf,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,GAAG,UAAU,SAAS,OAAO;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,SAAS;AACT,WAAO,KAAK,UAAU,EAAE,MAAM,OAAO,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EACzE;AAAA,EACA,GAAG,SAAS;AACR,WAAO,KAAK,UAAU,EAAE,MAAM,MAAM,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EACxE;AAAA,EACA,KAAK,SAAS;AACV,WAAO,KAAK,UAAU,EAAE,MAAM,QAAQ,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC1E;AAAA,EACA,SAAS,SAAS;AACd,QAAI,OAAO,YAAY,UAAU;AAC7B,aAAO,KAAK,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,SAAS;AAAA,MACb,CAAC;AAAA,IACL;AACA,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,WAAW,OAAO,SAAS,cAAc,cAAc,OAAO,SAAS;AAAA,MACvE,QAAQ,SAAS,UAAU;AAAA,MAC3B,OAAO,SAAS,SAAS;AAAA,MACzB,GAAG,UAAU,SAAS,SAAS,OAAO;AAAA,IAC1C,CAAC;AAAA,EACL;AAAA,EACA,KAAK,SAAS;AACV,WAAO,KAAK,UAAU,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,EACnD;AAAA,EACA,KAAK,SAAS;AACV,QAAI,OAAO,YAAY,UAAU;AAC7B,aAAO,KAAK,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS;AAAA,MACb,CAAC;AAAA,IACL;AACA,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,WAAW,OAAO,SAAS,cAAc,cAAc,OAAO,SAAS;AAAA,MACvE,GAAG,UAAU,SAAS,SAAS,OAAO;AAAA,IAC1C,CAAC;AAAA,EACL;AAAA,EACA,SAAS,SAAS;AACd,WAAO,KAAK,UAAU,EAAE,MAAM,YAAY,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC;AAAA,EAC9E;AAAA,EACA,MAAM,OAAO,SAAS;AAClB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,GAAG,UAAU,SAAS,OAAO;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EACA,SAAS,OAAO,SAAS;AACrB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,UAAU,SAAS;AAAA,MACnB,GAAG,UAAU,SAAS,SAAS,OAAO;AAAA,IAC1C,CAAC;AAAA,EACL;AAAA,EACA,WAAW,OAAO,SAAS;AACvB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,GAAG,UAAU,SAAS,OAAO;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EACA,SAAS,OAAO,SAAS;AACrB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,GAAG,UAAU,SAAS,OAAO;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,WAAW,SAAS;AACpB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAG,UAAU,SAAS,OAAO;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,WAAW,SAAS;AACpB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAG,UAAU,SAAS,OAAO;AAAA,IACjC,CAAC;AAAA,EACL;AAAA,EACA,OAAO,KAAK,SAAS;AACjB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAG,UAAU,SAAS,OAAO;AAAA,IACjC,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,SAAS,SAAS;AACd,WAAO,KAAK,IAAI,GAAG,UAAU,SAAS,OAAO,CAAC;AAAA,EAClD;AAAA,EACA,OAAO;AACH,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AAAA,IAClD,CAAC;AAAA,EACL;AAAA,EACA,cAAc;AACV,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAAA,IACzD,CAAC;AAAA,EACL;AAAA,EACA,cAAc;AACV,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAAA,IACzD,CAAC;AAAA,EACL;AAAA,EACA,IAAI,aAAa;AACb,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,UAAU;AAAA,EACjE;AAAA,EACA,IAAI,SAAS;AACT,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,MAAM;AAAA,EAC7D;AAAA,EACA,IAAI,SAAS;AACT,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,MAAM;AAAA,EAC7D;AAAA,EACA,IAAI,aAAa;AACb,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,UAAU;AAAA,EACjE;AAAA,EACA,IAAI,UAAU;AACV,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,OAAO;AAAA,EAC9D;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,KAAK;AAAA,EAC5D;AAAA,EACA,IAAI,UAAU;AACV,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,OAAO;AAAA,EAC9D;AAAA,EACA,IAAI,SAAS;AACT,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,MAAM;AAAA,EAC7D;AAAA,EACA,IAAI,WAAW;AACX,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,QAAQ;AAAA,EAC/D;AAAA,EACA,IAAI,SAAS;AACT,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,MAAM;AAAA,EAC7D;AAAA,EACA,IAAI,UAAU;AACV,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,OAAO;AAAA,EAC9D;AAAA,EACA,IAAI,SAAS;AACT,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,MAAM;AAAA,EAC7D;AAAA,EACA,IAAI,OAAO;AACP,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,IAAI;AAAA,EAC3D;AAAA,EACA,IAAI,SAAS;AACT,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,MAAM;AAAA,EAC7D;AAAA,EACA,IAAI,WAAW;AACX,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,QAAQ;AAAA,EAC/D;AAAA,EACA,IAAI,cAAc;AAEd,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,WAAW;AAAA,EAClE;AAAA,EACA,IAAI,YAAY;AACZ,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,OAAO;AACnB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,IAAI,YAAY;AACZ,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,OAAO;AACnB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACJ;AACA,UAAU,SAAS,CAAC,WAAW;AAC3B,SAAO,IAAI,UAAU;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,UAAU,sBAAsB;AAAA,IAChC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AAEA,SAAS,mBAAmB,KAAK,MAAM;AACnC,QAAM,eAAe,IAAI,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AACzD,QAAM,gBAAgB,KAAK,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI;AAC3D,QAAM,WAAW,cAAc,eAAe,cAAc;AAC5D,QAAM,SAAS,OAAO,SAAS,IAAI,QAAQ,QAAQ,EAAE,QAAQ,KAAK,EAAE,CAAC;AACrE,QAAM,UAAU,OAAO,SAAS,KAAK,QAAQ,QAAQ,EAAE,QAAQ,KAAK,EAAE,CAAC;AACvE,SAAQ,SAAS,UAAW,MAAM;AACtC;AACO,IAAM,YAAN,MAAM,mBAAkB,QAAQ;AAAA,EACnC,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,MAAM,KAAK;AAChB,SAAK,MAAM,KAAK;AAChB,SAAK,OAAO,KAAK;AAAA,EACrB;AAAA,EACA,OAAO,OAAO;AACV,QAAI,KAAK,KAAK,QAAQ;AAClB,YAAM,OAAO,OAAO,MAAM,IAAI;AAAA,IAClC;AACA,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,QAAQ;AACrC,YAAMA,OAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkBA,MAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAUA,KAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,MAAM;AACV,UAAM,SAAS,IAAI,YAAY;AAC/B,eAAW,SAAS,KAAK,KAAK,QAAQ;AAClC,UAAI,MAAM,SAAS,OAAO;AACtB,YAAI,CAAC,KAAK,UAAU,MAAM,IAAI,GAAG;AAC7B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,UAAU;AAAA,YACV,UAAU;AAAA,YACV,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,OAAO;AAC3B,cAAM,WAAW,MAAM,YAAY,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAClF,YAAI,UAAU;AACV,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,YACf,MAAM;AAAA,YACN,WAAW,MAAM;AAAA,YACjB,OAAO;AAAA,YACP,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,OAAO;AAC3B,cAAM,SAAS,MAAM,YAAY,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAChF,YAAI,QAAQ;AACR,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,YACf,MAAM;AAAA,YACN,WAAW,MAAM;AAAA,YACjB,OAAO;AAAA,YACP,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,cAAc;AAClC,YAAI,mBAAmB,MAAM,MAAM,MAAM,KAAK,MAAM,GAAG;AACnD,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,YAAY,MAAM;AAAA,YAClB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,UAAU;AAC9B,YAAI,CAAC,OAAO,SAAS,MAAM,IAAI,GAAG;AAC9B,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,OACK;AACD,aAAK,YAAY,KAAK;AAAA,MAC1B;AAAA,IACJ;AACA,WAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,MAAM,KAAK;AAAA,EACrD;AAAA,EACA,IAAI,OAAO,SAAS;AAChB,WAAO,KAAK,SAAS,OAAO,OAAO,MAAM,UAAU,SAAS,OAAO,CAAC;AAAA,EACxE;AAAA,EACA,GAAG,OAAO,SAAS;AACf,WAAO,KAAK,SAAS,OAAO,OAAO,OAAO,UAAU,SAAS,OAAO,CAAC;AAAA,EACzE;AAAA,EACA,IAAI,OAAO,SAAS;AAChB,WAAO,KAAK,SAAS,OAAO,OAAO,MAAM,UAAU,SAAS,OAAO,CAAC;AAAA,EACxE;AAAA,EACA,GAAG,OAAO,SAAS;AACf,WAAO,KAAK,SAAS,OAAO,OAAO,OAAO,UAAU,SAAS,OAAO,CAAC;AAAA,EACzE;AAAA,EACA,SAAS,MAAM,OAAO,WAAW,SAAS;AACtC,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,QAAQ;AAAA,QACJ,GAAG,KAAK,KAAK;AAAA,QACb;AAAA,UACI;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,UAAU,SAAS,OAAO;AAAA,QACvC;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,UAAU,OAAO;AACb,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,KAAK;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,SAAS;AACT,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,SAAS,SAAS;AACd,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,SAAS,SAAS;AACd,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,YAAY,SAAS;AACjB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,YAAY,SAAS;AACjB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW;AAAA,MACX,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,WAAW,OAAO,SAAS;AACvB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,OAAO,SAAS;AACZ,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,KAAK,SAAS;AACV,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO,OAAO;AAAA,MACd,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC,EAAE,UAAU;AAAA,MACT,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO,OAAO;AAAA,MACd,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,WAAW;AACX,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,OAAO;AACnB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,IAAI,WAAW;AACX,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,OAAO;AACnB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,CAAC,CAAC,KAAK,KAAK,OAAO,KAAK,CAAC,OAAO,GAAG,SAAS,SAAU,GAAG,SAAS,gBAAgB,KAAK,UAAU,GAAG,KAAK,CAAE;AAAA,EACtH;AAAA,EACA,IAAI,WAAW;AACX,QAAI,MAAM;AACV,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,YAAY,GAAG,SAAS,SAAS,GAAG,SAAS,cAAc;AACvE,eAAO;AAAA,MACX,WACS,GAAG,SAAS,OAAO;AACxB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB,WACS,GAAG,SAAS,OAAO;AACxB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO,OAAO,SAAS,GAAG,KAAK,OAAO,SAAS,GAAG;AAAA,EACtD;AACJ;AACA,UAAU,SAAS,CAAC,WAAW;AAC3B,SAAO,IAAI,UAAU;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,UAAU,sBAAsB;AAAA,IAChC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,YAAN,MAAM,mBAAkB,QAAQ;AAAA,EACnC,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,MAAM,KAAK;AAChB,SAAK,MAAM,KAAK;AAAA,EACpB;AAAA,EACA,OAAO,OAAO;AACV,QAAI,KAAK,KAAK,QAAQ;AAClB,UAAI;AACA,cAAM,OAAO,OAAO,MAAM,IAAI;AAAA,MAClC,QACM;AACF,eAAO,KAAK,iBAAiB,KAAK;AAAA,MACtC;AAAA,IACJ;AACA,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,QAAQ;AACrC,aAAO,KAAK,iBAAiB,KAAK;AAAA,IACtC;AACA,QAAI,MAAM;AACV,UAAM,SAAS,IAAI,YAAY;AAC/B,eAAW,SAAS,KAAK,KAAK,QAAQ;AAClC,UAAI,MAAM,SAAS,OAAO;AACtB,cAAM,WAAW,MAAM,YAAY,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAClF,YAAI,UAAU;AACV,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,MAAM;AAAA,YACf,WAAW,MAAM;AAAA,YACjB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,OAAO;AAC3B,cAAM,SAAS,MAAM,YAAY,MAAM,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAChF,YAAI,QAAQ;AACR,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,MAAM;AAAA,YACN,SAAS,MAAM;AAAA,YACf,WAAW,MAAM;AAAA,YACjB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,cAAc;AAClC,YAAI,MAAM,OAAO,MAAM,UAAU,OAAO,CAAC,GAAG;AACxC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,YAAY,MAAM;AAAA,YAClB,SAAS,MAAM;AAAA,UACnB,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,OACK;AACD,aAAK,YAAY,KAAK;AAAA,MAC1B;AAAA,IACJ;AACA,WAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,MAAM,KAAK;AAAA,EACrD;AAAA,EACA,iBAAiB,OAAO;AACpB,UAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,sBAAkB,KAAK;AAAA,MACnB,MAAM,aAAa;AAAA,MACnB,UAAU,cAAc;AAAA,MACxB,UAAU,IAAI;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,EACX;AAAA,EACA,IAAI,OAAO,SAAS;AAChB,WAAO,KAAK,SAAS,OAAO,OAAO,MAAM,UAAU,SAAS,OAAO,CAAC;AAAA,EACxE;AAAA,EACA,GAAG,OAAO,SAAS;AACf,WAAO,KAAK,SAAS,OAAO,OAAO,OAAO,UAAU,SAAS,OAAO,CAAC;AAAA,EACzE;AAAA,EACA,IAAI,OAAO,SAAS;AAChB,WAAO,KAAK,SAAS,OAAO,OAAO,MAAM,UAAU,SAAS,OAAO,CAAC;AAAA,EACxE;AAAA,EACA,GAAG,OAAO,SAAS;AACf,WAAO,KAAK,SAAS,OAAO,OAAO,OAAO,UAAU,SAAS,OAAO,CAAC;AAAA,EACzE;AAAA,EACA,SAAS,MAAM,OAAO,WAAW,SAAS;AACtC,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,QAAQ;AAAA,QACJ,GAAG,KAAK,KAAK;AAAA,QACb;AAAA,UACI;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,UAAU,SAAS,OAAO;AAAA,QACvC;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,UAAU,OAAO;AACb,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,KAAK;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,SAAS,SAAS;AACd,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO,OAAO,CAAC;AAAA,MACf,WAAW;AAAA,MACX,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,SAAS,SAAS;AACd,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO,OAAO,CAAC;AAAA,MACf,WAAW;AAAA,MACX,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,YAAY,SAAS;AACjB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO,OAAO,CAAC;AAAA,MACf,WAAW;AAAA,MACX,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,YAAY,SAAS;AACjB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO,OAAO,CAAC;AAAA,MACf,WAAW;AAAA,MACX,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,WAAW,OAAO,SAAS;AACvB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN;AAAA,MACA,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,WAAW;AACX,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,OAAO;AACnB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EACA,IAAI,WAAW;AACX,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,OAAO;AACnB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AACJ;AACA,UAAU,SAAS,CAAC,WAAW;AAC3B,SAAO,IAAI,UAAU;AAAA,IACjB,QAAQ,CAAC;AAAA,IACT,UAAU,sBAAsB;AAAA,IAChC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,aAAN,cAAyB,QAAQ;AAAA,EACpC,OAAO,OAAO;AACV,QAAI,KAAK,KAAK,QAAQ;AAClB,YAAM,OAAO,QAAQ,MAAM,IAAI;AAAA,IACnC;AACA,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,SAAS;AACtC,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AACJ;AACA,WAAW,SAAS,CAAC,WAAW;AAC5B,SAAO,IAAI,WAAW;AAAA,IAClB,UAAU,sBAAsB;AAAA,IAChC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,UAAN,MAAM,iBAAgB,QAAQ;AAAA,EACjC,OAAO,OAAO;AACV,QAAI,KAAK,KAAK,QAAQ;AAClB,YAAM,OAAO,IAAI,KAAK,MAAM,IAAI;AAAA,IACpC;AACA,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,MAAM;AACnC,YAAMA,OAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkBA,MAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAUA,KAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,OAAO,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG;AACpC,YAAMA,OAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkBA,MAAK;AAAA,QACnB,MAAM,aAAa;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,SAAS,IAAI,YAAY;AAC/B,QAAI,MAAM;AACV,eAAW,SAAS,KAAK,KAAK,QAAQ;AAClC,UAAI,MAAM,SAAS,OAAO;AACtB,YAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,OAAO;AACpC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,YACf,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,MAAM;AAAA,YACf,MAAM;AAAA,UACV,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,MAAM,SAAS,OAAO;AAC3B,YAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,OAAO;AACpC,gBAAM,KAAK,gBAAgB,OAAO,GAAG;AACrC,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,SAAS,MAAM;AAAA,YACf,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,MAAM;AAAA,YACf,MAAM;AAAA,UACV,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,OACK;AACD,aAAK,YAAY,KAAK;AAAA,MAC1B;AAAA,IACJ;AACA,WAAO;AAAA,MACH,QAAQ,OAAO;AAAA,MACf,OAAO,IAAI,KAAK,MAAM,KAAK,QAAQ,CAAC;AAAA,IACxC;AAAA,EACJ;AAAA,EACA,UAAU,OAAO;AACb,WAAO,IAAI,SAAQ;AAAA,MACf,GAAG,KAAK;AAAA,MACR,QAAQ,CAAC,GAAG,KAAK,KAAK,QAAQ,KAAK;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,SAAS,SAAS;AAClB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO,QAAQ,QAAQ;AAAA,MACvB,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,SAAS,SAAS;AAClB,WAAO,KAAK,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,OAAO,QAAQ,QAAQ;AAAA,MACvB,SAAS,UAAU,SAAS,OAAO;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,IAAI,UAAU;AACV,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,OAAO;AACnB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO,OAAO,OAAO,IAAI,KAAK,GAAG,IAAI;AAAA,EACzC;AAAA,EACA,IAAI,UAAU;AACV,QAAI,MAAM;AACV,eAAW,MAAM,KAAK,KAAK,QAAQ;AAC/B,UAAI,GAAG,SAAS,OAAO;AACnB,YAAI,QAAQ,QAAQ,GAAG,QAAQ;AAC3B,gBAAM,GAAG;AAAA,MACjB;AAAA,IACJ;AACA,WAAO,OAAO,OAAO,IAAI,KAAK,GAAG,IAAI;AAAA,EACzC;AACJ;AACA,QAAQ,SAAS,CAAC,WAAW;AACzB,SAAO,IAAI,QAAQ;AAAA,IACf,QAAQ,CAAC;AAAA,IACT,QAAQ,QAAQ,UAAU;AAAA,IAC1B,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,YAAN,cAAwB,QAAQ;AAAA,EACnC,OAAO,OAAO;AACV,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,QAAQ;AACrC,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AACJ;AACA,UAAU,SAAS,CAAC,WAAW;AAC3B,SAAO,IAAI,UAAU;AAAA,IACjB,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,eAAN,cAA2B,QAAQ;AAAA,EACtC,OAAO,OAAO;AACV,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,WAAW;AACxC,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AACJ;AACA,aAAa,SAAS,CAAC,WAAW;AAC9B,SAAO,IAAI,aAAa;AAAA,IACpB,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,UAAN,cAAsB,QAAQ;AAAA,EACjC,OAAO,OAAO;AACV,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,MAAM;AACnC,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AACJ;AACA,QAAQ,SAAS,CAAC,WAAW;AACzB,SAAO,IAAI,QAAQ;AAAA,IACf,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,SAAN,cAAqB,QAAQ;AAAA,EAChC,cAAc;AACV,UAAM,GAAG,SAAS;AAElB,SAAK,OAAO;AAAA,EAChB;AAAA,EACA,OAAO,OAAO;AACV,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AACJ;AACA,OAAO,SAAS,CAAC,WAAW;AACxB,SAAO,IAAI,OAAO;AAAA,IACd,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,aAAN,cAAyB,QAAQ;AAAA,EACpC,cAAc;AACV,UAAM,GAAG,SAAS;AAElB,SAAK,WAAW;AAAA,EACpB;AAAA,EACA,OAAO,OAAO;AACV,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AACJ;AACA,WAAW,SAAS,CAAC,WAAW;AAC5B,SAAO,IAAI,WAAW;AAAA,IAClB,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,WAAN,cAAuB,QAAQ;AAAA,EAClC,OAAO,OAAO;AACV,UAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,sBAAkB,KAAK;AAAA,MACnB,MAAM,aAAa;AAAA,MACnB,UAAU,cAAc;AAAA,MACxB,UAAU,IAAI;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,EACX;AACJ;AACA,SAAS,SAAS,CAAC,WAAW;AAC1B,SAAO,IAAI,SAAS;AAAA,IAChB,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,UAAN,cAAsB,QAAQ;AAAA,EACjC,OAAO,OAAO;AACV,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,WAAW;AACxC,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AACJ;AACA,QAAQ,SAAS,CAAC,WAAW;AACzB,SAAO,IAAI,QAAQ;AAAA,IACf,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,WAAN,MAAM,kBAAiB,QAAQ;AAAA,EAClC,OAAO,OAAO;AACV,UAAM,EAAE,KAAK,OAAO,IAAI,KAAK,oBAAoB,KAAK;AACtD,UAAM,MAAM,KAAK;AACjB,QAAI,IAAI,eAAe,cAAc,OAAO;AACxC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,IAAI,gBAAgB,MAAM;AAC1B,YAAM,SAAS,IAAI,KAAK,SAAS,IAAI,YAAY;AACjD,YAAM,WAAW,IAAI,KAAK,SAAS,IAAI,YAAY;AACnD,UAAI,UAAU,UAAU;AACpB,0BAAkB,KAAK;AAAA,UACnB,MAAM,SAAS,aAAa,UAAU,aAAa;AAAA,UACnD,SAAU,WAAW,IAAI,YAAY,QAAQ;AAAA,UAC7C,SAAU,SAAS,IAAI,YAAY,QAAQ;AAAA,UAC3C,MAAM;AAAA,UACN,WAAW;AAAA,UACX,OAAO;AAAA,UACP,SAAS,IAAI,YAAY;AAAA,QAC7B,CAAC;AACD,eAAO,MAAM;AAAA,MACjB;AAAA,IACJ;AACA,QAAI,IAAI,cAAc,MAAM;AACxB,UAAI,IAAI,KAAK,SAAS,IAAI,UAAU,OAAO;AACvC,0BAAkB,KAAK;AAAA,UACnB,MAAM,aAAa;AAAA,UACnB,SAAS,IAAI,UAAU;AAAA,UACvB,MAAM;AAAA,UACN,WAAW;AAAA,UACX,OAAO;AAAA,UACP,SAAS,IAAI,UAAU;AAAA,QAC3B,CAAC;AACD,eAAO,MAAM;AAAA,MACjB;AAAA,IACJ;AACA,QAAI,IAAI,cAAc,MAAM;AACxB,UAAI,IAAI,KAAK,SAAS,IAAI,UAAU,OAAO;AACvC,0BAAkB,KAAK;AAAA,UACnB,MAAM,aAAa;AAAA,UACnB,SAAS,IAAI,UAAU;AAAA,UACvB,MAAM;AAAA,UACN,WAAW;AAAA,UACX,OAAO;AAAA,UACP,SAAS,IAAI,UAAU;AAAA,QAC3B,CAAC;AACD,eAAO,MAAM;AAAA,MACjB;AAAA,IACJ;AACA,QAAI,IAAI,OAAO,OAAO;AAClB,aAAO,QAAQ,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,MAAM;AAC9C,eAAO,IAAI,KAAK,YAAY,IAAI,mBAAmB,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC;AAAA,MAC9E,CAAC,CAAC,EAAE,KAAK,CAACC,YAAW;AACjB,eAAO,YAAY,WAAW,QAAQA,OAAM;AAAA,MAChD,CAAC;AAAA,IACL;AACA,UAAM,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,CAAC,MAAM,MAAM;AAC1C,aAAO,IAAI,KAAK,WAAW,IAAI,mBAAmB,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC;AAAA,IAC7E,CAAC;AACD,WAAO,YAAY,WAAW,QAAQ,MAAM;AAAA,EAChD;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,WAAW,SAAS;AACpB,WAAO,IAAI,UAAS;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,WAAW,EAAE,OAAO,WAAW,SAAS,UAAU,SAAS,OAAO,EAAE;AAAA,IACxE,CAAC;AAAA,EACL;AAAA,EACA,IAAI,WAAW,SAAS;AACpB,WAAO,IAAI,UAAS;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,WAAW,EAAE,OAAO,WAAW,SAAS,UAAU,SAAS,OAAO,EAAE;AAAA,IACxE,CAAC;AAAA,EACL;AAAA,EACA,OAAO,KAAK,SAAS;AACjB,WAAO,IAAI,UAAS;AAAA,MAChB,GAAG,KAAK;AAAA,MACR,aAAa,EAAE,OAAO,KAAK,SAAS,UAAU,SAAS,OAAO,EAAE;AAAA,IACpE,CAAC;AAAA,EACL;AAAA,EACA,SAAS,SAAS;AACd,WAAO,KAAK,IAAI,GAAG,OAAO;AAAA,EAC9B;AACJ;AACA,SAAS,SAAS,CAAC,QAAQ,WAAW;AAClC,SAAO,IAAI,SAAS;AAAA,IAChB,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,IACb,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACA,SAAS,eAAe,QAAQ;AAC5B,MAAI,kBAAkB,WAAW;AAC7B,UAAM,WAAW,CAAC;AAClB,eAAW,OAAO,OAAO,OAAO;AAC5B,YAAM,cAAc,OAAO,MAAM,GAAG;AACpC,eAAS,GAAG,IAAI,YAAY,OAAO,eAAe,WAAW,CAAC;AAAA,IAClE;AACA,WAAO,IAAI,UAAU;AAAA,MACjB,GAAG,OAAO;AAAA,MACV,OAAO,MAAM;AAAA,IACjB,CAAC;AAAA,EACL,WACS,kBAAkB,UAAU;AACjC,WAAO,IAAI,SAAS;AAAA,MAChB,GAAG,OAAO;AAAA,MACV,MAAM,eAAe,OAAO,OAAO;AAAA,IACvC,CAAC;AAAA,EACL,WACS,kBAAkB,aAAa;AACpC,WAAO,YAAY,OAAO,eAAe,OAAO,OAAO,CAAC,CAAC;AAAA,EAC7D,WACS,kBAAkB,aAAa;AACpC,WAAO,YAAY,OAAO,eAAe,OAAO,OAAO,CAAC,CAAC;AAAA,EAC7D,WACS,kBAAkB,UAAU;AACjC,WAAO,SAAS,OAAO,OAAO,MAAM,IAAI,CAAC,SAAS,eAAe,IAAI,CAAC,CAAC;AAAA,EAC3E,OACK;AACD,WAAO;AAAA,EACX;AACJ;AACO,IAAM,YAAN,MAAM,mBAAkB,QAAQ;AAAA,EACnC,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,UAAU;AAKf,SAAK,YAAY,KAAK;AAqCtB,SAAK,UAAU,KAAK;AAAA,EACxB;AAAA,EACA,aAAa;AACT,QAAI,KAAK,YAAY;AACjB,aAAO,KAAK;AAChB,UAAM,QAAQ,KAAK,KAAK,MAAM;AAC9B,UAAM,OAAO,KAAK,WAAW,KAAK;AAClC,SAAK,UAAU,EAAE,OAAO,KAAK;AAC7B,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,OAAO,OAAO;AACV,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,QAAQ;AACrC,YAAMD,OAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkBA,MAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAUA,KAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,oBAAoB,KAAK;AACtD,UAAM,EAAE,OAAO,MAAM,UAAU,IAAI,KAAK,WAAW;AACnD,UAAM,YAAY,CAAC;AACnB,QAAI,EAAE,KAAK,KAAK,oBAAoB,YAAY,KAAK,KAAK,gBAAgB,UAAU;AAChF,iBAAW,OAAO,IAAI,MAAM;AACxB,YAAI,CAAC,UAAU,SAAS,GAAG,GAAG;AAC1B,oBAAU,KAAK,GAAG;AAAA,QACtB;AAAA,MACJ;AAAA,IACJ;AACA,UAAM,QAAQ,CAAC;AACf,eAAW,OAAO,WAAW;AACzB,YAAM,eAAe,MAAM,GAAG;AAC9B,YAAM,QAAQ,IAAI,KAAK,GAAG;AAC1B,YAAM,KAAK;AAAA,QACP,KAAK,EAAE,QAAQ,SAAS,OAAO,IAAI;AAAA,QACnC,OAAO,aAAa,OAAO,IAAI,mBAAmB,KAAK,OAAO,IAAI,MAAM,GAAG,CAAC;AAAA,QAC5E,WAAW,OAAO,IAAI;AAAA,MAC1B,CAAC;AAAA,IACL;AACA,QAAI,KAAK,KAAK,oBAAoB,UAAU;AACxC,YAAM,cAAc,KAAK,KAAK;AAC9B,UAAI,gBAAgB,eAAe;AAC/B,mBAAW,OAAO,WAAW;AACzB,gBAAM,KAAK;AAAA,YACP,KAAK,EAAE,QAAQ,SAAS,OAAO,IAAI;AAAA,YACnC,OAAO,EAAE,QAAQ,SAAS,OAAO,IAAI,KAAK,GAAG,EAAE;AAAA,UACnD,CAAC;AAAA,QACL;AAAA,MACJ,WACS,gBAAgB,UAAU;AAC/B,YAAI,UAAU,SAAS,GAAG;AACtB,4BAAkB,KAAK;AAAA,YACnB,MAAM,aAAa;AAAA,YACnB,MAAM;AAAA,UACV,CAAC;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ,WACS,gBAAgB,SAAS;AAAA,MAClC,OACK;AACD,cAAM,IAAI,MAAM,sDAAsD;AAAA,MAC1E;AAAA,IACJ,OACK;AAED,YAAM,WAAW,KAAK,KAAK;AAC3B,iBAAW,OAAO,WAAW;AACzB,cAAM,QAAQ,IAAI,KAAK,GAAG;AAC1B,cAAM,KAAK;AAAA,UACP,KAAK,EAAE,QAAQ,SAAS,OAAO,IAAI;AAAA,UACnC,OAAO,SAAS;AAAA,YAAO,IAAI,mBAAmB,KAAK,OAAO,IAAI,MAAM,GAAG;AAAA;AAAA,UACvE;AAAA,UACA,WAAW,OAAO,IAAI;AAAA,QAC1B,CAAC;AAAA,MACL;AAAA,IACJ;AACA,QAAI,IAAI,OAAO,OAAO;AAClB,aAAO,QAAQ,QAAQ,EAClB,KAAK,YAAY;AAClB,cAAM,YAAY,CAAC;AACnB,mBAAW,QAAQ,OAAO;AACtB,gBAAM,MAAM,MAAM,KAAK;AACvB,gBAAM,QAAQ,MAAM,KAAK;AACzB,oBAAU,KAAK;AAAA,YACX;AAAA,YACA;AAAA,YACA,WAAW,KAAK;AAAA,UACpB,CAAC;AAAA,QACL;AACA,eAAO;AAAA,MACX,CAAC,EACI,KAAK,CAAC,cAAc;AACrB,eAAO,YAAY,gBAAgB,QAAQ,SAAS;AAAA,MACxD,CAAC;AAAA,IACL,OACK;AACD,aAAO,YAAY,gBAAgB,QAAQ,KAAK;AAAA,IACpD;AAAA,EACJ;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,KAAK,KAAK,MAAM;AAAA,EAC3B;AAAA,EACA,OAAO,SAAS;AACZ,cAAU;AACV,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,aAAa;AAAA,MACb,GAAI,YAAY,SACV;AAAA,QACE,UAAU,CAAC,OAAO,QAAQ;AACtB,gBAAM,eAAe,KAAK,KAAK,WAAW,OAAO,GAAG,EAAE,WAAW,IAAI;AACrE,cAAI,MAAM,SAAS;AACf,mBAAO;AAAA,cACH,SAAS,UAAU,SAAS,OAAO,EAAE,WAAW;AAAA,YACpD;AACJ,iBAAO;AAAA,YACH,SAAS;AAAA,UACb;AAAA,QACJ;AAAA,MACJ,IACE,CAAC;AAAA,IACX,CAAC;AAAA,EACL;AAAA,EACA,QAAQ;AACJ,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,aAAa;AAAA,IACjB,CAAC;AAAA,EACL;AAAA,EACA,cAAc;AACV,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,aAAa;AAAA,IACjB,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,OAAO,cAAc;AACjB,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,OAAO,OAAO;AAAA,QACV,GAAG,KAAK,KAAK,MAAM;AAAA,QACnB,GAAG;AAAA,MACP;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS;AACX,UAAM,SAAS,IAAI,WAAU;AAAA,MACzB,aAAa,QAAQ,KAAK;AAAA,MAC1B,UAAU,QAAQ,KAAK;AAAA,MACvB,OAAO,OAAO;AAAA,QACV,GAAG,KAAK,KAAK,MAAM;AAAA,QACnB,GAAG,QAAQ,KAAK,MAAM;AAAA,MAC1B;AAAA,MACA,UAAU,sBAAsB;AAAA,IACpC,CAAC;AACD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAoCA,OAAO,KAAK,QAAQ;AAChB,WAAO,KAAK,QAAQ,EAAE,CAAC,GAAG,GAAG,OAAO,CAAC;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,SAAS,OAAO;AACZ,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,UAAU;AAAA,IACd,CAAC;AAAA,EACL;AAAA,EACA,KAAK,MAAM;AACP,UAAM,QAAQ,CAAC;AACf,eAAW,OAAO,KAAK,WAAW,IAAI,GAAG;AACrC,UAAI,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,GAAG;AAC9B,cAAM,GAAG,IAAI,KAAK,MAAM,GAAG;AAAA,MAC/B;AAAA,IACJ;AACA,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,OAAO,MAAM;AAAA,IACjB,CAAC;AAAA,EACL;AAAA,EACA,KAAK,MAAM;AACP,UAAM,QAAQ,CAAC;AACf,eAAW,OAAO,KAAK,WAAW,KAAK,KAAK,GAAG;AAC3C,UAAI,CAAC,KAAK,GAAG,GAAG;AACZ,cAAM,GAAG,IAAI,KAAK,MAAM,GAAG;AAAA,MAC/B;AAAA,IACJ;AACA,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,OAAO,MAAM;AAAA,IACjB,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA,EAIA,cAAc;AACV,WAAO,eAAe,IAAI;AAAA,EAC9B;AAAA,EACA,QAAQ,MAAM;AACV,UAAM,WAAW,CAAC;AAClB,eAAW,OAAO,KAAK,WAAW,KAAK,KAAK,GAAG;AAC3C,YAAM,cAAc,KAAK,MAAM,GAAG;AAClC,UAAI,QAAQ,CAAC,KAAK,GAAG,GAAG;AACpB,iBAAS,GAAG,IAAI;AAAA,MACpB,OACK;AACD,iBAAS,GAAG,IAAI,YAAY,SAAS;AAAA,MACzC;AAAA,IACJ;AACA,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,OAAO,MAAM;AAAA,IACjB,CAAC;AAAA,EACL;AAAA,EACA,SAAS,MAAM;AACX,UAAM,WAAW,CAAC;AAClB,eAAW,OAAO,KAAK,WAAW,KAAK,KAAK,GAAG;AAC3C,UAAI,QAAQ,CAAC,KAAK,GAAG,GAAG;AACpB,iBAAS,GAAG,IAAI,KAAK,MAAM,GAAG;AAAA,MAClC,OACK;AACD,cAAM,cAAc,KAAK,MAAM,GAAG;AAClC,YAAI,WAAW;AACf,eAAO,oBAAoB,aAAa;AACpC,qBAAW,SAAS,KAAK;AAAA,QAC7B;AACA,iBAAS,GAAG,IAAI;AAAA,MACpB;AAAA,IACJ;AACA,WAAO,IAAI,WAAU;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,OAAO,MAAM;AAAA,IACjB,CAAC;AAAA,EACL;AAAA,EACA,QAAQ;AACJ,WAAO,cAAc,KAAK,WAAW,KAAK,KAAK,CAAC;AAAA,EACpD;AACJ;AACA,UAAU,SAAS,CAAC,OAAO,WAAW;AAClC,SAAO,IAAI,UAAU;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,aAAa;AAAA,IACb,UAAU,SAAS,OAAO;AAAA,IAC1B,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACA,UAAU,eAAe,CAAC,OAAO,WAAW;AACxC,SAAO,IAAI,UAAU;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,aAAa;AAAA,IACb,UAAU,SAAS,OAAO;AAAA,IAC1B,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACA,UAAU,aAAa,CAAC,OAAO,WAAW;AACtC,SAAO,IAAI,UAAU;AAAA,IACjB;AAAA,IACA,aAAa;AAAA,IACb,UAAU,SAAS,OAAO;AAAA,IAC1B,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,WAAN,cAAuB,QAAQ;AAAA,EAClC,OAAO,OAAO;AACV,UAAM,EAAE,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAC9C,UAAM,UAAU,KAAK,KAAK;AAC1B,aAAS,cAAc,SAAS;AAE5B,iBAAW,UAAU,SAAS;AAC1B,YAAI,OAAO,OAAO,WAAW,SAAS;AAClC,iBAAO,OAAO;AAAA,QAClB;AAAA,MACJ;AACA,iBAAW,UAAU,SAAS;AAC1B,YAAI,OAAO,OAAO,WAAW,SAAS;AAElC,cAAI,OAAO,OAAO,KAAK,GAAG,OAAO,IAAI,OAAO,MAAM;AAClD,iBAAO,OAAO;AAAA,QAClB;AAAA,MACJ;AAEA,YAAM,cAAc,QAAQ,IAAI,CAAC,WAAW,IAAI,SAAS,OAAO,IAAI,OAAO,MAAM,CAAC;AAClF,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,IAAI,OAAO,OAAO;AAClB,aAAO,QAAQ,IAAI,QAAQ,IAAI,OAAO,WAAW;AAC7C,cAAM,WAAW;AAAA,UACb,GAAG;AAAA,UACH,QAAQ;AAAA,YACJ,GAAG,IAAI;AAAA,YACP,QAAQ,CAAC;AAAA,UACb;AAAA,UACA,QAAQ;AAAA,QACZ;AACA,eAAO;AAAA,UACH,QAAQ,MAAM,OAAO,YAAY;AAAA,YAC7B,MAAM,IAAI;AAAA,YACV,MAAM,IAAI;AAAA,YACV,QAAQ;AAAA,UACZ,CAAC;AAAA,UACD,KAAK;AAAA,QACT;AAAA,MACJ,CAAC,CAAC,EAAE,KAAK,aAAa;AAAA,IAC1B,OACK;AACD,UAAI,QAAQ;AACZ,YAAM,SAAS,CAAC;AAChB,iBAAW,UAAU,SAAS;AAC1B,cAAM,WAAW;AAAA,UACb,GAAG;AAAA,UACH,QAAQ;AAAA,YACJ,GAAG,IAAI;AAAA,YACP,QAAQ,CAAC;AAAA,UACb;AAAA,UACA,QAAQ;AAAA,QACZ;AACA,cAAM,SAAS,OAAO,WAAW;AAAA,UAC7B,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,QACZ,CAAC;AACD,YAAI,OAAO,WAAW,SAAS;AAC3B,iBAAO;AAAA,QACX,WACS,OAAO,WAAW,WAAW,CAAC,OAAO;AAC1C,kBAAQ,EAAE,QAAQ,KAAK,SAAS;AAAA,QACpC;AACA,YAAI,SAAS,OAAO,OAAO,QAAQ;AAC/B,iBAAO,KAAK,SAAS,OAAO,MAAM;AAAA,QACtC;AAAA,MACJ;AACA,UAAI,OAAO;AACP,YAAI,OAAO,OAAO,KAAK,GAAG,MAAM,IAAI,OAAO,MAAM;AACjD,eAAO,MAAM;AAAA,MACjB;AACA,YAAM,cAAc,OAAO,IAAI,CAACE,YAAW,IAAI,SAASA,OAAM,CAAC;AAC/D,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB;AAAA,MACJ,CAAC;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACA,SAAS,SAAS,CAAC,OAAO,WAAW;AACjC,SAAO,IAAI,SAAS;AAAA,IAChB,SAAS;AAAA,IACT,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AAQA,IAAM,mBAAmB,CAAC,SAAS;AAC/B,MAAI,gBAAgB,SAAS;AACzB,WAAO,iBAAiB,KAAK,MAAM;AAAA,EACvC,WACS,gBAAgB,YAAY;AACjC,WAAO,iBAAiB,KAAK,UAAU,CAAC;AAAA,EAC5C,WACS,gBAAgB,YAAY;AACjC,WAAO,CAAC,KAAK,KAAK;AAAA,EACtB,WACS,gBAAgB,SAAS;AAC9B,WAAO,KAAK;AAAA,EAChB,WACS,gBAAgB,eAAe;AAEpC,WAAO,KAAK,aAAa,KAAK,IAAI;AAAA,EACtC,WACS,gBAAgB,YAAY;AACjC,WAAO,iBAAiB,KAAK,KAAK,SAAS;AAAA,EAC/C,WACS,gBAAgB,cAAc;AACnC,WAAO,CAAC,MAAS;AAAA,EACrB,WACS,gBAAgB,SAAS;AAC9B,WAAO,CAAC,IAAI;AAAA,EAChB,WACS,gBAAgB,aAAa;AAClC,WAAO,CAAC,QAAW,GAAG,iBAAiB,KAAK,OAAO,CAAC,CAAC;AAAA,EACzD,WACS,gBAAgB,aAAa;AAClC,WAAO,CAAC,MAAM,GAAG,iBAAiB,KAAK,OAAO,CAAC,CAAC;AAAA,EACpD,WACS,gBAAgB,YAAY;AACjC,WAAO,iBAAiB,KAAK,OAAO,CAAC;AAAA,EACzC,WACS,gBAAgB,aAAa;AAClC,WAAO,iBAAiB,KAAK,OAAO,CAAC;AAAA,EACzC,WACS,gBAAgB,UAAU;AAC/B,WAAO,iBAAiB,KAAK,KAAK,SAAS;AAAA,EAC/C,OACK;AACD,WAAO,CAAC;AAAA,EACZ;AACJ;AACO,IAAM,wBAAN,MAAM,+BAA8B,QAAQ;AAAA,EAC/C,OAAO,OAAO;AACV,UAAM,EAAE,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAC9C,QAAI,IAAI,eAAe,cAAc,QAAQ;AACzC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,gBAAgB,KAAK;AAC3B,UAAM,qBAAqB,IAAI,KAAK,aAAa;AACjD,UAAM,SAAS,KAAK,WAAW,IAAI,kBAAkB;AACrD,QAAI,CAAC,QAAQ;AACT,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,SAAS,MAAM,KAAK,KAAK,WAAW,KAAK,CAAC;AAAA,QAC1C,MAAM,CAAC,aAAa;AAAA,MACxB,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,IAAI,OAAO,OAAO;AAClB,aAAO,OAAO,YAAY;AAAA,QACtB,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,QAAQ;AAAA,MACZ,CAAC;AAAA,IACL,OACK;AACD,aAAO,OAAO,WAAW;AAAA,QACrB,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,QAAQ;AAAA,MACZ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EACA,IAAI,gBAAgB;AAChB,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,aAAa;AACb,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,OAAO,eAAe,SAAS,QAAQ;AAE1C,UAAM,aAAa,oBAAI,IAAI;AAE3B,eAAW,QAAQ,SAAS;AACxB,YAAM,sBAAsB,iBAAiB,KAAK,MAAM,aAAa,CAAC;AACtE,UAAI,CAAC,oBAAoB,QAAQ;AAC7B,cAAM,IAAI,MAAM,mCAAmC,aAAa,mDAAmD;AAAA,MACvH;AACA,iBAAW,SAAS,qBAAqB;AACrC,YAAI,WAAW,IAAI,KAAK,GAAG;AACvB,gBAAM,IAAI,MAAM,0BAA0B,OAAO,aAAa,CAAC,wBAAwB,OAAO,KAAK,CAAC,EAAE;AAAA,QAC1G;AACA,mBAAW,IAAI,OAAO,IAAI;AAAA,MAC9B;AAAA,IACJ;AACA,WAAO,IAAI,uBAAsB;AAAA,MAC7B,UAAU,sBAAsB;AAAA,MAChC;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,oBAAoB,MAAM;AAAA,IACjC,CAAC;AAAA,EACL;AACJ;AACA,SAAS,YAAY,GAAG,GAAG;AACvB,QAAM,QAAQ,cAAc,CAAC;AAC7B,QAAM,QAAQ,cAAc,CAAC;AAC7B,MAAI,MAAM,GAAG;AACT,WAAO,EAAE,OAAO,MAAM,MAAM,EAAE;AAAA,EAClC,WACS,UAAU,cAAc,UAAU,UAAU,cAAc,QAAQ;AACvE,UAAM,QAAQ,KAAK,WAAW,CAAC;AAC/B,UAAM,aAAa,KAAK,WAAW,CAAC,EAAE,OAAO,CAAC,QAAQ,MAAM,QAAQ,GAAG,MAAM,EAAE;AAC/E,UAAM,SAAS,EAAE,GAAG,GAAG,GAAG,EAAE;AAC5B,eAAW,OAAO,YAAY;AAC1B,YAAM,cAAc,YAAY,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC;AAC9C,UAAI,CAAC,YAAY,OAAO;AACpB,eAAO,EAAE,OAAO,MAAM;AAAA,MAC1B;AACA,aAAO,GAAG,IAAI,YAAY;AAAA,IAC9B;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,OAAO;AAAA,EACvC,WACS,UAAU,cAAc,SAAS,UAAU,cAAc,OAAO;AACrE,QAAI,EAAE,WAAW,EAAE,QAAQ;AACvB,aAAO,EAAE,OAAO,MAAM;AAAA,IAC1B;AACA,UAAM,WAAW,CAAC;AAClB,aAAS,QAAQ,GAAG,QAAQ,EAAE,QAAQ,SAAS;AAC3C,YAAM,QAAQ,EAAE,KAAK;AACrB,YAAM,QAAQ,EAAE,KAAK;AACrB,YAAM,cAAc,YAAY,OAAO,KAAK;AAC5C,UAAI,CAAC,YAAY,OAAO;AACpB,eAAO,EAAE,OAAO,MAAM;AAAA,MAC1B;AACA,eAAS,KAAK,YAAY,IAAI;AAAA,IAClC;AACA,WAAO,EAAE,OAAO,MAAM,MAAM,SAAS;AAAA,EACzC,WACS,UAAU,cAAc,QAAQ,UAAU,cAAc,QAAQ,CAAC,MAAM,CAAC,GAAG;AAChF,WAAO,EAAE,OAAO,MAAM,MAAM,EAAE;AAAA,EAClC,OACK;AACD,WAAO,EAAE,OAAO,MAAM;AAAA,EAC1B;AACJ;AACO,IAAM,kBAAN,cAA8B,QAAQ;AAAA,EACzC,OAAO,OAAO;AACV,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,oBAAoB,KAAK;AACtD,UAAM,eAAe,CAAC,YAAY,gBAAgB;AAC9C,UAAI,UAAU,UAAU,KAAK,UAAU,WAAW,GAAG;AACjD,eAAO;AAAA,MACX;AACA,YAAM,SAAS,YAAY,WAAW,OAAO,YAAY,KAAK;AAC9D,UAAI,CAAC,OAAO,OAAO;AACf,0BAAkB,KAAK;AAAA,UACnB,MAAM,aAAa;AAAA,QACvB,CAAC;AACD,eAAO;AAAA,MACX;AACA,UAAI,QAAQ,UAAU,KAAK,QAAQ,WAAW,GAAG;AAC7C,eAAO,MAAM;AAAA,MACjB;AACA,aAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,IACtD;AACA,QAAI,IAAI,OAAO,OAAO;AAClB,aAAO,QAAQ,IAAI;AAAA,QACf,KAAK,KAAK,KAAK,YAAY;AAAA,UACvB,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,QACZ,CAAC;AAAA,QACD,KAAK,KAAK,MAAM,YAAY;AAAA,UACxB,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,QACZ,CAAC;AAAA,MACL,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,KAAK,MAAM,aAAa,MAAM,KAAK,CAAC;AAAA,IACxD,OACK;AACD,aAAO,aAAa,KAAK,KAAK,KAAK,WAAW;AAAA,QAC1C,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,QAAQ;AAAA,MACZ,CAAC,GAAG,KAAK,KAAK,MAAM,WAAW;AAAA,QAC3B,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,QAAQ;AAAA,MACZ,CAAC,CAAC;AAAA,IACN;AAAA,EACJ;AACJ;AACA,gBAAgB,SAAS,CAAC,MAAM,OAAO,WAAW;AAC9C,SAAO,IAAI,gBAAgB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AAEO,IAAM,WAAN,MAAM,kBAAiB,QAAQ;AAAA,EAClC,OAAO,OAAO;AACV,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,oBAAoB,KAAK;AACtD,QAAI,IAAI,eAAe,cAAc,OAAO;AACxC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,IAAI,KAAK,SAAS,KAAK,KAAK,MAAM,QAAQ;AAC1C,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,SAAS,KAAK,KAAK,MAAM;AAAA,QACzB,WAAW;AAAA,QACX,OAAO;AAAA,QACP,MAAM;AAAA,MACV,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,CAAC,QAAQ,IAAI,KAAK,SAAS,KAAK,KAAK,MAAM,QAAQ;AACnD,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,SAAS,KAAK,KAAK,MAAM;AAAA,QACzB,WAAW;AAAA,QACX,OAAO;AAAA,QACP,MAAM;AAAA,MACV,CAAC;AACD,aAAO,MAAM;AAAA,IACjB;AACA,UAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,EACrB,IAAI,CAAC,MAAM,cAAc;AAC1B,YAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,KAAK,KAAK;AACvD,UAAI,CAAC;AACD,eAAO;AACX,aAAO,OAAO,OAAO,IAAI,mBAAmB,KAAK,MAAM,IAAI,MAAM,SAAS,CAAC;AAAA,IAC/E,CAAC,EACI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACtB,QAAI,IAAI,OAAO,OAAO;AAClB,aAAO,QAAQ,IAAI,KAAK,EAAE,KAAK,CAAC,YAAY;AACxC,eAAO,YAAY,WAAW,QAAQ,OAAO;AAAA,MACjD,CAAC;AAAA,IACL,OACK;AACD,aAAO,YAAY,WAAW,QAAQ,KAAK;AAAA,IAC/C;AAAA,EACJ;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,KAAK,MAAM;AACP,WAAO,IAAI,UAAS;AAAA,MAChB,GAAG,KAAK;AAAA,MACR;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;AACA,SAAS,SAAS,CAAC,SAAS,WAAW;AACnC,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AACzB,UAAM,IAAI,MAAM,uDAAuD;AAAA,EAC3E;AACA,SAAO,IAAI,SAAS;AAAA,IAChB,OAAO;AAAA,IACP,UAAU,sBAAsB;AAAA,IAChC,MAAM;AAAA,IACN,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,YAAN,MAAM,mBAAkB,QAAQ;AAAA,EACnC,IAAI,YAAY;AACZ,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,cAAc;AACd,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,OAAO,OAAO;AACV,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,oBAAoB,KAAK;AACtD,QAAI,IAAI,eAAe,cAAc,QAAQ;AACzC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,QAAQ,CAAC;AACf,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,YAAY,KAAK,KAAK;AAC5B,eAAW,OAAO,IAAI,MAAM;AACxB,YAAM,KAAK;AAAA,QACP,KAAK,QAAQ,OAAO,IAAI,mBAAmB,KAAK,KAAK,IAAI,MAAM,GAAG,CAAC;AAAA,QACnE,OAAO,UAAU,OAAO,IAAI,mBAAmB,KAAK,IAAI,KAAK,GAAG,GAAG,IAAI,MAAM,GAAG,CAAC;AAAA,QACjF,WAAW,OAAO,IAAI;AAAA,MAC1B,CAAC;AAAA,IACL;AACA,QAAI,IAAI,OAAO,OAAO;AAClB,aAAO,YAAY,iBAAiB,QAAQ,KAAK;AAAA,IACrD,OACK;AACD,aAAO,YAAY,gBAAgB,QAAQ,KAAK;AAAA,IACpD;AAAA,EACJ;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,OAAO,OAAO,OAAO,QAAQ,OAAO;AAChC,QAAI,kBAAkB,SAAS;AAC3B,aAAO,IAAI,WAAU;AAAA,QACjB,SAAS;AAAA,QACT,WAAW;AAAA,QACX,UAAU,sBAAsB;AAAA,QAChC,GAAG,oBAAoB,KAAK;AAAA,MAChC,CAAC;AAAA,IACL;AACA,WAAO,IAAI,WAAU;AAAA,MACjB,SAAS,UAAU,OAAO;AAAA,MAC1B,WAAW;AAAA,MACX,UAAU,sBAAsB;AAAA,MAChC,GAAG,oBAAoB,MAAM;AAAA,IACjC,CAAC;AAAA,EACL;AACJ;AACO,IAAM,SAAN,cAAqB,QAAQ;AAAA,EAChC,IAAI,YAAY;AACZ,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,cAAc;AACd,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,OAAO,OAAO;AACV,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,oBAAoB,KAAK;AACtD,QAAI,IAAI,eAAe,cAAc,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,YAAY,KAAK,KAAK;AAC5B,UAAM,QAAQ,CAAC,GAAG,IAAI,KAAK,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,UAAU;AAC/D,aAAO;AAAA,QACH,KAAK,QAAQ,OAAO,IAAI,mBAAmB,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;AAAA,QAC9E,OAAO,UAAU,OAAO,IAAI,mBAAmB,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,OAAO,CAAC,CAAC;AAAA,MAC1F;AAAA,IACJ,CAAC;AACD,QAAI,IAAI,OAAO,OAAO;AAClB,YAAM,WAAW,oBAAI,IAAI;AACzB,aAAO,QAAQ,QAAQ,EAAE,KAAK,YAAY;AACtC,mBAAW,QAAQ,OAAO;AACtB,gBAAM,MAAM,MAAM,KAAK;AACvB,gBAAM,QAAQ,MAAM,KAAK;AACzB,cAAI,IAAI,WAAW,aAAa,MAAM,WAAW,WAAW;AACxD,mBAAO;AAAA,UACX;AACA,cAAI,IAAI,WAAW,WAAW,MAAM,WAAW,SAAS;AACpD,mBAAO,MAAM;AAAA,UACjB;AACA,mBAAS,IAAI,IAAI,OAAO,MAAM,KAAK;AAAA,QACvC;AACA,eAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,SAAS;AAAA,MACnD,CAAC;AAAA,IACL,OACK;AACD,YAAM,WAAW,oBAAI,IAAI;AACzB,iBAAW,QAAQ,OAAO;AACtB,cAAM,MAAM,KAAK;AACjB,cAAM,QAAQ,KAAK;AACnB,YAAI,IAAI,WAAW,aAAa,MAAM,WAAW,WAAW;AACxD,iBAAO;AAAA,QACX;AACA,YAAI,IAAI,WAAW,WAAW,MAAM,WAAW,SAAS;AACpD,iBAAO,MAAM;AAAA,QACjB;AACA,iBAAS,IAAI,IAAI,OAAO,MAAM,KAAK;AAAA,MACvC;AACA,aAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,SAAS;AAAA,IACnD;AAAA,EACJ;AACJ;AACA,OAAO,SAAS,CAAC,SAAS,WAAW,WAAW;AAC5C,SAAO,IAAI,OAAO;AAAA,IACd;AAAA,IACA;AAAA,IACA,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,SAAN,MAAM,gBAAe,QAAQ;AAAA,EAChC,OAAO,OAAO;AACV,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,oBAAoB,KAAK;AACtD,QAAI,IAAI,eAAe,cAAc,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,MAAM,KAAK;AACjB,QAAI,IAAI,YAAY,MAAM;AACtB,UAAI,IAAI,KAAK,OAAO,IAAI,QAAQ,OAAO;AACnC,0BAAkB,KAAK;AAAA,UACnB,MAAM,aAAa;AAAA,UACnB,SAAS,IAAI,QAAQ;AAAA,UACrB,MAAM;AAAA,UACN,WAAW;AAAA,UACX,OAAO;AAAA,UACP,SAAS,IAAI,QAAQ;AAAA,QACzB,CAAC;AACD,eAAO,MAAM;AAAA,MACjB;AAAA,IACJ;AACA,QAAI,IAAI,YAAY,MAAM;AACtB,UAAI,IAAI,KAAK,OAAO,IAAI,QAAQ,OAAO;AACnC,0BAAkB,KAAK;AAAA,UACnB,MAAM,aAAa;AAAA,UACnB,SAAS,IAAI,QAAQ;AAAA,UACrB,MAAM;AAAA,UACN,WAAW;AAAA,UACX,OAAO;AAAA,UACP,SAAS,IAAI,QAAQ;AAAA,QACzB,CAAC;AACD,eAAO,MAAM;AAAA,MACjB;AAAA,IACJ;AACA,UAAM,YAAY,KAAK,KAAK;AAC5B,aAAS,YAAYC,WAAU;AAC3B,YAAM,YAAY,oBAAI,IAAI;AAC1B,iBAAW,WAAWA,WAAU;AAC5B,YAAI,QAAQ,WAAW;AACnB,iBAAO;AACX,YAAI,QAAQ,WAAW;AACnB,iBAAO,MAAM;AACjB,kBAAU,IAAI,QAAQ,KAAK;AAAA,MAC/B;AACA,aAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,UAAU;AAAA,IACpD;AACA,UAAM,WAAW,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,MAAM,UAAU,OAAO,IAAI,mBAAmB,KAAK,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC;AACzH,QAAI,IAAI,OAAO,OAAO;AAClB,aAAO,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAACA,cAAa,YAAYA,SAAQ,CAAC;AAAA,IACzE,OACK;AACD,aAAO,YAAY,QAAQ;AAAA,IAC/B;AAAA,EACJ;AAAA,EACA,IAAI,SAAS,SAAS;AAClB,WAAO,IAAI,QAAO;AAAA,MACd,GAAG,KAAK;AAAA,MACR,SAAS,EAAE,OAAO,SAAS,SAAS,UAAU,SAAS,OAAO,EAAE;AAAA,IACpE,CAAC;AAAA,EACL;AAAA,EACA,IAAI,SAAS,SAAS;AAClB,WAAO,IAAI,QAAO;AAAA,MACd,GAAG,KAAK;AAAA,MACR,SAAS,EAAE,OAAO,SAAS,SAAS,UAAU,SAAS,OAAO,EAAE;AAAA,IACpE,CAAC;AAAA,EACL;AAAA,EACA,KAAK,MAAM,SAAS;AAChB,WAAO,KAAK,IAAI,MAAM,OAAO,EAAE,IAAI,MAAM,OAAO;AAAA,EACpD;AAAA,EACA,SAAS,SAAS;AACd,WAAO,KAAK,IAAI,GAAG,OAAO;AAAA,EAC9B;AACJ;AACA,OAAO,SAAS,CAAC,WAAW,WAAW;AACnC,SAAO,IAAI,OAAO;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT,SAAS;AAAA,IACT,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,cAAN,MAAM,qBAAoB,QAAQ;AAAA,EACrC,cAAc;AACV,UAAM,GAAG,SAAS;AAClB,SAAK,WAAW,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,OAAO;AACV,UAAM,EAAE,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAC9C,QAAI,IAAI,eAAe,cAAc,UAAU;AAC3C,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,aAAS,cAAc,MAAML,QAAO;AAChC,aAAO,UAAU;AAAA,QACb,MAAM;AAAA,QACN,MAAM,IAAI;AAAA,QACV,WAAW,CAAC,IAAI,OAAO,oBAAoB,IAAI,gBAAgB,YAAY,GAAG,UAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,QAChH,WAAW;AAAA,UACP,MAAM,aAAa;AAAA,UACnB,gBAAgBA;AAAA,QACpB;AAAA,MACJ,CAAC;AAAA,IACL;AACA,aAAS,iBAAiB,SAASA,QAAO;AACtC,aAAO,UAAU;AAAA,QACb,MAAM;AAAA,QACN,MAAM,IAAI;AAAA,QACV,WAAW,CAAC,IAAI,OAAO,oBAAoB,IAAI,gBAAgB,YAAY,GAAG,UAAe,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,QAChH,WAAW;AAAA,UACP,MAAM,aAAa;AAAA,UACnB,iBAAiBA;AAAA,QACrB;AAAA,MACJ,CAAC;AAAA,IACL;AACA,UAAM,SAAS,EAAE,UAAU,IAAI,OAAO,mBAAmB;AACzD,UAAM,KAAK,IAAI;AACf,QAAI,KAAK,KAAK,mBAAmB,YAAY;AAIzC,YAAM,KAAK;AACX,aAAO,GAAG,kBAAmB,MAAM;AAC/B,cAAMA,SAAQ,IAAI,SAAS,CAAC,CAAC;AAC7B,cAAM,aAAa,MAAM,GAAG,KAAK,KAAK,WAAW,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM;AACxE,UAAAA,OAAM,SAAS,cAAc,MAAM,CAAC,CAAC;AACrC,gBAAMA;AAAA,QACV,CAAC;AACD,cAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,MAAM,UAAU;AACvD,cAAM,gBAAgB,MAAM,GAAG,KAAK,QAAQ,KAAK,KAC5C,WAAW,QAAQ,MAAM,EACzB,MAAM,CAAC,MAAM;AACd,UAAAA,OAAM,SAAS,iBAAiB,QAAQ,CAAC,CAAC;AAC1C,gBAAMA;AAAA,QACV,CAAC;AACD,eAAO;AAAA,MACX,CAAC;AAAA,IACL,OACK;AAID,YAAM,KAAK;AACX,aAAO,GAAG,YAAa,MAAM;AACzB,cAAM,aAAa,GAAG,KAAK,KAAK,UAAU,MAAM,MAAM;AACtD,YAAI,CAAC,WAAW,SAAS;AACrB,gBAAM,IAAI,SAAS,CAAC,cAAc,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA,QAC9D;AACA,cAAM,SAAS,QAAQ,MAAM,IAAI,MAAM,WAAW,IAAI;AACtD,cAAM,gBAAgB,GAAG,KAAK,QAAQ,UAAU,QAAQ,MAAM;AAC9D,YAAI,CAAC,cAAc,SAAS;AACxB,gBAAM,IAAI,SAAS,CAAC,iBAAiB,QAAQ,cAAc,KAAK,CAAC,CAAC;AAAA,QACtE;AACA,eAAO,cAAc;AAAA,MACzB,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EACA,aAAa;AACT,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,aAAa;AACT,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,QAAQ,OAAO;AACX,WAAO,IAAI,aAAY;AAAA,MACnB,GAAG,KAAK;AAAA,MACR,MAAM,SAAS,OAAO,KAAK,EAAE,KAAK,WAAW,OAAO,CAAC;AAAA,IACzD,CAAC;AAAA,EACL;AAAA,EACA,QAAQ,YAAY;AAChB,WAAO,IAAI,aAAY;AAAA,MACnB,GAAG,KAAK;AAAA,MACR,SAAS;AAAA,IACb,CAAC;AAAA,EACL;AAAA,EACA,UAAU,MAAM;AACZ,UAAM,gBAAgB,KAAK,MAAM,IAAI;AACrC,WAAO;AAAA,EACX;AAAA,EACA,gBAAgB,MAAM;AAClB,UAAM,gBAAgB,KAAK,MAAM,IAAI;AACrC,WAAO;AAAA,EACX;AAAA,EACA,OAAO,OAAO,MAAM,SAAS,QAAQ;AACjC,WAAO,IAAI,aAAY;AAAA,MACnB,MAAO,OAAO,OAAO,SAAS,OAAO,CAAC,CAAC,EAAE,KAAK,WAAW,OAAO,CAAC;AAAA,MACjE,SAAS,WAAW,WAAW,OAAO;AAAA,MACtC,UAAU,sBAAsB;AAAA,MAChC,GAAG,oBAAoB,MAAM;AAAA,IACjC,CAAC;AAAA,EACL;AACJ;AACO,IAAM,UAAN,cAAsB,QAAQ;AAAA,EACjC,IAAI,SAAS;AACT,WAAO,KAAK,KAAK,OAAO;AAAA,EAC5B;AAAA,EACA,OAAO,OAAO;AACV,UAAM,EAAE,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAC9C,UAAM,aAAa,KAAK,KAAK,OAAO;AACpC,WAAO,WAAW,OAAO,EAAE,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC;AAAA,EAC5E;AACJ;AACA,QAAQ,SAAS,CAAC,QAAQ,WAAW;AACjC,SAAO,IAAI,QAAQ;AAAA,IACf;AAAA,IACA,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,aAAN,cAAyB,QAAQ;AAAA,EACpC,OAAO,OAAO;AACV,QAAI,MAAM,SAAS,KAAK,KAAK,OAAO;AAChC,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,UAAU,IAAI;AAAA,QACd,MAAM,aAAa;AAAA,QACnB,UAAU,KAAK,KAAK;AAAA,MACxB,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,EAAE,QAAQ,SAAS,OAAO,MAAM,KAAK;AAAA,EAChD;AAAA,EACA,IAAI,QAAQ;AACR,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACA,WAAW,SAAS,CAAC,OAAO,WAAW;AACnC,SAAO,IAAI,WAAW;AAAA,IAClB;AAAA,IACA,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACA,SAAS,cAAc,QAAQ,QAAQ;AACnC,SAAO,IAAI,QAAQ;AAAA,IACf;AAAA,IACA,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,UAAN,MAAM,iBAAgB,QAAQ;AAAA,EACjC,OAAO,OAAO;AACV,QAAI,OAAO,MAAM,SAAS,UAAU;AAChC,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,YAAM,iBAAiB,KAAK,KAAK;AACjC,wBAAkB,KAAK;AAAA,QACnB,UAAU,KAAK,WAAW,cAAc;AAAA,QACxC,UAAU,IAAI;AAAA,QACd,MAAM,aAAa;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAK,QAAQ;AACd,WAAK,SAAS,IAAI,IAAI,KAAK,KAAK,MAAM;AAAA,IAC1C;AACA,QAAI,CAAC,KAAK,OAAO,IAAI,MAAM,IAAI,GAAG;AAC9B,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,YAAM,iBAAiB,KAAK,KAAK;AACjC,wBAAkB,KAAK;AAAA,QACnB,UAAU,IAAI;AAAA,QACd,MAAM,aAAa;AAAA,QACnB,SAAS;AAAA,MACb,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AAAA,EACA,IAAI,UAAU;AACV,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,IAAI,OAAO;AACP,UAAM,aAAa,CAAC;AACpB,eAAW,OAAO,KAAK,KAAK,QAAQ;AAChC,iBAAW,GAAG,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACX;AAAA,EACA,IAAI,SAAS;AACT,UAAM,aAAa,CAAC;AACpB,eAAW,OAAO,KAAK,KAAK,QAAQ;AAChC,iBAAW,GAAG,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACX;AAAA,EACA,IAAI,OAAO;AACP,UAAM,aAAa,CAAC;AACpB,eAAW,OAAO,KAAK,KAAK,QAAQ;AAChC,iBAAW,GAAG,IAAI;AAAA,IACtB;AACA,WAAO;AAAA,EACX;AAAA,EACA,QAAQ,QAAQ,SAAS,KAAK,MAAM;AAChC,WAAO,SAAQ,OAAO,QAAQ;AAAA,MAC1B,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACP,CAAC;AAAA,EACL;AAAA,EACA,QAAQ,QAAQ,SAAS,KAAK,MAAM;AAChC,WAAO,SAAQ,OAAO,KAAK,QAAQ,OAAO,CAAC,QAAQ,CAAC,OAAO,SAAS,GAAG,CAAC,GAAG;AAAA,MACvE,GAAG,KAAK;AAAA,MACR,GAAG;AAAA,IACP,CAAC;AAAA,EACL;AACJ;AACA,QAAQ,SAAS;AACV,IAAM,gBAAN,cAA4B,QAAQ;AAAA,EACvC,OAAO,OAAO;AACV,UAAM,mBAAmB,KAAK,mBAAmB,KAAK,KAAK,MAAM;AACjE,UAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,QAAI,IAAI,eAAe,cAAc,UAAU,IAAI,eAAe,cAAc,QAAQ;AACpF,YAAM,iBAAiB,KAAK,aAAa,gBAAgB;AACzD,wBAAkB,KAAK;AAAA,QACnB,UAAU,KAAK,WAAW,cAAc;AAAA,QACxC,UAAU,IAAI;AAAA,QACd,MAAM,aAAa;AAAA,MACvB,CAAC;AACD,aAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAK,QAAQ;AACd,WAAK,SAAS,IAAI,IAAI,KAAK,mBAAmB,KAAK,KAAK,MAAM,CAAC;AAAA,IACnE;AACA,QAAI,CAAC,KAAK,OAAO,IAAI,MAAM,IAAI,GAAG;AAC9B,YAAM,iBAAiB,KAAK,aAAa,gBAAgB;AACzD,wBAAkB,KAAK;AAAA,QACnB,UAAU,IAAI;AAAA,QACd,MAAM,aAAa;AAAA,QACnB,SAAS;AAAA,MACb,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,GAAG,MAAM,IAAI;AAAA,EACxB;AAAA,EACA,IAAI,OAAO;AACP,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACA,cAAc,SAAS,CAAC,QAAQ,WAAW;AACvC,SAAO,IAAI,cAAc;AAAA,IACrB;AAAA,IACA,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,aAAN,cAAyB,QAAQ;AAAA,EACpC,SAAS;AACL,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,OAAO,OAAO;AACV,UAAM,EAAE,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAC9C,QAAI,IAAI,eAAe,cAAc,WAAW,IAAI,OAAO,UAAU,OAAO;AACxE,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,UAAM,cAAc,IAAI,eAAe,cAAc,UAAU,IAAI,OAAO,QAAQ,QAAQ,IAAI,IAAI;AAClG,WAAO,GAAG,YAAY,KAAK,CAAC,SAAS;AACjC,aAAO,KAAK,KAAK,KAAK,WAAW,MAAM;AAAA,QACnC,MAAM,IAAI;AAAA,QACV,UAAU,IAAI,OAAO;AAAA,MACzB,CAAC;AAAA,IACL,CAAC,CAAC;AAAA,EACN;AACJ;AACA,WAAW,SAAS,CAAC,QAAQ,WAAW;AACpC,SAAO,IAAI,WAAW;AAAA,IAClB,MAAM;AAAA,IACN,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,aAAN,cAAyB,QAAQ;AAAA,EACpC,YAAY;AACR,WAAO,KAAK,KAAK;AAAA,EACrB;AAAA,EACA,aAAa;AACT,WAAO,KAAK,KAAK,OAAO,KAAK,aAAa,sBAAsB,aAC1D,KAAK,KAAK,OAAO,WAAW,IAC5B,KAAK,KAAK;AAAA,EACpB;AAAA,EACA,OAAO,OAAO;AACV,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,oBAAoB,KAAK;AACtD,UAAM,SAAS,KAAK,KAAK,UAAU;AACnC,UAAM,WAAW;AAAA,MACb,UAAU,CAAC,QAAQ;AACf,0BAAkB,KAAK,GAAG;AAC1B,YAAI,IAAI,OAAO;AACX,iBAAO,MAAM;AAAA,QACjB,OACK;AACD,iBAAO,MAAM;AAAA,QACjB;AAAA,MACJ;AAAA,MACA,IAAI,OAAO;AACP,eAAO,IAAI;AAAA,MACf;AAAA,IACJ;AACA,aAAS,WAAW,SAAS,SAAS,KAAK,QAAQ;AACnD,QAAI,OAAO,SAAS,cAAc;AAC9B,YAAM,YAAY,OAAO,UAAU,IAAI,MAAM,QAAQ;AACrD,UAAI,IAAI,OAAO,OAAO;AAClB,eAAO,QAAQ,QAAQ,SAAS,EAAE,KAAK,OAAOM,eAAc;AACxD,cAAI,OAAO,UAAU;AACjB,mBAAO;AACX,gBAAM,SAAS,MAAM,KAAK,KAAK,OAAO,YAAY;AAAA,YAC9C,MAAMA;AAAA,YACN,MAAM,IAAI;AAAA,YACV,QAAQ;AAAA,UACZ,CAAC;AACD,cAAI,OAAO,WAAW;AAClB,mBAAO;AACX,cAAI,OAAO,WAAW;AAClB,mBAAO,MAAM,OAAO,KAAK;AAC7B,cAAI,OAAO,UAAU;AACjB,mBAAO,MAAM,OAAO,KAAK;AAC7B,iBAAO;AAAA,QACX,CAAC;AAAA,MACL,OACK;AACD,YAAI,OAAO,UAAU;AACjB,iBAAO;AACX,cAAM,SAAS,KAAK,KAAK,OAAO,WAAW;AAAA,UACvC,MAAM;AAAA,UACN,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,QACZ,CAAC;AACD,YAAI,OAAO,WAAW;AAClB,iBAAO;AACX,YAAI,OAAO,WAAW;AAClB,iBAAO,MAAM,OAAO,KAAK;AAC7B,YAAI,OAAO,UAAU;AACjB,iBAAO,MAAM,OAAO,KAAK;AAC7B,eAAO;AAAA,MACX;AAAA,IACJ;AACA,QAAI,OAAO,SAAS,cAAc;AAC9B,YAAM,oBAAoB,CAAC,QAAQ;AAC/B,cAAM,SAAS,OAAO,WAAW,KAAK,QAAQ;AAC9C,YAAI,IAAI,OAAO,OAAO;AAClB,iBAAO,QAAQ,QAAQ,MAAM;AAAA,QACjC;AACA,YAAI,kBAAkB,SAAS;AAC3B,gBAAM,IAAI,MAAM,2FAA2F;AAAA,QAC/G;AACA,eAAO;AAAA,MACX;AACA,UAAI,IAAI,OAAO,UAAU,OAAO;AAC5B,cAAM,QAAQ,KAAK,KAAK,OAAO,WAAW;AAAA,UACtC,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,QACZ,CAAC;AACD,YAAI,MAAM,WAAW;AACjB,iBAAO;AACX,YAAI,MAAM,WAAW;AACjB,iBAAO,MAAM;AAEjB,0BAAkB,MAAM,KAAK;AAC7B,eAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,MAAM,MAAM;AAAA,MACtD,OACK;AACD,eAAO,KAAK,KAAK,OAAO,YAAY,EAAE,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU;AACjG,cAAI,MAAM,WAAW;AACjB,mBAAO;AACX,cAAI,MAAM,WAAW;AACjB,mBAAO,MAAM;AACjB,iBAAO,kBAAkB,MAAM,KAAK,EAAE,KAAK,MAAM;AAC7C,mBAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,MAAM,MAAM;AAAA,UACtD,CAAC;AAAA,QACL,CAAC;AAAA,MACL;AAAA,IACJ;AACA,QAAI,OAAO,SAAS,aAAa;AAC7B,UAAI,IAAI,OAAO,UAAU,OAAO;AAC5B,cAAM,OAAO,KAAK,KAAK,OAAO,WAAW;AAAA,UACrC,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,QACZ,CAAC;AACD,YAAI,CAAC,QAAQ,IAAI;AACb,iBAAO;AACX,cAAM,SAAS,OAAO,UAAU,KAAK,OAAO,QAAQ;AACpD,YAAI,kBAAkB,SAAS;AAC3B,gBAAM,IAAI,MAAM,iGAAiG;AAAA,QACrH;AACA,eAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,OAAO;AAAA,MACjD,OACK;AACD,eAAO,KAAK,KAAK,OAAO,YAAY,EAAE,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS;AAChG,cAAI,CAAC,QAAQ,IAAI;AACb,mBAAO;AACX,iBAAO,QAAQ,QAAQ,OAAO,UAAU,KAAK,OAAO,QAAQ,CAAC,EAAE,KAAK,CAAC,YAAY;AAAA,YAC7E,QAAQ,OAAO;AAAA,YACf,OAAO;AAAA,UACX,EAAE;AAAA,QACN,CAAC;AAAA,MACL;AAAA,IACJ;AACA,SAAK,YAAY,MAAM;AAAA,EAC3B;AACJ;AACA,WAAW,SAAS,CAAC,QAAQ,QAAQ,WAAW;AAC5C,SAAO,IAAI,WAAW;AAAA,IAClB;AAAA,IACA,UAAU,sBAAsB;AAAA,IAChC;AAAA,IACA,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACA,WAAW,uBAAuB,CAAC,YAAY,QAAQ,WAAW;AAC9D,SAAO,IAAI,WAAW;AAAA,IAClB;AAAA,IACA,QAAQ,EAAE,MAAM,cAAc,WAAW,WAAW;AAAA,IACpD,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AAEO,IAAM,cAAN,cAA0B,QAAQ;AAAA,EACrC,OAAO,OAAO;AACV,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,WAAW;AACxC,aAAO,GAAG,MAAS;AAAA,IACvB;AACA,WAAO,KAAK,KAAK,UAAU,OAAO,KAAK;AAAA,EAC3C;AAAA,EACA,SAAS;AACL,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACA,YAAY,SAAS,CAAC,MAAM,WAAW;AACnC,SAAO,IAAI,YAAY;AAAA,IACnB,WAAW;AAAA,IACX,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,cAAN,cAA0B,QAAQ;AAAA,EACrC,OAAO,OAAO;AACV,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,MAAM;AACnC,aAAO,GAAG,IAAI;AAAA,IAClB;AACA,WAAO,KAAK,KAAK,UAAU,OAAO,KAAK;AAAA,EAC3C;AAAA,EACA,SAAS;AACL,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACA,YAAY,SAAS,CAAC,MAAM,WAAW;AACnC,SAAO,IAAI,YAAY;AAAA,IACnB,WAAW;AAAA,IACX,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,aAAN,cAAyB,QAAQ;AAAA,EACpC,OAAO,OAAO;AACV,UAAM,EAAE,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAC9C,QAAI,OAAO,IAAI;AACf,QAAI,IAAI,eAAe,cAAc,WAAW;AAC5C,aAAO,KAAK,KAAK,aAAa;AAAA,IAClC;AACA,WAAO,KAAK,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,MACA,MAAM,IAAI;AAAA,MACV,QAAQ;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EACA,gBAAgB;AACZ,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACA,WAAW,SAAS,CAAC,MAAM,WAAW;AAClC,SAAO,IAAI,WAAW;AAAA,IAClB,WAAW;AAAA,IACX,UAAU,sBAAsB;AAAA,IAChC,cAAc,OAAO,OAAO,YAAY,aAAa,OAAO,UAAU,MAAM,OAAO;AAAA,IACnF,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,WAAN,cAAuB,QAAQ;AAAA,EAClC,OAAO,OAAO;AACV,UAAM,EAAE,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAE9C,UAAM,SAAS;AAAA,MACX,GAAG;AAAA,MACH,QAAQ;AAAA,QACJ,GAAG,IAAI;AAAA,QACP,QAAQ,CAAC;AAAA,MACb;AAAA,IACJ;AACA,UAAM,SAAS,KAAK,KAAK,UAAU,OAAO;AAAA,MACtC,MAAM,OAAO;AAAA,MACb,MAAM,OAAO;AAAA,MACb,QAAQ;AAAA,QACJ,GAAG;AAAA,MACP;AAAA,IACJ,CAAC;AACD,QAAI,QAAQ,MAAM,GAAG;AACjB,aAAO,OAAO,KAAK,CAACC,YAAW;AAC3B,eAAO;AAAA,UACH,QAAQ;AAAA,UACR,OAAOA,QAAO,WAAW,UACnBA,QAAO,QACP,KAAK,KAAK,WAAW;AAAA,YACnB,IAAI,QAAQ;AACR,qBAAO,IAAI,SAAS,OAAO,OAAO,MAAM;AAAA,YAC5C;AAAA,YACA,OAAO,OAAO;AAAA,UAClB,CAAC;AAAA,QACT;AAAA,MACJ,CAAC;AAAA,IACL,OACK;AACD,aAAO;AAAA,QACH,QAAQ;AAAA,QACR,OAAO,OAAO,WAAW,UACnB,OAAO,QACP,KAAK,KAAK,WAAW;AAAA,UACnB,IAAI,QAAQ;AACR,mBAAO,IAAI,SAAS,OAAO,OAAO,MAAM;AAAA,UAC5C;AAAA,UACA,OAAO,OAAO;AAAA,QAClB,CAAC;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,cAAc;AACV,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACA,SAAS,SAAS,CAAC,MAAM,WAAW;AAChC,SAAO,IAAI,SAAS;AAAA,IAChB,WAAW;AAAA,IACX,UAAU,sBAAsB;AAAA,IAChC,YAAY,OAAO,OAAO,UAAU,aAAa,OAAO,QAAQ,MAAM,OAAO;AAAA,IAC7E,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,SAAN,cAAqB,QAAQ;AAAA,EAChC,OAAO,OAAO;AACV,UAAM,aAAa,KAAK,SAAS,KAAK;AACtC,QAAI,eAAe,cAAc,KAAK;AAClC,YAAM,MAAM,KAAK,gBAAgB,KAAK;AACtC,wBAAkB,KAAK;AAAA,QACnB,MAAM,aAAa;AAAA,QACnB,UAAU,cAAc;AAAA,QACxB,UAAU,IAAI;AAAA,MAClB,CAAC;AACD,aAAO;AAAA,IACX;AACA,WAAO,EAAE,QAAQ,SAAS,OAAO,MAAM,KAAK;AAAA,EAChD;AACJ;AACA,OAAO,SAAS,CAAC,WAAW;AACxB,SAAO,IAAI,OAAO;AAAA,IACd,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AACO,IAAM,QAAQ,uBAAO,WAAW;AAChC,IAAM,aAAN,cAAyB,QAAQ;AAAA,EACpC,OAAO,OAAO;AACV,UAAM,EAAE,IAAI,IAAI,KAAK,oBAAoB,KAAK;AAC9C,UAAM,OAAO,IAAI;AACjB,WAAO,KAAK,KAAK,KAAK,OAAO;AAAA,MACzB;AAAA,MACA,MAAM,IAAI;AAAA,MACV,QAAQ;AAAA,IACZ,CAAC;AAAA,EACL;AAAA,EACA,SAAS;AACL,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACO,IAAM,cAAN,MAAM,qBAAoB,QAAQ;AAAA,EACrC,OAAO,OAAO;AACV,UAAM,EAAE,QAAQ,IAAI,IAAI,KAAK,oBAAoB,KAAK;AACtD,QAAI,IAAI,OAAO,OAAO;AAClB,YAAM,cAAc,YAAY;AAC5B,cAAM,WAAW,MAAM,KAAK,KAAK,GAAG,YAAY;AAAA,UAC5C,MAAM,IAAI;AAAA,UACV,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,QACZ,CAAC;AACD,YAAI,SAAS,WAAW;AACpB,iBAAO;AACX,YAAI,SAAS,WAAW,SAAS;AAC7B,iBAAO,MAAM;AACb,iBAAO,MAAM,SAAS,KAAK;AAAA,QAC/B,OACK;AACD,iBAAO,KAAK,KAAK,IAAI,YAAY;AAAA,YAC7B,MAAM,SAAS;AAAA,YACf,MAAM,IAAI;AAAA,YACV,QAAQ;AAAA,UACZ,CAAC;AAAA,QACL;AAAA,MACJ;AACA,aAAO,YAAY;AAAA,IACvB,OACK;AACD,YAAM,WAAW,KAAK,KAAK,GAAG,WAAW;AAAA,QACrC,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,QAAQ;AAAA,MACZ,CAAC;AACD,UAAI,SAAS,WAAW;AACpB,eAAO;AACX,UAAI,SAAS,WAAW,SAAS;AAC7B,eAAO,MAAM;AACb,eAAO;AAAA,UACH,QAAQ;AAAA,UACR,OAAO,SAAS;AAAA,QACpB;AAAA,MACJ,OACK;AACD,eAAO,KAAK,KAAK,IAAI,WAAW;AAAA,UAC5B,MAAM,SAAS;AAAA,UACf,MAAM,IAAI;AAAA,UACV,QAAQ;AAAA,QACZ,CAAC;AAAA,MACL;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,OAAO,OAAO,GAAG,GAAG;AAChB,WAAO,IAAI,aAAY;AAAA,MACnB,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,UAAU,sBAAsB;AAAA,IACpC,CAAC;AAAA,EACL;AACJ;AACO,IAAM,cAAN,cAA0B,QAAQ;AAAA,EACrC,OAAO,OAAO;AACV,UAAM,SAAS,KAAK,KAAK,UAAU,OAAO,KAAK;AAC/C,UAAM,SAAS,CAAC,SAAS;AACrB,UAAI,QAAQ,IAAI,GAAG;AACf,aAAK,QAAQ,OAAO,OAAO,KAAK,KAAK;AAAA,MACzC;AACA,aAAO;AAAA,IACX;AACA,WAAO,QAAQ,MAAM,IAAI,OAAO,KAAK,CAAC,SAAS,OAAO,IAAI,CAAC,IAAI,OAAO,MAAM;AAAA,EAChF;AAAA,EACA,SAAS;AACL,WAAO,KAAK,KAAK;AAAA,EACrB;AACJ;AACA,YAAY,SAAS,CAAC,MAAM,WAAW;AACnC,SAAO,IAAI,YAAY;AAAA,IACnB,WAAW;AAAA,IACX,UAAU,sBAAsB;AAAA,IAChC,GAAG,oBAAoB,MAAM;AAAA,EACjC,CAAC;AACL;AAQA,SAAS,YAAY,QAAQ,MAAM;AAC/B,QAAM,IAAI,OAAO,WAAW,aAAa,OAAO,IAAI,IAAI,OAAO,WAAW,WAAW,EAAE,SAAS,OAAO,IAAI;AAC3G,QAAM,KAAK,OAAO,MAAM,WAAW,EAAE,SAAS,EAAE,IAAI;AACpD,SAAO;AACX;AACO,SAAS,OAAO,OAAO,UAAU,CAAC,GAWzC,OAAO;AACH,MAAI;AACA,WAAO,OAAO,OAAO,EAAE,YAAY,CAAC,MAAM,QAAQ;AAC9C,YAAM,IAAI,MAAM,IAAI;AACpB,UAAI,aAAa,SAAS;AACtB,eAAO,EAAE,KAAK,CAACC,OAAM;AACjB,cAAI,CAACA,IAAG;AACJ,kBAAM,SAAS,YAAY,SAAS,IAAI;AACxC,kBAAM,SAAS,OAAO,SAAS,SAAS;AACxC,gBAAI,SAAS,EAAE,MAAM,UAAU,GAAG,QAAQ,OAAO,OAAO,CAAC;AAAA,UAC7D;AAAA,QACJ,CAAC;AAAA,MACL;AACA,UAAI,CAAC,GAAG;AACJ,cAAM,SAAS,YAAY,SAAS,IAAI;AACxC,cAAM,SAAS,OAAO,SAAS,SAAS;AACxC,YAAI,SAAS,EAAE,MAAM,UAAU,GAAG,QAAQ,OAAO,OAAO,CAAC;AAAA,MAC7D;AACA;AAAA,IACJ,CAAC;AACL,SAAO,OAAO,OAAO;AACzB;AAEO,IAAM,OAAO;AAAA,EAChB,QAAQ,UAAU;AACtB;AACO,IAAI;AAAA,CACV,SAAUC,wBAAuB;AAC9B,EAAAA,uBAAsB,WAAW,IAAI;AACrC,EAAAA,uBAAsB,WAAW,IAAI;AACrC,EAAAA,uBAAsB,QAAQ,IAAI;AAClC,EAAAA,uBAAsB,WAAW,IAAI;AACrC,EAAAA,uBAAsB,YAAY,IAAI;AACtC,EAAAA,uBAAsB,SAAS,IAAI;AACnC,EAAAA,uBAAsB,WAAW,IAAI;AACrC,EAAAA,uBAAsB,cAAc,IAAI;AACxC,EAAAA,uBAAsB,SAAS,IAAI;AACnC,EAAAA,uBAAsB,QAAQ,IAAI;AAClC,EAAAA,uBAAsB,YAAY,IAAI;AACtC,EAAAA,uBAAsB,UAAU,IAAI;AACpC,EAAAA,uBAAsB,SAAS,IAAI;AACnC,EAAAA,uBAAsB,UAAU,IAAI;AACpC,EAAAA,uBAAsB,WAAW,IAAI;AACrC,EAAAA,uBAAsB,UAAU,IAAI;AACpC,EAAAA,uBAAsB,uBAAuB,IAAI;AACjD,EAAAA,uBAAsB,iBAAiB,IAAI;AAC3C,EAAAA,uBAAsB,UAAU,IAAI;AACpC,EAAAA,uBAAsB,WAAW,IAAI;AACrC,EAAAA,uBAAsB,QAAQ,IAAI;AAClC,EAAAA,uBAAsB,QAAQ,IAAI;AAClC,EAAAA,uBAAsB,aAAa,IAAI;AACvC,EAAAA,uBAAsB,SAAS,IAAI;AACnC,EAAAA,uBAAsB,YAAY,IAAI;AACtC,EAAAA,uBAAsB,SAAS,IAAI;AACnC,EAAAA,uBAAsB,YAAY,IAAI;AACtC,EAAAA,uBAAsB,eAAe,IAAI;AACzC,EAAAA,uBAAsB,aAAa,IAAI;AACvC,EAAAA,uBAAsB,aAAa,IAAI;AACvC,EAAAA,uBAAsB,YAAY,IAAI;AACtC,EAAAA,uBAAsB,UAAU,IAAI;AACpC,EAAAA,uBAAsB,YAAY,IAAI;AACtC,EAAAA,uBAAsB,YAAY,IAAI;AACtC,EAAAA,uBAAsB,aAAa,IAAI;AACvC,EAAAA,uBAAsB,aAAa,IAAI;AAC3C,GAAG,0BAA0B,wBAAwB,CAAC,EAAE;AAKxD,IAAM,iBAAiB,CAEvB,KAAK,SAAS;AAAA,EACV,SAAS,yBAAyB,IAAI,IAAI;AAC9C,MAAM,OAAO,CAAC,SAAS,gBAAgB,KAAK,MAAM;AAClD,IAAM,aAAa,UAAU;AAC7B,IAAM,aAAa,UAAU;AAC7B,IAAM,UAAU,OAAO;AACvB,IAAM,aAAa,UAAU;AAC7B,IAAM,cAAc,WAAW;AAC/B,IAAM,WAAW,QAAQ;AACzB,IAAM,aAAa,UAAU;AAC7B,IAAM,gBAAgB,aAAa;AACnC,IAAM,WAAW,QAAQ;AACzB,IAAM,UAAU,OAAO;AACvB,IAAM,cAAc,WAAW;AAC/B,IAAM,YAAY,SAAS;AAC3B,IAAM,WAAW,QAAQ;AACzB,IAAM,YAAY,SAAS;AAC3B,IAAM,aAAa,UAAU;AAC7B,IAAM,mBAAmB,UAAU;AACnC,IAAM,YAAY,SAAS;AAC3B,IAAM,yBAAyB,sBAAsB;AACrD,IAAM,mBAAmB,gBAAgB;AACzC,IAAM,YAAY,SAAS;AAC3B,IAAM,aAAa,UAAU;AAC7B,IAAM,UAAU,OAAO;AACvB,IAAM,UAAU,OAAO;AACvB,IAAM,eAAe,YAAY;AACjC,IAAM,WAAW,QAAQ;AACzB,IAAM,cAAc,WAAW;AAC/B,IAAM,WAAW,QAAQ;AACzB,IAAM,iBAAiB,cAAc;AACrC,IAAM,cAAc,WAAW;AAC/B,IAAM,cAAc,WAAW;AAC/B,IAAM,eAAe,YAAY;AACjC,IAAM,eAAe,YAAY;AACjC,IAAM,iBAAiB,WAAW;AAClC,IAAM,eAAe,YAAY;AACjC,IAAM,UAAU,MAAM,WAAW,EAAE,SAAS;AAC5C,IAAM,UAAU,MAAM,WAAW,EAAE,SAAS;AAC5C,IAAM,WAAW,MAAM,YAAY,EAAE,SAAS;AACvC,IAAM,SAAS;AAAA,EAClB,SAAS,CAAC,QAAQ,UAAU,OAAO,EAAE,GAAG,KAAK,QAAQ,KAAK,CAAC;AAAA,EAC3D,SAAS,CAAC,QAAQ,UAAU,OAAO,EAAE,GAAG,KAAK,QAAQ,KAAK,CAAC;AAAA,EAC3D,UAAU,CAAC,QAAQ,WAAW,OAAO;AAAA,IACjC,GAAG;AAAA,IACH,QAAQ;AAAA,EACZ,CAAC;AAAA,EACD,SAAS,CAAC,QAAQ,UAAU,OAAO,EAAE,GAAG,KAAK,QAAQ,KAAK,CAAC;AAAA,EAC3D,OAAO,CAAC,QAAQ,QAAQ,OAAO,EAAE,GAAG,KAAK,QAAQ,KAAK,CAAC;AAC3D;AAEO,IAAM,QAAQ;;;ACtjHd,IAAM,sBAAsB,iBAChC,KAAK;EACJ;EACA;EACA;EACA;EACA;;EAEA;;EACA;;EACA;;EACA;;AACF,CAAC,EACA,GAAG,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAExB,IAAM,0BAA0B,iBACpC,OAAO;EACN,IAAI,iBAAE,OAAA,EAAS,SAAA;EACf,YAAY,iBAAE,OAAA,EAAS,SAAA;EACvB,QAAQ,iBAAE,OAAA,EAAS,SAAA;EACnB,oBAAoB,iBAAE,OAAA,EAAS,SAAA;EAC/B,OAAO,iBAAE,OAAA,EAAS,SAAA;EAClB,QAAQ,oBAAoB,SAAA;AAC9B,CAAC,EACA,YAAA;AAII,IAAM,yBAAyB,iBACnC,OAAO;EACN,MAAM,iBACH,KAAK;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EAAA,CACD,EACA,GAAG,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;EAC/B,QAAQ,iBAAE,OAAA,EAAS,SAAA;EACnB,aAAa,iBAAE,OAAA,EAAS,SAAA;AAC1B,CAAC,EACA,YAAA;AAEI,IAAM,+BAA+B,iBACzC,OAAO;EACN,gBAAgB,iBAAE,QAAA,EAAU,SAAA;EAC5B,iBAAiB,iBACd,KAAK,CAAC,cAAc,mBAAmB,gBAAgB,SAAS,MAAM,CAAC,EACvE,SAAA;EACH,sBAAsB,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;AAC5C,CAAC,EACA,YAAA;AAEI,IAAM,6BAA6B,iBACvC,OAAO;EACN,iBAAiB,iBAAE,OAAA,EAAS,SAAA;EAC5B,SAAS,iBAAE,MAAM,sBAAsB,EAAE,SAAA;EACzC,OAAO,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;AAC7B,CAAC,EACA,YAAA;AAII,IAAM,6BAA6B,iBACvC,KAAK;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACF,CAAC,EACA,GAAG,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAuBxB,IAAM,qBAAqB,iBAAE,KAAK,CAAC,YAAY,UAAU,CAAC,EAAE,GAAG,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAExF,IAAM,yBAAyB,iBACnC,OAAO;EACN,IAAI,iBAAE,OAAA;EACN,MAAM;EACN,OAAO,iBAAE,OAAA,EAAS,SAAA;EAClB,SAAS,wBAAwB,SAAA;EACjC,SAAS,iBAAE,OAAA,EAAS,SAAA;EACpB,UAAU,iBAAE,OAAA,EAAS,SAAA;EACrB,WAAW,iBAAE,OAAA,EAAS,SAAA;EACtB,cAAc,iBAAE,OAAA,EAAS,SAAA;EACzB,aAAa,iBAAE,QAAA,EAAU,SAAA;EACzB,sBAAsB,iBAAE,QAAA,EAAU,SAAA;EAClC,YAAY,iBAAE,OAAA,EAAS,SAAA;EACvB,kBAAkB,iBAAE,OAAA,EAAS,SAAA;EAC7B,iBAAiB,iBAAE,OAAA,EAAS,SAAA;EAC5B,QAAQ,mBAAmB,SAAA;AAC7B,CAAC,EACA,YAAA;AAEI,IAAM,2BAA2B,iBACrC,OAAO;EACN,MAAM,iBACH,KAAK;IACJ;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EAAA,CACD,EACA,GAAG,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;EAC/B,QAAQ,iBAAE,OAAA,EAAS,SAAA;EACnB,OAAO,iBAAE,OAAA,EAAS,SAAA;EAClB,aAAa,iBAAE,OAAA,EAAS,SAAA;EACxB,UAAU,iBAAE,QAAA,EAAU,SAAA;AACxB,CAAC,EACA,YAAA;AAEI,IAAM,uBAAuB,iBACjC,OAAO;EACN,IAAI,iBAAE,OAAA;EACN,OAAO,iBAAE,OAAA;EACT,QAAQ,iBACL,KAAK,CAAC,YAAY,eAAe,eAAe,sBAAsB,eAAe,CAAC,EACtF,GAAG,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;EAC/B,OAAO,iBAAE,MAAM,wBAAwB;EACvC,YAAY,2BAA2B,SAAA;EACvC,aAAa,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;AACnC,CAAC,EACA,YAAA;AAEI,IAAM,yBAAyB,iBACnC,OAAO;EACN,aAAa,iBAAE,OAAA,EAAS,SAAA;EACxB,aAAa,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;EACjC,kBAAkB,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;EACtC,YAAY,2BAA2B,SAAA;EACvC,aAAa,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;AACnC,CAAC,EACA,YAAA;AAeI,IAAM,4BAAiE,iBAAE;EAAK,MACnF,iBACG,OAAO;IACN,MAAM,iBAAE,OAAA;IACR,MAAM,iBACH,KAAK,CAAC,QAAQ,SAAS,UAAU,QAAQ,SAAS,QAAQ,CAAC,EAC3D,GAAG,iBAAE,OAAA,CAAQ,EACb,SAAA;IACH,OAAO,iBAAE,OAAO,iBAAE,OAAA,CAAQ,EAAE,SAAA;IAC5B,UAAU,iBAAE,MAAM,yBAAyB,EAAE,SAAA;IAC7C,QAAQ,iBAAE,OAAA,EAAS,SAAA;IACnB,oBAAoB,iBAAE,OAAA,EAAS,SAAA;EAAS,CACzC,EACA,YAAA;AACL;AAIO,IAAM,4BAA4B,iBACtC,OAAO;EACN,MAAM,iBAAE,OAAA;EACR,OAAO,iBAAE,OAAA,EAAS,SAAA;EAClB,MAAM,iBACH,KAAK,CAAC,QAAQ,UAAU,SAAS,SAAS,UAAU,UAAU,QAAQ,QAAQ,CAAC,EAC/E,GAAG,iBAAE,OAAA,CAAQ;EAChB,UAAU,iBAAE,QAAA;EACZ,aAAa,iBAAE,OAAA,EAAS,SAAA;EACxB,SAAS,iBAAE,MAAM,iBAAE,OAAO,EAAE,OAAO,iBAAE,OAAA,GAAU,OAAO,iBAAE,OAAA,EAAO,CAAG,EAAE,YAAA,CAAa,EAAE,SAAA;EACnF,cAAc,iBAAE,QAAA,EAAU,SAAA;EAC1B,SAAS,wBAAwB,SAAA;EACjC,iBAAiB,iBAAE,OAAA,EAAS,SAAA;EAC5B,cAAc,iBAAE,OAAA,EAAS,SAAA;EACzB,cAAc,iBAAE,OAAA,EAAS,SAAA;AAC3B,CAAC,EACA,YAAA;AAEI,IAAM,uBAAuB,iBACjC,OAAO;EACN,IAAI,iBAAE,OAAA;EACN,QAAQ,iBAAE,MAAM,yBAAyB;EACzC,cAAc,iBAAE,OAAA,EAAS,SAAA;EACzB,iBAAiB,iBAAE,OAAO,iBAAE,OAAA,CAAQ,EAAE,SAAA;AACxC,CAAC,EACA,YAAA;AAII,IAAM,4BAA4B,iBACtC,OAAO;EACN,MAAM,iBAAE,KAAK,CAAC,cAAc,QAAQ,CAAC,EAAE,GAAG,iBAAE,OAAA,CAAQ;EACpD,cAAc,iBAAE,OAAA,EAAS,SAAA;EACzB,QAAQ,iBAAE,OAAO,iBAAE,OAAA,CAAQ,EAAE,SAAA;EAC7B,SAAS,iBAAE,OAAA,EAAS,SAAA;EACpB,aAAa,iBAAE,OAAA,EAAS,SAAA;AAC1B,CAAC,EACA,YAAA;AAEI,IAAM,6BAA6B,iBACvC,OAAO;EACN,IAAI,iBAAE,OAAA;;;EAGN,WAAW,iBACR,KAAK,CAAC,YAAY,eAAe,mBAAmB,aAAa,YAAY,CAAC,EAC9E,GAAG,iBAAE,OAAA,CAAQ;EAChB,UAAU,iBAAE,OAAA,EAAS,SAAA;EACrB,YAAY,iBAAE,OAAA,EAAS,SAAA;EACvB,UAAU,iBAAE,OAAA,EAAS,SAAA;EACrB,YAAY,iBAAE,OAAA,EAAS,SAAA;EACvB,eAAe,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;EACnC,WAAW,0BAA0B,SAAA;EACrC,YAAY,iBAAE,MAAM,yBAAyB,EAAE,SAAA;EAC/C,gBAAgB,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;EACpC,aAAa,iBAAE,OAAA,EAAS,SAAA;AAC1B,CAAC,EACA,YAAA;AAII,IAAM,yBAAyB,iBACnC,OAAO;EACN,IAAI,iBAAE,OAAA;EACN,MAAM,iBAAE,KAAK,CAAC,cAAc,UAAU,YAAY,gBAAgB,QAAQ,CAAC,EAAE,GAAG,iBAAE,OAAA,CAAQ;EAC1F,OAAO,iBAAE,OAAA,EAAS,SAAA;EAClB,aAAa,iBAAE,OAAA,EAAS,SAAA;EACxB,cAAc,iBAAE,OAAA,EAAS,SAAA;EACzB,SAAS,iBAAE,OAAA,EAAS,SAAA;EACpB,SAAS,wBAAwB,SAAA;EACjC,iBAAiB,iBAAE,OAAA,EAAS,SAAA;EAC5B,YAAY,iBAAE,OAAA,EAAS,SAAA;EACvB,kBAAkB,iBAAE,OAAA,EAAS,SAAA;EAC7B,eAAe,uBAAuB,SAAA;EACtC,eAAe,uBAAuB,SAAA;EACtC,4BAA4B,iBAAE,QAAA,EAAU,SAAA;EACxC,aAAa,iBAAE,QAAA,EAAU,SAAA;EACzB,QAAQ,iBAAE,KAAK,CAAC,QAAQ,SAAS,aAAa,CAAC,EAAE,GAAG,iBAAE,OAAA,CAAQ,EAAE,SAAA;EAChE,WAAW,iBAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,GAAG,iBAAE,OAAA,CAAQ,EAAE,SAAA;EAC5D,sBAAsB,iBAAE,QAAA,EAAU,SAAA;EAClC,kBAAkB,6BAA6B,SAAA;AACjD,CAAC,EACA,YAAA;AAII,IAAM,mCAAmC,iBAC7C,OAAO;EACN,aAAa,iBAAE,KAAK,CAAC,QAAQ,SAAS,MAAM,CAAC,EAAE,SAAA;EAC/C,sBAAsB,iBAAE,QAAA,EAAU,SAAA;EAClC,gBAAgB,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;EACpC,OAAO,iBAAE,QAAA,EAAU,SAAA;AACrB,CAAC,EACA,YAAA;AAEI,IAAM,yBAAyB,iBACnC,OAAO;EACN,MAAM,iBAAE,OAAA;EACR,UAAU,iBAAE,OAAA,EAAS,SAAA;EACrB,OAAO,iBAAE,OAAA,EAAS,SAAA;EAClB,aAAa,iBAAE,OAAA,EAAS,SAAA;EACxB,YAAY,iBAAE,MAAM,yBAAyB,EAAE,QAAQ,CAAA,CAAE;EACzD,OAAO,iBAAE,MAAM,oBAAoB,EAAE,QAAQ,CAAA,CAAE;EAC/C,SAAS,iBAAE,MAAM,sBAAsB,EAAE,QAAQ,CAAA,CAAE;EACnD,mBAAmB,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,QAAQ,CAAA,CAAE;EACjD,YAAY,uBAAuB,SAAA;EACnC,SAAS,iBAAE,MAAM,sBAAsB,EAAE,SAAA;EACzC,OAAO,iBAAE,MAAM,oBAAoB,EAAE,SAAA;EACrC,aAAa,iBAAE,MAAM,0BAA0B,EAAE,SAAA;EACjD,kBAAkB,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,SAAA;EACtC,aAAa,iCAAiC,SAAA;EAC9C,OAAO,iBAAE,QAAA,EAAU,SAAA;AACrB,CAAC,EACA,YAAA;AAgBI,IAAM,sBAAsB,iBAAE,KAAK,CAAC,SAAS,OAAO,QAAQ,CAAC,EAAE,GAAG,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAE3F,IAAM,wBAAwB,iBAClC,OAAO;EACN,MAAM,iBAAE,OAAA;EACR,MAAM,iBAAE,OAAA;EACR,UAAU,iBAAE,QAAA;EACZ,cAAc,iBAAE,QAAA,EAAU,SAAA;AAC5B,CAAC,EACA,YAAA;AA+BI,IAAM,uBAAuB,iBACjC,OAAO;EACN,YAAY,iBAAE,OAAA;EACd,eAAe;EACf,iBAAiB,iBAAE,OAAA,EAAS,SAAA;EAC5B,eAAe,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,QAAQ,CAAA,CAAE;EAC7C,aAAa,iBAAE,MAAM,iBAAE,OAAA,CAAQ,EAAE,QAAQ,CAAA,CAAE;EAC3C,QAAQ,iBAAE,MAAM,qBAAqB,EAAE,SAAA;;;;;;;;;;;;EAYvC,MAAM,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;AAC5B,CAAC,EACA,YAAA;AAEI,IAAM,4BAA4B,iBACtC,OAAO;EACN,MAAM,iBAAE,OAAA;EACR,MAAM;EACN,SAAS,iBAAE,MAAM,iBAAE,OAAA,CAAQ;EAC3B,iBAAiB,iBAAE,OAAA,EAAS,SAAA;AAC9B,CAAC,EACA,YAAA;AAEI,IAAM,wBAAwB,iBAClC,OAAO;EACN,SAAS,iBAAE,OAAO,oBAAoB,EAAE,QAAQ,CAAA,CAAE;EAClD,eAAe,iBAAE,OAAA;EACjB,YAAY,iBAAE,MAAM,yBAAyB,EAAE,QAAQ,CAAA,CAAE;;;;;;;;;;EAUzD,eAAe,iBAAE,OAAO,iBAAE,MAAM,iBAAE,OAAA,CAAQ,CAAC,EAAE,SAAA;AAC/C,CAAC,EACA,YAAA;AAII,IAAM,oBAAoB,iBAC9B,OAAO;EACN,kBAAkB,iBAAE,OAAA;EACpB,YAAY,iBAAE,OAAA,EAAS,SAAA;EACvB,cAAc,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAC/B,YAAY,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAC7B,cAAc,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAC/B,eAAe,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAChC,oBAAoB,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,SAAA;AACrD,CAAC,EACA,YAAA;AAII,IAAM,oBAAoB,iBAC9B,OAAO;EACN,SAAS,iBAAE,OAAA;EACX,aAAa,iBAAE,OAAA;EACf,aAAa,iBAAE,OAAA;EACf,SAAS,iBAAE,MAAM,sBAAsB,EAAE,QAAQ,CAAA,CAAE;EACnD,YAAY;EACZ,UAAU;AACZ,CAAC,EACA,YAAA;ACneI,IAAM,cAAcC,iBAAE,OAAO;EAClC,OAAOA,iBAAE,OAAA,EAAS,MAAM,uBAAuB;EAC/C,UAAUA,iBAAE,OAAA,EAAS,IAAI,GAAG,wCAAwC;AACtE,CAAC;AAEM,IAAM,iBAAiB,YAAY,OAAO;EAC/C,MAAMA,iBAAE,OAAA,EAAS,IAAI,GAAG,oCAAoC,EAAE,IAAI,GAAG;AACvE,CAAC;AAIM,IAAM,iBAAiBA,iBAC3B,OAAO;EACN,MAAMA,iBAAE,OAAA,EAAS,IAAI,GAAG,oCAAoC,EAAE,IAAI,GAAG,EAAE,SAAA;EACvE,WAAWA,iBAAE,OAAA,EAAS,IAAI,aAAa,EAAE,IAAI,IAAI,EAAE,SAAA,EAAW,SAAA;AAChE,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,SAAS,UAAa,EAAE,cAAc,QAAW;EAChE,SAAS;AACX,CAAC;AAEI,IAAM,uBAAuBA,iBAAE,OAAO;EAC3C,iBAAiBA,iBAAE,OAAA,EAAS,IAAI,GAAG,8BAA8B;EACjE,aAAaA,iBAAE,OAAA,EAAS,IAAI,GAAG,wCAAwC;AACzE,CAAC;AAMM,IAAM,iBAAiBA,iBAC3B,OAAA,EACA,UAAU,CAAC,MAAM,EAAE,QAAQ,OAAO,EAAE,CAAC,EACrC,KAAKA,iBAAE,OAAA,EAAS,MAAM,WAAW,uBAAuB,CAAC;AAIrD,IAAM,qBAAqBA,iBAC/B,OAAA,EACA,UAAU,CAAC,MAAM,EAAE,YAAA,EAAc,QAAQ,cAAc,EAAE,CAAC,EAC1D,KAAKA,iBAAE,OAAA,EAAS,MAAM,wCAAwC,uBAAuB,CAAC;AAGlF,IAAM,kBAAkBA,iBAAE,OAAO;EACtC,MAAM;AACR,CAAC;AAOM,IAAM,qBAAqBA,iBAC/B,OAAO;EACN,gBAAgBA,iBAAE,OAAA,EAAS,IAAI,GAAG,6BAA6B;EAC/D,MAAM,eAAe,SAAA;EACrB,cAAc,mBAAmB,SAAA;AACnC,CAAC,EACA,OAAO,CAAC,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,YAAY,GAAG;EAC1D,SAAS;EACT,MAAM,CAAC,MAAM;AACf,CAAC;AAOI,IAAM,mBAAmBA,iBAC7B,OAAO;EACN,UAAUA,iBAAE,OAAA,EAAS,IAAI,GAAG,sBAAsB;EAClD,MAAM,eAAe,SAAA;EACrB,cAAc,mBAAmB,SAAA;AACnC,CAAC,EACA,OAAO,CAAC,MAAM,QAAQ,EAAE,IAAI,MAAM,QAAQ,EAAE,YAAY,GAAG;EAC1D,SAAS;EACT,MAAM,CAAC,MAAM;AACf,CAAC;AAEI,IAAM,mCAAmCA,iBAAE,OAAO;EACvD,UAAUA,iBAAE,OAAA,EAAS,IAAI,GAAG,sBAAsB;EAClD,MAAM;AACR,CAAC;AAcM,IAAM,sBAAsBA,iBAChC,OAAO;EACN,UAAUA,iBAAE,OAAA,EAAS,IAAI,GAAG,sBAAsB;EAClD,MAAM,eAAe,SAAA;EACrB,cAAc,mBAAmB,SAAA;EACjC,SAASA,iBAAE,QAAQ,mBAAmB;AACxC,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,eAAe;EAC1C,SAAS;EACT,MAAM,CAAC,MAAM;AACf,CAAC;AAII,IAAM,sBAAsBA,iBAAE,OAAO;EAC1C,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG;EAC/B,aAAaA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;;;EAGjC,YAAYA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;EAC9B,cAAcA,iBAAE,OAAA,EAAS,IAAI,IAAI,EAAE,SAAA;AACrC,CAAC;AAEM,IAAM,sBAAsB,oBAAoB,QAAA;AAIhD,IAAM,qBAAqBA,iBAAE,KAAK,CAAC,UAAU,aAAa,QAAQ,CAAC;AAEnE,IAAM,uBAAuBA,iBACjC,OAAO;EACN,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG;EAC/B,UAAU;EACV,OAAOA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG;EAChC,SAASA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;EAC1B,QAAQA,iBAAE,OAAA,EAAS,IAAI,CAAC;EACxB,WAAWA,iBAAE,QAAA,EAAU,SAAA;AACzB,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,aAAa,YAAY,CAAC,CAAC,EAAE,SAAS;EACrD,SAAS;EACT,MAAM,CAAC,SAAS;AAClB,CAAC;AAGI,IAAM,uBAAuBA,iBAAE,OAAO;EAC3C,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;EACjC,UAAU,mBAAmB,SAAA;EAC7B,OAAOA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;EAClC,SAASA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,SAAA;EACrC,QAAQA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;EAC1B,WAAWA,iBAAE,QAAA,EAAU,SAAA;AACzB,CAAC;AAIM,IAAM,0BAA0BA,iBAAE,OAAO;EAC9C,WAAWA,iBAAE,OAAA,EAAS,IAAI,CAAC;EAC3B,SAASA,iBAAE,OAAA,EAAS,QAAQ,KAAK;EACjC,SAASA,iBAAE,OAAOA,iBAAE,QAAA,CAAS;AAC/B,CAAC;AAUM,IAAM,oBAAoBA,iBAAE,KAAK,CAAC,OAAO,UAAU,CAAC;AAcpD,IAAM,0BAA0BA,iBAAE,KAAK,CAAC,QAAQ,MAAM,CAAC;AAEvD,IAAM,qBAAqBA,iBAC/B,OAAO;EACN,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG;;;;EAI/B,WAAWA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;EAC7B,OAAO,kBAAkB,QAAQ,KAAK;EACtC,aAAa,wBAAwB,SAAA;EACrC,WAAWA,iBAAE,OAAA,EAAS,SAAA,EAAW,SAAA;AACnC,CAAC,EACA,OAAO,CAAC,MAAM,EAAE,UAAU,SAAS,CAAC,CAAC,EAAE,WAAW;EACjD,SAAS;EACT,MAAM,CAAC,WAAW;AACpB,CAAC;AAkBH,IAAM,gBAAgB,CAAC,QAAgBA,iBAAE,OAAA,EAAS,IAAI,GAAG;AAYlD,IAAM,uBAAuBA,iBACjC,KAAK,CAAC,gBAAgB,OAAO,WAAW,KAAK,CAAC,EAC9C,GAAGA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAiBxB,IAAM,2BAA2BA,iBACrC,KAAK,CAAC,YAAY,WAAW,YAAY,CAAC,EAC1C,GAAGA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAE/B,IAAM,sBAAsBA,iBACzB,OAAO;EACN,IAAI,cAAc,GAAG,EAAE,SAAA;EACvB,YAAY,yBAAyB,SAAA;;;;;;;EAOrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,OAAO,cAAc,IAAI,EAAE,SAAA;EAC3B,aAAa,cAAc,GAAG,EAAE,SAAA;EAChC,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,QAAQA,iBAAE,QAAA,EAAU,SAAA;EACpB,iBAAiBA,iBAAE,QAAA,EAAU,SAAA;EAC7B,MAAM,cAAc,EAAE,EAAE,SAAA;EACxB,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,SAASA,iBAAE,QAAA,EAAU,SAAA;EACrB,SAASA,iBAAE,QAAA,EAAU,SAAA;AACvB,CAAC,EACA,YAAA;AAEH,IAAM,uBAAuBA,iBAC1B,OAAO;EACN,IAAI,cAAc,GAAG,EAAE,SAAA;EACvB,YAAY,yBAAyB,SAAA;;;;;;;EAOrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,SAASA,iBAAE,QAAA,EAAU,SAAA;EACrB,MAAM,cAAc,EAAE,EAAE,SAAA;EACxB,aAAaA,iBAAE,QAAA,EAAU,SAAA;EACzB,sBAAsBA,iBAAE,QAAA,EAAU,SAAA;AACpC,CAAC,EACA,YAAA;AAEH,IAAM,uBAAuBA,iBAC1B,OAAO;EACN,IAAI,cAAc,GAAG,EAAE,SAAA;EACvB,YAAY,yBAAyB,SAAA;;;;;;;EAOrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,OAAOA,iBAAE,QAAA,EAAU,SAAA;EACnB,SAASA,iBAAE,QAAA,EAAU,SAAA;AACvB,CAAC,EACA,YAAA;AAEH,IAAM,uBAAuBA,iBAC1B,OAAO;EACN,IAAI,cAAc,GAAG,EAAE,SAAA;EACvB,YAAY,yBAAyB,SAAA;;;;;;;EAOrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,OAAOA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;EAC3B,KAAKA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;EACzB,KAAKA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;EACzB,MAAMA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;EAC1B,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,SAASA,iBAAE,QAAA,EAAU,SAAA;AACvB,CAAC,EACA,YAAA;AAEH,IAAM,qBAAqBA,iBACxB,OAAO;EACN,OAAOA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;EACxB,IAAI,cAAc,GAAG,EAAE,SAAA;EACvB,eAAe,cAAc,EAAE,EAAE,SAAA;;;;;;;;EAQjC,QAAQ,cAAc,EAAE,EAAE,SAAA;EAC1B,WAAWA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;EAC5B,kBAAkBA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;EACnC,YAAYA,iBAAE,QAAA,EAAU,SAAA;EACxB,OAAOA,iBAAE,QAAA,EAAU,SAAA;EACnB,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,aAAaA,iBACV;IACCA,iBACG,OAAO;MACN,OAAOA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;MACxB,KAAK,cAAc,GAAG,EAAE,SAAA;MACxB,MAAM,cAAc,GAAG,EAAE,SAAA;IAAS,CACnC,EACA,YAAA;EAAY,EAEhB,IAAI,GAAG,EACP,SAAA;EACH,eAAeA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;EACnC,aAAaA,iBAAE,QAAA,EAAU,SAAA;EACzB,eAAeA,iBAAE,QAAA,EAAU,SAAA;;;;EAI3B,OAAOA,iBAAE,MAAMA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;AACjD,CAAC,EACA,YAAA;AAYH,IAAM,6BAA6BA,iBAChC,OAAO;EACN,IAAI,cAAc,GAAG;EACrB,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,SAAS,cAAc,GAAI,EAAE,SAAA;EAC7B,SAASA,iBACN;IACCA,iBACG,OAAO;MACN,OAAO,cAAc,GAAG;MACxB,OAAOA,iBAAE,KAAK,CAAC,WAAW,UAAU,aAAa,CAAC,EAAE,SAAA;IAAS,CAC9D,EACA,YAAA;EAAY,EAEhB,IAAI,EAAE;AACX,CAAC,EACA,YAAA;AAEH,IAAM,2BAA2BA,iBAC9B,OAAO;EACN,IAAI,cAAc,GAAG;EACrB,eAAe,cAAc,EAAE,EAAE,SAAA;EACjC,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,eAAeA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;EACnC,aAAaA,iBAAE,QAAA,EAAU,SAAA;EACzB,eAAeA,iBAAE,QAAA,EAAU,SAAA;EAC3B,YAAYA,iBAAE,QAAA,EAAU,SAAA;AAC1B,CAAC,EACA,YAAA;AAEH,IAAM,4BAA4BA,iBAC/B,OAAO;EACN,OAAOA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;EACxB,IAAI,cAAc,GAAG,EAAE,SAAA;EACvB,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,QAAQ,cAAc,EAAE,EAAE,SAAA;EAC1B,SAASA,iBAAE,MAAMA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;AACnD,CAAC,EACA,YAAA;AAEH,IAAM,wBAAwBA,iBAC3B,OAAO;EACN,IAAI,cAAc,GAAG,EAAE,SAAA;EACvB,MAAM,cAAc,EAAE,EAAE,SAAA;EACxB,OAAO,cAAc,GAAG,EAAE,SAAA;EAC1B,OAAOA,iBAAE,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;EAC3C,SAASA,iBAAE,MAAM,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;EAC5C,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,QAAQ,cAAc,EAAE,EAAE,SAAA;EAC1B,YAAY,yBAAyB,SAAA;;;;;;;EAOrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;EACtB,UAAU,cAAc,GAAG,EAAE,SAAA;EAC7B,aAAaA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,EAAE,SAAA;EACnC,SAASA,iBAAE,QAAA,EAAU,SAAA;AACvB,CAAC,EACA,YAAA;AAEI,IAAM,sBAAsBA,iBAChC,OAAO;EACN,OAAO,cAAc,GAAG,EAAE,QAAA;EAC1B,OAAO,cAAc,GAAG,EAAE,QAAA;EAC1B,OAAOA,iBAAE,MAAM,cAAc,GAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;EAC7C,QAAQA,iBAAE,MAAM,mBAAmB,EAAE,IAAI,GAAG,EAAE,SAAA;EAC9C,SAASA,iBAAE,MAAM,oBAAoB,EAAE,IAAI,GAAG,EAAE,SAAA;EAChD,SAASA,iBAAE,MAAM,oBAAoB,EAAE,IAAI,GAAG,EAAE,SAAA;EAChD,SAASA,iBAAE,MAAM,oBAAoB,EAAE,IAAI,GAAG,EAAE,SAAA;EAChD,SAASA,iBAAE,QAAA,EAAU,SAAA;EACrB,WAAWA,iBAAE,QAAA,EAAU,SAAA;EACvB,OAAOA,iBAAE,MAAM,kBAAkB,EAAE,IAAI,GAAG,EAAE,SAAA;EAC5C,cAAcA,iBAAE,MAAM,yBAAyB,EAAE,IAAI,GAAG,EAAE,SAAA;EAC1D,aAAaA,iBAAE,MAAM,wBAAwB,EAAE,IAAI,EAAE,EAAE,SAAA;EACvD,cAAc,2BAA2B,SAAA;EACzC,UAAUA,iBAAE,MAAM,qBAAqB,EAAE,IAAI,GAAI,EAAE,SAAA;;;;;;;;;EASnD,WAAWA,iBAAE,QAAA,EAAU,SAAA;;;;;;;;EAQvB,OAAOA,iBACJ,OAAO;IACN,eAAeA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,SAAA;IAC9C,eAAeA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,SAAA;IAC9C,UAAUA,iBACP,OAAO;MACN,UAAUA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,SAAA;MACzC,SAASA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,SAAA;MACxC,YAAYA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,SAAA;IAAS,CACrD,EACA,YAAA,EACA,SAAA;EAAS,CACb,EACA,YAAA,EACA,SAAA;AACL,CAAC,EACA,YAAA;AAEI,IAAM,qBAAqBA,iBAC/B,OAAO;;;;;;;EAON,UAAU,qBAAqB,SAAA;EAC/B,eAAe,cAAc,GAAG,EAAE,SAAA;EAClC,WAAWA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,EAAE,SAAA;EACjC,iBAAiBA,iBACd,OAAO;IACN,kBAAkB,cAAc,GAAG,EAAE,SAAA;IACrC,YAAYA,iBAAE,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;IAChD,gBAAgBA,iBAAE,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;IACrD,mBAAmBA,iBAAE,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;IACxD,YAAYA,iBAAE,MAAM,cAAc,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;IACjD,WAAWA,iBAAE,QAAA,EAAU,SAAA;EAAS,CACjC,EACA,YAAA,EACA,SAAA;EACH,gBAAgBA,iBACb,OAAO;IACN,MAAM,cAAc,GAAG,EAAE,SAAA;IACzB,OAAO,cAAc,GAAG,EAAE,SAAA;IAC1B,aAAa,cAAc,GAAI,EAAE,SAAA;IACjC,QAAQA,iBAAE,MAAMA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;IAChD,SAASA,iBACN,MAAMA,iBAAE,MAAM,CAAC,cAAc,GAAG,GAAGA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,CAAC,CAAC,CAAC,EAC1D,IAAI,GAAG,EACP,SAAA;EAAS,CACb,EACA,YAAA,EACA,SAAA;EACH,UAAU,oBAAoB,SAAA;EAC9B,sBAAsBA,iBACnB;IACCA,iBACG,OAAO;MACN,IAAI,cAAc,GAAG,EAAE,SAAA;MACvB,MAAM,cAAc,EAAE,EAAE,SAAA;MACxB,QAAQ,cAAc,GAAG,EAAE,SAAA;MAC3B,OAAO,cAAc,GAAG,EAAE,SAAA;IAAS,CACpC,EACA,YAAA;EAAY,EAEhB,IAAI,GAAG,EACP,SAAA;EACH,iBAAiBA,iBACd;IACCA,iBACG,OAAO;MACN,IAAI,cAAc,GAAG,EAAE,SAAA;MACvB,WAAW,cAAc,GAAG,EAAE,SAAA;MAC9B,MAAM,cAAc,EAAE,EAAE,SAAA;MACxB,WAAWA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;MAC5B,OAAO,cAAc,GAAG,EAAE,SAAA;MAC1B,QAAQ,cAAc,GAAG,EAAE,SAAA;MAC3B,YAAYA,iBAAE,QAAA,EAAU,SAAA;MACxB,OAAOA,iBAAE,QAAA,EAAU,SAAA;IAAS,CAC7B,EACA,YAAA;EAAY,EAEhB,IAAI,GAAG,EACP,SAAA;EACH,gBAAgBA,iBAAE,QAAA,EAAU,SAAA;AAC9B,CAAC,EACA,YAAA;AAmCI,IAAM,mCAAmCA,iBAAE,KAAK;EACrD;EACA;EACA;EACA;EACA;AACF,CAAC;AAEM,IAAM,iCAAiCA,iBAAE,OAAO;EACrD,UAAUA,iBAAE,QAAA;EACZ,eAAe,iCAAiC,QAAA;EAChD,cAAc,cAAc,EAAE,EAAE,QAAA;EAChC,cAAcA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,GAAS,EAAE,SAAA;AACvD,CAAC;AAIM,IAAM,oBAAoBA,iBAAE,OAAO;EACxC,SAASA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,IAAI;EACnC,WAAWA,iBAAE,OAAA,EAAS,SAAA;EACtB,SAAS,mBAAmB,SAAA;;;;;;EAM5B,YAAYA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;;;;;;;;;;;;;EAa/B,eAAe,+BAA+B,SAAA;AAChD,CAAC;AAOM,IAAM,wBAAwBA,iBAAE,KAAK;EAC1C;EACA;EACA;EACA;EACA;EACA;AACF,CAAC;AAEM,IAAM,0BAA0BA,iBACpC,OAAO;;;;;;EAMN,YAAYA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;EAC9B,QAAQA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,EAAE,SAAA;EAC9B,kBAAkBA,iBACf,KAAK,CAAC,QAAQ,YAAY,WAAW,UAAU,OAAO,CAAC,EACvD,QAAQ,UAAU,EAClB,SAAA;EACH,MAAMA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,CAAC,EAAE,SAAA;AACnC,CAAC,EACA,YAAA,EACA;EACC,CAAC,YACC,QAAQ,qBAAqB,YAC5B,OAAO,QAAQ,eAAe,YAAY,QAAQ,WAAW,SAAS;EACzE;IACE,SAAS;IACT,MAAM,CAAC,YAAY;EAAA;AAEvB;AAEK,IAAM,sBAAsBA,iBAChC,OAAO;EACN,SAASA,iBAAE,OAAA,EAAS,IAAI,CAAC;EACzB,WAAWA,iBACR,KAAK,CAAC,QAAQ,UAAU,UAAU,QAAQ,UAAU,QAAQ,CAAC,EAC7D,QAAQ,MAAM,EACd,SAAA;EACH,OAAOA,iBAAE,QAAA;EACT,OAAOA,iBAAE,OAAA,EAAS,SAAA;AACpB,CAAC,EACA,YAAA;AAEI,IAAM,wBAAwBA,iBAClC,OAAO;EACN,YAAYA,iBAAE,OAAA,EAAS,SAAA;EACvB,QAAQA,iBAAE,MAAM,mBAAmB;EACnC,iBAAiBA,iBAAE,QAAA,EAAU,SAAA;AAC/B,CAAC,EACA,YAAA;AAEI,IAAM,6BAA6BA,iBACvC,OAAO;EACN,QAAQA,iBACL,KAAK,CAAC,SAAS,aAAa,UAAU,SAAS,SAAS,WAAW,CAAC,EACpE,QAAQ,OAAO,EACf,SAAA;;;EAGH,UAAUA,iBAAE,OAAA,EAAS,IAAI,CAAC;EAC1B,aAAaA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;;;;;;EAM/B,OAAOA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;EAC3B,QAAQA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,EAAE,SAAA;AAChC,CAAC,EACA,YAAA,EACA,OAAO,CAAC,MAAM,EAAE,WAAW,eAAe,OAAO,EAAE,UAAU,UAAU;EACtE,SAAS;EACT,MAAM,CAAC,OAAO;AAChB,CAAC;AAMI,IAAM,0BAA0BA,iBACpC,OAAO;;EAEN,QAAQA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,SAAA;;EAE1B,SAASA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,SAAA;;EAEjC,WAAWA,iBAAE,KAAK,CAAC,MAAM,MAAM,CAAC,EAAE,SAAA;AACpC,CAAC,EACA,YAAA;AAEI,IAAM,uBAAuBA,iBACjC,OAAO;EACN,OAAOA,iBAAE,OAAA,EAAS,SAAA;EAClB,SAASA,iBAAE,OAAA,EAAS,SAAA;EACpB,mBAAmBA,iBAAE,OAAA,EAAS,SAAA;EAC9B,UAAUA,iBAAE,KAAK,CAAC,WAAW,QAAQ,CAAC,EAAE,SAAA;EACxC,aAAaA,iBAAE,QAAA,EAAU,SAAA;EACzB,cAAcA,iBAAE,OAAA,EAAS,SAAA;EACzB,aAAaA,iBAAE,OAAA,EAAS,SAAA;EACxB,eAAeA,iBAAE,OAAA,EAAS,SAAA;EAC1B,iBAAiB,sBAAsB,SAAA;EACvC,YAAYA,iBAAE,KAAK,CAAC,eAAe,WAAW,CAAC,EAAE,SAAA;AACnD,CAAC,EACA,YAAA;AAEI,IAAM,oBAAoBA,iBAAE,mBAAmB,QAAQ;EAC5DA,iBAAE,OAAO;IACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,CAAC;IACpB,MAAMA,iBAAE,QAAQ,UAAU;IAC1B,SAAS;EAAA,CACV;EACDA,iBAAE,OAAO;IACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,CAAC;IACpB,MAAMA,iBAAE,QAAQ,WAAW;IAC3B,SAAS;EAAA,CACV;EACDA,iBAAE,OAAO;IACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,CAAC;IACpB,MAAMA,iBAAE,QAAQ,gBAAgB;IAChC,SAAS;EAAA,CACV;EACDA,iBAAE,OAAO;IACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,CAAC;IACpB,MAAMA,iBAAE,QAAQ,aAAa;IAC7B,SAAS;EAAA,CACV;EACDA,iBAAE,OAAO;IACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,CAAC;IACpB,MAAMA,iBAAE,QAAQ,SAAS;IACzB,SAAS;EAAA,CACV;EACDA,iBAAE,OAAO;IACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,CAAC;IACpB,MAAMA,iBAAE,QAAQ,QAAQ;IACxB,SAASA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,EAAE,QAAQ,CAAA,CAAE;EAAA,CAC1C;AACH,CAAC;AAEM,IAAM,wBAAwBA,iBAAE,MAAM,iBAAiB;AAiBvD,IAAM,8BAA8BA,iBAAE,KAAK;;EAEhD;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;AACF,CAAC;AAEM,IAAM,uBAAuBA,iBAAE,OAAO;EAC3C,UAAU;;EAEV,gBAAgBA,iBAAE,OAAA,EAAS,SAAA;;EAE3B,SAASA,iBAAE,OAAA,EAAS,SAAA;;EAEpB,UAAUA,iBAAE,OAAA,EAAS,SAAA;;EAErB,QAAQA,iBAAE,OAAA,EAAS,SAAA;;EAEnB,YAAYA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;;;;;;EAM7B,YAAYA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,SAAA;;;;;EAK9C,aAAaA,iBAAE,QAAA,EAAU,SAAA;;;;;EAKzB,mBAAmBA,iBAAE,QAAA,EAAU,SAAA;AACjC,CAAC;AAEM,IAAM,qBAAqBA,iBAAE,OAAO;EACzC,UAAUA,iBAAE,OAAA;EACZ,MAAMA,iBAAE,OAAA;EACR,SAASA,iBAAE,QAAA;EACX,OAAOA,iBAAE,OAAA,EAAS,SAAA;;EAElB,SAASA,iBAAE,OAAA,EAAS,SAAA;;;;;;;EAOpB,UAAU,qBAAqB,SAAA;;;;;;;EAO/B,iBAAiBA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAA;;;;;;EAMhD,mBAAmBA,iBAAE,QAAA,EAAU,SAAA;;;;;;;;;;EAU/B,mBAAmBA,iBAAE,QAAA,EAAU,SAAA;;;;;;EAM/B,QAAQA,iBAAE,KAAK,CAAC,WAAW,QAAQ,WAAW,WAAW,WAAW,CAAC,EAAE,SAAA;;EAEvE,sBAAsBA,iBAAE,OAAA,EAAS,SAAA;AACnC,CAAC;AAEM,IAAM,sBAAsBA,iBAAE,OAAO;EAC1C,WAAWA,iBAAE,OAAA;EACb,SAASA,iBAAE,MAAM,kBAAkB,EAAE,IAAI,CAAC;;;EAG1C,SAAS,mBAAmB,SAAA;;EAE5B,KAAKA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;AACvC,CAAC;AAMM,IAAM,yBAAyBA,iBAAE,KAAK,CAAC,QAAQ,SAAS,MAAM,CAAC;AAM/D,IAAM,yBAAyBA,iBACnC,OAAO;EACN,aAAa,uBAAuB,SAAA;EACpC,sBAAsBA,iBAAE,QAAA,EAAU,SAAA;EAClC,gBAAgBA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,CAAC,EAAE,SAAA;EAC3C,OAAOA,iBAAE,QAAA,EAAU,SAAA;AACrB,CAAC,EACA,OAAA;AAQI,IAAM,2BAA2BA,iBAAE,OAAO;EAC/C,eAAeA,iBAAE,QAAA;EACjB,iBAAiBA,iBAAE,QAAA;EACnB,oBAAoBA,iBAAE,QAAA;;;;;;EAMtB,iBAAiBA,iBAAE,OAAO,sBAAsB,EAAE,QAAQ,CAAA,CAAE;;;;;;;;EAQ5D,qBAAqBA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAA,CAAE;AAC5D,CAAC;AAQM,IAAM,iCAAiCA,iBAC3C,OAAO;EACN,eAAeA,iBAAE,QAAA,EAAU,SAAA;EAC3B,iBAAiBA,iBAAE,QAAA,EAAU,SAAA;EAC7B,oBAAoBA,iBAAE,QAAA,EAAU,SAAA;EAChC,iBAAiBA,iBAAE,OAAO,uBAAuB,SAAA,CAAU,EAAE,SAAA;EAC7D,qBAAqBA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,CAAC,EAAE,SAAA;AAClD,CAAC,EACA,OAAA;AAiBI,IAAM,mBAAmBC,iBAAE,KAAK,CAAC,cAAc,SAAS,SAAS,CAAC;AAMlE,IAAM,sBAAsBA,iBAAE,OAAO;;EAE1C,QAAQA,iBAAE,OAAA,EAAS,MAAM,eAAe;;EAExC,cAAcA,iBAAE,OAAA,EAAS,IAAI,CAAC;;EAE9B,KAAKA,iBAAE,OAAA,EAAS,SAAA,EAAW,SAAA;;EAE3B,SAASA,iBAAE,OAAA,EAAS,SAAA;;;;;EAKpB,gBAAgBA,iBAAE,OAAA,EAAS,SAAA;;EAE3B,WAAWA,iBAAE,QAAA;AACf,CAAC;AAMM,IAAM,sBAAsBA,iBAAE,OAAO;EAC1C,kBAAkBA,iBAAE,OAAA,EAAS,SAAA,EAAW,SAAA;EACxC,YAAY;EACZ,mBAAmBA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,MAAA,CAAO,EAAE,QAAQ,CAAA,CAAE;EACzD,kBAAkBA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;EACnC,SAAS;AACX,CAAC;AAOM,IAAM,4BAA4BA,iBACtC,OAAO;;EAEN,kBAAkBA,iBAAE,OAAA,EAAS,SAAA,EAAW,SAAA,EAAW,SAAA;EACnD,YAAY,iBAAiB,SAAA;EAC7B,mBAAmBA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,MAAA,CAAO,EAAE,IAAI,EAAE,EAAE,SAAA;;EAEvD,kBAAkBA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA,EAAW,SAAA;AAChD,CAAC,EACA,OAAA;AAWI,IAAM,eAAeA,iBAAE,KAAK,CAAC,SAAS,MAAM,IAAI,CAAC;AAOxD,IAAM,iBAAiBA,iBAAE,OAAA,EAAS,MAAM,qDAAqD;EAC3F,SAAS;AACX,CAAC;AAMM,IAAM,oBAAoBA,iBAC9B,OAAO;EACN,QAAQA,iBACL,OAAO;IACN,SAAS,eAAe,SAAA;IACxB,WAAW,eAAe,SAAA;IAC1B,YAAY,eAAe,SAAA;IAC3B,SAAS,eAAe,SAAA;IACxB,MAAM,eAAe,SAAA;IACrB,eAAe,eAAe,SAAA;IAC9B,QAAQ,eAAe,SAAA;IACvB,SAAS,eAAe,SAAA;IACxB,SAAS,eAAe,SAAA;IACxB,OAAO,eAAe,SAAA;IACtB,YAAY,eAAe,SAAA;IAC3B,YAAY,eAAe,SAAA;IAC3B,gBAAgB,eAAe,SAAA;EAAS,CACzC,EACA,OAAA,EACA,SAAA;EACH,YAAYA,iBACT,OAAO;IACN,YAAYA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;IACvC,YAAYA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;IAC5C,YAAYA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;IAC5C,cAAcA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;IAC9C,YAAYA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;EAAS,CACtD,EACA,OAAA,EACA,SAAA;EACH,OAAOA,iBACJ,OAAO;IACN,IAAIA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;IACpC,IAAIA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;IACpC,IAAIA,iBAAE,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;EAAS,CAC9C,EACA,OAAA,EACA,SAAA;;;;;EAKH,MAAMA,iBAAE,KAAK,CAAC,QAAQ,SAAS,MAAM,CAAC,EAAE,SAAA;AAC1C,CAAC,EACA,OAAA;AAOI,IAAM,+BAA+BA,iBAAE,OAAO;;EAEnD,eAAeA,iBAAE,OAAA,EAAS,IAAI,IAAI,EAAE,SAAA;;EAEpC,eAAeA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;;EAElC,iBAAiBA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;;EAErC,gBAAgBA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;;EAEpC,gBAAgBA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;;EAEpC,WAAWA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;;EAE9B,kBAAkBA,iBAAE,QAAA;;EAEpB,OAAO,kBAAkB,SAAA;;EAEzB,eAAe,aAAa,SAAA;;EAE5B,oBAAoB,eAAe,SAAA;;EAEnC,uBAAuBA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;AAC7C,CAAC;AAOM,IAAM,qCAAqCA,iBAC/C,OAAO;EACN,eAAeA,iBAAE,OAAA,EAAS,IAAI,IAAI,EAAE,SAAA,EAAW,SAAA;EAC/C,eAAeA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA,EAAW,SAAA;EAC7C,iBAAiBA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA,EAAW,SAAA;EAChD,gBAAgBA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA,EAAW,SAAA;EAC/C,gBAAgBA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA,EAAW,SAAA;EAC/C,WAAWA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA,EAAW,SAAA;EACzC,kBAAkBA,iBAAE,QAAA,EAAU,SAAA;EAC9B,OAAO,kBAAkB,SAAA,EAAW,SAAA;EACpC,eAAe,aAAa,SAAA,EAAW,SAAA;EACvC,oBAAoB,eAAe,SAAA,EAAW,SAAA;EAC9C,uBAAuBA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA,EAAW,SAAA;AACxD,CAAC,EACA,OAAA;AAWI,IAAM,2BAA2BA,iBACrC,OAAO;EACN,OAAOA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;;;EAG3B,OAAOA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;EAC3B,OAAOA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;EAC7C,QAAQA,iBACL;IACCA,iBAAE,OAAO;MACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,GAAG;MACtB,YAAY,yBAAyB,SAAA;MACrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;MACtB,OAAOA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;MAC3B,OAAOA,iBAAE,OAAA,EAAS,IAAI,GAAI,EAAE,SAAA;MAC5B,UAAUA,iBAAE,QAAA,EAAU,SAAA;MACtB,UAAUA,iBAAE,QAAA,EAAU,SAAA;MACtB,MAAMA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;MACzB,aAAaA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;;MAEjC,SAASA,iBAAE,QAAA,EAAU,SAAA;IAAS,CAC/B;EAAA,EAEF,IAAI,GAAG,EACP,SAAA;EACH,SAASA,iBACN;IACCA,iBAAE,OAAO;MACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,GAAG;MACtB,YAAY,yBAAyB,SAAA;MACrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;MACtB,OAAOA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;MAC3B,UAAUA,iBAAE,QAAA,EAAU,SAAA;;MAEtB,MAAMA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;;;;;;MAMzB,UAAUA,iBAAE,QAAA,EAAU,SAAA;IAAS,CAChC;EAAA,EAEF,IAAI,GAAG,EACP,SAAA;;;;;;;EAOH,SAASA,iBACN;IACCA,iBAAE,OAAO;MACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,GAAG;MACtB,YAAY,yBAAyB,SAAA;MACrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;MACtB,OAAOA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;MAC3B,OAAOA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;MAC3B,KAAKA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;MACzB,KAAKA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA;MACzB,MAAMA,iBAAE,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,SAAA;MACrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;IAAS,CAChC;EAAA,EAEF,IAAI,EAAE,EACN,SAAA;;;;;;;;;EASH,OAAOA,iBACJ;IACCA,iBACG,OAAO;MACN,OAAOA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA,EAAc,SAAA;MACtC,eAAeA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;MAClC,OAAOA,iBACJ;QACCA,iBACG,OAAO;UACN,OAAOA,iBAAE,OAAA,EAAS,IAAA,EAAM,SAAA;UACxB,aAAaA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;UACjC,OAAOA,iBAAE,MAAMA,iBAAE,OAAA,EAAS,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,SAAA;QAAS,CACtD,EACA,YAAA;MAAY,EAEhB,IAAI,GAAG,EACP,SAAA;IAAS,CACb,EACA,YAAA;EAAY,EAEhB,IAAI,EAAE,EACN,SAAA;;;;;;;;;;;;;EAaH,SAASA,iBACN;IACCA,iBAAE,OAAO;MACP,IAAIA,iBAAE,OAAA,EAAS,IAAI,GAAG;MACtB,YAAY,yBAAyB,SAAA;MACrC,UAAUA,iBAAE,QAAA,EAAU,SAAA;MACtB,OAAOA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;MAC3B,OAAOA,iBAAE,QAAA,EAAU,SAAA;MACnB,UAAUA,iBAAE,QAAA,EAAU,SAAA;IAAS,CAChC;EAAA,EAEF,IAAI,GAAG,EACP,SAAA;;;;;;;EAOH,UAAUA,iBACP;IACCA,iBACG,OAAO;MACN,IAAIA,iBAAE,OAAA,EAAS,IAAI,GAAG;MACtB,MAAMA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;MACzB,OAAOA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;IAAS,CACrC,EACA,YAAA;EAAY,EAEhB,IAAI,GAAG,EACP,SAAA;;EAEH,SAASA,iBAAE,QAAA,EAAU,SAAA;EACrB,WAAWA,iBAAE,QAAA,EAAU,SAAA;EACvB,OAAOA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,EAAE,SAAA;AAC/B,CAAC,EACA,OAAA;AASI,IAAM,0BAA0BA,iBACpC,OAAO;EACN,QAAQA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;EAC5B,aAAa,yBAAyB,SAAA;EACtC,QAAQA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAI;;;;;;EAMlC,eAAeA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;;;;;;EAMnC,QAAQA,iBAAE,QAAA,EAAU,SAAA;;;;;;;;;;;EAWpB,SAASA,iBACN;IACCA,iBAAE,OAAO;MACP,MAAMA,iBAAE,KAAK,CAAC,QAAQ,aAAa,QAAQ,CAAC;MAC5C,SAASA,iBAAE,OAAA,EAAS,IAAI,GAAI;IAAA,CAC7B;EAAA,EAEF,IAAI,EAAE,EACN,SAAA;;;;;;;EAOH,eAAeA,iBAAE,QAAA,EAAU,SAAA;;;;;;;;;;;;;;;;;;EAkB3B,sBAAsBA,iBAAE,OAAOA,iBAAE,QAAA,CAAS,EAAE,SAAA;AAC9C,CAAC,EACA,OAAA;AAYI,IAAM,yBAAyBA,iBAAE,OAAO;EAC7C,mBAAmBA,iBAAE,MAAMA,iBAAE,OAAA,CAAQ;EACrC,aAAaA,iBAAE,MAAMA,iBAAE,OAAO,EAAE,OAAOA,iBAAE,OAAA,GAAU,QAAQA,iBAAE,OAAA,EAAS,SAAA,EAAS,CAAG,CAAC;EACnF,YAAYA,iBAAE,KAAK,CAAC,UAAU,UAAU,UAAU,CAAC;EACnD,eAAeA,iBAAE,OAAA;;;;EAIjB,cAAcA,iBAAE,QAAA,EAAU,QAAQ,IAAI;AACxC,CAAC;AAEM,IAAM,wBAAwBA,iBAAE,OAAO;EAC5C,KAAKA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EACtB,cAAcA,iBAAE,OAAA;EAChB,kBAAkBA,iBAAE,OAAA;EACpB,SAASA,iBAAE;IACTA,iBAAE,OAAO;MACP,IAAIA,iBAAE,OAAA;MACN,MAAMA,iBAAE,OAAA;MACR,SAASA,iBAAE,OAAOA,iBAAE,QAAA,CAAS;MAC7B,aAAaA,iBAAE,QAAA,EAAU,SAAA;IAAS,CACnC;EAAA;EAEH,YAAYA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAC7B,WAAWA,iBAAE,OAAA,EAAS,YAAA;EACtB,WAAWA,iBAAE,OAAA;AACf,CAAC;AAEM,IAAM,2BAA2BA,iBAAE,OAAO;;EAE/C,SAASA,iBAAE,OAAA;;EAEX,SAASA,iBAAE;IACTA,iBAAE,OAAO;MACP,IAAIA,iBAAE,OAAA;MACN,MAAMA,iBAAE,OAAA;MACR,SAASA,iBAAE,OAAOA,iBAAE,QAAA,CAAS;MAC7B,aAAaA,iBAAE,QAAA,EAAU,SAAA;IAAS,CACnC;EAAA;;EAGH,cAAcA,iBAAE,OAAA;;EAEhB,aAAaA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAC9B,cAAcA,iBAAE,OAAA,EAAS,YAAA;EACzB,gBAAgBA,iBAAE,OAAA,EAAS,YAAA;EAC3B,WAAWA,iBAAE,OAAA;;EAEb,OAAOA,iBAAE,MAAM,qBAAqB;;EAEpC,SAASA,iBAAE,OAAA,EAAS,SAAA;;;;;;;;;EASpB,aAAa,uBAAuB,SAAA;AACtC,CAAC;AAMM,IAAM,wBAAwBA,iBAClC,OAAO;EACN,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG;EAC/B,aAAaA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;EACjC,QAAQA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;EAC5B,aAAa,yBAAyB,SAAA;EACtC,QAAQA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAI;AACpC,CAAC,EACA,OAAA;AAGI,IAAM,oBAAoBA,iBAAE,OAAO;EACxC,IAAIA,iBAAE,OAAA;EACN,MAAMA,iBAAE,OAAA;EACR,aAAaA,iBAAE,OAAA,EAAS,SAAA;EACxB,QAAQA,iBAAE,OAAA,EAAS,SAAA;EACnB,aAAa,yBAAyB,SAAA;EACtC,QAAQA,iBAAE,OAAA;EACV,WAAWA,iBAAE,OAAA,EAAS,SAAA;EACtB,WAAWA,iBAAE,OAAA;EACb,WAAWA,iBAAE,OAAA;AACf,CAAC;AAcM,IAAM,6BAA6B;AAEnC,IAAM,4BAA4BA,iBACtC,OAAO;;;EAGN,IAAIA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG;EAC7B,QAAQA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;EAC5B,aAAa,yBAAyB,SAAA;EACtC,QAAQA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAI;EAClC,eAAeA,iBAAE,OAAA,EAAS,IAAI,GAAG,EAAE,SAAA;AACrC,CAAC,EACA,OAAA;AAEI,IAAM,uBAAuBA,iBACjC,OAAO;EACN,WAAWA,iBAAE,MAAM,yBAAyB,EAAE,IAAI,CAAC,EAAE,IAAI,0BAA0B;AACrF,CAAC,EACA,OAAA;AAEI,IAAM,2BAA2BA,iBAAE,OAAO;EAC/C,IAAIA,iBAAE,OAAA;EACN,SAASA,iBAAE,OAAA;EACX,SAASA,iBAAE;IACTA,iBAAE,OAAO;MACP,IAAIA,iBAAE,OAAA;MACN,MAAMA,iBAAE,OAAA;MACR,SAASA,iBAAE,OAAOA,iBAAE,QAAA,CAAS;IAAA,CAC9B;EAAA;EAEH,aAAaA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAC9B,cAAcA,iBAAE,OAAA,EAAS,YAAA;EACzB,gBAAgBA,iBAAE,OAAA,EAAS,YAAA;EAC3B,WAAWA,iBAAE,OAAA;AACf,CAAC;AAEM,IAAM,wBAAwBA,iBAAE,OAAO;EAC5C,SAASA,iBAAE,MAAM,wBAAwB;AAC3C,CAAC;AAiBM,IAAM,sBAAsBA,iBAAE,OAAO;EAC1C,MAAMA,iBACH,OAAA,EACA,MAAM,uBAAuB,EAAE,SAAS,0BAAA,CAA2B,EACnE,SAAA;EACH,IAAIA,iBACD,OAAA,EACA,MAAM,uBAAuB,EAAE,SAAS,wBAAA,CAAyB,EACjE,SAAA;AACL,CAAC;AAMM,IAAM,mCAAmCA,iBAAE,OAAO;;EAEvD,MAAMA,iBAAE,OAAA;EACR,IAAIA,iBAAE,OAAA;EACN,SAASA,iBAAE;IACTA,iBAAE,OAAO;;MAEP,QAAQA,iBAAE,OAAA;MACV,OAAOA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;;MAExB,YAAYA,iBAAE,MAAMA,iBAAE,OAAA,CAAQ,EAAE,IAAI,CAAC;IAAA,CACtC;EAAA;AAEL,CAAC;AAOM,IAAM,+BAA+BA,iBAAE,OAAO;EACnD,MAAMA,iBAAE,OAAA;EACR,IAAIA,iBAAE,OAAA;EACN,UAAUA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAC3B,gBAAgBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EACjC,iBAAiBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAClC,kBAAkBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EACnC,eAAeA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAChC,qBAAqBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EACtC,qBAAqBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EACtC,qBAAqBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EACtC,qBAAqBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;AACxC,CAAC;AAOM,IAAM,gCAAgCA,iBAAE,OAAO;EACpD,MAAMA,iBAAE,OAAA;EACR,IAAIA,iBAAE,OAAA;EACN,SAASA,iBAAE;IACTA,iBAAE,OAAO;MACP,QAAQA,iBAAE,OAAA;MACV,UAAUA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;MAC3B,iBAAiBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;MAClC,eAAeA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;;MAEhC,aAAaA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAA;;MAEtC,WAAWA,iBAAE;QACXA,iBAAE,OAAO;UACP,UAAUA,iBAAE,OAAA;UACZ,OAAOA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;QAAY,CACrC;MAAA;IACH,CACD;EAAA;AAEL,CAAC;AAOM,IAAM,+BAA+BA,iBAAE,OAAO;EACnD,MAAMA,iBAAE,OAAA;EACR,IAAIA,iBAAE,OAAA;EACN,QAAQA,iBAAE;IACRA,iBAAE,OAAO;MACP,SAASA,iBAAE,OAAA;MACX,UAAUA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;MAC3B,gBAAgBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;MACjC,kBAAkBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;MACnC,eAAeA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;MAChC,cAAcA,iBAAE,OAAA,EAAS,SAAA;MACzB,aAAaA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;MAC9B,SAASA,iBAAE,OAAA,EAAS,YAAA;;MAEpB,aAAaA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAA;IAAS,CAChD;EAAA;AAEL,CAAC;AAUM,IAAM,iCAAiCA,iBAAE,OAAO;EACrD,MAAMA,iBAAE,OAAA;EACR,IAAIA,iBAAE,OAAA;EACN,iBAAiBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EAClC,mBAAmBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EACpC,gBAAgBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;EACjC,mBAAmBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;;EAEpC,iBAAiBA,iBAAE,OAAA,EAAS,IAAA,EAAM,YAAA;;EAElC,gBAAgBA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAA;AAC3C,CAAC;AAQM,IAAM,0BAA0BA,iBAAE,KAAK;EAC5C;EACA;EACA;EACA;EACA;AACF,CAAC;AAEM,IAAM,0BAA0BA,iBAAE,OAAO;EAC9C,WAAWA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;;EAE9B,QAAQA,iBAAE,OAAA,EAAS,SAAA;;EAEnB,MAAMA,iBAAE,OAAA,EAAS,SAAA;EACjB,MAAMA,iBACH,OAAA,EACA,MAAM,uBAAuB,EAAE,SAAS,0BAAA,CAA2B,EACnE,SAAA;EACH,IAAIA,iBACD,OAAA,EACA,MAAM,uBAAuB,EAAE,SAAS,wBAAA,CAAyB,EACjE,SAAA;;EAEH,QAAQA,iBAAE,OAAA,EAAS,SAAA;;EAEnB,OAAOA,iBAAE,OAAO,OAAA,EAAS,IAAA,EAAM,SAAA;AACjC,CAAC;AAEM,IAAM,yBAAyBA,iBAAE,OAAO;EAC7C,IAAIA,iBAAE,OAAA;EACN,WAAWA,iBAAE,OAAA;EACb,gBAAgBA,iBAAE,OAAA,EAAS,SAAA;EAC3B,QAAQA,iBAAE,OAAA,EAAS,SAAA;EACnB,MAAMA,iBAAE,OAAA;EACR,QAAQ;EACR,OAAOA,iBAAE,OAAA,EAAS,SAAA;;;;;;;EAOlB,QAAQA,iBAAE,OAAOA,iBAAE,QAAA,CAAS;EAC5B,YAAYA,iBAAE,OAAA,EAAS,SAAA;EACvB,aAAaA,iBAAE,OAAA,EAAS,SAAA;EACxB,WAAWA,iBAAE,OAAA;AACf,CAAC;AAEM,IAAM,6BAA6BA,iBAAE,OAAO;EACjD,SAASA,iBAAE,MAAM,sBAAsB;EACvC,YAAYA,iBAAE,OAAA,EAAS,SAAA;AACzB,CAAC;AAQM,IAAM,yBAAyBA,iBAAE,KAAK,CAAC,WAAW,UAAU,UAAU,CAAC;AAEvE,IAAM,yBAAyBA,iBAAE,KAAK,CAAC,kBAAkB,eAAe,CAAC;AAEzE,IAAM,yBAAyBA,iBAAE,OAAO;;EAE7C,WAAWA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;EAC9B,QAAQ;;EAER,MAAMA,iBAAE,OAAA,EAAS,IAAI,GAAI,EAAE,SAAA;AAC7B,CAAC;AAUM,IAAM,0BAA0BA,iBAAE,OAAO;EAC9C,SAASA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,IAAI;EACnC,cAAcA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;AAC3C,CAAC;AAQM,IAAM,wBAAwBA,iBAAE,OAAO;EAC5C,cAAcA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;AAC3C,CAAC;AAEM,IAAM,4BAA4BA,iBAAE,OAAO;;EAEhD,QAAQA,iBAAE,KAAK,CAAC,QAAQ,UAAU,CAAC,EAAE,SAAA;AACvC,CAAC;AAQM,IAAM,2BAA2BA,iBACrC,OAAOA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE,GAAGA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,EAC5D,OAAO,CAAC,QAAQ,OAAO,KAAK,GAAG,EAAE,UAAU,IAAI;EAC9C,SAAS;AACX,CAAC;AAGI,IAAM,qBAAqBA,iBAAE,OAAO;EACzC,QAAQA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG;EACjC,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;EACjC,aAAa,yBAAyB,SAAA;AACxC,CAAC;AAGM,IAAM,8BAA8B;AAyBpC,SAAS,wBAAwB,OAAoC;AAC1E,MAAI;AACJ,MAAI,OAAO,UAAU,SAAU,OAAM;WAC5B,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,EAAG,OAAM,OAAO,KAAK;MAC3E,QAAO;AAEZ,QAAM,UAAU,IAAI,KAAA;AACpB,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,QAAQ,SAAS,4BAA6B,QAAO;AACzD,SAAO;AACT;AAGO,IAAM,wBAAwB;AAkB9B,IAAM,0BAA0BA,iBACpC,OAAO;EACN,UAAUA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;EAC7B,WAAWA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;EAC9B,YAAYA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;EAC/B,YAAYA,iBAAE,OAAA,EAAS,IAAI,EAAE,EAAE,SAAA;AACjC,CAAC,EACA,YAAA,EACA,OAAO,CAACC,UAAS,KAAK,UAAUA,KAAI,EAAE,UAAU,uBAAuB;EACtE,SAAS,uBAAuB,qBAAqB;AACvD,CAAC;AAGI,IAAM,2BAA2BD,iBAAE,OAAO;EAC/C,QAAQA,iBAAE,WAAW,yBAAyBA,iBAAE,OAAA,EAAS,SAAA,CAAU;EACnE,YAAY,wBAAwB,SAAA,EAAW,MAAM,MAAS;AAChE,CAAC;AAuBM,IAAM,sBAAsBE,iBAAE,OAAO;EAC1C,WAAWA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,EAAE;EACnC,YAAYA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG;EACrC,MAAMA,iBAAE,OAAA,EAAS,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,SAAA;EACjC,aAAa,yBAAyB,SAAA;AACxC,CAAC;;;AV72DM,IAAM,4BAA4B;AAoBzC,IAAM,iBAAiB,iBACpB,OAAO;AAAA,EACN,SAAS,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,SAAS,iBAAE,MAAM,sBAAsB,EAAE,QAAQ,CAAC,CAAC;AAAA,EACnD,YAAY,sBAAsB,QAAQ,EAAE,SAAS;AACvD,CAAC,EACA,YAAY;AAkBf,eAAsB,aACpB,SACA,cAC6B;AAC7B,QAAM,eAAe,kBAAAC,QAAK,QAAQ,SAAS,gBAAgB,yBAAyB;AAEpF,MAAI;AACJ,MAAI;AACF,UAAM,UAAM,2BAAS,cAAc,OAAO;AAAA,EAC5C,SAASC,QAAY;AACnB,QAAIA,QAAO,SAAS,UAAU;AAC5B,aAAO,EAAE,UAAU,MAAM,aAAa;AAAA,IACxC;AACA,UAAM,IAAI;AAAA,MACR,uCAAuC,YAAY,KAAK,iBAAiBA,MAAK,CAAC;AAAA,IACjF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,iBAAa,KAAK,MAAM,GAAG;AAAA,EAC7B,SAASA,QAAO;AACd,UAAM,IAAI;AAAA,MACR,wBAAwB,YAAY,uBAAuB,iBAAiBA,MAAK,CAAC;AAAA,IACpF;AAAA,EACF;AAEA,QAAM,SAAS,eAAe,UAAU,UAAU;AAClD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,SAAS,OAAO,MAAM,OACzB,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,UAAU,OAAO,MAAM,KAAK,KAAK,GAAG,KAAK,QAAQ,KAAK,MAAM,OAAO,EAAE,EAC1E,KAAK,IAAI;AACZ,UAAM,IAAI;AAAA,MACR,wBAAwB,YAAY;AAAA,EAAwB,MAAM;AAAA;AAAA,IAEpE;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,OAAO,MAA0B,aAAa;AACnE;AAkCA,SAAS,YAAY,MAAwB,UAA8C;AACzF,QAAM,SAAkC,EAAE,GAAG,KAAK;AAElD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,UAAU,OAAW;AACzB,QAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,EAAG;AAChD,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,QAAM,SAAS;AAEf,SAAO,UAAU,UAAU,KAAK,SAAS,mBAAmB,SAAS,OAAO,CAAC;AAC7E,SAAO,UAAU,UAAU,KAAK,SAAS,SAAS,OAAO,KAAK,CAAC;AAE/D,MAAI,KAAK,cAAc,SAAS,YAAY;AAC1C,WAAO,aAAa,EAAE,GAAG,KAAK,YAAY,GAAG,SAAS,WAAW;AAAA,EACnE;AAEA,SAAO;AACT;AAMA,SAAS,UACP,MACA,SACiB;AACjB,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAC7C,MAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO;AAEvC,QAAM,OAAO,oBAAI,IAAe;AAChC,aAAW,SAAS,KAAM,MAAK,IAAI,MAAM,IAAI,KAAK;AAClD,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAW,KAAK,IAAI,MAAM,EAAE;AAClC,SAAK,IAAI,MAAM,IAAI,WAAW,EAAE,GAAG,UAAU,GAAG,MAAM,IAAI,KAAK;AAAA,EACjE;AACA,SAAO,MAAM,KAAK,KAAK,OAAO,CAAC;AACjC;AAcA,SAAS,mBAAmB,SAAmE;AAC7F,MAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;AAC7C,SAAO,QAAQ,IAAI,CAAC,YAAY,EAAE,QAAQ,YAAqB,GAAG,OAAO,EAAE;AAC7E;AAOO,SAAS,qBACd,iBACA,iBACoB;AACpB,MAAI,CAAC,mBAAmB,gBAAgB,WAAW,EAAG,QAAO;AAE7D,QAAM,SAAS,oBAAI,IAA8B;AACjD,aAAW,UAAU,gBAAiB,QAAO,IAAI,OAAO,MAAM,MAAM;AACpE,aAAW,YAAY,iBAAiB;AACtC,UAAM,OAAO,OAAO,IAAI,SAAS,IAAI;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OACI,YAAY,MAAM,QAAQ,IAC1B,EAAE,GAAG,UAAU,SAAS,mBAAmB,SAAS,OAAO,EAAE;AAAA,IACnE;AAAA,EACF;AACA,SAAO,MAAM,KAAK,OAAO,OAAO,CAAC;AACnC;AAOO,SAAS,wBACd,oBACA,oBACiB;AACjB,MAAI,CAAC,mBAAoB,QAAO;AAChC,SAAO;AAAA,IACL,eAAe,mBAAmB,iBAAiB,mBAAmB;AAAA,IACtE,SAAS,EAAE,GAAG,mBAAmB,SAAS,GAAI,mBAAmB,WAAW,CAAC,EAAG;AAAA,IAChF,YAAY,CAAC,GAAG,mBAAmB,YAAY,GAAI,mBAAmB,cAAc,CAAC,CAAE;AAAA,EACzF;AACF;;;ArBzJO,IAAM,eAAN,MAAM,cAAa;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAA4B;AACtC,SAAK,kBAAkB;AAEvB,SAAK,iBAAiB;AAAA,MACpB,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO,WAAW,CAAC,YAAY,WAAW,YAAY,SAAS;AAAA,MACxE,SAAS,OAAO,WAAW,CAAC,sBAAsB,mBAAmB,YAAY;AAAA,IACnF;AAEA,SAAK,UAAU;AAAA,MACb,QAAQ,OAAO,UAAU;AAAA,MACzB,WAAW,OAAO,aAAa;AAAA,MAC/B,oBAAoB,OAAO,sBAAsB;AAAA,MACjD,aAAa,OAAO,eAAe;AAAA,MACnC,SAAS,OAAO,WAAW;AAAA,IAC7B;AAEA,SAAK,mBACH,OAAO,oBAAoB,cAAa,uBAAuB,OAAO,QAAQ;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,uBAAuB,UAAqC;AACjE,UAAM,WAAW,YAAY;AAC7B,QAAI,aAAa,eAAgB,QAAO,IAAI,4BAA4B;AACxE,QAAI,aAAa,MAAO,QAAO,IAAI,yBAAyB;AAC5D,WAAO,IAAI,wBAAwB,QAAQ;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,WAA+B;AACnC,YAAQ,IAAI,uCAAuC;AAGnD,UAAM,YAAY,KAAK,QAAQ,aAAa;AAC5C,cAAM,wBAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAC1C,YAAQ,IAAI,4CAA4C,SAAS,EAAE;AAEnE,YAAQ,IAAI,2BAA2B,KAAK,iBAAiB,QAAQ,wBAAwB;AAC7F,UAAM,WAAW,MAAM,KAAK,iBAAiB,QAAQ,KAAK,gBAAgB;AAAA,MACxE,eAAe,KAAK,gBAAgB,iBAAiB;AAAA,MACrD,gBAAgB,KAAK,gBAAgB;AAAA,MACrC,mBAAmB,KAAK,gBAAgB;AAAA,MACxC,mBAAmB,KAAK,gBAAgB;AAAA,IAC1C,CAAC;AAED,YAAQ;AAAA,MACN,2CAA2C,SAAS,QAAQ,MAAM,iBAAiB,SAAS,aAAa;AAAA,IAC3G;AAMA,UAAM,EAAE,UAAU,cAAc,qBAAqB,IAAI,MAAM;AAAA,MAC7D,KAAK,gBAAgB;AAAA,MACrB,KAAK,gBAAgB;AAAA,IACvB;AACA,QAAI,UAAU;AACZ,cAAQ;AAAA,QACN,qCAAqC,oBAAoB,KAAK,SAAS,QAAQ,MAAM;AAAA,MACvF;AAAA,IACF;AAEA,UAAM,gBAAgB,qBAAqB,SAAS,SAAS,UAAU,OAAO;AAC9E,UAAM,aAAa,wBAAwB,SAAS,YAAY,UAAU,UAAU;AAEpF,UAAM,oBAAoB,cAAc;AAAA,MAAI,CAAC,WAC3C,qBAAqB;AAAA,QACnB,GAAG;AAAA,QACH,UAAU,OAAO,WACb,kBAAAC,QAAK,SAAS,KAAK,gBAAgB,SAAS,OAAO,QAAQ,IAC3D,OAAO;AAAA,MACb,CAAC;AAAA,IACH;AAGA,UAAM,cAAc,MAAM,KAAK,eAAe;AAC9C,UAAM,cAAc,YAAY;AAEhC,YAAQ,IAAI,gCAAgC,WAAW,EAAE;AAGzD,UAAM,WAAwB;AAAA,MAC5B,SAAS,KAAK,QAAQ;AAAA,MACtB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,UAAU;AAAA,QACR,kBAAkB;AAAA,QAClB,GAAI,YAAY,UAAU,EAAE,YAAY,YAAY,QAAQ,IAAI,CAAC;AAAA,QACjE,cAAc,kBAAkB;AAAA,QAChC,YAAY,kBAAkB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,QACxE,cAAc,kBAAkB,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAAA,QAC5E,eAAe,SAAS;AAAA;AAAA,QAExB,GAAI,SAAS,qBAAqB,EAAE,oBAAoB,SAAS,mBAAmB,IAAI,CAAC;AAAA,MAC3F;AAAA,IACF;AAGA,UAAM,aAAa,KAAK,UAAU,UAAU,MAAM,CAAC;AAGnD,UAAM,WAAW,KAAK,kBAAkB,UAAU;AAGlD,UAAM,WAAW,kBAAAA,QAAK,QAAQ,WAAW,gBAAgB,KAAK,QAAQ,MAAM,EAAE;AAC9E,cAAM,4BAAU,UAAU,YAAY,OAAO;AAC7C,YAAQ,IAAI,uCAAuC,QAAQ,EAAE;AAG7D,UAAM,mBAAmB,kBAAAA,QAAK,QAAQ,WAAW,oBAAoB;AACrE,cAAM,4BAAU,kBAAkB,UAAU,OAAO;AACnD,YAAQ,IAAI,uCAAuC,gBAAgB,EAAE;AAErE,YAAQ,IAAI,qCAAqC;AAEjD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,QAAQ;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,aAAa,qBAAqB,WAA2C;AAC3E,UAAM,mBAAmB,kBAAAA,QAAK,QAAQ,WAAW,oBAAoB;AACrE,QAAI;AACF,YAAM,UAAU,UAAM,2BAAS,kBAAkB,OAAO;AACxD,aAAO,QAAQ,KAAK,KAAK;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,SAAyB;AACjD,eAAO,+BAAW,QAAQ,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAA8D;AAC1E,QAAI;AACF,YAAM,kBAAkB,kBAAAA,QAAK,QAAQ,KAAK,eAAe,SAAS,cAAc;AAChF,YAAM,qBAAqB,UAAM,2BAAS,iBAAiB,OAAO;AAClE,YAAM,cAAc,KAAK,MAAM,kBAAkB;AACjD,aAAO;AAAA,QACL,MAAM,YAAY,QAAQ;AAAA,QAC1B,SAAS,OAAO,YAAY,YAAY,WAAW,YAAY,UAAU;AAAA,MAC3E;AAAA,IACF,SAASC,QAAO;AACd,cAAQ,KAAK,wEAAwE;AACrF,aAAO,EAAE,MAAM,kBAAkB;AAAA,IACnC;AAAA,EACF;AACF;;;AgCvOA,IAAM,mBACJ;AAEF,SAAS,WAAW,QAAiE;AACnF,MAAI,OAAO,eAAe,OAAO,WAAW,eAAe;AACzD,WAAO,EAAE,UAAU,MAAM,QAAQ,sBAAsB;AAAA,EACzD;AACA,MAAI,OAAO,SAAS,YAAY,OAAO,SAAS,gBAAgB;AAC9D,WAAO,EAAE,UAAU,MAAM,QAAQ,SAAS,OAAO,IAAI,IAAI;AAAA,EAC3D;AACA,QAAM,WAAW,GAAG,OAAO,EAAE,IAAI,OAAO,SAAS,EAAE,IAAI,OAAO,WAAW,EAAE;AAC3E,OAAK,OAAO,SAAS,cAAc,OAAO,SAAS,aAAa,iBAAiB,KAAK,QAAQ,GAAG;AAC/F,WAAO,EAAE,UAAU,MAAM,QAAQ,oCAAoC;AAAA,EACvE;AACA,SAAO,EAAE,UAAU,OAAO,QAAQ,GAAG;AACvC;AAMO,SAAS,mBAAmB,UAA8C;AAC/E,QAAM,WAAkC,CAAC;AAEzC,aAAW,UAAU,SAAS,SAAS;AACrC,eAAW,UAAU,OAAO,WAAW,CAAC,GAAG;AACzC,YAAM,EAAE,UAAU,OAAO,IAAI,WAAW,MAAM;AAC9C,UAAI,CAAC,SAAU;AAEf,YAAM,UAA0C,CAAC;AACjD,UAAI,CAAC,OAAO,OAAQ,SAAQ,KAAK,QAAQ;AACzC,UAAI,CAAC,OAAO,UAAW,SAAQ,KAAK,WAAW;AAC/C,UAAI,QAAQ,WAAW,EAAG;AAE1B,eAAS,KAAK;AAAA,QACZ,QAAQ,OAAO;AAAA,QACf,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,QACnB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAOO,SAAS,uBAAuB,UAA2C;AAChF,SAAO,SAAS;AAAA,IACd,CAAC,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,QAAQ,KAAK,EAAE,UAAU,KAAK,EAAE,MAAM,cAAc,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,EAClG;AACF;;;ACxEO,SAAS,mBAAmB,UAAuB,QAAuB;AAC/E,QAAM,WAAW,mBAAmB,QAAQ;AAE5C,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,gEAAgE;AACxE;AAAA,EACF;AAEA,OAAK,kBAAkB,SAAS,MAAM,8CAA8C;AACpF,aAAW,QAAQ,uBAAuB,QAAQ,GAAG;AACnD,QAAI,KAAK,IAAI,EAAE;AAAA,EACjB;AACA,MAAI,8HAA8H;AAElI,MAAI,QAAQ;AACV,UAAM,2DAA2D;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ACNA,qBAA6B;AAC7B,IAAAC,oBAAqB;AAiCrB,IAAM,aAAa;AAiBZ,SAAS,kBACd,OACA,QACoB;AACpB,MAAI,OAAO,iBAAiB,MAAM,QAAS,QAAO;AAElD,SAAO;AAAA,IACL,cAAc,MAAM;AAAA,IACpB,eAAe,OAAO;AAAA,IACtB,UAAU,OAAO;AAAA,IACjB,QAAQ,MAAM,UAAU,KAAK,OAAO,gBAAgB,MAAM,UAAU;AAAA,EACtE;AACF;AAUO,SAAS,yBAAyB,WAA+C;AACtF,MAAI;AACF,UAAM,UAAM,iCAAa,wBAAK,WAAW,mBAAmB,GAAG,OAAO;AACtE,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,OAAO,QAAQ,UAAU,iBAAiB,SAAU,QAAO;AAC/D,WAAO,EAAE,SAAS,OAAO,SAAS,aAAa;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUO,SAAS,kBACd,OACA,UAAsC,CAAC,GACjC;AACN,MAAI,CAAC,MAAM,QAAQ;AACjB;AAAA,MACE,0EACc,MAAM,QAAQ,KAAK,MAAM,aAAa;AAAA,IACtD;AACA;AAAA,EACF;AAEA;AAAA,IACE,gBAAgB,QAAQ,eAAe,WAAW,EAAE,gBAC/C,MAAM,aAAa,uCACnB,MAAM,YAAY;AAAA,EACzB;AACA,OAAK,uBAAuB,MAAM,QAAQ,KAAK,MAAM,aAAa,WAAW;AAC7E,OAAK,uBAAuB,MAAM,YAAY,UAAU;AACxD,OAAK,EAAE;AACP,OAAK,sEAAsE;AAC3E,OAAK,sEAAsE;AAC3E,OAAK,+DAA+D;AACpE,OAAK,kEAAkE;AACvE,OAAK,6DAA6D;AAClE,OAAK,EAAE;AACP,MAAI,QAAQ,cAAc;AACxB,SAAK,oEAAoE;AACzE,SAAK,mEAA8D;AACnE,SAAK,4CAA4C;AAAA,EACnD,OAAO;AACL,SAAK,4BAA4B;AAAA,EACnC;AACF;;;AChIO,SAAS,qBAAqB,SAAwB,WAA0B;AACrF,QAAM,SAAS,QAAQ,eAAe;AAEtC,MAAI,WAAW,KAAK;AAClB,SAAK,EAAE;AACP,SAAK,iFAAuE;AAC5E,SAAK,mEAAmE;AACxE,SAAK,2CAA2C;AAChD,SAAK,aAAa,aAAa,WAAW,EAAE;AAC5C,SAAK,uEAAuE;AAC5E,SAAK,EAAE;AACP,SAAK,uEAAuE;AAC5E,SAAK,yDAAyD;AAC9D;AAAA,EACF;AAEA,MAAI,QAAQ,cAAc,sBAAsB;AAC9C,SAAK,EAAE;AACP,SAAK,+DAA+D;AACpE,SAAK,iDAA4C;AACjD;AAAA,EACF;AAEA,MAAI,WAAW,KAAK;AAClB,SAAK,EAAE;AACP,SAAK,mBAAmB,aAAa,WAAW,mCAA8B;AAC9E,SAAK,kEAAkE;AACvE;AAAA,EACF;AAEA,MAAI,WAAW,KAAK;AAClB,SAAK,EAAE;AACP,SAAK,sEAAsE;AAC3E,SAAK,+BAA+B;AACpC;AAAA,EACF;AAEA,MAAI,UAAU,KAAK;AACjB,SAAK,EAAE;AACP,SAAK,wEAAmE;AACxE,SAAK,4DAA4D;AAAA,EACnE;AACF;;;AC5BO,SAAS,yBACd,UACA,UAAgC,CAAC,GAC3B;AACN,OAAK,SAAS,UAAU,gBAAgB,KAAK,EAAG;AAChD,MAAI,QAAQ,YAAY;AACtB,SAAK,gEAAgE;AACrE;AAAA,EACF;AAEA,QAAM,wFAAmF;AACzF,OAAK,EAAE;AACP,OAAK,sEAAsE;AAC3E,OAAK,4DAA4D;AACjE,OAAK,EAAE;AACP,OAAK,uBAAuB;AAC5B,OAAK,6EAAwE;AAC7E,OAAK,wEAAwE;AAC7E,OAAK,8EAAoE;AACzE,OAAK,6DAA6D;AAClE,OAAK,EAAE;AACP,OAAK,uEAAuE;AAC5E,OAAK,yEAAyE;AAC9E,OAAK,yEAAyE;AAC9E,OAAK,0DAA0D;AAC/D,OAAK,EAAE;AACP,OAAK,8DAA8D;AACnE,UAAQ,KAAK,CAAC;AAChB;;;ArCvBO,SAAS,cAAuB;AACrC,SAAO,IAAI,0BAAQ,MAAM,EACtB,YAAY,sDAAsD,EAClE,OAAO,aAAa,0BAA0B,KAAK,EACnD,OAAO,WAAW,wCAAwC,KAAK,EAC/D,OAAO,mBAAmB,+DAA+D,EACzF,OAAO,qBAAqB,4DAA4D,EACxF,OAAO,kBAAkB,qEAAqE,EAC9F,OAAO,UAAU,2DAA2D,KAAK,EACjF,OAAO,WAAW,4CAA4C,KAAK,EACnE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,iBAAiB,yDAAyD,KAAK,EACtF,OAAO,OAAO,YAAyB;AACtC,QAAI,QAAQ,KAAM,YAAW,MAAM;AAAA,aAC1B,QAAQ,MAAO,YAAW,OAAO;AAC1C,QAAI;AACF,aAAO;AAIP,YAAM,SAAS,WAAW,IAAI;AAC9B,YAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,UAAI,CAAC,QAAQ;AACX,cAAM,oCAAoC;AAC1C,aAAK,yCAAyC;AAC9C,aAAK,4CAA4C;AACjD,mBAAW,EAAE,SAAS,OAAO,OAAO,2CAA2C,CAAC;AAChF,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AACA,YAAM,SAAS;AAAA,QACb,WAAW;AAAA,QACX,WAAW;AAAA,QACX,GAAG;AAAA,QACH;AAAA,QACA,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,QAC5D,GAAI,QAAQ,SAAS,EAAE,WAAW,QAAQ,OAAO,IAAI,CAAC;AAAA,MACxD;AAGA,YAAM,YAAY,IAAI,kBAAkB;AAAA,QACtC,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAED,YAAM,YAAY,OAAO,aAAa;AAGtC,UAAI,mBAAmB;AACvB,UAAI;AACF,cAAM,mBAAe,wBAAK,WAAW,oBAAoB;AACzD,4BAAoB,UAAM,2BAAS,cAAc,OAAO,GAAG,KAAK;AAAA,MAClE,QAAQ;AAAA,MAER;AAGA,UAAI,UAAU,cAAc,sBAAsB;AAClD,cAAQ,MAAM;AAEd,YAAM,YAAY,IAAI,aAAa;AAAA,QACjC,SAAS,QAAQ,IAAI;AAAA,QACrB;AAAA,QACA,QAAQ;AAAA,QACR,eAAe,OAAO;AAAA,QACtB,gBAAgB,OAAO;AAAA,QACvB,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,QAChB,mBAAmB,OAAO;AAAA,QAC1B,mBAAmB,OAAO;AAAA,QAC1B,UAAU,OAAO;AAAA,QACjB,cAAc,OAAO;AAAA,MACvB,CAAC;AAED,YAAM,SAAS,MAAM,UAAU,SAAS;AACxC,cAAQ,KAAK;AAIb,+BAAyB,OAAO,UAAU;AAAA,QACxC,SAAS,QAAQ,IAAI;AAAA,QACrB,YAAY,QAAQ,QAAQ,UAAU;AAAA,MACxC,CAAC;AAED;AAAA,QACE,SAAS,OAAO,SAAS,SAAS,YAAY,aACzC,OAAO,SAAS,SAAS,UAAU,WAAW,OAAO,SAAS,SAAS,YAAY;AAAA,MAC1F;AAIA,yBAAmB,OAAO,UAAU,QAAQ,QAAQ,cAAc,CAAC;AASnE,gBAAU,cAAc,2BAA2B;AACnD,cAAQ,MAAM;AACd,YAAM,SAAS,MAAM,UAAU,OAAO;AACtC,cAAQ,KAAK;AAEb,YAAM,eAAe,OAAO,QAAQ,OAAQ,OAAO,aAAa;AAChE,YAAM,QAAQ,eACV,kBAAkB,EAAE,SAAS,OAAO,SAAS,SAAS,aAAa,GAAG,YAAY,IAClF;AAUJ,UAAI,CAAC,QAAQ,SAAS,oBAAoB,qBAAqB,OAAO,UAAU;AAC9E,YAAI,OAAO,OAAO;AAChB,eAAK,4BAA4B,OAAO,KAAK,EAAE;AAC/C,eAAK,qBAAqB;AAAA,QAC5B,WAAW,cAAc;AAOvB,cAAI,CAAC,OAAO;AACV,oBAAQ,iDAAiD;AACzD,uBAAW,EAAE,SAAS,MAAM,WAAW,MAAM,UAAU,OAAO,SAAS,CAAC;AACxE;AAAA,UACF;AAEA,4BAAkB,KAAK;AACvB,eAAK,qBAAqB;AAAA,QAC5B;AAAA,MAEF;AAGA,gBAAU,cAAc,0BAA0B;AAClD,cAAQ,MAAM;AAEd,YAAM,aAAa,MAAM,UAAU;AAAA,QACjC,OAAO;AAAA,QACP,OAAO,SAAS;AAAA,QAChB,OAAO,SAAS,SAAS;AAAA,MAC3B;AACA,cAAQ,KAAK;AAEb,UAAI,CAAC,WAAW,SAAS;AACvB,cAAM,gBAAgB,WAAW,KAAK,EAAE;AACxC,8BAAsB,OAAO,WAAW,WAAW,KAAK;AACxD,6BAAqB,YAAY,OAAO,SAAS;AAKjD,YAAI,OAAO,QAAQ;AACjB,4BAAkB,OAAO,EAAE,cAAc,KAAK,CAAC;AAAA,QACjD;AACA,mBAAW;AAAA,UACT,SAAS;AAAA,UACT,OAAO,WAAW;AAAA,UAClB,WAAW,WAAW;AAAA,UACtB,aAAa,WAAW;AAAA,UACxB,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AACD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI,WAAW,aAAa,CAAC,QAAQ,OAAO;AAC1C,gBAAQ,8BAA8B;AACtC,YAAI,WAAW,WAAW;AAGxB,eAAK,yBAAyB,WAAW,EAAE,kCAAkC;AAAA,QAC/E;AAAA,MACF,OAAO;AACL,gBAAQ,kCAAkC;AAC1C,YAAI,OAAO,QAAQ;AACjB;AAAA,YACE,gBAAgB,MAAM,aAAa,qCAC7B,MAAM,QAAQ,8CACf,MAAM,eAAe,MAAM,aAAa;AAAA,UAC/C;AAAA,QACF;AACA,aAAK,gBAAgB,WAAW,EAAE,EAAE;AACpC,aAAK,aAAa,WAAW,QAAQ,EAAE;AAEvC,YAAI,OAAO,WAAW;AACpB,gBAAM,eAAe,GAAG,OAAO,SAAS,uBAAuB,OAAO,SAAS;AAC/E,eAAK,sBAAsB,YAAY,EAAE;AAAA,QAC3C;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS;AACnB,gBAAQ,iBAAiB;AACzB,cAAM;AAAA,UACJ,CAAC,WAAW,OAAO,WAAW,gBAAgB,CAAC,CAAC;AAAA,UAChD,CAAC,SAAS,OAAO,WAAW,cAAc,CAAC,CAAC;AAAA,UAC5C,CAAC,WAAW,OAAO,WAAW,gBAAgB,CAAC,CAAC;AAAA,UAChD,CAAC,eAAe,WAAW,MAAM,KAAK;AAAA,UACtC,CAAC,qBAAqB,oBAAoB,aAAa;AAAA,UACvD,CAAC,gBAAgB,OAAO,QAAQ;AAAA,UAChC,CAAC,WAAW,OAAO,qBAAqB,OAAO,QAAQ,CAAC;AAAA,QAC1D,CAAC;AAAA,MACH;AAEA,iBAAW;AAAA,QACT,SAAS;AAAA,QACT,WAAW,QAAQ,WAAW,SAAS;AAAA,QACvC,IAAI,WAAW;AAAA,QACf,UAAU,WAAW,YAAY,OAAO;AAAA,QACxC,cAAc,WAAW,gBAAgB,OAAO,SAAS,SAAS;AAAA,QAClE,YAAY,WAAW,cAAc,OAAO,SAAS,SAAS;AAAA,QAC9D,cAAc,WAAW,gBAAgB,OAAO,SAAS,SAAS;AAAA,MACpE,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,gBAAgB,iBAAiB,GAAG,CAAC,EAAE;AAC7C,iBAAW,EAAE,SAAS,OAAO,OAAO,iBAAiB,GAAG,EAAE,CAAC;AAC3D,UAAI,QAAQ,SAAS;AACnB,gBAAQ,MAAM,GAAG;AAAA,MACnB;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AsC/QA,IAAAC,oBAAwB;AACxB,IAAAC,kBAAsB;AAYf,SAAS,eAAwB;AACtC,SAAO,IAAI,0BAAQ,OAAO,EACvB,YAAY,uDAAuD,EACnE,OAAO,aAAa,0BAA0B,KAAK,EACnD,OAAO,OAAO,YAA0B;AACvC,QAAI;AACF,aAAO;AAGP,YAAM,SAAS,WAAW,IAAI;AAC9B,UAAI,CAAC,QAAQ;AACX,cAAM,oCAAoC;AAC1C,aAAK,yCAAyC;AAC9C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,YAAM,YAAY,IAAI,kBAAkB;AAAA,QACtC,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAGD,WAAK,4BAA4B;AACjC,YAAM,kBAAkB;AAAA,QACtB,SAAS,QAAQ,IAAI;AAAA,QACrB,WAAW,OAAO,aAAa;AAAA,QAC/B,QAAQ;AAAA,QACR,eAAe,OAAO;AAAA,QACtB,gBAAgB,OAAO;AAAA,QACvB,SAAS,OAAO;AAAA,QAChB,SAAS,OAAO;AAAA,QAChB,mBAAmB,OAAO;AAAA,QAC1B,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA,QAI1B,UAAU,OAAO;AAAA,QACjB,cAAc,OAAO;AAAA,MACvB;AAEA,YAAM,YAAY,IAAI,aAAa,eAAe;AAElD,YAAM,gBAAgB,MAAM,UAAU,SAAS;AAC/C,YAAM,cAAc,MAAM,UAAU;AAAA,QAClC,cAAc;AAAA,QACd,cAAc,SAAS;AAAA,MACzB;AAEA,UAAI,CAAC,YAAY,SAAS;AACxB,cAAM,wBAAwB,YAAY,KAAK,EAAE;AACjD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,cAAQ,wBAAwB;AAChC,WAAK,2BAA2B,OAAO,aAAa,WAAW,KAAK;AACpE,UAAI,wBAAwB;AAG5B,UAAI,gBAAuC;AAC3C,YAAM,cAAc;AAEpB,YAAM,cAAU,uBAAM,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,GAAG,OAAO,WAAW,aAAa;AACvF,YAAI,CAAC,SAAU;AAGf,YACE,SAAS,WAAW,GAAG,KACvB,SAAS,SAAS,cAAc,KAChC,SAAS,SAAS,OAAO,aAAa,WAAW,GACjD;AACA;AAAA,QACF;AAGA,YAAI,eAAe;AACjB,uBAAa,aAAa;AAAA,QAC5B;AAEA,wBAAgB,WAAW,YAAY;AACrC,cAAI;AACF,gBAAI,QAAQ,SAAS;AACnB,mBAAK,oBAAoB,QAAQ,EAAE;AAAA,YACrC;AAEA,kBAAM,UAAU,cAAc,yBAAyB;AACvD,oBAAQ,MAAM;AAEd,kBAAM,eAAe,IAAI,aAAa,eAAe;AAErD,kBAAM,SAAS,MAAM,aAAa,SAAS;AAC3C,oBAAQ,OAAO;AAEf,kBAAM,aAAa,MAAM,UAAU,KAAK,OAAO,UAAU,OAAO,SAAS,OAAO;AAChF,oBAAQ,KAAK;AAEb,gBAAI,CAAC,WAAW,SAAS;AACvB,oBAAM,gBAAgB,WAAW,KAAK,EAAE;AAAA,YAC1C,WAAW,WAAW,WAAW;AAC/B,mBAAK,8CAA8C;AAAA,YACrD,OAAO;AACL,sBAAQ,6BAA6B;AACrC;AAAA,gBACE,GAAG,OAAO,SAAS,SAAS,YAAY,aACnC,OAAO,SAAS,SAAS,UAAU,WACnC,OAAO,SAAS,SAAS,YAAY;AAAA,cAC5C;AAAA,YACF;AAAA,UACF,SAAS,KAAK;AACZ,kBAAM,sBAAsB,iBAAiB,GAAG,CAAC,EAAE;AAAA,UACrD;AAAA,QACF,GAAG,WAAW;AAAA,MAChB,CAAC;AAGD,cAAQ,GAAG,UAAU,MAAM;AACzB,aAAK,qBAAqB;AAC1B,gBAAQ,MAAM;AACd,YAAI,eAAe;AACjB,uBAAa,aAAa;AAAA,QAC5B;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,iBAAiB,iBAAiB,GAAG,CAAC,EAAE;AAC9C,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AC7IA,IAAAC,oBAAwB;AAejB,SAAS,kBAA2B;AACzC,SAAO,IAAI,0BAAQ,UAAU,EAC1B,YAAY,yDAAyD,EACrE,OAAO,uBAAuB,sCAAsC,WAAW,EAC/E,OAAO,yBAAyB,uCAAuC,MAAM,EAC7E;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,iBAAiB,yDAAyD,KAAK,EACtF,OAAO,OAAO,YAA6B;AAC1C,QAAI;AACF,aAAO;AAGP,UAAI,QAAQ,UAAU,QAAQ,WAAW,QAAQ;AAC/C,cAAM,WAAW,QAAQ,MAAM,mDAAmD;AAClF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,cAAc,sBAAsB;AACpD,cAAQ,MAAM;AAQd,UAAI,SAAwC;AAC5C,UAAI;AACF,iBAAS,WAAW,IAAI;AAAA,MAC1B,QAAQ;AACN,iBAAS;AAAA,MACX;AAEA,YAAM,YAAY,IAAI,aAAa;AAAA,QACjC,SAAS,QAAQ,IAAI;AAAA,QACrB,WAAW,QAAQ,UAAU;AAAA,QAC7B,QAAQ;AAAA,QACR,UAAU,QAAQ;AAAA,QAClB,cAAc,QAAQ;AAAA,MACxB,CAAC;AAED,YAAM,SAAS,MAAM,UAAU,SAAS;AACxC,cAAQ,KAAK;AAEb,+BAAyB,OAAO,UAAU;AAAA,QACxC,SAAS,QAAQ,IAAI;AAAA,QACrB,YAAY,QAAQ,QAAQ,UAAU;AAAA,MACxC,CAAC;AAED;AAAA,QACE,+BAA+B,OAAO,SAAS,SAAS,YAAY,aAC/D,OAAO,SAAS,SAAS,UAAU,WAAW,OAAO,SAAS,SAAS,YAAY;AAAA,MAC1F;AACA,WAAK,eAAe,OAAO,QAAQ,EAAE;AACrC,WAAK,aAAa,OAAO,QAAQ,EAAE;AAEnC,yBAAmB,OAAO,UAAU,QAAQ,QAAQ,cAAc,CAAC;AAAA,IACrE,SAAS,KAAK;AACZ,YAAM,sBAAsB,iBAAiB,GAAG,CAAC,EAAE;AACnD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;ACxEA,IAAAC,mBAAoC;AACpC,IAAAC,oBAAiB;AAEjB,IAAAC,oBAAwB;AACxB,IAAAC,oBAAiB;;;ACGjB,IAAAC,oBAAsB;AACtB,IAAAC,MAAmB;;;ACKnB,IAAAC,oBAAiB;AACjB,IAAAC,kBAAyC;AAEzC,IAAAC,oBAAsB;AACtB,IAAAC,MAAmB;AAInB,IAAMC,aAAY,kBAAAC,QAAwD,WAAW,kBAAAA;AAgC9E,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAYM,SAAS,eAAe,KAAwC;AACrE,QAAM,MAAM,oBAAI,IAA0B;AAC1C,EAAAD,WAAS,KAAc;AAAA,IACrB,kBAAkB,UAAyC;AACzD,YAAM,SAAS,SAAS,KAAK,OAAO;AACpC,iBAAW,QAAQ,SAAS,KAAK,YAAY;AAC3C,YAAM,sBAAkB,IAAI,GAAG;AAC7B,gBAAM,WAAa,iBAAa,KAAK,QAAQ,IAAI,KAAK,SAAS,OAAO,KAAK,SAAS;AACpF,cAAI,IAAI,KAAK,MAAM,MAAM,EAAE,QAAQ,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAAA,QACvE,WAAa,6BAAyB,IAAI,GAAG;AAC3C,cAAI,IAAI,KAAK,MAAM,MAAM,EAAE,QAAQ,OAAO,KAAK,MAAM,MAAM,UAAU,UAAU,CAAC;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;AAEA,IAAM,aAAa,CAAC,QAAQ,OAAO,QAAQ,KAAK;AASzC,SAAS,sBAAsB,UAAkB,QAAoC;AAC1F,MAAI,CAAC,OAAO,WAAW,GAAG,EAAG,QAAO;AACpC,QAAM,OAAO,kBAAAE,QAAK,QAAQ,kBAAAA,QAAK,QAAQ,QAAQ,GAAG,MAAM;AAExD,aAAW,OAAO,YAAY;AAC5B,UAAM,YAAY,GAAG,IAAI,GAAG,GAAG;AAC/B,YAAI,4BAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AACA,aAAW,OAAO,YAAY;AAC5B,UAAM,YAAY,kBAAAA,QAAK,KAAK,MAAM,QAAQ,GAAG,EAAE;AAC/C,YAAI,4BAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AACA,SAAO;AACT;AAuBA,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,cAAcC,OAAc,YAAoB,QAAQ,GAAmB;AAClF,QAAM,OAAuB,EAAE,UAAU,OAAO,SAAS,MAAM;AAC/D,MAAI,QAAQ,EAAG,QAAO;AACtB,MAAI;AACJ,MAAI;AACF,iBAAS,8BAAaA,OAAM,OAAO;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AAIA,QAAM,mBACJ,OAAO,SAAS,QAAQ,KACxB,OAAO,SAAS,oBAAoB,KACpC,OAAO,SAAS,aAAa,KAC7B,cAAc,KAAK,MAAM;AAC3B,MAAI,CAAC,oBAAoB,CAAC,4BAA4B,KAAK,MAAM,EAAG,QAAO;AAE3E,MAAI;AACJ,MAAI;AACF,UAAM,YAAY,MAAM;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACf,MAAI,UAAU;AACd,MAAI;AAEJ,EAAAH,WAAS,KAAc;AAAA;AAAA,IAErB,uBAAuB,UAA8C;AACnE,YAAM,OAAO,SAAS,KAAK,QAAQ;AACnC,UAAI,CAAC,KAAM;AACX,YAAM,QAAQ,SAAS,KAAK,WAAW;AAAA,QACrC,CAAC,SACG,sBAAkB,IAAI,MACrB,iBAAa,KAAK,QAAQ,IAAI,KAAK,SAAS,OAAO,KAAK,SAAS,WAAW;AAAA,MACnF;AACA,UAAI,MAAO,gBAAe;AAAA,IAC5B;AAAA,IACA,qBAAqB,UAA4C;AAC/D,uBAAiB,SAAS,KAAK,OAAO;AAAA,IACxC;AAAA;AAAA,IAEA,oBAAoB,UAA2C;AAC7D,UAAM,iBAAa,SAAS,KAAK,GAAG,KAAK,SAAS,KAAK,IAAI,SAAS,SAAU,YAAW;AAAA,IAC3F;AAAA;AAAA,IAEA,eAAe,UAAsC;AACnD,UAAM,iBAAa,SAAS,KAAK,GAAG,KAAK,SAAS,KAAK,IAAI,SAAS,SAAU,YAAW;AAAA,IAC3F;AAAA;AAAA,IAEA,qBAAqB;AACnB,iBAAW;AAAA,IACb;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,aAAa,UAAoC;AAC/C,YAAM,OAAS,oBAAgB,SAAS,KAAK,IAAI,IAAI,SAAS,KAAK,KAAK,OAAO;AAC/E,UAAI,SAAS,YAAY,SAAS,qBAAsB;AACxD,YAAM,QAAQ,SAAS,KAAK;AAC5B,UAAI,CAAG,6BAAyB,KAAK,EAAG;AACxC,UAAM,oBAAgB,MAAM,UAAU,EAAG;AACzC,gBAAU;AAAA,IACZ;AAAA;AAAA,IAEA,eAAe,UAAsC;AACnD,YAAM,SAAS,SAAS,KAAK;AAC7B,UAAM,iBAAa,MAAM,KAAK,eAAe,IAAI,OAAO,IAAI,EAAG,WAAU;AAAA,IAC3E;AAAA,EACF,CAAC;AAED,MAAI,YAAY,QAAS,QAAO,EAAE,UAAU,QAAQ;AACpD,MAAI,cAAc;AAChB,UAAM,OAAO,sBAAsBG,OAAM,YAAY;AACrD,QAAI,KAAM,QAAO,cAAc,MAAM,YAAY,QAAQ,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAGA,IAAM,eAAe,oBAAI,IAA4B;AAQ9C,SAAS,eACd,eACA,UACA,SACgB;AAChB,QAAM,SAAS,QAAQ,IAAI,aAAa;AAExC,MAAI,QAAQ,WAAW,gBAAgB;AACrC,WAAO,mBAAmB,IAAI,OAAO,QAAQ,IAAI,iBAAiB;AAAA,EACpE;AAEA,QAAM,SAAS,SAAS,sBAAsB,UAAU,OAAO,MAAM,IAAI;AACzE,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,aAAa,QAAQ,YAAY;AACvC,QAAM,MAAM,GAAG,MAAM,IAAI,UAAU;AACnC,MAAI,WAAW,aAAa,IAAI,GAAG;AACnC,MAAI,aAAa,QAAW;AAC1B,eAAW,cAAc,QAAQ,UAAU;AAC3C,iBAAa,IAAI,KAAK,QAAQ;AAAA,EAChC;AAGA,MAAI,SAAS,SAAU,QAAO;AAC9B,MAAI,SAAS,QAAS,QAAO;AAC7B,SAAO;AACT;AAGO,SAAS,uBAA6B;AAC3C,eAAa,MAAM;AACrB;;;AD3QA,IAAMC,aAAY,kBAAAC,QAAwD,WAAW,kBAAAA;AAGrF,IAAM,cAAc,CAAC,SAAS,SAAS,aAAa;AAEpD,IAAM,iBAAiB,CAAC,UAAU,cAAc,oBAAoB;AA8BpE,SAAS,MAAM,MAAsB;AACnC,SAAO,KACJ,QAAQ,sBAAsB,OAAO,EACrC,YAAY,EACZ,UAAU,KAAK,EACf,QAAQ,UAAU,EAAE,EACpB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAGA,SAAS,OAAO,MAAsB;AACpC,SAAO,MAAM,KAAK,QAAQ,yBAAyB,EAAE,CAAC;AACxD;AAGO,SAAS,iBAAiBC,OAAsB;AACrD,QAAM,OAAOA,MAAK,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,IAAI,KAAKA;AAC1D,QAAM,OAAO,KAAK,QAAQ,cAAc,EAAE;AAC1C,MAAI,KAAK,YAAY,MAAM,SAAS;AAClC,UAAM,MAAMA,MAAK,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,KAAK;AACpE,WAAO,MAAM,GAAG;AAAA,EAClB;AACA,SAAO,MAAM,KAAK,QAAQ,WAAW,EAAE,CAAC;AAC1C;AAUA,SAAS,gBAAgB,MAAsB;AAC7C,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAgB,CAAC;AACvB,aAAW,SAAS,KAAK,MAAM,GAAG,GAAG;AACnC,QAAI,CAAC,SAAS,KAAK,IAAI,KAAK,EAAG;AAC/B,SAAK,IAAI,KAAK;AACd,QAAI,KAAK,KAAK;AAAA,EAChB;AACA,SAAO,IAAI,KAAK,GAAG;AACrB;AAiBO,SAAS,aAAa,MAMlB;AACT,QAAM,OAAO,CAAC,KAAK,OAAO,MAAM,KAAK,SAAS,CAAC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACzE,MAAI,KAAK,aAAa,KAAK,cAAc,WAAW;AAClD,WAAO,gBAAgB,GAAG,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,EAAE;AAAA,EAC5D;AACA,MAAI,KAAK,SAAS;AAChB,UAAM,OAAO,OAAO,KAAK,OAAO;AAChC,WAAO,gBAAgB,OAAO,GAAG,IAAI,IAAI,IAAI,KAAK,IAAI;AAAA,EACxD;AACA,SAAO,gBAAgB,GAAG,IAAI,IAAI,KAAK,OAAO,EAAE;AAClD;AAEA,SAAS,WAAW,SAA8B,OAAmC;AACnF,SAAO,MAAM,KAAK,CAAC,SAAS,iBAAiB,SAAS,IAAI,MAAM,MAAS;AAC3E;AAEA,SAAS,aAAa,SAAuC;AAC3D,SAAO,YAAY,KAAK,CAAC,SAAS;AAChC,UAAM,QAAQ,cAAc,SAAS,IAAI;AACzC,WAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS;AAAA,EAC5D,CAAC;AACH;AAEA,SAAS,aAAa,SAA8B,MAA8C;AAChG,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,OAAO,iBAAiB,SAAS,IAAI;AAC3C,MAAI,CAAC,QAAQ,CAAG,6BAAyB,KAAK,KAAK,EAAG,QAAO;AAC7D,SAAS,iBAAa,KAAK,MAAM,UAAU,IAAI,KAAK,MAAM,WAAW,OAAO;AAC9E;AAGA,IAAM,oBAAoB,oBAAI,IAAI,CAAC,UAAU,SAAS,UAAU,UAAU,QAAQ,MAAM,CAAC;AAiBzF,SAAS,gBAAgB,UAEb;AACV,MAAI,UAAU,SAAS;AACvB,SAAO,SAAS;AACd,UAAM,OAAO,QAAQ;AACrB,QACI,qBAAiB,IAAI,KACrB,uBAAmB,KAAK,MAAM,KAC9B,iBAAa,KAAK,OAAO,QAAQ,MAClC,KAAK,OAAO,SAAS,SAAS,SAAS,KAAK,OAAO,SAAS,SAAS,YACtE;AACA,aAAO;AAAA,IACT;AACA,QACI,mBAAe,IAAI,KACnB,oBAAgB,KAAK,IAAI,KAC3B,2DAA2D,KAAK,KAAK,KAAK,IAAI,KAC9E,KAAK,KAAK,SAAS,yBACnB;AAGA,aAAO,2DAA2D,KAAK,KAAK,KAAK,IAAI;AAAA,IACvF;AACA,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,QAAgBA,OAAgC;AAClF,MAAI;AACJ,MAAI;AACF,UAAM,YAAY,MAAM;AAAA,EAC1B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,eAAe,GAAG;AAClC,QAAM,QAAQ,iBAAiBA,KAAI;AACnC,QAAM,QAA0B,CAAC;AACjC,QAAM,eAAe,oBAAI,IAAoB;AAC7C,QAAM,UAAU,oBAAI,IAAY;AAGhC,EAAAF,WAAS,KAAc;AAAA,IACrB,kBAAkB,UAAyC;AACzD,iBAAW,QAAQ,gBAAgB;AACjC,cAAM,WAAW,cAAc,SAAS,MAAM,IAAI;AAClD,YAAI,SAAU,SAAQ,IAAI,QAAQ;AAAA,MACpC;AAAA,IACF;AAAA,EACF,CAAC;AAED,EAAAA,WAAS,KAAc;AAAA,IACrB,kBAAkB,UAGf;AACD,YAAM,UAAU,SAAS;AACzB,UAAI,CAAG,oBAAgB,QAAQ,IAAI,EAAG;AACtC,YAAM,YAAY,QAAQ,KAAK;AAE/B,YAAM,OAAO,qBAAqB,WAAW,OAAO;AACpD,UAAI,CAAC,kBAAkB,IAAI,IAAI,EAAG;AAGlC,UAAI,WAAW,SAAS,cAAc,EAAG;AACzC,UAAI,SAAS,YAAY,aAAa,OAAO,EAAG;AAEhD,YAAM,UAAU,eAAe,WAAWE,OAAM,OAAO;AAGvD,UAAI,YAAY,UAAW;AAE3B,UAAI,gBAAgB,QAAQ,EAAG;AAE/B,YAAM,YAAY,iBAAiB,OAAO,KAAK;AAC/C,YAAM,UAAU,aAAa,SAAS,SAAS;AAC/C,YAAM,WAAW,aAAa,IAAI,SAAS,KAAK,KAAK;AACrD,mBAAa,IAAI,WAAW,OAAO;AAEnC,UAAI,SAAS,aAAa,EAAE,OAAO,WAAW,WAAW,SAAS,QAAQ,CAAC;AAC3E,UAAI,QAAQ,IAAI,MAAM,GAAG;AACvB,YAAI,SAAS;AACb,eAAO,QAAQ,IAAI,GAAG,MAAM,IAAI,MAAM,EAAE,EAAG,WAAU;AACrD,iBAAS,GAAG,MAAM,IAAI,MAAM;AAAA,MAC9B;AACA,cAAQ,IAAI,MAAM;AAElB,YAAM,OAAO,QAAQ,KAAK,MAAM,QAAQ;AACxC,YAAM,cAAc,QAAQ,KAAK,KAAK,IAAI,QAAQ;AAClD,YAAM,YAAY,QAAQ,WAAW,CAAC;AACtC,YAAM,eAAe,WAAW,KAAK;AACrC,YAAM,cAAc,CAAC,CAAC,gBAAgB,aAAa,SAAS;AAC5D,YAAM,aAAa,cACf;AAAA,EAAK,IAAI,OAAO,aAAa,MAAM,CAAC,WAAW,MAAM,MACrD,YAAY,MAAM;AAEtB,YAAM,KAAK;AAAA,QACT,MAAAA;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ,KAAK,MAAM,UAAU;AAAA,QACrC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA;AAAA;AAAA,QAIA,UAAU,QAAQ,KAAK,OAAO,QAAQ,SAAS;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AEnRA,0BAAwB;AAkBjB,SAAS,SAAS,MAAmC;AAC1D,MAAI,KAAK,YAAY,kBAAkB,KAAK,YAAY,YAAY;AAClE,WAAO,EAAE,GAAG,MAAM,SAAS,YAAY;AAAA,EACzC;AACA,MAAI,KAAK,YAAY,YAAY;AAC/B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,MACT,eACE,IAAI,KAAK,SAAS;AAAA,IAGtB;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,IACT,eACE,IAAI,KAAK,SAAS;AAAA,EAEtB;AACF;AAkBO,SAAS,YAAY,QAAgB,OAAmC;AAC7E,QAAM,UAAU,MAAM,IAAI,QAAQ;AAClC,QAAM,UAAU,QAAQ,OAAO,CAAC,SAAS,KAAK,YAAY,WAAW;AACrE,QAAM,UAAU,QAAQ,OAAO,CAAC,SAAS,KAAK,YAAY,WAAW;AAErE,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,MAAM,MAAM,CAAC,GAAG,QAAQ,IAAI,SAAS,QAAQ,SAAS,QAAQ;AAAA,EACzE;AAEA,QAAM,QAAQ,IAAI,oBAAAC,QAAY,MAAM;AACpC,aAAW,QAAQ,SAAS;AAC1B,UAAM,WAAW,KAAK,UAAU,KAAK,UAAU;AAAA,EACjD;AAEA,SAAO,EAAE,MAAM,QAAQ,CAAC,EAAG,MAAM,SAAS,MAAM,SAAS,GAAG,SAAS,QAAQ;AAC/E;;;ACpEA,IAAAC,kBAA6B;AAE7B,IAAAC,uBAAwB;AACxB,IAAAC,oBAAsB;AACtB,IAAAC,MAAmB;AAKnB,IAAMC,aAAY,kBAAAC,QAAwD,WAAW,kBAAAA;AAoBrF,SAAS,cAAc,KAAa,MAA8D;AAChG,MAAI;AAEJ,EAAAD,WAAS,KAAc;AAAA,IACrB,oBAAoB,UAA2C;AAC7D,UAAI,SAAS,KAAK,IAAI,SAAS,MAAM;AACnC,kBAAU,EAAE,QAAQ,SAAS,KAAK,QAAQ,MAAM,SAAS,KAAK,KAAK;AAAA,MACrE;AAAA,IACF;AAAA,IACA,mBAAmB,UAA0C;AAC3D,UAAI,CAAG,iBAAa,SAAS,KAAK,EAAE,KAAK,SAAS,KAAK,GAAG,SAAS,KAAM;AACzE,YAAM,OAAO,SAAS,KAAK;AAC3B,UAAM,8BAA0B,IAAI,KAAO,yBAAqB,IAAI,GAAG;AACrE,kBAAU,EAAE,QAAQ,KAAK,QAAQ,MAAM,KAAK,KAAK;AAAA,MACnD;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAGA,SAAS,kBAAkB,MAAiD;AAC1E,QAAM,QAA+B,CAAC;AACtC,MAAI,cAAc;AAElB,QAAM,SAAS,CAAC,SAA0C;AACxD,QAAI,CAAC,KAAM;AACX,QAAM,8BAA0B,IAAI,EAAG,QAAO,OAAO,KAAK,UAAU;AACpE,QAAM,iBAAa,IAAI,GAAG;AACxB,YAAM,KAAK,KAAK,cAAc;AAC9B;AAAA,IACF;AACA,QAAM,4BAAwB,IAAI,GAAG;AACnC,aAAO,KAAK,UAAU;AACtB,aAAO,KAAK,SAAS;AACrB;AAAA,IACF;AACA,QAAM,kBAAc,IAAI,GAAG;AAEzB,oBAAc;AACd;AAAA,IACF;AACA,QAAM,kBAAc,IAAI,EAAG;AAC3B,kBAAc;AAAA,EAChB;AAEA,MAAM,qBAAiB,IAAI,GAAG;AAC5B,IAAAA;AAAA,MACI,SAAO,YAAQ,CAAG,wBAAsB,uBAAmB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAAA,MAC/E;AAAA,QACE,gBAAgB,UAAuC;AACrD,iBAAO,SAAS,KAAK,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AAEL,WAAO,IAAI;AAAA,EACb;AAEA,MAAI,eAAe,MAAM,WAAW,EAAG,QAAO;AAC9C,SAAO;AACT;AAEA,SAAS,cACP,SACA,SACS;AACT,MAAI,CAAG,oBAAgB,QAAQ,IAAI,EAAG,QAAO;AAC7C,QAAM,OAAO,QAAQ,KAAK;AAC1B,QAAM,SAAS,QAAQ,IAAI,IAAI;AAC/B,MAAI,QAAQ,WAAW,eAAgB,QAAO;AAC9C,SAAO,mBAAmB,IAAI,OAAO,QAAQ;AAC/C;AAEA,SAAS,QAAQ,SAA8B,MAAuB;AACpE,SAAO,QAAQ,WAAW;AAAA,IACxB,CAAC,SAAW,mBAAe,IAAI,KAAO,oBAAgB,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS;AAAA,EACzF;AACF;AAGA,SAAS,SAAS,QAAgB,QAAwB;AACxD,QAAM,YAAY,OAAO,YAAY,MAAM,SAAS,CAAC,IAAI;AACzD,QAAM,QAAQ,UAAU,KAAK,OAAO,MAAM,WAAW,MAAM,CAAC;AAC5D,SAAO,QAAQ,CAAC,KAAK;AACvB;AAWA,SAAS,sBACP,QACA,SACA,MACA,cACA,WAC8B;AAC9B,QAAM,OAAO,QAAQ,QAAQ,SAAS,CAAC;AACvC,MAAI,CAAC,QAAQ,OAAO,KAAK,QAAQ,YAAY,OAAO,KAAK,UAAU,UAAU;AAC3E,WAAO,EAAE,IAAI,cAAc,KAAK;AAAA,EAClC;AAUA,QAAM,WAAW,WAAW,KAAK,OAAO,MAAM,KAAK,KAAK,YAAY,CAAC;AACrE,QAAM,KAAK,KAAK,OAAO,WAAW,CAAC,EAAE,UAAU;AAC/C,QAAM,oBAAoB,OAAO,MAAM,GAAG,KAAK,GAAG,EAAE,QAAQ,EAAE,SAAS,SAAS;AAChF,QAAM,OAAO,YAAY,oBAAoB,KAAK;AAElD,QAAM,WAAW,OAAO,YAAY,MAAM,KAAK,KAAK;AACpD,QAAM,YAAY,aAAa,MAAM,WAAW,OAAO,YAAY,KAAK,KAAK,KAAK;AAClF,MAAI,CAAC,UAAW,QAAO,EAAE,IAAI,MAAM,GAAG,IAAI,IAAI,IAAI,GAAG;AAErD,QAAM,SAAS,SAAS,QAAQ,KAAK,KAAK;AAC1C,SAAO,EAAE,IAAI,MAAM,GAAG,IAAI;AAAA,EAAK,MAAM,GAAG,IAAI,GAAG;AACjD;AAQA,SAAS,aAAaE,OAAc,KAAa,WAAuC;AACtF,MAAI;AACJ,EAAAF,WAAS,KAAc;AAAA,IACrB,uBAAuB,UAA8C;AACnE,YAAM,OAAO,SAAS,KAAK,QAAQ;AACnC,UAAI,CAAC,KAAM;AACX,YAAM,QAAQ,SAAS,KAAK,WAAW;AAAA,QACrC,CAAC,SACG,sBAAkB,IAAI,MACrB,iBAAa,KAAK,QAAQ,IAAI,KAAK,SAAS,OAAO,KAAK,SAAS,WAAW;AAAA,MACnF;AACA,UAAI,MAAO,YAAW;AAAA,IACxB;AAAA,EACF,CAAC;AACD,SAAO,SAAS,sBAAsBE,OAAM,MAAM,IAAI;AACxD;AAEO,SAAS,YAAYA,OAAc,WAAmB,QAAQ,GAAgB;AACnF,QAAM,OAAoB,EAAE,MAAAA,OAAM,WAAW,OAAO,CAAC,GAAG,OAAO,EAAE;AACjE,MAAI;AACJ,MAAI;AACF,iBAAS,8BAAaA,OAAM,OAAO;AAAA,EACrC,QAAQ;AACN,WAAO,EAAE,GAAG,MAAM,SAAS,eAAeA,KAAI,GAAG;AAAA,EACnD;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,YAAY,MAAM;AAAA,EAC1B,QAAQ;AACN,WAAO,EAAE,GAAG,MAAM,SAAS,gBAAgBA,KAAI,GAAG;AAAA,EACpD;AAEA,QAAM,QAAQ,cAAc,KAAK,SAAS;AAC1C,MAAI,CAAC,OAAO;AACV,UAAM,SAAS,QAAQ,IAAI,aAAaA,OAAM,KAAK,SAAS,IAAI;AAChE,QAAI,OAAQ,QAAO,YAAY,QAAQ,WAAW,QAAQ,CAAC;AAC3D,WAAO,EAAE,GAAG,MAAM,SAAS,qBAAqB,SAAS,gBAAgB;AAAA,EAC3E;AAEA,QAAM,QAAQ,MAAM,OAAO,CAAC;AAC5B,MAAI,CAAG,oBAAgB,KAAK,GAAG;AAC7B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SACE,GAAG,SAAS;AAAA,IAEhB;AAAA,EACF;AAEA,QAAM,QAAQ,kBAAkB,MAAM,IAAI;AAC1C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,GAAG,SAAS;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,UAAU,eAAe,GAAG;AAClC,QAAM,aAAa,MAAM,KAAK,CAAC,SAAS,CAAC,cAAc,MAAM,OAAO,CAAC;AACrE,MAAI,YAAY;AACd,UAAM,OAAS,oBAAgB,WAAW,IAAI,IAAI,WAAW,KAAK,OAAO;AACzE,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SACE,GAAG,SAAS,aAAa,IAAI;AAAA,IAEjC;AAAA,EACF;AAEA,QAAM,QAAuB,CAAC;AAG9B,QAAM,sBAAsB,MAAM,WAAW;AAAA,IAC3C,CAAC,SAAW,qBAAiB,IAAI,KAAO,iBAAa,KAAK,GAAG,KAAK,KAAK,IAAI,SAAS;AAAA,EACtF;AACA,MAAI,CAAC,qBAAqB;AACxB,UAAM,SAAS,sBAAsB,QAAQ,MAAM,YAAY,UAAU,MAAM,OAAO,GAAG,GAAG;AAC5F,UAAM,KAAK,EAAE,GAAG,QAAQ,MAAM,YAAY,CAAC;AAAA,EAC7C;AAGA,QAAM,aAAa,MAAM;AACzB,MAAM,uBAAmB,UAAU,GAAG;AACpC,UAAM,WAAW,WAAW;AAC5B,QAAI;AACJ,QAAI,UAAU;AAEd,QAAM,oBAAgB,QAAQ,GAAG;AAC/B,aAAO,SAAS;AAChB,gBAAU,SAAS,OAAO;AAAA,IAC5B,WAAa,sBAAkB,QAAQ,KAAO,iBAAa,SAAS,QAAQ,GAAG;AAC7E,YAAM,WAAW,SAAS,SAAS;AACnC,MAAAF,WAAS,KAAc;AAAA,QACrB,uBAAuB,UAA8C;AACnE,cAAI,SAAS,KAAK,GAAG,SAAS,SAAU;AACxC,iBAAO,SAAS,KAAK,KAAK;AAC1B,oBAAU,SAAS,KAAK,KAAK,OAAO;AAAA,QACtC;AAAA,QACA,uBAAuB,UAA8C;AACnE,cACE,SAAS,KAAK,GAAG,SAAS,YAC1B,CAAG,oBAAgB,SAAS,KAAK,cAAc;AAE/C;AACF,iBAAO,SAAS,KAAK,eAAe;AACpC,oBAAU,SAAS,KAAK,eAAe,OAAO;AAAA,QAChD;AAAA,MACF,CAAC;AAED,UAAI,CAAC,MAAM;AACT,eAAO;AAAA,UACL,GAAG;AAAA,UACH,SACE,GAAG,SAAS,mBAAmB,QAAQ;AAAA,QAE3C;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM;AACR,YAAM,iBAAiB,KAAK;AAAA,QAC1B,CAAC,WACG,0BAAsB,MAAM,KAC5B,iBAAa,OAAO,GAAG,KACzB,OAAO,IAAI,SAAS;AAAA,MACxB;AACA,UAAI,CAAC,gBAAgB;AACnB,cAAM,SAAS,sBAAsB,QAAQ,MAAM,oBAAoB,SAAS,GAAG;AACnF,cAAM,KAAK,EAAE,GAAG,QAAQ,MAAM,aAAa,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY;AAChB,aAAW,QAAQ,OAAO;AACxB,QAAI,QAAQ,MAAM,QAAQ,EAAG;AAC7B,UAAM,KAAK;AAAA,MACT,IAAI,KAAK,KAAK,OAAO,KAAK,SAAS;AAAA,MACnC,MAAM;AAAA,MACN,MAAM;AAAA,IACR,CAAC;AACD,iBAAa;AAAA,EACf;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,EAAE,GAAG,MAAM,SAAS,GAAG,SAAS,2BAA2B;AAAA,EACpE;AAEA,SAAO,EAAE,MAAAE,OAAM,WAAW,OAAO,OAAO,UAAU;AACpD;AAEO,SAAS,aAAa,QAAgB,MAA2B;AACtE,MAAI,KAAK,WAAW,KAAK,MAAM,WAAW,EAAG,QAAO;AACpD,QAAM,QAAQ,IAAI,qBAAAC,QAAY,MAAM;AACpC,aAAW,QAAQ,KAAK,MAAO,OAAM,WAAW,KAAK,IAAI,KAAK,IAAI;AAClE,SAAO,MAAM,SAAS;AACxB;;;AJlSA,IAAM,kBAAkB,CAAC,4BAA4B,+BAA+B;AACpF,IAAM,kBAAkB,CAAC,sBAAsB,cAAc,eAAe,iBAAiB;AAEtF,SAAS,kBAA2B;AACzC,SAAO,IAAI,0BAAQ,UAAU,EAC1B;AAAA,IACC;AAAA,EACF,EACC,OAAO,WAAW,oDAAoD,KAAK,EAC3E;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,4BAA4B,yBAAyB,MAAS,EACrE,OAAO,UAAU,kCAAkC,KAAK,EACxD,OAAO,WAAW,4BAA4B,KAAK,EACnD,OAAO,OAAO,YAA6B;AAC1C,QAAI;AACF,UAAI,QAAQ,KAAM,YAAW,MAAM;AAAA,eAC1B,QAAQ,MAAO,YAAW,OAAO;AAC1C,aAAO;AAEP,UAAI,SAAwC;AAC5C,UAAI;AACF,iBAAS,WAAW,IAAI;AAAA,MAC1B,QAAQ;AACN,iBAAS;AAAA,MACX;AAEA,YAAM,UAAU,QAAQ,IAAI;AAI5B,YAAM,UAAU,QAAQ,WAAW;AACnC,YAAM,UAAU,QAAQ,WAAW;AAEnC,YAAM,UAAU,cAAc,wCAAwC;AACtE,cAAQ,MAAM;AAEd,2BAAqB;AACrB,YAAM,QAAQ,UAAM,kBAAAC,SAAK,SAAS,EAAE,KAAK,SAAS,QAAQ,SAAS,UAAU,KAAK,CAAC;AAEnF,YAAM,OAAO,YAAiC;AAC5C,cAAM,MAAkB,CAAC;AACzB,mBAAWC,SAAQ,OAAO;AACxB,gBAAM,SAAS,UAAM,2BAASA,OAAM,OAAO;AAC3C,gBAAM,QAAQ,oBAAoB,QAAQA,KAAI;AAC9C,cAAI,MAAM,WAAW,EAAG;AACxB,cAAI,KAAK,YAAY,QAAQ,KAAK,CAAC;AAAA,QACrC;AACA,eAAO;AAAA,MACT;AAEA,UAAI,QAAQ,MAAM,KAAK;AACvB,UAAI,WAA0B,CAAC;AAE/B,UAAI,QAAQ,SAAS;AACnB,mBAAW,MAAM,aAAa,OAAO,OAAO;AAC5C,cAAM,UAAU,SAAS,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO;AACvD,YAAI,QAAQ,SAAS,QAAQ,SAAS,GAAG;AACvC,qBAAW,QAAQ,SAAS;AAC1B,kBAAM,SAAS,UAAM,2BAAS,KAAK,MAAM,OAAO;AAChD,sBAAM,4BAAU,KAAK,MAAM,aAAa,QAAQ,IAAI,GAAG,OAAO;AAAA,UAChE;AAIA,+BAAqB;AACrB,kBAAQ,MAAM,KAAK;AAAA,QACrB;AAAA,MACF;AAEA,cAAQ,KAAK;AAEb,YAAM,UAAU,MAAM,QAAQ,CAAC,SAAS,KAAK,OAAO;AACpD,YAAM,UAAU,MAAM,QAAQ,CAAC,SAAS,KAAK,OAAO;AACpD,YAAM,UAAU,MAAM,OAAO,CAAC,SAAS,KAAK,QAAQ,SAAS,CAAC;AAE9D,UAAI,QAAQ,WAAW,KAAK,QAAQ,WAAW,GAAG;AAChD,gBAAQ,mEAAmE;AAC3E,YAAI,QAAQ,MAAM;AAChB,qBAAW,EAAE,IAAI,MAAM,SAAS,MAAM,QAAQ,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,QACrF;AACA;AAAA,MACF;AAEA,UAAI,QAAQ,OAAO;AACjB,mBAAW,QAAQ,SAAS;AAC1B,oBAAM,4BAAU,KAAK,MAAM,KAAK,SAAS,OAAO;AAAA,QAClD;AAAA,MACF;AAEA,kBAAY,SAAS,SAAS,SAAS,QAAQ,UAAU,MAAM,QAAQ;AAEvE,UAAI,QAAQ,MAAM;AAChB,mBAAW;AAAA,UACT,IAAI;AAAA,UACJ,SAAS,MAAM;AAAA,UACf,SAAS,QAAQ,UAAU;AAAA,UAC3B,WAAW,QAAQ;AAAA,UACnB,SAAS,QAAQ;AAAA,UACjB,OAAO,QAAQ,IAAI,CAAC,SAAS,kBAAAC,QAAK,SAAS,SAAS,KAAK,IAAI,CAAC;AAAA,UAC9D,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,EAAE,IAAI,CAAC,UAAU;AAAA,YAC7C,MAAM,kBAAAA,QAAK,SAAS,SAAS,KAAK,IAAI;AAAA,YACtC,MAAM,KAAK;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,MAAM,KAAK;AAAA,YACX,QAAQ,KAAK;AAAA,YACb,SAAS,KAAK;AAAA,YACd,QAAQ,KAAK;AAAA,UACf,EAAE;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,oBAAoB,iBAAiB,GAAG,CAAC,EAAE;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAOA,eAAe,aAAa,OAAmB,SAAyC;AACtF,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,QAAuB,CAAC;AAE9B,aAAW,QAAQ,OAAO;AACxB,eAAW,QAAQ,KAAK,SAAS;AAC/B,UAAI,KAAK,YAAY,mBAAoB;AACzC,UAAI,KAAK,IAAI,KAAK,SAAS,EAAG;AAC9B,WAAK,IAAI,KAAK,SAAS;AAEvB,YAAM,SAAS,UAAM,2BAAS,KAAK,MAAM,OAAO;AAChD,YAAM,SAAS,iBAAiB,QAAQ,KAAK,SAAS;AAEtD,YAAM,SAAS,SAAS,sBAAsB,KAAK,MAAM,MAAM,IAAI,KAAK;AACxE,UAAI,CAAC,QAAQ;AACX,cAAM,KAAK;AAAA,UACT,MAAM,KAAK;AAAA,UACX,WAAW,KAAK;AAAA,UAChB,OAAO,CAAC;AAAA,UACR,OAAO;AAAA,UACP,SAAS,gCAAgC,KAAK,SAAS;AAAA,QACzD,CAAC;AACD;AAAA,MACF;AACA,YAAM,KAAK,YAAY,QAAQ,KAAK,SAAS,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,OAAK;AACL,SAAO;AACT;AAGA,SAAS,iBAAiB,QAAgB,MAAkC;AAC1E,QAAM,UAAU,IAAI;AAAA,IAClB,OAAO,wBAAwB,IAAI;AAAA,EACrC;AACA,SAAO,QAAQ,KAAK,MAAM,IAAI,CAAC;AACjC;AAEA,SAAS,YACP,SACA,SACA,SACA,UACA,UACM;AACN,QAAM,UAAU,QAAQ,QAAQ,CAAC,SAAS,KAAK,OAAO;AAEtD,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,WAAW,UAAU,WAAW;AACxC,eAAW,QAAQ,SAAS;AAC1B,WAAK,kBAAAA,QAAK,SAAS,SAAS,KAAK,IAAI,CAAC;AACtC,iBAAW,QAAQ,KAAK,SAAS;AAC/B,YAAI,KAAK,OAAO,KAAK,IAAI,EAAE,SAAS,CAAC,CAAC,MAAM,KAAK,SAAS,cAAc,KAAK,MAAM,GAAG;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,IAAI;AAAA,IACpB,SAAS,OAAO,CAAC,SAAS,CAAC,KAAK,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,WAAW,IAAI,CAAC;AAAA,EAC/E;AAEA,MAAI,UAAU,OAAO,GAAG;AACtB,YAAQ,WAAW,2BAA2B,6BAA6B;AAC3E,eAAW,QAAQ,UAAU,OAAO,GAAG;AACrC,WAAK,IAAI,KAAK,SAAS,MAAM,kBAAAA,QAAK,SAAS,SAAS,KAAK,IAAI,CAAC,EAAE;AAChE,iBAAW,QAAQ,KAAK,OAAO;AAC7B,YAAI,SAAS,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK,CAAC,EAAE;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AAGtB,YAAQ,0DAAqD;AAC7D,UAAM,cAAc,oBAAI,IAA2B;AACnD,eAAW,QAAQ,SAAS;AAC1B,YAAM,QAAQ,YAAY,IAAI,KAAK,SAAS,KAAK,CAAC;AAClD,YAAM,KAAK,IAAI;AACf,kBAAY,IAAI,KAAK,WAAW,KAAK;AAAA,IACvC;AACA,eAAW,CAAC,WAAW,KAAK,KAAK,aAAa;AAC5C,UAAI,UAAU,IAAI,SAAS,EAAG;AAC9B,WAAK,IAAI,SAAS,YAAO,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,KAAK,GAAG,EAAE;AAC5E,YAAM,UAAU,SAAS,KAAK,CAAC,SAAS,KAAK,cAAc,SAAS,GAAG;AACvE,UAAI,KAAK,MAAM,CAAC,EAAG,aAAa,EAAE;AAClC,UAAI,QAAS,KAAI,oCAAoC,OAAO,EAAE;AAAA,IAChE;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,QAAQ,SAAS,GAAG;AACnC,SAAK,EAAE;AACP,SAAK,qDAAqD,QAAQ,MAAM,aAAa;AAAA,EACvF,WAAW,UAAU;AACnB,YAAQ,SAAS,QAAQ,MAAM,qBAAqB,QAAQ,MAAM,WAAW;AAC7E,SAAK,2DAA2D;AAAA,EAClE;AACF;;;AKvRA,IAAAC,oBAAwB;AA2BjB,SAAS,gBAAyB;AACvC,SAAO,IAAI,0BAAQ,QAAQ,EACxB,YAAY,8CAA8C,EAC1D,OAAO,UAAU,2DAA2D,KAAK,EACjF,OAAO,WAAW,4CAA4C,KAAK,EACnE,OAAO,OAAO,YAA2B;AACxC,QAAI,QAAQ,KAAM,YAAW,MAAM;AAAA,aAC1B,QAAQ,MAAO,YAAW,OAAO;AAC1C,QAAI;AACF,aAAO;AAGP,YAAM,SAAS,WAAW,IAAI;AAC9B,UAAI,CAAC,QAAQ;AACX,cAAM,oCAAoC;AAC1C,aAAK,yCAAyC;AAC9C,mBAAW,EAAE,SAAS,OAAO,OAAO,qCAAqC,CAAC;AAC1E,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AAGA,YAAM,YAAY,IAAI,kBAAkB;AAAA,QACtC,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAGD,YAAM,SAAS,MAAM,UAAU,OAAO;AAEtC,UAAI,OAAO,OAAO;AAChB,cAAM,2BAA2B,OAAO,KAAK,EAAE;AAC/C,mBAAW,EAAE,SAAS,OAAO,OAAO,OAAO,MAAM,CAAC;AAClD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,cAAQ,kCAA2B;AACnC,YAAM;AAAA,QACJ,CAAC,cAAc,OAAO,SAAS;AAAA,QAC/B,CAAC,cAAc,OAAO,aAAa,yBAAyB;AAAA,QAC5D,CAAC,oBAAoB,OAAO,aAAa,WAAW;AAAA,QACpD,CAAC,iBAAiB,OAAO,OAAO,gBAAgB,IAAI,CAAC;AAAA,MACvD,CAAC;AAGD,UAAI,OAAO,SAAS;AAClB,gBAAQ,2BAAoB;AAC5B,cAAM;AAAA,UACJ,CAAC,QAAQ,OAAO,QAAQ,IAAI;AAAA,UAC5B,CAAC,MAAM,OAAO,QAAQ,EAAE;AAAA,QAC1B,CAAC;AAAA,MACH;AAGA,YAAM,YAAY,OAAO,aAAa;AACtC,UAAI,QAA4B;AAEhC,UAAI,OAAO,WAAW;AACpB,gBAAQ,+BAA0B;AAClC,cAAM;AAAA,UACJ,CAAC,eAAe,OAAO,UAAU,EAAE;AAAA,UACnC,CAAC,WAAW,OAAO,UAAU,OAAO;AAAA,UACpC,CAAC,WAAW,OAAO,OAAO,UAAU,YAAY,CAAC;AAAA,UACjD,CAAC,SAAS,OAAO,OAAO,UAAU,UAAU,CAAC;AAAA,UAC7C,CAAC,WAAW,OAAO,OAAO,UAAU,YAAY,CAAC;AAAA,QACnD,CAAC;AAMD,cAAM,QAAQ,yBAAyB,SAAS;AAChD,YAAI,OAAO;AACT,kBAAQ,kBAAkB,OAAO,OAAO,SAAS;AACjD,cAAI,OAAO;AACT,oBAAQ,EAAE;AACV,8BAAkB,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,wCAA8B;AACtC,aAAK,oBAAoB;AAAA,MAC3B;AAEA,cAAQ,+BAA+B;AACvC,iBAAW;AAAA,QACT,SAAS;AAAA,QACT,OAAO;AAAA,UACL,WAAW,OAAO;AAAA,UAClB,WAAW,OAAO,aAAa;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,SAAS,OAAO,WAAW;AAAA,QAC3B,WAAW,OAAO,aAAa;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,YAAM,wBAAwB,iBAAiB,GAAG,CAAC,EAAE;AACrD,iBAAW,EAAE,SAAS,OAAO,OAAO,iBAAiB,GAAG,EAAE,CAAC;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AClIA,IAAAC,oBAAwB;AACxB,IAAAC,cAAqD;AACrD,IAAAC,eAAqB;;;ACFrB,IAAAC,aAA0C;AAC1C,IAAAC,eAAqB;AAwBrB,SAAS,sBAAsB,KAA6B;AAC1D,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,KAAK,KAAK,GAAG;AAChD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,KAAK,KAAK,GAAG;AAChD,WAAO;AAAA,EACT;AACA,MAAI,CAAC,EAAE,UAAU,OAAO,EAAE,WAAW,UAAU;AAC7C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAOO,SAAS,cAAc,KAAiC;AAC7D,QAAM,YAA8B,CAAC;AACrC,QAAM,SAA8B,CAAC;AAErC,MAAI;AACJ,MAAI;AACF,gBAAQ,wBAAY,GAAG,EACpB,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EACjC,KAAK;AAAA,EACV,QAAQ;AACN,WAAO,EAAE,WAAW,OAAO;AAAA,EAC7B;AAEA,aAAWC,SAAQ,OAAO;AACxB,UAAM,WAAO,mBAAK,KAAKA,KAAI;AAC3B,QAAI;AACJ,QAAI;AACF,YAAM,KAAK,UAAM,yBAAa,MAAM,OAAO,CAAC;AAAA,IAC9C,SAAS,KAAK;AACZ,aAAO,KAAK,EAAE,MAAAA,OAAM,OAAO,iBAAiB,iBAAiB,GAAG,CAAC,GAAG,CAAC;AACrE;AAAA,IACF;AACA,UAAM,aAAa,sBAAsB,GAAG;AAC5C,QAAI,YAAY;AACd,aAAO,KAAK,EAAE,MAAAA,OAAM,OAAO,WAAW,CAAC;AACvC;AAAA,IACF;AACA,cAAU,KAAK,EAAE,MAAAA,OAAM,UAAU,IAAoB,CAAC;AAAA,EACxD;AAEA,SAAO,EAAE,WAAW,OAAO;AAC7B;;;AC/CA,SAAS,eAAe,MAAsB;AAC5C,SAAO,KACJ,UAAU,KAAK,EACf,QAAQ,UAAU,EAAE,EACpB,YAAY;AACjB;AAEA,SAAS,aACP,UACA,QACS;AACT,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,CAAC,OAAQ,QAAO;AAEpB,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,UAAM,MAAM,SAAS,GAAG;AACxB,UAAM,MAAM,OAAO,GAAG;AAItB,QAAI,QAAQ,YAAY,MAAM,QAAQ,GAAG,KAAK,MAAM,QAAQ,GAAG,GAAG;AAChE,iBAAW,YAAY,KAAuC;AAC5D,cAAM,UAAU,SAAS;AACzB,cAAM,UAAW,IAAuC;AAAA,UACtD,CAAC,MAAM,EAAE,YAAY;AAAA,QACvB;AACA,YAAI,CAAC,QAAS,QAAO;AACrB,YAAI,SAAS,UAAU,UAAa,QAAQ,UAAU,SAAS,OAAO;AACpE,iBAAO;AAAA,QACT;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,CAAC,MAAM,QAAQ,GAAG,GAAG;AAClE,UAAI,OAAO,QAAQ,YAAY,QAAQ,KAAM,QAAO;AACpD,UAAI,CAAC,aAAa,KAAgC,GAA8B,GAAG;AACjF,eAAO;AAAA,MACT;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,IAAK,QAAO;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAAS,WAAW,UAA8B,QAAmC;AACnF,MAAI,SAAS,SAAS,OAAO,KAAM,QAAO;AAC1C,SAAO,aAAa,SAAS,SAAS,OAAO,OAAO;AACtD;AAEO,SAAS,aACd,UACA,QAEA,QAAQ,IACK;AACb,MAAI,SAAS,SAAS,SAAS,MAAM,SAAS,GAAG;AAC/C,UAAM,UAAoB,CAAC;AAC3B,eAAW,UAAU,SAAS,OAAO;AACnC,YAAM,MAAM,aAAa,QAAQ,QAAQ,KAAK;AAC9C,UAAI,IAAI,GAAI,QAAO;AACnB,cAAQ,KAAK,IAAI,UAAU,WAAW;AAAA,IACxC;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,mCAA8B,QAAQ,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,QAAK,CAAC;AAAA,IACxF;AAAA,EACF;AAEA,MAAI,SAAS,qBAAqB,SAAS,kBAAkB,SAAS,GAAG;AACvE,UAAM,YAAY,OAAO,KAAK,CAAC,MAAM,SAAS,kBAAmB,SAAS,EAAE,IAAI,CAAC;AACjF,QAAI,WAAW;AACb,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,qCAAqC,UAAU,IAAI;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,uBAAuB,SAAS,oBAAoB,SAAS,GAAG;AAC3E,UAAM,MAAM,eAAe,KAAK;AAChC,UAAM,SAAS,SAAS,oBAAoB;AAAA,MAAK,CAAC,WAChD,IAAI,SAAS,eAAe,MAAM,CAAC;AAAA,IACrC;AACA,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,yBAAyB,MAAM,8BAA8B,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,oBAAoB,SAAS,iBAAiB,SAAS,GAAG;AACrE,UAAM,MAAM,eAAe,KAAK;AAChC,UAAM,MAAM,SAAS,iBAAiB,KAAK,CAAC,WAAW,IAAI,SAAS,eAAe,MAAM,CAAC,CAAC;AAC3F,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,8BAA8B,SAAS,iBAAiB,KAAK,IAAI,CAAC,qBAAqB,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA,MACpH;AAAA,IACF;AAAA,EACF;AAEA,QAAMC,QAAO,SAAS,QAAQ;AAC9B,QAAM,kBAAkB,SAAS,WAAW,CAAC;AAE7C,MAAIA,UAAS,QAAQ;AACnB,QAAI,OAAO,WAAW,EAAG,QAAO,EAAE,IAAI,KAAK;AAC3C,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,sCAAsC,OAAO,MAAM,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,IACtG;AAAA,EACF;AAEA,MAAIA,UAAS,SAAS;AACpB,QAAI,OAAO,WAAW,gBAAgB,QAAQ;AAC5C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,wBAAwB,gBAAgB,MAAM,mBAAmB,OAAO,MAAM;AAAA,MACxF;AAAA,IACF;AACA,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,UAAI,CAAC,WAAW,gBAAgB,CAAC,GAAI,OAAO,CAAC,CAAE,GAAG;AAChD,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ,sBAAsB,CAAC,mCAA8B,gBAAgB,CAAC,EAAG,IAAI,cAAc,OAAO,CAAC,EAAG,IAAI;AAAA,QACpH;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACpB;AAEA,MAAIA,UAAS,SAAS;AACpB,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,IAAI,OAAO,QAAQ,iCAAiC;AAAA,IAC/D;AACA,QAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,WAAW,gBAAgB,CAAC,GAAG,KAAK,GAAG;AACjE,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,+DAA0D,gBAAgB,CAAC,GAAG,IAAI,cAAc,MAAM,IAAI;AAAA,MACpH;AAAA,IACF;AACA,eAAW,OAAO,gBAAgB,MAAM,CAAC,GAAG;AAC1C,UAAI,CAAC,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG;AAC3C,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ,uCAAuC,IAAI,IAAI;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,IAAI,KAAK;AAAA,EACpB;AAGA,aAAW,OAAO,iBAAiB;AACjC,QAAI,CAAC,OAAO,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,CAAC,GAAG;AAC3C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ,qCAAqC,IAAI,IAAI;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,IAAI,KAAK;AACpB;;;ACnMA,IAAAC,aAAmE;AACnE,IAAAC,eAAwB;AAcxB,IAAM,iBAA+B,EAAE,aAAa,MAAM,QAAQ,MAAM,aAAa,CAAC,EAAE;AAIjF,SAAS,aAAaC,QAA4B;AACvD,MAAI,KAAC,uBAAWA,MAAI,EAAG,QAAO,EAAE,GAAG,gBAAgB,aAAa,CAAC,EAAE;AACnE,MAAI;AACF,UAAM,MAAM,KAAK,UAAM,yBAAaA,QAAM,OAAO,CAAC;AAClD,WAAO;AAAA,MACL,aAAa,IAAI,eAAe;AAAA,MAChC,QAAQ,IAAI,UAAU;AAAA,MACtB,aAAa,IAAI,eAAe,CAAC;AAAA,IACnC;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,GAAG,gBAAgB,aAAa,CAAC,EAAE;AAAA,EAC9C;AACF;AAEO,SAAS,aAAaA,QAAc,UAA8B;AACvE,gCAAU,sBAAQA,MAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,gCAAcA,QAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACvE;AASO,SAAS,cACd,UACA,MACc;AACd,QAAM,cAAsD,CAAC;AAC7D,aAAW,KAAK,UAAU;AACxB,gBAAY,EAAE,IAAI,IAAI;AAAA,MACpB,QAAQ,EAAE;AAAA,MACV,aAAa,EAAE;AAAA,MACf,GAAI,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,IAAI,CAAC;AAAA,IAC9D;AAAA,EACF;AACA,SAAO,EAAE,aAAa,KAAK,aAAa,QAAQ,KAAK,UAAU,MAAM,YAAY;AACnF;AAoBO,SAAS,oBACd,UACA,UACA,oBACmB;AACnB,QAAM,cAAiC,CAAC;AAExC,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,SAAS,YAAY,QAAQ,IAAI;AAC/C,QAAI,CAAC,MAAO;AAEZ,QAAI,QAAQ,WAAW,YAAY,MAAM,WAAW,UAAU;AAC5D,kBAAY,KAAK;AAAA,QACf,MAAM,QAAQ;AAAA,QACd,MAAM;AAAA,QACN,QAAQ,QAAQ,iBAAiB;AAAA,MACnC,CAAC;AACD;AAAA,IACF;AAEA,QACE,QAAQ,WAAW,YACnB,MAAM,WAAW,YACjB,MAAM,cAAc,KACpB,QAAQ,cAAc,MAAM,eAAe,IAAI,qBAC/C;AACA,YAAM,MAAM,KAAK,OAAQ,QAAQ,cAAc,MAAM,eAAe,MAAM,cAAe,GAAG;AAC5F,kBAAY,KAAK;AAAA,QACf,MAAM,QAAQ;AAAA,QACd,MAAM;AAAA,QACN,QAAQ,UAAU,MAAM,WAAW,WAAM,QAAQ,WAAW,MAAM,GAAG,iBAAiB,KAAK,MAAM,qBAAqB,GAAG,CAAC;AAAA,MAC5H,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC5GO,IAAM,mBAAmB;AAAA,EAC9B,MAAM;AAAA,EACN,aACE;AAAA,EACF,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,aAAa;AAAA,MACX,OAAO;AAAA,MACP,OAAO,CAAC,qBAAqB;AAAA,MAC7B,QAAQ;AAAA,QACN,EAAE,IAAI,SAAS,OAAO,SAAS,UAAU,KAAK;AAAA,QAC9C,EAAE,IAAI,QAAQ,OAAO,aAAa,UAAU,KAAK;AAAA,MACnD;AAAA,MACA,SAAS,CAAC,EAAE,IAAI,qBAAqB,OAAO,UAAU,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EACA,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,QAAQ,CAAC,EAAE,SAAS,OAAO,GAAG,EAAE,SAAS,QAAQ,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AJLA,IAAM,wBAAwB;AAC9B,IAAM,+BAA+B;AAoBrC,SAAS,UAAU,KAAyB,UAAkB,UAA0B;AACtF,MAAI,QAAQ,OAAW,QAAO;AAC9B,QAAM,IAAI,OAAO,GAAG;AACpB,MAAI,OAAO,MAAM,CAAC,GAAG;AACnB,SAAK,oBAAoB,QAAQ,WAAW,GAAG,kBAAa,QAAQ,EAAE;AACtE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,cAAuB;AACrC,SAAO,IAAI,0BAAQ,MAAM,EACtB;AAAA,IACC;AAAA,EACF,EACC,OAAO,UAAU,2DAA2D,KAAK,EACjF,OAAO,WAAW,uDAAuD,KAAK,EAC9E,OAAO,gBAAgB,sDAAsD,EAC7E,OAAO,qBAAqB,8DAA8D,EAC1F;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,gBAAgB,sEAAsE,EAC7F,OAAO,mBAAmB,+DAA+D,EACzF,OAAO,qBAAqB,4DAA4D,EACxF,OAAO,kBAAkB,qEAAqE,EAC9F,OAAO,UAAU,2DAA2D,KAAK,EACjF,OAAO,WAAW,4CAA4C,KAAK,EACnE,OAAO,OAAO,YAAyB;AACtC,QAAI,QAAQ,KAAM,YAAW,MAAM;AAAA,aAC1B,QAAQ,MAAO,YAAW,OAAO;AAC1C,QAAI;AACF,aAAO;AAEP,YAAM,SAAS,WAAW,IAAI;AAC9B,YAAM,YAAY,QAAQ,aAAa;AACvC,YAAM,eACJ,QAAQ,OAAO,QAAQ,MAAM,oBAAgB,mBAAK,WAAW,WAAW;AAE1E,UAAI,QAAQ,MAAM;AAChB,mCAAU,cAAc,EAAE,WAAW,KAAK,CAAC;AAC3C,cAAM,kBAAc,mBAAK,cAAc,cAAc;AACrD,gBAAI,wBAAW,WAAW,KAAK,CAAC,QAAQ,OAAO;AAC7C,eAAK,GAAG,WAAW,kDAA6C;AAAA,QAClE,OAAO;AACL,yCAAc,aAAa,GAAG,KAAK,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AACpF,kBAAQ,6BAA6B,WAAW,EAAE;AAAA,QACpD;AACA,aAAK,mDAAmD;AACxD,YAAI,6EAA6E;AACjF,YAAI,8EAA8E;AAClF,mBAAW,EAAE,SAAS,MAAM,cAAc,YAAY,CAAC;AACvD;AAAA,MACF;AAEA,YAAM,SAAS,QAAQ,UAAU,QAAQ;AACzC,UAAI,CAAC,QAAQ;AACX,cAAM,oCAAoC;AAC1C,aAAK,yCAAyC;AAC9C,aAAK,4CAA4C;AACjD,mBAAW,EAAE,SAAS,OAAO,OAAO,2CAA2C,CAAC;AAChF,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AACA,YAAM,SAAS;AAAA,QACb,WAAW;AAAA,QACX,GAAG;AAAA,QACH;AAAA,QACA,GAAI,QAAQ,YAAY,EAAE,WAAW,QAAQ,UAAU,IAAI,CAAC;AAAA,QAC5D,GAAI,QAAQ,SAAS,EAAE,WAAW,QAAQ,OAAO,IAAI,CAAC;AAAA,MACxD;AAEA,YAAM,eACJ,QAAQ,YAAY,QAAQ,MAAM,oBAAgB,mBAAK,WAAW,oBAAoB;AACxF,YAAM,cAAc;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ,MAAM,eAAe;AAAA,QAC7B;AAAA,MACF;AACA,YAAM,qBAAqB;AAAA,QACzB,QAAQ;AAAA,QACR,QAAQ,MAAM,sBAAsB;AAAA,QACpC;AAAA,MACF;AAEA,YAAM,kBAAkB,cAAc,YAAY;AAClD,UAAI,gBAAgB,OAAO,SAAS,GAAG;AACrC,mBAAW,iBAAiB,gBAAgB,QAAQ;AAClD,gBAAM,GAAG,cAAc,IAAI,KAAK,cAAc,KAAK,EAAE;AAAA,QACvD;AACA,mBAAW;AAAA,UACT,SAAS;AAAA,UACT,OAAO;AAAA,UACP,SAAS,gBAAgB;AAAA,QAC3B,CAAC;AACD,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AACA,UAAI,gBAAgB,UAAU,WAAW,GAAG;AAC1C,cAAM,yBAAyB,YAAY,EAAE;AAC7C,aAAK,2BAA2B;AAChC,mBAAW,EAAE,SAAS,OAAO,OAAO,yBAAyB,YAAY,GAAG,CAAC;AAC7E,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AAEA,YAAM,aAAa,oBAAI,IAAoB;AAC3C,iBAAW,EAAE,SAAS,KAAK,gBAAgB,WAAW;AACpD,mBAAW,IAAI,SAAS,OAAO,WAAW,IAAI,SAAS,IAAI,KAAK,KAAK,CAAC;AAAA,MACxE;AACA,YAAM,aAAa,CAAC,GAAG,WAAW,QAAQ,CAAC,EACxC,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC,EAC/B,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AACvB,UAAI,WAAW,SAAS,GAAG;AACzB;AAAA,UACE,sFAAiF,WAAW,KAAK,IAAI,CAAC;AAAA,QACxG;AACA,mBAAW;AAAA,UACT,SAAS;AAAA,UACT,OAAO,6BAA6B,WAAW,KAAK,IAAI,CAAC;AAAA,QAC3D,CAAC;AACD,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AAEA,YAAM,YAAY,IAAI,kBAAkB;AAAA,QACtC,WAAW,OAAO;AAAA,QAClB,QAAQ,OAAO;AAAA,MACjB,CAAC;AAED,YAAM,WAAkC,gBAAgB,UAAU,IAAI,CAAC,EAAE,SAAS,OAAO;AAAA,QACvF,IAAI,SAAS;AAAA,QACb,QAAQ,SAAS,OAAO;AAAA,QACxB,aAAa,SAAS,OAAO;AAAA,QAC7B,QAAQ,SAAS;AAAA,QACjB,eAAe,SAAS,iBAAiB,QAAQ;AAAA,MACnD,EAAE;AAEF,YAAM,UAAU,cAAc,WAAW,SAAS,MAAM,iBAAiB;AACzE,cAAQ,MAAM;AACd,YAAM,YAAY,MAAM,UAAU,QAAQ,QAAQ;AAClD,cAAQ,KAAK;AAEb,UAAI,UAAU,OAAO;AACnB,cAAM,oBAAoB,UAAU,KAAK,EAAE;AAC3C,mBAAW,EAAE,SAAS,OAAO,OAAO,UAAU,MAAM,CAAC;AACrD,gBAAQ,KAAK,CAAC;AACd;AAAA,MACF;AAEA,YAAM,cAAc,IAAI,KAAK,UAAU,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAC3E,YAAM,WAAW,gBAAgB,UAAU,IAAI,CAAC,EAAE,SAAS,MAAM;AAC/D,cAAM,SAAS,YAAY,IAAI,SAAS,IAAI;AAC5C,YAAI,CAAC,QAAQ;AACX,iBAAO;AAAA,YACL,MAAM,SAAS;AAAA,YACf,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,eAAe;AAAA,UACjB;AAAA,QACF;AACA,cAAM,QAAQ,aAAa,SAAS,QAAQ,OAAO,SAAS,OAAO,OAAO;AAC1E,eAAO;AAAA,UACL,MAAM,SAAS;AAAA,UACf,QAAS,MAAM,KAAK,WAAW;AAAA,UAC/B,aAAa,OAAO;AAAA,UACpB,eAAe,MAAM,KAAK,SAAY,MAAM;AAAA,QAC9C;AAAA,MACF,CAAC;AAED,YAAM,SAAS,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AAC7D,YAAM,QAAQ,SAAS;AACvB,YAAM,WAAW,QAAQ,IAAI,SAAS,QAAQ;AAE9C,cAAQ,YAAY;AACpB;AAAA,QACE,SAAS,IAAI,CAAC,MAAM;AAAA,UAClB,EAAE,WAAW,WAAW,UAAK,EAAE,IAAI,KAAK,UAAK,EAAE,IAAI;AAAA,UACnD,EAAE,WAAW,WAAW,GAAG,EAAE,WAAW,YAAY,EAAE,iBAAiB;AAAA,QACzE,CAAC;AAAA,MACH;AAEA,YAAM,WAAW,aAAa,YAAY;AAC1C,UAAI,cAAsD,CAAC;AAC3D,UAAI,CAAC,QAAQ,gBAAgB;AAC3B,sBAAc,oBAAoB,UAAU,UAAU,kBAAkB;AACxE,YAAI,YAAY,SAAS,GAAG;AAC1B,kBAAQ,4BAA4B;AACpC,gBAAM,YAAY,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAAA,QAClE;AAAA,MACF;AAEA,YAAM,cAAc,KAAK,MAAM,WAAW,GAAI,IAAI;AAClD,YAAM,iBAAiB,KAAK,MAAM,cAAc,GAAI,IAAI;AACxD,cAAQ;AAAA,aAAgB,MAAM,IAAI,KAAK,KAAK,WAAW,uBAAkB,cAAc,GAAG;AAE1F,UAAI,QAAQ,gBAAgB;AAC1B,YAAI,WAAW,aAAa;AAC1B;AAAA,YACE,0CAA0C,WAAW,kBAAkB,cAAc;AAAA,UACvF;AACA,eAAK,wEAAwE;AAC7E,qBAAW,EAAE,SAAS,OAAO,UAAU,aAAa,OAAO,QAAQ,SAAS,SAAS,CAAC;AACtF,kBAAQ,KAAK,CAAC;AACd;AAAA,QACF;AACA,cAAM,cAAc,cAAc,UAAU;AAAA,UAC1C,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,QAAQ,QAAQ,IAAI,WAAW;AAAA,QACjC,CAAC;AACD,qBAAa,cAAc,WAAW;AACtC,gBAAQ,uBAAuB,YAAY,EAAE;AAC7C,mBAAW,EAAE,SAAS,MAAM,UAAU,aAAa,OAAO,QAAQ,SAAS,SAAS,CAAC;AACrF;AAAA,MACF;AAEA,YAAM,KAAK,YAAY,eAAe,YAAY,WAAW;AAC7D,iBAAW;AAAA,QACT,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAED,UAAI,CAAC,IAAI;AACP,YAAI,WAAW,aAAa;AAC1B,gBAAM,aAAa,WAAW,kBAAkB,cAAc,aAAa;AAAA,QAC7E;AACA,YAAI,YAAY,SAAS,GAAG;AAC1B,gBAAM,GAAG,YAAY,MAAM,4BAA4B;AAAA,QACzD;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB,OAAO;AACL,gBAAQ,aAAa;AAAA,MACvB;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,gBAAgB,iBAAiB,GAAG,CAAC,EAAE;AAC7C,iBAAW,EAAE,SAAS,OAAO,OAAO,iBAAiB,GAAG,EAAE,CAAC;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AvDpSA,eAAe,OAAO;AACpB,QAAMC,WAAU,IAAI,0BAAQ;AAE5B,EAAAA,SACG,KAAK,UAAU,EACf;AAAA,IACC;AAAA,EAKF,EACC,QAAQ,WAAW,EACnB,OAAO,aAAa,wBAAwB;AAG/C,EAAAA,SAAQ,WAAW,YAAY,CAAC;AAChC,EAAAA,SAAQ,WAAW,YAAY,CAAC;AAChC,EAAAA,SAAQ,WAAW,aAAa,CAAC;AACjC,EAAAA,SAAQ,WAAW,gBAAgB,CAAC;AACpC,EAAAA,SAAQ,WAAW,gBAAgB,CAAC;AACpC,EAAAA,SAAQ,WAAW,cAAc,CAAC;AAClC,EAAAA,SAAQ,WAAW,YAAY,CAAC;AAGhC,QAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,QAAM,WAAW,KAAK,CAAC;AACvB,QAAM,aAAa,aAAa,UAAa,KAAK,SAAS,KAAK,CAAC,SAAS,WAAW,GAAG;AAExF,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,SAAS,WAAW;AAC1B,QAAI,QAAQ;AAEV,cAAQ,KAAK,KAAK,MAAM;AAAA,IAC1B,OAAO;AACL,aAAO;AACP,WAAK,wCAAwC;AAC7C,WAAK,yCAAyC;AAC9C,cAAQ,IAAI,EAAE;AACd,MAAAA,SAAQ,WAAW;AACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAMA,SAAQ,WAAW,QAAQ,IAAI;AACvC;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,QAAM,iBAAiB,GAAG,CAAC;AAC3B,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["import_commander","import_fs","error","ora","chalk","DEFAULT_TIMEOUT_MS","error","message","import_fs","import_path","import_commander","import_promises","import_node_path","import_promises","import_node_path","import_fast_glob","import_path","import_traverse","t","traverse","import_traverse","t","traverse","import_traverse","t","traverse","glob","path","file","error","fs","traverse","handler","info","DESTRUCTIVE_VERB","basename","import_fs","import_path","import_fast_glob","import_traverse","t","fs","error","glob","file","path","traverse","import_fs","parser","import_traverse","t","traverse","path","error","import_fs","parser","import_traverse","t","path","traverse","error","info","glob","file","path","error","import_promises","import_path","import_fast_glob","import_traverse","t","BUTTON_COMPONENTS","INPUT_COMPONENTS","LIST_COMPONENTS","MODAL_COMPONENTS","t","import_traverse","t","path","traverse","DESTRUCTIVE_VERB","glob","file","path","error","fs","traverse","import_fs","import_path","import_fast_glob","import_traverse","t","fs","error","glob","file","path","traverse","resolve","import_promises","import_node_path","util","objectUtil","t","error","path","errorUtil","path","error","errorMap","ctx","result","issues","elements","processed","result","r","ZodFirstPartyTypeKind","z","z","info","z","path","error","path","error","import_node_path","import_commander","import_node_fs","import_commander","import_promises","import_node_path","import_commander","import_fast_glob","import_traverse","t","import_node_path","import_node_fs","import_traverse","t","traverse","_traverse","path","file","traverse","_traverse","file","MagicString","import_node_fs","import_magic_string","import_traverse","t","traverse","_traverse","file","MagicString","glob","file","path","import_commander","import_commander","import_fs","import_path","import_fs","import_path","file","mode","import_fs","import_path","path","program"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/version.ts","../../src/config/index.ts","../../src/cli/utils/logger.ts","../../src/cli/commands/init.ts","../../../shared/src/constants/index.ts","../../src/utils/stringify.ts","../../src/services/api-client.ts","../../src/cli/utils/server-hint.ts","../../src/cli/commands/sync.ts","../../src/generators/MCPGenerator.ts","../../src/pipeline/enrichment.ts","../../src/analyzers/ReactNativePlatformAnalyzer.ts","../../src/analyzers/ScreenAnalyzer.ts","../../src/ast/parse.ts","../../src/ast/jsx/attributes.ts","../../src/ast/jsx/classify.ts","../../src/ast/functions/collect.ts","../../src/ast/functions/analyze-async.ts","../../src/ast/navigation/calls.ts","../../src/extractors/appilots/jsdoc.ts","../../src/analyzers/NavigationAnalyzer.ts","../../src/analyzers/ComponentAnalyzer.ts","../../src/analyzers/FormAnalyzer.ts","../../src/analyzers/GenericPlatformAnalyzer.ts","../../src/analyzers/web/WebScreenAnalyzer.ts","../../src/ast/jsx/web/classify.ts","../../src/ast/jsx/names.ts","../../src/ast/navigation/web-calls.ts","../../src/analyzers/web/WebNavigationAnalyzer.ts","../../src/analyzers/web/ReactWebPlatformAnalyzer.ts","../../src/manifest/loadManifest.ts","../../../../node_modules/zod/v3/external.js","../../../../node_modules/zod/v3/helpers/util.js","../../../../node_modules/zod/v3/ZodError.js","../../../../node_modules/zod/v3/locales/en.js","../../../../node_modules/zod/v3/errors.js","../../../../node_modules/zod/v3/helpers/parseUtil.js","../../../../node_modules/zod/v3/helpers/errorUtil.js","../../../../node_modules/zod/v3/types.js","../../../shared/src/validators/mcp-document.ts","../../../shared/src/validators/index.ts","../../src/pipeline/metadata-lint.ts","../../src/cli/utils/metadata-report.ts","../../src/cli/utils/remote-drift.ts","../../src/cli/utils/upload-failure.ts","../../src/cli/utils/empty-document.ts","../../src/cli/commands/watch.ts","../../src/cli/commands/generate.ts","../../src/cli/commands/annotate.ts","../../src/annotate/sites.ts","../../src/annotate/forwarding.ts","../../src/annotate/apply.ts","../../src/annotate/forward.ts","../../src/cli/commands/status.ts","../../src/cli/commands/eval.ts","../../src/eval/scenario-loader.ts","../../src/eval/matcher.ts","../../src/eval/baseline.ts","../../src/eval/scaffold.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { CLI_VERSION } from '../version';\nimport { loadConfig } from '../config/index';\nimport { banner, error, info } from './utils/logger';\nimport { initCommand } from './commands/init';\nimport { syncCommand } from './commands/sync';\nimport { watchCommand } from './commands/watch';\nimport { generateCommand } from './commands/generate';\nimport { annotateCommand } from './commands/annotate';\nimport { statusCommand } from './commands/status';\nimport { evalCommand } from './commands/eval';\nimport { stringifyUnknown } from '../utils/stringify';\n\nasync function main() {\n const program = new Command();\n\n program\n .name('appilots')\n .description(\n 'Analyze your React Native app and generate MCP documents for AI-powered navigation.\\n\\n' +\n 'Quick start:\\n' +\n ' $ appilots init --api-key ak_xxx\\n' +\n ' $ appilots sync\\n' +\n ' $ appilots watch',\n )\n .version(CLI_VERSION)\n .option('--verbose', 'Enable verbose logging');\n\n // Register all commands\n program.addCommand(initCommand());\n program.addCommand(syncCommand());\n program.addCommand(watchCommand());\n program.addCommand(generateCommand());\n program.addCommand(annotateCommand());\n program.addCommand(statusCommand());\n program.addCommand(evalCommand());\n\n // If no arguments, check for config and default to sync\n const args = process.argv.slice(2);\n const firstArg = args[0];\n const hasCommand = firstArg !== undefined && args.length > 0 && !firstArg.startsWith('-');\n\n if (args.length === 0) {\n const config = loadConfig();\n if (config) {\n // Default to sync when config exists\n process.argv.push('sync');\n } else {\n banner();\n info('Welcome to Appilots! Get started with:');\n info(' appilots init --api-key <your-ak_key>');\n console.log('');\n program.outputHelp();\n return;\n }\n }\n\n await program.parseAsync(process.argv);\n}\n\nmain().catch((err) => {\n error(stringifyUnknown(err));\n process.exit(1);\n});\n","/**\n * GENERATED by scripts/release/sync-sdk-versions.mjs — do not edit.\n *\n * The version `@appilots/cli` prints for `appilots --version` and in its\n * banner. Kept identical to package.json by the release flow;\n * `version.test.ts` fails if the two ever disagree.\n */\nexport const CLI_VERSION = '0.11.0';\n","import { readFileSync, writeFileSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { existsSync, statSync } from 'fs';\n\n/**\n * Where the CLI points when nothing says otherwise — the local `pnpm dev`\n * backend. Exported so commands can tell \"unreachable server\" apart from\n * \"server was never configured\".\n */\nexport const DEFAULT_SERVER_URL = 'http://localhost:4000';\n\n/**\n * Appilots configuration interface\n */\nexport interface AppilotsConfig {\n /** API key for authenticating with Appilots backend */\n apiKey: string;\n /**\n * Project ID on Appilots dashboard. Optional at load time — the API key\n * already identifies the project server-side (env-only CI workflows run\n * without a .appilotsrc), so commands must not assume it is present.\n */\n projectId?: string;\n /** Server URL for Appilots API */\n serverUrl: string;\n /** Output directory for generated files */\n outputDir?: string;\n /** Glob patterns to include in analysis */\n include?: string[];\n /** Glob patterns to exclude from analysis */\n exclude?: string[];\n /** Automatically activate generated MCP on sync */\n autoActivate?: boolean;\n /**\n * Strict screen filtering (§1).\n * When true, only files with registerScreen() calls or matching\n * screenPatterns are included as screens in the MCP document.\n * Default: true (exclude components/hooks/config files from the MCP screen map)\n */\n strictScreens?: boolean;\n /**\n * Glob patterns that identify screen files (used with strictScreens).\n * Default: ['**\\/*Screen.{ts,tsx}', '**\\/screens/**\\/*.{ts,tsx}']\n */\n screenPatterns?: string[];\n /**\n * Additional glob patterns for navigation file discovery (§5).\n * These are ADDED to the default patterns, not replacing them.\n */\n navigationInclude?: string[];\n /**\n * Glob patterns to exclude from navigation analysis (§5).\n */\n navigationExclude?: string[];\n /**\n * Target platform for source analysis (multi-platform prep). Selects\n * which `PlatformAnalyzer` the generator runs and its default globs.\n * `'react-native'` (the default when unset) runs the existing\n * Babel/JSX analyzer pipeline. `'web'` runs the React web analyzer\n * (DOM-vocabulary JSX + React Router route discovery). Any other\n * value (`'android'`, `'ios'`, a custom platform id, ...) runs a\n * no-op analyzer that does no source parsing — screens for that\n * platform come entirely from a declared manifest (see\n * `manifestPath`). Forward-compatible: unknown values degrade\n * gracefully instead of erroring.\n */\n platform?: string;\n /**\n * Path to a declared `appilots.manifest.json`, relative to the\n * project root unless absolute. Screens declared here (in the same\n * `ScreenDescriptor` shape the analyzers produce) merge on top of\n * analyzer-derived screens, winning on a name conflict. Default:\n * `appilots.manifest.json` at the project root. A missing file is not\n * an error — manifest mode is opt-in.\n */\n manifestPath?: string;\n /** `appilots eval` settings — see docs: Testing your agent between releases. */\n eval?: EvalConfig;\n}\n\nexport interface EvalConfig {\n /** Directory of `*.json` scenario files. Default: `<outputDir>/scenarios`. */\n scenariosDir?: string;\n /** Committed baseline file. Default: `<outputDir>/eval-baseline.json`. */\n baselinePath?: string;\n /** Minimum fraction of scenarios that must pass (0-1). Default: 0.95. */\n minPassRate?: number;\n /** Max fractional token increase vs baseline before it's flagged as a\n * regression on an otherwise-passing scenario. Default: 0.25 (+25%). */\n maxTokenRegression?: number;\n}\n\n/**\n * Validation result type\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n /**\n * Non-fatal problems — today, keys the CLI does not understand. A typo\n * here is silently ignored at load time and only surfaces much later as\n * a confusing failure, so it is worth saying out loud.\n */\n warnings: string[];\n}\n\n/**\n * Every key `AppilotsConfig` understands. Anything else in a .appilotsrc\n * is dead weight: it is dropped by the loader and the default is used\n * instead. Keep in sync with `AppilotsConfig` — `config.test.ts` fails if\n * a documented key is missing here.\n */\nexport const KNOWN_CONFIG_KEYS = [\n 'apiKey',\n 'projectId',\n 'serverUrl',\n 'outputDir',\n 'include',\n 'exclude',\n 'autoActivate',\n 'strictScreens',\n 'screenPatterns',\n 'navigationInclude',\n 'navigationExclude',\n 'platform',\n 'manifestPath',\n 'eval',\n] as const;\n\n/**\n * Names people reach for that mean something we do support. The aliases\n * that map to `serverUrl` are honoured by `loadConfig` (with a rename\n * warning) — a file that wrote `server` or `apiUrl` clearly tried to\n * point at a server, and retargeting it to the localhost default turned\n * `appilots sync` into a silent no-op against the real backend (#502).\n * The rest only feed the \"did you mean\" suggestion.\n */\nconst KEY_ALIASES: Record<string, string> = {\n apiUrl: 'serverUrl',\n // `@appilots/sdk`'s own name for this. One `.appilotsrc` feeds both\n // packages, so an integrator who wrote the SDK's key should not be told\n // it is unrecognized.\n apiBaseUrl: 'serverUrl',\n apiURL: 'serverUrl',\n baseUrl: 'serverUrl',\n url: 'serverUrl',\n host: 'serverUrl',\n endpoint: 'serverUrl',\n server: 'serverUrl',\n key: 'apiKey',\n token: 'apiKey',\n project: 'projectId',\n sourceDir: 'include',\n srcDir: 'include',\n source: 'include',\n outDir: 'outputDir',\n};\n\n/** Levenshtein distance, used only for short config-key suggestions. */\nfunction editDistance(a: string, b: string): number {\n let previous = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n const current = [i];\n for (let j = 1; j <= b.length; j++) {\n const deletion = (previous[j] ?? 0) + 1;\n const insertion = (current[j - 1] ?? 0) + 1;\n const substitution = (previous[j - 1] ?? 0) + (a[i - 1] === b[j - 1] ? 0 : 1);\n current.push(Math.min(deletion, insertion, substitution));\n }\n previous = current;\n }\n return previous[b.length] ?? 0;\n}\n\n/**\n * Best guess for what an unrecognized key was meant to be: a known alias\n * first, then the closest known key by edit distance. Returns undefined\n * rather than guessing wildly — a bad suggestion is worse than none.\n */\nexport function suggestConfigKey(key: string): string | undefined {\n const alias = KEY_ALIASES[key];\n if (alias) return alias;\n\n const lower = key.toLowerCase();\n let best: { key: string; distance: number } | undefined;\n for (const known of KNOWN_CONFIG_KEYS) {\n const distance = editDistance(lower, known.toLowerCase());\n if (distance <= 2 && (!best || distance < best.distance)) {\n best = { key: known, distance };\n }\n }\n return best?.key;\n}\n\n/**\n * Environment overrides recognized by the CLI. Precedence when loading:\n * command-line flags (applied by each command) > env vars > .appilotsrc.\n */\nexport interface EnvOverrides {\n apiKey?: string;\n projectId?: string;\n serverUrl?: string;\n}\n\n/**\n * Reads APPILOTS_* environment variables, treating blank values as unset.\n */\nexport function getEnvOverrides(env: NodeJS.ProcessEnv = process.env): EnvOverrides {\n const clean = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim();\n return trimmed ? trimmed : undefined;\n };\n return {\n apiKey: clean(env.APPILOTS_API_KEY),\n projectId: clean(env.APPILOTS_PROJECT_ID),\n serverUrl: clean(env.APPILOTS_SERVER_URL),\n };\n}\n\n/**\n * Loads configuration from the nearest .appilotsrc merged with APPILOTS_*\n * environment variables (env wins). Works without a .appilotsrc when\n * APPILOTS_API_KEY is set, so CI can run `appilots sync` with env vars only.\n *\n * @param onWarn Called once per non-fatal problem (unrecognized keys).\n * Commands pass the logger's `warn`; omitting it keeps loading silent.\n * @returns AppilotsConfig if a file or APPILOTS_API_KEY exists, null otherwise\n * @throws when the file is unparseable or the merged config fails validation\n */\nexport function loadConfig(onWarn?: (message: string) => void): AppilotsConfig | null {\n const configPath = getConfigPath();\n const env = getEnvOverrides();\n\n let fileConfig: Record<string, unknown> = {};\n if (configPath) {\n try {\n fileConfig = JSON.parse(readFileSync(configPath, 'utf-8'));\n } catch (error) {\n throw new Error(\n `Failed to parse .appilotsrc at ${configPath}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n } else if (!env.apiKey) {\n return null;\n }\n\n // A file that says `server`/`apiUrl`/`baseUrl`... tried to point at a\n // server; honouring the explicit `serverUrl` alias beats falling back to\n // the localhost default, which uploads to the wrong backend (#502).\n const legacyWarnings: string[] = [];\n if (fileConfig.serverUrl === undefined) {\n for (const [alias, canonical] of Object.entries(KEY_ALIASES)) {\n if (canonical !== 'serverUrl' || fileConfig[alias] === undefined) continue;\n fileConfig.serverUrl = fileConfig[alias];\n delete fileConfig[alias];\n legacyWarnings.push(\n `legacy key \"${alias}\" — using it as \"serverUrl\"; rename it in .appilotsrc`,\n );\n break;\n }\n }\n\n const merged = {\n serverUrl: DEFAULT_SERVER_URL,\n outputDir: '.appilots',\n autoActivate: true,\n strictScreens: true,\n ...fileConfig,\n ...(env.apiKey ? { apiKey: env.apiKey } : {}),\n ...(env.projectId ? { projectId: env.projectId } : {}),\n ...(env.serverUrl ? { serverUrl: env.serverUrl } : {}),\n } as AppilotsConfig;\n\n const validation = validateConfig(merged);\n validation.warnings.unshift(...legacyWarnings);\n\n // With no server configured anywhere, a leftover key that still *looks*\n // like `serverUrl` (a typo the alias table doesn't list) is the same\n // wrong-backend trap — refuse to run rather than warn and hit localhost.\n if (fileConfig.serverUrl === undefined && env.serverUrl === undefined) {\n for (const key of Object.keys(fileConfig)) {\n if ((KNOWN_CONFIG_KEYS as readonly string[]).includes(key)) continue;\n if (suggestConfigKey(key) !== 'serverUrl') continue;\n validation.warnings = validation.warnings.filter(\n (warning) => !warning.startsWith(`unknown key \"${key}\"`),\n );\n validation.errors.push(\n `unknown key \"${key}\" looks like \"serverUrl\" — not falling back to ${DEFAULT_SERVER_URL}; rename the key to \"serverUrl\"`,\n );\n validation.valid = false;\n }\n }\n if (onWarn) {\n const source = configPath ?? 'environment variables';\n for (const warning of validation.warnings) {\n onWarn(`${source}: ${warning}`);\n }\n }\n if (!validation.valid) {\n const source = configPath ?? 'environment variables';\n throw new Error(\n `Invalid Appilots configuration (${source}):\\n` +\n validation.errors.map((e) => ` - ${e}`).join('\\n') +\n '\\nFix .appilotsrc or set APPILOTS_API_KEY / APPILOTS_SERVER_URL.',\n );\n }\n\n return merged;\n}\n\n/**\n * Saves configuration to .appilotsrc in the given directory\n *\n * @param dir Directory to write .appilotsrc to\n * @param config Partial config to merge with defaults\n */\nexport function saveConfig(dir: string, config: Partial<AppilotsConfig>): void {\n const configPath = join(dir, '.appilotsrc');\n const existingConfig = getConfigPath() ? loadConfig() : null;\n\n const mergedConfig: AppilotsConfig = {\n apiKey: config.apiKey || existingConfig?.apiKey || '',\n projectId: config.projectId || existingConfig?.projectId || '',\n serverUrl: config.serverUrl || existingConfig?.serverUrl || DEFAULT_SERVER_URL,\n outputDir: config.outputDir || existingConfig?.outputDir || '.appilots',\n autoActivate:\n config.autoActivate !== undefined\n ? config.autoActivate\n : (existingConfig?.autoActivate ?? true),\n include: config.include || existingConfig?.include,\n exclude: config.exclude || existingConfig?.exclude,\n strictScreens: config.strictScreens ?? existingConfig?.strictScreens ?? true,\n screenPatterns: config.screenPatterns || existingConfig?.screenPatterns,\n navigationInclude: config.navigationInclude || existingConfig?.navigationInclude,\n navigationExclude: config.navigationExclude || existingConfig?.navigationExclude,\n platform: config.platform || existingConfig?.platform,\n manifestPath: config.manifestPath || existingConfig?.manifestPath,\n eval: config.eval || existingConfig?.eval,\n };\n\n try {\n writeFileSync(configPath, JSON.stringify(mergedConfig, null, 2), 'utf-8');\n } catch (error) {\n throw new Error(\n `Failed to write .appilotsrc to ${configPath}: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n}\n\n/**\n * Finds and returns the path to the nearest .appilotsrc file by walking up\n * the directory tree from cwd. Follows the same logic as .npmrc lookup.\n *\n * @returns Path to .appilotsrc if found, null otherwise\n */\nexport function getConfigPath(): string | null {\n let currentDir = resolve(process.cwd());\n const root = resolve('/');\n\n while (currentDir !== root) {\n const configPath = join(currentDir, '.appilotsrc');\n try {\n if (existsSync(configPath) && statSync(configPath).isFile()) {\n return configPath;\n }\n } catch {\n // Continue searching if we can't access the file\n }\n currentDir = resolve(currentDir, '..');\n }\n\n // Check root level as last resort\n const rootConfigPath = join(root, '.appilotsrc');\n try {\n if (existsSync(rootConfigPath) && statSync(rootConfigPath).isFile()) {\n return rootConfigPath;\n }\n } catch {\n // Ignore\n }\n\n return null;\n}\n\n/**\n * Validates an Appilots configuration object for required fields and types\n *\n * @param config Configuration object to validate\n * @returns ValidationResult with valid flag and array of error messages\n */\nexport function validateConfig(config: any): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!config || typeof config !== 'object') {\n return {\n valid: false,\n errors: ['Configuration must be an object'],\n warnings,\n };\n }\n\n // Unknown keys are dropped by the loader, so a typo turns into the\n // default value being used — never an error. Say it out loud.\n for (const key of Object.keys(config)) {\n if ((KNOWN_CONFIG_KEYS as readonly string[]).includes(key)) continue;\n const suggestion = suggestConfigKey(key);\n warnings.push(\n `unknown key \"${key}\" — ignored` + (suggestion ? ` (did you mean \"${suggestion}\"?)` : ''),\n );\n }\n\n // Check required fields\n if (!config.apiKey || typeof config.apiKey !== 'string') {\n errors.push(\n 'apiKey is required and must be a string (set it in .appilotsrc or via APPILOTS_API_KEY)',\n );\n } else if (!config.apiKey.startsWith('ak_')) {\n errors.push('apiKey must start with \"ak_\"');\n }\n\n // projectId is optional (the API key identifies the project), but when\n // present it must be a non-empty string\n if (\n config.projectId !== undefined &&\n config.projectId !== '' &&\n typeof config.projectId !== 'string'\n ) {\n errors.push('projectId must be a string');\n }\n\n // Check optional fields types\n if (config.serverUrl !== undefined && typeof config.serverUrl !== 'string') {\n errors.push('serverUrl must be a string');\n }\n\n if (config.outputDir !== undefined && typeof config.outputDir !== 'string') {\n errors.push('outputDir must be a string');\n }\n\n if (config.include !== undefined && !Array.isArray(config.include)) {\n errors.push('include must be an array of strings');\n } else if (\n Array.isArray(config.include) &&\n !config.include.every((item: unknown) => typeof item === 'string')\n ) {\n errors.push('include must be an array of strings');\n }\n\n if (config.exclude !== undefined && !Array.isArray(config.exclude)) {\n errors.push('exclude must be an array of strings');\n } else if (\n Array.isArray(config.exclude) &&\n !config.exclude.every((item: unknown) => typeof item === 'string')\n ) {\n errors.push('exclude must be an array of strings');\n }\n\n if (config.autoActivate !== undefined && typeof config.autoActivate !== 'boolean') {\n errors.push('autoActivate must be a boolean');\n }\n\n if (config.strictScreens !== undefined && typeof config.strictScreens !== 'boolean') {\n errors.push('strictScreens must be a boolean');\n }\n\n for (const field of ['screenPatterns', 'navigationInclude', 'navigationExclude'] as const) {\n const value = config[field];\n if (\n value !== undefined &&\n (!Array.isArray(value) || !value.every((item: unknown) => typeof item === 'string'))\n ) {\n errors.push(`${field} must be an array of strings`);\n }\n }\n\n if (config.platform !== undefined && typeof config.platform !== 'string') {\n errors.push('platform must be a string');\n }\n\n if (config.manifestPath !== undefined && typeof config.manifestPath !== 'string') {\n errors.push('manifestPath must be a string');\n }\n\n if (config.eval !== undefined) {\n if (typeof config.eval !== 'object' || config.eval === null || Array.isArray(config.eval)) {\n errors.push('eval must be an object');\n } else {\n const evalConfig = config.eval as Record<string, unknown>;\n if (evalConfig.scenariosDir !== undefined && typeof evalConfig.scenariosDir !== 'string') {\n errors.push('eval.scenariosDir must be a string');\n }\n if (evalConfig.baselinePath !== undefined && typeof evalConfig.baselinePath !== 'string') {\n errors.push('eval.baselinePath must be a string');\n }\n if (\n evalConfig.minPassRate !== undefined &&\n (typeof evalConfig.minPassRate !== 'number' ||\n evalConfig.minPassRate < 0 ||\n evalConfig.minPassRate > 1)\n ) {\n errors.push('eval.minPassRate must be a number between 0 and 1');\n }\n if (\n evalConfig.maxTokenRegression !== undefined &&\n (typeof evalConfig.maxTokenRegression !== 'number' || evalConfig.maxTokenRegression < 0)\n ) {\n errors.push('eval.maxTokenRegression must be a non-negative number');\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n","import chalk from 'chalk';\nimport { CLI_VERSION } from '../../version';\nimport ora from 'ora';\n\n/**\n * Pretty CLI logger using chalk and ora\n */\n\nexport type LogMode = 'pretty' | 'quiet' | 'json';\n\n/**\n * Global output mode. 'quiet' silences decorative output (banner, info,\n * success, dim) keeping warnings/errors; 'json' silences everything on\n * stdout except the final JSON payload (errors go to stderr) so CI can\n * pipe the output straight into a parser.\n */\nlet mode: LogMode = 'pretty';\n\nexport function setLogMode(next: LogMode): void {\n mode = next;\n}\n\nexport function getLogMode(): LogMode {\n return mode;\n}\n\n/**\n * Prints the machine-readable result of a command. Only mode 'json'\n * emits it — pretty/quiet runs already communicated via the logger.\n */\nexport function jsonOutput(payload: unknown): void {\n if (mode === 'json') {\n console.log(JSON.stringify(payload, null, 2));\n }\n}\n\n/**\n * Creates and returns an ora spinner instance. Silent in quiet/json mode\n * (spinner control sequences would corrupt piped output).\n *\n * @param text Text to display while spinning\n * @returns Ora spinner instance\n */\nexport function createSpinner(text: string) {\n return ora({ text, isSilent: mode !== 'pretty' });\n}\n\n/**\n * Prints a success message with a green checkmark\n *\n * @param msg Message to display\n */\nexport function success(msg: string): void {\n if (mode !== 'pretty') return;\n console.log(chalk.green.bold('✓'), msg);\n}\n\n/**\n * Prints an error message with a red X. Always emitted — on stderr in\n * json mode so stdout stays parseable.\n *\n * @param msg Message to display\n */\nexport function error(msg: string): void {\n if (mode === 'json') {\n console.error(chalk.red.bold('✗'), msg);\n return;\n }\n console.log(chalk.red.bold('✗'), msg);\n}\n\n/**\n * Prints a warning message with a yellow warning symbol. Kept in quiet\n * mode; routed to stderr in json mode.\n *\n * @param msg Message to display\n */\nexport function warn(msg: string): void {\n if (mode === 'json') {\n console.error(chalk.yellow.bold('⚠'), msg);\n return;\n }\n console.log(chalk.yellow.bold('⚠'), msg);\n}\n\n/**\n * Prints an informational message with a blue info icon\n *\n * @param msg Message to display\n */\nexport function info(msg: string): void {\n if (mode !== 'pretty') return;\n console.log(chalk.blue.bold('ℹ'), msg);\n}\n\n/**\n * Prints dimmed/gray text\n *\n * @param msg Message to display\n */\nexport function dim(msg: string): void {\n if (mode !== 'pretty') return;\n console.log(chalk.dim(msg));\n}\n\n/** Inner width of the banner box, in characters — the run of `═` in its border. */\nconst BANNER_WIDTH = 39;\n\n/**\n * One `║ … ║` row, padded to the box width.\n *\n * Padding is measured on the PLAIN text and the color is applied after,\n * because a chalk-wrapped string carries ANSI escapes that `length` counts\n * and the terminal does not. The counts used to be hand-written spaces, and\n * neither row actually closed the box: the title was 2 short and the version\n * row 8, so the \"box\" rendered with a ragged right edge. Computing them also\n * means the row survives a version string of a different length — `0.4.0`\n * becoming `0.10.0` no longer shifts the border.\n */\nfunction bannerRow(plain: string, colored: string): string {\n return ` ${chalk.cyan('║')} ${colored}${' '.repeat(Math.max(0, BANNER_WIDTH - 5 - plain.length))}${chalk.cyan('║')}`;\n}\n\n/**\n * Prints the Appilots ASCII logo and header with version\n */\nexport function banner(): void {\n if (mode !== 'pretty') return;\n const title = 'Appilots MCP Generator';\n const version = `v${CLI_VERSION}`;\n const border = '═'.repeat(BANNER_WIDTH);\n const logo = [\n '',\n ` ${chalk.cyan(`╔${border}╗`)}`,\n bannerRow(title, chalk.bold.cyan(title)),\n bannerRow(version, chalk.dim(version)),\n ` ${chalk.cyan(`╚${border}╝`)}`,\n ' ',\n ].join('\\n');\n console.log(logo);\n}\n\n/**\n * Prints a section heading (plain line). Suppressed outside pretty mode.\n */\nexport function heading(msg: string): void {\n if (mode !== 'pretty') return;\n console.log(msg);\n}\n\n/**\n * Prints a simple two-column aligned table\n *\n * @param rows Array of [key, value] pairs to display\n */\nexport function table(rows: [string, string][]): void {\n if (mode !== 'pretty' || rows.length === 0) {\n return;\n }\n\n // Calculate the maximum key length for alignment\n const maxKeyLength = Math.max(...rows.map(([key]) => key.length));\n\n rows.forEach(([key, value]) => {\n const padding = ' '.repeat(maxKeyLength - key.length + 2);\n console.log(` ${chalk.bold(key)}${padding}${value}`);\n });\n}\n","import { Command } from 'commander';\nimport { AppilotsAPIClient } from '../../services/api-client';\nimport { saveConfig, getConfigPath, getEnvOverrides, DEFAULT_SERVER_URL } from '../../config/index';\nimport { banner, success, error, warn, info, dim } from '../utils/logger';\nimport { existsSync, readFileSync, appendFileSync } from 'fs';\nimport { join } from 'path';\nimport { hintUnreachableServer } from '../utils/server-hint';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface InitOptions {\n apiKey?: string;\n server?: string;\n}\n\n/**\n * .appilotsrc stores the API key in plain text, so it must never be\n * committed. Appends it to the project's .gitignore when missing;\n * returns what happened so the command can phrase the warning.\n */\nfunction ensureConfigIgnored(dir: string): 'already-ignored' | 'added' | 'no-gitignore' {\n const gitignorePath = join(dir, '.gitignore');\n if (!existsSync(gitignorePath)) {\n return 'no-gitignore';\n }\n\n const lines = readFileSync(gitignorePath, 'utf-8').split(/\\r?\\n/);\n const ignored = lines.some((line) => {\n const entry = line.trim();\n return entry === '.appilotsrc' || entry === '/.appilotsrc' || entry === '.appilotsrc/';\n });\n if (ignored) {\n return 'already-ignored';\n }\n\n appendFileSync(\n gitignorePath,\n '\\n# Appilots CLI config (contains your API key — do not commit)\\n.appilotsrc\\n',\n );\n return 'added';\n}\n\nexport function initCommand(): Command {\n return new Command('init')\n .description('Set up Appilots configuration interactively')\n .option('--api-key <key>', 'Appilots API key (ak_... format)')\n .option('--server <url>', 'Appilots server URL')\n .action(async (options: InitOptions) => {\n try {\n banner();\n\n // Check if config already exists\n const configPath = getConfigPath();\n if (configPath) {\n warn(`Found existing .appilotsrc at ${configPath}`);\n warn('Use --api-key and --server to override settings');\n }\n\n // Flag wins over environment variable\n const env = getEnvOverrides();\n const apiKey = options.apiKey || env.apiKey;\n if (!apiKey) {\n error('API key is required');\n info('Provide it with: --api-key <your-ak_...key>');\n info('Or set APPILOTS_API_KEY environment variable');\n process.exit(1);\n }\n if (!options.apiKey && env.apiKey) {\n info('Using API key from APPILOTS_API_KEY environment variable');\n }\n\n // Use provided server, then env, then default\n const serverUrl = options.server || env.serverUrl || DEFAULT_SERVER_URL;\n\n // Validate API key format\n if (!apiKey.startsWith('ak_')) {\n error('Invalid API key format. Must start with ak_');\n process.exit(1);\n }\n\n info('Validating API key...');\n const apiClient = new AppilotsAPIClient({\n serverUrl,\n apiKey,\n });\n\n // Check health\n const isHealthy = await apiClient.health();\n if (!isHealthy) {\n error(`Cannot reach Appilots server at ${serverUrl}`);\n info('Make sure the server is running and the URL is correct');\n hintUnreachableServer(serverUrl);\n process.exit(1);\n }\n\n // Get status to validate credentials and get project info\n const status = await apiClient.status();\n if (status.error) {\n error(`Failed to validate API key: ${status.error}`);\n process.exit(1);\n }\n\n if (!status.project) {\n error('Could not retrieve project information');\n process.exit(1);\n }\n\n success(`✓ Successfully connected to ${status.project.name}`);\n success(`✓ Project ID: ${status.project.id}`);\n\n // Save configuration\n const config = {\n apiKey,\n projectId: status.project.id,\n serverUrl,\n outputDir: '.appilots',\n autoActivate: true,\n };\n\n saveConfig(process.cwd(), config);\n\n success('Configuration saved to .appilotsrc');\n\n switch (ensureConfigIgnored(process.cwd())) {\n case 'added':\n success('Added .appilotsrc to .gitignore (it contains your API key)');\n break;\n case 'no-gitignore':\n warn('.appilotsrc contains your API key — make sure it is NOT committed');\n info('Add \".appilotsrc\" to your .gitignore');\n break;\n case 'already-ignored':\n break;\n }\n\n info('Next steps:');\n dim(' $ appilots sync - Analyze and upload your project');\n dim(' $ appilots watch - Watch for changes and auto-sync');\n } catch (err) {\n error(`Initialization failed: ${stringifyUnknown(err)}`);\n process.exit(1);\n }\n });\n}\n","/**\n * Shared constants used across the Appilots platform.\n */\n\n// ── API ────────────────────────────────────────────────────────\n\nexport const API_VERSION = 'v1';\n\n/**\n * The ORIGIN of the hosted API — no path. The mount prefix is added by\n * `normalizeApiBaseUrl` below; see its comment for why the two are one\n * module and not two.\n */\nexport const DEFAULT_API_BASE_URL = 'https://api.appilots.com';\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\n * The path everything the API serves is mounted under\n * (`.basePath('/api/v1')` in `apps/api/src/app.ts`). There is no rewrite\n * in front of it — `infra/api.ts` points the ALB health check at the full\n * `/api/v1/health/ready` for the same reason.\n */\nexport const APPILOTS_API_PATH_PREFIX = '/api/v1';\n\n/**\n * Turn whatever the integrator configured into a base URL that actually\n * resolves: the prefix is added when absent and left alone when present.\n *\n * This lives in `shared` because the convention had FOUR homes and they\n * disagreed. `@appilots/client-core` completed the prefix (#477);\n * `@appilots/cli` appended `/api/v1` to `serverUrl` itself, so the same\n * value that worked in the SDK produced `/api/v1/api/v1/cli/sync` and a\n * 404; and `DEFAULT_API_BASE_URL` right above carried no prefix at all.\n * One `.appilotsrc` feeds both packages, so \"which convention does this\n * field follow\" cannot have two answers.\n *\n * Completing rather than rejecting is deliberate: `http://localhost:4000`\n * is what the API answers on and what anyone would write, and the mount\n * prefix is our implementation detail. The check accepts the prefix\n * ANYWHERE in the path, because a gateway may mount us under one of its\n * own (`https://gw.acme.com/appilots/api/v1`).\n */\nexport function normalizeApiBaseUrl(configured: string | undefined | null): string {\n const raw = (configured ?? DEFAULT_API_BASE_URL).trim().replace(/\\/+$/, '');\n if (!raw) return `${DEFAULT_API_BASE_URL}${APPILOTS_API_PATH_PREFIX}`;\n if (new RegExp(`${APPILOTS_API_PATH_PREFIX}(/|$)`).test(raw)) return raw;\n return `${raw}${APPILOTS_API_PATH_PREFIX}`;\n}\n\n// ── Limits ─────────────────────────────────────────────────────\n\nexport const LIMITS = {\n MAX_MCP_DOCUMENT_SIZE_MB: 10,\n MAX_PROJECTS_PER_USER: 20,\n MAX_MESSAGE_LENGTH: 4096,\n MAX_ACTIONS_PER_MESSAGE: 10,\n SESSION_TIMEOUT_MS: 30 * 60 * 1000, // 30 minutes\n} as const;\n\n// ── MCP ────────────────────────────────────────────────────────\n\nexport const MCP_DOCUMENT_VERSION = '1.0';\nexport const MCP_SUPPORTED_FORMATS = ['json', 'yaml'] as const;\n\n// ── HTTP Status Codes ──────────────────────────────────────────\n\nexport const HTTP_STATUS = {\n OK: 200,\n CREATED: 201,\n NO_CONTENT: 204,\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n CONFLICT: 409,\n UNPROCESSABLE_ENTITY: 422,\n TOO_MANY_REQUESTS: 429,\n INTERNAL_SERVER_ERROR: 500,\n} as const;\n","/**\n * Rendering an unknown value as text without ever printing `[object Object]`.\n *\n * `err instanceof Error ? err.message : String(err)` is the idiom this\n * replaces. It is correct for thrown `Error`s and silently useless for\n * everything else: a rejected fetch body, a `throw { code }` from a\n * dependency, or a server error envelope all collapse to eight characters\n * that say nothing. That is how `✗ Sync failed: [object Object]` reached\n * users — the failure was reported, just not identified.\n */\n\n/**\n * Text for any value. Errors keep their message, strings pass through,\n * objects become JSON — longer than `[object Object]`, and unlike it,\n * diagnostic. Falls back to `String()` only for values JSON cannot\n * represent (circular structures, BigInt).\n */\nexport function stringifyUnknown(value: unknown): string {\n if (value instanceof Error) {\n const message = value.message || value.name;\n // Node's fetch reports every transport failure as the bare string\n // \"fetch failed\" and hides the real one (ECONNREFUSED, DNS, TLS) in\n // `cause`. That is the difference between \"the server said no\" and\n // \"there is no server there\".\n const cause = (value as { cause?: unknown }).cause;\n if (cause instanceof Error && cause.message && cause.message !== message) {\n return `${message} (${cause.message})`;\n }\n return message;\n }\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return String(value);\n if (typeof value !== 'object') return String(value);\n\n try {\n const json = JSON.stringify(value);\n // `JSON.stringify` yields undefined for functions/symbols and a bare\n // `{}` for objects whose own properties are all non-enumerable —\n // neither is worth printing.\n if (json && json !== '{}') return json;\n } catch {\n // circular or BigInt — fall through\n }\n return String(value);\n}\n","/**\n * HTTP client for communicating with the Appilots API backend\n */\n\nimport { normalizeApiBaseUrl } from '@appilots/shared/constants';\nimport { stringifyUnknown } from '../utils/stringify';\n\n/**\n * Result from a sync operation\n */\nexport interface SyncResult {\n success: boolean;\n unchanged: boolean;\n /**\n * Set by the server when an unchanged upload had to re-activate a\n * document that was stored but not active — i.e. something else (an\n * older version, a hand-activated document) was in front of the agent.\n */\n activated?: boolean;\n id?: string;\n checksum?: string;\n screensCount?: number;\n formsCount?: number;\n actionsCount?: number;\n error?: string;\n /**\n * The server's `error.code`, kept structured alongside the rendered\n * `error` text so callers can branch on the failure instead of\n * matching substrings. Absent when the failure produced no envelope.\n */\n errorCode?: string;\n /** HTTP status of the failed response; 0 for network/timeout failures. */\n errorStatus?: number;\n}\n\n/**\n * One eval scenario as sent to `POST /cli/eval/run`. Shape mirrors the\n * server's `evalScenarioRequestSchema` — kept as a plain interface here\n * (no @appilots/shared import) since this package publishes standalone.\n */\nexport interface EvalScenarioRequest {\n id: string;\n screen?: string;\n observation?: unknown;\n prompt: string;\n modelOverride?: string;\n}\n\nexport interface EvalScenarioResult {\n id: string;\n content: string;\n actions: Array<{ id: string; type: string; payload: Record<string, unknown> }>;\n totalTokens: number;\n totalCostUsd: number;\n totalLatencyMs: number;\n modelUsed: string;\n}\n\n/**\n * Result from an eval run\n */\nexport interface EvalRunResult {\n results?: EvalScenarioResult[];\n error?: string;\n}\n\n/**\n * Result from a status query\n */\nexport interface StatusResult {\n project?: {\n id: string;\n name: string;\n };\n activeMcp?: {\n id: string;\n version: string;\n screensCount: number;\n formsCount: number;\n actionsCount: number;\n };\n error?: string;\n}\n\n/**\n * Appilots API client configuration\n */\ninterface APIClientConfig {\n serverUrl: string;\n apiKey: string;\n /** Per-request timeout in ms (default 30s) */\n timeoutMs?: number;\n /** Retries on network errors / 5xx (default 2) */\n maxRetries?: number;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RETRIES = 2;\nconst RETRY_BASE_DELAY_MS = 500;\n\n/**\n * Node's fetch collapses every connection failure into the opaque\n * \"fetch failed\" — the real reason (ECONNREFUSED, ENOTFOUND, ...) is\n * hidden on `cause`. Unwrapped, a misconfigured serverUrl reads as a\n * mystery, so rewrite it into a message that names the server we could\n * not reach and the reason we could not reach it.\n */\nfunction describeNetworkError(url: string, err: unknown): Error {\n let origin = url;\n try {\n origin = new URL(url).origin;\n } catch {\n // Not parseable — fall back to the full URL\n }\n\n const cause = (err as { cause?: { code?: string } } | undefined)?.cause;\n const code = typeof cause?.code === 'string' ? cause.code : undefined;\n const detail = code ?? stringifyUnknown(err);\n\n return new Error(`Cannot reach Appilots server at ${origin} (${detail})`);\n}\n\n/**\n * HTTP client for communicating with Appilots API\n */\n/**\n * The API answers errors as `{ error: { code, message } }`, and this client\n * used to read `errorData.error as string`. The cast was a lie: interpolating\n * the object printed `Sync failed: [object Object]`, and passing it on to\n * `hintUnreachableServer` — which calls `.includes` on it — threw\n * `message.includes is not a function`. So a failed sync reported neither\n * what went wrong nor that the reporting itself had broken; two of our own\n * bugs stacked to hide the server's answer completely.\n */\n/**\n * The envelope's `code`, when there is one. `describeApiError` folds it\n * into the human sentence; this keeps it addressable, so a caller can\n * react to WORKSPACE_INACTIVE without parsing prose.\n */\nexport function errorCodeOf(payload: unknown): string | undefined {\n const error = (payload as { error?: unknown } | null)?.error;\n if (error && typeof error === 'object') {\n const { code } = error as { code?: unknown };\n if (typeof code === 'string' && code.trim()) return code;\n }\n return undefined;\n}\n\nexport function describeApiError(payload: unknown, fallback: string): string {\n const error = (payload as { error?: unknown } | null)?.error;\n if (typeof error === 'string' && error.trim()) return error;\n if (error && typeof error === 'object') {\n const { code, message } = error as { code?: unknown; message?: unknown };\n const text = typeof message === 'string' && message.trim() ? message : undefined;\n const tag = typeof code === 'string' && code.trim() ? code : undefined;\n if (text && tag) return `${text} (${tag})`;\n if (text) return text;\n if (tag) return tag;\n }\n const message = (payload as { message?: unknown } | null)?.message;\n if (typeof message === 'string' && message.trim()) return message;\n return fallback;\n}\n\nexport class AppilotsAPIClient {\n /**\n * `serverUrl` with the API's mount prefix resolved — every path below\n * is relative to THIS, not to the configured origin.\n *\n * It used to be the raw `serverUrl` with `/api/v1` hardcoded into each\n * path, which made the field mean something different here than in the\n * SDK. Both read the same `.appilotsrc`: the SDK completes the prefix\n * when it is missing, so `https://api.appilots.com/api/v1` is correct\n * there — and here that same value produced\n * `/api/v1/api/v1/cli/sync`, a 404 whose body reads `Route not found`.\n * Sharing `normalizeApiBaseUrl` is what makes one file mean one thing:\n * with or without the prefix now works in both.\n */\n private baseUrl: string;\n private apiKey: string;\n private timeoutMs: number;\n private maxRetries: number;\n\n constructor(config: APIClientConfig) {\n this.baseUrl = normalizeApiBaseUrl(config.serverUrl);\n this.apiKey = config.apiKey;\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n }\n\n /**\n * fetch with a hard timeout and exponential-backoff retries. Retries\n * only on network failures and 5xx responses — 4xx are the caller's\n * problem and retrying them would just spam the server.\n */\n private async request(url: string, init: RequestInit): Promise<Response> {\n let lastError: unknown;\n for (let attempt = 0; attempt <= this.maxRetries; attempt++) {\n if (attempt > 0) {\n await new Promise((r) => setTimeout(r, RETRY_BASE_DELAY_MS * 2 ** (attempt - 1)));\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n const response = await fetch(url, { ...init, signal: controller.signal });\n if (response.status >= 500 && attempt < this.maxRetries) {\n lastError = new Error(`HTTP ${response.status}: ${response.statusText}`);\n continue;\n }\n return response;\n } catch (err) {\n lastError = controller.signal.aborted\n ? new Error(`Request timed out after ${this.timeoutMs}ms: ${url}`)\n : describeNetworkError(url, err);\n } finally {\n clearTimeout(timer);\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n /**\n * Syncs content with the Appilots backend\n *\n * @param content The MCP content object to sync\n * @param version Version string for the content\n * @param appVersion Host app version (package.json) — sent as\n * X-App-Version so the backend can associate the MCP\n * document with the app build that produced it\n * @returns SyncResult with success status and metadata\n */\n async sync(content: object, version: string, appVersion?: string): Promise<SyncResult> {\n try {\n const response = await this.request(`${this.baseUrl}/cli/sync`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n ...(appVersion ? { 'X-App-Version': appVersion } : {}),\n },\n body: JSON.stringify({ content, version }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n return {\n success: false,\n unchanged: false,\n error: describeApiError(errorData, `HTTP ${response.status}: ${response.statusText}`),\n errorCode: errorCodeOf(errorData),\n errorStatus: response.status,\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as Record<string, unknown>;\n return {\n success: true,\n ...inner,\n } as SyncResult;\n } catch (error) {\n return {\n success: false,\n unchanged: false,\n error: error instanceof Error ? error.message : 'Failed to sync with Appilots API',\n errorStatus: 0,\n };\n }\n }\n\n /**\n * Gets the status of the Appilots project and active MCP\n *\n * @returns StatusResult with project and active MCP information\n */\n async status(): Promise<StatusResult> {\n try {\n const response = await this.request(`${this.baseUrl}/cli/status`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n return {\n error: describeApiError(errorData, `HTTP ${response.status}: ${response.statusText}`),\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as StatusResult;\n return inner;\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Failed to fetch status from Appilots API',\n };\n }\n }\n\n /**\n * Runs a batch of eval scenarios against the project's MCP document in\n * decision/dry-run mode — no side effects, same relay path as the\n * dashboard's sandbox, authenticated with this client's API key.\n *\n * @param scenarios Scenarios to run, capped server-side at\n * EVAL_MAX_SCENARIOS_PER_RUN (currently 20) as a cost guard.\n */\n async evalRun(scenarios: EvalScenarioRequest[]): Promise<EvalRunResult> {\n try {\n const response = await this.request(`${this.baseUrl}/cli/eval/run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({ scenarios }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({}))) as Record<string, unknown>;\n const errObj = errorData?.error as Record<string, unknown> | undefined;\n return {\n error:\n (errObj?.message as string | undefined) ||\n `HTTP ${response.status}: ${response.statusText}`,\n };\n }\n\n const json = (await response.json()) as Record<string, unknown>;\n const inner = (json.data ?? json) as { results?: EvalScenarioResult[] };\n return { results: inner.results ?? [] };\n } catch (error) {\n return {\n error: error instanceof Error ? error.message : 'Failed to run eval against Appilots API',\n };\n }\n }\n\n /**\n * Checks if the Appilots API server is healthy\n *\n * @returns true if server is healthy, false otherwise\n */\n async health(): Promise<boolean> {\n try {\n const response = await this.request(`${this.baseUrl}/health`, {\n method: 'GET',\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n}\n","import { DEFAULT_SERVER_URL } from '../../config/index';\nimport { info } from './logger';\n\n/**\n * `serverUrl` has a localhost default, which is right for `pnpm dev` and\n * a trap for everyone else: an unset (or misspelled) key sends the CLI to\n * a port nothing is listening on, and the failure looks like a network\n * problem rather than a missing setting. Prints what to do about it —\n * only when the unreachable server actually is that default, so a real\n * outage on a configured server is not muddied with setup advice.\n */\nexport function hintUnreachableServer(serverUrl: string, message?: unknown): void {\n if (serverUrl !== DEFAULT_SERVER_URL) return;\n // `unknown`, not `string`: the API answers errors as `{ code, message }`,\n // and a caller handed that object straight through. Calling `.includes`\n // on it threw `message.includes is not a function` — a crash in the code\n // whose entire job is to explain a failure, printed on top of the failure\n // it was explaining.\n if (typeof message === 'string' && !message.includes('Cannot reach Appilots server')) return;\n if (message !== undefined && typeof message !== 'string') return;\n\n info(`serverUrl is not set, so the CLI is using the built-in default (${DEFAULT_SERVER_URL})`);\n info('For the hosted backend, set it in .appilotsrc:');\n info(' \"serverUrl\": \"https://api.appilots.com\"');\n info('Or pass --server <url>, or set APPILOTS_SERVER_URL');\n}\n","import { Command } from 'commander';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { MCPGenerator } from '../../generators/MCPGenerator';\nimport { AppilotsAPIClient } from '../../services/api-client';\nimport { loadConfig, DEFAULT_SERVER_URL } from '../../config/index';\nimport {\n banner,\n success,\n error,\n info,\n createSpinner,\n warn,\n table,\n heading,\n setLogMode,\n jsonOutput,\n} from '../utils/logger';\nimport { reportMetadataLint } from '../utils/metadata-report';\nimport { compareWithRemote, reportRemoteDrift } from '../utils/remote-drift';\nimport { explainUploadFailure } from '../utils/upload-failure';\nimport { assertDocumentHasScreens } from '../utils/empty-document';\nimport { hintUnreachableServer } from '../utils/server-hint';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface SyncOptions {\n verbose?: boolean;\n force?: boolean;\n apiKey?: string;\n projectId?: string;\n server?: string;\n json?: boolean;\n quiet?: boolean;\n strictMetadata?: boolean;\n allowEmpty?: boolean;\n}\n\nexport function syncCommand(): Command {\n return new Command('sync')\n .description('Analyze project and sync MCP documents with Appilots')\n .option('--verbose', 'Enable verbose logging', false)\n .option('--force', 'Force upload even if nothing changed', false)\n .option('--api-key <key>', 'Appilots API key (overrides .appilotsrc and APPILOTS_API_KEY)')\n .option('--project-id <id>', 'Project ID (overrides .appilotsrc and APPILOTS_PROJECT_ID)')\n .option('--server <url>', 'Appilots server URL (overrides .appilotsrc and APPILOTS_SERVER_URL)')\n .option('--json', 'Output a machine-readable JSON result (implies --quiet)', false)\n .option('--quiet', 'Suppress banner and informational output', false)\n .option(\n '--strict-metadata',\n 'Fail when mutating actions are missing effect/riskLevel metadata',\n false,\n )\n .option('--allow-empty', 'Do not fail when the application map has zero screens', false)\n .action(async (options: SyncOptions) => {\n if (options.json) setLogMode('json');\n else if (options.quiet) setLogMode('quiet');\n try {\n banner();\n\n // Load configuration (.appilotsrc merged with APPILOTS_* env vars),\n // then let explicit flags win — CI can run without any .appilotsrc.\n const loaded = loadConfig(warn);\n const apiKey = options.apiKey || loaded?.apiKey;\n if (!apiKey) {\n error('No .appilotsrc configuration found');\n info('Run: appilots init --api-key <your-key>');\n info('Or set APPILOTS_API_KEY, or pass --api-key');\n jsonOutput({ success: false, error: 'No configuration found (missing API key)' });\n process.exit(1);\n return;\n }\n const config = {\n serverUrl: DEFAULT_SERVER_URL,\n outputDir: '.appilots',\n ...loaded,\n apiKey,\n ...(options.projectId ? { projectId: options.projectId } : {}),\n ...(options.server ? { serverUrl: options.server } : {}),\n };\n\n // Initialize API client\n const apiClient = new AppilotsAPIClient({\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n });\n\n const outputDir = config.outputDir || '.appilots';\n\n // §3 fix: Read previous checksum BEFORE generating\n let previousChecksum = '';\n try {\n const checksumPath = join(outputDir, '.appilots-checksum');\n previousChecksum = (await readFile(checksumPath, 'utf-8')).trim();\n } catch {\n // No previous checksum — first run\n }\n\n // Generate MCP document\n let spinner = createSpinner('Analyzing project...');\n spinner.start();\n\n const generator = new MCPGenerator({\n rootDir: process.cwd(),\n outputDir,\n format: 'json',\n strictScreens: config.strictScreens,\n screenPatterns: config.screenPatterns,\n include: config.include,\n exclude: config.exclude,\n navigationInclude: config.navigationInclude,\n navigationExclude: config.navigationExclude,\n platform: config.platform,\n manifestPath: config.manifestPath,\n });\n\n const output = await generator.generate();\n spinner.stop();\n\n // Before anything is uploaded: an empty map on the server is\n // worse than no map, because the dashboard then looks integrated.\n assertDocumentHasScreens(output.document, {\n rootDir: process.cwd(),\n allowEmpty: Boolean(options.allowEmpty),\n });\n\n success(\n `Found ${output.document.metadata.totalScreens} screens, ` +\n `${output.document.metadata.totalForms} forms, ${output.document.metadata.totalActions} actions`,\n );\n\n // OKR-005 KR4: surface mutating actions missing effect/riskLevel\n // before upload; fatal only with --strict-metadata\n reportMetadataLint(output.document, Boolean(options.strictMetadata));\n\n // What is the server actually serving right now?\n //\n // Asked before every upload, not only when the local checksum is\n // unchanged, because the answer matters most when the upload\n // FAILS: that is the case where a stale document stays active and\n // the agent goes on being unable to see most of the app, with\n // nothing on screen saying so.\n spinner = createSpinner('Checking remote status...');\n spinner.start();\n const remote = await apiClient.status();\n spinner.stop();\n\n const remoteActive = remote.error ? null : (remote.activeMcp ?? null);\n const drift = remoteActive\n ? compareWithRemote({ screens: output.document.metadata.totalScreens }, remoteActive)\n : null;\n\n // §3 fix: Compare previous checksum with newly generated one.\n //\n // NOTE: this branch is close to dead today — the document embeds\n // `generatedAt: new Date().toISOString()` (MCPGenerator), so two\n // runs over identical source produce different checksums and the\n // equality below is false. Left in place because it is correct\n // whenever generation is deterministic, and because the drift\n // check it now guards is the part that matters.\n if (!options.force && previousChecksum && previousChecksum === output.checksum) {\n if (remote.error) {\n warn(`Could not verify remote: ${remote.error}`);\n info('Uploading anyway...');\n } else if (remoteActive) {\n // \"Local hasn't changed\" is not \"the server is serving it\".\n // An older version activated from the dashboard, or a sync\n // that went to a different server, leaves a stale document\n // active while the local checksum still matches the last\n // upload — and short-circuiting here is what lets it survive\n // a `sync` that reports success.\n if (!drift) {\n success('Already up to date (no local or remote changes)');\n jsonOutput({ success: true, unchanged: true, checksum: output.checksum });\n return;\n }\n\n reportRemoteDrift(drift);\n info('Uploading anyway...');\n }\n // No active MCP on server? Fall through to upload\n }\n\n // Upload to server\n spinner = createSpinner('Uploading to Appilots...');\n spinner.start();\n\n const syncResult = await apiClient.sync(\n output.document,\n output.document.version,\n output.document.metadata.appVersion,\n );\n spinner.stop();\n\n if (!syncResult.success) {\n error(`Sync failed: ${syncResult.error}`);\n hintUnreachableServer(config.serverUrl, syncResult.error);\n explainUploadFailure(syncResult, config.serverUrl);\n // Nothing was uploaded, so whatever was active still is. When\n // that is a fraction of the app, say so here — otherwise the\n // next thing the developer sees is an agent failing on screens\n // it cannot see, with the sync failure already scrolled off.\n if (drift?.severe) {\n reportRemoteDrift(drift, { uploadFailed: true });\n }\n jsonOutput({\n success: false,\n error: syncResult.error,\n errorCode: syncResult.errorCode,\n errorStatus: syncResult.errorStatus,\n activeDocument: remoteActive,\n drift,\n });\n process.exit(1);\n }\n\n if (syncResult.unchanged && !options.force) {\n success('Already up to date on server');\n if (syncResult.activated) {\n // The content was already stored but something else was\n // active — this call put it back in front of the agent.\n info(`Re-activated document ${syncResult.id} (it was stored but not active).`);\n }\n } else {\n success('Successfully synced MCP document');\n if (drift?.severe) {\n info(\n `Replaced the ${drift.remoteScreens}-screen document that was active ` +\n `(${drift.remoteId}) — the agent could not see the other ` +\n `${drift.localScreens - drift.remoteScreens} screens until now.`,\n );\n }\n info(`Document ID: ${syncResult.id}`);\n info(`Checksum: ${syncResult.checksum}`);\n\n if (config.projectId) {\n const dashboardUrl = `${config.serverUrl}/dashboard/projects/${config.projectId}`;\n info(`View on dashboard: ${dashboardUrl}`);\n }\n }\n\n if (options.verbose) {\n heading('\\nSync Details:');\n table([\n ['Screens', String(syncResult.screensCount || 0)],\n ['Forms', String(syncResult.formsCount || 0)],\n ['Actions', String(syncResult.actionsCount || 0)],\n ['Document ID', syncResult.id || 'N/A'],\n ['Previous checksum', previousChecksum || '(first run)'],\n ['New checksum', output.checksum],\n ['Changed', String(previousChecksum !== output.checksum)],\n ]);\n }\n\n jsonOutput({\n success: true,\n unchanged: Boolean(syncResult.unchanged),\n id: syncResult.id,\n checksum: syncResult.checksum ?? output.checksum,\n screensCount: syncResult.screensCount ?? output.document.metadata.totalScreens,\n formsCount: syncResult.formsCount ?? output.document.metadata.totalForms,\n actionsCount: syncResult.actionsCount ?? output.document.metadata.totalActions,\n });\n } catch (err) {\n error(`Sync failed: ${stringifyUnknown(err)}`);\n jsonOutput({ success: false, error: stringifyUnknown(err) });\n if (options.verbose) {\n console.error(err);\n }\n process.exit(1);\n }\n });\n}\n","import { mkdir, writeFile, readFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport path from 'node:path';\nimport type { MCPGeneratorOptions, MCPDocument, MCPOutput } from './types';\nimport type { AnalyzerConfig } from '../types';\nimport { enrichScreenForAgent } from '../pipeline/enrichment';\nimport type { PlatformAnalyzer } from '../analyzers/PlatformAnalyzer';\nimport { ReactNativePlatformAnalyzer } from '../analyzers/ReactNativePlatformAnalyzer';\nimport { GenericPlatformAnalyzer } from '../analyzers/GenericPlatformAnalyzer';\nimport { ReactWebPlatformAnalyzer } from '../analyzers/web/ReactWebPlatformAnalyzer';\nimport {\n loadManifest,\n mergeManifestScreens,\n mergeManifestNavigation,\n} from '../manifest/loadManifest';\n\n/**\n * Main generator that orchestrates analyzers and produces MCP documents.\n *\n * @example\n * ```ts\n * const generator = new MCPGenerator({\n * rootDir: './my-rn-app',\n * outputDir: '.appilots',\n * format: 'json',\n * });\n *\n * const output = await generator.generate();\n * console.log(`Generated MCP at: ${output.filePath}`);\n * ```\n */\nexport interface MCPGeneratorConfig {\n rootDir: string;\n outputDir?: string;\n format?: 'json';\n version?: string;\n includeSourcePaths?: boolean;\n splitOutput?: boolean;\n /** §1: Only include files with registerScreen() or matching screen patterns */\n strictScreens?: boolean;\n /** §1: Custom glob patterns for screen file detection */\n screenPatterns?: string[];\n /** §5: Additional navigation file patterns (added to defaults) */\n navigationInclude?: string[];\n /** §5: Exclude patterns for navigation analysis */\n navigationExclude?: string[];\n /** Source include patterns */\n include?: string[];\n /** Source exclude patterns */\n exclude?: string[];\n /**\n * Which `PlatformAnalyzer` to run against the source tree. Defaults to\n * `'react-native'` (the existing Babel/JSX analyzer pipeline). `'web'`\n * runs `ReactWebPlatformAnalyzer` (DOM-vocabulary JSX + React Router).\n * Any other value runs `GenericPlatformAnalyzer` — a safe no-op that\n * does no filesystem/AST work — so a platform with no source analyzer\n * yet still produces a valid document from a declared manifest alone.\n */\n platform?: string;\n /**\n * Optional custom analyzer instance, mainly for tests. When set,\n * `platform` is ignored for analyzer selection (but still recorded).\n */\n platformAnalyzer?: PlatformAnalyzer;\n /**\n * Path to a declared `appilots.manifest.json`, relative to `rootDir`\n * unless absolute. Defaults to `appilots.manifest.json` at the project\n * root. Manifest screens merge on top of analyzer-derived screens,\n * winning on a screen-name conflict. Missing file is not an error —\n * manifest mode is opt-in.\n */\n manifestPath?: string;\n}\n\nexport class MCPGenerator {\n private analyzerConfig: AnalyzerConfig;\n private options: MCPGeneratorOptions;\n private generatorConfig: MCPGeneratorConfig;\n private platformAnalyzer: PlatformAnalyzer;\n\n constructor(config: MCPGeneratorConfig) {\n this.generatorConfig = config;\n\n this.analyzerConfig = {\n rootDir: config.rootDir,\n include: config.include ?? ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n exclude: config.exclude ?? ['**/node_modules/**', '**/__tests__/**', '**/dist/**'],\n };\n\n this.options = {\n format: config.format ?? 'json',\n outputDir: config.outputDir ?? '.appilots',\n includeSourcePaths: config.includeSourcePaths ?? false,\n splitOutput: config.splitOutput ?? false,\n version: config.version ?? '1.0',\n };\n\n this.platformAnalyzer =\n config.platformAnalyzer ?? MCPGenerator.createPlatformAnalyzer(config.platform);\n }\n\n /**\n * Select the `PlatformAnalyzer` implementation for a `.appilotsrc`\n * `platform` value. `'react-native'` (or unset — the existing default)\n * gets the RN Babel/JSX pipeline; `'web'` gets the React web (DOM +\n * React Router) pipeline; anything else gets the no-op generic\n * analyzer, relying entirely on a declared manifest. The manifest\n * still merges on top of every analyzer's output either way.\n */\n static createPlatformAnalyzer(platform?: string): PlatformAnalyzer {\n const resolved = platform ?? 'react-native';\n if (resolved === 'react-native') return new ReactNativePlatformAnalyzer();\n if (resolved === 'web') return new ReactWebPlatformAnalyzer();\n return new GenericPlatformAnalyzer(resolved);\n }\n\n /** Generate MCP documents from the project */\n async generate(): Promise<MCPOutput> {\n console.log('[MCPGenerator] Starting generation...');\n\n // Create output directory if it doesn't exist\n const outputDir = this.options.outputDir || '.appilots';\n await mkdir(outputDir, { recursive: true });\n console.log(`[MCPGenerator] Output directory ensured: ${outputDir}`);\n\n console.log(`[MCPGenerator] Running \"${this.platformAnalyzer.platform}\" platform analyzer...`);\n const analyzed = await this.platformAnalyzer.analyze(this.analyzerConfig, {\n strictScreens: this.generatorConfig.strictScreens ?? true,\n screenPatterns: this.generatorConfig.screenPatterns,\n navigationInclude: this.generatorConfig.navigationInclude,\n navigationExclude: this.generatorConfig.navigationExclude,\n });\n\n console.log(\n `[MCPGenerator] Analyzer complete. Found ${analyzed.screens.length} screens from ${analyzed.analyzedFiles} files`,\n );\n\n // Manifest mode (§2): merge a declared appilots.manifest.json on top\n // of the analyzer output. Missing file is not an error — this is\n // opt-in. A present-but-invalid manifest throws with a clear message\n // (see loadManifest).\n const { manifest, resolvedPath: manifestResolvedPath } = await loadManifest(\n this.generatorConfig.rootDir,\n this.generatorConfig.manifestPath,\n );\n if (manifest) {\n console.log(\n `[MCPGenerator] Merged manifest at ${manifestResolvedPath} (${manifest.screens.length} declared screens)`,\n );\n }\n\n const mergedScreens = mergeManifestScreens(analyzed.screens, manifest?.screens);\n const navigation = mergeManifestNavigation(analyzed.navigation, manifest?.navigation);\n\n const agentReadyScreens = mergedScreens.map((screen) =>\n enrichScreenForAgent({\n ...screen,\n filePath: screen.filePath\n ? path.relative(this.generatorConfig.rootDir, screen.filePath)\n : screen.filePath,\n }),\n );\n\n // Get project name and app version from package.json\n const projectInfo = await this.getProjectInfo();\n const projectName = projectInfo.name;\n\n console.log(`[MCPGenerator] Project name: ${projectName}`);\n\n // Build the MCPDocument\n const document: MCPDocument = {\n version: this.options.version!,\n generatedAt: new Date().toISOString(),\n projectName,\n screens: agentReadyScreens,\n navigation,\n metadata: {\n generatorVersion: '0.1.0',\n ...(projectInfo.version ? { appVersion: projectInfo.version } : {}),\n totalScreens: agentReadyScreens.length,\n totalForms: agentReadyScreens.reduce((acc, s) => acc + s.forms.length, 0),\n totalActions: agentReadyScreens.reduce((acc, s) => acc + s.actions.length, 0),\n analyzedFiles: analyzed.analyzedFiles,\n // §D: Only set when strict mode filters out screens\n ...(analyzed.screensFilteredOut ? { screensFilteredOut: analyzed.screensFilteredOut } : {}),\n },\n };\n\n // Serialize document to JSON\n const serialized = JSON.stringify(document, null, 2);\n\n // Calculate SHA-256 checksum\n const checksum = this.calculateChecksum(serialized);\n\n // Write the document file\n const filePath = path.resolve(outputDir, `mcp-document.${this.options.format}`);\n await writeFile(filePath, serialized, 'utf-8');\n console.log(`[MCPGenerator] Document written to: ${filePath}`);\n\n // Write checksum file\n const checksumFilePath = path.resolve(outputDir, '.appilots-checksum');\n await writeFile(checksumFilePath, checksum, 'utf-8');\n console.log(`[MCPGenerator] Checksum written to: ${checksumFilePath}`);\n\n console.log('[MCPGenerator] Generation complete!');\n\n return {\n document,\n filePath,\n format: this.options.format,\n checksum,\n };\n }\n\n /**\n * Read the previously stored checksum from disk.\n * Returns null if no checksum file exists (first run).\n *\n * §4: This replaces the incomplete `hasChanged` static method.\n * To detect actual changes, compare this value with `output.checksum`\n * after calling `generate()`.\n */\n static async readPreviousChecksum(outputDir: string): Promise<string | null> {\n const checksumFilePath = path.resolve(outputDir, '.appilots-checksum');\n try {\n const content = await readFile(checksumFilePath, 'utf-8');\n return content.trim() || null;\n } catch {\n return null;\n }\n }\n\n /**\n * Calculate SHA-256 checksum of content\n */\n private calculateChecksum(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n }\n\n /**\n * Get project name and version from package.json in rootDir\n */\n private async getProjectInfo(): Promise<{ name: string; version?: string }> {\n try {\n const packageJsonPath = path.resolve(this.analyzerConfig.rootDir, 'package.json');\n const packageJsonContent = await readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonContent);\n return {\n name: packageJson.name || 'Unknown Project',\n version: typeof packageJson.version === 'string' ? packageJson.version : undefined,\n };\n } catch (error) {\n console.warn('[MCPGenerator] Failed to read package.json, using default project name');\n return { name: 'Unknown Project' };\n }\n }\n}\n","import type {\n ActionDescriptor,\n CollectionDescriptor,\n FlowDescriptor,\n FormDescriptor,\n FormFieldDescriptor,\n ScreenAgentHints,\n ScreenDescriptor,\n TargetDescriptor,\n WaitPolicyDescriptor,\n} from '../types';\n\nexport function enrichScreenForAgent(screen: ScreenDescriptor): ScreenDescriptor {\n const targets = mergeTargets([\n ...targetsFromForms(screen.forms),\n ...targetsFromActions(screen.actions),\n ...targetsFromCollections(screen.collections ?? []),\n ]);\n const flows = synthesizeFlows(screen, targets);\n const agentHints = synthesizeAgentHints(screen, targets, flows);\n\n return {\n ...screen,\n ...(targets.length > 0 ? { targets } : {}),\n ...(flows.length > 0 ? { flows } : {}),\n ...(agentHints ? { agentHints } : {}),\n };\n}\n\nfunction targetsFromForms(forms: FormDescriptor[]): TargetDescriptor[] {\n const targets: TargetDescriptor[] = [];\n for (const form of forms) {\n for (const field of form.fields) {\n targets.push({\n id: field.locator?.id ?? field.name,\n role: fieldToRole(field),\n label: field.label,\n fieldName: field.name,\n locator: field.locator ?? { id: field.name, source: 'inferred' },\n sourceComponent: field.sourceComponent,\n });\n }\n if (form.submitAction && form.submitAction !== 'anonymous') {\n targets.push({\n id: form.submitAction,\n role: 'submit',\n actionId: form.submitAction,\n label: form.submitAction,\n });\n }\n }\n return targets;\n}\n\nfunction fieldToRole(field: FormFieldDescriptor): TargetDescriptor['role'] {\n if (field.type === 'toggle') return 'toggle';\n if (field.type === 'select') return 'select';\n if (field.type === 'date') return 'date';\n return 'input';\n}\n\nfunction targetsFromActions(actions: ActionDescriptor[]): TargetDescriptor[] {\n return actions\n .filter((action) => action.id)\n .map((action) => ({\n id: action.locator?.id ?? action.id,\n role: action.type === 'submit' ? 'submit' : 'button',\n label: action.label,\n locator: action.locator ?? { id: action.id, label: action.label, source: 'inferred' },\n actionId: action.id,\n handler: action.handler,\n targetScreen: action.targetScreen,\n destructive: action.destructive,\n requiresConfirmation: action.requiresConfirmation,\n opensModal: action.opensModal,\n opensBottomSheet: action.opensBottomSheet,\n sourceComponent: action.sourceComponent,\n }));\n}\n\nfunction targetsFromCollections(collections: CollectionDescriptor[]): TargetDescriptor[] {\n return collections.map((collection) => ({\n id: collection.id,\n role: 'list',\n label: collection.itemType ?? collection.dataSource ?? collection.id,\n locator: { id: collection.id, testID: collection.id, source: 'testID' },\n sourceComponent: collection.component,\n }));\n}\n\nfunction mergeTargets(targets: TargetDescriptor[]): TargetDescriptor[] {\n const byId = new Map<string, TargetDescriptor>();\n for (const target of targets) {\n if (!target.id) continue;\n const existing = byId.get(target.id);\n byId.set(target.id, existing ? { ...target, ...existing, locator: existing.locator ?? target.locator } : target);\n }\n return Array.from(byId.values()).sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction synthesizeFlows(screen: ScreenDescriptor, targets: TargetDescriptor[]): FlowDescriptor[] {\n const flows: FlowDescriptor[] = [];\n\n for (const form of screen.forms) {\n const submitAction = screen.actions.find((action) => action.id === form.submitAction)\n ?? screen.actions.find((action) => action.type === 'submit');\n if (!submitAction) continue;\n\n flows.push({\n id: `submit-${form.id}`,\n title: submitAction.label ? `Submit ${submitAction.label}` : `Submit ${form.id}`,\n intent: 'form_submit',\n steps: [\n ...form.fields.map((field) => ({\n type: field.type === 'select' ? 'select' : field.type === 'toggle' ? 'toggle' : 'fill',\n target: field.name,\n label: field.label,\n required: field.required,\n description: field.placeholder,\n })),\n { type: 'press', target: submitAction.id, label: submitAction.label },\n { type: 'wait', description: describeWait(submitAction) },\n ],\n waitPolicy: waitPolicyForAction(submitAction),\n safetyNotes: submitAction.requiresConfirmation || submitAction.destructive\n ? ['Requires confirmation before execution']\n : undefined,\n });\n }\n\n for (const action of screen.actions) {\n if (action.type === 'submit') continue;\n if (action.targetScreen) {\n flows.push({\n id: `navigate-${action.id}`,\n title: action.label ? `Open ${action.label}` : `Navigate to ${action.targetScreen}`,\n intent: 'navigate',\n steps: [{ type: 'press', target: action.id, label: action.label }],\n waitPolicy: waitPolicyForAction(action),\n });\n } else if (action.destructive || action.requiresConfirmation) {\n flows.push({\n id: `confirm-${action.id}`,\n title: action.label ? `Confirm ${action.label}` : `Confirm ${action.id}`,\n intent: 'destructive_action',\n steps: [\n { type: 'press', target: action.id, label: action.label },\n { type: 'confirm', description: 'Wait for native or custom confirmation before continuing' },\n { type: 'wait', description: describeWait(action) },\n ],\n waitPolicy: waitPolicyForAction(action),\n safetyNotes: ['Destructive or high-risk action'],\n });\n }\n }\n\n for (const collection of screen.collections ?? []) {\n if (collection.rowAction || (collection.rowActions && collection.rowActions.length > 0)) {\n flows.push({\n id: `list-${collection.id}`,\n title: `Act on an item in ${collection.id}`,\n intent: 'list_action',\n steps: [\n { type: 'choose-list-item', target: collection.id, description: 'Resolve the user reference to a visible or searchable row' },\n { type: 'press', description: collection.rowAction?.description ?? 'Open the row action' },\n ],\n waitPolicy: { expectedOutcome: collection.rowAction?.targetScreen ? 'navigation' : 'inline-feedback' },\n });\n }\n }\n\n return flows.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction waitPolicyForAction(action: ActionDescriptor): WaitPolicyDescriptor {\n const expectedOutcome = action.successSignal?.type === 'goBack'\n ? 'goBack'\n : action.appilotsInferred?.expectedOutcome ?? (action.targetScreen ? 'navigation' : undefined);\n const signals = [action.successSignal, action.failureSignal].filter(Boolean) as WaitPolicyDescriptor['signals'];\n return {\n ...(expectedOutcome ? { expectedOutcome } : {}),\n ...(signals && signals.length > 0 ? { signals } : {}),\n ...(action.appilotsInferred?.isAsyncTrigger ? { maxMs: 10000 } : {}),\n };\n}\n\nfunction describeWait(action: ActionDescriptor): string {\n if (action.successSignal?.description) return action.successSignal.description;\n if (action.successSignal?.type === 'goBack') return 'Wait for the app to return to the previous screen';\n if (action.targetScreen) return `Wait for navigation to ${action.targetScreen}`;\n if (action.appilotsInferred?.expectedOutcome) return `Wait for ${action.appilotsInferred.expectedOutcome}`;\n return 'Wait for the UI to settle';\n}\n\nfunction synthesizeAgentHints(\n screen: ScreenDescriptor,\n targets: TargetDescriptor[],\n flows: FlowDescriptor[],\n): ScreenAgentHints | undefined {\n const preferredTargets = targets\n .filter((target) => ['submit', 'button', 'list'].includes(target.role))\n .slice(0, 8)\n .map((target) => target.id);\n const commonTasks = flows.slice(0, 6).map((flow) => flow.title);\n const safetyNotes = screen.actions\n .filter((action) => action.destructive || action.requiresConfirmation)\n .map((action) => `${action.id} requires confirmation`);\n const firstAsyncAction = screen.actions.find((action) => action.appilotsInferred?.isAsyncTrigger);\n\n const hints: ScreenAgentHints = {\n primaryGoal: synthesizePrimaryGoal(screen),\n commonTasks,\n preferredTargets,\n ...(firstAsyncAction ? { waitPolicy: waitPolicyForAction(firstAsyncAction) } : {}),\n ...(safetyNotes.length > 0 ? { safetyNotes } : {}),\n };\n\n return hints.primaryGoal || commonTasks.length > 0 || preferredTargets.length > 0\n ? hints\n : undefined;\n}\n\nfunction synthesizePrimaryGoal(screen: ScreenDescriptor): string | undefined {\n const goals: string[] = [];\n const collections = screen.collections ?? [];\n\n if (collections.length > 0) {\n const collectionNames = collections\n .map((collection) => collection.itemType ?? collection.dataSource ?? collection.id)\n .filter(Boolean)\n .slice(0, 3);\n goals.push(\n collectionNames.length > 0\n ? `Browse and act on ${collectionNames.join(', ')} list data`\n : 'Browse and act on list data',\n );\n }\n\n const uniqueFields = new Map<string, FormFieldDescriptor>();\n for (const form of screen.forms) {\n for (const field of form.fields) {\n uniqueFields.set(field.name, field);\n }\n }\n const fieldCount = uniqueFields.size;\n if (fieldCount > 0) {\n const requiredCount = Array.from(uniqueFields.values()).filter((field) => field.required).length;\n const fieldLabel = fieldCount === 1 ? 'field' : 'fields';\n goals.push(\n requiredCount > 0\n ? `Complete a form with ${fieldCount} ${fieldLabel} (${requiredCount} required)`\n : `Complete a form with ${fieldCount} ${fieldLabel}`,\n );\n }\n\n const navigationCount = screen.actions.filter((action) => action.targetScreen).length;\n if (navigationCount > 0) {\n goals.push(`Open ${navigationCount} related screen${navigationCount === 1 ? '' : 's'}`);\n }\n\n const submitCount = screen.actions.filter((action) => action.type === 'submit').length;\n if (submitCount > 0) {\n goals.push(`Submit ${submitCount === 1 ? 'the primary form' : `${submitCount} forms/actions`}`);\n }\n\n const asyncCount = screen.actions.filter((action) => action.appilotsInferred?.isAsyncTrigger).length;\n if (asyncCount > 0) {\n goals.push(`Wait for ${asyncCount === 1 ? 'async feedback' : 'async action feedback'}`);\n }\n\n if (goals.length > 0) return goals.join('; ');\n if (screen.title) return `Screen labeled \"${screen.title}\"`;\n return undefined;\n}\n","import path from 'node:path';\nimport glob from 'fast-glob';\nimport type { AnalyzerConfig, FormDescriptor, FormFieldDescriptor, ScreenDescriptor } from '../types';\nimport { ScreenAnalyzer } from './ScreenAnalyzer';\nimport { NavigationAnalyzer } from './NavigationAnalyzer';\nimport { ComponentAnalyzer } from './ComponentAnalyzer';\nimport { FormAnalyzer } from './FormAnalyzer';\nimport type { PlatformAnalyzer, PlatformAnalyzerOptions, PlatformAnalyzerResult } from './PlatformAnalyzer';\n\n/**\n * Default `PlatformAnalyzer` implementation — the React Native Babel/JSX\n * analyzer pipeline that existed inline in `MCPGenerator` before the\n * platform-analyzer seam was introduced. This is a straight move: the\n * orchestration (run `ScreenAnalyzer` + `NavigationAnalyzer`, glob every\n * source file, run `ComponentAnalyzer` + `FormAnalyzer` per file, merge\n * their output into each screen's forms/components) is unchanged, so\n * output for existing React Native projects is byte-for-byte identical.\n */\nexport class ReactNativePlatformAnalyzer implements PlatformAnalyzer {\n readonly platform = 'react-native';\n\n async analyze(\n config: AnalyzerConfig,\n options: PlatformAnalyzerOptions,\n ): Promise<PlatformAnalyzerResult> {\n const screenAnalyzer = new ScreenAnalyzer(config, {\n strictScreens: options.strictScreens ?? true,\n screenPatterns: options.screenPatterns,\n });\n const navigationAnalyzer = new NavigationAnalyzer(config, {\n navigationInclude: options.navigationInclude,\n navigationExclude: options.navigationExclude,\n });\n const componentAnalyzer = new ComponentAnalyzer(config);\n const formAnalyzer = new FormAnalyzer(config);\n\n console.log('[ReactNativePlatformAnalyzer] Running analyzers...');\n const [screens, navigation] = await Promise.all([\n screenAnalyzer.analyze(),\n navigationAnalyzer.analyze(),\n ]);\n\n console.log(\n `[ReactNativePlatformAnalyzer] Screen and navigation analysis complete. Found ${screens.length} screens`,\n );\n\n // Find all screen files to run ComponentAnalyzer and FormAnalyzer on each\n const screenFiles = await glob(config.include || ['**/*.tsx', '**/*.ts'], {\n cwd: config.rootDir,\n ignore: config.exclude || ['**/node_modules/**'],\n });\n\n console.log(\n `[ReactNativePlatformAnalyzer] Analyzing components and forms from ${screenFiles.length} files...`,\n );\n\n // Run ComponentAnalyzer and FormAnalyzer on each screen file\n const enrichmentPromises = screenFiles.map(async (file: string) => {\n const filePath = path.resolve(config.rootDir, file);\n try {\n const [components, forms] = await Promise.all([\n componentAnalyzer.analyzeFile(filePath),\n formAnalyzer.analyzeFile(filePath),\n ]);\n return { filePath, components, forms };\n } catch (error) {\n console.warn(`[ReactNativePlatformAnalyzer] Failed to analyze ${file}:`, error);\n return { filePath, components: [], forms: [] };\n }\n });\n\n const enrichmentResults = await Promise.all(enrichmentPromises);\n\n // Create a map of file path to enrichment data\n const enrichmentMap = new Map<string, { components: any[]; forms: any[] }>();\n for (const result of enrichmentResults) {\n enrichmentMap.set(result.filePath, {\n components: result.components,\n forms: result.forms,\n });\n }\n\n // Enrich screens with components and forms from analyzers\n const enrichedScreens = screens.map((screen) => {\n const enrichment = enrichmentMap.get(screen.filePath);\n if (enrichment) {\n // Merge components (avoid duplicates)\n const existingComponentNames = new Set(screen.components.map((c) => c.name));\n const newComponents = enrichment.components.filter(\n (c: any) => !existingComponentNames.has(c.name),\n );\n\n // Merge forms. registerScreen/ScreenAnalyzer forms are the primary\n // contract; FormAnalyzer enriches them with submit/validation data.\n const mergedForms: FormDescriptor[] = screen.forms.map((form) => ({\n ...form,\n fields: [...form.fields],\n }));\n for (const newForm of enrichment.forms) {\n const existingForm =\n mergedForms.find((form) => form.id === newForm.id) ??\n this.findFormWithSharedFields(mergedForms, newForm);\n if (existingForm) {\n this.mergeForm(existingForm, newForm);\n } else {\n mergedForms.push({\n ...newForm,\n fields: [...newForm.fields],\n submitAction: this.namedSubmitAction(newForm.submitAction),\n });\n }\n }\n\n return {\n ...screen,\n components: [...screen.components, ...newComponents],\n forms: mergedForms,\n } as ScreenDescriptor;\n }\n return screen;\n });\n\n return {\n screens: enrichedScreens,\n navigation,\n analyzedFiles: screenFiles.length,\n ...(screenAnalyzer.screensFilteredOut > 0\n ? { screensFilteredOut: screenAnalyzer.screensFilteredOut }\n : {}),\n };\n }\n\n private mergeForm(target: FormDescriptor, source: FormDescriptor): void {\n for (const field of source.fields) {\n const existingField = this.findEquivalentField(target.fields, field);\n if (existingField) {\n this.mergeField(existingField, field);\n } else {\n target.fields.push(field);\n }\n }\n target.submitAction = target.submitAction ?? this.namedSubmitAction(source.submitAction);\n target.validationRules = source.validationRules\n ? { ...source.validationRules, ...(target.validationRules ?? {}) }\n : target.validationRules;\n }\n\n private findEquivalentField(\n fields: FormFieldDescriptor[],\n incoming: FormFieldDescriptor,\n ): FormFieldDescriptor | undefined {\n return fields.find((field) => {\n if (field.name && incoming.name && field.name === incoming.name) return true;\n if (field.valueBinding && incoming.valueBinding && field.valueBinding === incoming.valueBinding) return true;\n if (field.locator?.id && incoming.locator?.id && field.locator.id === incoming.locator.id) return true;\n if (field.placeholder && incoming.placeholder && field.placeholder === incoming.placeholder) return true;\n if (\n field.locator?.accessibilityLabel &&\n incoming.locator?.accessibilityLabel &&\n field.locator.accessibilityLabel === incoming.locator.accessibilityLabel\n ) {\n return true;\n }\n return false;\n });\n }\n\n private mergeField(target: FormFieldDescriptor, source: FormFieldDescriptor): void {\n if (this.isWeakInferredFieldName(target.name) && !this.isWeakInferredFieldName(source.name)) {\n target.name = source.name;\n }\n target.label = target.label ?? source.label;\n target.placeholder = target.placeholder ?? source.placeholder;\n target.options = target.options ?? source.options;\n target.locator = target.locator ?? source.locator;\n target.sourceComponent = target.sourceComponent ?? source.sourceComponent;\n target.valueBinding = target.valueBinding ?? source.valueBinding;\n target.errorBinding = target.errorBinding ?? source.errorBinding;\n target.required = target.required || source.required;\n if (target.type === 'text' && source.type !== 'text') {\n target.type = source.type;\n }\n }\n\n private namedSubmitAction(submitAction: string | undefined): string | undefined {\n return submitAction && submitAction !== 'anonymous' ? submitAction : undefined;\n }\n\n private isWeakInferredFieldName(name: string): boolean {\n return /^(text|value|input|query|search|selected|checked)$/i.test(name);\n }\n\n private findFormWithSharedFields(\n forms: FormDescriptor[],\n incoming: FormDescriptor,\n ): FormDescriptor | undefined {\n if (incoming.fields.length === 0) return undefined;\n\n let best: { form: FormDescriptor; overlap: number } | undefined;\n for (const form of forms) {\n const overlap = incoming.fields.filter((field) => this.findEquivalentField(form.fields, field)).length;\n if (overlap > 0 && (!best || overlap > best.overlap)) {\n best = { form, overlap };\n }\n }\n\n return best?.form;\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport traverse from '@babel/traverse';\nimport * as BabelTypes from '@babel/types';\nimport glob from 'fast-glob';\nimport { parseSource } from '../ast/parse';\nimport { classifyJsxComponent, pressHandlerProp } from '../ast/jsx/classify';\nimport { collectFunctions } from '../ast/functions/collect';\nimport { analyzeFunctionBehavior } from '../ast/functions/analyze-async';\nimport { extractNavigationCalls } from '../ast/navigation/calls';\nimport {\n extractDestructiveJsDocTargets,\n extractPermissionsFromJsDoc,\n} from '../extractors/appilots/jsdoc';\nimport type {\n AnalyzerConfig,\n ScreenDescriptor,\n FormDescriptor,\n FormFieldDescriptor,\n ActionDescriptor,\n ComponentDescriptor,\n CollectionDescriptor,\n RowActionDescriptor,\n AppilotsInferredAction,\n LocatorDescriptor,\n} from '../types';\n\nexport {\n extractDestructiveJsDocTargets,\n extractPermissionsFromJsDoc,\n} from '../extractors/appilots/jsdoc';\n\n/**\n * Analyzes React Native source files to extract screen definitions,\n * their components, forms, and available actions.\n *\n * The analyzer uses Babel AST to:\n * 1. Extract optional registerScreen() calls (developer-provided metadata)\n * 2. Detect exported component names\n * 3. Find navigation patterns (navigation.navigate calls)\n * 4. Identify form inputs (TextInput, Input components)\n * 5. Extract button/action handlers\n *\n * §1 Strict mode: when `strictScreens` is enabled in config, only files\n * containing a `registerScreen()` call or matching `screenPatterns` globs\n * are included in the output. This avoids components/hooks/utils being\n * listed as screens.\n */\nexport class ScreenAnalyzer {\n private config: AnalyzerConfig;\n private verbose = process.env.VERBOSE === 'true';\n /** When true, only files with registerScreen or matching screen patterns are included */\n private strictScreens: boolean;\n /** Glob patterns that identify screen files in strict mode */\n private screenPatterns: string[];\n /** §D: Count of screens filtered out in strict mode (available after analyze()) */\n public screensFilteredOut = 0;\n\n constructor(\n config: AnalyzerConfig,\n options?: { strictScreens?: boolean; screenPatterns?: string[] },\n ) {\n this.config = config;\n this.strictScreens = options?.strictScreens ?? false;\n this.screenPatterns = options?.screenPatterns ?? [\n '**/*Screen.{ts,tsx}',\n '**/screens/**/*.{ts,tsx}',\n ];\n }\n\n /** Analyze all screens in the project */\n async analyze(): Promise<ScreenDescriptor[]> {\n const { include = ['src/**/*Screen.{ts,tsx}'], exclude = ['node_modules/**'] } = this.config;\n\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] Searching with patterns:`, include);\n if (this.strictScreens) {\n console.log(`[ScreenAnalyzer] Strict mode ON — screen patterns:`, this.screenPatterns);\n }\n }\n\n // Find all matching files\n const files = await glob(include, {\n cwd: this.config.rootDir,\n ignore: exclude,\n });\n\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] Found ${files.length} files`);\n }\n\n // In strict mode, pre-compute which files match screen patterns\n let screenPatternFiles: Set<string> | null = null;\n if (this.strictScreens) {\n const matched = await glob(this.screenPatterns, {\n cwd: this.config.rootDir,\n ignore: exclude,\n });\n screenPatternFiles = new Set(matched.map((f) => path.resolve(this.config.rootDir, f)));\n }\n\n const screens: ScreenDescriptor[] = [];\n this.screensFilteredOut = 0;\n\n for (const file of files) {\n const filePath = path.resolve(this.config.rootDir, file);\n try {\n const descriptor = await this.analyzeFile(filePath);\n if (!descriptor) continue;\n\n // §1+§B: In strict mode, filter out non-screen files\n // Uses actual registerScreen() call detection, not optional metadata fields\n if (this.strictScreens) {\n const hasRegisterScreen = (descriptor as any).__hasRegisterScreen === true;\n const matchesPattern = screenPatternFiles?.has(filePath) ?? false;\n\n if (!hasRegisterScreen && !matchesPattern) {\n this.screensFilteredOut++;\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] ✗ Filtered (strict): ${file}`);\n }\n continue;\n }\n }\n\n screens.push(descriptor);\n if (this.verbose) {\n console.log(`[ScreenAnalyzer] ✓ Analyzed: ${descriptor.name} (${file})`);\n }\n } catch (error) {\n if (this.verbose) {\n console.warn(\n `[ScreenAnalyzer] Failed to parse ${file}:`,\n error instanceof Error ? error.message : error,\n );\n }\n // Skip files that fail to parse\n }\n }\n\n if (this.verbose && this.strictScreens) {\n console.log(\n `[ScreenAnalyzer] Strict mode: ${screens.length} included, ${this.screensFilteredOut} filtered out`,\n );\n }\n\n return screens;\n }\n\n /** Analyze a single file. Returns descriptor + whether registerScreen was found. */\n async analyzeFile(filePath: string): Promise<ScreenDescriptor | null> {\n const source = await fs.readFile(filePath, 'utf-8');\n const name = this.extractScreenName(filePath);\n\n // Parse the file with the shared parser so every extractor sees\n // the same syntax support and parser changes stay centralized.\n const ast = parseSource(source, this.config.parserPlugins as any);\n\n // Extract metadata from registerScreen call\n const registerScreenMeta = this.extractRegisterScreenMetadata(ast);\n\n // §B: Track whether registerScreen() was actually called in this file\n const hasRegisterScreenCall = this.detectRegisterScreenCall(ast);\n\n // Extract component name (default export)\n const componentName = this.extractDefaultComponentName(ast);\n\n // Extract navigation targets from AST\n const navigationTargets = this.extractNavigationTargets(ast);\n\n // Extract forms and fields. registerScreen metadata is the app\n // author's explicit contract, so keep it ahead of JSX inference.\n const forms = this.mergeForms(registerScreenMeta?.forms ?? [], this.extractForms(ast));\n\n // Extract components\n const components = this.extractComponents(ast);\n\n // Extract actions\n const actions = this.extractActions(ast, registerScreenMeta);\n\n // Extract list/collection semantics. This is the static complement\n // to the SDK's runtime list snapshot: it tells the agent what a row\n // represents and what pressing that row is expected to do.\n const collections = this.extractCollections(ast);\n\n // Extract @appilots-permissions / @appilots-pii JSDoc metadata\n // (BACKLOG 2.1). Reads source comments — runs against the raw\n // file text to keep the implementation simple (Babel comment\n // tokens differ between configurations).\n const permissionsFromJsDoc = extractPermissionsFromJsDoc(source);\n\n // BACKLOG 2.2 — `@appilots-destructive <action-id>[, <id>...]`\n // marks specific extracted actions as destructive. Without an\n // arg, marks ALL actions on the screen as destructive (rare,\n // but supported for screens like \"DeleteAccount\").\n const destructiveTags = extractDestructiveJsDocTargets(source);\n if (destructiveTags) {\n for (const action of actions) {\n if (destructiveTags === '*' || destructiveTags.has(action.id)) {\n action.destructive = true;\n }\n }\n }\n\n // Merge registerScreen metadata with AST analysis\n const descriptor: ScreenDescriptor = {\n name: registerScreenMeta?.name || name,\n filePath,\n title: registerScreenMeta?.title,\n description: registerScreenMeta?.description,\n components,\n forms,\n actions,\n navigationTargets,\n ...(collections.length > 0 ? { collections } : {}),\n ...(registerScreenMeta?.suggestedPrompts && registerScreenMeta.suggestedPrompts.length > 0\n ? { suggestedPrompts: registerScreenMeta.suggestedPrompts }\n : {}),\n ...(permissionsFromJsDoc\n ? {\n permissions: permissionsFromJsDoc,\n ...(permissionsFromJsDoc.isPii ? { isPii: true } : {}),\n }\n : {}),\n };\n\n // Attach flag for strict mode filtering (not part of the public type)\n (descriptor as any).__hasRegisterScreen = hasRegisterScreenCall;\n\n return descriptor;\n }\n\n /**\n * §B: Detect actual presence of registerScreen() call in the AST.\n * This is more reliable than checking for title/description which are optional.\n */\n private detectRegisterScreenCall(ast: BabelTypes.File): boolean {\n let found = false;\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n if (found) return;\n const callee = nodePath.node.callee;\n\n if (\n (BabelTypes.isIdentifier(callee) && callee.name === 'registerScreen') ||\n (BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'registerScreen')\n ) {\n found = true;\n nodePath.stop();\n }\n },\n });\n\n return found;\n }\n\n /**\n * Extract metadata from registerScreen() call\n */\n private extractRegisterScreenMetadata(\n ast: BabelTypes.File,\n ): (Partial<ScreenDescriptor> & { name: string }) | null {\n let metadata: (Partial<ScreenDescriptor> & { name: string }) | null = null;\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n const callee = nodePath.node.callee;\n\n // Check if this is a registerScreen call\n if (\n (BabelTypes.isIdentifier(callee) && callee.name === 'registerScreen') ||\n (BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'registerScreen')\n ) {\n // First argument should be an object expression\n const arg = nodePath.node.arguments[0];\n if (BabelTypes.isObjectExpression(arg)) {\n metadata = this.parseRegisterScreenObject(arg);\n }\n }\n },\n });\n\n return metadata;\n }\n\n /**\n * Parse the object passed to registerScreen()\n */\n private parseRegisterScreenObject(\n objExpr: BabelTypes.ObjectExpression,\n ): Partial<ScreenDescriptor> & { name: string } {\n const result: Partial<ScreenDescriptor> & { name: string } = {\n name: '',\n actions: [],\n forms: [],\n navigationTargets: [],\n components: [],\n };\n\n for (const prop of objExpr.properties) {\n if (!BabelTypes.isObjectProperty(prop) && !BabelTypes.isObjectMethod(prop)) {\n continue;\n }\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n if (BabelTypes.isObjectProperty(prop)) {\n const value = prop.value;\n\n if (key === 'name' && BabelTypes.isStringLiteral(value)) {\n result.name = value.value;\n } else if (key === 'title' && BabelTypes.isStringLiteral(value)) {\n result.title = value.value;\n } else if (key === 'description' && BabelTypes.isStringLiteral(value)) {\n result.description = value.value;\n } else if (key === 'actions' && BabelTypes.isArrayExpression(value)) {\n result.actions = this.parseActionsArray(value);\n } else if (key === 'fields' && BabelTypes.isArrayExpression(value)) {\n // Convert fields to forms\n const fields = this.parseFieldsArray(value);\n if (fields.length > 0) {\n result.forms = [\n {\n id: 'default',\n fields,\n },\n ];\n }\n } else if (key === 'suggestedPrompts' && BabelTypes.isArrayExpression(value)) {\n // Each entry must be a static string literal — dynamic values can't\n // be safely inlined into the MCP doc, so they're silently skipped.\n const prompts: string[] = [];\n for (const element of value.elements) {\n if (BabelTypes.isStringLiteral(element)) {\n const trimmed = element.value.trim();\n if (trimmed.length > 0) prompts.push(trimmed);\n }\n }\n if (prompts.length > 0) {\n result.suggestedPrompts = prompts;\n }\n }\n }\n }\n\n return result;\n }\n\n /**\n * Parse actions array from registerScreen\n */\n private parseActionsArray(arr: BabelTypes.ArrayExpression): ActionDescriptor[] {\n const actions: ActionDescriptor[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n const action = this.parseActionObject(element);\n if (action.id) {\n actions.push(action);\n }\n }\n }\n\n return actions;\n }\n\n /**\n * Parse a single action object\n */\n private parseActionObject(obj: BabelTypes.ObjectExpression): ActionDescriptor {\n const action: ActionDescriptor = {\n id: '',\n type: 'custom',\n };\n\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n const value = prop.value;\n\n if (key === 'id' && BabelTypes.isStringLiteral(value)) {\n action.id = value.value;\n } else if (key === 'label' && BabelTypes.isStringLiteral(value)) {\n action.label = value.value;\n } else if (key === 'type' && BabelTypes.isStringLiteral(value)) {\n action.type = (value.value as any) || 'custom';\n } else if (key === 'targetScreen' && BabelTypes.isStringLiteral(value)) {\n action.targetScreen = value.value;\n } else if (key === 'description' && BabelTypes.isStringLiteral(value)) {\n action.description = value.value;\n } else if (key === 'handler' && BabelTypes.isStringLiteral(value)) {\n action.handler = value.value;\n } else if (key === 'requiresConfirmation' && BabelTypes.isBooleanLiteral(value)) {\n action.requiresConfirmation = value.value;\n } else if (key === 'destructive' && BabelTypes.isBooleanLiteral(value)) {\n action.destructive = value.value;\n } else if (key === 'effect' && BabelTypes.isStringLiteral(value)) {\n action.effect = value.value;\n } else if (key === 'riskLevel' && BabelTypes.isStringLiteral(value)) {\n action.riskLevel = value.value;\n } else if (key === 'nativeConfirmationExpected' && BabelTypes.isBooleanLiteral(value)) {\n action.nativeConfirmationExpected = value.value;\n } else if (key === 'appilotsInferred' && BabelTypes.isObjectExpression(value)) {\n action.appilotsInferred = this.parseAppilotsInferredObject(value);\n }\n }\n\n return action;\n }\n\n private parseAppilotsInferredObject(obj: BabelTypes.ObjectExpression): AppilotsInferredAction {\n const out: AppilotsInferredAction = {};\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n const value = prop.value;\n if (key === 'isAsyncTrigger' && BabelTypes.isBooleanLiteral(value)) {\n out.isAsyncTrigger = value.value;\n } else if (key === 'expectedOutcome' && BabelTypes.isStringLiteral(value)) {\n out.expectedOutcome = value.value as AppilotsInferredAction['expectedOutcome'];\n } else if (key === 'loadingStateBindings' && BabelTypes.isArrayExpression(value)) {\n out.loadingStateBindings = value.elements\n .filter((el): el is BabelTypes.StringLiteral => BabelTypes.isStringLiteral(el))\n .map((el) => el.value);\n }\n }\n return out;\n }\n\n /**\n * Parse fields array from registerScreen\n */\n private parseFieldsArray(arr: BabelTypes.ArrayExpression): FormFieldDescriptor[] {\n const fields: FormFieldDescriptor[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n const field = this.parseFieldObject(element);\n if (field.name) {\n fields.push(field);\n }\n }\n }\n\n return fields;\n }\n\n /**\n * Parse a single field object\n */\n private parseFieldObject(obj: BabelTypes.ObjectExpression): FormFieldDescriptor {\n const field: FormFieldDescriptor = {\n name: '',\n type: 'text',\n required: false,\n };\n\n for (const prop of obj.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n const value = prop.value;\n\n if (key === 'id' && BabelTypes.isStringLiteral(value)) {\n field.name = value.value;\n } else if (key === 'label' && BabelTypes.isStringLiteral(value)) {\n field.label = value.value;\n } else if (key === 'type' && BabelTypes.isStringLiteral(value)) {\n field.type = (value.value as any) || 'text';\n } else if (key === 'required' && BabelTypes.isBooleanLiteral(value)) {\n field.required = value.value;\n } else if (key === 'placeholder' && BabelTypes.isStringLiteral(value)) {\n field.placeholder = value.value;\n } else if (key === 'defaultValue' && BabelTypes.isExpression(value)) {\n field.defaultValue = this.extractLiteralValue(value);\n } else if (key === 'options' && BabelTypes.isArrayExpression(value)) {\n field.options = this.parseOptionsArray(value);\n }\n }\n\n return field;\n }\n\n /**\n * Parse options array for select fields\n */\n private parseOptionsArray(arr: BabelTypes.ArrayExpression): { label: string; value: string }[] {\n const options: { label: string; value: string }[] = [];\n\n for (const element of arr.elements) {\n if (BabelTypes.isObjectExpression(element)) {\n let label = '';\n let value = '';\n\n for (const prop of element.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n\n const key = BabelTypes.isIdentifier(prop.key) ? prop.key.name : null;\n if (!key) continue;\n\n if (key === 'label' && BabelTypes.isStringLiteral(prop.value)) {\n label = prop.value.value;\n } else if (key === 'value' && BabelTypes.isStringLiteral(prop.value)) {\n value = prop.value.value;\n }\n }\n\n if (label && value) {\n options.push({ label, value });\n }\n }\n }\n\n return options;\n }\n\n private mergeForms(primary: FormDescriptor[], secondary: FormDescriptor[]): FormDescriptor[] {\n const out: FormDescriptor[] = primary.map((form) => ({\n ...form,\n fields: [...form.fields],\n }));\n\n for (const form of secondary) {\n const existing =\n out.find((candidate) => candidate.id === form.id) ??\n this.findFormWithSharedFields(out, form);\n if (!existing) {\n out.push({\n ...form,\n fields: [...form.fields],\n submitAction: this.namedSubmitAction(form.submitAction),\n });\n continue;\n }\n\n for (const field of form.fields) {\n const existingField = this.findEquivalentField(existing.fields, field);\n if (existingField) {\n this.mergeFieldMetadata(existingField, field);\n } else {\n existing.fields.push(field);\n }\n }\n existing.submitAction = existing.submitAction ?? this.namedSubmitAction(form.submitAction);\n existing.validationRules = form.validationRules\n ? { ...form.validationRules, ...(existing.validationRules ?? {}) }\n : existing.validationRules;\n }\n\n return out;\n }\n\n private findEquivalentField(\n fields: FormFieldDescriptor[],\n incoming: FormFieldDescriptor,\n ): FormFieldDescriptor | undefined {\n return fields.find((field) => {\n if (field.name && incoming.name && field.name === incoming.name) return true;\n if (\n field.valueBinding &&\n incoming.valueBinding &&\n field.valueBinding === incoming.valueBinding\n )\n return true;\n if (field.locator?.id && incoming.locator?.id && field.locator.id === incoming.locator.id)\n return true;\n if (field.placeholder && incoming.placeholder && field.placeholder === incoming.placeholder)\n return true;\n if (\n field.locator?.accessibilityLabel &&\n incoming.locator?.accessibilityLabel &&\n field.locator.accessibilityLabel === incoming.locator.accessibilityLabel\n ) {\n return true;\n }\n return false;\n });\n }\n\n private namedSubmitAction(submitAction: string | undefined): string | undefined {\n return submitAction && submitAction !== 'anonymous' ? submitAction : undefined;\n }\n\n private mergeFieldMetadata(target: FormFieldDescriptor, source: FormFieldDescriptor): void {\n if (this.isWeakInferredFieldName(target.name) && !this.isWeakInferredFieldName(source.name)) {\n target.name = source.name;\n }\n target.label = target.label ?? source.label;\n target.placeholder = target.placeholder ?? source.placeholder;\n target.options = target.options ?? source.options;\n target.locator = target.locator ?? source.locator;\n if (target.locator && source.locator) {\n target.locator = this.mergeLocator(source.locator, target.locator);\n }\n target.sourceComponent = target.sourceComponent ?? source.sourceComponent;\n target.valueBinding = target.valueBinding ?? source.valueBinding;\n target.errorBinding = target.errorBinding ?? source.errorBinding;\n target.required = target.required || source.required;\n if (target.type === 'text' && source.type !== 'text') {\n target.type = source.type;\n }\n }\n\n private findFormWithSharedFields(\n forms: FormDescriptor[],\n incoming: FormDescriptor,\n ): FormDescriptor | undefined {\n if (incoming.fields.length === 0) return undefined;\n\n let best: { form: FormDescriptor; overlap: number } | undefined;\n for (const form of forms) {\n const overlap = incoming.fields.filter((field) =>\n this.findEquivalentField(form.fields, field),\n ).length;\n if (overlap > 0 && (!best || overlap > best.overlap)) {\n best = { form, overlap };\n }\n }\n\n return best?.form;\n }\n\n /**\n * Extract the name of the default exported component\n */\n private extractDefaultComponentName(ast: BabelTypes.File): string {\n let componentName = '';\n\n traverse(ast, {\n ExportDefaultDeclaration: (nodePath) => {\n const declaration = nodePath.node.declaration;\n\n if (BabelTypes.isFunctionDeclaration(declaration) && declaration.id?.name) {\n componentName = declaration.id.name;\n } else if (BabelTypes.isArrowFunctionExpression(declaration)) {\n // Arrow function export - try to get from parent variable declaration\n componentName = 'Component';\n }\n },\n VariableDeclarator: (nodePath) => {\n if (\n BabelTypes.isIdentifier(nodePath.node.id) &&\n (BabelTypes.isArrowFunctionExpression(nodePath.node.init) ||\n BabelTypes.isFunctionExpression(nodePath.node.init))\n ) {\n // Check if this is exported\n const parent = nodePath.parent;\n if (BabelTypes.isVariableDeclaration(parent) && parent.declare === true) {\n componentName = nodePath.node.id.name;\n }\n }\n },\n });\n\n return componentName;\n }\n\n /**\n * Extract navigation targets from navigation.navigate() calls\n */\n private extractNavigationTargets(ast: BabelTypes.File): string[] {\n const targets = new Set<string>();\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n const callee = nodePath.node.callee;\n\n // Match navigation.navigate('ScreenName') pattern\n if (\n BabelTypes.isMemberExpression(callee) &&\n BabelTypes.isIdentifier(callee.object) &&\n callee.object.name === 'navigation' &&\n BabelTypes.isIdentifier(callee.property) &&\n callee.property.name === 'navigate'\n ) {\n const arg = nodePath.node.arguments[0];\n if (BabelTypes.isStringLiteral(arg)) {\n targets.add(arg.value);\n }\n }\n },\n });\n\n return Array.from(targets).sort();\n }\n\n /**\n * Extract form information from JSX\n */\n private extractForms(ast: BabelTypes.File): FormDescriptor[] {\n const forms: FormDescriptor[] = [];\n const fields = new Map<string, FormFieldDescriptor>();\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n // Detect native inputs and custom form controls by their prop\n // contract, not by app-specific component names.\n const role = classifyJsxComponent(componentName, element);\n if (['input', 'select', 'toggle', 'date'].includes(role)) {\n const field = this.extractFieldFromInputElement(element);\n if (field.name) {\n fields.set(field.name, field);\n }\n }\n }\n },\n });\n\n // Create a default form if we found any fields\n if (fields.size > 0) {\n forms.push({\n id: 'default',\n fields: Array.from(fields.values()),\n });\n }\n\n return forms;\n }\n\n /**\n * Extract field metadata from a TextInput/Input element\n */\n private extractFieldFromInputElement(element: BabelTypes.JSXOpeningElement): FormFieldDescriptor {\n const field: FormFieldDescriptor = {\n name: '',\n type: 'text',\n required: false,\n };\n const componentName = BabelTypes.isJSXIdentifier(element.name) ? element.name.name : '';\n const role = componentName ? classifyJsxComponent(componentName, element) : 'custom';\n field.sourceComponent = componentName || undefined;\n\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value) {\n if (BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'placeholder') {\n field.placeholder = attr.value.value;\n } else if (attrName === 'appilotsId') {\n field.name = attr.value.value;\n field.locator = this.mergeLocator(field.locator, {\n id: attr.value.value,\n appilotsId: attr.value.value,\n source: 'appilotsId',\n });\n } else if (attrName === 'testID') {\n // Use testID to derive field name if not set\n if (!field.name) {\n field.name = attr.value.value.replace(/^(input-|field-|txt-)/, '');\n }\n field.locator = this.mergeLocator(field.locator, {\n id: field.name || attr.value.value,\n testID: attr.value.value,\n source: 'testID',\n });\n } else if (attrName === 'label') {\n field.label = attr.value.value;\n } else if (attrName === 'accessibilityLabel') {\n if (!field.label) field.label = attr.value.value;\n field.locator = this.mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: this.slugifyActionId(attr.value.value) }),\n accessibilityLabel: attr.value.value,\n source: field.locator?.source ?? 'accessibilityLabel',\n });\n } else if (attrName === 'keyboardType') {\n if (attr.value.value === 'email-address' || attr.value.value === 'email')\n field.type = 'email';\n if (attr.value.value === 'phone-pad') field.type = 'phone';\n if (attr.value.value === 'numeric' || attr.value.value === 'number-pad')\n field.type = 'number';\n }\n } else if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n // Handle dynamic attributes\n if (attrName === 'value' && BabelTypes.isIdentifier(attr.value.expression)) {\n // Try to infer field name from variable name\n if (!field.name) {\n field.name = attr.value.expression.name;\n }\n field.valueBinding = attr.value.expression.name;\n } else if (attrName === 'checked' && BabelTypes.isIdentifier(attr.value.expression)) {\n if (!field.name) field.name = attr.value.expression.name;\n field.valueBinding = attr.value.expression.name;\n } else if (attrName === 'error') {\n field.errorBinding = this.expressionToBinding(attr.value.expression);\n } else if (\n attrName === 'required' &&\n BabelTypes.isBooleanLiteral(attr.value.expression)\n ) {\n field.required = attr.value.expression.value;\n }\n }\n } else if (attrName === 'required') {\n field.required = true;\n }\n }\n\n if (role === 'select') field.type = 'select';\n if (role === 'toggle') field.type = 'toggle';\n if (role === 'date') field.type = 'date';\n if (!field.name || this.isWeakInferredFieldName(field.name)) {\n const label = field.locator?.accessibilityLabel ?? field.label ?? field.placeholder;\n if (label) field.name = this.slugifyActionId(label);\n }\n if (!field.locator && field.name) {\n field.locator = { id: field.name, label: field.label, source: 'inferred' };\n } else if (field.locator && !field.locator.id && field.name) {\n field.locator = this.mergeLocator(field.locator, {\n id: field.name,\n label: field.label,\n source: field.locator.source ?? 'inferred',\n });\n }\n\n return field;\n }\n\n private isWeakInferredFieldName(name: string): boolean {\n return /^(text|value|input|query|search|selected|checked)$/i.test(name);\n }\n\n /**\n * Extract component structure from JSX\n */\n private extractComponents(ast: BabelTypes.File): ComponentDescriptor[] {\n const components: ComponentDescriptor[] = [];\n const seen = new Set<string>();\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n if (seen.has(componentName)) return;\n seen.add(componentName);\n\n const type = this.inferComponentType(componentName);\n const component: ComponentDescriptor = {\n name: componentName,\n type,\n };\n\n // Extract testID and accessibilityLabel\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value && BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'testID') {\n component.testID = attr.value.value;\n } else if (attrName === 'accessibilityLabel') {\n component.accessibilityLabel = attr.value.value;\n }\n }\n }\n\n components.push(component);\n }\n },\n });\n\n return components;\n }\n\n /**\n * Infer component type from component name\n */\n private inferComponentType(name: string): ComponentDescriptor['type'] {\n const role = classifyJsxComponent(name);\n if (role === 'select' || role === 'toggle' || role === 'date') {\n return 'input';\n }\n if (role === 'input') {\n return 'input';\n }\n if (role === 'button') {\n return 'button';\n }\n if (role === 'list') {\n return 'list';\n }\n if (role === 'modal') {\n return 'modal';\n }\n if (role === 'view') {\n return 'view';\n }\n return 'custom';\n }\n\n /**\n * Extract actions from button/touchable elements\n */\n private extractActions(\n ast: BabelTypes.File,\n registerScreenMeta: (Partial<ScreenDescriptor> & { name: string }) | null,\n ): ActionDescriptor[] {\n // Start with actions from registerScreen if available\n const actions = [...(registerScreenMeta?.actions || [])];\n const actionIds = new Set(actions.map((a) => a.id));\n const actionLabels = new Map(\n actions.filter((a) => a.label).map((a) => [this.normalizeLabel(a.label!), a] as const),\n );\n\n // Extract additional actions from JSX buttons/touchables\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n\n if (BabelTypes.isJSXIdentifier(element.name)) {\n const componentName = element.name.name;\n\n if (classifyJsxComponent(componentName, element) === 'button') {\n const action = this.extractActionFromButton(element);\n const existingByLabel = action.label\n ? actionLabels.get(this.normalizeLabel(action.label))\n : undefined;\n if (existingByLabel) {\n this.mergeActionMetadata(existingByLabel, action);\n return;\n }\n if (action.id && !actionIds.has(action.id)) {\n actions.push(action);\n actionIds.add(action.id);\n if (action.label) actionLabels.set(this.normalizeLabel(action.label), action);\n }\n }\n }\n },\n });\n\n this.enrichActionsFromHandlers(ast, actions);\n\n return actions;\n }\n\n private normalizeLabel(label: string): string {\n return label\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '');\n }\n\n private mergeActionMetadata(target: ActionDescriptor, source: ActionDescriptor): void {\n target.handler = target.handler ?? source.handler;\n target.targetScreen = target.targetScreen ?? source.targetScreen;\n target.description = target.description ?? source.description;\n target.nativeConfirmationExpected =\n target.nativeConfirmationExpected || source.nativeConfirmationExpected || undefined;\n target.requiresConfirmation =\n target.requiresConfirmation || source.requiresConfirmation || undefined;\n target.destructive = target.destructive || source.destructive || undefined;\n target.effect = target.effect ?? source.effect;\n target.riskLevel = target.riskLevel ?? source.riskLevel;\n target.appilotsInferred = target.appilotsInferred ?? source.appilotsInferred;\n }\n\n private enrichActionsFromHandlers(ast: BabelTypes.File, actions: ActionDescriptor[]): void {\n const handlerMap = this.collectHandlerInfo(ast);\n const labelToHandler = this.collectButtonHandlersByLabel(ast);\n\n for (const action of actions) {\n if (!action.handler && action.label) {\n const handler = labelToHandler.get(action.label);\n if (handler) action.handler = handler;\n }\n\n const handler = action.handler ? handlerMap.get(action.handler) : undefined;\n if (!handler) continue;\n\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n ...handler.appilotsInferred,\n };\n if (handler.nativeConfirmationExpected) action.nativeConfirmationExpected = true;\n if (handler.targetScreen && !action.targetScreen) action.targetScreen = handler.targetScreen;\n if (handler.successSignal && !action.successSignal)\n action.successSignal = handler.successSignal;\n if (handler.failureSignal && !action.failureSignal)\n action.failureSignal = handler.failureSignal;\n if (handler.opensModal && !action.opensModal) action.opensModal = handler.opensModal;\n if (\n handler.destructive ||\n action.destructive === true ||\n action.requiresConfirmation === true ||\n action.effect === 'destructive' ||\n action.riskLevel === 'high'\n ) {\n action.destructive = true;\n action.effect = action.effect ?? 'destructive';\n action.riskLevel = action.riskLevel ?? 'high';\n action.requiresConfirmation = action.requiresConfirmation ?? true;\n }\n }\n }\n\n private collectButtonHandlersByLabel(ast: BabelTypes.File): Map<string, string> {\n const out = new Map<string, string>();\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n if (!BabelTypes.isJSXIdentifier(element.name)) return;\n const componentName = element.name.name;\n if (classifyJsxComponent(componentName, element) !== 'button') return;\n // Not necessarily `onPress` — a design system spells the same\n // affordance `onRetry`, `onClose`, `onAllow`. See pressHandlerProp.\n const pressProp = pressHandlerProp(element);\n\n let label: string | undefined;\n let handler: string | undefined;\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName || !attr.value) continue;\n if (\n (attrName === 'title' || attrName === 'accessibilityLabel' || attrName === 'label') &&\n BabelTypes.isStringLiteral(attr.value)\n ) {\n label = attr.value.value;\n }\n if (\n attrName === pressProp &&\n BabelTypes.isJSXExpressionContainer(attr.value) &&\n BabelTypes.isIdentifier(attr.value.expression)\n ) {\n handler = attr.value.expression.name;\n }\n }\n if (label && handler) out.set(label, handler);\n },\n });\n return out;\n }\n\n private collectHandlerInfo(ast: BabelTypes.File): Map<\n string,\n {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: import('../types').SignalDescriptor;\n failureSignal?: import('../types').SignalDescriptor;\n opensModal?: string;\n }\n > {\n const handlers = collectFunctions(ast);\n\n const out = new Map<\n string,\n {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: import('../types').SignalDescriptor;\n failureSignal?: import('../types').SignalDescriptor;\n opensModal?: string;\n }\n >();\n\n for (const [name, fn] of handlers) {\n const info = analyzeFunctionBehavior(name, fn, handlers);\n out.set(name, info);\n }\n\n return out;\n }\n\n private analyzeHandlerFunction(\n name: string,\n fn: BabelTypes.Function,\n handlers: Map<string, BabelTypes.Function>,\n seen = new Set<string>(),\n ): {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n } {\n if (seen.has(name)) {\n return {\n appilotsInferred: { expectedOutcome: 'none' },\n destructive: false,\n nativeConfirmationExpected: false,\n };\n }\n seen.add(name);\n\n let hasAwait = fn.async === true;\n let hasThen = false;\n let hasStateSetter = false;\n let nativeConfirmationExpected = false;\n let targetScreen: string | undefined;\n let destructive = /(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(name);\n\n const inspectNode = (node: BabelTypes.Node) => {\n if (BabelTypes.isAwaitExpression(node)) hasAwait = true;\n if (\n BabelTypes.isCallExpression(node) &&\n BabelTypes.isMemberExpression(node.callee) &&\n BabelTypes.isIdentifier(node.callee.property)\n ) {\n const method = node.callee.property.name;\n if (method === 'then' || method === 'catch' || method === 'finally') hasThen = true;\n if (\n BabelTypes.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n ['navigate', 'push', 'replace'].includes(method)\n ) {\n const firstArg = node.arguments[0];\n if (BabelTypes.isStringLiteral(firstArg)) targetScreen = firstArg.value;\n }\n if (\n BabelTypes.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'Alert' &&\n method === 'alert'\n ) {\n nativeConfirmationExpected = true;\n }\n }\n if (BabelTypes.isCallExpression(node) && BabelTypes.isIdentifier(node.callee)) {\n const calleeName = node.callee.name;\n if (/^set[A-Z]/.test(calleeName)) hasStateSetter = true;\n if (/(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(calleeName)) {\n destructive = true;\n }\n const nested = handlers.get(calleeName);\n if (nested) {\n const nestedInfo = this.analyzeHandlerFunction(calleeName, nested, handlers, seen);\n hasAwait = hasAwait || nestedInfo.appilotsInferred.isAsyncTrigger === true;\n nativeConfirmationExpected ||= nestedInfo.nativeConfirmationExpected;\n destructive ||= nestedInfo.destructive;\n targetScreen = targetScreen ?? nestedInfo.targetScreen;\n }\n }\n if (\n BabelTypes.isMemberExpression(node) &&\n BabelTypes.isIdentifier(node.property) &&\n /(delete|destroy|remove|discard|wipe|drop|terminate)/i.test(node.property.name)\n ) {\n destructive = true;\n }\n };\n\n if (fn.body) {\n traverse(\n fn.body as any,\n {\n noScope: true,\n enter: (nodePath: any) => inspectNode(nodePath.node),\n } as any,\n );\n }\n\n const expectedOutcome: AppilotsInferredAction['expectedOutcome'] = targetScreen\n ? 'navigation'\n : hasStateSetter\n ? 'inline-feedback'\n : hasAwait || hasThen\n ? 'mixed'\n : 'none';\n\n return {\n appilotsInferred: {\n isAsyncTrigger: hasAwait || hasThen || undefined,\n expectedOutcome,\n },\n destructive,\n nativeConfirmationExpected,\n targetScreen,\n };\n }\n\n /**\n * BACKLOG 2.2 — heuristic destructive detection.\n *\n * Combines several signals:\n * - JSX `destructive` boolean prop (`<Pressable destructive />`)\n * - JSX `aria-destructive` attribute\n * - Handler name contains a generic destructive verb\n * (delete/destroy/remove/discard/wipe/revoke/etc.). `cancel` is intentionally excluded —\n * too many \"Cancelar\" buttons that just dismiss modals.\n * - testID / id contains a destructive verb\n *\n * Default-allow with explicit opt-out via `@appilots-non-destructive`\n * is more dangerous than the inverse, so we default-deny: the\n * heuristic must hit OR the JSDoc tag must be present.\n */\n private isElementDestructive(\n element: BabelTypes.JSXOpeningElement,\n handlerName: string | undefined,\n actionId: string | undefined,\n ): boolean {\n const DESTRUCTIVE_VERB =\n /(delete|destroy|remove|discard|wipe|erase|drop|terminate|revoke|deactivate|disable)/i;\n\n // Explicit JSX prop wins.\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (attrName === 'destructive' || attrName === 'aria-destructive') {\n // <Btn destructive /> (no value) is true; <Btn destructive={false} />\n // turns it off.\n if (attr.value === null) return true;\n if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n const expr = attr.value.expression;\n if (BabelTypes.isBooleanLiteral(expr)) return expr.value;\n }\n if (BabelTypes.isStringLiteral(attr.value)) {\n return attr.value.value === 'true';\n }\n }\n }\n\n if (handlerName && DESTRUCTIVE_VERB.test(handlerName)) return true;\n if (actionId && DESTRUCTIVE_VERB.test(actionId)) return true;\n\n return false;\n }\n\n /**\n * Extract action metadata from a button element\n */\n private extractActionFromButton(element: BabelTypes.JSXOpeningElement): ActionDescriptor {\n const action: ActionDescriptor = {\n id: '',\n type: 'custom',\n };\n const componentName = BabelTypes.isJSXIdentifier(element.name) ? element.name.name : undefined;\n action.sourceComponent = componentName;\n // The prop that actually fires this control — `onPress` on an RN\n // primitive, `onRetry`/`onClose`/`onAllow` on a design-system one.\n const pressProp = pressHandlerProp(element) ?? 'onPress';\n let handlerName: string | undefined;\n\n for (const attr of element.attributes) {\n if (!BabelTypes.isJSXAttribute(attr)) continue;\n\n const attrName = BabelTypes.isJSXIdentifier(attr.name) ? attr.name.name : null;\n if (!attrName) continue;\n\n if (attr.value) {\n if (BabelTypes.isStringLiteral(attr.value)) {\n if (attrName === 'appilotsId') {\n action.id = attr.value.value;\n action.locator = this.mergeLocator(action.locator, {\n id: attr.value.value,\n appilotsId: attr.value.value,\n source: 'appilotsId',\n });\n } else if (attrName === 'testID') {\n action.id = attr.value.value;\n action.locator = this.mergeLocator(action.locator, {\n id: attr.value.value,\n testID: attr.value.value,\n source: 'testID',\n });\n } else if (\n attrName === 'title' ||\n attrName === 'label' ||\n attrName === 'accessibilityLabel'\n ) {\n action.label = attr.value.value;\n if (attrName === 'accessibilityLabel') {\n action.locator = this.mergeLocator(action.locator, {\n accessibilityLabel: attr.value.value,\n source: 'accessibilityLabel',\n });\n }\n if (!action.id) {\n action.id = this.slugifyActionId(attr.value.value);\n }\n }\n } else if (BabelTypes.isJSXExpressionContainer(attr.value)) {\n if (attrName === pressProp && BabelTypes.isIdentifier(attr.value.expression)) {\n // Infer action type from handler name\n handlerName = attr.value.expression.name.toLowerCase();\n action.handler = attr.value.expression.name;\n if (handlerName.includes('submit')) {\n action.type = 'submit';\n } else if (handlerName.includes('navigate')) {\n action.type = 'navigation';\n }\n } else if (attrName === pressProp) {\n const inline = this.extractInlineOnPressMetadata(attr.value.expression);\n if (inline.handler) {\n handlerName = inline.handler.toLowerCase();\n action.handler = inline.handler;\n if (handlerName.includes('submit')) action.type = 'submit';\n }\n if (inline.targetScreen) {\n action.type = 'navigation';\n action.targetScreen = inline.targetScreen;\n }\n } else if (attrName === 'loading' && BabelTypes.isIdentifier(attr.value.expression)) {\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n isAsyncTrigger: true,\n loadingStateBindings: [attr.value.expression.name],\n };\n }\n }\n } else if (attrName === 'destructive') {\n action.destructive = true;\n }\n }\n\n if (!action.locator && action.id) {\n action.locator = {\n id: action.id,\n label: action.label,\n source: action.label ? 'label' : 'inferred',\n };\n }\n\n // BACKLOG 2.2 — flag the action as destructive if the heuristic\n // detects it. Persists into the MCP doc so the runtime doesn't\n // need to re-derive on every request.\n if (this.isElementDestructive(element, handlerName, action.id)) {\n action.destructive = true;\n }\n\n return action;\n }\n\n private extractInlineOnPressMetadata(\n expr: BabelTypes.Expression | BabelTypes.JSXEmptyExpression,\n ): Pick<ActionDescriptor, 'handler' | 'targetScreen'> {\n if (BabelTypes.isJSXEmptyExpression(expr)) return {};\n const navCall = extractNavigationCalls(expr).find((call) => call.targetScreen);\n const handler = this.extractFirstHandlerName(expr);\n return {\n ...(handler ? { handler } : {}),\n ...(navCall?.targetScreen ? { targetScreen: navCall.targetScreen } : {}),\n };\n }\n\n private extractFirstHandlerName(node: BabelTypes.Node): string | undefined {\n if (BabelTypes.isIdentifier(node)) return node.name;\n if (BabelTypes.isArrowFunctionExpression(node) || BabelTypes.isFunctionExpression(node)) {\n return this.extractFirstHandlerName(node.body);\n }\n if (BabelTypes.isBlockStatement(node)) {\n for (const statement of node.body) {\n const handler = this.extractFirstHandlerName(statement);\n if (handler) return handler;\n }\n return undefined;\n }\n if (BabelTypes.isExpressionStatement(node)) {\n return this.extractFirstHandlerName(node.expression);\n }\n if (BabelTypes.isReturnStatement(node)) {\n return node.argument ? this.extractFirstHandlerName(node.argument) : undefined;\n }\n if (BabelTypes.isUnaryExpression(node)) {\n return this.extractFirstHandlerName(node.argument);\n }\n if (BabelTypes.isAwaitExpression(node)) {\n return this.extractFirstHandlerName(node.argument);\n }\n if (BabelTypes.isCallExpression(node)) {\n if (BabelTypes.isIdentifier(node.callee)) return node.callee.name;\n return undefined;\n }\n return undefined;\n }\n\n private mergeLocator(\n current: LocatorDescriptor | undefined,\n next: LocatorDescriptor,\n ): LocatorDescriptor {\n return { ...(current ?? {}), ...next };\n }\n\n private expressionToBinding(\n expr: BabelTypes.Expression | BabelTypes.JSXEmptyExpression,\n ): string | undefined {\n if (BabelTypes.isIdentifier(expr)) return expr.name;\n if (\n BabelTypes.isMemberExpression(expr) &&\n BabelTypes.isIdentifier(expr.object) &&\n BabelTypes.isIdentifier(expr.property)\n ) {\n return `${expr.object.name}.${expr.property.name}`;\n }\n return undefined;\n }\n\n private slugifyActionId(label: string): string {\n return label\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n }\n\n private extractCollections(ast: BabelTypes.File): CollectionDescriptor[] {\n const renderItemFns = this.collectRenderItemFunctions(ast);\n const collections: CollectionDescriptor[] = [];\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n if (!BabelTypes.isJSXIdentifier(element.name)) return;\n const component = element.name.name;\n if (!['FlatList', 'SectionList', 'VirtualizedList', 'FlashList'].includes(component)) {\n return;\n }\n\n const dataSource = this.jsxExpressionIdentifier(element, 'data');\n const renderItem = this.jsxExpressionIdentifier(element, 'renderItem');\n const keyField = this.extractKeyField(element);\n const renderFn = renderItem ? renderItemFns.get(renderItem) : undefined;\n const rowAction = renderFn ? this.extractRowAction(renderFn) : undefined;\n const displayFields = renderFn ? this.extractItemFields(renderFn) : [];\n const itemType = this.inferItemType(dataSource, renderItem, displayFields);\n const identityFields = this.inferIdentityFields(keyField, displayFields);\n const searchField = this.inferSearchField(ast, dataSource);\n\n const id =\n dataSource ?? renderItem ?? `${component.toLowerCase()}-${collections.length + 1}`;\n collections.push({\n id,\n component,\n ...(itemType ? { itemType } : {}),\n ...(dataSource ? { dataSource } : {}),\n ...(keyField ? { keyField } : {}),\n ...(renderItem ? { renderItem } : {}),\n ...(displayFields.length > 0 ? { displayFields } : {}),\n ...(rowAction ? { rowAction } : {}),\n ...(rowAction ? { rowActions: [rowAction] } : {}),\n ...(identityFields.length > 0 ? { identityFields } : {}),\n ...(searchField ? { searchField } : {}),\n });\n },\n });\n\n return collections;\n }\n\n private collectRenderItemFunctions(ast: BabelTypes.File): Map<string, BabelTypes.Function> {\n const out = new Map<string, BabelTypes.Function>();\n traverse(ast, {\n VariableDeclarator: (nodePath) => {\n if (!BabelTypes.isIdentifier(nodePath.node.id)) return;\n const init = nodePath.node.init;\n if (BabelTypes.isArrowFunctionExpression(init) || BabelTypes.isFunctionExpression(init)) {\n out.set(nodePath.node.id.name, init);\n }\n },\n FunctionDeclaration: (nodePath) => {\n if (nodePath.node.id?.name) out.set(nodePath.node.id.name, nodePath.node);\n },\n });\n return out;\n }\n\n private jsxExpressionIdentifier(\n element: BabelTypes.JSXOpeningElement,\n attrName: string,\n ): string | undefined {\n const attr = element.attributes.find(\n (candidate) =>\n BabelTypes.isJSXAttribute(candidate) &&\n BabelTypes.isJSXIdentifier(candidate.name) &&\n candidate.name.name === attrName,\n );\n if (!BabelTypes.isJSXAttribute(attr) || !attr.value) return undefined;\n if (\n BabelTypes.isJSXExpressionContainer(attr.value) &&\n BabelTypes.isIdentifier(attr.value.expression)\n ) {\n return attr.value.expression.name;\n }\n if (BabelTypes.isStringLiteral(attr.value)) return attr.value.value;\n return undefined;\n }\n\n private extractKeyField(element: BabelTypes.JSXOpeningElement): string | undefined {\n const attr = element.attributes.find(\n (candidate) =>\n BabelTypes.isJSXAttribute(candidate) &&\n BabelTypes.isJSXIdentifier(candidate.name) &&\n candidate.name.name === 'keyExtractor',\n );\n if (\n !BabelTypes.isJSXAttribute(attr) ||\n !attr.value ||\n !BabelTypes.isJSXExpressionContainer(attr.value)\n ) {\n return undefined;\n }\n const expr = attr.value.expression;\n if (!BabelTypes.isArrowFunctionExpression(expr)) return undefined;\n const param = expr.params[0];\n if (!BabelTypes.isIdentifier(param)) return undefined;\n if (\n BabelTypes.isMemberExpression(expr.body) &&\n BabelTypes.isIdentifier(expr.body.object) &&\n expr.body.object.name === param.name &&\n BabelTypes.isIdentifier(expr.body.property)\n ) {\n return expr.body.property.name;\n }\n return undefined;\n }\n\n private extractRowAction(fn: BabelTypes.Function): RowActionDescriptor | undefined {\n let action: RowActionDescriptor | undefined;\n traverse(\n fn.body as any,\n {\n noScope: true,\n CallExpression: (nodePath: any) => {\n const node = nodePath.node as BabelTypes.CallExpression;\n if (\n !BabelTypes.isMemberExpression(node.callee) ||\n !BabelTypes.isIdentifier(node.callee.object) ||\n node.callee.object.name !== 'navigation' ||\n !BabelTypes.isIdentifier(node.callee.property) ||\n !['navigate', 'push', 'replace'].includes(node.callee.property.name)\n ) {\n return;\n }\n const firstArg = node.arguments[0];\n if (!BabelTypes.isStringLiteral(firstArg)) return;\n const params = this.extractNavigationParams(node.arguments[1]);\n action = {\n type: 'navigation',\n targetScreen: firstArg.value,\n ...(Object.keys(params).length > 0 ? { params } : {}),\n description: `Pressing a row opens ${firstArg.value}`,\n };\n },\n } as any,\n );\n return action;\n }\n\n private extractNavigationParams(arg: BabelTypes.Node | undefined | null): Record<string, string> {\n const params: Record<string, string> = {};\n if (!arg || !BabelTypes.isObjectExpression(arg)) return params;\n for (const prop of arg.properties) {\n if (!BabelTypes.isObjectProperty(prop)) continue;\n const key = BabelTypes.isIdentifier(prop.key)\n ? prop.key.name\n : BabelTypes.isStringLiteral(prop.key)\n ? prop.key.value\n : undefined;\n if (!key) continue;\n if (\n BabelTypes.isMemberExpression(prop.value) &&\n BabelTypes.isIdentifier(prop.value.object) &&\n BabelTypes.isIdentifier(prop.value.property)\n ) {\n params[key] = `${prop.value.object.name}.${prop.value.property.name}`;\n } else if (BabelTypes.isIdentifier(prop.value)) {\n params[key] = prop.value.name;\n } else if (BabelTypes.isStringLiteral(prop.value)) {\n params[key] = prop.value.value;\n }\n }\n return params;\n }\n\n private extractItemFields(fn: BabelTypes.Function): string[] {\n const fields = new Set<string>();\n const itemNames = new Set<string>(['item']);\n const firstParam = fn.params[0];\n if (BabelTypes.isObjectPattern(firstParam)) {\n for (const prop of firstParam.properties) {\n if (\n BabelTypes.isObjectProperty(prop) &&\n BabelTypes.isIdentifier(prop.key) &&\n prop.key.name === 'item' &&\n BabelTypes.isIdentifier(prop.value)\n ) {\n itemNames.add(prop.value.name);\n }\n }\n } else if (BabelTypes.isIdentifier(firstParam)) {\n itemNames.add(firstParam.name);\n }\n\n traverse(\n fn.body as any,\n {\n noScope: true,\n MemberExpression: (nodePath: any) => {\n const node = nodePath.node as BabelTypes.MemberExpression;\n if (\n BabelTypes.isIdentifier(node.object) &&\n itemNames.has(node.object.name) &&\n BabelTypes.isIdentifier(node.property)\n ) {\n fields.add(node.property.name);\n }\n },\n } as any,\n );\n\n return Array.from(fields).sort();\n }\n\n private inferItemType(\n dataSource: string | undefined,\n renderItem: string | undefined,\n displayFields: string[],\n ): string | undefined {\n const source = dataSource ?? renderItem;\n if (!source) return undefined;\n const singular = source\n .replace(/^render/i, '')\n .replace(/(List|Items|Data|Rows|Sections)$/i, '')\n .replace(/s$/i, '');\n const candidate = singular.charAt(0).toUpperCase() + singular.slice(1);\n if (candidate.length > 1) return candidate;\n if (displayFields.length > 0) return 'Item';\n return undefined;\n }\n\n /**\n * Identity comes from how a field is NAMED, not from what the app\n * sells: `id`/`uuid`/`key`/`slug` are conventions any codebase uses,\n * `name`/`title`/`email` are how any row introduces itself. `plate`\n * used to sit in this list and read like one of them — but it is the\n * example app's schema, and no other tenant ever got its equivalent\n * (`mrn`, `trackingNumber`, `sku`) added here.\n */\n private inferIdentityFields(keyField: string | undefined, displayFields: string[]): string[] {\n const out = new Set<string>();\n if (keyField) out.add(keyField);\n for (const field of displayFields) {\n if (/^(id|uuid|key|name|title|email|slug)$/i.test(field)) out.add(field);\n }\n return Array.from(out);\n }\n\n private inferSearchField(\n ast: BabelTypes.File,\n dataSource: string | undefined,\n ): string | undefined {\n if (!dataSource) return undefined;\n let queryBinding: string | undefined;\n traverse(ast, {\n CallExpression: (nodePath) => {\n const node = nodePath.node;\n if (!BabelTypes.isMemberExpression(node.callee)) return;\n if (\n !BabelTypes.isIdentifier(node.callee.property) ||\n node.callee.property.name !== 'filter'\n )\n return;\n if (!BabelTypes.isIdentifier(node.callee.object) || node.callee.object.name !== dataSource)\n return;\n const fn = node.arguments[0];\n if (!BabelTypes.isArrowFunctionExpression(fn) && !BabelTypes.isFunctionExpression(fn))\n return;\n traverse(\n fn.body as any,\n {\n noScope: true,\n Identifier: (innerPath: any) => {\n const name = innerPath.node.name;\n if (/query|search|filter/i.test(name)) queryBinding = queryBinding ?? name;\n },\n } as any,\n );\n },\n });\n return queryBinding;\n }\n\n /**\n * Extract literal values from AST nodes\n */\n private extractLiteralValue(node: BabelTypes.Expression): unknown {\n if (BabelTypes.isStringLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isNumericLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isBooleanLiteral(node)) {\n return node.value;\n }\n if (BabelTypes.isNullLiteral(node)) {\n return null;\n }\n return undefined;\n }\n\n /**\n * Extract screen name from file path\n * E.g., /src/screens/ItemListScreen.tsx -> ItemListScreen\n */\n private extractScreenName(filePath: string): string {\n const basename = path.basename(filePath);\n return basename.replace(/\\.(tsx?|jsx?)$/, '');\n }\n}\n","import { parse, type ParserPlugin } from '@babel/parser';\nimport type * as t from '@babel/types';\n\nexport const DEFAULT_PARSER_PLUGINS: ParserPlugin[] = [\n 'jsx',\n 'typescript',\n ['decorators', { decoratorsBeforeExport: true }],\n 'asyncGenerators',\n ['pipelineOperator', { proposal: 'minimal' }],\n 'partialApplication',\n 'logicalAssignment',\n 'classPrivateProperties',\n 'classPrivateMethods',\n ['recordAndTuple', { syntaxType: 'hash' }],\n];\n\nexport function parseSource(source: string, parserPlugins: ParserPlugin[] = []): t.File {\n return parse(source, {\n sourceType: 'module',\n plugins: [...DEFAULT_PARSER_PLUGINS, ...parserPlugins],\n }) as t.File;\n}\n","import * as t from '@babel/types';\n\nexport function findJsxAttribute(\n element: t.JSXOpeningElement,\n name: string,\n): t.JSXAttribute | undefined {\n return element.attributes.find(\n (attr): attr is t.JSXAttribute =>\n t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name) && attr.name.name === name,\n );\n}\n\nexport function getStringAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr || !attr.value) return undefined;\n if (t.isStringLiteral(attr.value)) return attr.value.value;\n if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n return attr.value.expression.value;\n }\n return undefined;\n}\n\nexport function getBooleanAttr(\n element: t.JSXOpeningElement,\n name: string,\n): boolean | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr) return undefined;\n if (attr.value === null) return true;\n if (t.isStringLiteral(attr.value)) {\n if (attr.value.value === 'true') return true;\n if (attr.value.value === 'false') return false;\n }\n if (t.isJSXExpressionContainer(attr.value) && t.isBooleanLiteral(attr.value.expression)) {\n return attr.value.expression.value;\n }\n return undefined;\n}\n\nexport function getExpressionIdentifierAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n return t.isIdentifier(attr.value.expression) ? attr.value.expression.name : undefined;\n}\n\nexport function getMemberExpressionAttr(\n element: t.JSXOpeningElement,\n name: string,\n): string | undefined {\n const attr = findJsxAttribute(element, name);\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n const expr = attr.value.expression;\n if (t.isIdentifier(expr)) return expr.name;\n if (\n t.isMemberExpression(expr) &&\n t.isIdentifier(expr.object) &&\n t.isIdentifier(expr.property)\n ) {\n return `${expr.object.name}.${expr.property.name}`;\n }\n return undefined;\n}\n\nexport function hasJsxAttribute(element: t.JSXOpeningElement, name: string): boolean {\n return Boolean(findJsxAttribute(element, name));\n}\n\nexport function firstStringAttr(\n element: t.JSXOpeningElement,\n names: string[],\n): { name: string; value: string } | undefined {\n for (const name of names) {\n const value = getStringAttr(element, name);\n if (value) return { name, value };\n }\n return undefined;\n}\n","import type * as t from '@babel/types';\nimport { getExpressionIdentifierAttr, getStringAttr, hasJsxAttribute } from './attributes';\n\nexport type SemanticComponentRole =\n | 'view'\n | 'input'\n | 'button'\n | 'list'\n | 'modal'\n | 'select'\n | 'toggle'\n | 'date'\n | 'custom';\n\n/**\n * Handler props that fire from layout, scrolling or asset loading rather\n * than from a user aiming at this control. A `<ScrollView onScroll>` is not\n * something the agent can be told to press.\n */\nconst NON_INTERACTION_HANDLERS = new Set([\n 'onLayout',\n 'onScroll',\n 'onScrollBeginDrag',\n 'onScrollEndDrag',\n 'onMomentumScrollBegin',\n 'onMomentumScrollEnd',\n 'onContentSizeChange',\n 'onEndReached',\n 'onViewableItemsChanged',\n 'onLoad',\n 'onLoadStart',\n 'onLoadEnd',\n 'onError',\n 'onProgress',\n 'onFocus',\n 'onBlur',\n]);\n\n/** Handlers already read as changing a VALUE, not as a press. */\nconst VALUE_HANDLERS = new Set([\n 'onChange',\n 'onChangeText',\n 'onValueChange',\n 'onSelect',\n 'onSelectionChange',\n 'onSubmitEditing',\n]);\n\n/**\n * The prop that makes this element pressable, if any.\n *\n * `onPress` is only React Native's spelling for the ONE component it ships.\n * A design system names the same affordance after what it does: `onRetry`\n * on an error state, `onClose` on a bottom sheet, `onAllow` on a permission\n * prompt, `onAction` on an empty state. Looking for `onPress` alone made\n * every one of those invisible to the document — measured at 14 of the 23\n * addressable misses in `apps/example-app`, and that app is the friendly\n * case.\n *\n * Deliberately structural: it reads the prop shape at the CALL SITE and\n * never resolves the import. A component that takes a handler and does not\n * call it is out of reach either way, and following imports buys a much\n * smaller share of the gap than it costs.\n */\nexport function pressHandlerProp(element: t.JSXOpeningElement): string | undefined {\n let fallback: string | undefined;\n for (const attr of element.attributes) {\n if (attr.type !== 'JSXAttribute' || attr.name.type !== 'JSXIdentifier') continue;\n const name = attr.name.name;\n if (!/^on[A-Z]/.test(name)) continue;\n if (attr.value?.type !== 'JSXExpressionContainer') continue;\n // `onPress` wins outright when both are present, so a wrapper that\n // forwards an extra handler cannot displace the real one.\n if (name === 'onPress') return name;\n if (NON_INTERACTION_HANDLERS.has(name) || VALUE_HANDLERS.has(name)) continue;\n fallback ??= name;\n }\n return fallback;\n}\n\nconst VIEW_COMPONENTS = new Set(['View', 'ScrollView', 'SafeAreaView', 'KeyboardAvoidingView']);\nconst INPUT_COMPONENTS = new Set(['TextInput', 'Input', 'HocInput']);\nconst BUTTON_COMPONENTS = new Set(['TouchableOpacity', 'Pressable', 'Button']);\nconst LIST_COMPONENTS = new Set(['FlatList', 'SectionList', 'VirtualizedList', 'FlashList']);\nconst MODAL_COMPONENTS = new Set(['Modal', 'BottomSheet']);\n\nexport function classifyJsxComponent(\n name: string,\n element?: t.JSXOpeningElement,\n): SemanticComponentRole {\n if (LIST_COMPONENTS.has(name)) return 'list';\n if (MODAL_COMPONENTS.has(name)) return 'modal';\n if (/date/i.test(name)) return 'date';\n if (/(select|picker|dropdown|radio)/i.test(name)) return 'select';\n if (/(checkbox|switch|toggle)/i.test(name)) return 'toggle';\n if (INPUT_COMPONENTS.has(name)) return 'input';\n if (BUTTON_COMPONENTS.has(name)) return 'button';\n\n if (element) {\n // A choice control's option list is named after the domain as often as\n // after the pattern: `options`, but also `segments`, `choices`, `tabs`.\n // Reading only `options` sent every SegmentedControl in the testbed to\n // `custom` — including ones that carried an explicit `appilotsId`, so\n // the identity was there and only the classification was missing.\n const hasOptions =\n hasJsxAttribute(element, 'options') ||\n hasJsxAttribute(element, 'segments') ||\n hasJsxAttribute(element, 'choices') ||\n hasJsxAttribute(element, 'tabs');\n const hasValue = hasJsxAttribute(element, 'value');\n const hasChecked = hasJsxAttribute(element, 'checked') || hasJsxAttribute(element, 'selected');\n const hasOnChange =\n hasJsxAttribute(element, 'onChange') ||\n hasJsxAttribute(element, 'onValueChange') ||\n hasJsxAttribute(element, 'onChangeText');\n if (hasOptions && (hasValue || hasOnChange)) return 'select';\n if (hasChecked && hasOnChange) return 'toggle';\n if (\n hasOnChange &&\n (hasJsxAttribute(element, 'label') || hasJsxAttribute(element, 'placeholder'))\n ) {\n return 'input';\n }\n if (pressHandlerProp(element)) return 'button';\n if (getStringAttr(element, 'visible') || getExpressionIdentifierAttr(element, 'visible')) {\n return 'modal';\n }\n }\n\n if (VIEW_COMPONENTS.has(name)) return 'view';\n return 'custom';\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nexport function collectFunctions(ast: t.File): Map<string, t.Function> {\n const handlers = new Map<string, t.Function>();\n\n traverse(ast, {\n FunctionDeclaration: (nodePath) => {\n if (nodePath.node.id?.name) handlers.set(nodePath.node.id.name, nodePath.node);\n },\n VariableDeclarator: (nodePath) => {\n if (!t.isIdentifier(nodePath.node.id)) return;\n const init = nodePath.node.init;\n if (t.isArrowFunctionExpression(init) || t.isFunctionExpression(init)) {\n handlers.set(nodePath.node.id.name, init);\n }\n },\n });\n\n return handlers;\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\nimport type { AppilotsInferredAction, SignalDescriptor } from '../../types';\n\nexport interface FunctionBehavior {\n appilotsInferred: AppilotsInferredAction;\n destructive: boolean;\n nativeConfirmationExpected: boolean;\n targetScreen?: string;\n successSignal?: SignalDescriptor;\n failureSignal?: SignalDescriptor;\n opensModal?: string;\n loadingStateBindings?: string[];\n}\n\nconst DESTRUCTIVE_VERB =\n /(delete|destroy|remove|discard|wipe|erase|drop|terminate|revoke|deactivate|disable)/i;\n\nexport function analyzeFunctionBehavior(\n name: string,\n fn: t.Function,\n handlers: Map<string, t.Function>,\n seen = new Set<string>(),\n): FunctionBehavior {\n if (seen.has(name)) {\n return {\n appilotsInferred: { expectedOutcome: 'none' },\n destructive: false,\n nativeConfirmationExpected: false,\n };\n }\n seen.add(name);\n\n let hasAwait = fn.async === true;\n let hasThen = false;\n let hasStateSetter = false;\n let nativeConfirmationExpected = false;\n let targetScreen: string | undefined;\n let successSignal: SignalDescriptor | undefined;\n let failureSignal: SignalDescriptor | undefined;\n let opensModal: string | undefined;\n let destructive = DESTRUCTIVE_VERB.test(name);\n const loadingStateBindings = new Set<string>();\n\n const inspectCall = (node: t.CallExpression) => {\n if (t.isMemberExpression(node.callee) && t.isIdentifier(node.callee.property)) {\n const method = node.callee.property.name;\n if (method === 'then' || method === 'catch' || method === 'finally') hasThen = true;\n if (\n t.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n ['navigate', 'push', 'replace'].includes(method)\n ) {\n const firstArg = node.arguments[0];\n if (t.isStringLiteral(firstArg)) {\n targetScreen = firstArg.value;\n successSignal = { type: 'navigation', target: firstArg.value };\n }\n }\n if (\n t.isIdentifier(node.callee.object) &&\n node.callee.object.name === 'navigation' &&\n method === 'goBack'\n ) {\n successSignal = { type: 'goBack', description: 'Action returns to the previous screen' };\n }\n if (t.isIdentifier(node.callee.object) && node.callee.object.name === 'Alert' && method === 'alert') {\n nativeConfirmationExpected = true;\n }\n if (\n t.isIdentifier(node.callee.object) &&\n /(toast|notification|snackbar)/i.test(node.callee.object.name)\n ) {\n const firstArg = node.arguments[0];\n const secondArg = node.arguments[1];\n const text = t.isStringLiteral(secondArg)\n ? secondArg.value\n : t.isStringLiteral(firstArg)\n ? firstArg.value\n : undefined;\n const signal: SignalDescriptor = { type: 'toast', description: text };\n if (/(error|danger|fail)/i.test(method) || (t.isStringLiteral(firstArg) && /error/i.test(firstArg.value))) {\n failureSignal = signal;\n } else {\n successSignal = successSignal ?? signal;\n }\n }\n }\n\n if (t.isIdentifier(node.callee)) {\n const calleeName = node.callee.name;\n if (/^set[A-Z]/.test(calleeName)) {\n hasStateSetter = true;\n const stateName = setterToStateName(calleeName);\n const firstArg = node.arguments[0];\n if (stateName && t.isBooleanLiteral(firstArg)) {\n if (/loading|submitting|saving|fetching|refreshing/i.test(stateName)) {\n loadingStateBindings.add(stateName);\n }\n if (firstArg.value === true && !/loading|submitting|saving|fetching|refreshing/i.test(stateName)) {\n opensModal = opensModal ?? stateName;\n }\n }\n }\n if (DESTRUCTIVE_VERB.test(calleeName)) destructive = true;\n\n const nested = handlers.get(calleeName);\n if (nested) {\n const nestedInfo = analyzeFunctionBehavior(calleeName, nested, handlers, seen);\n hasAwait = hasAwait || nestedInfo.appilotsInferred.isAsyncTrigger === true;\n nativeConfirmationExpected ||= nestedInfo.nativeConfirmationExpected;\n destructive ||= nestedInfo.destructive;\n targetScreen = targetScreen ?? nestedInfo.targetScreen;\n successSignal = successSignal ?? nestedInfo.successSignal;\n failureSignal = failureSignal ?? nestedInfo.failureSignal;\n opensModal = opensModal ?? nestedInfo.opensModal;\n for (const binding of nestedInfo.loadingStateBindings ?? []) {\n loadingStateBindings.add(binding);\n }\n }\n }\n };\n\n const inspectNode = (node: t.Node) => {\n if (t.isAwaitExpression(node)) hasAwait = true;\n if (t.isCallExpression(node)) inspectCall(node);\n if (t.isMemberExpression(node) && t.isIdentifier(node.property) && DESTRUCTIVE_VERB.test(node.property.name)) {\n destructive = true;\n }\n };\n\n if (fn.body) {\n traverse(fn.body as any, {\n noScope: true,\n enter: (nodePath: any) => inspectNode(nodePath.node),\n } as any);\n }\n\n const expectedOutcome: AppilotsInferredAction['expectedOutcome'] = targetScreen\n ? 'navigation'\n : successSignal?.type === 'goBack'\n ? 'navigation'\n : hasStateSetter || successSignal?.type === 'toast' || opensModal\n ? 'inline-feedback'\n : hasAwait || hasThen\n ? 'mixed'\n : 'none';\n\n return {\n appilotsInferred: {\n isAsyncTrigger: hasAwait || hasThen || undefined,\n expectedOutcome,\n ...(loadingStateBindings.size > 0\n ? { loadingStateBindings: Array.from(loadingStateBindings).sort() }\n : {}),\n },\n destructive,\n nativeConfirmationExpected,\n targetScreen,\n successSignal,\n failureSignal,\n opensModal,\n loadingStateBindings: Array.from(loadingStateBindings).sort(),\n };\n}\n\nfunction setterToStateName(setterName: string): string | undefined {\n const raw = setterName.replace(/^set/, '');\n if (!raw) return undefined;\n return raw.charAt(0).toLowerCase() + raw.slice(1);\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nexport interface NavigationCall {\n method: 'navigate' | 'push' | 'replace' | 'goBack';\n targetScreen?: string;\n params?: Record<string, string>;\n}\n\nexport function extractNavigationCalls(ast: t.File | t.Node): NavigationCall[] {\n const calls: NavigationCall[] = [];\n traverse(ast as any, {\n noScope: !t.isFile(ast),\n CallExpression: (nodePath: any) => {\n const node = nodePath.node as t.CallExpression;\n if (\n !t.isMemberExpression(node.callee) ||\n !t.isIdentifier(node.callee.object) ||\n node.callee.object.name !== 'navigation' ||\n !t.isIdentifier(node.callee.property)\n ) {\n return;\n }\n const method = node.callee.property.name;\n if (!['navigate', 'push', 'replace', 'goBack'].includes(method)) return;\n const firstArg = node.arguments[0];\n const targetScreen = t.isStringLiteral(firstArg) ? firstArg.value : undefined;\n calls.push({\n method: method as NavigationCall['method'],\n ...(targetScreen ? { targetScreen } : {}),\n params: extractNavigationParams(node.arguments[1]),\n });\n },\n } as any);\n return calls;\n}\n\nexport function extractNavigationParams(arg: t.Node | undefined | null): Record<string, string> {\n const params: Record<string, string> = {};\n if (!arg || !t.isObjectExpression(arg)) return params;\n for (const prop of arg.properties) {\n if (!t.isObjectProperty(prop)) continue;\n const key = t.isIdentifier(prop.key)\n ? prop.key.name\n : t.isStringLiteral(prop.key)\n ? prop.key.value\n : undefined;\n if (!key) continue;\n if (\n t.isMemberExpression(prop.value) &&\n t.isIdentifier(prop.value.object) &&\n t.isIdentifier(prop.value.property)\n ) {\n params[key] = `${prop.value.object.name}.${prop.value.property.name}`;\n } else if (t.isIdentifier(prop.value)) {\n params[key] = prop.value.name;\n } else if (t.isStringLiteral(prop.value)) {\n params[key] = prop.value.value;\n }\n }\n return params;\n}\n","import type { ScreenPermissionDescriptor } from '../../types';\n\nexport function extractPermissionsFromJsDoc(\n source: string,\n): ScreenPermissionDescriptor | undefined {\n if (!source.includes('@appilots-')) return undefined;\n\n const result: ScreenPermissionDescriptor = {};\n let touched = false;\n\n const permRe = /@appilots-permissions\\s+([^\\n]+)/g;\n let m: RegExpExecArray | null;\n while ((m = permRe.exec(source))) {\n const rawLine = (m[1] ?? '').replace(/\\*\\/?\\s*$/, '').trim();\n const parsed = parsePermissionLine(rawLine);\n if (parsed) {\n Object.assign(result, parsed);\n touched = true;\n break;\n }\n }\n\n if (/@appilots-pii\\b/.test(source)) {\n result.isPii = true;\n touched = true;\n }\n\n const blockedRe = /@appilots-blocked-actions\\s+([^\\n]+)/;\n const blockedMatch = blockedRe.exec(source);\n if (blockedMatch && blockedMatch[1]) {\n const ids = blockedMatch[1]\n .replace(/\\*\\/?\\s*$/, '')\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter(Boolean);\n if (ids.length > 0) {\n result.blockedActions = ids;\n touched = true;\n }\n }\n\n return touched ? result : undefined;\n}\n\nexport function extractDestructiveJsDocTargets(\n source: string,\n): Set<string> | '*' | undefined {\n if (!/@appilots-destructive\\b/.test(source)) return undefined;\n\n const out = new Set<string>();\n const re = /@appilots-destructive\\s*([^\\n]*)/g;\n let bareSeen = false;\n let m: RegExpExecArray | null;\n while ((m = re.exec(source))) {\n const rest = (m[1] ?? '').replace(/\\*\\/?\\s*$/, '').trim();\n if (!rest) {\n bareSeen = true;\n continue;\n }\n for (const id of rest.split(/[,\\s]+/).map((s) => s.trim()).filter(Boolean)) {\n out.add(id);\n }\n }\n\n if (out.size === 0) return bareSeen ? '*' : undefined;\n return out;\n}\n\nfunction parsePermissionLine(line: string): ScreenPermissionDescriptor | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('{')) {\n const candidate = trimmed.replace(/'/g, '\"');\n try {\n const obj = JSON.parse(candidate);\n if (obj && typeof obj === 'object') {\n return sanitisePermissionsObject(obj as Record<string, unknown>);\n }\n } catch {\n // Fall through to key=value parsing.\n }\n }\n\n const out: Record<string, unknown> = {};\n for (const pair of trimmed.split(/[,\\s]+/)) {\n const [k, v] = pair.split('=');\n if (!k || v === undefined) continue;\n const key = k.trim();\n const value = v.trim().replace(/^['\"]|['\"]$/g, '');\n if (value === 'true') out[key] = true;\n else if (value === 'false') out[key] = false;\n else out[key] = value;\n }\n return Object.keys(out).length > 0 ? sanitisePermissionsObject(out) : null;\n}\n\nfunction sanitisePermissionsObject(\n obj: Record<string, unknown>,\n): ScreenPermissionDescriptor {\n const out: ScreenPermissionDescriptor = {};\n if (\n typeof obj.agentAccess === 'string' &&\n (obj.agentAccess === 'read' || obj.agentAccess === 'write' || obj.agentAccess === 'none')\n ) {\n out.agentAccess = obj.agentAccess;\n }\n if (typeof obj.requiresConfirmation === 'boolean') {\n out.requiresConfirmation = obj.requiresConfirmation;\n }\n if (typeof obj.isPii === 'boolean') {\n out.isPii = obj.isPii;\n }\n if (Array.isArray(obj.blockedActions)) {\n const ids = obj.blockedActions.filter((x): x is string => typeof x === 'string' && !!x);\n if (ids.length > 0) out.blockedActions = ids;\n }\n return out;\n}\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport glob from 'fast-glob';\nimport * as parser from '@babel/parser';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport type {\n AnalyzerConfig,\n NavigationGraph,\n NavigationNode,\n NavigatorDescriptor,\n ParamDescriptor,\n} from '../types';\n\ninterface ParsedNavigator {\n name: string;\n type: 'stack' | 'tab' | 'drawer';\n screens: ParsedScreen[];\n initialRouteName?: string;\n parentNavigator?: string;\n}\n\ninterface ParsedScreen {\n name: string;\n navigatorName: string;\n navigatorType: 'stack' | 'tab' | 'drawer';\n params?: ParamDescriptor[];\n parentNavigator?: string;\n}\n\ninterface TypeExport {\n name: string;\n type: 'stack' | 'tab' | 'drawer';\n paramEntries: Map<string, ParamDescriptor[]>;\n}\n\n/**\n * Analyzes React Navigation configuration to build a navigation graph.\n */\nexport class NavigationAnalyzer {\n private config: AnalyzerConfig;\n /** Extra glob patterns for navigation file discovery (added to defaults) */\n private navigationInclude: string[];\n /** Extra glob patterns to exclude from navigation analysis */\n private navigationExclude: string[];\n\n constructor(\n config: AnalyzerConfig,\n options?: { navigationInclude?: string[]; navigationExclude?: string[] },\n ) {\n this.config = config;\n this.navigationInclude = options?.navigationInclude ?? [];\n this.navigationExclude = options?.navigationExclude ?? [];\n }\n\n /** Build the full navigation graph */\n async analyze(): Promise<NavigationGraph> {\n const navigationFiles = await this.findNavigationFiles();\n const parsedNavigators: ParsedNavigator[] = [];\n const typeExports: TypeExport[] = [];\n\n // Parse all navigation files\n for (const filePath of navigationFiles) {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const navigators = this.parseNavigators(content, filePath);\n const types = this.parseParamTypes(content, filePath);\n\n parsedNavigators.push(...navigators);\n typeExports.push(...types);\n } catch (error) {\n console.warn(`Failed to parse ${filePath}:`, error);\n }\n }\n\n // Match type exports to navigators\n this.attachParamsToNavigators(parsedNavigators, typeExports);\n\n // Build the navigation graph\n return this.buildNavigationGraph(parsedNavigators);\n }\n\n /** Find all navigation-related files */\n private async findNavigationFiles(): Promise<string[]> {\n const patterns = [\n '**/navigation/**/*.{ts,tsx}',\n '**/navigator*.{ts,tsx}',\n '**/routes*.{ts,tsx}',\n // §5: Add user-configured navigation patterns (additive, not replacing)\n ...this.navigationInclude,\n ];\n\n const excludePatterns = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n ...(this.config.exclude || []),\n // §5: Add user-configured navigation excludes\n ...this.navigationExclude,\n ];\n\n const files = await glob(patterns, {\n cwd: this.config.rootDir,\n ignore: excludePatterns,\n });\n\n return files.map((file) => path.join(this.config.rootDir, file));\n }\n\n /** Parse navigator definitions from a file */\n private parseNavigators(content: string, filePath: string): ParsedNavigator[] {\n const navigators: ParsedNavigator[] = [];\n\n try {\n const ast = parser.parse(content, {\n sourceType: 'module',\n plugins: [\n 'jsx',\n 'typescript',\n ...((this.config.parserPlugins || []) as parser.ParserPlugin[]),\n ] as parser.ParserPlugin[],\n });\n\n const navigatorCalls: Map<string, ParsedNavigator> = new Map();\n const screensByNavigator: Map<string, ParsedScreen[]> = new Map();\n\n traverse(ast, {\n // Detect createStackNavigator / createTabNavigator / createDrawerNavigator calls\n CallExpression: (nodePath) => {\n const { node } = nodePath;\n const callee = node.callee;\n\n let navigatorType: 'stack' | 'tab' | 'drawer' | null = null;\n\n if (t.isIdentifier(callee) && callee.name === 'createNativeStackNavigator') {\n navigatorType = 'stack';\n } else if (t.isIdentifier(callee) && callee.name === 'createStackNavigator') {\n navigatorType = 'stack';\n } else if (t.isIdentifier(callee) && callee.name === 'createBottomTabNavigator') {\n navigatorType = 'tab';\n } else if (t.isIdentifier(callee) && callee.name === 'createTabNavigator') {\n navigatorType = 'tab';\n } else if (t.isIdentifier(callee) && callee.name === 'createDrawerNavigator') {\n navigatorType = 'drawer';\n }\n\n if (navigatorType) {\n // Extract variable assignment\n const parent = nodePath.parent;\n if (t.isVariableDeclarator(parent) && t.isIdentifier(parent.id)) {\n const varName = parent.id.name;\n navigatorCalls.set(varName, {\n name: varName,\n type: navigatorType,\n screens: [],\n });\n }\n }\n },\n\n // Detect Stack.Navigator / Tab.Navigator JSX elements\n JSXElement: (nodePath) => {\n const { node } = nodePath;\n const openingElement = node.openingElement;\n\n if (\n t.isJSXMemberExpression(openingElement.name) &&\n t.isJSXIdentifier(openingElement.name.object)\n ) {\n const objectName = openingElement.name.object.name;\n const propertyName = t.isJSXIdentifier(openingElement.name.property)\n ? openingElement.name.property.name\n : null;\n\n if (propertyName === 'Navigator') {\n const navigator = navigatorCalls.get(objectName);\n if (navigator) {\n // Extract initialRouteName\n const initialRouteAttr = openingElement.attributes.find(\n (attr) =>\n t.isJSXAttribute(attr) &&\n t.isJSXIdentifier(attr.name) &&\n attr.name.name === 'initialRouteName',\n );\n\n if (\n t.isJSXAttribute(initialRouteAttr) &&\n t.isStringLiteral(initialRouteAttr.value)\n ) {\n navigator.initialRouteName = initialRouteAttr.value.value;\n }\n\n // Extract screens from children\n const screens = this.extractScreensFromNavigator(node, objectName, navigator.type);\n screensByNavigator.set(objectName, screens);\n }\n }\n }\n },\n });\n\n // Build final navigator list with screens\n navigatorCalls.forEach((navigator) => {\n const screens = screensByNavigator.get(navigator.name) || [];\n navigator.screens = screens;\n navigators.push(navigator);\n });\n } catch (error) {\n console.warn(`Failed to parse navigators in ${filePath}:`, error);\n }\n\n return navigators;\n }\n\n /**\n * Is this JSX element `<navigatorVarName.MEMBER …>`?\n */\n // Deliberately NOT a type predicate (`node is t.JSXElement`): a false\n // result would then narrow `node` to \"not a JSXElement\", and the very\n // next check — the same node against a different member — would see\n // `never`. It is a question about the member name, not about the node\n // kind.\n private isNavigatorMember(node: t.Node, navigatorVarName: string, member: string): boolean {\n if (!t.isJSXElement(node)) return false;\n const name = node.openingElement.name;\n return (\n t.isJSXMemberExpression(name) &&\n t.isJSXIdentifier(name.object) &&\n name.object.name === navigatorVarName &&\n t.isJSXIdentifier(name.property) &&\n name.property.name === member\n );\n }\n\n /**\n * Flatten a navigator's JSX children into the `<X.Screen>` elements they\n * contain, unwrapping every container a real app puts in between.\n *\n * The old version compared `t.isJSXElement(child)` against the direct\n * children only. A ternary is a `JSXExpressionContainer`, so an\n * auth-gated root — the modal shape of a commercial app, and the shape\n * of this repo's own `apps/example-app` — contributed ZERO screens to\n * the graph while `appilots sync` reported success (#396).\n *\n * Both branches of a conditional are collected on purpose. The graph is\n * a design-time map of what routes EXIST, not a prediction of which one\n * a given session will render; the agent needs the destination name to\n * be there whether or not the user happens to be logged in right now.\n */\n private collectScreenElements(\n children: t.Node[],\n navigatorVarName: string,\n depth = 0,\n ): t.JSXElement[] {\n // Deep enough for any real navigator; a guard against a pathological\n // or circular AST rather than a real structural limit.\n if (depth > 12) return [];\n\n const found: t.JSXElement[] = [];\n\n const visit = (node: t.Node | null | undefined): void => {\n if (!node) return;\n\n if (this.isNavigatorMember(node, navigatorVarName, 'Screen')) {\n found.push(node as t.JSXElement);\n return;\n }\n\n // `<Stack.Group screenOptions={…}>` is react-navigation's own\n // grouping primitive: a container of routes, never a route.\n if (this.isNavigatorMember(node, navigatorVarName, 'Group')) {\n const group = node as t.JSXElement;\n found.push(...this.collectScreenElements(group.children, navigatorVarName, depth + 1));\n return;\n }\n\n // A nested `<Other.Navigator>` owns its own screens — do not steal\n // them into this navigator's list.\n if (t.isJSXElement(node)) {\n const name = node.openingElement.name;\n const isForeignNavigator =\n t.isJSXMemberExpression(name) &&\n t.isJSXIdentifier(name.property) &&\n name.property.name === 'Navigator';\n if (isForeignNavigator) return;\n found.push(...this.collectScreenElements(node.children, navigatorVarName, depth + 1));\n return;\n }\n\n if (t.isJSXFragment(node)) {\n found.push(...this.collectScreenElements(node.children, navigatorVarName, depth + 1));\n return;\n }\n\n if (t.isJSXExpressionContainer(node)) {\n visit(node.expression);\n return;\n }\n\n // `cond ? <A/> : <B/>` — take the union, see the doc comment.\n if (t.isConditionalExpression(node)) {\n visit(node.consequent);\n visit(node.alternate);\n return;\n }\n\n // `flag && <A/>` and `a ?? <B/>` — the JSX lives on one side.\n if (t.isLogicalExpression(node)) {\n visit(node.left);\n visit(node.right);\n return;\n }\n\n // `{routes.map(r => <Stack.Screen … />)}` — generated routes. The\n // `name` is usually dynamic and will not resolve to a literal, which\n // extractAttributeValue already handles by returning null.\n if (t.isCallExpression(node)) {\n for (const arg of node.arguments) {\n if (t.isArrowFunctionExpression(arg) || t.isFunctionExpression(arg)) {\n if (t.isBlockStatement(arg.body)) {\n for (const stmt of arg.body.body) {\n if (t.isReturnStatement(stmt)) visit(stmt.argument);\n }\n } else {\n visit(arg.body);\n }\n }\n }\n return;\n }\n\n if (t.isArrayExpression(node)) {\n for (const el of node.elements) visit(el);\n return;\n }\n\n // Parenthesised / type-asserted JSX.\n if (t.isTSAsExpression(node) || t.isTSNonNullExpression(node)) {\n visit(node.expression);\n }\n };\n\n for (const child of children) visit(child);\n return found;\n }\n\n /** Extract screens from a navigator JSX element */\n private extractScreensFromNavigator(\n navigatorElement: t.JSXElement,\n navigatorVarName: string,\n navigatorType: 'stack' | 'tab' | 'drawer',\n ): ParsedScreen[] {\n const screens: ParsedScreen[] = [];\n if (!navigatorElement.children) return screens;\n\n // A route declared in two branches of the same conditional (the very\n // common `Auth` fallback) is ONE route, not two.\n const seen = new Set<string>();\n\n for (const element of this.collectScreenElements(navigatorElement.children, navigatorVarName)) {\n const screenName = this.extractAttributeValue(element.openingElement.attributes, 'name');\n if (!screenName || seen.has(screenName)) continue;\n seen.add(screenName);\n screens.push({\n name: screenName,\n navigatorName: navigatorVarName,\n navigatorType,\n });\n }\n\n return screens;\n }\n\n /** Extract string attribute value from JSX attributes */\n private extractAttributeValue(\n attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[],\n attrName: string,\n ): string | null {\n const attr = attributes.find(\n (a) => t.isJSXAttribute(a) && t.isJSXIdentifier(a.name) && a.name.name === attrName,\n );\n\n if (t.isJSXAttribute(attr) && t.isStringLiteral(attr.value)) {\n return attr.value.value;\n }\n\n return null;\n }\n\n /** Parse TypeScript type exports (ParamList types) */\n private parseParamTypes(content: string, filePath: string): TypeExport[] {\n const types: TypeExport[] = [];\n\n try {\n const ast = parser.parse(content, {\n sourceType: 'module',\n plugins: [\n 'jsx',\n 'typescript',\n ...((this.config.parserPlugins || []) as parser.ParserPlugin[]),\n ] as parser.ParserPlugin[],\n });\n\n traverse(ast, {\n TSTypeAliasDeclaration: (nodePath) => {\n const { node } = nodePath;\n const typeName = node.id.name;\n\n // Match React Navigation param-list aliases such as\n // RootStackParamList, MainTabParamList, SettingsDrawerParamList,\n // or a project-specific FooParamList.\n const typeMatch = /^[A-Za-z0-9_]*(Stack|Tab|Drawer)?ParamList$/i.test(typeName);\n\n if (typeMatch && node.typeAnnotation?.type === 'TSTypeLiteral') {\n const paramEntries = this.extractParamListEntries(\n node.typeAnnotation as t.TSTypeLiteral,\n typeName,\n );\n\n const navType = this.inferTypeFromName(typeName);\n if (navType) {\n types.push({\n name: typeName,\n type: navType.type,\n paramEntries,\n });\n }\n }\n },\n });\n } catch (error) {\n console.warn(`Failed to parse types in ${filePath}:`, error);\n }\n\n return types;\n }\n\n /** Extract param entries from a TypeScript type literal */\n private extractParamListEntries(\n typeLiteral: t.TSTypeLiteral,\n typeName: string,\n ): Map<string, ParamDescriptor[]> {\n const entries = new Map<string, ParamDescriptor[]>();\n\n for (const member of typeLiteral.members) {\n if (member.type === 'TSPropertySignature' && member.key) {\n const keyName = member.key.type === 'Identifier' ? member.key.name : null;\n\n if (keyName && member.typeAnnotation) {\n const params = this.extractParamsFromType(member.typeAnnotation.typeAnnotation);\n entries.set(keyName, params);\n }\n }\n }\n\n return entries;\n }\n\n /** Extract param descriptors from a TypeScript type */\n private extractParamsFromType(typeAnnotation: t.TypeAnnotation | t.TSType): ParamDescriptor[] {\n const params: ParamDescriptor[] = [];\n\n if (typeAnnotation.type === 'TSUndefinedKeyword' || typeAnnotation.type === 'TSNullKeyword') {\n return params;\n }\n\n if (typeAnnotation.type === 'TSTypeLiteral') {\n const typeLiteral = typeAnnotation as t.TSTypeLiteral;\n for (const member of typeLiteral.members) {\n if (member.type === 'TSPropertySignature' && member.key) {\n const keyName = member.key.type === 'Identifier' ? member.key.name : null;\n\n if (keyName) {\n const typeStr = member.typeAnnotation\n ? this.typeToString(member.typeAnnotation.typeAnnotation)\n : 'unknown';\n const required = !member.optional;\n\n params.push({\n name: keyName,\n type: typeStr,\n required,\n });\n }\n }\n }\n }\n\n return params;\n }\n\n /** Convert TypeScript type annotation to string */\n private typeToString(type: t.TypeAnnotation | t.TSType): string {\n if (type.type === 'TSStringKeyword') return 'string';\n if (type.type === 'TSNumberKeyword') return 'number';\n if (type.type === 'TSBooleanKeyword') return 'boolean';\n if (type.type === 'TSUndefinedKeyword') return 'undefined';\n if (type.type === 'TSNullKeyword') return 'null';\n\n if (type.type === 'TSUnionType') {\n return (type as t.TSUnionType).types.map((t) => this.typeToString(t)).join(' | ');\n }\n\n if (type.type === 'TSTypeLiteral') {\n return 'object';\n }\n\n if (type.type === 'TSTypeReference' && (type as t.TSTypeReference).typeName) {\n const name = (type as t.TSTypeReference).typeName;\n return name.type === 'Identifier' ? name.name : 'unknown';\n }\n\n return 'unknown';\n }\n\n /** Infer navigator type from type name */\n private inferTypeFromName(typeName: string): { type: 'stack' | 'tab' | 'drawer' } | null {\n if (/stack/i.test(typeName)) return { type: 'stack' };\n if (/tab/i.test(typeName)) return { type: 'tab' };\n if (/drawer/i.test(typeName)) return { type: 'drawer' };\n return null;\n }\n\n /** Attach parsed type params to navigator screens */\n private attachParamsToNavigators(navigators: ParsedNavigator[], types: TypeExport[]): void {\n for (const navigator of navigators) {\n // Try to find a matching type export\n const matchingType = types.find((t) => t.type === navigator.type);\n\n if (matchingType) {\n for (const screen of navigator.screens) {\n const screenParams = matchingType.paramEntries.get(screen.name);\n if (screenParams) {\n screen.params = screenParams;\n }\n }\n }\n }\n }\n\n /** Build the complete navigation graph */\n private buildNavigationGraph(parsedNavigators: ParsedNavigator[]): NavigationGraph {\n const screens: Record<string, NavigationNode> = {};\n const navigators: NavigatorDescriptor[] = [];\n let initialScreen = '';\n\n // First pass: create navigator descriptors and identify root navigator\n for (const navigator of parsedNavigators) {\n const screenNames = navigator.screens.map((s) => s.name);\n\n // A declared navigator that yielded no routes is a parse miss, not\n // an empty navigator — nobody ships `<Stack.Navigator>` with nothing\n // in it. This is the signal that would have surfaced #396 years\n // earlier: the root navigator of this repo's own example app sat at\n // zero screens while its siblings had six, and every assertion in\n // the suite was `length > 0` over the TOTAL, so it stayed green.\n if (screenNames.length === 0) {\n console.warn(\n `[MCPGenerator] navigator \"${navigator.name}\" (${navigator.type}) declared ` +\n `no reachable screens. Its routes will be missing from the app map, so the ` +\n `agent will have no destination name for them. If the screens are there in ` +\n `the source, this is a parser gap — please report it with the file.`,\n );\n }\n\n navigators.push({\n name: navigator.name,\n type: navigator.type,\n screens: screenNames,\n parentNavigator: navigator.parentNavigator,\n });\n\n // Root navigator is likely the one that contains 'Auth' or 'Main' screens\n // or the first navigator with an initialRouteName\n if (\n !initialScreen &&\n navigator.initialRouteName &&\n (navigator.name.includes('Root') || screenNames.some((s) => s === 'Auth' || s === 'Main'))\n ) {\n initialScreen = navigator.initialRouteName;\n }\n }\n\n // Second pass: create navigation nodes with reachability\n for (const navigator of parsedNavigators) {\n for (const screen of navigator.screens) {\n const screenKey = screen.name;\n\n // Calculate reachable screens\n const reachableTo: string[] = [];\n const reachableFrom: string[] = [];\n\n // For screens in the same navigator\n for (const otherScreen of navigator.screens) {\n if (otherScreen.name !== screen.name) {\n if (navigator.type === 'tab') {\n // Tab screens can reach all other screens in the same tab\n reachableTo.push(otherScreen.name);\n reachableFrom.push(otherScreen.name);\n } else {\n // Stack screens can reach other screens via navigation\n reachableTo.push(otherScreen.name);\n }\n }\n }\n\n screens[screenKey] = {\n screenName: screen.name,\n navigatorType: navigator.type,\n parentNavigator: navigator.name,\n reachableFrom,\n reachableTo,\n params: screen.params,\n };\n }\n }\n\n // If no initial screen identified, use the first screen from the root navigator\n if (!initialScreen && parsedNavigators.length > 0) {\n const firstNavigator = parsedNavigators[0];\n const rootNavigator = parsedNavigators.find(\n (n) => n.name.includes('Root') || (firstNavigator && n.name === firstNavigator.name),\n );\n if (rootNavigator && rootNavigator.screens && rootNavigator.screens.length > 0) {\n const firstScreen = rootNavigator.screens[0];\n initialScreen = firstScreen?.name || '';\n }\n }\n\n return {\n screens,\n initialScreen,\n navigators,\n };\n }\n}\n","import type { AnalyzerConfig, ComponentDescriptor } from '../types';\nimport { readFileSync } from 'fs';\nimport * as parser from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\n/**\n * Analyzes React Native components to extract their semantic meaning,\n * props, and interaction points.\n */\nexport class ComponentAnalyzer {\n private config: AnalyzerConfig;\n\n constructor(config: AnalyzerConfig) {\n this.config = config;\n }\n\n /** Analyze components in a file */\n async analyzeFile(filePath: string): Promise<ComponentDescriptor[]> {\n try {\n const code = readFileSync(filePath, 'utf-8');\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', ['decorators', { decoratorsBeforeExport: true }]],\n });\n\n const components: ComponentDescriptor[] = [];\n\n traverse(ast, {\n JSXElement: (path) => {\n const component = this.extractComponentFromJSXElement(path.node);\n if (component) {\n components.push(component);\n }\n },\n });\n\n return components;\n } catch (error) {\n console.error(`Failed to analyze file ${filePath}:`, error);\n return [];\n }\n }\n\n private extractComponentFromJSXElement(\n element: t.JSXElement\n ): ComponentDescriptor | null {\n const elementName = this.getElementName(element.openingElement);\n if (!elementName) return null;\n\n const type = this.determineComponentType(elementName);\n const props = this.extractProps(element.openingElement);\n const { testID, accessibilityLabel } = this.extractAccessibilityProps(element.openingElement);\n const children = this.extractChildren(element.children);\n\n return {\n name: elementName,\n type,\n props: Object.keys(props).length > 0 ? props : undefined,\n children: children.length > 0 ? children : undefined,\n testID,\n accessibilityLabel,\n };\n }\n\n private getElementName(openingElement: t.JSXOpeningElement): string | null {\n if (t.isJSXIdentifier(openingElement.name)) {\n return openingElement.name.name;\n }\n if (t.isJSXMemberExpression(openingElement.name)) {\n const parts: string[] = [];\n let current: t.JSXNamespacedName | t.JSXMemberExpression | t.JSXIdentifier =\n openingElement.name;\n while (t.isJSXMemberExpression(current)) {\n if (t.isJSXIdentifier(current.property)) {\n parts.unshift(current.property.name);\n }\n current = current.object as t.JSXNamespacedName | t.JSXMemberExpression | t.JSXIdentifier;\n }\n if (t.isJSXIdentifier(current)) {\n parts.unshift(current.name);\n }\n return parts.join('.');\n }\n return null;\n }\n\n private determineComponentType(\n name: string\n ): 'view' | 'input' | 'button' | 'list' | 'modal' | 'custom' {\n const viewComponents = ['View', 'ScrollView', 'SafeAreaView', 'KeyboardAvoidingView'];\n const inputComponents = ['TextInput', 'Input'];\n const buttonComponents = ['TouchableOpacity', 'Pressable', 'Button'];\n const listComponents = ['FlatList', 'SectionList'];\n const modalComponents = ['Modal', 'BottomSheet'];\n\n if (viewComponents.includes(name)) return 'view';\n if (inputComponents.includes(name)) return 'input';\n if (buttonComponents.includes(name)) return 'button';\n if (listComponents.includes(name)) return 'list';\n if (modalComponents.includes(name)) return 'modal';\n\n return 'custom';\n }\n\n private extractProps(openingElement: t.JSXOpeningElement): Record<string, string> {\n const props: Record<string, string> = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if (attr.value === null) {\n // Boolean prop\n props[propName] = 'true';\n } else if (t.isStringLiteral(attr.value)) {\n props[propName] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n props[propName] = attr.value.expression.value;\n }\n }\n }\n\n return props;\n }\n\n private extractAccessibilityProps(openingElement: t.JSXOpeningElement): {\n testID?: string;\n accessibilityLabel?: string;\n } {\n const result: { testID?: string; accessibilityLabel?: string } = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if ((propName === 'testID' || propName === 'accessibilityLabel') && attr.value) {\n if (t.isStringLiteral(attr.value)) {\n result[propName as keyof typeof result] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && t.isStringLiteral(attr.value.expression)) {\n result[propName as keyof typeof result] = attr.value.expression.value;\n }\n }\n }\n }\n\n return result;\n }\n\n private extractChildren(\n children: Array<t.JSXElement[\"children\"][number]>,\n depth: number = 0,\n maxDepth: number = 3\n ): ComponentDescriptor[] {\n if (depth >= maxDepth) return [];\n\n const extracted: ComponentDescriptor[] = [];\n\n for (const child of children) {\n if (t.isJSXElement(child)) {\n const component = this.extractComponentFromJSXElement(child);\n if (component) {\n extracted.push(component);\n }\n }\n }\n\n return extracted;\n }\n}\n","import type { AnalyzerConfig, FormDescriptor, FormFieldDescriptor } from '../types';\nimport { readFileSync } from 'fs';\nimport * as parser from '@babel/parser';\nimport traverse from '@babel/traverse';\nimport * as t from '@babel/types';\nimport * as path from 'path';\n\n/**\n * Analyzes form structures in React Native screens, extracting\n * field definitions, validation rules, and submit actions.\n */\nexport class FormAnalyzer {\n private config: AnalyzerConfig;\n private stateVariables: Map<string, { varName: string; type: string }> = new Map();\n private inputElements: Array<{\n varName: string;\n appilotsId?: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n }> = [];\n private submitButtons: Array<{ label?: string; handler?: string }> = [];\n\n constructor(config: AnalyzerConfig) {\n this.config = config;\n }\n\n /** Analyze forms in a file */\n async analyzeFile(filePath: string): Promise<FormDescriptor[]> {\n try {\n const code = readFileSync(filePath, 'utf-8');\n const ast = parser.parse(code, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript', ['decorators', { decoratorsBeforeExport: true }]],\n });\n\n this.stateVariables.clear();\n this.inputElements = [];\n this.submitButtons = [];\n\n // First pass: extract state variables\n traverse(ast, {\n CallExpression: (path) => {\n this.extractStateVariables(path.node);\n },\n });\n\n // Second pass: extract input elements and buttons\n traverse(ast, {\n JSXElement: (path) => {\n this.extractFormElements(path.node);\n },\n });\n\n // Third pass: extract validation rules\n const validationRules = this.extractValidationRules(ast);\n\n // Build forms from extracted data\n return this.buildForms(filePath, validationRules);\n } catch (error) {\n console.error(`Failed to analyze forms in file ${filePath}:`, error);\n return [];\n }\n }\n\n private extractStateVariables(node: t.CallExpression): void {\n if (\n t.isIdentifier(node.callee) &&\n node.callee.name === 'useState' &&\n node.arguments.length > 0\n ) {\n // Try to find the assignment: const [varName, setVarName] = useState(...)\n // This is found in VariableDeclarator context\n return;\n }\n }\n\n private extractFormElements(element: t.JSXElement): void {\n const elementName = this.getElementName(element.openingElement);\n\n if (!elementName) return;\n\n // Detect input elements\n if (elementName === 'TextInput' || elementName === 'Input') {\n const inputInfo = this.extractInputInfo(element.openingElement);\n this.inputElements.push(inputInfo);\n }\n\n // Detect submit buttons (TouchableOpacity, Pressable, Button with onPress at end)\n if (['TouchableOpacity', 'Pressable', 'Button'].includes(elementName)) {\n const buttonInfo = this.extractButtonInfo(element.openingElement);\n if (buttonInfo) {\n this.submitButtons.push(buttonInfo);\n }\n }\n }\n\n private extractInputInfo(\n openingElement: t.JSXOpeningElement\n ): {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n } {\n const info: {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n } = { varName: '' };\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n const propValue = this.extractAttributeValue(attr.value);\n\n switch (propName) {\n case 'label':\n info.label = propValue;\n break;\n case 'placeholder':\n info.placeholder = propValue;\n break;\n case 'keyboardType':\n info.keyboardType = propValue;\n break;\n case 'testID':\n info.testID = propValue;\n break;\n case 'appilotsId':\n info.appilotsId = propValue;\n if (propValue) info.varName = propValue;\n break;\n case 'value':\n // Try to extract variable name from value binding\n if (attr.value && t.isJSXExpressionContainer(attr.value) && t.isIdentifier(attr.value.expression)) {\n info.varName = attr.value.expression.name;\n }\n break;\n }\n }\n }\n\n return info;\n }\n\n private extractButtonInfo(\n openingElement: t.JSXOpeningElement\n ): { label?: string; handler?: string } | null {\n const info: { label?: string; handler?: string } = {};\n\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n\n if (propName === 'title' || propName === 'label') {\n info.label = this.extractAttributeValue(attr.value);\n }\n\n if (propName === 'onPress') {\n if (attr.value && t.isJSXExpressionContainer(attr.value)) {\n if (t.isIdentifier(attr.value.expression)) {\n info.handler = attr.value.expression.name;\n } else if (t.isArrowFunctionExpression(attr.value.expression) || t.isFunctionExpression(attr.value.expression)) {\n info.handler = 'anonymous';\n }\n }\n }\n }\n }\n\n return Object.keys(info).length > 0 ? info : null;\n }\n\n private extractAttributeValue(value: t.JSXAttribute['value']): string | undefined {\n if (value === null) return undefined;\n if (t.isStringLiteral(value)) return value.value;\n if (t.isJSXExpressionContainer(value) && t.isStringLiteral(value.expression)) {\n return value.expression.value;\n }\n return undefined;\n }\n\n private getElementName(openingElement: t.JSXOpeningElement): string | null {\n if (t.isJSXIdentifier(openingElement.name)) {\n return openingElement.name.name;\n }\n return null;\n }\n\n private extractValidationRules(ast: t.File): Record<string, string> {\n const rules: Record<string, string> = {};\n\n traverse(ast, {\n IfStatement: (path) => {\n const test = path.node.test;\n const rule = this.extractRuleFromCondition(test);\n if (rule) {\n const { field, description } = rule;\n if (field && description) {\n rules[field] = description;\n }\n }\n },\n });\n\n return rules;\n }\n\n private extractRuleFromCondition(\n test: t.Expression\n ): { field: string; description: string } | null {\n let fieldName = '';\n let description = '';\n\n // Pattern: !varName.trim() or varName.length < N\n if (t.isUnaryExpression(test) && test.operator === '!') {\n if (t.isCallExpression(test.argument)) {\n const callExpr = test.argument;\n if (t.isMemberExpression(callExpr.callee)) {\n const memberExpr = callExpr.callee;\n if (t.isIdentifier(memberExpr.object)) {\n fieldName = memberExpr.object.name;\n description = `${fieldName} is required`;\n }\n }\n } else if (t.isIdentifier(test.argument)) {\n fieldName = test.argument.name;\n description = `${fieldName} is required`;\n }\n }\n\n // Pattern: varName.length < N\n if (t.isBinaryExpression(test) && (test.operator === '<' || test.operator === '<=')) {\n if (t.isMemberExpression(test.left)) {\n const memberExpr = test.left;\n if (t.isIdentifier(memberExpr.object)) {\n fieldName = memberExpr.object.name;\n if (t.isNumericLiteral(test.right)) {\n description = `${fieldName} must be at least ${test.right.value} characters`;\n }\n }\n }\n }\n\n // Pattern: !varName.includes('@')\n if (t.isUnaryExpression(test) && test.operator === '!') {\n if (t.isCallExpression(test.argument) && t.isMemberExpression(test.argument.callee)) {\n const methodName = t.isIdentifier(test.argument.callee.property)\n ? test.argument.callee.property.name\n : null;\n if (methodName === 'includes' && t.isIdentifier(test.argument.callee.object)) {\n fieldName = test.argument.callee.object.name;\n description = `${fieldName} format is invalid`;\n }\n }\n }\n\n return fieldName && description ? { field: fieldName, description } : null;\n }\n\n private buildForms(filePath: string, validationRules: Record<string, string>): FormDescriptor[] {\n if (this.inputElements.length === 0) return [];\n\n const fileName = path.basename(filePath, path.extname(filePath));\n const formId = `${fileName}Form`.replace(/Screen$/, '').toLowerCase();\n\n const fields: FormFieldDescriptor[] = this.inputElements.map((input) => {\n const fieldType = this.inferFieldType(input);\n const required = this.isFieldRequired(input.varName, validationRules);\n\n return {\n name: input.appilotsId || input.varName || input.testID || 'field',\n label: input.label,\n type: fieldType,\n required,\n placeholder: input.placeholder,\n };\n });\n\n const lastButton = this.submitButtons[this.submitButtons.length - 1];\n const submitAction = lastButton?.handler;\n\n return [\n {\n id: formId,\n fields,\n submitAction,\n validationRules: Object.keys(validationRules).length > 0 ? validationRules : undefined,\n },\n ];\n }\n\n private inferFieldType(input: {\n varName: string;\n label?: string;\n placeholder?: string;\n keyboardType?: string;\n testID?: string;\n appilotsId?: string;\n }): FormFieldDescriptor['type'] {\n const lowerVarName = input.varName.toLowerCase();\n const lowerLabel = input.label?.toLowerCase() || '';\n const lowerPlaceholder = input.placeholder?.toLowerCase() || '';\n const combined = `${lowerVarName} ${lowerLabel} ${lowerPlaceholder}`;\n\n // Check keyboardType first\n if (input.keyboardType === 'email-address' || input.keyboardType === 'email') {\n return 'email';\n }\n if (input.keyboardType === 'phone-pad' || input.keyboardType === 'numeric') {\n return input.keyboardType === 'numeric' ? 'number' : 'phone';\n }\n\n // Check variable/label/placeholder names\n if (combined.includes('email')) return 'email';\n if (combined.includes('phone') || combined.includes('tel')) return 'phone';\n if (combined.includes('password')) return 'text';\n if (combined.includes('number') || combined.includes('numeric')) return 'number';\n if (combined.includes('date')) return 'date';\n if (combined.includes('toggle') || combined.includes('check')) return 'toggle';\n if (combined.includes('select') || combined.includes('choice')) return 'select';\n\n return 'text';\n }\n\n private isFieldRequired(fieldName: string, rules: Record<string, string>): boolean {\n const rule = rules[fieldName];\n return rule !== undefined && rule.includes('required');\n }\n}\n","import type { AnalyzerConfig } from '../types';\nimport type { PlatformAnalyzer, PlatformAnalyzerOptions, PlatformAnalyzerResult } from './PlatformAnalyzer';\n\n/**\n * `PlatformAnalyzer` for a platform with no source-level analyzer yet\n * (anything other than `'react-native'` — Android/Kotlin, iOS/Swift, a\n * web SPA, ...). It does zero filesystem work — no glob, no parsing — so\n * it's safe to run on a project that has no JS/TSX at all. Screens for\n * these platforms come entirely from the declared manifest\n * (`appilots.manifest.json`); `MCPGenerator` merges the manifest on top\n * of whatever this analyzer returns (nothing).\n *\n * This keeps the manifest-only integration path (deliverable §2) fully\n * decoupled from `react-native`-specific tooling: a new platform can\n * ship its own generator days before anyone writes a real AST analyzer\n * for it.\n */\nexport class GenericPlatformAnalyzer implements PlatformAnalyzer {\n constructor(readonly platform: string) {}\n\n async analyze(\n _config: AnalyzerConfig,\n _options: PlatformAnalyzerOptions,\n ): Promise<PlatformAnalyzerResult> {\n return {\n screens: [],\n navigation: { screens: {}, initialScreen: '', navigators: [] },\n analyzedFiles: 0,\n };\n }\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport glob from 'fast-glob';\nimport traverse, { type NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { parseSource } from '../../ast/parse';\nimport { classifyWebJsxComponent } from '../../ast/jsx/web/classify';\nimport { getJsxElementName } from '../../ast/jsx/names';\nimport { getStringAttr, hasJsxAttribute } from '../../ast/jsx/attributes';\nimport { collectFunctions } from '../../ast/functions/collect';\nimport { analyzeFunctionBehavior, type FunctionBehavior } from '../../ast/functions/analyze-async';\nimport { extractWebNavigationCalls, staticRoutePath } from '../../ast/navigation/web-calls';\nimport {\n extractDestructiveJsDocTargets,\n extractPermissionsFromJsDoc,\n} from '../../extractors/appilots/jsdoc';\nimport type {\n ActionDescriptor,\n AnalyzerConfig,\n CollectionDescriptor,\n ComponentDescriptor,\n FormDescriptor,\n FormFieldDescriptor,\n LocatorDescriptor,\n RowActionDescriptor,\n ScreenDescriptor,\n} from '../../types';\n\n/**\n * One analyzed source file, before strict-screen filtering. The\n * orchestrator (`ReactWebPlatformAnalyzer`) decides inclusion — it also\n * knows the route table, so a file can qualify as a screen by being a\n * route component even when it matches no glob pattern.\n */\nexport interface WebScreenCandidate {\n descriptor: ScreenDescriptor;\n hasRegisterScreen: boolean;\n matchesScreenPattern: boolean;\n}\n\nexport interface WebScreenAnalysis {\n candidates: WebScreenCandidate[];\n /** Files matched by the include globs (before screen filtering). */\n analyzedFiles: number;\n}\n\n/**\n * Default glob patterns that identify screen files in a web project —\n * the RN defaults (`*Screen.tsx`, `screens/**`) don't match how web\n * apps are laid out, so the web dialect looks at the conventional\n * page/route/view directories instead.\n */\nexport const DEFAULT_WEB_SCREEN_PATTERNS = [\n '**/pages/**/*.{ts,tsx,js,jsx}',\n '**/routes/**/*.{ts,tsx,js,jsx}',\n '**/views/**/*.{ts,tsx,js,jsx}',\n '**/app/**/*.{ts,tsx,js,jsx}',\n '**/*Page.{ts,tsx,js,jsx}',\n '**/*Screen.{ts,tsx,js,jsx}',\n '**/*View.{ts,tsx,js,jsx}',\n];\n\nconst DESTRUCTIVE_VERB =\n /(delete|destroy|remove|discard|wipe|erase|drop|terminate|revoke|deactivate|disable)/i;\n\nconst LISTISH_TAGS = new Set(['ul', 'ol', 'dl', 'table', 'tbody']);\n\n/**\n * Web (DOM/JSX) sibling of `ScreenAnalyzer`. Same output contract\n * (`ScreenDescriptor`), web-native vocabulary:\n *\n * - actions come from `onClick`/`onSubmit` (not `onPress`)\n * - locators come from `data-testid`, `id`, `name`, `aria-label`, and\n * `<label htmlFor>` association (plus `appilotsId`, shared with RN)\n * - field types come from `type=` / `inputMode=` (not `keyboardType`)\n * - navigation targets come from React Router (`useNavigate`'s\n * `navigate('/x')`, `<Link to>`, `<Navigate to>`, internal `href`s);\n * they are recorded as ROUTE PATHS here and resolved to screen names\n * by the orchestrator, which owns the route table\n */\nexport class WebScreenAnalyzer {\n private config: AnalyzerConfig;\n private verbose = process.env.VERBOSE === 'true';\n private screenPatterns: string[];\n\n constructor(config: AnalyzerConfig, options?: { screenPatterns?: string[] }) {\n this.config = config;\n this.screenPatterns = options?.screenPatterns ?? DEFAULT_WEB_SCREEN_PATTERNS;\n }\n\n async analyze(): Promise<WebScreenAnalysis> {\n const {\n include = ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n exclude = ['**/node_modules/**', '**/dist/**', '**/build/**'],\n } = this.config;\n\n // `.d.ts` files are dropped unconditionally rather than via the `exclude`\n // default above, because `exclude` is overridable by config and this is not\n // a preference: a declaration file has no JSX, no components and no\n // handlers, so it can never yield a screen — it can only inflate\n // `analyzedFiles`.\n //\n // Found through a test that counted the fixture's files and expected 6.\n // Any developer who had run `sst` locally got 7 and a failure that read\n // like a product regression: SST writes a generated, GITIGNORED\n // `sst-env.d.ts` into every directory with a package.json, including\n // test/fixtures/web-app. CI never has that file, so this only ever failed\n // on a workstation.\n const files = (await glob(include, { cwd: this.config.rootDir, ignore: exclude })).filter(\n (file) => !file.endsWith('.d.ts'),\n );\n const patternMatches = await glob(this.screenPatterns, {\n cwd: this.config.rootDir,\n ignore: exclude,\n });\n const patternSet = new Set(patternMatches.map((f) => path.resolve(this.config.rootDir, f)));\n\n const candidates: WebScreenCandidate[] = [];\n for (const file of files) {\n const filePath = path.resolve(this.config.rootDir, file);\n try {\n const candidate = await this.analyzeFile(filePath);\n if (!candidate) continue;\n candidate.matchesScreenPattern = patternSet.has(filePath);\n candidates.push(candidate);\n if (this.verbose) {\n console.log(`[WebScreenAnalyzer] ✓ Analyzed: ${candidate.descriptor.name} (${file})`);\n }\n } catch (error) {\n if (this.verbose) {\n console.warn(\n `[WebScreenAnalyzer] Failed to parse ${file}:`,\n error instanceof Error ? error.message : error,\n );\n }\n }\n }\n\n return { candidates, analyzedFiles: files.length };\n }\n\n async analyzeFile(filePath: string): Promise<WebScreenCandidate | null> {\n const source = await fs.readFile(filePath, 'utf-8');\n const ast = parseSource(source, this.config.parserPlugins as any);\n\n const registerScreenMeta = this.extractRegisterScreenMetadata(ast);\n const componentName = this.extractComponentName(ast);\n const labelsByHtmlFor = this.collectHtmlForLabels(ast);\n const handlerBehaviors = this.collectWebHandlerBehaviors(ast);\n\n const forms = this.mergeForms(\n registerScreenMeta?.forms ?? [],\n this.extractForms(ast, labelsByHtmlFor),\n );\n const actions = this.extractActions(ast, registerScreenMeta, handlerBehaviors);\n const components = this.extractComponents(ast);\n const collections = this.extractCollections(ast);\n const navigationTargets = this.extractNavigationTargets(ast);\n\n const permissionsFromJsDoc = extractPermissionsFromJsDoc(source);\n const destructiveTags = extractDestructiveJsDocTargets(source);\n if (destructiveTags) {\n for (const action of actions) {\n if (destructiveTags === '*' || destructiveTags.has(action.id)) {\n action.destructive = true;\n }\n }\n }\n\n const name =\n registerScreenMeta?.name ||\n componentName ||\n path.basename(filePath).replace(/\\.(tsx?|jsx?)$/, '');\n\n const descriptor: ScreenDescriptor = {\n name,\n filePath,\n title: registerScreenMeta?.title,\n description: registerScreenMeta?.description,\n components,\n forms,\n actions,\n navigationTargets,\n ...(collections.length > 0 ? { collections } : {}),\n ...(registerScreenMeta?.suggestedPrompts && registerScreenMeta.suggestedPrompts.length > 0\n ? { suggestedPrompts: registerScreenMeta.suggestedPrompts }\n : {}),\n ...(permissionsFromJsDoc\n ? {\n permissions: permissionsFromJsDoc,\n ...(permissionsFromJsDoc.isPii ? { isPii: true } : {}),\n }\n : {}),\n };\n\n return {\n descriptor,\n hasRegisterScreen: registerScreenMeta !== null || this.detectRegisterScreenCall(ast),\n matchesScreenPattern: false,\n };\n }\n\n // ── registerScreen ────────────────────────────────────────────────\n\n private detectRegisterScreenCall(ast: t.File): boolean {\n let found = false;\n traverse(ast, {\n CallExpression: (nodePath) => {\n if (found) return;\n if (isRegisterScreenCallee(nodePath.node.callee)) {\n found = true;\n nodePath.stop();\n }\n },\n });\n return found;\n }\n\n private extractRegisterScreenMetadata(\n ast: t.File,\n ): (Partial<ScreenDescriptor> & { name: string }) | null {\n let plain: Record<string, unknown> | null = null;\n traverse(ast, {\n CallExpression: (nodePath) => {\n if (!isRegisterScreenCallee(nodePath.node.callee)) return;\n const arg = nodePath.node.arguments[0];\n if (t.isObjectExpression(arg)) {\n plain = literalToPlain(arg) as Record<string, unknown>;\n }\n },\n });\n if (!plain) return null;\n const meta = plain as Record<string, unknown>;\n\n const result: Partial<ScreenDescriptor> & { name: string } = {\n name: typeof meta.name === 'string' ? meta.name : '',\n actions: [],\n forms: [],\n navigationTargets: [],\n components: [],\n };\n if (typeof meta.title === 'string') result.title = meta.title;\n if (typeof meta.description === 'string') result.description = meta.description;\n if (Array.isArray(meta.suggestedPrompts)) {\n const prompts = meta.suggestedPrompts\n .filter((p): p is string => typeof p === 'string')\n .map((p) => p.trim())\n .filter((p) => p.length > 0);\n if (prompts.length > 0) result.suggestedPrompts = prompts;\n }\n if (Array.isArray(meta.actions)) {\n result.actions = meta.actions\n .filter((a): a is Record<string, unknown> => typeof a === 'object' && a !== null)\n .filter((a) => typeof a.id === 'string' && a.id.length > 0)\n .map((a) => ({ type: 'custom', ...a }) as ActionDescriptor);\n }\n if (Array.isArray(meta.fields)) {\n const fields = meta.fields\n .filter((f): f is Record<string, unknown> => typeof f === 'object' && f !== null)\n .filter((f) => typeof f.id === 'string' && f.id.length > 0)\n .map(\n (f) =>\n ({\n name: f.id,\n type: typeof f.type === 'string' ? f.type : 'text',\n required: f.required === true,\n ...(typeof f.label === 'string' ? { label: f.label } : {}),\n ...(typeof f.placeholder === 'string' ? { placeholder: f.placeholder } : {}),\n ...(f.defaultValue !== undefined ? { defaultValue: f.defaultValue } : {}),\n ...(Array.isArray(f.options) ? { options: f.options } : {}),\n }) as FormFieldDescriptor,\n );\n if (fields.length > 0) result.forms = [{ id: 'default', fields }];\n }\n return result;\n }\n\n // ── Component name / structure ────────────────────────────────────\n\n /** Default-exported component name, else the first exported capitalized function. */\n private extractComponentName(ast: t.File): string {\n let defaultName = '';\n let firstExported = '';\n\n traverse(ast, {\n ExportDefaultDeclaration: (nodePath) => {\n const declaration = nodePath.node.declaration;\n if (t.isFunctionDeclaration(declaration) && declaration.id?.name) {\n defaultName = declaration.id.name;\n } else if (t.isIdentifier(declaration)) {\n defaultName = declaration.name;\n }\n },\n ExportNamedDeclaration: (nodePath) => {\n if (firstExported) return;\n const declaration = nodePath.node.declaration;\n if (\n t.isFunctionDeclaration(declaration) &&\n declaration.id &&\n /^[A-Z]/.test(declaration.id.name)\n ) {\n firstExported = declaration.id.name;\n } else if (t.isVariableDeclaration(declaration)) {\n for (const declarator of declaration.declarations) {\n if (\n t.isIdentifier(declarator.id) &&\n /^[A-Z]/.test(declarator.id.name) &&\n (t.isArrowFunctionExpression(declarator.init) ||\n t.isFunctionExpression(declarator.init))\n ) {\n firstExported = declarator.id.name;\n break;\n }\n }\n }\n },\n });\n\n return defaultName || firstExported;\n }\n\n private extractComponents(ast: t.File): ComponentDescriptor[] {\n const components: ComponentDescriptor[] = [];\n const seen = new Set<string>();\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element);\n if (!name || seen.has(name)) return;\n seen.add(name);\n\n const role = classifyWebJsxComponent(name, element);\n const type: ComponentDescriptor['type'] =\n role === 'select' || role === 'toggle' || role === 'date'\n ? 'input'\n : role === 'input' ||\n role === 'button' ||\n role === 'list' ||\n role === 'modal' ||\n role === 'view'\n ? (role as ComponentDescriptor['type'])\n : 'custom';\n\n const component: ComponentDescriptor = { name, type };\n const testId = getStringAttr(element, 'data-testid') ?? getStringAttr(element, 'testID');\n const ariaLabel = getStringAttr(element, 'aria-label');\n if (testId) component.testID = testId;\n if (ariaLabel) component.accessibilityLabel = ariaLabel;\n components.push(component);\n },\n });\n\n return components;\n }\n\n // ── <label htmlFor> association ───────────────────────────────────\n\n private collectHtmlForLabels(ast: t.File): Map<string, string> {\n const labels = new Map<string, string>();\n traverse(ast, {\n JSXElement: (nodePath) => {\n const element = nodePath.node;\n if (getJsxElementName(element.openingElement) !== 'label') return;\n const htmlFor = getStringAttr(element.openingElement, 'htmlFor');\n if (!htmlFor) return;\n const text = jsxTextContent(element);\n if (text) labels.set(htmlFor, text);\n },\n });\n return labels;\n }\n\n // ── Forms ─────────────────────────────────────────────────────────\n\n private extractForms(ast: t.File, labelsByHtmlFor: Map<string, string>): FormDescriptor[] {\n interface FormBucket {\n id: string;\n fields: Map<string, FormFieldDescriptor>;\n submitAction?: string;\n }\n const formBuckets = new Map<t.JSXElement | null, FormBucket>();\n const usedIds = new Set<string>();\n let formCount = 0;\n\n // Form ids address a form in the MCP doc, so they have to stay\n // unique even when the markup gives us nothing to name them by\n // (two anonymous <form>s, or an anonymous form alongside inputs\n // that live outside any form).\n const uniqueId = (preferred: string): string => {\n if (!usedIds.has(preferred)) {\n usedIds.add(preferred);\n return preferred;\n }\n let suffix = 2;\n while (usedIds.has(`${preferred}-${suffix}`)) suffix += 1;\n const id = `${preferred}-${suffix}`;\n usedIds.add(id);\n return id;\n };\n\n const bucketFor = (formElement: t.JSXElement | null): FormBucket => {\n let bucket = formBuckets.get(formElement);\n if (bucket) return bucket;\n formCount += 1;\n let preferred = 'default';\n let submitAction: string | undefined;\n if (formElement) {\n const opening = formElement.openingElement;\n preferred =\n getStringAttr(opening, 'id') ??\n getStringAttr(opening, 'name') ??\n getStringAttr(opening, 'data-testid') ??\n (formCount === 1 ? 'default' : `form-${formCount}`);\n submitAction = this.handlerNameFromAttr(opening, 'onSubmit');\n }\n bucket = { id: uniqueId(preferred), fields: new Map(), submitAction };\n formBuckets.set(formElement, bucket);\n return bucket;\n };\n\n traverse(ast, {\n JSXElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element.openingElement);\n if (!name) return;\n const role = classifyWebJsxComponent(name, element.openingElement);\n if (!['input', 'select', 'toggle', 'date'].includes(role)) return;\n // <option> elements classify as 'select' via ARIA mapping — they\n // are values of their parent <select>, not fields themselves.\n if (name === 'option') return;\n\n const field = this.extractField(element, role, labelsByHtmlFor);\n if (!field.name) return;\n\n const formParent = nodePath.findParent(\n (p) =>\n p.isJSXElement() &&\n (getJsxElementName(p.node.openingElement) === 'form' ||\n getStringAttr(p.node.openingElement, 'role') === 'form'),\n ) as NodePath<t.JSXElement> | null;\n const bucket = bucketFor(formParent ? formParent.node : null);\n if (!bucket.fields.has(field.name)) bucket.fields.set(field.name, field);\n },\n });\n\n // Submit buttons: attach the LAST submit-capable button's handler to\n // its form when the form has no onSubmit of its own.\n traverse(ast, {\n JSXElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element.openingElement);\n if (!name) return;\n if (!this.isSubmitElement(name, element.openingElement)) return;\n const formParent = nodePath.findParent(\n (p) => p.isJSXElement() && getJsxElementName(p.node.openingElement) === 'form',\n ) as NodePath<t.JSXElement> | null;\n if (!formParent) return;\n const bucket = formBuckets.get(formParent.node);\n if (!bucket) return;\n const handler = this.handlerNameFromAttr(element.openingElement, 'onClick');\n if (!bucket.submitAction && handler) bucket.submitAction = handler;\n },\n });\n\n return Array.from(formBuckets.values())\n .filter((bucket) => bucket.fields.size > 0)\n .map((bucket) => ({\n id: bucket.id,\n fields: Array.from(bucket.fields.values()),\n ...(bucket.submitAction && bucket.submitAction !== 'anonymous'\n ? { submitAction: bucket.submitAction }\n : {}),\n }));\n }\n\n private isSubmitElement(name: string, opening: t.JSXOpeningElement): boolean {\n const type = getStringAttr(opening, 'type');\n if (name === 'button') return type === 'submit' || type === undefined;\n if (name === 'input') return type === 'submit';\n return false;\n }\n\n private extractField(\n element: t.JSXElement,\n role: string,\n labelsByHtmlFor: Map<string, string>,\n ): FormFieldDescriptor {\n const opening = element.openingElement;\n const componentName = getJsxElementName(opening) ?? undefined;\n const field: FormFieldDescriptor = {\n name: '',\n type: 'text',\n required: false,\n sourceComponent: componentName,\n };\n\n const appilotsId = getStringAttr(opening, 'appilotsId');\n const dataTestId = getStringAttr(opening, 'data-testid');\n const domId = getStringAttr(opening, 'id');\n const nameAttr = getStringAttr(opening, 'name');\n const ariaLabel = getStringAttr(opening, 'aria-label');\n const placeholder = getStringAttr(opening, 'placeholder');\n\n if (placeholder) field.placeholder = placeholder;\n if (ariaLabel) field.label = ariaLabel;\n if (domId && labelsByHtmlFor.has(domId)) field.label = labelsByHtmlFor.get(domId);\n\n // Name precedence: explicit appilotsId > form `name` > `id` >\n // data-testid (with common prefixes stripped) > value binding > a\n // slug of the label/placeholder.\n if (appilotsId) {\n field.name = appilotsId;\n field.locator = mergeLocator(field.locator, {\n id: appilotsId,\n appilotsId,\n source: 'appilotsId',\n });\n }\n if (dataTestId) {\n if (!field.name) field.name = dataTestId.replace(/^(input-|field-|txt-)/, '');\n field.locator = mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: dataTestId }),\n testID: dataTestId,\n source: field.locator?.source ?? 'data-testid',\n });\n }\n if (nameAttr && !field.name) field.name = nameAttr;\n if (domId) {\n if (!field.name) field.name = domId;\n field.locator = mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: domId }),\n source: field.locator?.source ?? 'id',\n });\n }\n if (ariaLabel) {\n field.locator = mergeLocator(field.locator, {\n ...(field.locator?.id ? {} : { id: slugify(ariaLabel) }),\n accessibilityLabel: ariaLabel,\n source: field.locator?.source ?? 'aria-label',\n });\n }\n\n // Bindings and required.\n for (const attr of opening.attributes) {\n if (!t.isJSXAttribute(attr) || !t.isJSXIdentifier(attr.name)) continue;\n const attrName = attr.name.name;\n if (attrName === 'required') {\n if (attr.value === null) field.required = true;\n else if (\n t.isJSXExpressionContainer(attr.value) &&\n t.isBooleanLiteral(attr.value.expression)\n ) {\n field.required = attr.value.expression.value;\n }\n }\n if (\n (attrName === 'value' || attrName === 'checked') &&\n attr.value &&\n t.isJSXExpressionContainer(attr.value) &&\n t.isIdentifier(attr.value.expression)\n ) {\n field.valueBinding = attr.value.expression.name;\n if (!field.name) field.name = attr.value.expression.name;\n }\n }\n if (getStringAttr(opening, 'aria-required') === 'true') field.required = true;\n\n // Field type: semantic role, then type= / inputMode=, then wording.\n if (role === 'select') field.type = 'select';\n else if (role === 'toggle') field.type = 'toggle';\n else if (role === 'date') field.type = 'date';\n else {\n field.type = this.inferInputType(opening, field);\n }\n\n // <select> static options.\n if (componentName === 'select') {\n const options = this.extractSelectOptions(element);\n if (options.length > 0) field.options = options;\n }\n\n if (!field.name || isWeakInferredFieldName(field.name)) {\n const labelish = field.label ?? field.placeholder;\n if (labelish) field.name = slugify(labelish);\n }\n if (!field.locator && field.name) {\n field.locator = { id: field.name, label: field.label, source: 'inferred' };\n } else if (field.locator && !field.locator.id && field.name) {\n field.locator = mergeLocator(field.locator, {\n id: field.name,\n label: field.label,\n source: field.locator.source ?? 'inferred',\n });\n }\n\n return field;\n }\n\n private inferInputType(\n opening: t.JSXOpeningElement,\n field: FormFieldDescriptor,\n ): FormFieldDescriptor['type'] {\n const type = getStringAttr(opening, 'type');\n if (type === 'email') return 'email';\n if (type === 'tel') return 'phone';\n if (type === 'number') return 'number';\n if (type === 'date' || type === 'datetime-local' || type === 'month' || type === 'week')\n return 'date';\n\n const inputMode = getStringAttr(opening, 'inputMode') ?? getStringAttr(opening, 'inputmode');\n if (inputMode === 'email') return 'email';\n if (inputMode === 'tel') return 'phone';\n if (inputMode === 'numeric' || inputMode === 'decimal') return 'number';\n\n const combined = `${field.name} ${field.label ?? ''} ${field.placeholder ?? ''}`.toLowerCase();\n if (combined.includes('email')) return 'email';\n if (combined.includes('phone') || combined.includes('tel')) return 'phone';\n return 'text';\n }\n\n private extractSelectOptions(selectElement: t.JSXElement): { label: string; value: string }[] {\n const options: { label: string; value: string }[] = [];\n for (const child of selectElement.children) {\n if (!t.isJSXElement(child)) continue;\n if (getJsxElementName(child.openingElement) !== 'option') continue;\n const value = getStringAttr(child.openingElement, 'value');\n const label = jsxTextContent(child) || value || '';\n if (label && value) options.push({ label, value });\n }\n return options;\n }\n\n private mergeForms(primary: FormDescriptor[], secondary: FormDescriptor[]): FormDescriptor[] {\n const out: FormDescriptor[] = primary.map((form) => ({ ...form, fields: [...form.fields] }));\n for (const form of secondary) {\n const existing = out.find((candidate) => candidate.id === form.id);\n if (!existing) {\n out.push({ ...form, fields: [...form.fields] });\n continue;\n }\n for (const field of form.fields) {\n const existingField = existing.fields.find((candidate) => candidate.name === field.name);\n if (!existingField) {\n existing.fields.push(field);\n continue;\n }\n existingField.label = existingField.label ?? field.label;\n existingField.placeholder = existingField.placeholder ?? field.placeholder;\n existingField.options = existingField.options ?? field.options;\n existingField.locator = existingField.locator ?? field.locator;\n existingField.sourceComponent = existingField.sourceComponent ?? field.sourceComponent;\n existingField.valueBinding = existingField.valueBinding ?? field.valueBinding;\n existingField.required = existingField.required || field.required;\n if (existingField.type === 'text' && field.type !== 'text') existingField.type = field.type;\n }\n existing.submitAction = existing.submitAction ?? form.submitAction;\n }\n return out;\n }\n\n // ── Actions ───────────────────────────────────────────────────────\n\n private extractActions(\n ast: t.File,\n registerScreenMeta: (Partial<ScreenDescriptor> & { name: string }) | null,\n handlerBehaviors: Map<string, WebHandlerBehavior>,\n ): ActionDescriptor[] {\n const actions = [...(registerScreenMeta?.actions ?? [])];\n const actionIds = new Set(actions.map((a) => a.id));\n const actionLabels = new Map(\n actions.filter((a) => a.label).map((a) => [normalizeLabel(a.label!), a] as const),\n );\n\n traverse(ast, {\n JSXElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element.openingElement);\n if (!name) return;\n if (classifyWebJsxComponent(name, element.openingElement) !== 'button') return;\n\n const action = this.extractActionFromElement(element, nodePath);\n if (!action) return;\n\n const existingByLabel = action.label\n ? actionLabels.get(normalizeLabel(action.label))\n : undefined;\n if (existingByLabel) {\n this.mergeActionMetadata(existingByLabel, action);\n return;\n }\n if (action.id && !actionIds.has(action.id)) {\n actions.push(action);\n actionIds.add(action.id);\n if (action.label) actionLabels.set(normalizeLabel(action.label), action);\n }\n },\n });\n\n this.enrichActionsFromHandlers(actions, handlerBehaviors);\n return actions;\n }\n\n private extractActionFromElement(\n element: t.JSXElement,\n nodePath: NodePath<t.JSXElement>,\n ): ActionDescriptor | null {\n const opening = element.openingElement;\n const componentName = getJsxElementName(opening) ?? undefined;\n const action: ActionDescriptor = { id: '', type: 'custom', sourceComponent: componentName };\n\n // Label: aria-label > text content > value= (input[type=submit]) > title=.\n const ariaLabel = getStringAttr(opening, 'aria-label');\n const label =\n ariaLabel ??\n jsxTextContent(element) ??\n getStringAttr(opening, 'value') ??\n getStringAttr(opening, 'title');\n if (label) action.label = label;\n if (ariaLabel) {\n action.locator = mergeLocator(action.locator, {\n accessibilityLabel: ariaLabel,\n source: 'aria-label',\n });\n }\n\n // Locator/id: appilotsId > data-testid > id > slug(label).\n const appilotsId = getStringAttr(opening, 'appilotsId');\n const dataTestId = getStringAttr(opening, 'data-testid');\n const domId = getStringAttr(opening, 'id');\n if (appilotsId) {\n action.id = appilotsId;\n action.locator = mergeLocator(action.locator, {\n id: appilotsId,\n appilotsId,\n source: 'appilotsId',\n });\n } else if (dataTestId) {\n action.id = dataTestId;\n action.locator = mergeLocator(action.locator, {\n id: dataTestId,\n testID: dataTestId,\n source: 'data-testid',\n });\n } else if (domId) {\n action.id = domId;\n action.locator = mergeLocator(action.locator, { id: domId, source: 'id' });\n } else if (action.label) {\n action.id = slugify(action.label);\n }\n if (!action.id) return null;\n\n // Navigation declared on the element itself: <Link to>, <a href>.\n const to = routePathAttr(opening, 'to') ?? routePathAttr(opening, 'href');\n if (to && to.startsWith('/')) {\n action.type = 'navigation';\n // Route path — the orchestrator resolves it to a screen name.\n action.targetScreen = to;\n } else if (to && !to.startsWith('/') && !hasJsxAttribute(opening, 'onClick')) {\n // External link with no handler — not an agent action.\n return null;\n }\n\n // Handler: onClick (identifier or inline).\n let handlerName: string | undefined;\n const onClickAttr = opening.attributes.find(\n (attr): attr is t.JSXAttribute =>\n t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name) && attr.name.name === 'onClick',\n );\n if (onClickAttr?.value && t.isJSXExpressionContainer(onClickAttr.value)) {\n const expr = onClickAttr.value.expression;\n if (t.isIdentifier(expr)) {\n handlerName = expr.name;\n action.handler = expr.name;\n } else if (!t.isJSXEmptyExpression(expr)) {\n const inlineNavCalls = extractWebNavigationCalls(expr);\n const inlineNav = inlineNavCalls.find((call) => call.targetPath);\n if (inlineNav?.targetPath) {\n action.type = 'navigation';\n action.targetScreen = inlineNav.targetPath;\n } else if (inlineNavCalls.some((call) => call.method === 'goBack')) {\n // `onClick={() => navigate(-1)}` — no target to resolve, but\n // the agent still needs to know a route change is coming.\n action.type = 'navigation';\n action.successSignal = {\n type: 'goBack',\n description: 'Action returns to the previous page',\n };\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n expectedOutcome: 'navigation',\n };\n }\n const inlineHandler = firstCalledFunctionName(expr);\n if (inlineHandler) {\n handlerName = inlineHandler;\n action.handler = inlineHandler;\n }\n }\n }\n if (handlerName) {\n const lower = handlerName.toLowerCase();\n if (lower.includes('submit')) action.type = 'submit';\n else if (lower.includes('navigate') && action.type === 'custom') action.type = 'navigation';\n }\n\n // Submit semantics: type=\"submit\" (or a default-type button) inside a\n // <form> submits it; inherit the form's onSubmit handler.\n if (componentName && this.isSubmitElement(componentName, opening)) {\n const formParent = nodePath.findParent(\n (p) => p.isJSXElement() && getJsxElementName(p.node.openingElement) === 'form',\n ) as NodePath<t.JSXElement> | null;\n if (formParent) {\n action.type = 'submit';\n if (!action.handler) {\n const formHandler = this.handlerNameFromAttr(formParent.node.openingElement, 'onSubmit');\n if (formHandler && formHandler !== 'anonymous') {\n action.handler = formHandler;\n handlerName = formHandler;\n }\n }\n }\n }\n\n // Destructive heuristics — explicit prop wins, then verb matching.\n if (hasJsxAttribute(opening, 'destructive') || hasJsxAttribute(opening, 'aria-destructive')) {\n const value =\n getStringAttr(opening, 'destructive') ?? getStringAttr(opening, 'aria-destructive');\n action.destructive = value !== 'false';\n } else if (\n (handlerName && DESTRUCTIVE_VERB.test(handlerName)) ||\n DESTRUCTIVE_VERB.test(action.id)\n ) {\n action.destructive = true;\n }\n\n if (!action.locator && action.id) {\n action.locator = {\n id: action.id,\n label: action.label,\n source: action.label ? 'label' : 'inferred',\n };\n }\n\n return action;\n }\n\n private mergeActionMetadata(target: ActionDescriptor, source: ActionDescriptor): void {\n target.handler = target.handler ?? source.handler;\n target.targetScreen = target.targetScreen ?? source.targetScreen;\n target.description = target.description ?? source.description;\n target.locator = target.locator ?? source.locator;\n target.nativeConfirmationExpected =\n target.nativeConfirmationExpected || source.nativeConfirmationExpected || undefined;\n target.requiresConfirmation =\n target.requiresConfirmation || source.requiresConfirmation || undefined;\n target.destructive = target.destructive || source.destructive || undefined;\n target.effect = target.effect ?? source.effect;\n target.riskLevel = target.riskLevel ?? source.riskLevel;\n target.appilotsInferred = target.appilotsInferred ?? source.appilotsInferred;\n }\n\n private enrichActionsFromHandlers(\n actions: ActionDescriptor[],\n behaviors: Map<string, WebHandlerBehavior>,\n ): void {\n for (const action of actions) {\n const behavior = action.handler ? behaviors.get(action.handler) : undefined;\n if (!behavior) continue;\n\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n ...behavior.base.appilotsInferred,\n };\n if (behavior.nativeConfirmationExpected || behavior.base.nativeConfirmationExpected) {\n action.nativeConfirmationExpected = true;\n }\n if (behavior.targetPath && !action.targetScreen) {\n action.targetScreen = behavior.targetPath;\n if (action.type === 'custom') action.type = 'navigation';\n action.appilotsInferred = {\n ...(action.appilotsInferred ?? {}),\n expectedOutcome: 'navigation',\n };\n }\n if (behavior.base.successSignal && !action.successSignal) {\n action.successSignal = behavior.base.successSignal;\n }\n if (behavior.base.failureSignal && !action.failureSignal) {\n action.failureSignal = behavior.base.failureSignal;\n }\n if (behavior.base.opensModal && !action.opensModal) {\n action.opensModal = behavior.base.opensModal;\n }\n if (\n behavior.base.destructive ||\n action.destructive === true ||\n action.requiresConfirmation === true ||\n action.effect === 'destructive' ||\n action.riskLevel === 'high'\n ) {\n action.destructive = true;\n action.effect = action.effect ?? 'destructive';\n action.riskLevel = action.riskLevel ?? 'high';\n action.requiresConfirmation = action.requiresConfirmation ?? true;\n }\n }\n }\n\n /**\n * Handler behavior via the shared, platform-neutral analyzer\n * (async/await, `.then`, state setters, toasts, destructive verbs)\n * plus the web-only signals: React Router navigation targets and\n * `window.confirm(...)` as the native confirmation dialog.\n */\n private collectWebHandlerBehaviors(ast: t.File): Map<string, WebHandlerBehavior> {\n const handlers = collectFunctions(ast);\n const out = new Map<string, WebHandlerBehavior>();\n\n for (const [name, fn] of handlers) {\n const base = analyzeFunctionBehavior(name, fn, handlers);\n const navCalls = fn.body ? extractWebNavigationCalls(fn.body) : [];\n const firstNav = navCalls.find((call) => call.targetPath);\n const goesBack = navCalls.some((call) => call.method === 'goBack');\n out.set(name, {\n base: {\n ...base,\n ...(goesBack && !base.successSignal\n ? {\n successSignal: {\n type: 'goBack',\n description: 'Action returns to the previous page',\n },\n }\n : {}),\n },\n targetPath: firstNav?.targetPath,\n nativeConfirmationExpected: fn.body ? containsWindowConfirm(fn.body) : false,\n });\n }\n return out;\n }\n\n private handlerNameFromAttr(opening: t.JSXOpeningElement, attrName: string): string | undefined {\n const attr = opening.attributes.find(\n (candidate): candidate is t.JSXAttribute =>\n t.isJSXAttribute(candidate) &&\n t.isJSXIdentifier(candidate.name) &&\n candidate.name.name === attrName,\n );\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n const expr = attr.value.expression;\n if (t.isIdentifier(expr)) return expr.name;\n if (t.isArrowFunctionExpression(expr) || t.isFunctionExpression(expr)) {\n return firstCalledFunctionName(expr) ?? 'anonymous';\n }\n return undefined;\n }\n\n // ── Navigation targets (route paths — resolved by the orchestrator) ─\n\n private extractNavigationTargets(ast: t.File): string[] {\n const targets = new Set<string>();\n\n for (const call of extractWebNavigationCalls(ast)) {\n if (call.targetPath && call.targetPath.startsWith('/')) targets.add(call.targetPath);\n }\n\n traverse(ast, {\n JSXOpeningElement: (nodePath) => {\n const element = nodePath.node;\n const name = getJsxElementName(element);\n if (name === 'Link' || name === 'NavLink' || name === 'Navigate') {\n const to = routePathAttr(element, 'to');\n if (to && to.startsWith('/')) targets.add(to);\n }\n if (name === 'a') {\n const href = routePathAttr(element, 'href');\n if (href && href.startsWith('/')) targets.add(href);\n }\n },\n });\n\n return Array.from(targets).sort();\n }\n\n // ── Collections ───────────────────────────────────────────────────\n\n private extractCollections(ast: t.File): CollectionDescriptor[] {\n const collections: CollectionDescriptor[] = [];\n const seen = new Set<string>();\n\n traverse(ast, {\n JSXExpressionContainer: (nodePath) => {\n const expr = nodePath.node.expression;\n if (\n !t.isCallExpression(expr) ||\n !t.isMemberExpression(expr.callee) ||\n !t.isIdentifier(expr.callee.object) ||\n !t.isIdentifier(expr.callee.property) ||\n expr.callee.property.name !== 'map'\n ) {\n return;\n }\n const callback = expr.arguments[0];\n if (!t.isArrowFunctionExpression(callback) && !t.isFunctionExpression(callback)) return;\n\n const enclosing = nodePath.findParent((p) =>\n p.isJSXElement(),\n ) as NodePath<t.JSXElement> | null;\n const enclosingName = enclosing ? getJsxElementName(enclosing.node.openingElement) : null;\n const enclosingRole =\n enclosing && enclosingName\n ? classifyWebJsxComponent(enclosingName, enclosing.node.openingElement)\n : null;\n const returnsListItem = callbackReturnsTag(callback, new Set(['li', 'tr']));\n\n // Only treat as a data collection when it renders list rows —\n // maps over <option>s belong to the select field, maps over\n // arbitrary JSX are usually layout.\n if (enclosingName === 'select') return;\n const isListContext =\n (enclosingName !== null && LISTISH_TAGS.has(enclosingName)) ||\n enclosingRole === 'list' ||\n returnsListItem;\n if (!isListContext) return;\n\n const dataSource = expr.callee.object.name;\n if (seen.has(dataSource)) return;\n seen.add(dataSource);\n\n const itemNames = collectionItemNames(callback);\n const displayFields = collectionDisplayFields(callback, itemNames);\n const keyField = collectionKeyField(callback, itemNames);\n const rowAction = collectionRowAction(callback);\n const itemType = inferItemType(dataSource, displayFields);\n const identityFields = inferIdentityFields(keyField, displayFields);\n\n collections.push({\n id: dataSource,\n component: enclosingName ?? 'list',\n ...(itemType ? { itemType } : {}),\n dataSource,\n ...(keyField ? { keyField } : {}),\n ...(displayFields.length > 0 ? { displayFields } : {}),\n ...(rowAction ? { rowAction, rowActions: [rowAction] } : {}),\n ...(identityFields.length > 0 ? { identityFields } : {}),\n });\n },\n });\n\n return collections;\n }\n}\n\ninterface WebHandlerBehavior {\n base: FunctionBehavior;\n /** Route path this handler navigates to, when statically detectable. */\n targetPath?: string;\n /** True when the handler calls `window.confirm(...)` / `confirm(...)`. */\n nativeConfirmationExpected: boolean;\n}\n\n// ── Module-level helpers (web dialect) ─────────────────────────────\n\nfunction isRegisterScreenCallee(callee: t.Expression | t.V8IntrinsicIdentifier): boolean {\n return (\n (t.isIdentifier(callee) && callee.name === 'registerScreen') ||\n (t.isMemberExpression(callee) &&\n t.isIdentifier(callee.property) &&\n callee.property.name === 'registerScreen')\n );\n}\n\n/** Literal-only AST → plain JS value; non-literal parts become undefined. */\nfunction literalToPlain(node: t.Node): unknown {\n if (t.isStringLiteral(node) || t.isNumericLiteral(node) || t.isBooleanLiteral(node)) {\n return node.value;\n }\n if (t.isNullLiteral(node)) return null;\n if (t.isArrayExpression(node)) {\n return node.elements\n .filter((el): el is t.Expression => el !== null && t.isExpression(el))\n .map((el) => literalToPlain(el))\n .filter((value) => value !== undefined);\n }\n if (t.isObjectExpression(node)) {\n const out: Record<string, unknown> = {};\n for (const prop of node.properties) {\n if (!t.isObjectProperty(prop)) continue;\n const key = t.isIdentifier(prop.key)\n ? prop.key.name\n : t.isStringLiteral(prop.key)\n ? prop.key.value\n : undefined;\n if (!key || !t.isExpression(prop.value)) continue;\n const value = literalToPlain(prop.value);\n if (value !== undefined) out[key] = value;\n }\n return out;\n }\n return undefined;\n}\n\n/** Concatenated, trimmed JSXText (plus string-literal expressions) of an element. */\nfunction jsxTextContent(element: t.JSXElement): string | undefined {\n const parts: string[] = [];\n const walk = (children: t.JSXElement['children']) => {\n for (const child of children) {\n if (t.isJSXText(child)) {\n const trimmed = child.value.replace(/\\s+/g, ' ').trim();\n if (trimmed) parts.push(trimmed);\n } else if (t.isJSXExpressionContainer(child) && t.isStringLiteral(child.expression)) {\n parts.push(child.expression.value);\n } else if (t.isJSXElement(child)) {\n walk(child.children);\n }\n }\n };\n walk(element.children);\n const text = parts.join(' ').trim();\n return text.length > 0 ? text : undefined;\n}\n\n/** First named function called inside an inline handler body. */\nfunction firstCalledFunctionName(node: t.Node): string | undefined {\n if (t.isIdentifier(node)) return node.name;\n if (t.isArrowFunctionExpression(node) || t.isFunctionExpression(node)) {\n return firstCalledFunctionName(node.body);\n }\n if (t.isBlockStatement(node)) {\n for (const statement of node.body) {\n const handler = firstCalledFunctionName(statement);\n if (handler) return handler;\n }\n return undefined;\n }\n if (t.isExpressionStatement(node)) return firstCalledFunctionName(node.expression);\n if (t.isReturnStatement(node)) {\n return node.argument ? firstCalledFunctionName(node.argument) : undefined;\n }\n if (t.isAwaitExpression(node) || t.isUnaryExpression(node)) {\n return firstCalledFunctionName(node.argument);\n }\n if (t.isCallExpression(node)) {\n // navigate('/x')/confirm() are signals, not user-level handlers.\n if (t.isIdentifier(node.callee) && !/^(navigate|confirm|alert)$/.test(node.callee.name)) {\n return node.callee.name;\n }\n return undefined;\n }\n return undefined;\n}\n\nfunction containsWindowConfirm(body: t.Node): boolean {\n let found = false;\n traverse(\n body as any,\n {\n noScope: true,\n CallExpression: (nodePath: any) => {\n const callee = (nodePath.node as t.CallExpression).callee;\n if (t.isIdentifier(callee) && callee.name === 'confirm') found = true;\n if (\n t.isMemberExpression(callee) &&\n t.isIdentifier(callee.object) &&\n callee.object.name === 'window' &&\n t.isIdentifier(callee.property) &&\n callee.property.name === 'confirm'\n ) {\n found = true;\n }\n },\n } as any,\n );\n return found;\n}\n\nfunction mergeLocator(\n current: LocatorDescriptor | undefined,\n next: LocatorDescriptor,\n): LocatorDescriptor {\n return { ...(current ?? {}), ...next };\n}\n\n/**\n * Route path from a JSX attribute (`to=`, `href=`), accepting both a\n * plain string and a template literal (`` to={`/vehicles/${id}`} ``,\n * which yields the route pattern `/vehicles/:id`).\n */\nfunction routePathAttr(opening: t.JSXOpeningElement, attrName: string): string | undefined {\n const literal = getStringAttr(opening, attrName);\n if (literal) return literal;\n const attr = opening.attributes.find(\n (candidate): candidate is t.JSXAttribute =>\n t.isJSXAttribute(candidate) &&\n t.isJSXIdentifier(candidate.name) &&\n candidate.name.name === attrName,\n );\n if (!attr?.value || !t.isJSXExpressionContainer(attr.value)) return undefined;\n return staticRoutePath(attr.value.expression);\n}\n\nfunction slugify(label: string): string {\n return label\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction normalizeLabel(label: string): string {\n return label\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]/g, '');\n}\n\nfunction isWeakInferredFieldName(name: string): boolean {\n return /^(text|value|input|query|search|selected|checked)$/i.test(name);\n}\n\n// ── Collection helpers ─────────────────────────────────────────────\n\nfunction collectionItemNames(callback: t.Function): Set<string> {\n const names = new Set<string>(['item']);\n const firstParam = callback.params[0];\n if (t.isIdentifier(firstParam)) names.add(firstParam.name);\n if (t.isObjectPattern(firstParam)) {\n for (const prop of firstParam.properties) {\n if (t.isObjectProperty(prop) && t.isIdentifier(prop.key) && t.isIdentifier(prop.value)) {\n names.add(prop.value.name);\n }\n }\n }\n return names;\n}\n\nfunction collectionDisplayFields(callback: t.Function, itemNames: Set<string>): string[] {\n const fields = new Set<string>();\n if (!callback.body) return [];\n traverse(\n callback.body as any,\n {\n noScope: true,\n MemberExpression: (nodePath: any) => {\n const node = nodePath.node as t.MemberExpression;\n if (\n t.isIdentifier(node.object) &&\n itemNames.has(node.object.name) &&\n t.isIdentifier(node.property)\n ) {\n fields.add(node.property.name);\n }\n },\n } as any,\n );\n return Array.from(fields).sort();\n}\n\nfunction collectionKeyField(callback: t.Function, itemNames: Set<string>): string | undefined {\n let keyField: string | undefined;\n if (!callback.body) return undefined;\n traverse(\n callback.body as any,\n {\n noScope: true,\n JSXAttribute: (nodePath: any) => {\n const attr = nodePath.node as t.JSXAttribute;\n if (!t.isJSXIdentifier(attr.name) || attr.name.name !== 'key') return;\n if (!attr.value || !t.isJSXExpressionContainer(attr.value)) return;\n const expr = attr.value.expression;\n if (\n t.isMemberExpression(expr) &&\n t.isIdentifier(expr.object) &&\n itemNames.has(expr.object.name) &&\n t.isIdentifier(expr.property)\n ) {\n keyField = keyField ?? expr.property.name;\n }\n },\n } as any,\n );\n return keyField;\n}\n\nfunction collectionRowAction(callback: t.Function): RowActionDescriptor | undefined {\n if (!callback.body) return undefined;\n const navCall = extractWebNavigationCalls(callback.body).find((call) => call.targetPath);\n if (!navCall?.targetPath) return undefined;\n return {\n type: 'navigation',\n // Route path — the orchestrator resolves it to a screen name.\n targetScreen: navCall.targetPath,\n description: `Clicking a row opens ${navCall.targetPath}`,\n };\n}\n\nfunction callbackReturnsTag(callback: t.Function, tags: Set<string>): boolean {\n let found = false;\n const inspect = (node: t.Node | null | undefined) => {\n if (!node || found) return;\n if (t.isJSXElement(node)) {\n const name = getJsxElementName(node.openingElement);\n if (name && tags.has(name)) found = true;\n return;\n }\n if (t.isBlockStatement(node)) {\n for (const statement of node.body) {\n if (t.isReturnStatement(statement)) inspect(statement.argument);\n }\n }\n if (t.isParenthesizedExpression(node)) inspect(node.expression);\n if (t.isConditionalExpression(node)) {\n inspect(node.consequent);\n inspect(node.alternate);\n }\n };\n inspect(callback.body);\n return found;\n}\n\nfunction inferItemType(dataSource: string, displayFields: string[]): string | undefined {\n const singular = dataSource\n .replace(/^render/i, '')\n .replace(/(List|Items|Data|Rows|Sections)$/i, '')\n .replace(/s$/i, '');\n const candidate = singular.charAt(0).toUpperCase() + singular.slice(1);\n if (candidate.length > 1) return candidate;\n if (displayFields.length > 0) return 'Item';\n return undefined;\n}\n\n/** Naming conventions only — see the native analyzer for why `plate` left. */\nfunction inferIdentityFields(keyField: string | undefined, displayFields: string[]): string[] {\n const out = new Set<string>();\n if (keyField) out.add(keyField);\n for (const field of displayFields) {\n if (/^(id|uuid|key|name|title|email|slug)$/i.test(field)) out.add(field);\n }\n return Array.from(out);\n}\n","import type * as t from '@babel/types';\nimport {\n getExpressionIdentifierAttr,\n getStringAttr,\n hasJsxAttribute,\n} from '../attributes';\nimport type { SemanticComponentRole } from '../classify';\n\n/**\n * Web (DOM/ARIA) counterpart of `classifyJsxComponent`. Lives in its own\n * module so the React Native vocabulary in `../classify.ts` stays\n * byte-identical for the RN pipeline (output-parity guarded); the two\n * share the `SemanticComponentRole` result type so downstream consumers\n * (field typing, action extraction) are dialect-agnostic.\n *\n * Classification precedence:\n * 1. Explicit ARIA `role` attribute (the author's declared semantics).\n * 2. Intrinsic DOM tag vocabulary (`button`, `input[type=...]`, ...).\n * 3. Well-known component names (React Router's `Link`, `Select`, ...).\n * 4. The same prop-contract heuristics the RN classifier uses, with\n * `onClick` in place of `onPress`.\n */\n\nconst VIEW_TAGS = new Set([\n 'div', 'span', 'section', 'main', 'article', 'aside', 'header', 'footer',\n 'nav', 'fieldset', 'form', 'p',\n]);\nconst LIST_TAGS = new Set(['ul', 'ol', 'dl', 'table', 'tbody']);\nconst BUTTON_TAGS = new Set(['button']);\nconst INPUT_TAGS = new Set(['input', 'textarea']);\nconst MODAL_TAGS = new Set(['dialog']);\n\n/** Component names that are buttons by convention (React Router links). */\nconst BUTTON_COMPONENTS = new Set(['Button', 'IconButton', 'Link', 'NavLink']);\nconst INPUT_COMPONENTS = new Set(['Input', 'TextField', 'TextArea', 'Textarea']);\nconst LIST_COMPONENTS = new Set(['List', 'Table', 'DataGrid', 'DataTable']);\nconst MODAL_COMPONENTS = new Set(['Modal', 'Dialog', 'Drawer', 'Popover', 'BottomSheet']);\n\nconst ARIA_ROLE_TO_SEMANTIC: Record<string, SemanticComponentRole> = {\n button: 'button',\n link: 'button',\n tab: 'button',\n menuitem: 'button',\n textbox: 'input',\n searchbox: 'input',\n spinbutton: 'input',\n listbox: 'select',\n combobox: 'select',\n radiogroup: 'select',\n radio: 'select',\n option: 'select',\n checkbox: 'toggle',\n switch: 'toggle',\n dialog: 'modal',\n alertdialog: 'modal',\n list: 'list',\n table: 'list',\n grid: 'list',\n form: 'view',\n};\n\n/** `input[type=...]` → semantic role. Anything unlisted stays 'input'. */\nconst INPUT_TYPE_TO_SEMANTIC: Record<string, SemanticComponentRole> = {\n checkbox: 'toggle',\n radio: 'select',\n date: 'date',\n 'datetime-local': 'date',\n month: 'date',\n week: 'date',\n time: 'date',\n submit: 'button',\n button: 'button',\n reset: 'button',\n image: 'button',\n hidden: 'custom',\n range: 'input',\n file: 'input',\n color: 'input',\n};\n\nexport function classifyWebJsxComponent(\n name: string,\n element?: t.JSXOpeningElement,\n): SemanticComponentRole {\n // 1. Explicit ARIA role wins — it's the author's declared semantics.\n if (element) {\n const role = getStringAttr(element, 'role');\n if (role && ARIA_ROLE_TO_SEMANTIC[role]) return ARIA_ROLE_TO_SEMANTIC[role];\n }\n\n // 2. Intrinsic DOM tags (lowercase in JSX).\n if (/^[a-z]/.test(name)) {\n if (name === 'input') {\n const type = element ? getStringAttr(element, 'type') : undefined;\n if (type && INPUT_TYPE_TO_SEMANTIC[type]) return INPUT_TYPE_TO_SEMANTIC[type];\n return 'input';\n }\n if (INPUT_TAGS.has(name)) return 'input';\n if (name === 'select') return 'select';\n if (BUTTON_TAGS.has(name)) return 'button';\n if (name === 'a') {\n // A link is only an interaction target when it goes somewhere or\n // does something; a bare anchor is layout.\n if (element && (hasJsxAttribute(element, 'href') || hasJsxAttribute(element, 'onClick'))) {\n return 'button';\n }\n return 'view';\n }\n if (LIST_TAGS.has(name)) return 'list';\n if (MODAL_TAGS.has(name)) return 'modal';\n if (VIEW_TAGS.has(name)) return 'view';\n return 'custom';\n }\n\n // 3. Well-known component names (same name heuristics as RN, plus the\n // React Router navigation components).\n if (LIST_COMPONENTS.has(name)) return 'list';\n if (MODAL_COMPONENTS.has(name)) return 'modal';\n if (/date/i.test(name)) return 'date';\n if (/(select|picker|dropdown|radio)/i.test(name)) return 'select';\n if (/(checkbox|switch|toggle)/i.test(name)) return 'toggle';\n if (INPUT_COMPONENTS.has(name)) return 'input';\n if (BUTTON_COMPONENTS.has(name)) return 'button';\n\n // 4. Prop-contract heuristics — the RN classifier's, with onClick.\n if (element) {\n const hasOptions = hasJsxAttribute(element, 'options');\n const hasValue = hasJsxAttribute(element, 'value');\n const hasChecked = hasJsxAttribute(element, 'checked') || hasJsxAttribute(element, 'selected');\n const hasOnChange = hasJsxAttribute(element, 'onChange') || hasJsxAttribute(element, 'onValueChange');\n const hasOnClick = hasJsxAttribute(element, 'onClick');\n\n if (hasOptions && (hasValue || hasOnChange)) return 'select';\n if (hasChecked && hasOnChange) return 'toggle';\n if (hasOnChange && (hasJsxAttribute(element, 'label') || hasJsxAttribute(element, 'placeholder'))) {\n return 'input';\n }\n if (hasOnClick) return 'button';\n if (\n getStringAttr(element, 'open') ||\n getExpressionIdentifierAttr(element, 'open') ||\n getExpressionIdentifierAttr(element, 'isOpen')\n ) {\n return 'modal';\n }\n }\n\n return 'custom';\n}\n","import * as t from '@babel/types';\n\nexport function getJsxElementName(\n openingElement: t.JSXOpeningElement,\n): string | null {\n return getJsxName(openingElement.name);\n}\n\nexport function getJsxName(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName,\n): string | null {\n if (t.isJSXIdentifier(name)) return name.name;\n if (t.isJSXNamespacedName(name)) return `${name.namespace.name}:${name.name.name}`;\n if (t.isJSXMemberExpression(name)) {\n const objectName = getJsxName(name.object as any);\n const propertyName = t.isJSXIdentifier(name.property) ? name.property.name : null;\n return objectName && propertyName ? `${objectName}.${propertyName}` : null;\n }\n return null;\n}\n","import traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\n/**\n * Web dialect of `extractNavigationCalls` — React Router / browser\n * history verbs instead of React Navigation's `navigation.*` object.\n * Kept in its own module (like `web/classify.ts`) so `calls.ts` stays\n * untouched for the RN pipeline.\n */\nexport interface WebNavigationCall {\n method: 'navigate' | 'replace' | 'goBack';\n /** Route path, e.g. `'/vehicles/new'`. Absent for `navigate(-1)`. */\n targetPath?: string;\n}\n\n/** Identifiers whose `.push()`/`.replace()`/`.back()` mean routing. */\nconst ROUTERISH_OBJECTS = /^(router|history|navigation)$/;\n\n/**\n * Static route path of an expression, when there is one. Handles the two\n * shapes a route target takes in real code:\n *\n * - a string literal: `'/vehicles/new'`\n * - a template literal: `` `/vehicles/${item.id}` `` → `/vehicles/:id`,\n * i.e. the ROUTE PATTERN it instantiates. The interpolated property\n * name becomes the param name (`:param` when it isn't a simple\n * member/identifier), which is what makes such a path matchable\n * against a `:vehicleId`-style route declaration.\n */\nexport function staticRoutePath(node: t.Node | null | undefined): string | undefined {\n if (!node) return undefined;\n if (t.isStringLiteral(node)) return node.value;\n if (t.isTemplateLiteral(node)) {\n let path = '';\n node.quasis.forEach((quasi, index) => {\n path += quasi.value.cooked ?? quasi.value.raw;\n const expr = node.expressions[index];\n if (expr) path += `:${paramNameOf(expr)}`;\n });\n return path;\n }\n return undefined;\n}\n\nfunction paramNameOf(expr: t.Node): string {\n if (t.isIdentifier(expr)) return expr.name;\n if (t.isMemberExpression(expr) && t.isIdentifier(expr.property)) return expr.property.name;\n return 'param';\n}\n\nexport function extractWebNavigationCalls(ast: t.File | t.Node): WebNavigationCall[] {\n const calls: WebNavigationCall[] = [];\n\n const inspect = (node: t.Node) => {\n if (t.isCallExpression(node)) {\n // navigate('/x'), navigate('/x', { replace: true }), navigate(-1)\n if (t.isIdentifier(node.callee) && node.callee.name === 'navigate') {\n const first = node.arguments[0];\n const targetPath = staticRoutePath(first);\n if (targetPath !== undefined) {\n calls.push({\n method: hasReplaceOption(node.arguments[1]) ? 'replace' : 'navigate',\n targetPath,\n });\n } else if (t.isNumericLiteral(first) || (t.isUnaryExpression(first) && first.operator === '-')) {\n calls.push({ method: 'goBack' });\n }\n return;\n }\n // router.push('/x') / history.replace('/x') / history.back()\n if (\n t.isMemberExpression(node.callee) &&\n t.isIdentifier(node.callee.object) &&\n ROUTERISH_OBJECTS.test(node.callee.object.name) &&\n t.isIdentifier(node.callee.property)\n ) {\n const method = node.callee.property.name;\n const targetPath = staticRoutePath(node.arguments[0]);\n if ((method === 'push' || method === 'navigate') && targetPath !== undefined) {\n calls.push({ method: 'navigate', targetPath });\n } else if (method === 'replace' && targetPath !== undefined) {\n calls.push({ method: 'replace', targetPath });\n } else if (method === 'back' || method === 'goBack') {\n calls.push({ method: 'goBack' });\n }\n }\n return;\n }\n // window.location.href = '/x' (and location.assign/replace are calls,\n // handled above only for routerish objects — cover them here).\n if (\n t.isAssignmentExpression(node) &&\n t.isMemberExpression(node.left) &&\n t.isIdentifier(node.left.property) &&\n node.left.property.name === 'href' &&\n isLocationExpression(node.left.object) &&\n t.isStringLiteral(node.right) &&\n node.right.value.startsWith('/')\n ) {\n calls.push({ method: 'navigate', targetPath: node.right.value });\n }\n };\n\n traverse(ast as any, {\n noScope: !t.isFile(ast as t.Node),\n enter: (nodePath: any) => inspect(nodePath.node),\n } as any);\n\n return calls;\n}\n\nfunction hasReplaceOption(arg: t.Node | undefined | null): boolean {\n if (!arg || !t.isObjectExpression(arg)) return false;\n return arg.properties.some(\n (prop) =>\n t.isObjectProperty(prop) &&\n t.isIdentifier(prop.key) &&\n prop.key.name === 'replace' &&\n t.isBooleanLiteral(prop.value) &&\n prop.value.value === true,\n );\n}\n\nfunction isLocationExpression(node: t.Node): boolean {\n if (t.isIdentifier(node)) return node.name === 'location';\n return (\n t.isMemberExpression(node) &&\n t.isIdentifier(node.object) &&\n node.object.name === 'window' &&\n t.isIdentifier(node.property) &&\n node.property.name === 'location'\n );\n}\n","import { promises as fs } from 'fs';\nimport path from 'path';\nimport glob from 'fast-glob';\nimport traverse from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { parseSource } from '../../ast/parse';\nimport { getStringAttr, hasJsxAttribute } from '../../ast/jsx/attributes';\nimport { getJsxElementName } from '../../ast/jsx/names';\nimport type {\n AnalyzerConfig,\n NavigationGraph,\n NavigationNode,\n ParamDescriptor,\n} from '../../types';\n\n/**\n * A single resolved React Router route: its full URL path and the screen\n * (component) it renders. This is the web analog of a React Navigation\n * `<Stack.Screen name=...>` entry.\n */\nexport interface WebRoute {\n /** Full path with parent segments joined, e.g. `/vehicles/:id`. */\n path: string;\n /** Screen name — the route component's name, or derived from the path. */\n screenName: string;\n /** Path params extracted from `:segment` placeholders. */\n params?: ParamDescriptor[];\n /** True for `<Route index>` / `{ index: true }` routes. */\n index?: boolean;\n /**\n * True when this route has child routes — it renders a layout wrapper\n * around them, not a page of its own. A layout route loses to its own\n * `index` child when both resolve to the same path, since the index\n * child is what the user actually lands on.\n */\n layout?: boolean;\n}\n\nexport interface WebNavigationResult {\n graph: NavigationGraph;\n routes: WebRoute[];\n}\n\n/**\n * Web navigatorType for `NavigationNode`/`NavigatorDescriptor`. The wire\n * schema's `navigatorTypeSchema` is an open union, so this validates\n * as-is; the relay degrades unknown types to generic handling.\n */\nexport const WEB_NAVIGATOR_TYPE = 'route';\n\n/**\n * Analyzes React Router route configuration to build a navigation graph\n * — the sibling of `NavigationAnalyzer` (which is 100% react-navigation\n * and never runs for `platform: 'web'`). Understands both declaration\n * styles:\n *\n * - JSX: `<Routes><Route path=\"/x\" element={<X/>}/></Routes>` (nested\n * `<Route>` children join their parent's path)\n * - Object config: `createBrowserRouter([{ path, element, children }])`\n * (also `createHashRouter`, `createMemoryRouter`, `useRoutes`)\n */\nexport class WebNavigationAnalyzer {\n private config: AnalyzerConfig;\n private navigationInclude: string[];\n private navigationExclude: string[];\n\n constructor(\n config: AnalyzerConfig,\n options?: { navigationInclude?: string[]; navigationExclude?: string[] },\n ) {\n this.config = config;\n this.navigationInclude = options?.navigationInclude ?? [];\n this.navigationExclude = options?.navigationExclude ?? [];\n }\n\n async analyze(): Promise<WebNavigationResult> {\n const files = await this.findRouteFiles();\n const routes: WebRoute[] = [];\n\n for (const filePath of files) {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n // Cheap pre-filter: skip files with no router vocabulary at all.\n if (!/createBrowserRouter|createHashRouter|createMemoryRouter|useRoutes|<Route[\\s>]/.test(content)) {\n continue;\n }\n const ast = parseSource(content, this.config.parserPlugins as any);\n routes.push(...this.extractJsxRoutes(ast));\n routes.push(...this.extractObjectRoutes(ast));\n } catch (error) {\n console.warn(`[WebNavigationAnalyzer] Failed to parse ${filePath}:`, error);\n }\n }\n\n const deduped = this.dedupeRoutes(routes);\n return { graph: this.buildGraph(deduped), routes: deduped };\n }\n\n /** Files likely to contain route configuration. */\n private async findRouteFiles(): Promise<string[]> {\n const patterns = [\n '**/*{router,routes,Router,Routes}*.{ts,tsx,js,jsx}',\n '**/App.{ts,tsx,js,jsx}',\n '**/app.{ts,tsx,js,jsx}',\n '**/main.{ts,tsx,js,jsx}',\n '**/index.{ts,tsx,js,jsx}',\n ...this.navigationInclude,\n ];\n const ignore = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n ...(this.config.exclude || []),\n ...this.navigationExclude,\n ];\n const files = await glob(patterns, { cwd: this.config.rootDir, ignore });\n return files.map((file) => path.join(this.config.rootDir, file));\n }\n\n // ── JSX <Route> style ────────────────────────────────────────────\n\n private extractJsxRoutes(ast: t.File): WebRoute[] {\n const routes: WebRoute[] = [];\n\n const visitRoute = (element: t.JSXElement, parentPath: string) => {\n const opening = element.openingElement;\n const name = getJsxElementName(opening);\n if (name !== 'Route') {\n // Non-Route wrappers (<Routes>, fragments, layouts) — descend.\n for (const child of element.children) {\n if (t.isJSXElement(child)) visitRoute(child, parentPath);\n }\n return;\n }\n\n const segment = getStringAttr(opening, 'path');\n const isIndex = hasJsxAttribute(opening, 'index') && !segment;\n const fullPath = this.joinPaths(parentPath, segment, isIndex);\n const componentName =\n this.componentNameFromElementAttr(opening) ?? undefined;\n\n const isLeaf = !element.children.some(\n (child) => t.isJSXElement(child) && getJsxElementName(child.openingElement) === 'Route',\n );\n\n if ((segment || isIndex) && (componentName || isLeaf)) {\n routes.push(this.buildRoute(fullPath, componentName, isIndex, !isLeaf));\n }\n\n for (const child of element.children) {\n if (t.isJSXElement(child)) visitRoute(child, fullPath);\n }\n };\n\n traverse(ast, {\n JSXElement: (nodePath) => {\n const name = getJsxElementName(nodePath.node.openingElement);\n if (name !== 'Routes' && name !== 'Route') return;\n // Only start from the outermost router element; nested ones are\n // reached through visitRoute's own recursion.\n if (nodePath.findParent((p) => {\n if (!p.isJSXElement()) return false;\n const parentName = getJsxElementName(p.node.openingElement);\n return parentName === 'Routes' || parentName === 'Route';\n })) {\n return;\n }\n visitRoute(nodePath.node, '');\n },\n });\n\n return routes;\n }\n\n /** `element={<VehicleList/>}` or `Component={VehicleList}`. */\n private componentNameFromElementAttr(opening: t.JSXOpeningElement): string | null {\n for (const attr of opening.attributes) {\n if (!t.isJSXAttribute(attr) || !t.isJSXIdentifier(attr.name)) continue;\n if (attr.name.name === 'element' && t.isJSXExpressionContainer(attr.value)) {\n const expr = attr.value.expression;\n if (t.isJSXElement(expr)) return getJsxElementName(expr.openingElement);\n }\n if (attr.name.name === 'Component' && t.isJSXExpressionContainer(attr.value)) {\n if (t.isIdentifier(attr.value.expression)) return attr.value.expression.name;\n }\n }\n return null;\n }\n\n // ── createBrowserRouter([...]) / useRoutes([...]) style ──────────\n\n private extractObjectRoutes(ast: t.File): WebRoute[] {\n const routes: WebRoute[] = [];\n const ROUTER_FACTORIES = new Set([\n 'createBrowserRouter',\n 'createHashRouter',\n 'createMemoryRouter',\n 'useRoutes',\n ]);\n\n traverse(ast, {\n CallExpression: (nodePath) => {\n const callee = nodePath.node.callee;\n if (!t.isIdentifier(callee) || !ROUTER_FACTORIES.has(callee.name)) return;\n const first = nodePath.node.arguments[0];\n if (!t.isArrayExpression(first)) return;\n this.visitRouteObjects(first, '', routes);\n },\n });\n\n return routes;\n }\n\n private visitRouteObjects(arr: t.ArrayExpression, parentPath: string, out: WebRoute[]): void {\n for (const element of arr.elements) {\n if (!t.isObjectExpression(element)) continue;\n\n let segment: string | undefined;\n let isIndex = false;\n let componentName: string | undefined;\n let children: t.ArrayExpression | undefined;\n\n for (const prop of element.properties) {\n if (!t.isObjectProperty(prop) || !t.isIdentifier(prop.key)) continue;\n const key = prop.key.name;\n if (key === 'path' && t.isStringLiteral(prop.value)) segment = prop.value.value;\n if (key === 'index' && t.isBooleanLiteral(prop.value)) isIndex = prop.value.value;\n if (key === 'element' && t.isJSXElement(prop.value)) {\n componentName = getJsxElementName(prop.value.openingElement) ?? undefined;\n }\n if (key === 'Component' && t.isIdentifier(prop.value)) componentName = prop.value.name;\n if (key === 'children' && t.isArrayExpression(prop.value)) children = prop.value;\n }\n\n const fullPath = this.joinPaths(parentPath, segment, isIndex);\n if ((segment !== undefined || isIndex) && (componentName || !children)) {\n out.push(this.buildRoute(fullPath, componentName, isIndex, Boolean(children)));\n }\n if (children) this.visitRouteObjects(children, fullPath, out);\n }\n }\n\n // ── Shared route building ────────────────────────────────────────\n\n private joinPaths(parent: string, segment: string | undefined, isIndex: boolean): string {\n if (isIndex || segment === undefined) return parent || '/';\n if (segment.startsWith('/')) return this.normalizePath(segment);\n return this.normalizePath(`${parent === '/' ? '' : parent}/${segment}`);\n }\n\n private normalizePath(p: string): string {\n const cleaned = `/${p}`.replace(/\\/+/g, '/');\n return cleaned.length > 1 ? cleaned.replace(/\\/$/, '') : cleaned;\n }\n\n private buildRoute(\n fullPath: string,\n componentName: string | undefined,\n isIndex: boolean,\n isLayout: boolean,\n ): WebRoute {\n const params = this.paramsFromPath(fullPath);\n return {\n path: fullPath,\n screenName: componentName ?? screenNameFromPath(fullPath),\n ...(params.length > 0 ? { params } : {}),\n ...(isIndex ? { index: true } : {}),\n ...(isLayout ? { layout: true } : {}),\n };\n }\n\n private paramsFromPath(routePath: string): ParamDescriptor[] {\n const params: ParamDescriptor[] = [];\n for (const segment of routePath.split('/')) {\n if (!segment.startsWith(':')) continue;\n const optional = segment.endsWith('?');\n const name = segment.slice(1, optional ? -1 : undefined);\n if (name) params.push({ name, type: 'string', required: !optional });\n }\n return params;\n }\n\n /**\n * One entry per path. When several declarations resolve to the same\n * path, keep the one that best describes what the user lands on: a\n * page beats a layout wrapper (an `index` child and its parent layout\n * share a path), and a resolved component name beats a name derived\n * from the path.\n */\n private dedupeRoutes(routes: WebRoute[]): WebRoute[] {\n const byPath = new Map<string, WebRoute>();\n for (const route of routes) {\n const existing = byPath.get(route.path);\n if (!existing || routeScore(route) > routeScore(existing)) {\n byPath.set(route.path, route);\n }\n }\n return Array.from(byPath.values());\n }\n\n private buildGraph(routes: WebRoute[]): NavigationGraph {\n const screens: Record<string, NavigationNode> = {};\n const navigatorName = 'router';\n const screenNames = routes.map((r) => r.screenName);\n\n for (const route of routes) {\n const others = screenNames.filter((name) => name !== route.screenName);\n screens[route.screenName] = {\n screenName: route.screenName,\n // Open-union value — web routes, not a RN stack/tab/drawer.\n navigatorType: WEB_NAVIGATOR_TYPE as NavigationNode['navigatorType'],\n parentNavigator: navigatorName,\n // Any route is one URL away from any other — both directions,\n // like the RN analyzer models tab navigators.\n reachableFrom: others,\n reachableTo: others,\n ...(route.params ? { params: route.params } : {}),\n };\n }\n\n const initialRoute =\n routes.find((r) => r.path === '/') ?? routes.find((r) => r.index) ?? routes[0];\n\n return {\n screens,\n initialScreen: initialRoute?.screenName ?? '',\n navigators: routes.length > 0\n ? [{\n name: navigatorName,\n type: WEB_NAVIGATOR_TYPE as NavigationGraph['navigators'][number]['type'],\n screens: screenNames,\n }]\n : [],\n };\n }\n}\n\n/** `/vehicles/:id/edit` → `VehiclesIdEdit`; `/` → `Home`. */\nexport function screenNameFromPath(routePath: string): string {\n if (routePath === '/' || routePath === '') return 'Home';\n return routePath\n .split('/')\n .filter(Boolean)\n .map((segment) => segment.replace(/^:/, '').replace(/\\?$/, ''))\n .map((segment) =>\n segment\n .split(/[-_.]/)\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(''),\n )\n .join('');\n}\n\n/** Higher wins in `dedupeRoutes`. */\nfunction routeScore(route: WebRoute): number {\n const isPage = route.layout ? 0 : 2;\n const hasRealName = route.screenName === screenNameFromPath(route.path) ? 0 : 1;\n return isPage + hasRealName;\n}\n\n/**\n * Match a navigated-to concrete path (e.g. `/vehicles/123`) against the\n * route table, honoring `:param` segments. Returns the matched screen\n * name, or undefined.\n */\nexport function resolvePathToScreen(routes: WebRoute[], target: string): string | undefined {\n const normalized = `/${target}`.replace(/\\/+/g, '/').replace(/\\?.*$/, '').replace(/#.*$/, '');\n const cleaned = normalized.length > 1 ? normalized.replace(/\\/$/, '') : normalized;\n\n const exact = routes.find((r) => r.path === cleaned);\n if (exact) return exact.screenName;\n\n const targetSegments = cleaned.split('/').filter(Boolean);\n for (const route of routes) {\n const routeSegments = route.path.split('/').filter(Boolean);\n if (routeSegments.length !== targetSegments.length) continue;\n const matches = routeSegments.every(\n (seg, i) => seg.startsWith(':') || seg === '*' || seg === targetSegments[i],\n );\n if (matches) return route.screenName;\n }\n return undefined;\n}\n","import type { ActionDescriptor, AnalyzerConfig, ScreenDescriptor } from '../../types';\nimport type {\n PlatformAnalyzer,\n PlatformAnalyzerOptions,\n PlatformAnalyzerResult,\n} from '../PlatformAnalyzer';\nimport { WebScreenAnalyzer, type WebScreenCandidate } from './WebScreenAnalyzer';\nimport { WebNavigationAnalyzer, resolvePathToScreen, type WebRoute } from './WebNavigationAnalyzer';\n\n/**\n * `PlatformAnalyzer` for React web apps (`.appilotsrc` `platform:\n * \"web\"`) — source-level inference instead of the manifest-only path\n * `GenericPlatformAnalyzer` provides. Orchestrates:\n *\n * - `WebScreenAnalyzer` — screens, forms, actions, collections from\n * DOM-vocabulary JSX (`onClick`, `data-testid`, `type=`, ...)\n * - `WebNavigationAnalyzer` — a navigation graph from React Router\n * configuration (`createBrowserRouter`, `<Route path element>`)\n *\n * The screen analyzer records navigation targets as ROUTE PATHS\n * (`/vehicles/new`); this orchestrator owns the route table and\n * resolves them to screen names, leaving unresolved paths as-is (still\n * useful to the agent, and valid against the wire schema).\n *\n * Strict-screen filtering (on by default, like RN): a file counts as a\n * screen when it calls `registerScreen()`, matches a screen glob\n * (web defaults: `pages/`, `routes/`, `views/`, `app/`, `*Page`/\n * `*Screen`/`*View`), or its component is rendered by a detected route\n * — that last rule is what \"the detected route patterns\" adds over\n * static globs.\n *\n * A declared `appilots.manifest.json` still merges ON TOP of this\n * analyzer's output in `MCPGenerator` (manifest wins on a screen-name\n * conflict) — same precedence as every other platform.\n */\nexport class ReactWebPlatformAnalyzer implements PlatformAnalyzer {\n readonly platform = 'web';\n\n async analyze(\n config: AnalyzerConfig,\n options: PlatformAnalyzerOptions,\n ): Promise<PlatformAnalyzerResult> {\n const screenAnalyzer = new WebScreenAnalyzer(config, {\n screenPatterns: options.screenPatterns,\n });\n const navigationAnalyzer = new WebNavigationAnalyzer(config, {\n navigationInclude: options.navigationInclude,\n navigationExclude: options.navigationExclude,\n });\n\n console.log('[ReactWebPlatformAnalyzer] Running analyzers...');\n const [screenAnalysis, navigationResult] = await Promise.all([\n screenAnalyzer.analyze(),\n navigationAnalyzer.analyze(),\n ]);\n\n const routeScreenNames = new Set(navigationResult.routes.map((route) => route.screenName));\n const strictScreens = options.strictScreens ?? true;\n\n let screensFilteredOut = 0;\n const included: WebScreenCandidate[] = [];\n for (const candidate of screenAnalysis.candidates) {\n if (!strictScreens || this.isScreen(candidate, routeScreenNames)) {\n included.push(candidate);\n } else {\n screensFilteredOut++;\n }\n }\n\n const screens = included.map((candidate) =>\n this.resolveRoutePaths(candidate.descriptor, navigationResult.routes),\n );\n\n console.log(\n `[ReactWebPlatformAnalyzer] Screen and navigation analysis complete. Found ${screens.length} screens, ${navigationResult.routes.length} routes`,\n );\n\n return {\n screens,\n navigation: navigationResult.graph,\n analyzedFiles: screenAnalysis.analyzedFiles,\n ...(screensFilteredOut > 0 ? { screensFilteredOut } : {}),\n };\n }\n\n private isScreen(candidate: WebScreenCandidate, routeScreenNames: Set<string>): boolean {\n return (\n candidate.hasRegisterScreen ||\n candidate.matchesScreenPattern ||\n routeScreenNames.has(candidate.descriptor.name)\n );\n }\n\n /** Replace route-path references with screen names where the route table resolves them. */\n private resolveRoutePaths(screen: ScreenDescriptor, routes: WebRoute[]): ScreenDescriptor {\n const resolve = (target: string | undefined): string | undefined => {\n if (!target || !target.startsWith('/')) return target;\n return resolvePathToScreen(routes, target) ?? target;\n };\n\n const navigationTargets = Array.from(\n new Set(\n screen.navigationTargets\n .map((target) => resolve(target)!)\n // A screen linking to itself isn't a navigation the agent cares about.\n .filter((target) => target !== screen.name),\n ),\n ).sort();\n\n const actions = screen.actions.map((action): ActionDescriptor => {\n const resolved = resolve(action.targetScreen);\n return resolved === action.targetScreen ? action : { ...action, targetScreen: resolved };\n });\n\n const collections = screen.collections?.map((collection) => {\n const resolveRow = (row: typeof collection.rowAction) => {\n if (!row?.targetScreen) return row;\n const resolved = resolve(row.targetScreen);\n if (resolved === row.targetScreen) return row;\n return {\n ...row,\n targetScreen: resolved,\n ...(row.description ? { description: `Clicking a row opens ${resolved}` } : {}),\n };\n };\n const rowAction = resolveRow(collection.rowAction);\n return {\n ...collection,\n ...(rowAction ? { rowAction } : {}),\n ...(collection.rowActions\n ? { rowActions: collection.rowActions.map((row) => resolveRow(row)!) }\n : {}),\n };\n });\n\n return {\n ...screen,\n navigationTargets,\n actions,\n ...(collections ? { collections } : {}),\n };\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { screenDescriptorSchema, navigationGraphSchema } from '@appilots/shared/validators';\nimport type { NavigationGraph, ScreenDescriptor } from '../types';\nimport { stringifyUnknown } from '../utils/stringify';\n\n/**\n * Default manifest filename, resolved relative to the project's\n * `rootDir` unless `.appilotsrc`'s `manifestPath` overrides it.\n */\nexport const DEFAULT_MANIFEST_FILENAME = 'appilots.manifest.json';\n\n/**\n * A declared, hand-authored (or externally generated) application\n * structure map — the manifest-mode integration path for any platform\n * that doesn't have a source-level `PlatformAnalyzer` yet. Screens here\n * use the exact same `ScreenDescriptor` shape the AST analyzers produce\n * (validated against `@appilots/shared`'s `screenDescriptorSchema`, the\n * same schema the formal `MCPDocument` wire contract uses), so a\n * manifest and an AST-derived screen merge without any shape\n * translation.\n */\nexport interface AppilotsManifest {\n /** Informational; not the MCPDocument's own `version` field. */\n version?: string;\n screens: ScreenDescriptor[];\n /** Optional — merged into the analyzer-derived navigation graph. */\n navigation?: Partial<NavigationGraph>;\n}\n\nconst manifestSchema = z\n .object({\n version: z.string().optional(),\n screens: z.array(screenDescriptorSchema).default([]),\n navigation: navigationGraphSchema.partial().optional(),\n })\n .passthrough();\n\nexport interface LoadManifestResult {\n /** `null` when no manifest file exists at the resolved path — not an error. */\n manifest: AppilotsManifest | null;\n /** Absolute path the manifest was (or would be) read from. */\n resolvedPath: string;\n}\n\n/**\n * Resolve and load `appilots.manifest.json` (or `manifestPath` from\n * `.appilotsrc`) from `rootDir`. Returns `{ manifest: null }` when the\n * file doesn't exist — manifest mode is opt-in, not required — but\n * throws a descriptive error when the file exists and is unparseable\n * JSON or fails `screenDescriptorSchema`/`navigationGraphSchema`\n * validation, so a typo'd manifest fails loudly instead of silently\n * contributing zero screens.\n */\nexport async function loadManifest(\n rootDir: string,\n manifestPath?: string,\n): Promise<LoadManifestResult> {\n const resolvedPath = path.resolve(rootDir, manifestPath || DEFAULT_MANIFEST_FILENAME);\n\n let raw: string;\n try {\n raw = await readFile(resolvedPath, 'utf-8');\n } catch (error: any) {\n if (error?.code === 'ENOENT') {\n return { manifest: null, resolvedPath };\n }\n throw new Error(\n `Failed to read Appilots manifest at ${resolvedPath}: ${stringifyUnknown(error)}`,\n );\n }\n\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(raw);\n } catch (error) {\n throw new Error(\n `Appilots manifest at ${resolvedPath} is not valid JSON: ${stringifyUnknown(error)}`,\n );\n }\n\n const result = manifestSchema.safeParse(parsedJson);\n if (!result.success) {\n const issues = result.error.issues\n .slice(0, 10)\n .map((issue) => ` - ${issue.path.join('.') || '(root)'}: ${issue.message}`)\n .join('\\n');\n throw new Error(\n `Appilots manifest at ${resolvedPath} failed validation:\\n${issues}\\n` +\n 'Each entry in \"screens\" must match the ScreenDescriptor shape (see docs/platform-integration.md).',\n );\n }\n\n return { manifest: result.data as AppilotsManifest, resolvedPath };\n}\n\n/**\n * Merge one declared screen on top of the analyzer's screen of the same\n * name, KEY BY KEY.\n *\n * Whole-screen replacement is what this used to do, and it made the\n * manifest useless for the case it is most needed in: naming the handful\n * of controls the analyzer could not name. Declaring two `targets` on a\n * screen the analyzer already understood threw away its components,\n * forms, actions and navigation — so the only safe way to add one target\n * was to restate the entire screen by hand and keep it in sync forever.\n * A declaration that rots the moment it is written is worse than no\n * declaration, because the model believes it.\n *\n * The rules, in the order a reader will ask about them:\n *\n * - A key the manifest does not declare is inherited from the analyzer.\n * - `targets` and `actions` merge BY `id` — the manifest entry wins for\n * an id both sides know, and ids only the manifest knows are appended.\n * This is the whole point: \"add the back button the analyzer missed\"\n * must not mean \"forget the twelve it found\".\n * - `agentHints` merges per key, for the same reason: declaring\n * `safetyNotes` must not silently drop `primaryGoal`.\n * - Every other declared key replaces wholesale. Those arrays have no\n * stable identity to merge on, so anything cleverer would be guessing.\n *\n * An EMPTY array in the manifest means \"nothing to add\", not \"delete what\n * the analyzer found\". `screenDescriptorSchema` defaults `components`,\n * `forms`, `actions` and `navigationTargets` to `[]`, so after parsing\n * there is no way to tell an omitted key from one declared empty — and\n * of the two readings, inheriting is the one that cannot silently\n * destroy a screen.\n */\nfunction mergeScreen(base: ScreenDescriptor, declared: ScreenDescriptor): ScreenDescriptor {\n const fields: Record<string, unknown> = { ...base };\n\n for (const [key, value] of Object.entries(declared)) {\n if (value === undefined) continue;\n if (Array.isArray(value) && value.length === 0) continue;\n fields[key] = value;\n }\n\n const merged = fields as unknown as ScreenDescriptor;\n\n merged.targets = mergeById(base.targets, markManifestOrigin(declared.targets));\n merged.actions = mergeById(base.actions, declared.actions) ?? [];\n\n if (base.agentHints || declared.agentHints) {\n merged.agentHints = { ...base.agentHints, ...declared.agentHints };\n }\n\n return merged;\n}\n\n/**\n * Merge two id-bearing lists, overlay winning per id, order stable:\n * base order first, then the overlay-only entries in declaration order.\n */\nfunction mergeById<T extends { id: string }>(\n base: T[] | undefined,\n overlay: T[] | undefined,\n): T[] | undefined {\n if (!overlay || overlay.length === 0) return base;\n if (!base || base.length === 0) return overlay;\n\n const byId = new Map<string, T>();\n for (const entry of base) byId.set(entry.id, entry);\n for (const entry of overlay) {\n const existing = byId.get(entry.id);\n byId.set(entry.id, existing ? { ...existing, ...entry } : entry);\n }\n return Array.from(byId.values());\n}\n\n/**\n * Stamp `origin: 'manifest'` on hand-declared targets.\n *\n * The runtime already refuses to let an inferred identifier pass for a\n * declared one (`provenance` on the snapshot). A target read out of the\n * source and a target somebody typed into a JSON file are just as\n * different, and the document is the only place that difference can be\n * recorded — the analyzer cannot see the manifest, and the manifest\n * cannot see the source. A declaration that no longer matches the app is\n * the failure mode here, so the model must be able to tell which claims\n * were never checked against code.\n */\nfunction markManifestOrigin(targets: ScreenDescriptor['targets']): ScreenDescriptor['targets'] {\n if (!targets || targets.length === 0) return targets;\n return targets.map((target) => ({ origin: 'manifest' as const, ...target }));\n}\n\n/**\n * Merge a declared manifest's screens on top of analyzer-derived screens.\n * A screen only one side knows about passes through unchanged; a screen\n * both sides know is merged key by key (see `mergeScreen`).\n */\nexport function mergeManifestScreens(\n analyzerScreens: ScreenDescriptor[],\n manifestScreens: ScreenDescriptor[] | undefined,\n): ScreenDescriptor[] {\n if (!manifestScreens || manifestScreens.length === 0) return analyzerScreens;\n\n const byName = new Map<string, ScreenDescriptor>();\n for (const screen of analyzerScreens) byName.set(screen.name, screen);\n for (const declared of manifestScreens) {\n const base = byName.get(declared.name);\n byName.set(\n declared.name,\n base\n ? mergeScreen(base, declared)\n : { ...declared, targets: markManifestOrigin(declared.targets) },\n );\n }\n return Array.from(byName.values());\n}\n\n/**\n * Merge a declared manifest's (partial) navigation graph on top of the\n * analyzer-derived one. Manifest entries win per-key; arrays are\n * concatenated (manifest navigators appended after analyzer ones).\n */\nexport function mergeManifestNavigation(\n analyzerNavigation: NavigationGraph,\n manifestNavigation: Partial<NavigationGraph> | undefined,\n): NavigationGraph {\n if (!manifestNavigation) return analyzerNavigation;\n return {\n initialScreen: manifestNavigation.initialScreen ?? analyzerNavigation.initialScreen,\n screens: { ...analyzerNavigation.screens, ...(manifestNavigation.screens ?? {}) },\n navigators: [...analyzerNavigation.navigators, ...(manifestNavigation.navigators ?? [])],\n };\n}\n","export * from \"./errors.js\";\nexport * from \"./helpers/parseUtil.js\";\nexport * from \"./helpers/typeAliases.js\";\nexport * from \"./helpers/util.js\";\nexport * from \"./types.js\";\nexport * from \"./ZodError.js\";\n","export var util;\n(function (util) {\n util.assertEqual = (_) => { };\n function assertIs(_arg) { }\n util.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util.assertNever = assertNever;\n util.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util.getValidEnumValues = (obj) => {\n const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n const filtered = {};\n for (const k of validKeys) {\n filtered[k] = obj[k];\n }\n return util.objectValues(filtered);\n };\n util.objectValues = (obj) => {\n return util.objectKeys(obj).map(function (e) {\n return obj[e];\n });\n };\n util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return undefined;\n };\n util.isInteger = typeof Number.isInteger === \"function\"\n ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = \" | \") {\n return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n }\n util.joinValues = joinValues;\n util.jsonStringifyReplacer = (_, value) => {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n };\n})(util || (util = {}));\nexport var objectUtil;\n(function (objectUtil) {\n objectUtil.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second, // second overwrites first\n };\n };\n})(objectUtil || (objectUtil = {}));\nexport const ZodParsedType = util.arrayToEnum([\n \"string\",\n \"nan\",\n \"number\",\n \"integer\",\n \"float\",\n \"boolean\",\n \"date\",\n \"bigint\",\n \"symbol\",\n \"function\",\n \"undefined\",\n \"null\",\n \"array\",\n \"object\",\n \"unknown\",\n \"promise\",\n \"void\",\n \"never\",\n \"map\",\n \"set\",\n]);\nexport const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case \"undefined\":\n return ZodParsedType.undefined;\n case \"string\":\n return ZodParsedType.string;\n case \"number\":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case \"boolean\":\n return ZodParsedType.boolean;\n case \"function\":\n return ZodParsedType.function;\n case \"bigint\":\n return ZodParsedType.bigint;\n case \"symbol\":\n return ZodParsedType.symbol;\n case \"object\":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== \"undefined\" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== \"undefined\" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== \"undefined\" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n};\n","import { util } from \"./helpers/util.js\";\nexport const ZodIssueCode = util.arrayToEnum([\n \"invalid_type\",\n \"invalid_literal\",\n \"custom\",\n \"invalid_union\",\n \"invalid_union_discriminator\",\n \"invalid_enum_value\",\n \"unrecognized_keys\",\n \"invalid_arguments\",\n \"invalid_return_type\",\n \"invalid_date\",\n \"invalid_string\",\n \"too_small\",\n \"too_big\",\n \"invalid_intersection_types\",\n \"not_multiple_of\",\n \"not_finite\",\n]);\nexport const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nexport class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n // eslint-disable-next-line ban/ban\n Object.setPrototypeOf(this, actualProto);\n }\n else {\n this.__proto__ = actualProto;\n }\n this.name = \"ZodError\";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper ||\n function (issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === \"invalid_union\") {\n issue.unionErrors.map(processError);\n }\n else if (issue.code === \"invalid_return_type\") {\n processError(issue.returnTypeError);\n }\n else if (issue.code === \"invalid_arguments\") {\n processError(issue.argumentsError);\n }\n else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n }\n else {\n let curr = fieldErrors;\n let i = 0;\n while (i < issue.path.length) {\n const el = issue.path[i];\n const terminal = i === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n // if (typeof el === \"string\") {\n // curr[el] = curr[el] || { _errors: [] };\n // } else if (typeof el === \"number\") {\n // const errorArray: any = [];\n // errorArray._errors = [];\n // curr[el] = curr[el] || errorArray;\n // }\n }\n else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n }\n else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n}\nZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n};\n","import { ZodIssueCode } from \"../ZodError.js\";\nimport { util, ZodParsedType } from \"../helpers/util.js\";\nconst errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = \"Required\";\n }\n else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, \", \")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received '${issue.received}'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === \"object\") {\n if (\"includes\" in issue.validation) {\n message = `Invalid input: must include \"${issue.validation.includes}\"`;\n if (typeof issue.validation.position === \"number\") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n }\n else if (\"startsWith\" in issue.validation) {\n message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n }\n else if (\"endsWith\" in issue.validation) {\n message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n }\n else {\n util.assertNever(issue.validation);\n }\n }\n else if (issue.validation !== \"regex\") {\n message = `Invalid ${issue.validation}`;\n }\n else {\n message = \"Invalid\";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"bigint\")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === \"array\")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === \"string\")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === \"number\")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"bigint\")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === \"date\")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = \"Invalid input\";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = \"Number must be finite\";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n};\nexport default errorMap;\n","import defaultErrorMap from \"./locales/en.js\";\nlet overrideErrorMap = defaultErrorMap;\nexport { defaultErrorMap };\nexport function setErrorMap(map) {\n overrideErrorMap = map;\n}\nexport function getErrorMap() {\n return overrideErrorMap;\n}\n","import { getErrorMap } from \"../errors.js\";\nimport defaultErrorMap from \"../locales/en.js\";\nexport const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...(issueData.path || [])];\n const fullIssue = {\n ...issueData,\n path: fullPath,\n };\n if (issueData.message !== undefined) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message,\n };\n }\n let errorMessage = \"\";\n const maps = errorMaps\n .filter((m) => !!m)\n .slice()\n .reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage,\n };\n};\nexport const EMPTY_PATH = [];\nexport function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData: issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap, // contextual error map is first priority\n ctx.schemaErrorMap, // then schema-bound map if available\n overrideMap, // then global override map\n overrideMap === defaultErrorMap ? undefined : defaultErrorMap, // then global default map\n ].filter((x) => !!x),\n });\n ctx.common.issues.push(issue);\n}\nexport class ParseStatus {\n constructor() {\n this.value = \"valid\";\n }\n dirty() {\n if (this.value === \"valid\")\n this.value = \"dirty\";\n }\n abort() {\n if (this.value !== \"aborted\")\n this.value = \"aborted\";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s of results) {\n if (s.status === \"aborted\")\n return INVALID;\n if (s.status === \"dirty\")\n status.dirty();\n arrayValue.push(s.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === \"aborted\")\n return INVALID;\n if (value.status === \"aborted\")\n return INVALID;\n if (key.status === \"dirty\")\n status.dirty();\n if (value.status === \"dirty\")\n status.dirty();\n if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n}\nexport const INVALID = Object.freeze({\n status: \"aborted\",\n});\nexport const DIRTY = (value) => ({ status: \"dirty\", value });\nexport const OK = (value) => ({ status: \"valid\", value });\nexport const isAborted = (x) => x.status === \"aborted\";\nexport const isDirty = (x) => x.status === \"dirty\";\nexport const isValid = (x) => x.status === \"valid\";\nexport const isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n","export var errorUtil;\n(function (errorUtil) {\n errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n // biome-ignore lint:\n errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n","import { ZodError, ZodIssueCode, } from \"./ZodError.js\";\nimport { defaultErrorMap, getErrorMap } from \"./errors.js\";\nimport { errorUtil } from \"./helpers/errorUtil.js\";\nimport { DIRTY, INVALID, OK, ParseStatus, addIssueToContext, isAborted, isAsync, isDirty, isValid, makeIssue, } from \"./helpers/parseUtil.js\";\nimport { util, ZodParsedType, getParsedType } from \"./helpers/util.js\";\nclass ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n }\n else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n}\nconst handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n }\n else {\n if (!ctx.common.issues.length) {\n throw new Error(\"Validation failed but no issues detected.\");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n },\n };\n }\n};\nfunction processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap, invalid_type_error, required_error, description } = params;\n if (errorMap && (invalid_type_error || required_error)) {\n throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n }\n if (errorMap)\n return { errorMap: errorMap, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === \"invalid_enum_value\") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === \"undefined\") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== \"invalid_type\")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n}\nexport class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return (ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n });\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent,\n },\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error(\"Synchronous parse encountered promise.\");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: params?.async ?? false,\n contextualErrorMap: params?.errorMap,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n \"~validate\"(data) {\n const ctx = {\n common: {\n issues: [],\n async: !!this[\"~standard\"].async,\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n if (!this[\"~standard\"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n };\n }\n catch (err) {\n if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n this[\"~standard\"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true,\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result)\n ? {\n value: result.value,\n }\n : {\n issues: ctx.common.issues,\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params?.errorMap,\n async: true,\n },\n path: params?.path || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data),\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === \"string\" || typeof message === \"undefined\") {\n return { message };\n }\n else if (typeof message === \"function\") {\n return message(val);\n }\n else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val),\n });\n if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n }\n else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n return false;\n }\n else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"refinement\", refinement },\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n /** Alias of safeParseAsync */\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this[\"~standard\"] = {\n version: 1,\n vendor: \"zod\",\n validate: (data) => this[\"~validate\"](data),\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: \"transform\", transform },\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def),\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === \"function\" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description,\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(undefined).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n// /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n// /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n// /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n// /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n// /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n }\n else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nexport function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join(\"|\")})`;\n return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n}\nfunction isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(\".\");\n if (!header)\n return false;\n // Convert base64url to base64\n const base64 = header\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== \"object\" || decoded === null)\n return false;\n if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n }\n catch {\n return false;\n }\n}\nfunction isValidCidr(ip, version) {\n if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n}\nexport class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"length\") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"string\",\n inclusive: true,\n exact: true,\n message: check.message,\n });\n }\n status.dirty();\n }\n }\n else if (check.kind === \"email\") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"email\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"emoji\") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, \"u\");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"emoji\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"uuid\") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"uuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"nanoid\") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"nanoid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid\") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cuid2\") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cuid2\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ulid\") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ulid\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"url\") {\n try {\n new URL(input.data);\n }\n catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"regex\") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"regex\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"trim\") {\n input.data = input.data.trim();\n }\n else if (check.kind === \"includes\") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"toLowerCase\") {\n input.data = input.data.toLowerCase();\n }\n else if (check.kind === \"toUpperCase\") {\n input.data = input.data.toUpperCase();\n }\n else if (check.kind === \"startsWith\") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"endsWith\") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"datetime\") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"datetime\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"date\") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"date\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"time\") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: \"time\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"duration\") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"duration\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"ip\") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"ip\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"jwt\") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"jwt\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"cidr\") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"cidr\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64\") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"base64url\") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: \"base64url\",\n code: ZodIssueCode.invalid_string,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message),\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n email(message) {\n return this._addCheck({ kind: \"email\", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: \"url\", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: \"emoji\", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: \"uuid\", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: \"nanoid\", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: \"cuid\", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: \"cuid2\", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: \"ulid\", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: \"base64\", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return this._addCheck({\n kind: \"base64url\",\n ...errorUtil.errToObj(message),\n });\n }\n jwt(options) {\n return this._addCheck({ kind: \"jwt\", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: \"ip\", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: \"cidr\", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"datetime\",\n precision: null,\n offset: false,\n local: false,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"datetime\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n offset: options?.offset ?? false,\n local: options?.local ?? false,\n ...errorUtil.errToObj(options?.message),\n });\n }\n date(message) {\n return this._addCheck({ kind: \"date\", message });\n }\n time(options) {\n if (typeof options === \"string\") {\n return this._addCheck({\n kind: \"time\",\n precision: null,\n message: options,\n });\n }\n return this._addCheck({\n kind: \"time\",\n precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n ...errorUtil.errToObj(options?.message),\n });\n }\n duration(message) {\n return this._addCheck({ kind: \"duration\", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: \"regex\",\n regex: regex,\n ...errorUtil.errToObj(message),\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: \"includes\",\n value: value,\n position: options?.position,\n ...errorUtil.errToObj(options?.message),\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: \"startsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: \"endsWith\",\n value: value,\n ...errorUtil.errToObj(message),\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: \"min\",\n value: minLength,\n ...errorUtil.errToObj(message),\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxLength,\n ...errorUtil.errToObj(message),\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: \"length\",\n value: len,\n ...errorUtil.errToObj(message),\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"trim\" }],\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === \"date\");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === \"time\");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === \"email\");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === \"url\");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n }\n get isBase64url() {\n // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n return (valInt % stepInt) / 10 ** decCount;\n}\nexport class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"int\") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: \"integer\",\n received: \"float\",\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: \"number\",\n inclusive: check.inclusive,\n exact: false,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"finite\") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n int(message) {\n return this._addCheck({\n kind: \"int\",\n message: errorUtil.toString(message),\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value: value,\n message: errorUtil.toString(message),\n });\n }\n finite(message) {\n return this._addCheck({\n kind: \"finite\",\n message: errorUtil.toString(message),\n });\n }\n safe(message) {\n return this._addCheck({\n kind: \"min\",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message),\n })._addCheck({\n kind: \"max\",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && util.isInteger(ch.value)));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n return true;\n }\n else if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n else if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n}\nZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n }\n catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = undefined;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: \"bigint\",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: \"bigint\",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message,\n });\n status.dirty();\n }\n }\n else if (check.kind === \"multipleOf\") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message,\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit(\"min\", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit(\"min\", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit(\"max\", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit(\"max\", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message),\n },\n ],\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n positive(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n negative(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message),\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: \"max\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: \"min\",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message),\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: \"multipleOf\",\n value,\n message: errorUtil.toString(message),\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n}\nZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: params?.coerce ?? false,\n ...processCreateParams(params),\n });\n};\nexport class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: params?.coerce || false,\n ...processCreateParams(params),\n });\n};\nexport class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_date,\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = undefined;\n for (const check of this._def.checks) {\n if (check.kind === \"min\") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else if (check.kind === \"max\") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: \"date\",\n });\n status.dirty();\n }\n }\n else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime()),\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check],\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: \"min\",\n value: minDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: \"max\",\n value: maxDate.getTime(),\n message: errorUtil.toString(message),\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"min\") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === \"max\") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n}\nZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: params?.coerce || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params),\n });\n};\nexport class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params),\n });\n};\nexport class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params),\n });\n};\nexport class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params),\n });\n};\nexport class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n // required\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n}\nZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params),\n });\n};\nexport class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n}\nZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params),\n });\n};\nexport class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n}\nZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params),\n });\n};\nexport class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: (tooSmall ? def.exactLength.value : undefined),\n maximum: (tooBig ? def.exactLength.value : undefined),\n type: \"array\",\n inclusive: true,\n exact: true,\n message: def.exactLength.message,\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.minLength.message,\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: \"array\",\n inclusive: true,\n exact: false,\n message: def.maxLength.message,\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n })).then((result) => {\n return ParseStatus.mergeArray(status, result);\n });\n }\n const result = [...ctx.data].map((item, i) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) },\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) },\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) },\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params),\n });\n};\nfunction deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape,\n });\n }\n else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element),\n });\n }\n else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n }\n else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n }\n else {\n return schema;\n }\n}\nexport class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n /**\n * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n * If you want to pass through unknown properties, use `.passthrough()` instead.\n */\n this.nonstrict = this.passthrough;\n // extend<\n // Augmentation extends ZodRawShape,\n // NewOutput extends util.flatten<{\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // }>,\n // NewInput extends util.flatten<{\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }>\n // >(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<T, Augmentation>,\n // UnknownKeys,\n // Catchall,\n // NewOutput,\n // NewInput\n // > {\n // return new ZodObject({\n // ...this._def,\n // shape: () => ({\n // ...this._def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // }\n /**\n * @deprecated Use `.extend` instead\n * */\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === \"passthrough\") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: \"valid\", value: key },\n value: { status: \"valid\", value: ctx.data[key] },\n });\n }\n }\n else if (unknownKeys === \"strict\") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys,\n });\n status.dirty();\n }\n }\n else if (unknownKeys === \"strip\") {\n }\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n }\n else {\n // run catchall validation\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: \"valid\", value: key },\n value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data,\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve()\n .then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet,\n });\n }\n return syncPairs;\n })\n .then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strict\",\n ...(message !== undefined\n ? {\n errorMap: (issue, ctx) => {\n const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n if (issue.code === \"unrecognized_keys\")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError,\n };\n return {\n message: defaultError,\n };\n },\n }\n : {}),\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"strip\",\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: \"passthrough\",\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n // Def[\"unknownKeys\"],\n // Def[\"catchall\"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation,\n }),\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape(),\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming[\"shape\"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k][\"_output\"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k][\"_input\"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n // Incoming[\"_def\"][\"unknownKeys\"],\n // Incoming[\"_def\"][\"catchall\"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index,\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape,\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n }\n else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n }\n else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape,\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n}\nZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: \"strict\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: \"strip\",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params),\n });\n};\nexport class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n // return first issue-free validation if it exists\n for (const result of results) {\n if (result.result.status === \"valid\") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === \"dirty\") {\n // add issues from dirty option\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n // return invalid\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n }),\n ctx: childCtx,\n };\n })).then(handleResults);\n }\n else {\n let dirty = undefined;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n parent: null,\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx,\n });\n if (result.status === \"valid\") {\n return result;\n }\n else if (result.status === \"dirty\" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues) => new ZodError(issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors,\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n}\nZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params),\n });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n////////// //////////\n////////// ZodDiscriminatedUnion //////////\n////////// //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n }\n else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n }\n else if (type instanceof ZodLiteral) {\n return [type.value];\n }\n else if (type instanceof ZodEnum) {\n return type.options;\n }\n else if (type instanceof ZodNativeEnum) {\n // eslint-disable-next-line ban/ban\n return util.objectValues(type.enum);\n }\n else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n }\n else if (type instanceof ZodUndefined) {\n return [undefined];\n }\n else if (type instanceof ZodNull) {\n return [null];\n }\n else if (type instanceof ZodOptional) {\n return [undefined, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n }\n else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n }\n else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n }\n else {\n return [];\n }\n};\nexport class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator],\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n // Get all the valid discriminator values\n const optionsMap = new Map();\n // try {\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params),\n });\n }\n}\nfunction mergeValues(a, b) {\n const aType = getParsedType(a);\n const bType = getParsedType(b);\n if (a === b) {\n return { valid: true, data: a };\n }\n else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n }\n else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a.length; index++) {\n const itemA = a[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n }\n else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a === +b) {\n return { valid: true, data: a };\n }\n else {\n return { valid: false };\n }\n}\nexport class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types,\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }),\n ]).then(([left, right]) => handleParsed(left, right));\n }\n else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n }));\n }\n }\n}\nZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left: left,\n right: right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params),\n });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nexport class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: \"array\",\n });\n status.dirty();\n }\n const items = [...ctx.data]\n .map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n })\n .filter((x) => !!x); // filter nulls\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n }\n else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest,\n });\n }\n}\nZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params),\n });\n};\nexport class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data,\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n }\n else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third),\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second),\n });\n }\n}\nexport class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n };\n });\n if (ctx.common.async) {\n const finalMap = new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n }\n else {\n const finalMap = new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === \"aborted\" || value.status === \"aborted\") {\n return INVALID;\n }\n if (key.status === \"dirty\" || value.status === \"dirty\") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n}\nZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params),\n });\n};\nexport class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.minSize.message,\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: \"set\",\n inclusive: true,\n exact: false,\n message: def.maxSize.message,\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements) {\n const parsedSet = new Set();\n for (const element of elements) {\n if (element.status === \"aborted\")\n return INVALID;\n if (element.status === \"dirty\")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements) => finalizeSet(elements));\n }\n else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) },\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) },\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n}\nZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params),\n });\n};\nexport class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error,\n },\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), defaultErrorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error,\n },\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(async function (...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n error.addIssue(makeArgsIssue(args, e));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type\n .parseAsync(result, params)\n .catch((e) => {\n error.addIssue(makeReturnsIssue(result, e));\n throw error;\n });\n return parsedReturns;\n });\n }\n else {\n // Would love a way to avoid disabling this rule, but we need\n // an alias (using an arrow function was what caused 2651).\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const me = this;\n return OK(function (...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create()),\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType,\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params),\n });\n }\n}\nexport class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n}\nZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter: getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params),\n });\n};\nexport class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n}\nZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value: value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params),\n });\n};\nfunction createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params),\n });\n}\nexport class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== \"string\") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef,\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef,\n });\n }\n}\nZodEnum.create = createZodEnum;\nexport class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type,\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues,\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n}\nZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values: values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params),\n });\n};\nexport class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap,\n });\n }));\n }\n}\nZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params),\n });\n};\nexport class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n ? this._def.schema.sourceType()\n : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n }\n else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n },\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === \"preprocess\") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed) => {\n if (status.value === \"aborted\")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n });\n }\n else {\n if (status.value === \"aborted\")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx,\n });\n if (result.status === \"aborted\")\n return INVALID;\n if (result.status === \"dirty\")\n return DIRTY(result.value);\n if (status.value === \"dirty\")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === \"refinement\") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n // return value is ignored\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === \"aborted\")\n return INVALID;\n if (inner.status === \"dirty\")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === \"transform\") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n }\n else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result,\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n}\nZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params),\n });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: \"preprocess\", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params),\n });\n};\nexport { ZodEffects as ZodTransformer };\nexport class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(undefined);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params),\n });\n};\nexport class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params),\n });\n};\nexport class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n}\nZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n ...processCreateParams(params),\n });\n};\nexport class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n // newCtx is used to not collect issues from inner types in ctx\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: [],\n },\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx,\n },\n });\n if (isAsync(result)) {\n return result.then((result) => {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n });\n }\n else {\n return {\n status: \"valid\",\n value: result.status === \"valid\"\n ? result.value\n : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data,\n }),\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n}\nZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n ...processCreateParams(params),\n });\n};\nexport class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType,\n });\n return INVALID;\n }\n return { status: \"valid\", value: input.data };\n }\n}\nZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params),\n });\n};\nexport const BRAND = Symbol(\"zod_brand\");\nexport class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx,\n });\n }\n unwrap() {\n return this._def.type;\n }\n}\nexport class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return DIRTY(inResult.value);\n }\n else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n };\n return handleAsync();\n }\n else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx,\n });\n if (inResult.status === \"aborted\")\n return INVALID;\n if (inResult.status === \"dirty\") {\n status.dirty();\n return {\n status: \"dirty\",\n value: inResult.value,\n };\n }\n else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx,\n });\n }\n }\n }\n static create(a, b) {\n return new ZodPipeline({\n in: a,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline,\n });\n }\n}\nexport class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n}\nZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params),\n });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n////////// //////////\n////////// z.custom //////////\n////////// //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n const p2 = typeof p === \"string\" ? { message: p } : p;\n return p2;\n}\nexport function custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r = check(data);\n if (r instanceof Promise) {\n return r.then((r) => {\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n });\n }\n if (!r) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n}\nexport { ZodType as Schema, ZodType as ZodSchema };\nexport const late = {\n object: ZodObject.lazycreate,\n};\nexport var ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nexport const coerce = {\n string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n boolean: ((arg) => ZodBoolean.create({\n ...arg,\n coerce: true,\n })),\n bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\nexport { anyType as any, arrayType as array, bigIntType as bigint, booleanType as boolean, dateType as date, discriminatedUnionType as discriminatedUnion, effectsType as effect, enumType as enum, functionType as function, instanceOfType as instanceof, intersectionType as intersection, lazyType as lazy, literalType as literal, mapType as map, nanType as nan, nativeEnumType as nativeEnum, neverType as never, nullType as null, nullableType as nullable, numberType as number, objectType as object, oboolean, onumber, optionalType as optional, ostring, pipelineType as pipeline, preprocessType as preprocess, promiseType as promise, recordType as record, setType as set, strictObjectType as strictObject, stringType as string, symbolType as symbol, effectsType as transformer, tupleType as tuple, undefinedType as undefined, unionType as union, unknownType as unknown, voidType as void, };\nexport const NEVER = INVALID;\n","/**\n * Formal, versioned schema for the MCP Document — the design-time\n * \"application structure\" map the CLI (`@appilots/cli`, published from\n * `packages/mcp-generator`) uploads via `POST /cli/sync`, and that the\n * relay/prompt/grounding pipeline in `apps/api` reads at request time.\n *\n * This mirrors the TypeScript interfaces in\n * `packages/mcp-generator/src/types/index.ts` and\n * `packages/mcp-generator/src/generators/types.ts` — those files stay the\n * generator's own authoring types (produced by the React-Native-specific\n * analyzer), while THIS module is the wire contract every producer\n * (today's RN analyzer, and any future platform generator) is validated\n * against at the API boundary.\n *\n * Design rules (multi-platform prep, additive/backward-compatible):\n * - Every object uses `.passthrough()` so a newer generator can add\n * fields without the server rejecting the whole document.\n * - Fields with a known closed set (`navigatorType`, `locator.source`,\n * ...) are modeled as `z.enum([...]).or(z.string())` — the known\n * values get autocomplete/docs, but an unrecognized string (e.g. a\n * future native adapter's own locator source) still validates.\n * - Nothing here is renamed relative to the existing MCPDocument shape\n * the CLI already emits — this schema DESCRIBES today's wire shape,\n * it does not change it.\n * - `/cli/sync` validates documents LENIENTLY (see apps/api's cli\n * routes): a document that fails this schema is still accepted and\n * stored, just logged as a structured warning. This schema is a\n * documentation + observability tool first, an enforcement gate\n * later (once every generator in the wild is known to conform).\n */\n\nimport { z } from 'zod';\n\n// ── Version ──────────────────────────────────────────────────────\n\n/**\n * Schema version of THIS module (the wire contract), independent of the\n * `MCPDocument.version` field (the generator's own doc version, e.g.\n * \"1.0\"). Bump when a breaking change is made to this file — additive\n * changes (new optional fields) do not require a bump.\n */\nexport const MCP_DOCUMENT_SCHEMA_VERSION = '1.0.0';\n\n// ── Locator ──────────────────────────────────────────────────────\n\n/**\n * Known locator sources today are React-Native-flavored\n * (`appilotsId`/`testID`/`accessibilityLabel`), but the field has always\n * been an open string on the TS side. This schema keeps it open and adds\n * documented values a non-RN platform is expected to use: native\n * accessibility identifiers (iOS `accessibilityIdentifier`), Android\n * `resource-id`, and web `data-*` / `aria-*` attributes. No renaming —\n * these are additional ACCEPTED VALUES for the existing `source` field.\n */\nexport const locatorSourceSchema = z\n .enum([\n 'appilotsId',\n 'testID',\n 'accessibilityLabel',\n 'label',\n 'inferred',\n // Non-RN platform values (additive — see module docstring):\n 'accessibilityIdentifier', // iOS (XCUITest / UIAccessibility)\n 'resource-id', // Android (UiAutomator / Espresso)\n 'data-testid', // Web (Testing Library convention)\n 'aria-label', // Web (ARIA)\n ])\n .or(z.string().min(1).max(60));\n\nexport const locatorDescriptorSchema = z\n .object({\n id: z.string().optional(),\n appilotsId: z.string().optional(),\n testID: z.string().optional(),\n accessibilityLabel: z.string().optional(),\n label: z.string().optional(),\n source: locatorSourceSchema.optional(),\n })\n .passthrough();\n\n// ── Signals / wait policy ──────────────────────────────────────────\n\nexport const signalDescriptorSchema = z\n .object({\n type: z\n .enum([\n 'navigation',\n 'goBack',\n 'toast',\n 'modal',\n 'inline-error',\n 'data-arrival',\n 'loading',\n 'none',\n ])\n .or(z.string().min(1).max(60)),\n target: z.string().optional(),\n description: z.string().optional(),\n })\n .passthrough();\n\nexport const appilotsInferredActionSchema = z\n .object({\n isAsyncTrigger: z.boolean().optional(),\n expectedOutcome: z\n .enum(['navigation', 'inline-feedback', 'data-arrival', 'mixed', 'none'])\n .optional(),\n loadingStateBindings: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport const waitPolicyDescriptorSchema = z\n .object({\n expectedOutcome: z.string().optional(),\n signals: z.array(signalDescriptorSchema).optional(),\n maxMs: z.number().finite().optional(),\n })\n .passthrough();\n\n// ── Targets / flows ──────────────────────────────────────────────\n\nexport const targetDescriptorRoleSchema = z\n .enum([\n 'button',\n 'submit',\n 'input',\n 'toggle',\n 'select',\n 'date',\n 'list',\n 'row',\n 'menuItem',\n 'modal',\n 'custom',\n ])\n .or(z.string().min(1).max(60));\n\n/**\n * Who put this target in the document.\n *\n * `analyzer` = read out of the app's own source, so it was true of the\n * code at generation time. `manifest` = hand-declared in\n * `appilots.manifest.json`, which nothing verifies against the source —\n * it stays in the document after the control it names is renamed or\n * deleted.\n *\n * This is the document-side twin of `identityProvenance` on the runtime\n * snapshot, and it exists for the same reason: a claim nobody checked\n * must not read like one that was checked. ABSENT is not `analyzer` —\n * every document generated before this field existed omits it, and\n * reading a missing value as verified would make an old document look\n * more trustworthy than a new one that admits where its targets came\n * from.\n *\n * Open-ended like the other descriptor enums, so a future non-AST source\n * (a recorded session, a design file) can name itself rather than being\n * rejected.\n */\nexport const targetOriginSchema = z.enum(['analyzer', 'manifest']).or(z.string().min(1).max(40));\n\nexport const targetDescriptorSchema = z\n .object({\n id: z.string(),\n role: targetDescriptorRoleSchema,\n label: z.string().optional(),\n locator: locatorDescriptorSchema.optional(),\n handler: z.string().optional(),\n actionId: z.string().optional(),\n fieldName: z.string().optional(),\n targetScreen: z.string().optional(),\n destructive: z.boolean().optional(),\n requiresConfirmation: z.boolean().optional(),\n opensModal: z.string().optional(),\n opensBottomSheet: z.string().optional(),\n sourceComponent: z.string().optional(),\n origin: targetOriginSchema.optional(),\n })\n .passthrough();\n\nexport const flowStepDescriptorSchema = z\n .object({\n type: z\n .enum([\n 'navigate',\n 'fill',\n 'press',\n 'select',\n 'toggle',\n 'wait',\n 'confirm',\n 'choose-list-item',\n ])\n .or(z.string().min(1).max(60)),\n target: z.string().optional(),\n label: z.string().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n })\n .passthrough();\n\nexport const flowDescriptorSchema = z\n .object({\n id: z.string(),\n title: z.string(),\n intent: z\n .enum(['navigate', 'form_submit', 'list_action', 'destructive_action', 'inline_action'])\n .or(z.string().min(1).max(60)),\n steps: z.array(flowStepDescriptorSchema),\n waitPolicy: waitPolicyDescriptorSchema.optional(),\n safetyNotes: z.array(z.string()).optional(),\n })\n .passthrough();\n\nexport const screenAgentHintsSchema = z\n .object({\n primaryGoal: z.string().optional(),\n commonTasks: z.array(z.string()).optional(),\n preferredTargets: z.array(z.string()).optional(),\n waitPolicy: waitPolicyDescriptorSchema.optional(),\n safetyNotes: z.array(z.string()).optional(),\n })\n .passthrough();\n\n// ── Components ─────────────────────────────────────────────────────\n\nexport interface ComponentDescriptorShape {\n name: string;\n type?: string;\n props?: Record<string, string>;\n children?: ComponentDescriptorShape[];\n testID?: string;\n accessibilityLabel?: string;\n [key: string]: unknown;\n}\n\n/** Recursive — a component may nest children of the same shape. */\nexport const componentDescriptorSchema: z.ZodType<ComponentDescriptorShape> = z.lazy(() =>\n z\n .object({\n name: z.string(),\n type: z\n .enum(['view', 'input', 'button', 'list', 'modal', 'custom'])\n .or(z.string())\n .optional(),\n props: z.record(z.string()).optional(),\n children: z.array(componentDescriptorSchema).optional(),\n testID: z.string().optional(),\n accessibilityLabel: z.string().optional(),\n })\n .passthrough(),\n);\n\n// ── Forms ──────────────────────────────────────────────────────────\n\nexport const formFieldDescriptorSchema = z\n .object({\n name: z.string(),\n label: z.string().optional(),\n type: z\n .enum(['text', 'number', 'email', 'phone', 'select', 'toggle', 'date', 'custom'])\n .or(z.string()),\n required: z.boolean(),\n placeholder: z.string().optional(),\n options: z.array(z.object({ label: z.string(), value: z.string() }).passthrough()).optional(),\n defaultValue: z.unknown().optional(),\n locator: locatorDescriptorSchema.optional(),\n sourceComponent: z.string().optional(),\n valueBinding: z.string().optional(),\n errorBinding: z.string().optional(),\n })\n .passthrough();\n\nexport const formDescriptorSchema = z\n .object({\n id: z.string(),\n fields: z.array(formFieldDescriptorSchema),\n submitAction: z.string().optional(),\n validationRules: z.record(z.string()).optional(),\n })\n .passthrough();\n\n// ── Collections / lists ──────────────────────────────────────────\n\nexport const rowActionDescriptorSchema = z\n .object({\n type: z.enum(['navigation', 'custom']).or(z.string()),\n targetScreen: z.string().optional(),\n params: z.record(z.string()).optional(),\n handler: z.string().optional(),\n description: z.string().optional(),\n })\n .passthrough();\n\nexport const collectionDescriptorSchema = z\n .object({\n id: z.string(),\n // Known RN component names, plus an open string for non-RN\n // collection/list implementations (e.g. a web virtualized grid).\n component: z\n .enum(['FlatList', 'SectionList', 'VirtualizedList', 'FlashList', 'ScrollView'])\n .or(z.string()),\n itemType: z.string().optional(),\n dataSource: z.string().optional(),\n keyField: z.string().optional(),\n renderItem: z.string().optional(),\n displayFields: z.array(z.string()).optional(),\n rowAction: rowActionDescriptorSchema.optional(),\n rowActions: z.array(rowActionDescriptorSchema).optional(),\n identityFields: z.array(z.string()).optional(),\n searchField: z.string().optional(),\n })\n .passthrough();\n\n// ── Actions ──────────────────────────────────────────────────────\n\nexport const actionDescriptorSchema = z\n .object({\n id: z.string(),\n type: z.enum(['navigation', 'submit', 'api_call', 'state_change', 'custom']).or(z.string()),\n label: z.string().optional(),\n description: z.string().optional(),\n targetScreen: z.string().optional(),\n handler: z.string().optional(),\n locator: locatorDescriptorSchema.optional(),\n sourceComponent: z.string().optional(),\n opensModal: z.string().optional(),\n opensBottomSheet: z.string().optional(),\n successSignal: signalDescriptorSchema.optional(),\n failureSignal: signalDescriptorSchema.optional(),\n nativeConfirmationExpected: z.boolean().optional(),\n destructive: z.boolean().optional(),\n effect: z.enum(['read', 'write', 'destructive']).or(z.string()).optional(),\n riskLevel: z.enum(['low', 'medium', 'high']).or(z.string()).optional(),\n requiresConfirmation: z.boolean().optional(),\n appilotsInferred: appilotsInferredActionSchema.optional(),\n })\n .passthrough();\n\n// ── Screens ──────────────────────────────────────────────────────\n\nexport const screenPermissionDescriptorSchema = z\n .object({\n agentAccess: z.enum(['read', 'write', 'none']).optional(),\n requiresConfirmation: z.boolean().optional(),\n blockedActions: z.array(z.string()).optional(),\n isPii: z.boolean().optional(),\n })\n .passthrough();\n\nexport const screenDescriptorSchema = z\n .object({\n name: z.string(),\n filePath: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n components: z.array(componentDescriptorSchema).default([]),\n forms: z.array(formDescriptorSchema).default([]),\n actions: z.array(actionDescriptorSchema).default([]),\n navigationTargets: z.array(z.string()).default([]),\n agentHints: screenAgentHintsSchema.optional(),\n targets: z.array(targetDescriptorSchema).optional(),\n flows: z.array(flowDescriptorSchema).optional(),\n collections: z.array(collectionDescriptorSchema).optional(),\n suggestedPrompts: z.array(z.string()).optional(),\n permissions: screenPermissionDescriptorSchema.optional(),\n isPii: z.boolean().optional(),\n })\n .passthrough();\n\n// ── Navigation ─────────────────────────────────────────────────────\n\n/**\n * Known values are the React Navigation container types. The union\n * stays open (item 3a of the multi-platform contract effort) so a\n * non-RN generator can describe its own container semantics\n * (e.g. `'navigation-stack'` for iOS UIKit, `'fragment-backstack'` for\n * Android) without the schema rejecting the document. Server-side, the\n * relay special-cases `'stack' | 'tab' | 'drawer'` (RN nested-nav path\n * inference) and, for `context.platform === 'web'`, reads the\n * documented web convention `'route'` + a `path` template on the node\n * (see `navigationNodeSchema.path`); anything else degrades to generic\n * handling (see apps/api's relay/platform module).\n */\nexport const navigatorTypeSchema = z.enum(['stack', 'tab', 'drawer']).or(z.string().min(1).max(60));\n\nexport const paramDescriptorSchema = z\n .object({\n name: z.string(),\n type: z.string(),\n required: z.boolean(),\n defaultValue: z.unknown().optional(),\n })\n .passthrough();\n\n/**\n * `navigationAction` semantics (see `navigationPayloadSchema` in\n * `validators/index.ts`) map to React Navigation verbs 1:1 today. For a\n * future non-RN adapter, the intended mapping is:\n *\n * - `push` → push a new screen onto the current stack/back-stack\n * (iOS `UINavigationController.pushViewController`,\n * Android `FragmentTransaction.addToBackStack` / Jetpack\n * Navigation `navigate` with default launchSingleTop, web\n * `history.pushState`).\n * - `navigate` → go to a screen, reusing an existing instance in the\n * stack if already present (React Navigation's own\n * dedupe behavior) — no exact native equivalent; the\n * safest non-RN mapping is \"pop to it if present in the\n * back-stack, else push\".\n * - `replace` → swap the current top screen instead of stacking\n * (iOS `setViewControllers` replacing the last element,\n * Android `FragmentTransaction.replace`, web\n * `history.replaceState`).\n * - `goBack` → pop one entry (iOS `popViewController`, Android\n * `onBackPressed` / `NavController.popBackStack`, web\n * `history.back()`).\n * - `reset` → clear the stack/back-stack and set new root(s) (iOS\n * `setViewControllers([...], animated:)`, Android\n * `popBackStack` to root + `navigate` with\n * `popUpTo(graph.id) { inclusive = true }`, web\n * `history.replaceState` after clearing SPA route\n * state).\n */\nexport const navigationNodeSchema = z\n .object({\n screenName: z.string(),\n navigatorType: navigatorTypeSchema,\n parentNavigator: z.string().optional(),\n reachableFrom: z.array(z.string()).default([]),\n reachableTo: z.array(z.string()).default([]),\n params: z.array(paramDescriptorSchema).optional(),\n /**\n * Web clients only (documented convention, additive — previously\n * round-tripped via `.passthrough()`): the screen's URL route\n * template, e.g. `/users/:id`. Param segments use `:name` (the\n * relay also accepts `[name]` / `{name}`). When present and the\n * request's `context.platform` is `'web'`, the relay resolves\n * `navigate` targets against these templates and injects the\n * concrete URL segments as the navigate payload's `path` — the web\n * equivalent of RN's nested-navigation path injection. See\n * docs/agent-contract.md (\"Web clients\" section).\n */\n path: z.string().max(500).optional(),\n })\n .passthrough();\n\nexport const navigatorDescriptorSchema = z\n .object({\n name: z.string(),\n type: navigatorTypeSchema,\n screens: z.array(z.string()),\n parentNavigator: z.string().optional(),\n })\n .passthrough();\n\nexport const navigationGraphSchema = z\n .object({\n screens: z.record(navigationNodeSchema).default({}),\n initialScreen: z.string(),\n navigators: z.array(navigatorDescriptorSchema).default([]),\n /**\n * Dev-declared escape hatch (see `buildScreenPathMap` in\n * apps/api's grounding module) — explicit screenName → nav-path\n * overrides for apps whose navigator convention the heuristics\n * can't infer. Not part of the original TS interface (it's read\n * ad-hoc as `mcpContent.navigation.pathOverrides`), included here\n * so it round-trips through validation instead of silently\n * surviving only via `.passthrough()`.\n */\n pathOverrides: z.record(z.array(z.string())).optional(),\n })\n .passthrough();\n\n// ── Metadata ───────────────────────────────────────────────────────\n\nexport const mcpMetadataSchema = z\n .object({\n generatorVersion: z.string(),\n appVersion: z.string().optional(),\n totalScreens: z.number().int().nonnegative(),\n totalForms: z.number().int().nonnegative(),\n totalActions: z.number().int().nonnegative(),\n analyzedFiles: z.number().int().nonnegative(),\n screensFilteredOut: z.number().int().nonnegative().optional(),\n })\n .passthrough();\n\n// ── Document ───────────────────────────────────────────────────────\n\nexport const mcpDocumentSchema = z\n .object({\n version: z.string(),\n generatedAt: z.string(),\n projectName: z.string(),\n screens: z.array(screenDescriptorSchema).default([]),\n navigation: navigationGraphSchema,\n metadata: mcpMetadataSchema,\n })\n .passthrough();\n\nexport type LocatorDescriptor = z.infer<typeof locatorDescriptorSchema>;\nexport type SignalDescriptor = z.infer<typeof signalDescriptorSchema>;\nexport type TargetDescriptor = z.infer<typeof targetDescriptorSchema>;\nexport type TargetOrigin = z.infer<typeof targetOriginSchema>;\nexport type FlowStepDescriptor = z.infer<typeof flowStepDescriptorSchema>;\nexport type FlowDescriptor = z.infer<typeof flowDescriptorSchema>;\nexport type ScreenAgentHints = z.infer<typeof screenAgentHintsSchema>;\nexport type FormFieldDescriptor = z.infer<typeof formFieldDescriptorSchema>;\nexport type FormDescriptor = z.infer<typeof formDescriptorSchema>;\nexport type CollectionDescriptor = z.infer<typeof collectionDescriptorSchema>;\nexport type ActionDescriptor = z.infer<typeof actionDescriptorSchema>;\nexport type ScreenDescriptor = z.infer<typeof screenDescriptorSchema>;\nexport type NavigationNode = z.infer<typeof navigationNodeSchema>;\nexport type NavigatorDescriptor = z.infer<typeof navigatorDescriptorSchema>;\nexport type NavigationGraph = z.infer<typeof navigationGraphSchema>;\nexport type MCPMetadata = z.infer<typeof mcpMetadataSchema>;\nexport type MCPDocument = z.infer<typeof mcpDocumentSchema>;\n","/**\n * Shared validation schemas using Zod.\n */\n\nimport { z } from 'zod';\n\n// ── MCP Document (formal, versioned contract) ───────────────────\n// See ./mcp-document.ts — the schema for the design-time \"application\n// structure\" doc the CLI uploads via POST /cli/sync. Re-exported here so\n// existing `@appilots/shared/validators` imports (e.g. apps/api's cli\n// routes) can pull it in without a new subpath.\nexport * from './mcp-document';\n\n// ── Auth ───────────────────────────────────────────────────────\n\nexport const loginSchema = z.object({\n email: z.string().email('Invalid email address'),\n password: z.string().min(8, 'Password must be at least 8 characters'),\n});\n\nexport const registerSchema = loginSchema.extend({\n name: z.string().min(2, 'Name must be at least 2 characters').max(100),\n});\n\n// Self-service profile edit (PATCH /auth/me). Email changes are out of\n// scope until an email provider is picked (no verification flow yet).\nexport const updateMeSchema = z\n .object({\n name: z.string().min(2, 'Name must be at least 2 characters').max(100).optional(),\n avatarUrl: z.string().url('Invalid URL').max(2048).nullable().optional(),\n })\n .refine((v) => v.name !== undefined || v.avatarUrl !== undefined, {\n message: 'At least one field must be provided',\n });\n\nexport const changePasswordSchema = z.object({\n currentPassword: z.string().min(1, 'Current password is required'),\n newPassword: z.string().min(8, 'Password must be at least 8 characters'),\n});\n\n// ── MFA (TOTP, RFC 6238) ───────────────────────────────────────\n// A six-digit TOTP code. Kept loose on formatting (spaces are stripped\n// server-side) but strict on shape so a recovery code never lands in a\n// field that only checks TOTP.\nexport const totpCodeSchema = z\n .string()\n .transform((v) => v.replace(/\\s/g, ''))\n .pipe(z.string().regex(/^\\d{6}$/, 'Code must be 6 digits'));\n\n// `xxxxx-xxxxx` over an unambiguous alphabet; the dash and case are\n// optional because people retype these off paper.\nexport const recoveryCodeSchema = z\n .string()\n .transform((v) => v.toUpperCase().replace(/[^A-Z0-9]/g, ''))\n .pipe(z.string().regex(/^[23456789BCDFGHJKMNPQRSTVWXYZ]{10}$/, 'Invalid recovery code'));\n\n/** Confirming setup — only a TOTP code proves the app was enrolled. */\nexport const mfaVerifySchema = z.object({\n code: totpCodeSchema,\n});\n\n/**\n * Second factor at login. Exactly one of the two: a recovery code is a\n * legitimate way in when the authenticator is gone, but accepting both\n * at once would let a caller probe the two namespaces in one request.\n */\nexport const mfaChallengeSchema = z\n .object({\n challengeToken: z.string().min(1, 'Challenge token is required'),\n code: totpCodeSchema.optional(),\n recoveryCode: recoveryCodeSchema.optional(),\n })\n .refine((v) => Boolean(v.code) !== Boolean(v.recoveryCode), {\n message: 'Provide either a TOTP code or a recovery code',\n path: ['code'],\n });\n\n/**\n * Turning MFA off, and re-minting recovery codes, both need the current\n * password AND a second factor: a hijacked session must not be able to\n * strip the protection it is supposed to be defeating.\n */\nexport const mfaDisableSchema = z\n .object({\n password: z.string().min(1, 'Password is required'),\n code: totpCodeSchema.optional(),\n recoveryCode: recoveryCodeSchema.optional(),\n })\n .refine((v) => Boolean(v.code) !== Boolean(v.recoveryCode), {\n message: 'Provide either a TOTP code or a recovery code',\n path: ['code'],\n });\n\nexport const mfaRegenerateRecoveryCodesSchema = z.object({\n password: z.string().min(1, 'Password is required'),\n code: totpCodeSchema,\n});\n\n// ── Account deletion (LGPD art. 18, VI) ────────────────────────\n// `DELETE /users/me`. Unlike `mfaDisableSchema`, the second factor is\n// optional HERE and required by the ROUTE only when the account\n// actually has MFA enabled — the schema cannot know that, and demanding\n// a code from an account without MFA would make the endpoint\n// unreachable for most users. At most one of the two, same as\n// everywhere else that spends a factor.\n//\n// `confirm` is a literal, not a boolean: a client that sends\n// `{confirm: true}` by accident (a checkbox bound to the wrong field, a\n// JSON default) does not delete an account, and the string it must send\n// spells out what is about to happen.\nexport const deleteAccountSchema = z\n .object({\n password: z.string().min(1, 'Password is required'),\n code: totpCodeSchema.optional(),\n recoveryCode: recoveryCodeSchema.optional(),\n confirm: z.literal('DELETE MY ACCOUNT'),\n })\n .refine((v) => !(v.code && v.recoveryCode), {\n message: 'Provide either a TOTP code or a recovery code, not both',\n path: ['code'],\n });\n\n// ── Project ────────────────────────────────────────────────────\n\nexport const createProjectSchema = z.object({\n name: z.string().min(1).max(100),\n description: z.string().max(500).optional(),\n // Reference to a tenant-scoped provider (preferred). Optional at\n // creation so a project can be created and configured later.\n providerId: z.string().min(1).optional(),\n // 16k chars (~4k tokens): um prompt de CS real não cabe em 4096 — o\n // primeiro cliente de produção chegou com 6.385 e tomou 'Invalid input'\n // sem saber por quê. O teto continua existindo porque o systemPrompt\n // entra em TODO hop do relay: é proteção de TPM, não de gosto.\n systemPrompt: z.string().max(16000).optional(),\n});\n\n/**\n * PATCH semantics need one thing CREATE never does: a way to say \"clear\n * this\". The dashboard's provider dropdown sends `providerId: null` for\n * \"use the tenant default\", and `.optional()` alone rejects null with\n * zod's unhelpful \"Invalid input\" — which is exactly what every save of\n * the Configuração tab returned once a project existed (measured on\n * proj_BGnupMm5R1OufIh6: the System Prompt could not be saved at all,\n * because the payload always carries the providerId field too).\n * `systemPrompt: null` clears the prompt for the same reason.\n */\nexport const updateProjectSchema = createProjectSchema.partial().extend({\n providerId: z.string().min(1).nullable().optional(),\n systemPrompt: z.string().max(16000).nullable().optional(),\n});\n\n// ── Provider ───────────────────────────────────────────────────\n\nexport const providerKindSchema = z.enum(['openai', 'anthropic', 'custom']);\n\nexport const createProviderSchema = z\n .object({\n name: z.string().min(1).max(100),\n provider: providerKindSchema,\n model: z.string().min(1).max(200),\n baseUrl: z.string().url().optional(),\n apiKey: z.string().min(1),\n isDefault: z.boolean().optional(),\n })\n .refine((v) => v.provider !== 'custom' || !!v.baseUrl, {\n message: 'baseUrl is required when provider is \"custom\"',\n path: ['baseUrl'],\n });\n\n// On update everything is optional. apiKey is omitted unless rotating.\nexport const updateProviderSchema = z.object({\n name: z.string().min(1).max(100).optional(),\n provider: providerKindSchema.optional(),\n model: z.string().min(1).max(200).optional(),\n baseUrl: z.string().url().nullable().optional(),\n apiKey: z.string().min(1).optional(),\n isDefault: z.boolean().optional(),\n});\n\n// ── MCP Document ───────────────────────────────────────────────\n\nexport const uploadMCPDocumentSchema = z.object({\n projectId: z.string().min(1),\n version: z.string().default('1.0'),\n content: z.record(z.unknown()),\n});\n\n// ── API Key ────────────────────────────────────────────────────\n\n/**\n * `sdk` — mints the existing project-scoped key that drives the mobile\n * agent surface. `operator` — mints a workspace-wide key (no project)\n * that lets a customer's own systems act as a human-support operator\n * against the escalation routes (Operator API feature).\n */\nexport const apiKeyScopeSchema = z.enum(['sdk', 'operator']);\n\n/**\n * Which environment the key speaks for — the ONE fact about a request\n * the caller cannot decline to send, because the key is what\n * authenticates it (#335).\n *\n * `test` — integration, evals, manual QA. Free on every plan and never\n * invoiced. `live` — production. Needs an active plan and bills.\n *\n * No default here on purpose: the route picks it from the workspace's\n * own entitlement, because handing a free workspace a `live` key would\n * hand it a key that 402s on the first session.\n */\nexport const apiKeyEnvironmentSchema = z.enum(['test', 'live']);\n\nexport const createApiKeySchema = z\n .object({\n name: z.string().min(1).max(100),\n // Required for `sdk` (default), forbidden/ignored for `operator` —\n // enforced by the `.refine` below rather than the field itself so a\n // missing scope still validates as the pre-existing SDK shape.\n projectId: z.string().min(1).optional(),\n scope: apiKeyScopeSchema.default('sdk'),\n environment: apiKeyEnvironmentSchema.optional(),\n expiresAt: z.string().datetime().optional(),\n })\n .refine((v) => v.scope !== 'sdk' || !!v.projectId, {\n message: 'projectId is required for scope \"sdk\"',\n path: ['projectId'],\n });\n\n// ── Agent observation context (canonical contract) ─────────────\n//\n// The runtime `context` the SDK sends with /agent/message and\n// /agent/continue — the observation the server grounds action targets\n// against. It used to be accepted as `z.record(z.unknown())` (issue\n// #169): fully client-controlled and unbounded, so a caller could feed an\n// arbitrarily large or malformed observation straight into the relay and\n// the LLM prompt. This schema BOUNDS it (array + string caps = DoS guard)\n// and TYPES the known fields, while staying forward-compatible: every\n// field is optional and nested objects `.passthrough()`, so new SDK\n// snapshot fields never reject a valid client. It is the single shape the\n// relay and every future platform adapter (web, native) can target.\n//\n// Mirrors `RelayRequest['context']` in apps/api ai-relay.ts — keep them in\n// sync when either changes.\n\nconst boundedString = (max: number) => z.string().max(max);\n\n/**\n * Client platform the observation/context was captured on. Additive,\n * optional field for the multi-platform contract effort — existing SDKs\n * (React Native) never send it, and the server treats an ABSENT value as\n * `'react-native'` everywhere it branches on platform (see\n * `resolvePlatformProfile` in apps/api's relay/platform module). Known\n * values get an enum for editor autocomplete / docs; the `.or(z.string())`\n * keeps the field open so a brand-new adapter (e.g. `'flutter'`) can start\n * sending it before the enum is updated, without ever failing validation.\n */\nexport const clientPlatformSchema = z\n .enum(['react-native', 'web', 'android', 'ios'])\n .or(z.string().min(1).max(40));\n\n/**\n * How much a client actually knows about an element's identifier.\n *\n * `declared` = the app wrote the id down (testID / data-testid /\n * accessibilityLabel / aria-label). `derived` = folded out of text the user\n * can read. `positional` = an ordinal valid for one observation only.\n *\n * Open-ended like `clientPlatformSchema`, so a non-React-Native adapter can\n * report a mechanism this enum has not met yet rather than being rejected.\n *\n * ABSENT is not `declared`. Every client published before this field existed\n * omits it, and the server must treat a missing value as UNKNOWN — reading\n * it as the most trustworthy option would make an old SDK look safer than a\n * new one that admits it is guessing.\n */\nexport const identityProvenanceSchema = z\n .enum(['declared', 'derived', 'positional'])\n .or(z.string().min(1).max(40));\n\nconst snapshotInputSchema = z\n .object({\n id: boundedString(160).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n label: boundedString(300).optional(),\n value: boundedString(4096).optional(),\n placeholder: boundedString(300).optional(),\n editable: z.boolean().optional(),\n secure: z.boolean().optional(),\n submitsOnReturn: z.boolean().optional(),\n type: boundedString(40).optional(),\n required: z.boolean().optional(),\n invalid: z.boolean().optional(),\n inModal: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotButtonSchema = z\n .object({\n id: boundedString(160).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n label: boundedString(300).optional(),\n disabled: z.boolean().optional(),\n inModal: z.boolean().optional(),\n risk: boundedString(40).optional(),\n destructive: z.boolean().optional(),\n requiresConfirmation: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotToggleSchema = z\n .object({\n id: boundedString(160).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n label: boundedString(300).optional(),\n value: z.boolean().optional(),\n inModal: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotSliderSchema = z\n .object({\n id: boundedString(160).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n label: boundedString(300).optional(),\n value: z.number().finite().optional(),\n min: z.number().finite().optional(),\n max: z.number().finite().optional(),\n step: z.number().finite().optional(),\n disabled: z.boolean().optional(),\n inModal: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotListSchema = z\n .object({\n index: z.number().int().optional(),\n id: boundedString(160).optional(),\n containerType: boundedString(60).optional(),\n /**\n * Free-form provenance tag for how the SDK discovered this list\n * (today: `'fiber' | 'auto-tracked' | 'registry'` from the RN\n * walker). Left as an open bounded string, not an enum, so a\n * non-RN adapter (web DOM walker, native accessibility-tree walker)\n * can report its own discovery mechanism without a schema change.\n */\n source: boundedString(40).optional(),\n itemCount: z.number().int().optional(),\n visibleItemCount: z.number().int().optional(),\n refreshing: z.boolean().optional(),\n empty: z.boolean().optional(),\n label: boundedString(300).optional(),\n dataPreview: z\n .array(\n z\n .object({\n index: z.number().int().optional(),\n key: boundedString(160).optional(),\n text: boundedString(500).optional(),\n })\n .passthrough(),\n )\n .max(500)\n .optional(),\n scrollOffsetY: z.number().finite().optional(),\n canScrollUp: z.boolean().optional(),\n canScrollDown: z.boolean().optional(),\n // Items/options are bounded by count but passthrough per-item: the SDK\n // adds fields (nested actions, absolute index) faster than this schema\n // should chase, and the relay only reads a known subset.\n items: z.array(z.record(z.unknown())).max(500).optional(),\n })\n .passthrough();\n\n/**\n * A scrollable surface with no rows — a form or detail screen inside a\n * `ScrollView`. Kept apart from `lists` on purpose: an agent told this\n * is a list with zero items will try ordinals against it.\n */\n/**\n * A platform dialog covering the screen. Reported apart from everything\n * else because it lives outside React and nothing behind it is\n * touchable while it is up.\n */\nconst snapshotNativeDialogSchema = z\n .object({\n id: boundedString(160),\n title: boundedString(300).optional(),\n message: boundedString(2000).optional(),\n buttons: z\n .array(\n z\n .object({\n label: boundedString(160),\n style: z.enum(['default', 'cancel', 'destructive']).optional(),\n })\n .passthrough(),\n )\n .max(10),\n })\n .passthrough();\n\nconst snapshotScrollableSchema = z\n .object({\n id: boundedString(160),\n containerType: boundedString(60).optional(),\n label: boundedString(300).optional(),\n scrollOffsetY: z.number().finite().optional(),\n canScrollUp: z.boolean().optional(),\n canScrollDown: z.boolean().optional(),\n horizontal: z.boolean().optional(),\n })\n .passthrough();\n\nconst snapshotChoiceGroupSchema = z\n .object({\n index: z.number().int().optional(),\n id: boundedString(160).optional(),\n label: boundedString(300).optional(),\n source: boundedString(40).optional(),\n options: z.array(z.record(z.unknown())).max(200).optional(),\n })\n .passthrough();\n\nconst snapshotElementSchema = z\n .object({\n id: boundedString(160).optional(),\n role: boundedString(40).optional(),\n label: boundedString(300).optional(),\n texts: z.array(boundedString(500)).max(50).optional(),\n actions: z.array(boundedString(40)).max(20).optional(),\n disabled: z.boolean().optional(),\n selected: z.boolean().optional(),\n source: boundedString(40).optional(),\n provenance: identityProvenanceSchema.optional(),\n /**\n * False when the control is mounted but currently OUTSIDE the window —\n * below the fold, scrolled off, pushed sideways. Absent means the client\n * cannot tell (old React Native architecture, or any SDK published\n * before the field existed), which must never be read as `false`.\n */\n onScreen: z.boolean().optional(),\n targetId: boundedString(160).optional(),\n listContext: z.record(z.unknown()).optional(),\n inModal: z.boolean().optional(),\n })\n .passthrough();\n\nexport const agentSnapshotSchema = z\n .object({\n route: boundedString(200).nullish(),\n title: boundedString(200).nullish(),\n texts: z.array(boundedString(2000)).max(500).optional(),\n inputs: z.array(snapshotInputSchema).max(300).optional(),\n buttons: z.array(snapshotButtonSchema).max(300).optional(),\n toggles: z.array(snapshotToggleSchema).max(300).optional(),\n sliders: z.array(snapshotSliderSchema).max(100).optional(),\n loading: z.boolean().optional(),\n modalOpen: z.boolean().optional(),\n lists: z.array(snapshotListSchema).max(100).optional(),\n choiceGroups: z.array(snapshotChoiceGroupSchema).max(100).optional(),\n scrollables: z.array(snapshotScrollableSchema).max(20).optional(),\n nativeDialog: snapshotNativeDialogSchema.optional(),\n elements: z.array(snapshotElementSchema).max(1000).optional(),\n /**\n * The client clamped this observation to the caps above and lost\n * data doing it (`clampSnapshotToWireLimits` in\n * `@appilots/client-core`). Read by the prompt serializer so the\n * model is told the view is partial — a screen truncated at 500\n * texts must not be read as a screen that only has 500 things on\n * it. Optional: older SDKs never clamp and never send it.\n */\n truncated: z.boolean().optional(),\n /**\n * How many of this screen's controls the client could name, split by\n * `identityProvenance`. Diagnostic only — the relay never grounds an\n * action on it — but it is the number that says whether an app needs\n * annotating, and comparing it between a debug and a release build is\n * the first direct measurement of what minification costs the agent.\n */\n stats: z\n .object({\n visitedFibers: z.number().int().nonnegative().optional(),\n skippedHidden: z.number().int().nonnegative().optional(),\n identity: z\n .object({\n declared: z.number().int().nonnegative().optional(),\n derived: z.number().int().nonnegative().optional(),\n positional: z.number().int().nonnegative().optional(),\n })\n .passthrough()\n .optional(),\n })\n .passthrough()\n .optional(),\n })\n .passthrough();\n\nexport const agentContextSchema = z\n .object({\n /**\n * Client platform this observation was captured on. Optional and\n * additive (see `clientPlatformSchema`) — absent means\n * `'react-native'` for every downstream consumer, so pre-existing\n * SDKs that never set this field keep byte-identical behavior.\n */\n platform: clientPlatformSchema.optional(),\n currentScreen: boundedString(200).optional(),\n formState: z.record(z.unknown()).optional(),\n navigationState: z\n .object({\n currentRouteName: boundedString(200).optional(),\n activePath: z.array(boundedString(200)).max(50).optional(),\n rootRouteNames: z.array(boundedString(200)).max(200).optional(),\n currentRouteNames: z.array(boundedString(200)).max(200).optional(),\n routeNames: z.array(boundedString(200)).max(500).optional(),\n canGoBack: z.boolean().optional(),\n })\n .passthrough()\n .optional(),\n screenMetadata: z\n .object({\n name: boundedString(200).optional(),\n title: boundedString(200).optional(),\n description: boundedString(2000).optional(),\n fields: z.array(z.record(z.unknown())).max(200).optional(),\n actions: z\n .array(z.union([boundedString(200), z.record(z.unknown())]))\n .max(200)\n .optional(),\n })\n .passthrough()\n .optional(),\n snapshot: agentSnapshotSchema.optional(),\n registeredComponents: z\n .array(\n z\n .object({\n id: boundedString(160).optional(),\n kind: boundedString(40).optional(),\n screen: boundedString(200).optional(),\n label: boundedString(300).optional(),\n })\n .passthrough(),\n )\n .max(500)\n .optional(),\n registeredLists: z\n .array(\n z\n .object({\n id: boundedString(160).optional(),\n component: boundedString(200).optional(),\n kind: boundedString(40).optional(),\n itemCount: z.number().int().optional(),\n label: boundedString(300).optional(),\n screen: boundedString(200).optional(),\n refreshing: z.boolean().optional(),\n empty: z.boolean().optional(),\n })\n .passthrough(),\n )\n .max(200)\n .optional(),\n loadingPending: z.boolean().optional(),\n })\n .passthrough();\n\n// ── Introspection health ───────────────────────────────────────\n\n/**\n * Why the SDK could not read the host app's UI tree.\n *\n * - `sentinel-missing-internals`: the SDK mounted but the React runtime\n * did not expose the fiber it needs — a React version we have not\n * validated against. `reactVersion` identifies it.\n * - `never-mounted`: a snapshot was requested before the provider\n * committed, or from outside it. An integration mistake, not a\n * version problem.\n * - `render-crashed`: the SDK's own render surface threw and its error\n * boundary degraded it, unmounting the fiber sentinel. Unlike the\n * other two this is OUR bug, so the server attributes it to `infra`\n * rather than to the customer's app config.\n * - `names-mangled`: the app's bundler renamed the React Native\n * components the walker matches by name (#386). Capture itself\n * SUCCEEDED — one of two reasons that arrive with `captured: true` —\n * but detection is running on its structural fallbacks, so the\n * reading is coarser than usual.\n * - `walk-recognized-nothing`: the walker crossed a substantial tree\n * and not one of its detectors matched (#388). Also arrives with\n * `captured: true`, and it is the reason the observation the agent\n * received was empty while the user was looking at a populated\n * screen. Its cause is whatever `appilotsSelfCheck()` shows on the\n * device — mangled names, a wrapper component, an RN version the\n * walker has not met.\n *\n * Values are only ever ADDED here. An older server rejecting a reason a\n * newer SDK sends would fail the whole message, so this schema must\n * reach production before an SDK that can emit the new value ships —\n * the deploy-then-publish order in CLAUDE.md.\n */\nexport const introspectionFailureReasonSchema = z.enum([\n 'sentinel-missing-internals',\n 'never-mounted',\n 'render-crashed',\n 'names-mangled',\n 'walk-recognized-nothing',\n]);\n\nexport const introspectionDiagnosticsSchema = z.object({\n captured: z.boolean(),\n failureReason: introspectionFailureReasonSchema.nullish(),\n reactVersion: boundedString(32).nullish(),\n failureCount: z.number().int().min(0).max(1_000_000).optional(),\n});\n\n// ── Chat Message ───────────────────────────────────────────────\n\nexport const sendMessageSchema = z.object({\n content: z.string().min(1).max(4096),\n sessionId: z.string().optional(),\n context: agentContextSchema.optional(),\n /**\n * MCP doc version the SDK was bundled with. Server compares against\n * the active MCP doc and emits `mcp_version_mismatch` telemetry when\n * they differ. Optional — older SDKs simply skip the check.\n */\n mcpVersion: z.string().max(64).optional(),\n /**\n * SDK-side introspection health. Only sent when it FAILED — a client\n * that reached the React tree omits the field entirely, so the happy\n * path costs nothing on the wire.\n *\n * Without this, an app whose introspection is dead sends a snapshot\n * that is empty but perfectly well-formed, indistinguishable from a\n * genuinely empty screen. The server emits\n * `introspection_unavailable` so the failure is visible to us instead\n * of waiting for a bug report. Optional — older SDKs simply never\n * send it.\n */\n introspection: introspectionDiagnosticsSchema.optional(),\n});\n\n// ── Agent actions ──────────────────────────────────────────────\n// Canonical wire contract for actions emitted by the API and executed\n// by the SDK. Runtime code may still accept legacy aliases for backward\n// compatibility, but new payloads should prefer these shapes.\n\nexport const agentActionTypeSchema = z.enum([\n 'navigate',\n 'form_fill',\n 'ui_interaction',\n 'scroll_list',\n 'confirm',\n 'custom',\n]);\n\nexport const navigationPayloadSchema = z\n .object({\n // Optional ONLY so `goBack` can exist (#398): it returns to whatever\n // is beneath on the stack and has no destination to name. Every other\n // action is still required to carry one — enforced by the refine\n // below rather than by the field, so the error names the real problem\n // (\"navigate needs a screenName\") instead of a missing key.\n screenName: z.string().min(1).optional(),\n params: z.record(z.unknown()).optional(),\n navigationAction: z\n .enum(['push', 'navigate', 'replace', 'goBack', 'reset'])\n .default('navigate')\n .optional(),\n path: z.array(z.string().min(1)).optional(),\n })\n .passthrough()\n .refine(\n (payload) =>\n payload.navigationAction === 'goBack' ||\n (typeof payload.screenName === 'string' && payload.screenName.length > 0),\n {\n message: 'screenName is required for every navigationAction except \"goBack\"',\n path: ['screenName'],\n },\n );\n\nexport const formFillFieldSchema = z\n .object({\n fieldId: z.string().min(1),\n fieldType: z\n .enum(['text', 'select', 'toggle', 'date', 'number', 'custom'])\n .default('text')\n .optional(),\n value: z.unknown(),\n label: z.string().optional(),\n })\n .passthrough();\n\nexport const formFillPayloadSchema = z\n .object({\n screenName: z.string().optional(),\n fields: z.array(formFillFieldSchema),\n submitAfterFill: z.boolean().optional(),\n })\n .passthrough();\n\nexport const uiInteractionPayloadSchema = z\n .object({\n action: z\n .enum(['press', 'longPress', 'scroll', 'swipe', 'focus', 'set_value'])\n .default('press')\n .optional(),\n // `targetId` is the canonical server/LLM field. SDK runtimes still\n // accept `componentId` as a compatibility alias.\n targetId: z.string().min(1),\n componentId: z.string().min(1).optional(),\n /**\n * Numeric value for `set_value` (sliders / adjustable controls).\n * The SDK executor clamps it to the target's min/max and snaps it\n * to the step exposed in the observation.\n */\n value: z.number().finite().optional(),\n params: z.record(z.unknown()).optional(),\n })\n .passthrough()\n .refine((p) => p.action !== 'set_value' || typeof p.value === 'number', {\n message: 'set_value requires a numeric `value`',\n path: ['value'],\n });\n\n// Scroll a list/collection so off-screen (virtualized) rows mount and\n// become visible in the next observation. `toIndex` is the 1-based\n// position in the list's DATA (not just the mounted rows); `direction`\n// pages roughly one viewport at a time when no specific index is known.\nexport const scrollListPayloadSchema = z\n .object({\n /** Runtime list id (from the observation's \"Lists visible\" block). */\n listId: z.string().min(1).optional(),\n /** 1-based data index to scroll to (e.g. 42 = the 42nd item). */\n toIndex: z.number().int().min(1).optional(),\n /** Coarse paging when no target index is known. */\n direction: z.enum(['up', 'down']).optional(),\n })\n .passthrough();\n\nexport const confirmPayloadSchema = z\n .object({\n title: z.string().optional(),\n message: z.string().optional(),\n actionDescription: z.string().optional(),\n severity: z.enum(['warning', 'danger']).optional(),\n destructive: z.boolean().optional(),\n confirmLabel: z.string().optional(),\n cancelLabel: z.string().optional(),\n gatedActionId: z.string().optional(),\n gatedActionType: agentActionTypeSchema.optional(),\n injectedBy: z.enum(['permissions', 'sdk-local']).optional(),\n })\n .passthrough();\n\nexport const agentActionSchema = z.discriminatedUnion('type', [\n z.object({\n id: z.string().min(1),\n type: z.literal('navigate'),\n payload: navigationPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('form_fill'),\n payload: formFillPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('ui_interaction'),\n payload: uiInteractionPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('scroll_list'),\n payload: scrollListPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('confirm'),\n payload: confirmPayloadSchema,\n }),\n z.object({\n id: z.string().min(1),\n type: z.literal('custom'),\n payload: z.record(z.unknown()).default({}),\n }),\n]);\n\nexport const agentActionListSchema = z.array(agentActionSchema);\n\n// ── Agent continuation ─────────────────────────────────────────\n// Sent by the SDK after a batch of actions completes, so the model\n// can observe the outcomes + fresh screen state and decide what to\n// do next (instead of being a one-shot per user turn).\n\n/**\n * Structured diagnosis attached to a failed action result (BACKLOG 3.2).\n *\n * The recovery loop in `apps/api/src/modules/agents/routes.ts` reads\n * these fields to (a) classify whether a retry is worth attempting and\n * (b) feed the model an actionable observation instead of a generic\n * \"action failed\". The categories mirror the failure types the SDK can\n * detect — anything genuinely unknown becomes `unknown` and we lean on\n * the visible message + error string for context.\n */\nexport const actionFailureCategorySchema = z.enum([\n // The targeted button/input/toggle wasn't found in registry or fiber\n 'component-not-found',\n // The button exists but is currently disabled (e.g. invalid form)\n 'disabled',\n // Inline validation message visible (e.g. \"email inválido\")\n 'validation',\n // Network 5xx — likely transient, worth a retry with backoff\n 'network-5xx',\n // Network 4xx — semantic error from the backend; reporting is right\n 'network-4xx',\n // Screen took too long to mount after a navigate\n 'screen-timeout',\n // Multiple targets tied, or list row exposes only destructive nested controls\n 'ambiguous-target',\n // Action ran but the SDK couldn't tell what broke\n 'unknown',\n]);\n\nexport const actionDiagnoseSchema = z.object({\n category: actionFailureCategorySchema,\n /** Visible validation message read from the screen, when available */\n visibleMessage: z.string().optional(),\n /** Field id on the screen — for form_fill failures */\n fieldId: z.string().optional(),\n /** Component / button / toggle id — for ui_interaction failures */\n targetId: z.string().optional(),\n /** Screen the action ran on (route name) when available */\n screen: z.string().optional(),\n /** HTTP status when category is `network-*` */\n httpStatus: z.number().int().optional(),\n /**\n * When resolution failed because MULTIPLE on-screen targets matched\n * with equal confidence, the SDK lists the candidate ids/labels here\n * so the recovery hop can pick one instead of guessing blindly.\n */\n candidates: z.array(z.string().min(1)).max(8).optional(),\n /**\n * Optional generic recovery signal from newer SDKs. Old SDKs omit it\n * and the server derives the policy from `category`.\n */\n recoverable: z.boolean().optional(),\n /**\n * True when the app needs the human to provide or fix data before a\n * safe retry is possible. This is state, not language.\n */\n requiresUserInput: z.boolean().optional(),\n});\n\nexport const actionResultSchema = z.object({\n actionId: z.string(),\n type: z.string(),\n success: z.boolean(),\n error: z.string().optional(),\n /** Brief one-line description of what was attempted, for prompt readability */\n summary: z.string().optional(),\n /**\n * BACKLOG 3.2 — structured failure detail. Present only on failures.\n * The continue route uses `diagnose.category` to decide whether to\n * attempt a recovery hop and `visibleMessage` / `fieldId` to brief\n * the model.\n */\n diagnose: actionDiagnoseSchema.optional(),\n /**\n * BACKLOG 3.2 — how many times this *same* action (matched by\n * fingerprint of type+payload) has been retried already. 0 means\n * this is the first attempt; 2 means the SDK has already retried\n * twice and the server should give up.\n */\n recoveryAttempt: z.number().int().min(0).max(5).optional(),\n /**\n * BACKLOG 3.2 — set by the SDK when the per-action retry cap is hit.\n * The server must NOT call the LLM again for this action; instead\n * it surfaces the friendly \"couldn't complete\" message.\n */\n recoveryExhausted: z.boolean().optional(),\n /**\n * Set by the SDK when an action was reported as successful by the\n * handler (no exception, no diagnose) BUT the side-effect that the\n * SDK expected to observe didn't actually happen. Today only fires\n * for navigate actions when `getCurrentScreen()` didn't change after\n * the settle window — the silent-failure mode where the LLM thinks\n * it acted but reality says otherwise. The server emits a\n * `tool_without_effect` agent_event so it can be graphed.\n */\n toolWithoutEffect: z.boolean().optional(),\n /**\n * Optional structured effect signal for newer SDKs. This lets the\n * agent distinguish \"the handler ran\" from \"the app visibly changed\"\n * without parsing localized text.\n */\n effect: z.enum(['unknown', 'none', 'partial', 'changed', 'completed']).optional(),\n /** Optional localized UI status key emitted by newer SDKs. */\n userVisibleStatusKey: z.string().optional(),\n});\n\nexport const continueAgentSchema = z.object({\n sessionId: z.string(),\n results: z.array(actionResultSchema).min(1),\n // issue #169 — the observation the server grounds targets against, now\n // validated + bounded at the border instead of z.record(z.unknown()).\n context: agentContextSchema.optional(),\n /** Hop counter — server enforces a cap to prevent runaway loops */\n hop: z.number().int().min(1).max(10).optional(),\n});\n\n// ── Permissions (BACKLOG 2.1) ──────────────────────────────────\n// Three-level permission model: project defaults, screen overrides\n// (in this object), and action-level overrides (on the MCP itself).\n\nexport const agentAccessLevelSchema = z.enum(['read', 'write', 'none']);\n\n/**\n * One screen-override entry. All fields optional — anything left out\n * inherits from the project default.\n */\nexport const screenPermissionSchema = z\n .object({\n agentAccess: agentAccessLevelSchema.optional(),\n requiresConfirmation: z.boolean().optional(),\n blockedActions: z.array(z.string().min(1)).optional(),\n isPii: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Permissions configuration as returned by GET /projects/:id/permissions\n * and accepted by PATCH. The API layer guarantees a row exists per\n * project (auto-created on first read), so the response always has\n * the project-level fields populated.\n */\nexport const projectPermissionsSchema = z.object({\n agentCanWrite: z.boolean(),\n blockPiiScreens: z.boolean(),\n confirmDestructive: z.boolean(),\n /**\n * Map of screenName → override. Keys must be non-empty strings.\n * Limited to 200 entries to keep the JSON column small and editable\n * in the dashboard table view.\n */\n screenOverrides: z.record(screenPermissionSchema).default({}),\n /**\n * BACKLOG 2.2 — action ids that should NEVER trigger an auto-confirm\n * even if marked destructive. Lets a dev opt out of the prompt for\n * specific actions (\"Confirma cada delete\" cansa). Order doesn't\n * matter; matched against `action.id`, `action.payload.targetId`,\n * and `action.payload.fieldId`.\n */\n neverConfirmActions: z.array(z.string().min(1)).default([]),\n});\n\n/**\n * PATCH payload — every field optional, including the screenOverrides\n * map. To remove an override, send `screenOverrides: { [screen]: {} }`\n * with all fields stripped (or pass an explicit `null` — the API drops\n * the entry).\n */\nexport const updateProjectPermissionsSchema = z\n .object({\n agentCanWrite: z.boolean().optional(),\n blockPiiScreens: z.boolean().optional(),\n confirmDestructive: z.boolean().optional(),\n screenOverrides: z.record(screenPermissionSchema.nullable()).optional(),\n neverConfirmActions: z.array(z.string().min(1)).optional(),\n })\n .strict();\n\n/**\n * Schema applied to `permissions` blocks embedded in MCP documents\n * (output of the mcp-generator when it sees a `@appilots-permissions`\n * JSDoc tag). Same shape as a screen-level override but with a\n * required `screen` field — used at runtime to merge with the\n * dashboard-configured overrides.\n */\nexport const mcpScreenPermissionsSchema = screenPermissionSchema;\n\n// ── Budget enforcement (BACKLOG 3.1) ────────────────────────────\n// Shape returned by `GET /projects/:id/budget` and accepted (partially)\n// by PATCH. The cap and mode are persisted on the `projects` row;\n// runtime metrics (spend, percent, projected, period) are computed on\n// each GET so the dashboard widget can render without a separate fetch.\n\nexport const budgetModeSchema = z.enum(['alert-only', 'block', 'degrade']);\n\n/**\n * One element of the runtime metric block. Numbers are in USD with\n * sub-cent precision; the dashboard rounds for display.\n */\nexport const budgetMetricsSchema = z.object({\n /** YYYY-MM the metrics apply to. */\n period: z.string().regex(/^\\d{4}-\\d{2}$/),\n /** Sum of estimatedCost across the period so far, USD. */\n currentSpend: z.number().min(0),\n /** Active cap in USD, null when disabled. */\n cap: z.number().positive().nullable(),\n /** 0–1 ratio currentSpend/cap. Null when cap is null. */\n percent: z.number().nullable(),\n /**\n * Linear extrapolation: currentSpend / daysElapsed * daysInMonth.\n * Returned only when at least one day of data is in the bucket.\n */\n projectedSpend: z.number().nullable(),\n /** True when the runtime currently degrades or blocks new requests. */\n enforcing: z.boolean(),\n});\n\n/**\n * GET response shape — config + computed runtime metrics. PATCH only\n * accepts the config subset (see `updateProjectBudgetSchema`).\n */\nexport const projectBudgetSchema = z.object({\n monthlyBudgetUsd: z.number().positive().nullable(),\n budgetMode: budgetModeSchema,\n budgetAlertEmails: z.array(z.string().email()).default([]),\n budgetWebhookUrl: z.string().url().nullable(),\n metrics: budgetMetricsSchema,\n});\n\n/**\n * PATCH payload. To remove the cap, send `monthlyBudgetUsd: null`\n * (the runtime treats null as \"feature off\"). Emails replace (not merge)\n * — the dashboard sends the canonical full list every save.\n */\nexport const updateProjectBudgetSchema = z\n .object({\n /** null = disable budgeting, undefined = leave unchanged. */\n monthlyBudgetUsd: z.number().positive().nullable().optional(),\n budgetMode: budgetModeSchema.optional(),\n budgetAlertEmails: z.array(z.string().email()).max(20).optional(),\n /** null = remove webhook, undefined = leave unchanged. */\n budgetWebhookUrl: z.string().url().nullable().optional(),\n })\n .strict();\n\n// ── Personalization (BACKLOG 4.1) ──────────────────────────────\n// Per-project knobs for theming, branding, persona and i18n. Every\n// field is optional on the wire — missing values fall back to the\n// SDK's bundled defaults at render time.\n\n/**\n * Locales the SDK ships translation bundles for. Adding a locale here\n * also requires shipping `packages/sdk/src/i18n/bundles/<locale>.ts`.\n */\nexport const localeSchema = z.enum(['pt-BR', 'en', 'es']);\n\n/**\n * Hex color string, e.g. `#6366f1`. Allows 3-, 6- or 8-digit forms so\n * the dashboard color picker output (always 6-digit) and short-hand\n * tokens copied from a Tailwind config both validate.\n */\nconst hexColorSchema = z.string().regex(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, {\n message: 'Must be a hex color like #6366f1',\n});\n\n/**\n * Theme tokens. Every field optional — partials are merged on top of\n * the SDK's default light/dark token tree.\n */\nexport const themeTokensSchema = z\n .object({\n colors: z\n .object({\n primary: hexColorSchema.optional(),\n secondary: hexColorSchema.optional(),\n background: hexColorSchema.optional(),\n surface: hexColorSchema.optional(),\n text: hexColorSchema.optional(),\n textSecondary: hexColorSchema.optional(),\n border: hexColorSchema.optional(),\n success: hexColorSchema.optional(),\n warning: hexColorSchema.optional(),\n error: hexColorSchema.optional(),\n buttonText: hexColorSchema.optional(),\n bubbleText: hexColorSchema.optional(),\n userBubbleText: hexColorSchema.optional(),\n })\n .strict()\n .optional(),\n typography: z\n .object({\n fontFamily: z.string().min(1).max(120).optional(),\n fontSizeXs: z.number().int().min(8).max(48).optional(),\n fontSizeSm: z.number().int().min(8).max(48).optional(),\n fontSizeBase: z.number().int().min(8).max(48).optional(),\n fontSizeLg: z.number().int().min(8).max(48).optional(),\n })\n .strict()\n .optional(),\n radii: z\n .object({\n sm: z.number().int().min(0).max(64).optional(),\n md: z.number().int().min(0).max(64).optional(),\n lg: z.number().int().min(0).max(64).optional(),\n })\n .strict()\n .optional(),\n /**\n * `auto` (default) follows the device color scheme. `light`/`dark`\n * force the theme regardless of system setting.\n */\n mode: z.enum(['auto', 'light', 'dark']).optional(),\n })\n .strict();\n\n/**\n * GET /projects/:id/personalization response. Same shape that the SDK\n * later receives via the runtime config endpoint, so the dashboard can\n * preview faithfully without a separate fetch.\n */\nexport const projectPersonalizationSchema = z.object({\n /** Tone / persona instructions appended to the system prompt. */\n personaPrompt: z.string().max(2048).nullable(),\n /** Display name in the chat header (e.g. \"Aria\"). */\n assistantName: z.string().max(60).nullable(),\n /** URL or remote asset id for the avatar shown next to assistant turns. */\n assistantAvatar: z.string().max(500).nullable(),\n /** Emoji or image URL for the empty-state icon. Auto-detected by prefix. */\n emptyStateIcon: z.string().max(500).nullable(),\n /** First-message text shown in the empty state. */\n welcomeMessage: z.string().max(500).nullable(),\n /** Title rendered at the top of the chat. */\n chatTitle: z.string().max(60).nullable(),\n /** Pro+ tier toggle for the \"Powered by Appilots\" footer. */\n poweredByVisible: z.boolean(),\n /** Partial token tree, merged onto the SDK defaults at render time. */\n theme: themeTokensSchema.nullable(),\n /** Locale used when the SDK doesn't receive one as a prop. */\n defaultLocale: localeSchema.nullable(),\n /** Chat-open FAB background color. Null falls back to theme.colors.primary. */\n triggerButtonColor: hexColorSchema.nullable(),\n /** Image URL rendered inside the FAB instead of the default chat-bubble icon. */\n triggerButtonImageUrl: z.string().max(500).nullable(),\n});\n\n/**\n * PATCH payload. Every field optional. Send `null` to clear a value\n * (the SDK then falls back to the bundled defaults). Send `undefined`\n * (or omit) to leave the existing value untouched.\n */\nexport const updateProjectPersonalizationSchema = z\n .object({\n personaPrompt: z.string().max(2048).nullable().optional(),\n assistantName: z.string().max(60).nullable().optional(),\n assistantAvatar: z.string().max(500).nullable().optional(),\n emptyStateIcon: z.string().max(500).nullable().optional(),\n welcomeMessage: z.string().max(500).nullable().optional(),\n chatTitle: z.string().max(60).nullable().optional(),\n poweredByVisible: z.boolean().optional(),\n theme: themeTokensSchema.nullable().optional(),\n defaultLocale: localeSchema.nullable().optional(),\n triggerButtonColor: hexColorSchema.nullable().optional(),\n triggerButtonImageUrl: z.string().max(500).nullable().optional(),\n })\n .strict();\n\n// ── Sandbox / Test-preview mode (BACKLOG 4.2) ──────────────────\n\n/**\n * Snapshot the dashboard sends to mimic an SDK observation. Same general\n * shape as the runtime `observation` produced by the SDK, but everything\n * is optional so the dev can fill only what they care about. Loose\n * `record(unknown)` slots cover edge cases (custom selectors, internal\n * widget state) without forcing the dashboard schema to chase the SDK.\n */\nexport const sandboxObservationSchema = z\n .object({\n route: z.string().max(200).optional(),\n /** Screen title as rendered (the SDK snapshot carries it; the relay\n * compactor forwards it into VISIBLE STATE). */\n title: z.string().max(200).optional(),\n texts: z.array(z.string().max(500)).max(200).optional(),\n inputs: z\n .array(\n z.object({\n id: z.string().max(120),\n provenance: identityProvenanceSchema.optional(),\n onScreen: z.boolean().optional(),\n label: z.string().max(200).optional(),\n value: z.string().max(2000).optional(),\n disabled: z.boolean().optional(),\n required: z.boolean().optional(),\n type: z.string().max(40).optional(),\n placeholder: z.string().max(200).optional(),\n /** Inline validation state (SDK snapshot field). */\n invalid: z.boolean().optional(),\n }),\n )\n .max(100)\n .optional(),\n buttons: z\n .array(\n z.object({\n id: z.string().max(120),\n provenance: identityProvenanceSchema.optional(),\n onScreen: z.boolean().optional(),\n label: z.string().max(200).optional(),\n disabled: z.boolean().optional(),\n /** Risk metadata (e.g. \"high\") the SDK forwards for danger UI. */\n risk: z.string().max(40).optional(),\n /**\n * Selected/active state for grouped, mutually-exclusive options\n * (SegmentedControl, RadioGroup) — read from\n * `accessibilityState.selected` by the SDK walker.\n */\n selected: z.boolean().optional(),\n }),\n )\n .max(100)\n .optional(),\n /**\n * Sliders / adjustable numeric controls exactly as the SDK snapshot\n * reports them (captureSnapshot.ts merges registry-driven sliders).\n * min/max/step are the executable contract: the relay renders them\n * into VISIBLE STATE so the model can emit `set_value` within range.\n */\n sliders: z\n .array(\n z.object({\n id: z.string().max(120),\n provenance: identityProvenanceSchema.optional(),\n onScreen: z.boolean().optional(),\n label: z.string().max(200).optional(),\n value: z.number().finite().optional(),\n min: z.number().finite().optional(),\n max: z.number().finite().optional(),\n step: z.number().finite().positive().optional(),\n disabled: z.boolean().optional(),\n }),\n )\n .max(40)\n .optional(),\n /**\n * List containers exactly as the SDK snapshot reports them\n * (captureSnapshot.ts). The relay compactor renders these into the\n * VISIBLE STATE block (ordinal list-N-item-M ids), so the sandbox /\n * eval suite must be able to declare them too. Items are passthrough:\n * the SDK adds fields (nested actions, absolute index) faster than\n * this schema should have to chase.\n */\n lists: z\n .array(\n z\n .object({\n index: z.number().int().nonnegative().optional(),\n containerType: z.string().max(60).optional(),\n items: z\n .array(\n z\n .object({\n index: z.number().int().optional(),\n syntheticId: z.string().max(120).optional(),\n texts: z.array(z.string().max(500)).max(50).optional(),\n })\n .passthrough(),\n )\n .max(200)\n .optional(),\n })\n .passthrough(),\n )\n .max(20)\n .optional(),\n /**\n * Toggles exactly as the SDK snapshot reports them (#390).\n *\n * Their absence is why `generality-component-control-smarthome`\n * came back `errored` with a 422 instead of measuring anything:\n * this schema is `.strict()`, so a scenario that declares a switch\n * is rejected before the agent is ever asked. Which means the\n * corpus could not express the single control behind failure 02 of\n * the functional audit — \"disable an agent; the switch never\n * moves\". The one defect the eval most needed to catch was the one\n * shape it could not describe.\n */\n toggles: z\n .array(\n z.object({\n id: z.string().max(120),\n provenance: identityProvenanceSchema.optional(),\n onScreen: z.boolean().optional(),\n label: z.string().max(200).optional(),\n value: z.boolean().optional(),\n disabled: z.boolean().optional(),\n }),\n )\n .max(100)\n .optional(),\n /**\n * The interaction graph — the `el:*` ids the prompt tells the model\n * to prefer over ordinal handles. Passthrough per entry for the\n * same reason `lists` is: the SDK adds fields faster than this\n * schema should chase them.\n */\n elements: z\n .array(\n z\n .object({\n id: z.string().max(160),\n role: z.string().max(40).optional(),\n label: z.string().max(300).optional(),\n })\n .passthrough(),\n )\n .max(500)\n .optional(),\n /** Screen-level state the relay renders and branches on. */\n loading: z.boolean().optional(),\n modalOpen: z.boolean().optional(),\n extra: z.record(z.unknown()).optional(),\n })\n .strict();\n\n/**\n * Body of `POST /projects/:id/sandbox/run`.\n * `screen` is the screen name the dev is simulating standing on. `prompt`\n * is the user message. `observation` overrides the runtime snapshot.\n * `modelOverride` lets the dev test a non-default model without changing\n * the project's saved AI config.\n */\nexport const sandboxRunRequestSchema = z\n .object({\n screen: z.string().max(120).optional(),\n observation: sandboxObservationSchema.optional(),\n prompt: z.string().min(1).max(4000),\n /**\n * Optional. Overrides `projects.aiModel` for this run only. Free-form\n * string because MODEL_CATALOG owns the canonical list and we don't\n * want the validator to fall behind catalog updates.\n */\n modelOverride: z.string().max(120).optional(),\n /**\n * When true, the run does not bump `usage_daily` rows at all (not\n * even with `kind='sandbox'`). Useful for very fast iteration where\n * the dev doesn't want their tokens metered.\n */\n silent: z.boolean().optional(),\n /**\n * Prior turns of the conversation, in order, that precede `prompt`.\n * Lets a driver run the agent loop hop-by-hop headlessly (the multi-\n * hop agentic eval — tests/agentic/fixtures/trajectory.ts) by replaying\n * the assistant's previous replies and the synthetic recovery /\n * continuation observations as text, exactly as the production\n * `/agent/continue` flow threads them. Empty / absent → single-hop\n * behavior, unchanged. The final user `prompt` is always appended\n * after this history.\n */\n history: z\n .array(\n z.object({\n role: z.enum(['user', 'assistant', 'system']),\n content: z.string().max(8000),\n }),\n )\n .max(40)\n .optional(),\n /**\n * Pass-through to the relay's recovery branch. When true the relay\n * treats this call as a continuation/recovery hop (drops first-turn\n * heuristics, forces tool choice when the last user message carries a\n * failure marker). Only meaningful alongside `history`.\n */\n isRecoveryHop: z.boolean().optional(),\n /**\n * Run this call against the application structure supplied here\n * instead of the project's active MCP document.\n *\n * Sandbox-only, and the relay honours it only on a `dryRun` call —\n * see `resolveMcpOverride` in apps/api. It exists because the eval\n * corpus could otherwise only ever describe ONE app: every scenario\n * resolves to the same seeded project, so every navigate destination,\n * every screen title and every bit of domain priming in the prompt\n * came from the same vehicle-management demo. A suite that can only\n * pose questions about one app cannot measure whether the agent works\n * on another one.\n *\n * Deliberately loose (`z.record`): the MCP document's shape is owned\n * by the generator, and pinning it here would turn every additive\n * generator change into a 422 in the sandbox.\n */\n applicationStructure: z.record(z.unknown()).optional(),\n })\n .strict();\n\n/**\n * One entry per agent hop, mirroring the structure the dev would see in\n * a real session. `reasoningPreview` is a short trimmed preview of the\n * model's content (full text already lives on the assistant message).\n */\n/**\n * SPEC-046 — relay guard telemetry. Mirrors the `RelayDiagnostics`\n * interface in `../bench`; kept here so the sandbox response schema can\n * validate it without the validators module depending on the bench one.\n */\nexport const relayDiagnosticsSchema = z.object({\n unverifiedTargets: z.array(z.string()),\n guardsFired: z.array(z.object({ guard: z.string(), detail: z.string().optional() })),\n repairMode: z.enum(['repair', 'strict', 'disabled']),\n promptVersion: z.string(),\n // Defaulted for producers that predate the field: before it existed\n // every response had reached the model, so `true` is the correct\n // backfill.\n modelInvoked: z.boolean().default(true),\n});\n\nexport const sandboxTraceHopSchema = z.object({\n hop: z.number().int().nonnegative(),\n inputPreview: z.string(),\n reasoningPreview: z.string(),\n actions: z.array(\n z.object({\n id: z.string(),\n type: z.string(),\n payload: z.record(z.unknown()),\n destructive: z.boolean().optional(),\n }),\n ),\n tokensUsed: z.number().int().nonnegative(),\n latencyMs: z.number().nonnegative(),\n modelUsed: z.string(),\n});\n\nexport const sandboxRunResponseSchema = z.object({\n /** Final assistant text (last hop). */\n content: z.string(),\n /** Planned actions from the final hop. None of them are executed. */\n actions: z.array(\n z.object({\n id: z.string(),\n type: z.string(),\n payload: z.record(z.unknown()),\n destructive: z.boolean().optional(),\n }),\n ),\n /** Full system prompt (instructions + MCP slice + persona) used for the run. */\n systemPrompt: z.string(),\n /** Aggregate metrics across all hops. */\n totalTokens: z.number().int().nonnegative(),\n totalCostUsd: z.number().nonnegative(),\n totalLatencyMs: z.number().nonnegative(),\n modelUsed: z.string(),\n /** Hop-by-hop trace. Always at least one entry. */\n trace: z.array(sandboxTraceHopSchema),\n /** True when the run was a no-op (e.g. project has no MCP yet). */\n warning: z.string().optional(),\n /**\n * SPEC-046 — guard / hallucination telemetry for the run.\n *\n * ADDITIVE AND OPTIONAL, permanently: SDK and dashboard consumers\n * predate it, and older API deployments will not send it. Consumers\n * must treat an absent block as \"no information\", never as \"no guards\n * fired\".\n */\n diagnostics: relayDiagnosticsSchema.optional(),\n});\n\n/**\n * \"Salvar como teste\" payload — captures the same fields as a run plus\n * a name + description for later replay.\n */\nexport const saveSandboxTestSchema = z\n .object({\n name: z.string().min(1).max(120),\n description: z.string().max(500).optional(),\n screen: z.string().max(120).optional(),\n observation: sandboxObservationSchema.optional(),\n prompt: z.string().min(1).max(4000),\n })\n .strict();\n\n/** Response shape for the listed/saved test. */\nexport const sandboxTestSchema = z.object({\n id: z.string(),\n name: z.string(),\n description: z.string().nullable(),\n screen: z.string().nullable(),\n observation: sandboxObservationSchema.nullable(),\n prompt: z.string(),\n createdBy: z.string().nullable(),\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\n// ── Client-facing agent eval (BACKLOG whole-product gap #1) ────\n//\n// `POST /cli/eval/run` — the customer-facing counterpart to\n// `/sandbox/run`. Same dry-run/decision-mode relay call, but authed via\n// `sdkAuthMiddleware` (project API key) instead of a dashboard session,\n// and batched: the CLI posts every scenario from `.appilots/scenarios/`\n// in one request instead of one round-trip per scenario. Each scenario\n// is otherwise the same shape as a sandbox run.\n\n/** Hard cap on scenarios per `/cli/eval/run` call — a cost guard so a\n * misconfigured CI job can't fan out an unbounded number of LLM calls\n * on someone else's API key. */\nexport const EVAL_MAX_SCENARIOS_PER_RUN = 20;\n\nexport const evalScenarioRequestSchema = z\n .object({\n /** Caller-supplied identifier (the scenario file's `name`, typically)\n * so the response can be matched back up client-side. */\n id: z.string().min(1).max(200),\n screen: z.string().max(120).optional(),\n observation: sandboxObservationSchema.optional(),\n prompt: z.string().min(1).max(4000),\n modelOverride: z.string().max(120).optional(),\n })\n .strict();\n\nexport const evalRunRequestSchema = z\n .object({\n scenarios: z.array(evalScenarioRequestSchema).min(1).max(EVAL_MAX_SCENARIOS_PER_RUN),\n })\n .strict();\n\nexport const evalScenarioResultSchema = z.object({\n id: z.string(),\n content: z.string(),\n actions: z.array(\n z.object({\n id: z.string(),\n type: z.string(),\n payload: z.record(z.unknown()),\n }),\n ),\n totalTokens: z.number().int().nonnegative(),\n totalCostUsd: z.number().nonnegative(),\n totalLatencyMs: z.number().nonnegative(),\n modelUsed: z.string(),\n});\n\nexport const evalRunResponseSchema = z.object({\n results: z.array(evalScenarioResultSchema),\n});\n\n// ── Insights / Observability (BACKLOG 4.3) ─────────────────────\n//\n// Read-side schemas for the Insights dashboard page. The four widgets\n// (top prompts, funnel, screens heatmap, models comparison) each have\n// their own endpoint and their own response shape so the dashboard can\n// fetch independently and render skeletons per-card.\n//\n// All four accept the same `from`/`to` query params; absent values\n// default to the last 30 days on the server side.\n\n/**\n * `from`/`to` are YYYY-MM-DD UTC. The server clamps `to` to today and\n * `from` to a 90-day floor (rollup retention guarantees 365d but the\n * dashboard widgets are tuned for 7/30/90d windows).\n */\nexport const insightsRangeSchema = z.object({\n from: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: 'from must be YYYY-MM-DD' })\n .optional(),\n to: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: 'to must be YYYY-MM-DD' })\n .optional(),\n});\n\n/**\n * `GET /projects/:id/insights/top-prompts` — most common user prompts\n * (truncated, case-insensitive grouped) over the requested window.\n */\nexport const insightsTopPromptsResponseSchema = z.object({\n /** Date window the result covers, inclusive. */\n from: z.string(),\n to: z.string(),\n prompts: z.array(\n z.object({\n /** Truncated representative casing (max 160 chars). */\n prompt: z.string(),\n count: z.number().int().nonnegative(),\n /** Top 1-3 screens this prompt was sent from. */\n topScreens: z.array(z.string()).max(3),\n }),\n ),\n});\n\n/**\n * `GET /projects/:id/insights/funnel` — request → action_decided →\n * action_executed → success funnel. Counts are absolute; the dashboard\n * computes percentages.\n */\nexport const insightsFunnelResponseSchema = z.object({\n from: z.string(),\n to: z.string(),\n requests: z.number().int().nonnegative(),\n actionsDecided: z.number().int().nonnegative(),\n actionsExecuted: z.number().int().nonnegative(),\n actionsSucceeded: z.number().int().nonnegative(),\n actionsFailed: z.number().int().nonnegative(),\n clarificationsAsked: z.number().int().nonnegative(),\n recoveriesAttempted: z.number().int().nonnegative(),\n recoveriesSucceeded: z.number().int().nonnegative(),\n recoveriesExhausted: z.number().int().nonnegative(),\n});\n\n/**\n * `GET /projects/:id/insights/screens` — per-screen heatmap. Sorted by\n * problem rate (failures / total events) descending so the dashboard\n * can highlight troubled screens first.\n */\nexport const insightsScreensResponseSchema = z.object({\n from: z.string(),\n to: z.string(),\n screens: z.array(\n z.object({\n screen: z.string(),\n requests: z.number().int().nonnegative(),\n actionsExecuted: z.number().int().nonnegative(),\n actionsFailed: z.number().int().nonnegative(),\n /** 0–1 ratio: failed / (executed + failed). Null when neither. */\n problemRate: z.number().min(0).max(1).nullable(),\n /** Top error categories observed on this screen. */\n topErrors: z.array(\n z.object({\n category: z.string(),\n count: z.number().int().nonnegative(),\n }),\n ),\n }),\n ),\n});\n\n/**\n * `GET /projects/:id/insights/models` — head-to-head model comparison.\n * Useful when the project rotated providers mid-month. Returns one row\n * per modelId observed in the window.\n */\nexport const insightsModelsResponseSchema = z.object({\n from: z.string(),\n to: z.string(),\n models: z.array(\n z.object({\n modelId: z.string(),\n requests: z.number().int().nonnegative(),\n actionsDecided: z.number().int().nonnegative(),\n actionsSucceeded: z.number().int().nonnegative(),\n actionsFailed: z.number().int().nonnegative(),\n avgLatencyMs: z.number().nullable(),\n tokensTotal: z.number().int().nonnegative(),\n costUsd: z.number().nonnegative(),\n /** 0–1 ratio: succeeded / (succeeded + failed). Null when neither. */\n successRate: z.number().min(0).max(1).nullable(),\n }),\n ),\n});\n\n/**\n * `GET /projects/:id/insights/missions` — whole-session mission\n * completion, sourced from `agent_sessions.missionOutcome` (resolved\n * once per session at close, NOT inferred from the event funnel).\n * Answers \"of all missions started in this window, how many actually\n * completed?\" — `missionsStarted` counts sessions by `startedAt`\n * falling in [from, to], regardless of when they were later resolved.\n */\nexport const insightsMissionsResponseSchema = z.object({\n from: z.string(),\n to: z.string(),\n missionsStarted: z.number().int().nonnegative(),\n missionsCompleted: z.number().int().nonnegative(),\n missionsFailed: z.number().int().nonnegative(),\n missionsAbandoned: z.number().int().nonnegative(),\n /** Sessions started in-window that haven't resolved (or resolved ambiguously) yet. */\n missionsUnknown: z.number().int().nonnegative(),\n /** 0–1 ratio: completed / missionsStarted. Null when missionsStarted is 0. */\n completionRate: z.number().min(0).max(1).nullable(),\n});\n\n// ── Agent action audit trail ────────────────────────────────────\n// `GET /projects/:id/agent-actions` — reads `agent_actions` directly so\n// an operator can answer \"what did the agent do here?\" without needing\n// an open escalation. Cursor pagination mirrors /activity (createdAt of\n// the oldest row on the page).\n\nexport const agentActionStatusSchema = z.enum([\n 'pending',\n 'executing',\n 'completed',\n 'failed',\n 'cancelled',\n]);\n\nexport const agentActionsQuerySchema = z.object({\n sessionId: z.string().max(64).optional(),\n /** CSV of agentActionStatusSchema values. */\n status: z.string().optional(),\n /** CSV of agentActionTypeSchema values. */\n type: z.string().optional(),\n from: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: 'from must be YYYY-MM-DD' })\n .optional(),\n to: z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}$/, { message: 'to must be YYYY-MM-DD' })\n .optional(),\n /** Older-than cursor for infinite scroll — ISO datetime of createdAt. */\n cursor: z.string().optional(),\n /** Page size hint — the route clamps this to [1, 100], same as /activity. */\n limit: z.coerce.number().int().optional(),\n});\n\nexport const agentActionEntrySchema = z.object({\n id: z.string(),\n sessionId: z.string(),\n externalUserId: z.string().nullable(),\n screen: z.string().nullable(),\n type: z.string(),\n status: agentActionStatusSchema,\n error: z.string().nullable(),\n /**\n * Value-free summary of the action payload (identifiers and flags\n * only — e.g. fieldIds/submitAfterFill for form_fill). The raw\n * payload can carry end-user-typed values and never crosses the API\n * boundary; see apps/api common/services/action-view.ts.\n */\n detail: z.record(z.unknown()),\n executedAt: z.string().nullable(),\n completedAt: z.string().nullable(),\n createdAt: z.string(),\n});\n\nexport const agentActionsResponseSchema = z.object({\n entries: z.array(agentActionEntrySchema),\n nextCursor: z.string().nullable(),\n});\n\n// ── Human escalation (handoff) ─────────────────────────────────\n// Wire contract for the human-escalation feature — see\n// docs/human-escalation.md. The SDK creates escalations and exchanges\n// messages over API-key routes; the dashboard consumes the queue over\n// JWT routes. Both sides validate with these schemas at the border.\n\nexport const escalationStatusSchema = z.enum(['pending', 'active', 'resolved']);\n\nexport const escalationReasonSchema = z.enum(['user_requested', 'agent_gave_up']);\n\nexport const createEscalationSchema = z.object({\n /** Omitted when the chat has no session yet — the server creates one. */\n sessionId: z.string().max(64).optional(),\n reason: escalationReasonSchema,\n /** Optional context: last failure message, current screen, etc. */\n note: z.string().max(2000).optional(),\n});\n\n/**\n * One chat message crossing the escalation channel (either direction).\n * `operatorName` is Operator-API-only (docs/human-escalation.md,\n * Operator API feature): an optional per-reply display-name override\n * for external operators authenticating with an operator API key — the\n * SDK-side (user → operator) and existing dashboard (JWT) call sites\n * simply never send it.\n */\nexport const escalationMessageSchema = z.object({\n content: z.string().min(1).max(4096),\n operatorName: z.string().min(1).max(120).optional(),\n});\n\n/**\n * Claim body — Operator-API-only. Lets an external operator (key auth)\n * attach a display name (e.g. \"Zendesk Bridge\") at claim time; the\n * dashboard (JWT) claim route ignores this field, so it stays optional\n * and backwards-compatible with the pre-existing empty-body claim call.\n */\nexport const claimEscalationSchema = z.object({\n operatorName: z.string().min(1).max(120).optional(),\n});\n\nexport const escalationListQuerySchema = z.object({\n /** `open` = pending + active (default); `resolved` = history. */\n status: z.enum(['open', 'resolved']).optional(),\n});\n\n// ── End users (identify / registry) ────────────────────────────\n// The app company's own users registered on Appilots so operators can\n// put a name on an externalUserId. Identifier VALUES are free-form\n// strings (email, phone, internal ids, ...) — bounded to keep the\n// jsonb payload sane.\n\nexport const endUserIdentifiersSchema = z\n .record(z.string().min(1).max(40), z.string().min(1).max(200))\n .refine((map) => Object.keys(map).length <= 10, {\n message: 'At most 10 identifiers per user',\n });\n\n/** SDK-side identify: may only describe the session's OWN user. */\nexport const identifyUserSchema = z.object({\n userId: z.string().min(1).max(128),\n name: z.string().min(1).max(200).optional(),\n identifiers: endUserIdentifiersSchema.optional(),\n});\n\n/** The longest `externalUserId` we will carry — same bound as identify. */\nexport const MAX_EXTERNAL_USER_ID_LENGTH = 128;\n\n/**\n * Normalise the SDK's `userId` into \"an end-user id, or nothing\".\n *\n * This is NOT a validator that rejects — and that is the whole design.\n * `POST /agent/session` opens the chat inside a customer's shipped app;\n * a 422 there turns the assistant off for an end user who never chose\n * anything, and `CLAUDE.md` requires the backend to stay\n * backward-compatible with SDKs already in the wild. So every input\n * either becomes a usable id or becomes absent, and nothing 4xxs.\n *\n * The rules, and why each one:\n * - trimmed; blank → absent. An empty string is not an identity, and\n * letting one through means the billing gate (a truthiness check)\n * and the dedup rule disagree about the same session (#331).\n * - number → its decimal string. Plenty of apps key users by integer,\n * and the column is text; coercing here beats each reader coercing\n * differently.\n * - longer than `MAX_EXTERNAL_USER_ID_LENGTH` → absent, never\n * truncated. Truncation would merge two distinct users onto one id,\n * which corrupts both billing dedup and escalation attribution —\n * strictly worse than having no id at all.\n * - anything else (object, array, boolean, null) → absent.\n */\nexport function normalizeExternalUserId(value: unknown): string | undefined {\n let raw: string;\n if (typeof value === 'string') raw = value;\n else if (typeof value === 'number' && Number.isFinite(value)) raw = String(value);\n else return undefined;\n\n const trimmed = raw.trim();\n if (!trimmed) return undefined;\n if (trimmed.length > MAX_EXTERNAL_USER_ID_LENGTH) return undefined;\n return trimmed;\n}\n\n/** Serialized ceiling for `device_info`. Device metadata is a handful of short strings. */\nexport const MAX_DEVICE_INFO_BYTES = 4096;\n\n/**\n * Device metadata the SDK reports.\n *\n * `passthrough`, NOT stripped to the four fields\n * `agent_sessions.device_info` declares. Those four are what the\n * dashboard reads today, but `AppilotsClient.createSession` takes\n * `Record<string, unknown>` — so apps in the wild legitimately send\n * other keys, and silently dropping them would lose diagnostic data\n * from exactly the sessions someone is trying to debug.\n *\n * What it does enforce is a ceiling: this is jsonb on a route\n * authenticated by an API key, so without one the payload has no bound\n * at all. Over the ceiling the field becomes absent (via `.catch` at the\n * use site) rather than a 4xx — losing device metadata is survivable,\n * failing to open the session is not.\n */\nexport const sessionDeviceInfoSchema = z\n .object({\n platform: z.string().max(64).optional(),\n osVersion: z.string().max(64).optional(),\n appVersion: z.string().max(64).optional(),\n sdkVersion: z.string().max(64).optional(),\n })\n .passthrough()\n .refine((info) => JSON.stringify(info).length <= MAX_DEVICE_INFO_BYTES, {\n message: `device_info exceeds ${MAX_DEVICE_INFO_BYTES} bytes`,\n });\n\n/** Body of `POST /agent/session`. Read it through `parseCreateAgentSessionBody`. */\nexport const createAgentSessionSchema = z.object({\n userId: z.preprocess(normalizeExternalUserId, z.string().optional()),\n deviceInfo: sessionDeviceInfoSchema.optional().catch(undefined),\n});\n\nexport interface CreateAgentSessionBody {\n userId?: string;\n deviceInfo?: z.infer<typeof sessionDeviceInfoSchema>;\n}\n\n/**\n * Read the session-create body. TOTAL — it cannot throw and cannot\n * reject, so the route has no error branch to get wrong.\n *\n * The non-object guard is not paranoia: `c.req.json()` returns whatever\n * valid JSON arrived, and `\"hello\"` or `[1,2]` are valid JSON that\n * `z.object()` would throw on. A malformed body means \"we learned\n * nothing about the end user\", not \"refuse to open the session\".\n */\nexport function parseCreateAgentSessionBody(body: unknown): CreateAgentSessionBody {\n const source = body !== null && typeof body === 'object' && !Array.isArray(body) ? body : {};\n const parsed = createAgentSessionSchema.safeParse(source);\n return parsed.success ? parsed.data : {};\n}\n\n/** Dashboard / server-to-server upsert (keyed by projectId+externalId). */\nexport const upsertEndUserSchema = z.object({\n projectId: z.string().min(1).max(64),\n externalId: z.string().min(1).max(128),\n name: z.string().min(1).max(200).optional(),\n identifiers: endUserIdentifiersSchema.optional(),\n});\n\n// ── Type exports ───────────────────────────────────────────────\n\nexport type LoginInput = z.infer<typeof loginSchema>;\nexport type RegisterInput = z.infer<typeof registerSchema>;\nexport type MfaVerifyInput = z.infer<typeof mfaVerifySchema>;\nexport type MfaChallengeInput = z.infer<typeof mfaChallengeSchema>;\nexport type MfaDisableInput = z.infer<typeof mfaDisableSchema>;\nexport type DeleteAccountInput = z.infer<typeof deleteAccountSchema>;\nexport type CreateProjectInput = z.infer<typeof createProjectSchema>;\nexport type UpdateProjectInput = z.infer<typeof updateProjectSchema>;\nexport type UploadMCPDocumentInput = z.infer<typeof uploadMCPDocumentSchema>;\nexport type ApiKeyScope = z.infer<typeof apiKeyScopeSchema>;\nexport type CreateApiKeyInput = z.infer<typeof createApiKeySchema>;\nexport type ApiKeyEnvironment = z.infer<typeof apiKeyEnvironmentSchema>;\nexport type SendMessageInput = z.infer<typeof sendMessageSchema>;\nexport type IntrospectionDiagnosticsInput = z.infer<typeof introspectionDiagnosticsSchema>;\nexport type IntrospectionFailureReason = z.infer<typeof introspectionFailureReasonSchema>;\nexport type ActionResult = z.infer<typeof actionResultSchema>;\nexport type ScrollListPayload = z.infer<typeof scrollListPayloadSchema>;\nexport type ContinueAgentInput = z.infer<typeof continueAgentSchema>;\n/** Canonical agent observation context (issue #169). */\nexport type AgentContext = z.infer<typeof agentContextSchema>;\nexport type ClientPlatform = z.infer<typeof clientPlatformSchema>;\nexport type AgentSnapshot = z.infer<typeof agentSnapshotSchema>;\nexport type ProviderKind = z.infer<typeof providerKindSchema>;\nexport type CreateProviderInput = z.infer<typeof createProviderSchema>;\nexport type UpdateProviderInput = z.infer<typeof updateProviderSchema>;\nexport type AgentAccessLevel = z.infer<typeof agentAccessLevelSchema>;\nexport type ScreenPermission = z.infer<typeof screenPermissionSchema>;\nexport type ProjectPermissionsConfig = z.infer<typeof projectPermissionsSchema>;\nexport type UpdateProjectPermissionsInput = z.infer<typeof updateProjectPermissionsSchema>;\nexport type McpScreenPermissions = z.infer<typeof mcpScreenPermissionsSchema>;\nexport type BudgetMode = z.infer<typeof budgetModeSchema>;\nexport type BudgetMetrics = z.infer<typeof budgetMetricsSchema>;\nexport type ProjectBudget = z.infer<typeof projectBudgetSchema>;\nexport type UpdateProjectBudgetInput = z.infer<typeof updateProjectBudgetSchema>;\nexport type ActionFailureCategory = z.infer<typeof actionFailureCategorySchema>;\nexport type ActionDiagnose = z.infer<typeof actionDiagnoseSchema>;\nexport type Locale = z.infer<typeof localeSchema>;\nexport type ThemeTokens = z.infer<typeof themeTokensSchema>;\nexport type ProjectPersonalization = z.infer<typeof projectPersonalizationSchema>;\nexport type UpdateProjectPersonalizationInput = z.infer<typeof updateProjectPersonalizationSchema>;\nexport type SandboxObservation = z.infer<typeof sandboxObservationSchema>;\nexport type SandboxRunRequest = z.infer<typeof sandboxRunRequestSchema>;\nexport type SandboxRunResponse = z.infer<typeof sandboxRunResponseSchema>;\nexport type SandboxTraceHop = z.infer<typeof sandboxTraceHopSchema>;\nexport type SaveSandboxTestInput = z.infer<typeof saveSandboxTestSchema>;\nexport type SandboxTest = z.infer<typeof sandboxTestSchema>;\nexport type EvalScenarioRequest = z.infer<typeof evalScenarioRequestSchema>;\nexport type EvalRunRequest = z.infer<typeof evalRunRequestSchema>;\nexport type EvalScenarioResult = z.infer<typeof evalScenarioResultSchema>;\nexport type EvalRunResponse = z.infer<typeof evalRunResponseSchema>;\nexport type InsightsRange = z.infer<typeof insightsRangeSchema>;\nexport type InsightsTopPromptsResponse = z.infer<typeof insightsTopPromptsResponseSchema>;\nexport type InsightsFunnelResponse = z.infer<typeof insightsFunnelResponseSchema>;\nexport type InsightsScreensResponse = z.infer<typeof insightsScreensResponseSchema>;\nexport type InsightsModelsResponse = z.infer<typeof insightsModelsResponseSchema>;\nexport type InsightsMissionsResponse = z.infer<typeof insightsMissionsResponseSchema>;\nexport type AgentActionType = z.infer<typeof agentActionTypeSchema>;\nexport type AgentActionStatus = z.infer<typeof agentActionStatusSchema>;\nexport type AgentActionsQuery = z.infer<typeof agentActionsQuerySchema>;\nexport type AgentActionEntry = z.infer<typeof agentActionEntrySchema>;\nexport type AgentActionsResponse = z.infer<typeof agentActionsResponseSchema>;\nexport type EscalationStatus = z.infer<typeof escalationStatusSchema>;\nexport type EscalationReason = z.infer<typeof escalationReasonSchema>;\nexport type CreateEscalationInput = z.infer<typeof createEscalationSchema>;\nexport type EscalationMessageInput = z.infer<typeof escalationMessageSchema>;\nexport type ClaimEscalationInput = z.infer<typeof claimEscalationSchema>;\nexport type IdentifyUserInput = z.infer<typeof identifyUserSchema>;\nexport type UpsertEndUserInput = z.infer<typeof upsertEndUserSchema>;\n","import type { MCPDocument } from '../generators/types';\nimport type { ActionDescriptor } from '../types/index';\n\n/**\n * Metadata lint (OKR-005 KR4) — every mutating action registered in the\n * MCP document should declare `effect` and `riskLevel` so the runtime can\n * enforce safety policy without parsing labels. The generator extracts\n * these fields when declared in registerScreen(); this lint surfaces the\n * ones that were not, instead of letting them pass silently.\n */\n\nexport interface MetadataLintWarning {\n screen: string;\n actionId: string;\n actionType: ActionDescriptor['type'];\n missing: ('effect' | 'riskLevel')[];\n reason: string;\n}\n\n/**\n * Verbs that indicate an action changes state even when its `type` alone\n * doesn't say so (custom handlers, api_call wrappers, etc.). Mirrors the\n * destructive-verb heuristic used by ScreenAnalyzer for the\n * `destructive` flag, plus non-destructive mutation verbs.\n */\nconst MUTATION_VERB_RE =\n /\\b(delete|destroy|remove|discard|wipe|revoke|cancel|reset|clear|create|add|register|save|submit|update|edit|change|toggle|pay|send|confirm|subscribe|unsubscribe|renew|downgrade|upgrade|transfer)\\w*/i;\n\nfunction isMutating(action: ActionDescriptor): { mutating: boolean; reason: string } {\n if (action.destructive || action.effect === 'destructive') {\n return { mutating: true, reason: 'flagged destructive' };\n }\n if (action.type === 'submit' || action.type === 'state_change') {\n return { mutating: true, reason: `type \"${action.type}\"` };\n }\n const haystack = `${action.id} ${action.label ?? ''} ${action.handler ?? ''}`;\n if ((action.type === 'api_call' || action.type === 'custom') && MUTATION_VERB_RE.test(haystack)) {\n return { mutating: true, reason: 'mutation verb in id/label/handler' };\n }\n return { mutating: false, reason: '' };\n}\n\n/**\n * Scans every screen action and returns one warning per mutating action\n * that is missing `effect` and/or `riskLevel`.\n */\nexport function lintActionMetadata(document: MCPDocument): MetadataLintWarning[] {\n const warnings: MetadataLintWarning[] = [];\n\n for (const screen of document.screens) {\n for (const action of screen.actions ?? []) {\n const { mutating, reason } = isMutating(action);\n if (!mutating) continue;\n\n const missing: MetadataLintWarning['missing'] = [];\n if (!action.effect) missing.push('effect');\n if (!action.riskLevel) missing.push('riskLevel');\n if (missing.length === 0) continue;\n\n warnings.push({\n screen: screen.name,\n actionId: action.id,\n actionType: action.type,\n missing,\n reason,\n });\n }\n }\n\n return warnings;\n}\n\n/**\n * Formats lint warnings for terminal output: one line per action plus an\n * aggregate line, e.g.\n * VehicleDetails.deleteVehicle (submit): missing effect, riskLevel\n */\nexport function formatMetadataWarnings(warnings: MetadataLintWarning[]): string[] {\n return warnings.map(\n (w) => `${w.screen}.${w.actionId} (${w.actionType}, ${w.reason}): missing ${w.missing.join(', ')}`\n );\n}\n","import type { MCPDocument } from '../../generators/types';\nimport { lintActionMetadata, formatMetadataWarnings } from '../../pipeline/metadata-lint';\nimport { warn, dim, error, success } from './logger';\n\n/**\n * Prints the metadata lint result for a generated document. In strict\n * mode (--strict-metadata) any warning is fatal so CI can gate on full\n * effect/riskLevel coverage (OKR-005 KR4).\n */\nexport function reportMetadataLint(document: MCPDocument, strict: boolean): void {\n const warnings = lintActionMetadata(document);\n\n if (warnings.length === 0) {\n success('Metadata lint: all mutating actions declare effect + riskLevel');\n return;\n }\n\n warn(`Metadata lint: ${warnings.length} mutating action(s) missing effect/riskLevel`);\n for (const line of formatMetadataWarnings(warnings)) {\n dim(` ${line}`);\n }\n dim(' Declare them in registerScreen(): actions: [{ id, effect: \"write\" | \"destructive\", riskLevel: \"low\" | \"medium\" | \"high\" }]');\n\n if (strict) {\n error('--strict-metadata: failing due to missing action metadata');\n process.exit(1);\n }\n}\n","/**\n * Is the agent looking at this app, or at an older copy of it?\n *\n * The agent navigates by the MCP document that is ACTIVE on the server,\n * which is not necessarily the one this CLI last generated. They come\n * apart quietly: someone activates an older version from the dashboard,\n * a sync went to a different server than the one being tested, or the\n * database predates the seed learning to refuse partial documents\n * (apps/api/src/database/seeds/index.ts — \"seeding a two-screen stub is\n * what made the agent answer 'essa tela não está mapeada' for the rest\n * of the app\").\n *\n * However it happens, the failure that follows looks like a model\n * problem — missions fail on screens the agent \"should\" know — and gets\n * debugged as one. What it actually is: most of the app does not exist\n * as far as the agent is concerned.\n *\n * This module compares what the analyzer just found against what the\n * server says is active, and names the discrepancy out loud.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { warn, info } from './logger';\n\n/** The server's view, as returned by `GET /cli/status`. */\nexport interface RemoteActiveDocument {\n id: string;\n version: string;\n screensCount: number;\n}\n\nexport interface RemoteDrift {\n /** Screens in the document just generated locally. */\n localScreens: number;\n /** Screens in the document currently active on the server. */\n remoteScreens: number;\n remoteId: string;\n /**\n * The remote document is not merely different, it is drastically\n * smaller — the shape of a stub standing in for a real application map.\n */\n severe: boolean;\n}\n\n/**\n * A remote document with at most this fraction of the local screen count\n * is a different app, not a slightly older version of this one.\n *\n * Half, not a tenth: the stubs this guards against are small — 2 screens\n * for the example app, 5 for the QA personas — and 5 of 25 would slip\n * under an order-of-magnitude rule. Being wrong in this direction costs\n * a warning that a real upload immediately resolves; being wrong in the\n * other direction costs a debugging session aimed at the model.\n */\nconst STUB_RATIO = 0.5;\n\n/**\n * Compare the freshly generated document with the server's active one.\n *\n * Screen counts, deliberately — NOT checksums, even though both sides\n * have one. They are not comparable: the CLI hashes the pretty-printed\n * file it writes to disk (`JSON.stringify(doc, null, 2)`) while the\n * server hashes the compact body it received, so the two never agree and\n * a checksum comparison would report drift on every single call. Screen\n * count is coarse, and it is exactly the axis the failure this guards\n * against moves along: a stub has a handful of screens where the app has\n * dozens.\n *\n * Returns `null` when the counts match — as close to \"the agent is\n * looking at this app\" as this can honestly get.\n */\nexport function compareWithRemote(\n local: { screens: number },\n remote: RemoteActiveDocument,\n): RemoteDrift | null {\n if (remote.screensCount === local.screens) return null;\n\n return {\n localScreens: local.screens,\n remoteScreens: remote.screensCount,\n remoteId: remote.id,\n severe: local.screens > 0 && remote.screensCount <= local.screens * STUB_RATIO,\n };\n}\n\n/**\n * The last document this CLI generated, read back from `outputDir`.\n *\n * Lets `status` answer the question that matters before an e2e run —\n * \"is the server serving this app's map?\" — without re-analyzing the\n * source. Returns null when nothing has been generated yet, or when the\n * files are unreadable: a missing local artifact is not a drift finding.\n */\nexport function readLocalDocumentSummary(outputDir: string): { screens: number } | null {\n try {\n const raw = readFileSync(join(outputDir, 'mcp-document.json'), 'utf-8');\n const parsed = JSON.parse(raw) as { metadata?: { totalScreens?: number } };\n if (typeof parsed?.metadata?.totalScreens !== 'number') return null;\n return { screens: parsed.metadata.totalScreens };\n } catch {\n return null;\n }\n}\n\n/**\n * Print the drift. Loud for a stub, matter-of-fact for a plain version\n * difference (which `sync` is about to resolve by uploading anyway).\n *\n * `uploadFailed` changes the tense from \"this is what is active\" to\n * \"this is what is STILL active\", which is the whole point of reporting\n * it on a failed sync.\n */\nexport function reportRemoteDrift(\n drift: RemoteDrift,\n options: { uploadFailed?: boolean } = {},\n): void {\n if (!drift.severe) {\n info(\n `Server's active document differs from what was just generated ` +\n `(active: ${drift.remoteId}, ${drift.remoteScreens} screens).`,\n );\n return;\n }\n\n warn(\n `The agent is ${options.uploadFailed ? 'still ' : ''}running on a ` +\n `${drift.remoteScreens}-screen document while this app has ` +\n `${drift.localScreens} screens.`,\n );\n info(` Active on server: ${drift.remoteId} (${drift.remoteScreens} screens)`);\n info(` Just generated: ${drift.localScreens} screens`);\n info('');\n info('While a document that small is active the agent cannot see the other');\n info('screens, and missions that need them fail in ways that read as model');\n info('errors. The usual causes: an older version activated from the');\n info('dashboard, a sync that went to a different server, or a database');\n info('seeded before the seed learned to refuse partial documents.');\n info('');\n if (options.uploadFailed) {\n info('Nothing was uploaded just now, so this is unchanged. Fix the error');\n info('above and run sync again — e2e runs before that will fail on');\n info('navigation, not on anything the model did.');\n } else {\n info('Uploading now replaces it.');\n }\n}\n","/**\n * What to do about an upload that failed.\n *\n * The server's `code` and `message` say what happened; these lines say\n * what to change. Complements `hintUnreachableServer`, which covers the\n * one case of a `serverUrl` never set — this covers the ones where the\n * server answered and said no.\n */\n\nimport { info } from './logger';\n\nexport interface UploadFailure {\n error?: string;\n errorCode?: string;\n errorStatus?: number;\n}\n\n/** Print remediation for a failed `POST /cli/sync`. */\nexport function explainUploadFailure(failure: UploadFailure, serverUrl?: string): void {\n const status = failure.errorStatus ?? 0;\n\n if (status === 401) {\n info('');\n info('`sync` authenticates with the project API key (`ak_…`) — the same key');\n info('the SDK uses. Check that it is the key for THIS project, is still');\n info('active, and reaches the server you meant:');\n info(` Server: ${serverUrl ?? '(default)'}`);\n info('Set it in .appilotsrc (`apiKey`), via APPILOTS_API_KEY, or --api-key.');\n info('');\n info('A dashboard login token will not work here and is not needed: the CLI');\n info(\"talks to /cli/sync, not the dashboard's /mcp-documents.\");\n return;\n }\n\n if (failure.errorCode === 'WORKSPACE_INACTIVE') {\n info('');\n info('The workspace is deactivated. Re-activate it in the dashboard');\n info('(Settings → Workspace) and run sync again.');\n return;\n }\n\n if (status === 404) {\n info('');\n info(`No /cli/sync at ${serverUrl ?? '(default)'} — check serverUrl points at`);\n info('an Appilots API (and one recent enough to serve the CLI routes).');\n return;\n }\n\n if (status === 422) {\n info('');\n info('The server rejected the document itself. Inspect what was generated:');\n info(' .appilots/mcp-document.json');\n return;\n }\n\n if (status >= 500) {\n info('');\n info('The server failed to process the upload. It was retried already —');\n info('if it persists, the API logs hold the matching request id.');\n }\n}\n","/**\n * #400 — an application map with no screens is a failed integration, not\n * a result.\n *\n * `npx create-expo-app` has generated Expo Router by default for about\n * three years, so it is the modal shape of a new React Native app. Those\n * projects have no `NavigationContainer` and no `Stack.Screen`, which is\n * what the analyzer looks for. They install clean, build clean, and sync\n * clean — and get a map with zero screens and a null `currentScreen`.\n *\n * Nothing anywhere in that path told the customer they had integrated\n * something that does not work. That silence is the bug; this is the\n * noise.\n */\n\nimport type { MCPDocument } from '../../generators/types';\nimport { error, info } from './logger';\n\nexport interface EmptyDocumentOptions {\n /** Where the analyzer looked, for the message. */\n rootDir?: string;\n /** Set by `--allow-empty` for the rare app that means it. */\n allowEmpty?: boolean;\n}\n\n/**\n * Fail loudly when the generated document declares no screens.\n *\n * Deliberately fatal rather than a warning: a warning scrolls past in CI\n * and the customer is left with a working-looking pipeline producing an\n * agent that cannot navigate anywhere.\n */\nexport function assertDocumentHasScreens(\n document: MCPDocument,\n options: EmptyDocumentOptions = {},\n): void {\n if ((document.metadata?.totalScreens ?? 0) > 0) return;\n if (options.allowEmpty) {\n info('No screens found, continuing because --allow-empty was passed.');\n return;\n }\n\n error('No screens found — this application map would give the agent nothing to navigate.');\n info('');\n info('The analyzer looks for React Navigation: a <NavigationContainer> and');\n info('<Stack.Screen> / <Tab.Screen> declarations. It found none.');\n info('');\n info('The two usual causes:');\n info(' • The app uses Expo Router (or another file-based router). It is the');\n info(' default for `npx create-expo-app` and the analyzer cannot read it.');\n info(' • The screens live outside the analyzed paths — check `include`,');\n info(' `exclude` and `screenPatterns` in your Appilots config.');\n info('');\n info('The escape hatch, which works for any router: declare your screens in');\n info('an `appilots.manifest.json` at the project root. Its screens are merged');\n info('on top of whatever the analyzer found, so a fully declared app needs no');\n info('React Navigation at all. See the CLI docs for the shape.');\n info('');\n info('If an empty map really is what you want, pass --allow-empty.');\n process.exit(1);\n}\n","import { Command } from 'commander';\nimport { watch } from 'node:fs';\nimport { join } from 'node:path';\nimport { MCPGenerator } from '../../generators/MCPGenerator';\nimport { AppilotsAPIClient } from '../../services/api-client';\nimport { loadConfig } from '../../config/index';\nimport { banner, success, error, info, createSpinner, dim, warn } from '../utils/logger';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface WatchOptions {\n verbose?: boolean;\n}\n\nexport function watchCommand(): Command {\n return new Command('watch')\n .description('Watch project for changes and auto-sync MCP documents')\n .option('--verbose', 'Enable verbose logging', false)\n .action(async (options: WatchOptions) => {\n try {\n banner();\n\n // Load configuration\n const config = loadConfig(warn);\n if (!config) {\n error('No .appilotsrc configuration found');\n info('Run: appilots init --api-key <your-key>');\n process.exit(1);\n }\n\n // Initialize API client\n const apiClient = new AppilotsAPIClient({\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n });\n\n // Do initial sync\n info('Performing initial sync...');\n const generatorConfig = {\n rootDir: process.cwd(),\n outputDir: config.outputDir || '.appilots',\n format: 'json' as const,\n strictScreens: config.strictScreens,\n screenPatterns: config.screenPatterns,\n include: config.include,\n exclude: config.exclude,\n navigationInclude: config.navigationInclude,\n navigationExclude: config.navigationExclude,\n // Same analyzer selection `generate` and `sync` already do —\n // without these, watching a non-`react-native` project would\n // silently run the RN analyzers and ignore the manifest.\n platform: config.platform,\n manifestPath: config.manifestPath,\n };\n\n const generator = new MCPGenerator(generatorConfig);\n\n const initialOutput = await generator.generate();\n const initialSync = await apiClient.sync(\n initialOutput.document,\n initialOutput.document.version,\n );\n\n if (!initialSync.success) {\n error(`Initial sync failed: ${initialSync.error}`);\n process.exit(1);\n }\n\n success('Initial sync completed');\n info(`Watching for changes in ${config.outputDir || '.appilots'}...`);\n dim('Press Ctrl+C to stop\\n');\n\n // Set up file watcher\n let debounceTimer: NodeJS.Timeout | null = null;\n const DEBOUNCE_MS = 500;\n\n const watcher = watch(process.cwd(), { recursive: true }, async (eventType, filename) => {\n if (!filename) return;\n\n // Skip hidden files, node_modules, and output directory\n if (\n filename.startsWith('.') ||\n filename.includes('node_modules') ||\n filename.includes(config.outputDir || '.appilots')\n ) {\n return;\n }\n\n // Debounce rapid changes\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n debounceTimer = setTimeout(async () => {\n try {\n if (options.verbose) {\n info(`Change detected: ${filename}`);\n }\n\n const spinner = createSpinner('Re-analyzing project...');\n spinner.start();\n\n const newGenerator = new MCPGenerator(generatorConfig);\n\n const output = await newGenerator.generate();\n spinner.text = 'Uploading changes...';\n\n const syncResult = await apiClient.sync(output.document, output.document.version);\n spinner.stop();\n\n if (!syncResult.success) {\n error(`Sync failed: ${syncResult.error}`);\n } else if (syncResult.unchanged) {\n info('Changes synced (no content changes detected)');\n } else {\n success('Changes synced successfully');\n info(\n `${output.document.metadata.totalScreens} screens, ` +\n `${output.document.metadata.totalForms} forms, ` +\n `${output.document.metadata.totalActions} actions`,\n );\n }\n } catch (err) {\n error(`Watch sync failed: ${stringifyUnknown(err)}`);\n }\n }, DEBOUNCE_MS);\n });\n\n // Handle graceful shutdown\n process.on('SIGINT', () => {\n info('Stopping watcher...');\n watcher.close();\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n process.exit(0);\n });\n } catch (err) {\n error(`Watch failed: ${stringifyUnknown(err)}`);\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { MCPGenerator } from '../../generators/MCPGenerator';\nimport { loadConfig } from '../../config/index';\nimport { banner, success, error, info, createSpinner, warn } from '../utils/logger';\nimport { reportMetadataLint } from '../utils/metadata-report';\nimport { assertDocumentHasScreens } from '../utils/empty-document';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface GenerateOptions {\n output?: string;\n format?: string;\n strictMetadata?: boolean;\n allowEmpty?: boolean;\n}\n\nexport function generateCommand(): Command {\n return new Command('generate')\n .description('Generate MCP documents from project source (local only)')\n .option('-o, --output <path>', 'Output directory for MCP documents', '.appilots')\n .option('-f, --format <format>', 'Output format (only json supported)', 'json')\n .option(\n '--strict-metadata',\n 'Fail when mutating actions are missing effect/riskLevel metadata',\n false,\n )\n .option('--allow-empty', 'Do not fail when the application map has zero screens', false)\n .action(async (options: GenerateOptions) => {\n try {\n banner();\n\n // §2: Reject unsupported formats explicitly\n if (options.format && options.format !== 'json') {\n error(`Format \"${options.format}\" is not supported yet. Only \"json\" is available.`);\n process.exit(1);\n }\n\n const spinner = createSpinner('Analyzing project...');\n spinner.start();\n\n // Best-effort: `generate` works local-only, without an API key, so\n // a missing/invalid .appilotsrc must not block it. Only the new\n // `platform`/`manifestPath` fields are threaded through here —\n // every other MCPGenerator option keeps `generate`'s pre-existing\n // behavior (defaults only) so this doesn't change output for\n // projects that already have a .appilotsrc with unrelated fields set.\n let loaded: ReturnType<typeof loadConfig> = null;\n try {\n loaded = loadConfig(warn);\n } catch {\n loaded = null;\n }\n\n const generator = new MCPGenerator({\n rootDir: process.cwd(),\n outputDir: options.output || '.appilots',\n format: 'json',\n platform: loaded?.platform,\n manifestPath: loaded?.manifestPath,\n });\n\n const output = await generator.generate();\n spinner.stop();\n\n assertDocumentHasScreens(output.document, {\n rootDir: process.cwd(),\n allowEmpty: Boolean(options.allowEmpty),\n });\n\n success(\n `Generated MCP document with ${output.document.metadata.totalScreens} screens, ` +\n `${output.document.metadata.totalForms} forms, ${output.document.metadata.totalActions} actions`,\n );\n info(`Written to: ${output.filePath}`);\n info(`Checksum: ${output.checksum}`);\n\n reportMetadataLint(output.document, Boolean(options.strictMetadata));\n } catch (err) {\n error(`Generation failed: ${stringifyUnknown(err)}`);\n process.exit(1);\n }\n });\n}\n","/**\n * `appilots annotate` — write the missing testIDs, as a reviewable diff.\n *\n * Dry run is the DEFAULT, and `--write` is the only way to touch a file.\n * Nothing else in this CLI edits a customer's source, and the failure mode\n * of getting it wrong is not a bad suggestion — it is an unexplained diff in\n * someone else's repository.\n */\n\nimport { readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { Command } from 'commander';\nimport glob from 'fast-glob';\n\nimport { loadConfig } from '../../config/index';\nimport { findAnnotationSites } from '../../annotate/sites';\nimport { applyToFile, type FileEdit, type PlannedSite } from '../../annotate/apply';\nimport { resetForwardingCache, resolveRelativeImport } from '../../annotate/forwarding';\nimport { applyForward, planForward, type ForwardPlan } from '../../annotate/forward';\nimport {\n banner,\n createSpinner,\n dim,\n error,\n heading,\n info,\n jsonOutput,\n setLogMode,\n success,\n warn,\n} from '../utils/logger';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface AnnotateOptions {\n write?: boolean;\n forward?: boolean;\n include?: string[];\n json?: boolean;\n quiet?: boolean;\n}\n\n/**\n * Screens only, by default.\n *\n * A shared component is the wrong place for a literal `testID`: every\n * instance of `<Card>` would answer to the same name, which is the tie the\n * matcher refuses. What a shared component needs is to FORWARD the prop —\n * exactly what the \"skipped\" report asks its author to add — so that each\n * call site can name its own instance.\n *\n * `--include` widens this deliberately, for the case where someone really\n * does want to annotate a one-off component.\n */\nconst DEFAULT_INCLUDE = ['src/**/*Screen.{tsx,jsx}', 'src/**/screens/**/*.{tsx,jsx}'];\nconst DEFAULT_EXCLUDE = ['**/node_modules/**', '**/dist/**', '**/*.test.*', '**/__tests__/**'];\n\nexport function annotateCommand(): Command {\n return new Command('annotate')\n .description(\n 'Add missing testIDs to interactive elements so the agent can address them (dry run by default)',\n )\n .option('--write', 'Actually modify the files (default: report only)', false)\n .option(\n '--forward',\n 'Also teach a shared component to accept and pass through testID, when its call sites are blocked only by that',\n false,\n )\n .option('-i, --include <globs...>', 'Glob patterns to scan', undefined)\n .option('--json', 'Emit a machine-readable report', false)\n .option('--quiet', 'Only warnings and errors', false)\n .action(async (options: AnnotateOptions) => {\n try {\n if (options.json) setLogMode('json');\n else if (options.quiet) setLogMode('quiet');\n banner();\n\n let loaded: ReturnType<typeof loadConfig> = null;\n try {\n loaded = loadConfig(warn);\n } catch {\n loaded = null;\n }\n\n const rootDir = process.cwd();\n // NOT `loaded.include`: that is the generator's ANALYSIS scope (the\n // whole tree, so component files inform the document). Writing to\n // every file it reads is a different and much larger promise.\n const include = options.include ?? DEFAULT_INCLUDE;\n const exclude = loaded?.exclude ?? DEFAULT_EXCLUDE;\n\n const spinner = createSpinner('Scanning for unaddressable controls...');\n spinner.start();\n\n resetForwardingCache();\n const files = await glob(include, { cwd: rootDir, ignore: exclude, absolute: true });\n\n const scan = async (): Promise<FileEdit[]> => {\n const out: FileEdit[] = [];\n for (const file of files) {\n const source = await readFile(file, 'utf-8');\n const sites = findAnnotationSites(source, file);\n if (sites.length === 0) continue;\n out.push(applyToFile(source, sites));\n }\n return out;\n };\n\n let edits = await scan();\n let forwards: ForwardPlan[] = [];\n\n if (options.forward) {\n forwards = await planForwards(edits, rootDir);\n const applied = forwards.filter((plan) => !plan.refusal);\n if (options.write && applied.length > 0) {\n for (const plan of applied) {\n const before = await readFile(plan.file, 'utf-8');\n await writeFile(plan.file, applyForward(before, plan), 'utf-8');\n }\n // Those components now carry the prop, so their call sites are\n // no longer blocked. Re-scan rather than reason about it: the\n // second pass reads the file we just wrote.\n resetForwardingCache();\n edits = await scan();\n }\n }\n\n spinner.stop();\n\n const written = edits.flatMap((edit) => edit.written);\n const blocked = edits.flatMap((edit) => edit.blocked);\n const touched = edits.filter((edit) => edit.written.length > 0);\n\n if (written.length === 0 && blocked.length === 0) {\n success('Every interactive control already has something to address it by.');\n if (options.json) {\n jsonOutput({ ok: true, scanned: files.length, annotated: 0, blocked: 0, sites: [] });\n }\n return;\n }\n\n if (options.write) {\n for (const edit of touched) {\n await writeFile(edit.file, edit.content, 'utf-8');\n }\n }\n\n reportSites(rootDir, touched, blocked, options.write === true, forwards);\n\n if (options.json) {\n jsonOutput({\n ok: true,\n scanned: files.length,\n written: options.write === true,\n annotated: written.length,\n blocked: blocked.length,\n files: touched.map((edit) => path.relative(rootDir, edit.file)),\n sites: [...written, ...blocked].map((site) => ({\n file: path.relative(rootDir, site.file),\n line: site.line,\n component: site.component,\n role: site.role,\n testId: site.testId,\n outcome: site.outcome,\n reason: site.blockedReason,\n })),\n });\n }\n } catch (err) {\n error(`Annotate failed: ${stringifyUnknown(err)}`);\n process.exit(1);\n }\n });\n}\n\n/**\n * For each component blocking call sites, work out whether it can be taught\n * to carry the prop. Keyed by component name so a component rendered on ten\n * screens is planned once — the edit is to its definition, not to the uses.\n */\nasync function planForwards(edits: FileEdit[], rootDir: string): Promise<ForwardPlan[]> {\n const seen = new Set<string>();\n const plans: ForwardPlan[] = [];\n\n for (const edit of edits) {\n for (const site of edit.blocked) {\n if (site.outcome !== 'blocked-swallows') continue;\n if (seen.has(site.component)) continue;\n seen.add(site.component);\n\n const source = await readFile(site.file, 'utf-8');\n const origin = findImportSource(source, site.component);\n // No import means the component is defined in this same screen file.\n const target = origin ? resolveRelativeImport(site.file, origin) : site.file;\n if (!target) {\n plans.push({\n file: site.file,\n component: site.component,\n edits: [],\n roots: 0,\n refusal: `cannot locate the source of <${site.component}>`,\n });\n continue;\n }\n plans.push(planForward(target, site.component));\n }\n }\n\n void rootDir;\n return plans;\n}\n\n/** The module specifier a named binding was imported from, if any. */\nfunction findImportSource(source: string, name: string): string | undefined {\n const pattern = new RegExp(\n String.raw`import\\s*\\{[^}]*\\b${name}\\b[^}]*\\}\\s*from\\s*['\"]([^'\"]+)['\"]`,\n );\n return pattern.exec(source)?.[1];\n}\n\nfunction reportSites(\n rootDir: string,\n touched: FileEdit[],\n blocked: PlannedSite[],\n didWrite: boolean,\n forwards: ForwardPlan[],\n): void {\n const written = touched.flatMap((edit) => edit.written);\n\n if (written.length > 0) {\n heading(didWrite ? 'Added' : 'Would add');\n for (const edit of touched) {\n info(path.relative(rootDir, edit.file));\n for (const site of edit.written) {\n dim(` ${String(site.line).padStart(4)} <${site.component}> testID=\"${site.testId}\"`);\n }\n }\n }\n\n const teachable = new Map(\n forwards.filter((plan) => !plan.refusal).map((plan) => [plan.component, plan]),\n );\n\n if (teachable.size > 0) {\n heading(didWrite ? 'Taught to carry testID' : 'Would teach to carry testID');\n for (const plan of teachable.values()) {\n info(`<${plan.component}> ${path.relative(rootDir, plan.file)}`);\n for (const edit of plan.edits) {\n dim(` ${edit.what}: ${edit.text.trim()}`);\n }\n }\n }\n\n if (blocked.length > 0) {\n // Grouped by component: the fix is one edit to that component, not one\n // per call site, and a list of 12 identical lines hides that.\n heading('Skipped — the prop would not survive to the runtime');\n const byComponent = new Map<string, PlannedSite[]>();\n for (const site of blocked) {\n const group = byComponent.get(site.component) ?? [];\n group.push(site);\n byComponent.set(site.component, group);\n }\n for (const [component, group] of byComponent) {\n if (teachable.has(component)) continue;\n warn(`<${component}> — ${group.length} site${group.length === 1 ? '' : 's'}`);\n const refusal = forwards.find((plan) => plan.component === component)?.refusal;\n dim(` ${group[0]!.blockedReason}`);\n if (refusal) dim(` --forward cannot do it either: ${refusal}`);\n }\n }\n\n if (!didWrite && written.length > 0) {\n info('');\n info(`Nothing was written. Re-run with --write to apply ${written.length} change(s).`);\n } else if (didWrite) {\n success(`Wrote ${written.length} testID(s) across ${touched.length} file(s).`);\n info('Re-run `appilots generate` so the document picks them up.');\n }\n}\n","/**\n * Where a `testID` is missing, and what it should say.\n *\n * The work queue comes straight out of the coverage measurement: of the 37\n * interaction sites `apps/example-app` still hides from the document, 33\n * carry no declared identity at all — no `testID`, no `appilotsId`, no\n * `accessibilityLabel`. Classification is no longer what is missing (see\n * `classify.ts`); identity is. This is the only thing that writes identity\n * where there is none.\n *\n * What is deliberately NOT queued: a control the runtime can already name.\n * `<Button title=\"Salvar\" onPress={save} />` needs nothing — the walker\n * folds the visible text into `salvar` — and adding a redundant `testID`\n * would be churn in someone else's repository for no capability gained.\n */\n\nimport _traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nimport { parseSource } from '../ast/parse';\nimport { classifyJsxComponent, pressHandlerProp } from '../ast/jsx/classify';\nimport { findJsxAttribute, getStringAttr } from '../ast/jsx/attributes';\nimport { canCarryTestId, collectImports, type CarrierVerdict } from './forwarding';\n\nconst traverse = (_traverse as unknown as { default?: typeof _traverse }).default ?? _traverse;\n\n/** Props whose string value already gives the runtime something to match on. */\nconst LABEL_PROPS = ['title', 'label', 'placeholder'] as const;\n/** Props that already declare an identity. */\nconst IDENTITY_PROPS = ['testID', 'appilotsId', 'accessibilityLabel'] as const;\n\nexport interface AnnotationSite {\n file: string;\n line: number;\n column: number;\n component: string;\n role: string;\n /** The prop that fires it, when it is a press-like control. */\n pressProp?: string;\n /** Named handler at the call site, when it is not an inline arrow. */\n handler?: string;\n /** The id we would write. */\n testId: string;\n /** Whether the component can actually deliver the prop to the runtime. */\n carrier: CarrierVerdict;\n /** Byte offset just after the element's name, where the prop is inserted. */\n insertAt: number;\n /**\n * The exact text to splice in at `insertAt`.\n *\n * Computed here rather than in the writer because it depends on how the\n * element is laid out, and getting it wrong is not cosmetic: appending\n * inline to a MULTI-LINE element yields `<RefreshControl testID=\"x\"` with\n * the remaining props below it, which Prettier immediately reformats — so\n * a repository with a format check would fail CI on our diff.\n */\n insertText: string;\n}\n\nfunction kebab(text: string): string {\n return text\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\n/** `handleAddMileage` → `add-mileage`; `onRetry` → `retry`; `load` → `load`. */\nfunction verbOf(name: string): string {\n return kebab(name.replace(/^(handle|on)(?=[A-Z])/, ''));\n}\n\n/** `InvoiceListScreen.tsx` → `invoice-list`; `index.tsx` → its directory. */\nexport function scopeSlugForFile(file: string): string {\n const base = file.replace(/\\\\/g, '/').split('/').pop() ?? file;\n const name = base.replace(/\\.[jt]sx?$/, '');\n if (name.toLowerCase() === 'index') {\n const dir = file.replace(/\\\\/g, '/').split('/').slice(-2, -1)[0] ?? '';\n return kebab(dir);\n }\n return kebab(name.replace(/Screen$/, ''));\n}\n\n/**\n * Drop a word the composition already used.\n *\n * Adjacency is not enough: `RefreshControl` + `onRefresh` produces\n * `refresh-control-refresh`, where the repeat is two tokens apart. Keeping\n * the FIRST occurrence preserves reading order, so `invoice-list` +\n * `ListFooter` + `retry` still reads `invoice-list-footer-retry`.\n */\nfunction collapseRepeats(slug: string): string {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const token of slug.split('-')) {\n if (!token || seen.has(token)) continue;\n seen.add(token);\n out.push(token);\n }\n return out.join('-');\n}\n\n/**\n * Compose an id a human would recognize in a diff — and that no other\n * element on the device answers to.\n *\n * The screen scope is not decoration. `testID` is a RUNTIME-global name,\n * and nine screens in the testbed render an `<ErrorState onRetry>`: without\n * the prefix this minted `error-state-retry` nine times, and a duplicate id\n * is worse than a missing one — the shared matcher refuses on a tie, so the\n * agent would go from \"cannot see it\" to \"can see nine of it\".\n *\n * After the scope: a purpose-named prop already says what the control does\n * (`invoice-list-error-state-retry`), a plain `onPress` says nothing so the\n * handler carries the meaning (`home-card-open-invoice`), and with neither\n * the ordinal is what is left.\n */\nexport function deriveTestId(site: {\n scope: string;\n component: string;\n pressProp?: string;\n handler?: string;\n ordinal: number;\n}): string {\n const base = [site.scope, kebab(site.component)].filter(Boolean).join('-');\n if (site.pressProp && site.pressProp !== 'onPress') {\n return collapseRepeats(`${base}-${verbOf(site.pressProp)}`);\n }\n if (site.handler) {\n const verb = verbOf(site.handler);\n return collapseRepeats(verb ? `${base}-${verb}` : base);\n }\n return collapseRepeats(`${base}-${site.ordinal}`);\n}\n\nfunction hasAnyProp(element: t.JSXOpeningElement, names: readonly string[]): boolean {\n return names.some((name) => findJsxAttribute(element, name) !== undefined);\n}\n\nfunction hasLabelText(element: t.JSXOpeningElement): boolean {\n return LABEL_PROPS.some((name) => {\n const value = getStringAttr(element, name);\n return typeof value === 'string' && value.trim().length > 0;\n });\n}\n\nfunction namedHandler(element: t.JSXOpeningElement, prop: string | undefined): string | undefined {\n if (!prop) return undefined;\n const attr = findJsxAttribute(element, prop);\n if (!attr || !t.isJSXExpressionContainer(attr.value)) return undefined;\n return t.isIdentifier(attr.value.expression) ? attr.value.expression.name : undefined;\n}\n\n/** Roles worth addressing. `view` and `custom` are not controls. */\nconst ANNOTATABLE_ROLES = new Set(['button', 'input', 'select', 'toggle', 'date', 'list']);\n\n/**\n * Is this element rendered once PER ITEM?\n *\n * A literal `testID` inside a `.map()` or a `renderItem` is one name for N\n * runtime elements — the same duplicate-id failure the screen scope was\n * added to prevent, arriving from a different direction. Caught live: the\n * first `--forward` run put `testID=\"home-card-1\"` on a `<Card>` inside\n * `vehicles.slice(0, 3).map(…)`, which would have given three cards the\n * same handle and made the matcher refuse all three.\n *\n * These are not stranded, which is why refusing costs little: the walker\n * already addresses list rows positionally (`list-0-item-2`), and the row's\n * own text disambiguates it. What they need is a COMPUTED id, and choosing\n * which field keys it is the developer's call, not ours.\n */\nfunction isPerItemRender(nodePath: {\n parentPath?: { node: t.Node; parentPath?: unknown } | null;\n}): boolean {\n let current = nodePath.parentPath as { node: t.Node; parentPath?: unknown } | null | undefined;\n while (current) {\n const node = current.node;\n if (\n t.isCallExpression(node) &&\n t.isMemberExpression(node.callee) &&\n t.isIdentifier(node.callee.property) &&\n (node.callee.property.name === 'map' || node.callee.property.name === 'flatMap')\n ) {\n return true;\n }\n if (\n t.isJSXAttribute(node) &&\n t.isJSXIdentifier(node.name) &&\n /^render[A-Z]|^ListHeaderComponent$|^ListFooterComponent$/.test(node.name.name) &&\n node.name.name !== 'renderScrollComponent'\n ) {\n // `renderItem` renders per row; `ListFooterComponent` renders once, so\n // only the per-row ones count.\n return /^renderItem$|^renderSectionHeader$|^renderSectionFooter$/.test(node.name.name);\n }\n current = current.parentPath as { node: t.Node; parentPath?: unknown } | null | undefined;\n }\n return false;\n}\n\nexport function findAnnotationSites(source: string, file: string): AnnotationSite[] {\n let ast: t.File;\n try {\n ast = parseSource(source);\n } catch {\n return [];\n }\n\n const imports = collectImports(ast);\n const scope = scopeSlugForFile(file);\n const sites: AnnotationSite[] = [];\n const perComponent = new Map<string, number>();\n const usedIds = new Set<string>();\n\n // Ids already spoken for in this file — never mint a collision with one.\n traverse(ast as never, {\n JSXOpeningElement(nodePath: { node: t.JSXOpeningElement }) {\n for (const prop of IDENTITY_PROPS) {\n const existing = getStringAttr(nodePath.node, prop);\n if (existing) usedIds.add(existing);\n }\n },\n });\n\n traverse(ast as never, {\n JSXOpeningElement(nodePath: {\n node: t.JSXOpeningElement;\n parentPath?: { node: t.Node; parentPath?: unknown } | null;\n }) {\n const element = nodePath.node;\n if (!t.isJSXIdentifier(element.name)) return;\n const component = element.name.name;\n\n const role = classifyJsxComponent(component, element);\n if (!ANNOTATABLE_ROLES.has(role)) return;\n\n // Already addressable — declared id, or visible text the walker folds.\n if (hasAnyProp(element, IDENTITY_PROPS)) return;\n if (role === 'button' && hasLabelText(element)) return;\n\n const carrier = canCarryTestId(component, file, imports);\n // The component already publishes an identity of its own. A second\n // one competing with it is a tie, and the matcher refuses ties.\n if (carrier === 'derives') return;\n // One literal name cannot serve N rendered instances.\n if (isPerItemRender(nodePath)) return;\n\n const pressProp = pressHandlerProp(element) ?? undefined;\n const handler = namedHandler(element, pressProp);\n const ordinal = (perComponent.get(component) ?? 0) + 1;\n perComponent.set(component, ordinal);\n\n let testId = deriveTestId({ scope, component, pressProp, handler, ordinal });\n if (usedIds.has(testId)) {\n let suffix = 2;\n while (usedIds.has(`${testId}-${suffix}`)) suffix += 1;\n testId = `${testId}-${suffix}`;\n }\n usedIds.add(testId);\n\n const line = element.loc?.start.line ?? 0;\n const nameEndLine = element.name.loc?.end.line ?? line;\n const firstAttr = element.attributes[0];\n const firstAttrLoc = firstAttr?.loc?.start;\n const isMultiline = !!firstAttrLoc && firstAttrLoc.line !== nameEndLine;\n const insertText = isMultiline\n ? `\\n${' '.repeat(firstAttrLoc.column)}testID=\"${testId}\"`\n : ` testID=\"${testId}\"`;\n\n sites.push({\n file,\n line,\n column: element.loc?.start.column ?? 0,\n component,\n role,\n pressProp,\n handler,\n testId,\n carrier,\n // Just past the element name — before any existing attribute, so a\n // multi-line element keeps its formatting and the new prop reads\n // first in the diff.\n insertAt: element.name.end ?? element.start ?? 0,\n insertText,\n });\n },\n });\n\n return sites;\n}\n","/**\n * Can this component actually carry a `testID` to the runtime?\n *\n * The question exists because writing the prop is not the same as the prop\n * arriving. React silently drops an unknown prop on a function component —\n * it is only an object key nobody read. So:\n *\n * <Card onPress={open} testID=\"card-1\" />\n *\n * looks annotated, compiles, renders, and reaches the device as nothing at\n * all, because `Card` destructures `{ children, onPress, style, variant }`\n * and never passes `testID` down. The MCP document would then advertise\n * `card-1`, the agent would aim at it, and the walker would have no such\n * element. That is the same confident-failure shape the whole provenance\n * effort exists to prevent — manufactured by the tool meant to fix it.\n *\n * Both halves of the check are shallow and local. Following the import one\n * level is worth it HERE, where the answer is verifiable and bounded to one\n * lookup per distinct component, in a way it was not worth it for\n * classification (see `classify.ts`).\n */\n\nimport path from 'node:path';\nimport { existsSync, readFileSync } from 'node:fs';\n\nimport _traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nimport { parseSource } from '../ast/parse';\n\nconst traverse = (_traverse as unknown as { default?: typeof _traverse }).default ?? _traverse;\n\nexport type CarrierVerdict =\n /** A React Native host primitive — `testID` is part of its contract. */\n | 'rn-primitive'\n /** A local component whose source accepts or spreads `testID`. */\n | 'forwards'\n /**\n * The component names ITSELF, from its own props — `testID={\\`toggle-${id}\\`}`,\n * `accessibilityLabel={label}`, a `useAppilotsTarget` registration.\n *\n * Its call sites need nothing. Annotating one would hand the element a\n * SECOND identity competing with the one it already publishes, and the\n * shared matcher refuses on a tie — so the \"fix\" would make the control\n * less addressable, not more.\n *\n * Every component the first version of this check reported as blocked in\n * `apps/example-app` turned out to be this: `ToggleRow`, `SettingToggle`\n * and `RadioOptionRow` all build a testID from a prop. All 15 \"blocked\"\n * sites were false positives.\n */\n | 'derives'\n /** A local component that destructures its props and drops `testID`. */\n | 'swallows'\n /** Imported from a package we cannot read, or resolved to no file. */\n | 'unverifiable';\n\n/**\n * React Native components that take `testID` as part of their public API.\n * Only the ones an app actually annotates — this is not a full inventory,\n * and anything missing merely falls through to the import check.\n */\nexport const RN_TESTID_CARRIERS = new Set([\n 'View',\n 'Text',\n 'TextInput',\n 'Image',\n 'ImageBackground',\n 'ScrollView',\n 'FlatList',\n 'SectionList',\n 'VirtualizedList',\n 'TouchableOpacity',\n 'TouchableHighlight',\n 'TouchableWithoutFeedback',\n 'TouchableNativeFeedback',\n 'Pressable',\n 'Button',\n 'Switch',\n 'Modal',\n 'RefreshControl',\n 'ActivityIndicator',\n 'SafeAreaView',\n 'KeyboardAvoidingView',\n 'Slider',\n]);\n\nexport interface ImportOrigin {\n /** Module specifier, e.g. `react-native` or `../../components`. */\n source: string;\n /** Name in the importing file, after any `as` rename. */\n local: string;\n /** Name in the exporting module (`default` for a default import). */\n imported: string;\n}\n\n/** Map every imported binding in a file to where it came from. */\nexport function collectImports(ast: t.File): Map<string, ImportOrigin> {\n const out = new Map<string, ImportOrigin>();\n traverse(ast as never, {\n ImportDeclaration(nodePath: { node: t.ImportDeclaration }) {\n const source = nodePath.node.source.value;\n for (const spec of nodePath.node.specifiers) {\n if (t.isImportSpecifier(spec)) {\n const imported = t.isIdentifier(spec.imported) ? spec.imported.name : spec.imported.value;\n out.set(spec.local.name, { source, local: spec.local.name, imported });\n } else if (t.isImportDefaultSpecifier(spec)) {\n out.set(spec.local.name, { source, local: spec.local.name, imported: 'default' });\n }\n }\n },\n });\n return out;\n}\n\nconst EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js'];\n\n/**\n * Resolve a relative import to a file on disk. Deliberately does NOT\n * implement Node resolution: only relative specifiers, only the four\n * extensions the analyzers already parse, plus `index.*` for a directory.\n * Anything else is `unverifiable`, which is a reported outcome rather than\n * a silent one.\n */\nexport function resolveRelativeImport(fromFile: string, source: string): string | undefined {\n if (!source.startsWith('.')) return undefined;\n const base = path.resolve(path.dirname(fromFile), source);\n\n for (const ext of EXTENSIONS) {\n const candidate = `${base}${ext}`;\n if (existsSync(candidate)) return candidate;\n }\n for (const ext of EXTENSIONS) {\n const candidate = path.join(base, `index${ext}`);\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/**\n * Does the source of a module hand `testID` onward?\n *\n * Three shapes count, and the first two are what a hand-written component\n * looks like:\n *\n * function Card({ testID, onPress }) { … } // destructured\n * interface CardProps { testID?: string } // declared in props\n * function Card(props) { return <View {...props} /> } // spread onward\n *\n * A barrel (`export { Card } from './Card'`) is followed one hop, because\n * `../../components` is how every screen in a real app imports.\n */\ninterface ModuleIdentity {\n /** Accepts or spreads `testID`, so a call site can name the instance. */\n forwards: boolean;\n /** Publishes an identity built from its own props — nothing to annotate. */\n derives: boolean;\n}\n\n/** Hooks that register a control with the SDK under a computed id. */\nconst IDENTITY_HOOKS = new Set([\n 'useAppilotsTarget',\n 'useAppilotsField',\n 'useAppilotsToggle',\n 'useAppilotsSlider',\n]);\n\nfunction inspectModule(file: string, exportName: string, depth = 0): ModuleIdentity {\n const none: ModuleIdentity = { forwards: false, derives: false };\n if (depth > 2) return none;\n let source: string;\n try {\n source = readFileSync(file, 'utf-8');\n } catch {\n return none;\n }\n\n // Cheap pre-check: a file that names no identity, spreads nothing and\n // registers nothing cannot do either.\n const mentionsIdentity =\n source.includes('testID') ||\n source.includes('accessibilityLabel') ||\n source.includes('useAppilots') ||\n /\\{\\s*\\.\\.\\./.test(source);\n if (!mentionsIdentity && !/export\\s*\\{[^}]*\\}\\s*from/.test(source)) return none;\n\n let ast: t.File;\n try {\n ast = parseSource(source);\n } catch {\n return none;\n }\n\n let forwards = false;\n let derives = false;\n let barrelTarget: string | undefined;\n\n traverse(ast as never, {\n // `export { Card } from './Card'` — follow one hop.\n ExportNamedDeclaration(nodePath: { node: t.ExportNamedDeclaration }) {\n const from = nodePath.node.source?.value;\n if (!from) return;\n const named = nodePath.node.specifiers.some(\n (spec) =>\n t.isExportSpecifier(spec) &&\n (t.isIdentifier(spec.exported) ? spec.exported.name : spec.exported.value) === exportName,\n );\n if (named) barrelTarget = from;\n },\n ExportAllDeclaration(nodePath: { node: t.ExportAllDeclaration }) {\n barrelTarget ??= nodePath.node.source.value;\n },\n // `interface CardProps { testID?: string }` / `type Props = { testID… }`\n TSPropertySignature(nodePath: { node: t.TSPropertySignature }) {\n if (t.isIdentifier(nodePath.node.key) && nodePath.node.key.name === 'testID') forwards = true;\n },\n // `function Card({ testID }) {}` — the destructured parameter.\n ObjectProperty(nodePath: { node: t.ObjectProperty }) {\n if (t.isIdentifier(nodePath.node.key) && nodePath.node.key.name === 'testID') forwards = true;\n },\n // `<View {...props} />` — anything spread onto JSX carries it along.\n JSXSpreadAttribute() {\n forwards = true;\n },\n // `testID={`toggle-${id}`}` / `accessibilityLabel={label}` — the\n // component naming itself from a prop. A STRING literal does not count:\n // that is one hardcoded name shared by every instance, which is the\n // duplicate-id problem rather than a solution to it.\n JSXAttribute(nodePath: { node: t.JSXAttribute }) {\n const name = t.isJSXIdentifier(nodePath.node.name) ? nodePath.node.name.name : '';\n if (name !== 'testID' && name !== 'accessibilityLabel') return;\n const value = nodePath.node.value;\n if (!t.isJSXExpressionContainer(value)) return;\n if (t.isStringLiteral(value.expression)) return;\n derives = true;\n },\n // `useAppilotsTarget(`${groupId}-${option.value}`, …)`\n CallExpression(nodePath: { node: t.CallExpression }) {\n const callee = nodePath.node.callee;\n if (t.isIdentifier(callee) && IDENTITY_HOOKS.has(callee.name)) derives = true;\n },\n });\n\n if (forwards || derives) return { forwards, derives };\n if (barrelTarget) {\n const next = resolveRelativeImport(file, barrelTarget);\n if (next) return inspectModule(next, exportName, depth + 1);\n }\n return none;\n}\n\n/** Cache keyed by `<file>#<export>` — a barrel is read once per run. */\nconst verdictCache = new Map<string, ModuleIdentity>();\n\n/**\n * Can `componentName`, as used in `fromFile`, carry a `testID`?\n *\n * A component defined in the SAME file (a local sub-component, very common\n * in screens) is checked against that file's own source.\n */\nexport function canCarryTestId(\n componentName: string,\n fromFile: string,\n imports: Map<string, ImportOrigin>,\n): CarrierVerdict {\n const origin = imports.get(componentName);\n\n if (origin?.source === 'react-native') {\n return RN_TESTID_CARRIERS.has(origin.imported) ? 'rn-primitive' : 'unverifiable';\n }\n // Not imported at all — defined locally in this same file.\n const target = origin ? resolveRelativeImport(fromFile, origin.source) : fromFile;\n if (!target) return 'unverifiable';\n\n const exportName = origin?.imported ?? componentName;\n const key = `${target}#${exportName}`;\n let identity = verdictCache.get(key);\n if (identity === undefined) {\n identity = inspectModule(target, exportName);\n verdictCache.set(key, identity);\n }\n // Forwarding wins: it lets the call site name its own instance, which is\n // strictly more precise than whatever the component derives for itself.\n if (identity.forwards) return 'forwards';\n if (identity.derives) return 'derives';\n return 'swallows';\n}\n\n/** Test seam — the cache is process-lifetime otherwise. */\nexport function resetForwardingCache(): void {\n verdictCache.clear();\n}\n","/**\n * Writing the props, and deciding what not to write.\n *\n * This is the only code in the repository that edits a customer's own\n * source. The one precedent — `ensureConfigIgnored` in `cli/commands/init.ts`\n * appending to a `.gitignore` — sets the shape worth copying: the edit is\n * idempotent, and the function returns WHAT IT DID so the command can say\n * so out loud instead of leaving the developer to diff for it.\n *\n * `magic-string` rather than a printer: every edit here is a single prop\n * insertion at a known offset. Regenerating the file from an AST would\n * reformat code nobody asked us to touch and bury the two characters that\n * matter in a diff of hundreds — which is the difference between a PR a\n * reviewer approves and one they close.\n */\n\nimport MagicString from 'magic-string';\n\nimport type { AnnotationSite } from './sites';\n\nexport type SiteOutcome =\n /** Written (or would be, in a dry run). */\n | 'annotated'\n /** The component drops the prop before it reaches the runtime. */\n | 'blocked-swallows'\n /** Imported from a package we cannot read — we will not guess. */\n | 'blocked-unverifiable';\n\nexport interface PlannedSite extends AnnotationSite {\n outcome: SiteOutcome;\n /** Why we refused, phrased as something the developer can act on. */\n blockedReason?: string;\n}\n\nexport function planSite(site: AnnotationSite): PlannedSite {\n if (site.carrier === 'rn-primitive' || site.carrier === 'forwards') {\n return { ...site, outcome: 'annotated' };\n }\n if (site.carrier === 'swallows') {\n return {\n ...site,\n outcome: 'blocked-swallows',\n blockedReason:\n `<${site.component}> does not accept testID, so React would drop the prop and the ` +\n `agent would be told about an element that never reaches the screen. Add ` +\n `testID?: string to its props and pass it to the element it renders, then re-run.`,\n };\n }\n return {\n ...site,\n outcome: 'blocked-unverifiable',\n blockedReason:\n `<${site.component}> comes from a package whose source is not readable from here, so ` +\n `whether it forwards testID cannot be checked. Annotate it by hand if it does.`,\n };\n}\n\nexport interface FileEdit {\n file: string;\n /** The rewritten source. Identical to the input when nothing was written. */\n content: string;\n written: PlannedSite[];\n blocked: PlannedSite[];\n}\n\n/**\n * Apply every writable site in one file.\n *\n * Insertions are collected at distinct offsets and `magic-string` keeps them\n * independent, so the order of `sites` does not matter and no offset needs\n * adjusting after an earlier edit — the reason for using it over hand-rolled\n * slicing.\n */\nexport function applyToFile(source: string, sites: AnnotationSite[]): FileEdit {\n const planned = sites.map(planSite);\n const written = planned.filter((site) => site.outcome === 'annotated');\n const blocked = planned.filter((site) => site.outcome !== 'annotated');\n\n if (written.length === 0) {\n return { file: sites[0]?.file ?? '', content: source, written, blocked };\n }\n\n const magic = new MagicString(source);\n for (const site of written) {\n magic.appendLeft(site.insertAt, site.insertText);\n }\n\n return { file: written[0]!.file, content: magic.toString(), written, blocked };\n}\n","/**\n * Teaching a component to carry a `testID`.\n *\n * This is the most invasive thing the CLI does: it changes the SIGNATURE of\n * a shared component in someone else's repository. Everything here is built\n * to refuse rather than guess, because a wrong edit is not a bad suggestion\n * — it is a compile error, or worse, a silent behaviour change in a\n * component every screen renders.\n *\n * Three edits, all of which must be possible or none are made:\n *\n * interface CardProps { … testID?: string } // the contract\n * function Card({ children, onPress, testID }: CardProps) // the parameter\n * <TouchableOpacity … testID={testID}> // the delivery\n *\n * The third is the one that decides whether this is worth doing at all. A\n * component whose root is ANOTHER custom component would only relocate the\n * problem one level down, so that is a refusal, not a chain to follow.\n */\n\nimport { readFileSync } from 'node:fs';\n\nimport MagicString from 'magic-string';\nimport _traverse from '@babel/traverse';\nimport * as t from '@babel/types';\n\nimport { parseSource } from '../ast/parse';\nimport { RN_TESTID_CARRIERS, collectImports, resolveRelativeImport } from './forwarding';\n\nconst traverse = (_traverse as unknown as { default?: typeof _traverse }).default ?? _traverse;\n\nexport interface ForwardEdit {\n at: number;\n text: string;\n what: 'props-type' | 'parameter' | 'root';\n}\n\nexport interface ForwardPlan {\n file: string;\n component: string;\n /** Empty when `refusal` is set. */\n edits: ForwardEdit[];\n /** Present when the component cannot be taught safely. */\n refusal?: string;\n /** How many JSX roots will start receiving the prop. */\n roots: number;\n}\n\n/** The function or arrow whose name matches, plus its enclosing statement. */\nfunction findComponent(ast: t.File, name: string): { params: t.Node[]; body: t.Node } | undefined {\n let found: { params: t.Node[]; body: t.Node } | undefined;\n\n traverse(ast as never, {\n FunctionDeclaration(nodePath: { node: t.FunctionDeclaration }) {\n if (nodePath.node.id?.name === name) {\n found ??= { params: nodePath.node.params, body: nodePath.node.body };\n }\n },\n VariableDeclarator(nodePath: { node: t.VariableDeclarator }) {\n if (!t.isIdentifier(nodePath.node.id) || nodePath.node.id.name !== name) return;\n const init = nodePath.node.init;\n if (t.isArrowFunctionExpression(init) || t.isFunctionExpression(init)) {\n found ??= { params: init.params, body: init.body };\n }\n },\n });\n\n return found;\n}\n\n/** Collect the JSX elements this component actually returns. */\nfunction findReturnedRoots(body: t.Node): t.JSXOpeningElement[] | undefined {\n const roots: t.JSXOpeningElement[] = [];\n let unsupported = false;\n\n const record = (node: t.Node | null | undefined): void => {\n if (!node) return;\n if (t.isParenthesizedExpression(node)) return record(node.expression);\n if (t.isJSXElement(node)) {\n roots.push(node.openingElement);\n return;\n }\n if (t.isConditionalExpression(node)) {\n record(node.consequent);\n record(node.alternate);\n return;\n }\n if (t.isJSXFragment(node)) {\n // A fragment is not an element; there is nothing to hang an id on.\n unsupported = true;\n return;\n }\n if (t.isNullLiteral(node)) return;\n unsupported = true;\n };\n\n if (t.isBlockStatement(body)) {\n traverse(\n t.file(t.program([t.expressionStatement(t.functionExpression(null, [], body))])) as never,\n {\n ReturnStatement(nodePath: { node: t.ReturnStatement }) {\n record(nodePath.node.argument);\n },\n },\n );\n } else {\n // Concise arrow body: `const Row = (p) => <View />`\n record(body);\n }\n\n if (unsupported || roots.length === 0) return undefined;\n return roots;\n}\n\nfunction isCarrierRoot(\n element: t.JSXOpeningElement,\n imports: ReturnType<typeof collectImports>,\n): boolean {\n if (!t.isJSXIdentifier(element.name)) return false;\n const name = element.name.name;\n const origin = imports.get(name);\n if (origin?.source !== 'react-native') return false;\n return RN_TESTID_CARRIERS.has(origin.imported);\n}\n\nfunction hasProp(element: t.JSXOpeningElement, name: string): boolean {\n return element.attributes.some(\n (attr) => t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name) && attr.name.name === name,\n );\n}\n\n/** Indentation of the line a node starts on. */\nfunction indentOf(source: string, offset: number): string {\n const lineStart = source.lastIndexOf('\\n', offset - 1) + 1;\n const match = /^[ \\t]*/.exec(source.slice(lineStart, offset));\n return match?.[0] ?? '';\n}\n\n/**\n * Insert into an object pattern or a type body, matching its layout.\n *\n * `separator` is load-bearing and differs between the two: a destructuring\n * pattern separates with `,`, a TypeScript type body with `;`. Getting it\n * wrong on a SINGLE-LINE interface produced\n * `onPress?: () => void testID?: string` — invalid TypeScript, and invisible\n * on the testbed because its props interface happens to be multi-line.\n */\nfunction insertAfterLastMember(\n source: string,\n members: t.Node[],\n text: string,\n closingBrace: number,\n separator: ',' | ';',\n): { at: number; text: string } {\n const last = members[members.length - 1];\n if (!last || typeof last.end !== 'number' || typeof last.start !== 'number') {\n return { at: closingBrace, text };\n }\n\n // Where the separator lives differs by node type, and both cases are real:\n // `variant?: 'a' | 'b';` — Babel puts the `;` INSIDE the property's\n // range, so looking after `end` sees nothing\n // and a second `;` gets added.\n // `{ a, b, }` — a trailing comma sits AFTER the range, so\n // inserting at `end` lands before it.\n // Handle both: step past a separator that follows, and only add one when\n // neither side already has it.\n const trailing = /^\\s*[,;]/.exec(source.slice(last.end, closingBrace));\n const at = last.end + (trailing?.[0].length ?? 0);\n const endsWithSeparator = source.slice(0, last.end).trimEnd().endsWith(separator);\n const lead = trailing || endsWithSeparator ? '' : separator;\n\n const openLine = source.lastIndexOf('\\n', last.start);\n const multiline = openLine !== -1 && openLine > source.lastIndexOf('{', last.start);\n if (!multiline) return { at, text: `${lead} ${text}` };\n\n const indent = indentOf(source, last.start);\n return { at, text: `${lead}\\n${indent}${text}` };\n}\n\n/**\n * `export { Card } from './Card'` — the shape every `components/index.ts`\n * has, and the reason the first version of this reported \"no function named\n * Card in this file\": the import resolved to the barrel, which defines\n * nothing.\n */\nfunction followBarrel(file: string, ast: t.File, component: string): string | undefined {\n let target: string | undefined;\n traverse(ast as never, {\n ExportNamedDeclaration(nodePath: { node: t.ExportNamedDeclaration }) {\n const from = nodePath.node.source?.value;\n if (!from) return;\n const named = nodePath.node.specifiers.some(\n (spec) =>\n t.isExportSpecifier(spec) &&\n (t.isIdentifier(spec.exported) ? spec.exported.name : spec.exported.value) === component,\n );\n if (named) target ??= from;\n },\n });\n return target ? resolveRelativeImport(file, target) : undefined;\n}\n\nexport function planForward(file: string, component: string, depth = 0): ForwardPlan {\n const base: ForwardPlan = { file, component, edits: [], roots: 0 };\n let source: string;\n try {\n source = readFileSync(file, 'utf-8');\n } catch {\n return { ...base, refusal: `cannot read ${file}` };\n }\n\n let ast: t.File;\n try {\n ast = parseSource(source);\n } catch {\n return { ...base, refusal: `cannot parse ${file}` };\n }\n\n const found = findComponent(ast, component);\n if (!found) {\n const barrel = depth < 2 ? followBarrel(file, ast, component) : undefined;\n if (barrel) return planForward(barrel, component, depth + 1);\n return { ...base, refusal: `no function named ${component} in this file` };\n }\n\n const param = found.params[0];\n if (!t.isObjectPattern(param)) {\n return {\n ...base,\n refusal:\n `${component} does not destructure its props, so there is no safe place to add one ` +\n `without knowing what the parameter is called downstream`,\n };\n }\n\n const roots = findReturnedRoots(found.body);\n if (!roots) {\n return {\n ...base,\n refusal: `${component} returns something other than a JSX element (a fragment, or a value this cannot follow)`,\n };\n }\n\n const imports = collectImports(ast);\n const nonCarrier = roots.find((root) => !isCarrierRoot(root, imports));\n if (nonCarrier) {\n const name = t.isJSXIdentifier(nonCarrier.name) ? nonCarrier.name.name : 'its root';\n return {\n ...base,\n refusal:\n `${component} renders <${name}> at its root, which is not a React Native element known ` +\n `to accept testID. Forwarding into it would move the problem down a level, not fix it`,\n };\n }\n\n const edits: ForwardEdit[] = [];\n\n // 1. The parameter.\n const alreadyDestructured = param.properties.some(\n (prop) => t.isObjectProperty(prop) && t.isIdentifier(prop.key) && prop.key.name === 'testID',\n );\n if (!alreadyDestructured) {\n const insert = insertAfterLastMember(source, param.properties, 'testID', param.end ?? 0, ',');\n edits.push({ ...insert, what: 'parameter' });\n }\n\n // 2. The contract, when there is one to update.\n const annotation = param.typeAnnotation;\n if (t.isTSTypeAnnotation(annotation)) {\n const declared = annotation.typeAnnotation;\n let body: t.TSTypeElement[] | undefined;\n let closing = 0;\n\n if (t.isTSTypeLiteral(declared)) {\n body = declared.members;\n closing = declared.end ?? 0;\n } else if (t.isTSTypeReference(declared) && t.isIdentifier(declared.typeName)) {\n const typeName = declared.typeName.name;\n traverse(ast as never, {\n TSInterfaceDeclaration(nodePath: { node: t.TSInterfaceDeclaration }) {\n if (nodePath.node.id.name !== typeName) return;\n body = nodePath.node.body.body;\n closing = nodePath.node.body.end ?? 0;\n },\n TSTypeAliasDeclaration(nodePath: { node: t.TSTypeAliasDeclaration }) {\n if (\n nodePath.node.id.name !== typeName ||\n !t.isTSTypeLiteral(nodePath.node.typeAnnotation)\n )\n return;\n body = nodePath.node.typeAnnotation.members;\n closing = nodePath.node.typeAnnotation.end ?? 0;\n },\n });\n\n if (!body) {\n return {\n ...base,\n refusal:\n `${component}'s props type \\`${typeName}\\` is not declared in this file, so adding a ` +\n `field to it would edit a contract shared with code this cannot see`,\n };\n }\n }\n\n if (body) {\n const declaresTestId = body.some(\n (member) =>\n t.isTSPropertySignature(member) &&\n t.isIdentifier(member.key) &&\n member.key.name === 'testID',\n );\n if (!declaresTestId) {\n const insert = insertAfterLastMember(source, body, 'testID?: string;', closing, ';');\n edits.push({ ...insert, what: 'props-type' });\n }\n }\n }\n\n // 3. The delivery.\n let delivered = 0;\n for (const root of roots) {\n if (hasProp(root, 'testID')) continue;\n edits.push({\n at: root.name.end ?? root.start ?? 0,\n text: ' testID={testID}',\n what: 'root',\n });\n delivered += 1;\n }\n\n if (edits.length === 0) {\n return { ...base, refusal: `${component} already forwards testID` };\n }\n\n return { file, component, edits, roots: delivered };\n}\n\nexport function applyForward(source: string, plan: ForwardPlan): string {\n if (plan.refusal || plan.edits.length === 0) return source;\n const magic = new MagicString(source);\n for (const edit of plan.edits) magic.appendLeft(edit.at, edit.text);\n return magic.toString();\n}\n","import { Command } from 'commander';\nimport { AppilotsAPIClient } from '../../services/api-client';\nimport { loadConfig } from '../../config/index';\nimport {\n banner,\n success,\n error,\n info,\n table,\n warn,\n heading,\n setLogMode,\n jsonOutput,\n} from '../utils/logger';\nimport {\n compareWithRemote,\n readLocalDocumentSummary,\n reportRemoteDrift,\n type RemoteDrift,\n} from '../utils/remote-drift';\nimport { stringifyUnknown } from '../../utils/stringify';\n\ninterface StatusOptions {\n json?: boolean;\n quiet?: boolean;\n}\n\nexport function statusCommand(): Command {\n return new Command('status')\n .description('Show current project and MCP document status')\n .option('--json', 'Output a machine-readable JSON result (implies --quiet)', false)\n .option('--quiet', 'Suppress banner and informational output', false)\n .action(async (options: StatusOptions) => {\n if (options.json) setLogMode('json');\n else if (options.quiet) setLogMode('quiet');\n try {\n banner();\n\n // Load configuration\n const config = loadConfig(warn);\n if (!config) {\n error('No .appilotsrc configuration found');\n info('Run: appilots init --api-key <your-key>');\n jsonOutput({ success: false, error: 'No .appilotsrc configuration found' });\n process.exit(1);\n return;\n }\n\n // Initialize API client\n const apiClient = new AppilotsAPIClient({\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n });\n\n // Get status from server\n const status = await apiClient.status();\n\n if (status.error) {\n error(`Failed to fetch status: ${status.error}`);\n jsonOutput({ success: false, error: status.error });\n process.exit(1);\n }\n\n // Display local configuration\n heading('\\n📋 Local Configuration:');\n table([\n ['API Server', config.serverUrl],\n ['Project ID', config.projectId || '(resolved from API key)'],\n ['Output Directory', config.outputDir || '.appilots'],\n ['Auto Activate', String(config.autoActivate ?? true)],\n ]);\n\n // Display project info\n if (status.project) {\n heading('\\n📌 Project Info:');\n table([\n ['Name', status.project.name],\n ['ID', status.project.id],\n ]);\n }\n\n // Display active MCP info\n const outputDir = config.outputDir || '.appilots';\n let drift: RemoteDrift | null = null;\n\n if (status.activeMcp) {\n heading('\\n✅ Active MCP Document:');\n table([\n ['Document ID', status.activeMcp.id],\n ['Version', status.activeMcp.version],\n ['Screens', String(status.activeMcp.screensCount)],\n ['Forms', String(status.activeMcp.formsCount)],\n ['Actions', String(status.activeMcp.actionsCount)],\n ]);\n\n // The pre-flight an e2e run wants: is the document the agent\n // reasons over the one generated from this checkout? Compared\n // against the last local generation, so `status` stays a cheap\n // read — no re-analysis of the source tree.\n const local = readLocalDocumentSummary(outputDir);\n if (local) {\n drift = compareWithRemote(local, status.activeMcp);\n if (drift) {\n heading('');\n reportRemoteDrift(drift);\n }\n }\n } else {\n heading('\\n⚠️ No active MCP document');\n info('Run: appilots sync');\n }\n\n success('Status retrieved successfully');\n jsonOutput({\n success: true,\n local: {\n serverUrl: config.serverUrl,\n projectId: config.projectId || null,\n outputDir,\n },\n project: status.project ?? null,\n activeMcp: status.activeMcp ?? null,\n drift,\n });\n } catch (err) {\n error(`Status check failed: ${stringifyUnknown(err)}`);\n jsonOutput({ success: false, error: stringifyUnknown(err) });\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport { existsSync, mkdirSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { AppilotsAPIClient, type EvalScenarioRequest } from '../../services/api-client';\nimport { loadConfig, DEFAULT_SERVER_URL } from '../../config/index';\nimport {\n banner,\n success,\n error,\n info,\n warn,\n dim,\n table,\n heading,\n createSpinner,\n setLogMode,\n jsonOutput,\n} from '../utils/logger';\nimport { loadScenarios } from '../../eval/scenario-loader';\nimport { matchActions } from '../../eval/matcher';\nimport {\n loadBaseline,\n saveBaseline,\n buildBaseline,\n diffAgainstBaseline,\n} from '../../eval/baseline';\nimport { EXAMPLE_SCENARIO } from '../../eval/scaffold';\nimport { stringifyUnknown } from '../../utils/stringify';\n\nconst DEFAULT_MIN_PASS_RATE = 0.95;\nconst DEFAULT_MAX_TOKEN_REGRESSION = 0.25;\n\ninterface EvalOptions {\n init?: boolean;\n force?: boolean;\n dir?: string;\n baseline?: string;\n updateBaseline?: boolean;\n minPassRate?: string;\n maxTokenRegression?: string;\n model?: string;\n apiKey?: string;\n projectId?: string;\n server?: string;\n json?: boolean;\n quiet?: boolean;\n}\n\n/** Parses a numeric CLI flag, falling back (with a warning) on garbage input\n * instead of silently comparing against NaN. */\nfunction parseRate(raw: string | undefined, fallback: number, flagName: string): number {\n if (raw === undefined) return fallback;\n const n = Number(raw);\n if (Number.isNaN(n)) {\n warn(`Ignoring invalid ${flagName} value \"${raw}\" — using ${fallback}`);\n return fallback;\n }\n return n;\n}\n\nexport function evalCommand(): Command {\n return new Command('eval')\n .description(\n 'Run agent eval scenarios against the current MCP document in dry-run mode and check for regressions vs a committed baseline',\n )\n .option('--init', 'Scaffold an example scenario in the scenarios directory', false)\n .option('--force', 'With --init, overwrite an existing example scenario', false)\n .option('--dir <path>', 'Scenarios directory (default: <outputDir>/scenarios)')\n .option('--baseline <path>', 'Baseline file path (default: <outputDir>/eval-baseline.json)')\n .option(\n '--update-baseline',\n 'Record this run as the new baseline (refuses if pass rate is below the threshold)',\n false,\n )\n .option(\n '--min-pass-rate <n>',\n 'Minimum fraction of scenarios that must pass, 0-1 (default: 0.95)',\n )\n .option(\n '--max-token-regression <n>',\n 'Max fractional token increase before a passing scenario is flagged, e.g. 0.25 for +25% (default: 0.25)',\n )\n .option('--model <id>', 'Model override for scenarios that do not set their own modelOverride')\n .option('--api-key <key>', 'Appilots API key (overrides .appilotsrc and APPILOTS_API_KEY)')\n .option('--project-id <id>', 'Project ID (overrides .appilotsrc and APPILOTS_PROJECT_ID)')\n .option('--server <url>', 'Appilots server URL (overrides .appilotsrc and APPILOTS_SERVER_URL)')\n .option('--json', 'Output a machine-readable JSON result (implies --quiet)', false)\n .option('--quiet', 'Suppress banner and informational output', false)\n .action(async (options: EvalOptions) => {\n if (options.json) setLogMode('json');\n else if (options.quiet) setLogMode('quiet');\n try {\n banner();\n\n const loaded = loadConfig(warn);\n const outputDir = loaded?.outputDir || '.appilots';\n const scenariosDir =\n options.dir || loaded?.eval?.scenariosDir || join(outputDir, 'scenarios');\n\n if (options.init) {\n mkdirSync(scenariosDir, { recursive: true });\n const examplePath = join(scenariosDir, 'example.json');\n if (existsSync(examplePath) && !options.force) {\n warn(`${examplePath} already exists — pass --force to overwrite`);\n } else {\n writeFileSync(examplePath, `${JSON.stringify(EXAMPLE_SCENARIO, null, 2)}\\n`, 'utf-8');\n success(`Wrote example scenario to ${examplePath}`);\n }\n info('Edit it to match a real screen in your app, then:');\n dim(' $ appilots eval --update-baseline # capture the current (good) behavior');\n dim(' $ appilots eval # check for regressions on future runs');\n jsonOutput({ success: true, scenariosDir, examplePath });\n return;\n }\n\n const apiKey = options.apiKey || loaded?.apiKey;\n if (!apiKey) {\n error('No .appilotsrc configuration found');\n info('Run: appilots init --api-key <your-key>');\n info('Or set APPILOTS_API_KEY, or pass --api-key');\n jsonOutput({ success: false, error: 'No configuration found (missing API key)' });\n process.exit(1);\n return;\n }\n const config = {\n serverUrl: DEFAULT_SERVER_URL,\n ...loaded,\n apiKey,\n ...(options.projectId ? { projectId: options.projectId } : {}),\n ...(options.server ? { serverUrl: options.server } : {}),\n };\n\n const baselinePath =\n options.baseline || loaded?.eval?.baselinePath || join(outputDir, 'eval-baseline.json');\n const minPassRate = parseRate(\n options.minPassRate,\n loaded?.eval?.minPassRate ?? DEFAULT_MIN_PASS_RATE,\n '--min-pass-rate',\n );\n const maxTokenRegression = parseRate(\n options.maxTokenRegression,\n loaded?.eval?.maxTokenRegression ?? DEFAULT_MAX_TOKEN_REGRESSION,\n '--max-token-regression',\n );\n\n const loadedScenarios = loadScenarios(scenariosDir);\n if (loadedScenarios.errors.length > 0) {\n for (const scenarioError of loadedScenarios.errors) {\n error(`${scenarioError.file}: ${scenarioError.error}`);\n }\n jsonOutput({\n success: false,\n error: 'One or more scenario files failed to load',\n details: loadedScenarios.errors,\n });\n process.exit(1);\n return;\n }\n if (loadedScenarios.scenarios.length === 0) {\n error(`No scenarios found in ${scenariosDir}`);\n info('Run: appilots eval --init');\n jsonOutput({ success: false, error: `No scenarios found in ${scenariosDir}` });\n process.exit(1);\n return;\n }\n\n const nameCounts = new Map<string, number>();\n for (const { scenario } of loadedScenarios.scenarios) {\n nameCounts.set(scenario.name, (nameCounts.get(scenario.name) ?? 0) + 1);\n }\n const duplicates = [...nameCounts.entries()]\n .filter(([, count]) => count > 1)\n .map(([name]) => name);\n if (duplicates.length > 0) {\n error(\n `Duplicate scenario name(s) — \"name\" must be unique across all scenario files: ${duplicates.join(', ')}`,\n );\n jsonOutput({\n success: false,\n error: `Duplicate scenario names: ${duplicates.join(', ')}`,\n });\n process.exit(1);\n return;\n }\n\n const apiClient = new AppilotsAPIClient({\n serverUrl: config.serverUrl,\n apiKey: config.apiKey,\n });\n\n const requests: EvalScenarioRequest[] = loadedScenarios.scenarios.map(({ scenario }) => ({\n id: scenario.name,\n screen: scenario.given?.screen,\n observation: scenario.given?.observation,\n prompt: scenario.when,\n modelOverride: scenario.modelOverride || options.model,\n }));\n\n const spinner = createSpinner(`Running ${requests.length} scenario(s)...`);\n spinner.start();\n const runResult = await apiClient.evalRun(requests);\n spinner.stop();\n\n if (runResult.error) {\n error(`Eval run failed: ${runResult.error}`);\n jsonOutput({ success: false, error: runResult.error });\n process.exit(1);\n return;\n }\n\n const resultsById = new Map((runResult.results ?? []).map((r) => [r.id, r]));\n const outcomes = loadedScenarios.scenarios.map(({ scenario }) => {\n const result = resultsById.get(scenario.name);\n if (!result) {\n return {\n name: scenario.name,\n status: 'failed' as const,\n totalTokens: 0,\n failureReason: 'no result returned by the API for this scenario',\n };\n }\n const match = matchActions(scenario.expect, result.actions, result.content);\n return {\n name: scenario.name,\n status: (match.ok ? 'passed' : 'failed') as 'passed' | 'failed',\n totalTokens: result.totalTokens,\n failureReason: match.ok ? undefined : match.reason,\n };\n });\n\n const passed = outcomes.filter((o) => o.status === 'passed').length;\n const total = outcomes.length;\n const passRate = total > 0 ? passed / total : 1;\n\n heading('\\nResults:');\n table(\n outcomes.map((o) => [\n o.status === 'passed' ? `✓ ${o.name}` : `✗ ${o.name}`,\n o.status === 'passed' ? `${o.totalTokens} tokens` : o.failureReason || 'failed',\n ]),\n );\n\n const baseline = loadBaseline(baselinePath);\n let regressions: ReturnType<typeof diffAgainstBaseline> = [];\n if (!options.updateBaseline) {\n regressions = diffAgainstBaseline(outcomes, baseline, maxTokenRegression);\n if (regressions.length > 0) {\n heading('\\nRegressions vs baseline:');\n table(regressions.map((r) => [r.name, `${r.kind}: ${r.detail}`]));\n }\n }\n\n const passRatePct = Math.round(passRate * 1000) / 10;\n const minPassRatePct = Math.round(minPassRate * 1000) / 10;\n heading(`\\nPass rate: ${passed}/${total} (${passRatePct}%) — threshold ${minPassRatePct}%`);\n\n if (options.updateBaseline) {\n if (passRate < minPassRate) {\n error(\n `Refusing to update baseline: pass rate ${passRatePct}% is below the ${minPassRatePct}% threshold`,\n );\n info('Fix the failing scenario(s) first, then re-run with --update-baseline.');\n jsonOutput({ success: false, passRate, minPassRate, total, passed, results: outcomes });\n process.exit(1);\n return;\n }\n const newBaseline = buildBaseline(outcomes, {\n generatedAt: new Date().toISOString(),\n gitSha: process.env.GIT_SHA ?? null,\n });\n saveBaseline(baselinePath, newBaseline);\n success(`Updated baseline at ${baselinePath}`);\n jsonOutput({ success: true, passRate, minPassRate, total, passed, results: outcomes });\n return;\n }\n\n const ok = passRate >= minPassRate && regressions.length === 0;\n jsonOutput({\n success: ok,\n passRate,\n minPassRate,\n total,\n passed,\n failed: total - passed,\n regressions,\n results: outcomes,\n });\n\n if (!ok) {\n if (passRate < minPassRate) {\n error(`Pass rate ${passRatePct}% is below the ${minPassRatePct}% threshold`);\n }\n if (regressions.length > 0) {\n error(`${regressions.length} regression(s) vs baseline`);\n }\n process.exit(1);\n } else {\n success('Eval passed');\n }\n } catch (err) {\n error(`Eval failed: ${stringifyUnknown(err)}`);\n jsonOutput({ success: false, error: stringifyUnknown(err) });\n process.exit(1);\n }\n });\n}\n","import { readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport type { EvalScenario } from './types';\nimport { stringifyUnknown } from '../utils/stringify';\n\nexport interface LoadedScenario {\n file: string;\n scenario: EvalScenario;\n}\n\nexport interface ScenarioLoadError {\n file: string;\n error: string;\n}\n\nexport interface ScenarioLoadResult {\n scenarios: LoadedScenario[];\n errors: ScenarioLoadError[];\n}\n\n/**\n * Minimal shape validation — enough to give the dev a precise error\n * pointing at the offending file, without pulling in a full JSON-schema\n * validator for a handful of required fields.\n */\nfunction validateScenarioShape(raw: unknown): string | null {\n if (!raw || typeof raw !== 'object') return 'scenario must be a JSON object';\n const s = raw as Record<string, unknown>;\n if (typeof s.name !== 'string' || !s.name.trim()) {\n return '\"name\" is required and must be a non-empty string';\n }\n if (typeof s.when !== 'string' || !s.when.trim()) {\n return '\"when\" is required and must be a non-empty string (the user prompt)';\n }\n if (!s.expect || typeof s.expect !== 'object') {\n return '\"expect\" is required and must be an object (see docs: Testing your agent between releases)';\n }\n return null;\n}\n\n/**\n * Loads every `*.json` scenario file from `dir`, sorted by filename for a\n * stable run order. Returns an empty result (no error) when `dir` doesn't\n * exist yet — the caller decides whether that's fatal.\n */\nexport function loadScenarios(dir: string): ScenarioLoadResult {\n const scenarios: LoadedScenario[] = [];\n const errors: ScenarioLoadError[] = [];\n\n let files: string[];\n try {\n files = readdirSync(dir)\n .filter((f) => f.endsWith('.json'))\n .sort();\n } catch {\n return { scenarios, errors };\n }\n\n for (const file of files) {\n const full = join(dir, file);\n let raw: unknown;\n try {\n raw = JSON.parse(readFileSync(full, 'utf-8'));\n } catch (err) {\n errors.push({ file, error: `invalid JSON: ${stringifyUnknown(err)}` });\n continue;\n }\n const shapeError = validateScenarioShape(raw);\n if (shapeError) {\n errors.push({ file, error: shapeError });\n continue;\n }\n scenarios.push({ file, scenario: raw as EvalScenario });\n }\n\n return { scenarios, errors };\n}\n","/**\n * Action matchers — tolerate LLM variability while still asserting on\n * structurally meaningful behavior.\n *\n * Ported from the monorepo's internal tests/agentic/fixtures/matchers.ts\n * (same semantics) so the published @appilots/cli package doesn't take a\n * dependency on the private @appilots/shared workspace package.\n *\n * Match modes:\n * - \"any\" — every expected action appears somewhere in the actual\n * actions (default; most lenient)\n * - \"first\" — the first actual action matches the first expected one;\n * remaining expected actions just need to appear somewhere\n * - \"exact\" — actual.length === expected.length AND each pair matches\n * in order\n * - \"none\" — zero actions emitted (security / clarification probes)\n *\n * Payload constraints are matched as PARTIAL: every key in the expected\n * payload must equal the actual, but the actual can have extra keys.\n * Form-fill fields are matched by `fieldId` regardless of order, and only\n * the listed fields are required (extras are allowed).\n */\nimport type { EvalActualAction, EvalExpectedAction, EvalExpectedActions } from './types';\n\nexport interface MatchResult {\n ok: boolean;\n reason?: string;\n}\n\nfunction normalizeReply(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase();\n}\n\nfunction partialMatch(\n expected: Record<string, unknown> | undefined,\n actual: Record<string, unknown> | undefined,\n): boolean {\n if (!expected) return true;\n if (!actual) return false;\n\n for (const key of Object.keys(expected)) {\n const exp = expected[key];\n const act = actual[key];\n\n // Special case: form_fill.fields — array of { fieldId, value }.\n // Each expected field must appear in actual; order not required.\n if (key === 'fields' && Array.isArray(exp) && Array.isArray(act)) {\n for (const expField of exp as Array<Record<string, unknown>>) {\n const fieldId = expField.fieldId;\n const matched = (act as Array<Record<string, unknown>>).find(\n (f) => f.fieldId === fieldId,\n );\n if (!matched) return false;\n if (expField.value !== undefined && matched.value !== expField.value) {\n return false;\n }\n }\n continue;\n }\n\n if (typeof exp === 'object' && exp !== null && !Array.isArray(exp)) {\n if (typeof act !== 'object' || act === null) return false;\n if (!partialMatch(exp as Record<string, unknown>, act as Record<string, unknown>)) {\n return false;\n }\n continue;\n }\n\n if (exp !== act) return false;\n }\n return true;\n}\n\nfunction matchesOne(expected: EvalExpectedAction, actual: EvalActualAction): boolean {\n if (expected.type !== actual.type) return false;\n return partialMatch(expected.payload, actual.payload);\n}\n\nexport function matchActions(\n expected: EvalExpectedActions,\n actual: EvalActualAction[],\n /** Assistant's visible reply — required by `replyMustContain` blocks. */\n reply = '',\n): MatchResult {\n if (expected.anyOf && expected.anyOf.length > 0) {\n const reasons: string[] = [];\n for (const branch of expected.anyOf) {\n const res = matchActions(branch, actual, reply);\n if (res.ok) return res;\n reasons.push(res.reason ?? 'no reason');\n }\n return {\n ok: false,\n reason: `anyOf: no branch matched — ${reasons.map((r, i) => `[${i}] ${r}`).join(' · ')}`,\n };\n }\n\n if (expected.forbidActionTypes && expected.forbidActionTypes.length > 0) {\n const forbidden = actual.find((a) => expected.forbidActionTypes!.includes(a.type));\n if (forbidden) {\n return {\n ok: false,\n reason: `forbidActionTypes: action of type=${forbidden.type} was emitted`,\n };\n }\n }\n\n if (expected.replyMustNotContain && expected.replyMustNotContain.length > 0) {\n const hay = normalizeReply(reply);\n const leaked = expected.replyMustNotContain.find((needle) =>\n hay.includes(normalizeReply(needle)),\n );\n if (leaked) {\n return {\n ok: false,\n reason: `replyMustNotContain: \"${leaked}\" was echoed in the reply \"${reply.slice(0, 120)}\"`,\n };\n }\n }\n\n if (expected.replyMustContain && expected.replyMustContain.length > 0) {\n const hay = normalizeReply(reply);\n const hit = expected.replyMustContain.some((needle) => hay.includes(normalizeReply(needle)));\n if (!hit) {\n return {\n ok: false,\n reason: `replyMustContain: none of [${expected.replyMustContain.join(', ')}] found in reply \"${reply.slice(0, 120)}\"`,\n };\n }\n }\n\n const mode = expected.mode ?? 'any';\n const expectedActions = expected.actions ?? [];\n\n if (mode === 'none') {\n if (actual.length === 0) return { ok: true };\n return {\n ok: false,\n reason: `none mode: expected 0 actions, got ${actual.length} (${actual.map((a) => a.type).join(', ')})`,\n };\n }\n\n if (mode === 'exact') {\n if (actual.length !== expectedActions.length) {\n return {\n ok: false,\n reason: `exact mode: expected ${expectedActions.length} action(s), got ${actual.length}`,\n };\n }\n for (let i = 0; i < expectedActions.length; i++) {\n if (!matchesOne(expectedActions[i]!, actual[i]!)) {\n return {\n ok: false,\n reason: `exact mode: action[${i}] mismatch — expected type=${expectedActions[i]!.type}, got type=${actual[i]!.type}`,\n };\n }\n }\n return { ok: true };\n }\n\n if (mode === 'first') {\n const first = actual[0];\n if (!first) {\n return { ok: false, reason: 'first mode: no actions emitted' };\n }\n if (!expectedActions[0] || !matchesOne(expectedActions[0], first)) {\n return {\n ok: false,\n reason: `first mode: first action did not match — expected type=${expectedActions[0]?.type}, got type=${first.type}`,\n };\n }\n for (const exp of expectedActions.slice(1)) {\n if (!actual.some((a) => matchesOne(exp, a))) {\n return {\n ok: false,\n reason: `first mode: expected action of type=${exp.type} not found in remaining actions`,\n };\n }\n }\n return { ok: true };\n }\n\n // any: every expected action appears somewhere in actual\n for (const exp of expectedActions) {\n if (!actual.some((a) => matchesOne(exp, a))) {\n return {\n ok: false,\n reason: `any mode: expected action of type=${exp.type} not found`,\n };\n }\n }\n return { ok: true };\n}\n\nexport function summarizeActions(actions: EvalActualAction[]): string {\n if (actions.length === 0) return '<no actions>';\n return actions\n .map((a, i) => {\n const summary = JSON.stringify(a.payload).slice(0, 200);\n return ` [${i}] ${a.type} ${summary}`;\n })\n .join('\\n');\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname } from 'path';\n\nexport interface BaselineScenarioResult {\n status: 'passed' | 'failed';\n totalTokens: number;\n failureReason?: string;\n}\n\nexport interface EvalBaseline {\n generatedAt: string | null;\n gitSha?: string | null;\n perScenario: Record<string, BaselineScenarioResult>;\n}\n\nconst EMPTY_BASELINE: EvalBaseline = { generatedAt: null, gitSha: null, perScenario: {} };\n\n/** Returns an empty baseline (not an error) when the file doesn't exist\n * yet — that's the expected state before the first `--update-baseline`. */\nexport function loadBaseline(path: string): EvalBaseline {\n if (!existsSync(path)) return { ...EMPTY_BASELINE, perScenario: {} };\n try {\n const raw = JSON.parse(readFileSync(path, 'utf-8')) as Partial<EvalBaseline>;\n return {\n generatedAt: raw.generatedAt ?? null,\n gitSha: raw.gitSha ?? null,\n perScenario: raw.perScenario ?? {},\n };\n } catch {\n return { ...EMPTY_BASELINE, perScenario: {} };\n }\n}\n\nexport function saveBaseline(path: string, baseline: EvalBaseline): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(baseline, null, 2)}\\n`, 'utf-8');\n}\n\nexport interface ScenarioRunOutcome {\n name: string;\n status: 'passed' | 'failed';\n totalTokens: number;\n failureReason?: string;\n}\n\nexport function buildBaseline(\n outcomes: ScenarioRunOutcome[],\n meta: { generatedAt: string; gitSha?: string | null },\n): EvalBaseline {\n const perScenario: Record<string, BaselineScenarioResult> = {};\n for (const o of outcomes) {\n perScenario[o.name] = {\n status: o.status,\n totalTokens: o.totalTokens,\n ...(o.failureReason ? { failureReason: o.failureReason } : {}),\n };\n }\n return { generatedAt: meta.generatedAt, gitSha: meta.gitSha ?? null, perScenario };\n}\n\nexport type RegressionKind = 'newly-failing' | 'token-regression';\n\nexport interface RegressionEntry {\n name: string;\n kind: RegressionKind;\n detail: string;\n}\n\n/**\n * Two regression signals, mirroring the internal\n * scripts/qa/eval-baseline-compare.ts logic at a scenario level:\n * - a scenario that passed on the baseline now fails\n * - a scenario that still passes but costs meaningfully more tokens\n * than it used to (>`maxTokenRegression` fractional increase)\n *\n * A scenario with no baseline entry (new scenario, or first run) never\n * regresses — there's nothing to compare against yet.\n */\nexport function diffAgainstBaseline(\n outcomes: ScenarioRunOutcome[],\n baseline: EvalBaseline,\n maxTokenRegression: number,\n): RegressionEntry[] {\n const regressions: RegressionEntry[] = [];\n\n for (const outcome of outcomes) {\n const prior = baseline.perScenario[outcome.name];\n if (!prior) continue;\n\n if (outcome.status === 'failed' && prior.status === 'passed') {\n regressions.push({\n name: outcome.name,\n kind: 'newly-failing',\n detail: outcome.failureReason ?? 'scenario now fails (previously passed)',\n });\n continue;\n }\n\n if (\n outcome.status === 'passed' &&\n prior.status === 'passed' &&\n prior.totalTokens > 0 &&\n outcome.totalTokens > prior.totalTokens * (1 + maxTokenRegression)\n ) {\n const pct = Math.round(((outcome.totalTokens - prior.totalTokens) / prior.totalTokens) * 100);\n regressions.push({\n name: outcome.name,\n kind: 'token-regression',\n detail: `tokens ${prior.totalTokens} → ${outcome.totalTokens} (+${pct}%, threshold +${Math.round(maxTokenRegression * 100)}%)`,\n });\n }\n }\n\n return regressions;\n}\n","/**\n * Example scenario written by `appilots eval --init`. Deliberately small\n * and heavily commented via the `description` field rather than JSON\n * comments (JSON has none) — see docs: \"Testing your agent between\n * releases\" for the full field reference.\n */\nexport const EXAMPLE_SCENARIO = {\n name: 'agent-fills-signup-form',\n description:\n 'The agent should fill the visible signup form fields from a single spoken instruction. Edit `given.observation` to match a real screen in your app, and `when` to a prompt your users would actually say.',\n given: {\n screen: 'SignupScreen',\n observation: {\n route: 'SignupScreen',\n texts: ['Create your account'],\n inputs: [\n { id: 'email', label: 'Email', required: true },\n { id: 'name', label: 'Full name', required: true },\n ],\n buttons: [{ id: 'btn-submit-signup', label: 'Sign up' }],\n },\n },\n when: 'My name is Jane Doe and my email is jane@example.com',\n expect: {\n mode: 'any',\n actions: [\n {\n type: 'form_fill',\n payload: {\n fields: [{ fieldId: 'name' }, { fieldId: 'email' }],\n },\n },\n ],\n },\n};\n"],"mappings":"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","names":["import_commander","import_fs","error","ora","chalk","DEFAULT_TIMEOUT_MS","error","message","import_fs","import_path","import_commander","import_promises","import_node_path","import_promises","import_node_path","import_fast_glob","import_path","import_traverse","t","traverse","import_traverse","t","traverse","import_traverse","t","traverse","glob","path","file","error","fs","traverse","handler","info","DESTRUCTIVE_VERB","basename","import_fs","import_path","import_fast_glob","import_traverse","t","fs","error","glob","file","path","traverse","import_fs","parser","import_traverse","t","traverse","path","error","import_fs","parser","import_traverse","t","path","traverse","error","info","glob","file","path","error","import_promises","import_path","import_fast_glob","import_traverse","t","BUTTON_COMPONENTS","INPUT_COMPONENTS","LIST_COMPONENTS","MODAL_COMPONENTS","t","import_traverse","t","path","traverse","DESTRUCTIVE_VERB","glob","file","path","error","fs","traverse","import_fs","import_path","import_fast_glob","import_traverse","t","fs","error","glob","file","path","traverse","resolve","import_promises","import_node_path","util","objectUtil","t","error","path","errorUtil","path","error","errorMap","ctx","result","issues","elements","processed","result","r","ZodFirstPartyTypeKind","z","z","info","z","path","error","path","error","import_node_path","import_commander","import_node_fs","import_commander","import_promises","import_node_path","import_commander","import_fast_glob","import_traverse","t","import_node_path","import_node_fs","import_traverse","t","traverse","_traverse","path","file","traverse","_traverse","file","MagicString","import_node_fs","import_magic_string","import_traverse","t","traverse","_traverse","file","MagicString","glob","file","path","import_commander","import_commander","import_fs","import_path","import_fs","import_path","file","mode","import_fs","import_path","path","program"]}