@alimaandev/ripple 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +125 -23
- package/dist/bin.js +260 -11
- package/dist/bin.js.map +1 -1
- package/package.json +1 -1
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/output/writer.ts","../src/types/cli.ts","../src/utils/fs.ts","../src/utils/errors.ts","../src/utils/tsconfig.ts","../src/config/aliases.ts","../src/config/loader.ts","../src/types/graph.ts","../src/analyzer/confidence.ts","../src/utils/paths.ts","../src/analyzer/categorize.ts","../src/analyzer/humanize.ts","../src/analyzer/impact.ts","../src/analyzer/reverse-traverse.ts","../src/risk/levels.ts","../src/risk/score.ts","../src/analyzer/analyze.ts","../src/formatter/text.ts","../src/ui/icons.ts","../src/ui/progress.ts","../src/ui/color.ts","../src/formatter/table.ts","../src/formatter/tree.ts","../src/ui/brand.ts","../src/ui/gauge.ts","../src/output/report.ts","../src/formatter/json.ts","../src/parser/ts-project.ts","../src/utils/globs.ts","../src/scanner/rules.ts","../src/scanner/discover.ts","../src/parser/exports.ts","../src/parser/imports.ts","../src/parser/symbols.ts","../src/parser/parse.ts","../src/graph/cycles.ts","../src/graph/resolve.ts","../src/graph/build.ts","../src/commands/pipeline.ts","../src/commands/analyze.ts","../src/commands/graph.ts","../src/cli/spinner.ts","../src/commands/doctor.ts","../src/commands/init.ts","../src/cli/program.ts","../package.json","../src/cli/bin.ts"],"names":["fsSync","path","exitCode","chalk","ts","fs","ctx","check"],"mappings":"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","file":"bin.js","sourcesContent":["import type { OutputWriter } from \"../types/cli.js\";\n\n/**\n * Output writers. The CLI writes to stdout (or an injected stream); tests\n * use the in-memory implementation.\n */\n\nexport class TerminalWriter implements OutputWriter {\n constructor(private readonly stream: NodeJS.WritableStream = process.stdout) {}\n\n write(text: string): void {\n this.stream.write(text);\n }\n\n writeLine(text = \"\"): void {\n this.stream.write(`${text}\\n`);\n }\n}\n\nexport class InMemoryWriter implements OutputWriter {\n readonly chunks: string[] = [];\n\n write(text: string): void {\n this.chunks.push(text);\n }\n\n writeLine(text = \"\"): void {\n this.chunks.push(`${text}\\n`);\n }\n\n /** Full captured output. */\n get output(): string {\n return this.chunks.join(\"\");\n }\n\n /** Captured output split into lines (trailing newline removed). */\n get lines(): string[] {\n return this.output.replace(/\\n$/, \"\").split(\"\\n\");\n }\n}\n","/**\n * Shared contracts between the CLI layer and the analysis pipeline.\n * Kept free of commander types so the pipeline stays testable in isolation.\n */\n\n/** Parsed command-line options for `ripple analyze`. */\nexport interface AnalyzeOptions {\n json: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Cap on reverse traversal depth. `undefined` = unlimited. */\n depth?: number;\n /** Path to a config file. Overrides discovery. */\n config?: string;\n}\n\n/** Parsed command-line options for `ripple graph`. */\nexport interface GraphOptions {\n json: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Show the dependency tree of one file instead of project stats. */\n file?: string;\n /** Render dependents (reverse) instead of dependants (forward). */\n reverse: boolean;\n /** Cap on tree depth. */\n depth?: number;\n config?: string;\n}\n\n/** Parsed command-line options for `ripple doctor`. */\nexport interface DoctorOptions {\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n config?: string;\n}\n\n/** Parsed command-line options for `ripple init`. */\nexport interface InitOptions {\n force: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n}\n\n/** Process exit codes used across commands. */\nexport const ExitCode = {\n Success: 0,\n Failure: 1,\n NotFound: 2,\n InvalidConfig: 3,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n/**\n * Abstraction over the destination of rendered output. The real CLI writes to\n * stdout; tests inject an in-memory implementation.\n */\nexport interface OutputWriter {\n write(text: string): void;\n writeLine(text?: string): void;\n}\n\n/** Everything commands need injected; no globals anywhere. */\nexport interface CommandContext {\n writer: OutputWriter;\n /** Stream for error messages (stderr in the real CLI). */\n errorWriter: OutputWriter;\n cwd: string;\n version: string;\n}\n","import fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Thin, safe filesystem helpers. All reads are optional: Ripple must never\n * crash the whole analysis because one file is unreadable.\n */\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function pathExistsSync(filePath: string): boolean {\n try {\n fsSync.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Read a file as UTF-8; returns `undefined` when unreadable. */\nexport async function readFileSafe(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\n/** Read a small JSON-ish file synchronously; returns `undefined` when unreadable. */\nexport function readJsonSafe(filePath: string): unknown | undefined {\n try {\n return JSON.parse(fsSync.readFileSync(filePath, \"utf8\"));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Find the closest package.json above `startDir`. Used to detect project\n * entry points (`main`, `bin`).\n */\nexport async function findPackageJson(startDir: string): Promise<string | undefined> {\n let current = path.resolve(startDir);\n for (;;) {\n const candidate = path.join(current, \"package.json\");\n if (await pathExists(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\n/** Read `main` / `bin` entries of a package.json for entry-point detection. */\nexport async function readPackageEntryPoints(packageJsonPath: string): Promise<string[]> {\n const raw = await readFileSafe(packageJsonPath);\n if (!raw) return [];\n try {\n const manifest = JSON.parse(raw) as { main?: string; bin?: string | Record<string, string> };\n const entries: string[] = [];\n if (typeof manifest.main === \"string\") entries.push(manifest.main);\n if (typeof manifest.bin === \"string\") entries.push(manifest.bin);\n if (manifest.bin && typeof manifest.bin === \"object\")\n entries.push(...Object.values(manifest.bin));\n return entries;\n } catch {\n return [];\n }\n}\n","import { ExitCode } from \"../types/cli.js\";\n\n/**\n * Error type surfaced to the CLI entry point. Carries an exit code and an\n * optional hint that explains how to recover.\n */\nexport class RippleError extends Error {\n readonly exitCode: ExitCode;\n readonly hint?: string;\n\n constructor(message: string, exitCode: ExitCode = ExitCode.Failure, hint?: string) {\n super(message);\n this.name = \"RippleError\";\n this.exitCode = exitCode;\n this.hint = hint;\n }\n}\n\n/** Thrown when a file passed to `ripple analyze` cannot be found. */\nexport function fileNotFound(filePath: string): RippleError {\n return new RippleError(\n `File not found: ${filePath}`,\n ExitCode.NotFound,\n \"Run `ripple graph` to list the files Ripple can analyze.\",\n );\n}\n","import path from \"node:path\";\nimport { ts } from \"ts-morph\";\nimport type { TsconfigInfo } from \"../types/project.js\";\nimport { pathExistsSync } from \"./fs.js\";\n\n/**\n * tsconfig.json loading and alias extraction.\n *\n * Uses the TypeScript compiler API (bundled with ts-morph) so that `extends`,\n * comments and JSONC are handled exactly like the real compiler handles them.\n */\nexport function findTsconfig(startDir: string): string | undefined {\n return ts.findConfigFile(startDir, pathExistsSync, \"tsconfig.json\");\n}\n\nfunction asStringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\n/**\n * Read and parse a tsconfig.json. Returns `undefined` when the file is\n * missing or malformed (callers decide how to surface that).\n */\nexport function readTsconfig(tsconfigPath: string): TsconfigInfo | undefined {\n if (!pathExistsSync(tsconfigPath)) return undefined;\n const readResult = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n if (readResult.error) return undefined;\n\n const dir = path.dirname(tsconfigPath);\n const parsed = ts.parseJsonConfigFileContent(\n readResult.config,\n ts.sys,\n dir,\n undefined,\n tsconfigPath,\n );\n if (parsed.errors.length > 0) return undefined;\n\n const options = parsed.options;\n const paths: Record<string, string[]> = {};\n if (options.paths) {\n for (const [pattern, targets] of Object.entries(options.paths)) {\n paths[pattern] = [...targets];\n }\n }\n\n return {\n path: tsconfigPath,\n dir,\n baseUrl: options.baseUrl ? path.resolve(dir, options.baseUrl) : undefined,\n paths,\n include: asStringArray(readResult.config.include ?? []),\n exclude: asStringArray(readResult.config.exclude ?? []),\n };\n}\n\n/**\n * Match a module specifier against `paths` patterns.\n *\n * Supports a single `*` wildcard in both pattern and replacement\n * (`\"@/*\": [\"./src/*\"]`). Returns the substituted absolute-ish path and the\n * captured wildcard value, or `undefined` when nothing matches.\n */\nexport function matchAlias(\n specifier: string,\n paths: Record<string, string[]>,\n): { target: string; matchedPattern: string } | undefined {\n for (const [pattern, replacements] of Object.entries(paths)) {\n const starIndex = pattern.indexOf(\"*\");\n if (starIndex === -1) {\n if (specifier === pattern) {\n const replacement = replacements[0];\n if (replacement) return { target: replacement, matchedPattern: pattern };\n }\n continue;\n }\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) continue;\n const captured = specifier.slice(prefix.length, specifier.length - suffix.length);\n\n for (const replacement of replacements) {\n const replacementStar = replacement.indexOf(\"*\");\n const target =\n replacementStar === -1\n ? replacement\n : replacement.slice(0, replacementStar) +\n captured +\n replacement.slice(replacementStar + 1);\n return { target, matchedPattern: pattern };\n }\n }\n return undefined;\n}\n","import path from \"node:path\";\nimport type { AliasMap } from \"../types/config.js\";\nimport type { TsconfigInfo } from \"../types/project.js\";\n\n/**\n * Alias normalization.\n *\n * User aliases (`ripple.config.ts`) and tsconfig `paths` are merged into one\n * map of pattern → absolute target. Both support a single `*` wildcard:\n *\n * `{ \"@\": \"./src\" }` → `{ \"@/*\": \"<root>/src/*\" }`\n * tsconfig `\"@/*\": [\"./src/*\"]` → `{ \"@/*\": \"<root>/src/*\" }`\n *\n * Keys without a wildcard are treated as prefixes, so `\"@\"` covers\n * `@/components/Button` the way TypeScript users expect.\n */\n\nconst WILDCARD = \"*\";\n\nfunction hasWildcard(value: string): boolean {\n return value.includes(WILDCARD);\n}\n\n/**\n * Normalize a user-config alias entry against `baseDir`.\n * Returns the pattern and its absolute target, or `undefined` for invalid\n * entries (empty key or non-relative target is allowed but must be absolute\n * after resolution).\n */\nfunction normalizeEntry(\n key: string,\n target: string,\n baseDir: string,\n): { pattern: string; target: string } {\n const trimmedKey = key.replace(/\\/+$/, \"\");\n const trimmedTarget = target.replace(/\\/+$/, \"\");\n\n if (hasWildcard(trimmedKey)) {\n return { pattern: trimmedKey, target: path.resolve(baseDir, trimmedTarget) };\n }\n return {\n pattern: `${trimmedKey}/${WILDCARD}`,\n target: path.join(path.resolve(baseDir, trimmedTarget), WILDCARD),\n };\n}\n\n/**\n * Merge user aliases and tsconfig paths into a single normalized map.\n * User aliases win on pattern collisions.\n */\nexport function buildAliasMap(\n configAliases: Record<string, string>,\n tsconfig: TsconfigInfo | undefined,\n rootDir: string,\n): AliasMap {\n const merged: AliasMap = {};\n\n if (tsconfig) {\n const base = tsconfig.baseUrl ?? tsconfig.dir;\n for (const [pattern, targets] of Object.entries(tsconfig.paths)) {\n const first = targets[0];\n if (!first) continue;\n const absolute = path.isAbsolute(first) ? first : path.resolve(base, first);\n merged[pattern] = absolute;\n }\n }\n\n for (const [key, target] of Object.entries(configAliases)) {\n if (key === \"\") continue;\n const entry = normalizeEntry(key, target, rootDir);\n merged[entry.pattern] = entry.target;\n }\n\n return merged;\n}\n\n/**\n * Substitute a specifier against an alias map. Returns the absolute-ish\n * candidate path or `undefined` when no pattern matches.\n */\nexport function substituteAlias(specifier: string, aliases: AliasMap): string | undefined {\n for (const [pattern, target] of Object.entries(aliases)) {\n const starIndex = pattern.indexOf(WILDCARD);\n if (starIndex === -1) {\n if (specifier === pattern) return target;\n continue;\n }\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) continue;\n const captured = specifier.slice(prefix.length, specifier.length - suffix.length);\n const targetStar = target.indexOf(WILDCARD);\n if (targetStar === -1) return target;\n return target.slice(0, targetStar) + captured + target.slice(targetStar + 1);\n }\n return undefined;\n}\n","import { createJiti } from \"jiti\";\nimport path from \"node:path\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AliasMap, RippleConfig } from \"../types/config.js\";\nimport type { LoadConfigResult, ProjectContext } from \"../types/project.js\";\nimport { pathExistsSync } from \"../utils/fs.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { readTsconfig } from \"../utils/tsconfig.js\";\nimport { buildAliasMap } from \"./aliases.js\";\nimport { formatSchemaIssues, rippleConfigSchema } from \"./schema.js\";\n\n/**\n * Config discovery and loading.\n *\n * Resolution order for `ripple.config.*`: `.ts`, `.mjs`, `.js`, `.cjs`,\n * `.json`. An explicit `--config <path>` always wins. The directory of the\n * resolved config file becomes the project root.\n */\n\nconst CONFIG_CANDIDATES = [\n \"ripple.config.ts\",\n \"ripple.config.mjs\",\n \"ripple.config.js\",\n \"ripple.config.cjs\",\n \"ripple.config.json\",\n] as const;\n\nconst jiti = createJiti(import.meta.url, { interopDefault: true });\n\nfunction findConfigFile(cwd: string, explicitPath: string | undefined): string | undefined {\n if (explicitPath) return path.resolve(cwd, explicitPath);\n for (const candidate of CONFIG_CANDIDATES) {\n const absolute = path.join(cwd, candidate);\n if (pathExistsSync(absolute)) return absolute;\n }\n return undefined;\n}\n\nasync function importConfig(configPath: string): Promise<unknown> {\n let loaded: unknown;\n try {\n loaded = await jiti.import(configPath);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new RippleError(\n `Could not load ${path.basename(configPath)}: ${detail}`,\n ExitCode.InvalidConfig,\n );\n }\n const value = (loaded as { default?: unknown })?.default ?? loaded;\n if (typeof value === \"function\") {\n throw new RippleError(\n `${path.basename(configPath)} must export a plain object, not a function.`,\n ExitCode.InvalidConfig,\n );\n }\n return value;\n}\n\nfunction validateConfig(value: unknown): RippleConfig {\n const result = rippleConfigSchema.safeParse(value);\n if (!result.success) {\n const issues = formatSchemaIssues(result.error);\n throw new RippleError(\n `Invalid config:\\n${issues.map((issue) => ` ${issue}`).join(\"\\n\")}`,\n ExitCode.InvalidConfig,\n );\n }\n return result.data;\n}\n\n/**\n * Load and validate the ripple config. Never throws for a *missing* config —\n * defaults apply. Throws `RippleError` for an explicit-but-missing path or an\n * invalid config file.\n */\nexport async function loadConfig(cwd: string, explicitPath?: string): Promise<LoadConfigResult> {\n const configPath = findConfigFile(cwd, explicitPath);\n\n if (explicitPath && !configPath) {\n throw new RippleError(\n `Config file not found: ${explicitPath}`,\n ExitCode.InvalidConfig,\n \"Pass a path that exists, or remove --config to use defaults.\",\n );\n }\n\n if (!configPath) {\n return { config: rippleConfigSchema.parse({}), rootDir: path.resolve(cwd) };\n }\n\n const raw = await importConfig(configPath);\n const config = validateConfig(raw);\n return { config, configPath, rootDir: path.dirname(configPath) };\n}\n\n/**\n * Assemble the full `ProjectContext`: config + tsconfig facts + merged alias\n * map. The alias map is baked into the context so downstream layers never\n * touch config shapes again.\n */\nexport async function loadProjectContext(\n cwd: string,\n explicitConfigPath?: string,\n): Promise<ProjectContext> {\n const loaded = await loadConfig(cwd, explicitConfigPath);\n const { config, rootDir } = loaded;\n\n const tsconfigPath = path.resolve(rootDir, config.tsconfigPath);\n const tsconfig = readTsconfig(tsconfigPath);\n\n const aliases: AliasMap = buildAliasMap(config.aliases, tsconfig, rootDir);\n\n return {\n rootDir,\n config,\n ...(tsconfig ? { tsconfig } : {}),\n aliases,\n };\n}\n","import type { ParsedFile } from \"./parser.js\";\n\n/**\n * Classification of a resolved import edge.\n */\nexport type EdgeKind = \"internal\" | \"external\" | \"unresolved\";\n\nexport interface ResolvedImport {\n /** The original declaration the edge was derived from. */\n raw: string;\n edgeKind: EdgeKind;\n /**\n * Absolute path of the resolved target. Only set when `edgeKind ===\n * \"internal\"`.\n */\n resolvedPath?: string;\n}\n\nexport interface GraphNode {\n /** Absolute path of the file. */\n path: string;\n parsed: ParsedFile;\n}\n\n/**\n * A circular dependency group: every file that is mutually reachable\n * (strongly connected component). `path` is a representative import chain\n * through the group, `members` the complete sorted member set.\n */\nexport interface Cycle {\n /** Complete sorted member paths of the cycle group. */\n members: string[];\n /** Representative ordered cycle path (first element === last element). */\n path: string[];\n}\n\n/**\n * Aggregate statistics of a graph, computed during build. Feeds the\n * confidence heuristic and `ripple graph` output.\n */\nexport interface GraphStats {\n /** Discovered files. */\n files: number;\n /** Files that parsed without errors. */\n parsed: number;\n /** Internal edges that resolved to a discovered file. */\n internalEdges: number;\n /** Relative/alias edges that resolved to nothing. */\n unresolvedEdges: number;\n /** Edges leaving the analyzed file set (packages, assets). */\n externalEdges: number;\n /** Circular dependency groups. */\n cycles: number;\n}\n\n/**\n * In-memory directed dependency graph.\n *\n * - `forward` maps a file to the set of files it imports.\n * - `reverse` maps a file to the set of files that import it.\n * - `external` maps a file to the set of specifiers that leave the project\n * (node_modules packages, assets, non-discovered files).\n */\nexport interface DependencyGraph {\n nodes: Map<string, GraphNode>;\n forward: Map<string, Set<string>>;\n reverse: Map<string, Set<string>>;\n external: Map<string, Set<string>>;\n cycles: Cycle[];\n stats: GraphStats;\n}\n\nexport function edgeCount(graph: DependencyGraph): number {\n let count = 0;\n for (const targets of graph.forward.values()) {\n count += targets.size;\n }\n return count;\n}\n\nexport function externalEdgeCount(graph: DependencyGraph): number {\n let count = 0;\n for (const targets of graph.external.values()) {\n count += targets.size;\n }\n return count;\n}\n\n/** All file paths that participate in at least one cycle. */\nexport function cycleMemberPaths(graph: DependencyGraph): Set<string> {\n const members = new Set<string>();\n for (const cycle of graph.cycles) {\n for (const path of cycle.members) {\n members.add(path);\n }\n }\n return members;\n}\n","import type { GraphStats } from \"../types/graph.js\";\n\n/**\n * Confidence heuristic: how much of the graph could be analyzed reliably.\n *\n * - Parse rate: fraction of discovered files that parsed without errors.\n * - Resolution rate: fraction of non-external import edges that resolved to\n * a known file.\n * - A cycle touching the analyzed file is a small uncertainty penalty.\n *\n * Range: 0-100, rounded.\n */\nexport function computeConfidence(stats: GraphStats, targetInCycle: boolean): number {\n const parseRate = stats.files === 0 ? 1 : stats.parsed / stats.files;\n const totalEdges = stats.internalEdges + stats.unresolvedEdges;\n const resolutionRate = totalEdges === 0 ? 1 : stats.internalEdges / totalEdges;\n\n let confidence = parseRate * (0.4 + 0.6 * resolutionRate);\n if (targetInCycle) confidence *= 0.95;\n\n return Math.round(Math.min(1, Math.max(0, confidence)) * 100);\n}\n","import path from \"node:path\";\n\n/**\n * Path helpers shared across Ripple.\n *\n * Canonical path keys are POSIX-style normalized absolute paths. On Windows\n * they are lower-cased because the filesystem is case-insensitive; two paths\n * differing only in case must not create two graph nodes.\n */\n\nexport const SOURCE_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\"] as const;\n\nexport const RESOLVABLE_EXTENSIONS = [...SOURCE_EXTENSIONS, \".mjs\", \".cjs\", \".d.ts\"] as const;\n\n/** Convert a path to forward slashes for display and matching. */\nexport function toPosix(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\n/** Normalize a path and make it absolute. */\nexport function normalizeAbsolute(filePath: string, cwd: string): string {\n return path.resolve(cwd, filePath);\n}\n\n/**\n * Canonical key for use in Maps/Sets: normalized, POSIX, and lower-cased on\n * Windows.\n */\nexport function pathKey(filePath: string, cwd: string): string {\n const absolute = normalizeAbsolute(filePath, cwd);\n const posix = toPosix(absolute);\n return process.platform === \"win32\" ? posix.toLowerCase() : posix;\n}\n\n/** Whether a module specifier is a relative import (`./` or `../`). */\nexport function isRelativeSpecifier(specifier: string): boolean {\n return specifier.startsWith(\"./\") || specifier.startsWith(\"../\");\n}\n\n/** Whether the specifier is a bare package import (`react`, `@scope/pkg`). */\nexport function isBareSpecifier(specifier: string): boolean {\n return !isRelativeSpecifier(specifier) && !specifier.startsWith(\"/\");\n}\n\n/** Source file kind from an absolute path. Declaration files are excluded. */\nexport function sourceFileKind(filePath: string): \"ts\" | \"tsx\" | \"js\" | \"jsx\" | undefined {\n if (/\\.d\\.[cm]?ts$/i.test(filePath)) return undefined;\n const ext = path.extname(filePath).toLowerCase();\n return SOURCE_EXTENSIONS.includes(ext as (typeof SOURCE_EXTENSIONS)[number])\n ? (ext.slice(1) as \"ts\" | \"tsx\" | \"js\" | \"jsx\")\n : undefined;\n}\n\n/** The extension-candidates list for resolving an extensionless import. */\nexport function extensionCandidates(basePath: string): string[] {\n return RESOLVABLE_EXTENSIONS.map((ext) => basePath + ext);\n}\n\n/**\n * TS-style JS extension swap: when a specifier imports `./x.js` but only\n * `./x.ts` exists (NodeNext-style projects), the candidate resolves to the TS\n * file.\n */\nexport function jsToTsCandidate(candidate: string): string {\n const ext = path.extname(candidate);\n if (ext === \".js\") return candidate.slice(0, -3) + \".ts\";\n if (ext === \".jsx\") return candidate.slice(0, -4) + \".tsx\";\n if (ext === \".mjs\") return candidate.slice(0, -4) + \".mts\";\n if (ext === \".cjs\") return candidate.slice(0, -4) + \".cts\";\n return candidate;\n}\n\n/** Human-readable relative path (from cwd) for display in output. */\nexport function displayPath(filePath: string, cwd: string): string {\n const relative = path.relative(cwd, filePath);\n return toPosix(relative === \"\" ? path.basename(filePath) : relative);\n}\n\n/**\n * First path segment of `filePath` relative to `root`, used for impact areas.\n * Returns `undefined` when the file is outside the root.\n */\nexport function firstSegment(filePath: string, root: string): string | undefined {\n const relative = toPosix(path.relative(root, filePath));\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) return undefined;\n const segment = relative.split(\"/\")[0];\n return segment && segment !== \"\" ? segment : undefined;\n}\n","import path from \"node:path\";\nimport { findPackageJson, pathExistsSync, readPackageEntryPoints } from \"../utils/fs.js\";\nimport { toPosix } from \"../utils/paths.js\";\nimport type { Category } from \"../types/analysis.js\";\n\n/**\n * Deterministic file categorization heuristics.\n *\n * A file can match several categories (a `page.tsx` is both a route and a\n * component). Everything here is path/name based — no source analysis — so\n * categorization is cheap, stable and easy to document.\n */\n\nconst ROUTE_FILE_NAMES = new Set([\n \"route\",\n \"page\",\n \"layout\",\n \"middleware\",\n \"loading\",\n \"error\",\n \"not-found\",\n]);\n\nconst ROUTE_DIR_NAMES = new Set([\"routes\", \"api\"]);\n\nconst UTILITY_DIR_NAMES = new Set([\"lib\", \"utils\", \"helpers\", \"shared\", \"common\", \"core\"]);\n\nconst COMPONENT_DIR_NAMES = new Set([\"components\", \"ui\"]);\n\nconst ENTRY_FILE_NAMES = new Set([\"index\", \"main\", \"app\", \"server\", \"cli\", \"bin\"]);\n\nconst TEST_SEGMENT = \"__tests__\";\n\nfunction relativeSegments(filePath: string, rootDir: string): string[] {\n const relative = toPosix(path.relative(rootDir, filePath));\n if (relative.startsWith(\"..\")) return [];\n return relative.split(\"/\").filter((segment) => segment !== \"\" && segment !== \".\");\n}\n\nfunction isRouteFile(basename: string): boolean {\n return ROUTE_FILE_NAMES.has(basename);\n}\n\nfunction isTestFile(name: string, segments: string[]): boolean {\n if (segments.includes(TEST_SEGMENT)) return true;\n if (/(^|[._-])(test|spec)([._-]|$)/i.test(name)) return true;\n return segments.some((segment) => segment === \"tests\");\n}\n\nfunction isComponentFile(basename: string, extension: string, segments: string[]): boolean {\n if (extension === \"tsx\" || extension === \"jsx\") return true;\n if (!COMPONENT_DIR_NAMES.has(segments.at(-2) ?? \"\")) return false;\n return /^[A-Z]/.test(basename);\n}\n\nfunction isUtilityFile(segments: string[]): boolean {\n return segments.some((segment) => UTILITY_DIR_NAMES.has(segment));\n}\n\nfunction isEntryFile(filePath: string, rootDir: string, entryPoints: Set<string>): boolean {\n if (entryPoints.has(path.normalize(filePath))) return true;\n\n const relative = toPosix(path.relative(rootDir, filePath));\n if (relative.startsWith(\"..\")) return false;\n const segments = relative.split(\"/\");\n if (segments.length !== 2) return false;\n if (segments[0] !== \"src\" && segments[0] !== \"\") return false;\n\n const basename = segments[1] ?? \"\";\n const dot = basename.lastIndexOf(\".\");\n const name = dot === -1 ? basename : basename.slice(0, dot);\n return ENTRY_FILE_NAMES.has(name);\n}\n\nexport interface CategorizerOptions {\n rootDir: string;\n /** Absolute paths of entry points (package.json `main`/`bin`, conventions). */\n entryPoints: Set<string>;\n}\n\n/**\n * Create a categorizer bound to a project. Returns a function that classifies\n * an absolute file path into zero or more categories.\n */\nexport function createCategorizer(options: CategorizerOptions): (filePath: string) => Category[] {\n const { rootDir, entryPoints } = options;\n\n return (filePath: string): Category[] => {\n const segments = relativeSegments(filePath, rootDir);\n const basename = segments.at(-1) ?? \"\";\n const dot = basename.lastIndexOf(\".\");\n const name = dot === -1 ? basename : basename.slice(0, dot);\n const extension = dot === -1 ? \"\" : basename.slice(dot + 1).toLowerCase();\n\n const categories: Category[] = [];\n\n if (isRouteFile(name)) categories.push(\"route\");\n else if (segments.some((segment) => ROUTE_DIR_NAMES.has(segment))) categories.push(\"route\");\n\n if (isTestFile(name, segments)) categories.push(\"test\");\n if (isComponentFile(name, extension, segments)) categories.push(\"component\");\n if (isUtilityFile(segments)) categories.push(\"utility\");\n if (isEntryFile(filePath, rootDir, entryPoints)) categories.push(\"entry\");\n if (categories.length === 0) categories.push(\"other\");\n\n return categories;\n };\n}\n\n/**\n * Detect entry points: package.json `main`/`bin` plus conventional root\n * entry file names (in the project root or `src/`).\n */\nexport async function detectEntryPoints(rootDir: string): Promise<Set<string>> {\n const entryPoints = new Set<string>();\n\n const packageJsonPath = await findPackageJson(rootDir);\n if (packageJsonPath) {\n const packageDir = path.dirname(packageJsonPath);\n for (const entry of await readPackageEntryPoints(packageJsonPath)) {\n const absolute = path.resolve(packageDir, entry);\n if (pathExistsSync(absolute)) entryPoints.add(path.normalize(absolute));\n }\n }\n\n const baseDirs = [rootDir, path.join(rootDir, \"src\")];\n for (const baseDir of baseDirs) {\n for (const name of ENTRY_FILE_NAMES) {\n for (const extension of [\"ts\", \"tsx\", \"js\", \"jsx\"]) {\n const candidate = path.join(baseDir, `${name}.${extension}`);\n if (pathExistsSync(candidate)) entryPoints.add(path.normalize(candidate));\n }\n }\n }\n\n return entryPoints;\n}\n","/**\n * Turn a directory segment into a human-readable impact-area label:\n *\n * - `user-profile` → `User Profile`\n * - `userProfile` → `User Profile`\n * - `oauth` → `OAuth` (known acronyms use their canonical casing)\n * - `authentication` → `Authentication`\n */\nconst ACRONYM_CANONICAL: Record<string, string> = {\n api: \"API\",\n ui: \"UI\",\n ux: \"UX\",\n oauth: \"OAuth\",\n jwt: \"JWT\",\n http: \"HTTP\",\n https: \"HTTPS\",\n ws: \"WS\",\n sse: \"SSE\",\n db: \"DB\",\n sql: \"SQL\",\n id: \"ID\",\n cli: \"CLI\",\n ci: \"CI\",\n cd: \"CD\",\n csv: \"CSV\",\n json: \"JSON\",\n pdf: \"PDF\",\n cors: \"CORS\",\n url: \"URL\",\n uri: \"URI\",\n uuid: \"UUID\",\n html: \"HTML\",\n css: \"CSS\",\n js: \"JS\",\n ts: \"TS\",\n tsx: \"TSX\",\n jsx: \"JSX\",\n aws: \"AWS\",\n s3: \"S3\",\n sms: \"SMS\",\n mfa: \"MFA\",\n otp: \"OTP\",\n smtp: \"SMTP\",\n rss: \"RSS\",\n};\n\nfunction splitWords(segment: string): string[] {\n const normalized = segment.replace(/[^a-zA-Z0-9]+/g, \" \");\n const matches = normalized.match(/[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|[0-9]+/g);\n return (matches ?? [segment]).map((word) => word.toLowerCase());\n}\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nexport function humanizeArea(segment: string): string {\n const words = splitWords(segment);\n if (words.length === 0) return capitalize(segment);\n return words.map((word) => ACRONYM_CANONICAL[word] ?? capitalize(word)).join(\" \");\n}\n","import type { ImpactSummary, TopImpactArea } from \"../types/analysis.js\";\nimport type { AffectedFile } from \"../types/analysis.js\";\nimport { firstSegment } from \"../utils/paths.js\";\nimport { humanizeArea } from \"./humanize.js\";\n\n/**\n * Aggregate the affected-file map into an `ImpactSummary`: per-category\n * counters, max depth and top impact areas.\n *\n * A file matched by several categories counts once per category — counts\n * therefore do not sum to `affectedFiles`.\n */\n\nconst MAX_IMPACT_AREAS = 5;\n\nexport function buildSummary(\n affected: Map<string, AffectedFile>,\n srcRoot: string,\n confidence: number,\n): ImpactSummary {\n let routes = 0;\n let tests = 0;\n let components = 0;\n let utilities = 0;\n let entries = 0;\n let maxDepth = 0;\n\n const areaCounts = new Map<string, number>();\n\n for (const file of affected.values()) {\n if (file.depth > maxDepth) maxDepth = file.depth;\n if (file.categories.includes(\"route\")) routes++;\n if (file.categories.includes(\"test\")) tests++;\n if (file.categories.includes(\"component\")) components++;\n if (file.categories.includes(\"utility\")) utilities++;\n if (file.categories.includes(\"entry\")) entries++;\n\n const area = firstSegment(file.path, srcRoot);\n if (area) {\n areaCounts.set(area, (areaCounts.get(area) ?? 0) + 1);\n }\n }\n\n const topImpact: TopImpactArea[] = [...areaCounts.entries()]\n .map(([label, count]) => ({ label: humanizeArea(label), count }))\n .sort((a, b) => b.count - a.count || a.label.localeCompare(b.label))\n .slice(0, MAX_IMPACT_AREAS);\n\n return {\n affectedFiles: affected.size,\n routes,\n tests,\n components,\n utilities,\n entries,\n maxDepth,\n topImpact,\n confidence,\n };\n}\n","import type { AffectedFile } from \"../types/analysis.js\";\nimport type { Category } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { cycleMemberPaths } from \"../types/graph.js\";\n\n/**\n * Reverse traversal: BFS over the reverse (importer) adjacency from a target\n * file, collecting every file that could be affected by changing it.\n *\n * - The target itself is never included in the result.\n * - `depth` is the number of import hops from the target (direct dependents\n * are depth 1).\n * - `maxDepth` caps the blast radius; `undefined` means unlimited.\n * - Visited set makes the traversal linear in the reachable subgraph.\n */\n\nexport interface ReverseTraversalOptions {\n maxDepth?: number;\n /** Classifies each visited file; provided by the caller for testability. */\n categorize: (filePath: string) => Category[];\n}\n\nexport interface ReverseTraversalResult {\n affected: Map<string, AffectedFile>;\n maxDepth: number;\n}\n\nexport function reverseTraverse(\n graph: DependencyGraph,\n targetKey: string,\n options: ReverseTraversalOptions,\n): ReverseTraversalResult {\n const { maxDepth, categorize } = options;\n\n const affected: Map<string, AffectedFile> = new Map();\n const visited = new Set<string>([targetKey]);\n const cycleMembers = cycleMemberPaths(graph);\n\n if (!graph.reverse.has(targetKey)) {\n return { affected, maxDepth: 0 };\n }\n\n const queue: Array<{ key: string; depth: number }> = [];\n for (const importer of graph.reverse.get(targetKey) ?? []) {\n queue.push({ key: importer, depth: 1 });\n }\n\n let deepest = 0;\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) break;\n\n if (visited.has(current.key)) continue;\n visited.add(current.key);\n\n deepest = Math.max(deepest, current.depth);\n const node = graph.nodes.get(current.key);\n const filePath = node?.path ?? current.key;\n\n affected.set(current.key, {\n path: filePath,\n depth: current.depth,\n direct: current.depth === 1,\n categories: categorize(filePath),\n inCycle: cycleMembers.has(current.key),\n });\n\n if (maxDepth === undefined || current.depth < maxDepth) {\n for (const importer of graph.reverse.get(current.key) ?? []) {\n if (!visited.has(importer)) {\n queue.push({ key: importer, depth: current.depth + 1 });\n }\n }\n }\n }\n\n return { affected, maxDepth: deepest };\n}\n","import type { RiskThresholds } from \"../types/config.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Map a 0-100 risk score to a level using the configured thresholds.\n */\nexport function scoreToLevel(score: number, thresholds: RiskThresholds): RiskLevel {\n if (score >= thresholds.critical) return \"CRITICAL\";\n if (score >= thresholds.high) return \"HIGH\";\n if (score >= thresholds.medium) return \"MEDIUM\";\n return \"LOW\";\n}\n\n/** Clamp a value into [min, max]. */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/**\n * Log-scale a count into [0, 1]: 0 stays 0, `cap` reaches 1, everything\n * above `cap` saturates. Prevents one huge graph from dominating the score.\n */\nexport function logScale(count: number, cap: number): number {\n if (count <= 0) return 0;\n return clamp(Math.log10(count + 1) / Math.log10(cap + 1), 0, 1);\n}\n","import type { ImpactSummary } from \"../types/analysis.js\";\nimport type { RiskConfig } from \"../types/config.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport type { RiskFactor, RiskResult } from \"../types/risk.js\";\nimport { clamp, logScale, scoreToLevel } from \"./levels.js\";\n\n/**\n * Deterministic weighted risk heuristic.\n *\n * Each factor normalizes a graph signal into [0, 1] (see the doc comments on\n * `FACTORS`). The score is the weighted sum of the factors scaled to 0-100.\n * Factors and thresholds are user-configurable; the defaults sum to 1.0.\n */\n\ninterface RiskInput {\n summary: ImpactSummary;\n targetParsed: ParsedFile;\n targetInCycle: boolean;\n riskConfig: RiskConfig;\n}\n\ninterface FactorDefinition {\n name: string;\n label: string;\n /** Default weight (config overrides). */\n defaultWeight: number;\n compute: (input: RiskInput) => number;\n}\n\n/** Saturation caps: the count at which a factor maxes out. */\nconst CAP_AFFECTED_FILES = 100;\nconst CAP_UTILITIES = 10;\nconst CAP_TESTS = 15;\nconst CAP_ROUTES = 10;\nconst CAP_EXPORTS = 20;\n\nconst FACTORS: FactorDefinition[] = [\n {\n name: \"affectedFiles\",\n label: \"Affected files\",\n defaultWeight: 0.3,\n compute: ({ summary }) => logScale(summary.affectedFiles, CAP_AFFECTED_FILES),\n },\n {\n name: \"entryPoint\",\n label: \"Entry point impacted\",\n defaultWeight: 0.15,\n compute: ({ summary }) => (summary.entries > 0 ? 1 : 0),\n },\n {\n name: \"sharedUtility\",\n label: \"Shared utilities impacted\",\n defaultWeight: 0.15,\n compute: ({ summary }) => clamp(summary.utilities / CAP_UTILITIES, 0, 1),\n },\n {\n name: \"publicExports\",\n label: \"Public export surface\",\n defaultWeight: 0.1,\n compute: ({ targetParsed }) => {\n const { exports } = targetParsed;\n const count =\n exports.named.length + (exports.hasDefault ? 1 : 0) + exports.reExportedFrom.length;\n return clamp(count / CAP_EXPORTS, 0, 1);\n },\n },\n {\n name: \"tests\",\n label: \"Tests affected\",\n defaultWeight: 0.1,\n compute: ({ summary }) => clamp(summary.tests / CAP_TESTS, 0, 1),\n },\n {\n name: \"routes\",\n label: \"Routes affected\",\n defaultWeight: 0.1,\n compute: ({ summary }) => clamp(summary.routes / CAP_ROUTES, 0, 1),\n },\n {\n name: \"cycleMembership\",\n label: \"Circular dependency\",\n defaultWeight: 0.1,\n compute: ({ targetInCycle }) => (targetInCycle ? 1 : 0),\n },\n];\n\nfunction weightFor(definition: FactorDefinition, input: RiskInput): number {\n const configured = input.riskConfig.weights[definition.name as keyof RiskConfig[\"weights\"]];\n return configured ?? definition.defaultWeight;\n}\n\n/**\n * Compute the risk score and per-factor breakdown for an analysis result.\n */\nexport function scoreRisk(input: RiskInput): RiskResult {\n const factors: RiskFactor[] = FACTORS.map((definition) => {\n const weight = weightFor(definition, input);\n const value = definition.compute(input);\n return {\n name: definition.name,\n label: definition.label,\n weight,\n value,\n contribution: Math.round(weight * value * 100 * 100) / 100,\n };\n });\n\n const score = clamp(\n Math.round(factors.reduce((sum, factor) => sum + factor.contribution, 0) * 100) / 100,\n 0,\n 100,\n );\n\n return {\n score,\n level: scoreToLevel(score, input.riskConfig.thresholds),\n factors,\n };\n}\n","import path from \"node:path\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { cycleMemberPaths } from \"../types/graph.js\";\nimport { pathExistsSync } from \"../utils/fs.js\";\nimport { computeConfidence } from \"./confidence.js\";\nimport { createCategorizer } from \"./categorize.js\";\nimport { buildSummary } from \"./impact.js\";\nimport { reverseTraverse } from \"./reverse-traverse.js\";\nimport { scoreRisk } from \"../risk/score.js\";\n\n/**\n * Orchestrates a single `ripple analyze` run on top of an already-built\n * graph. Everything the commands layer needs is injected; the function is\n * pure apart from cheap filesystem existence checks.\n */\n\nexport interface AnalyzeInput {\n graph: DependencyGraph;\n context: ProjectContext;\n /** Absolute paths of detected entry points. */\n entryPoints: Set<string>;\n /** Canonical graph key of the analyzed file. */\n targetKey: string;\n /** Absolute path of the analyzed file. */\n targetPath: string;\n /** Wall time of the whole run, for reporting. */\n durationMs: number;\n /** Cap on traversal depth (undefined = unlimited). */\n maxDepth?: number;\n}\n\n/** The source root (directory holding the source tree) for impact areas. */\nexport function sourceRoot(rootDir: string): string {\n const candidate = path.join(rootDir, \"src\");\n return pathExistsSync(candidate) ? candidate : rootDir;\n}\n\nexport function analyzeFile(input: AnalyzeInput): AnalysisResult {\n const { graph, context, entryPoints, targetKey, targetPath, durationMs, maxDepth } = input;\n\n const node = graph.nodes.get(targetKey);\n if (!node) {\n throw new Error(`Target file is not part of the graph: ${targetPath}`);\n }\n\n const categorize = createCategorizer({ rootDir: context.rootDir, entryPoints });\n const { affected, maxDepth: reachedDepth } = reverseTraverse(graph, targetKey, {\n maxDepth,\n categorize,\n });\n\n const targetInCycle = cycleMemberPaths(graph).has(targetKey);\n const confidence = computeConfidence(graph.stats, targetInCycle);\n const summary = buildSummary(affected, sourceRoot(context.rootDir), confidence);\n\n const risk = scoreRisk({\n summary,\n targetParsed: node.parsed,\n targetInCycle,\n riskConfig: context.config.risk,\n });\n\n return {\n targetPath,\n rootDir: context.rootDir,\n graph,\n affected,\n summary,\n risk,\n targetInCycle,\n durationMs,\n maxDepth: reachedDepth,\n };\n}\n","import chalk from \"chalk\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Terminal text helpers. All functions take a `color` flag so output stays\n * deterministic in tests and in `--json` mode.\n */\n\nexport interface TextStyle {\n color: boolean;\n}\n\n/** Muted/secondary text, e.g. hints and counts. */\nexport function dim(text: string, style: TextStyle): string {\n return style.color ? chalk.dim(text) : text;\n}\n\n/** Emphasized value text. */\nexport function strong(text: string, style: TextStyle): string {\n return style.color ? chalk.bold(text) : text;\n}\n\nconst RISK_COLORS: Record<RiskLevel, (text: string) => string> = {\n LOW: (text) => chalk.green(text),\n MEDIUM: (text) => chalk.yellow(text),\n HIGH: (text) => chalk.magenta(text),\n CRITICAL: (text) => chalk.red.bold(text),\n};\n\n/** Chalk style function for a risk level. */\nexport function riskColor(level: RiskLevel): (text: string) => string {\n return RISK_COLORS[level];\n}\n\n/** Colored risk level badge, e.g. ` HIGH `. */\nexport function riskBadge(level: RiskLevel, style: TextStyle): string {\n return style.color ? RISK_COLORS[level](level) : level;\n}\n\n/** Confidence percentage with a subtle color cue. */\nexport function confidenceText(percent: number, style: TextStyle): string {\n const text = `${percent}%`;\n if (!style.color) return text;\n if (percent >= 90) return chalk.green(text);\n if (percent >= 70) return chalk.yellow(text);\n return chalk.red(text);\n}\n\n/** Humanize a duration in milliseconds. */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\n/** Format a number with a plural-friendly noun, e.g. `7 files`. */\nexport function pluralize(count: number, noun: string, plural = `${noun}s`): string {\n return `${count} ${count === 1 ? noun : plural}`;\n}\n","import figures from \"figures\";\n\n/**\n * CLI glyph registry. `figures` keeps every symbol cross-platform and gives\n * a sensible fallback on consoles that cannot render Unicode.\n */\n\nexport type IconName =\n | \"tick\"\n | \"cross\"\n | \"warning\"\n | \"info\"\n | \"arrowRight\"\n | \"pointer\"\n | \"bullet\"\n | \"ellipsis\"\n | \"circle\";\n\n/** Resolve a named glyph for terminal output. */\nexport function icon(name: IconName): string {\n return figures[name];\n}\n","import chalk from \"chalk\";\nimport { formatDuration } from \"../formatter/text.js\";\nimport { icon } from \"./icons.js\";\n\n/**\n * Staged progress tracker. In interactive terminals each completed stage is\n * printed as a checkmarked line with its elapsed time:\n *\n * ✔ Loading config (2ms)\n * ✔ Building dependency graph (118ms)\n * ✔ Analyzing impact (1ms)\n *\n * Everywhere else (CI, pipes, JSON mode) it is a silent no-op.\n */\n\nexport interface StageTracker {\n /** Finish the previous stage (if any) and announce the next one. */\n next(label: string): void;\n /** Finish the current stage. */\n done(): void;\n}\n\nconst noop: StageTracker = {\n next: () => {},\n done: () => {},\n};\n\nexport function createStageTracker(enabled: boolean): StageTracker {\n if (!enabled || !process.stdout.isTTY) return noop;\n\n let current: string | undefined;\n let from = 0;\n\n const stamp = (label: string, ms: number): void => {\n process.stdout.write(\n `${chalk.green(icon(\"tick\"))} ${label} ${chalk.dim(formatDuration(ms))}\\n`,\n );\n };\n\n return {\n next(label: string): void {\n if (current) stamp(current, Date.now() - from);\n current = label;\n from = Date.now();\n },\n done(): void {\n if (current) stamp(current, Date.now() - from);\n current = undefined;\n },\n };\n}\n","/**\n * Resolve whether terminal output should be styled. Honors the explicit\n * `--no-color` flag first, then the standard `NO_COLOR` environment\n * variable (https://no-color.org). Actual ANSI emission is left to chalk,\n * which further disables itself when the stream is not a TTY.\n */\nexport function resolveColor(requested: boolean | undefined): boolean {\n if (requested === false) return false;\n const noColor = process.env.NO_COLOR;\n return noColor === undefined || noColor === \"\";\n}\n","/**\n * Simple aligned table rendering. Cells are padded to the widest cell in\n * their column; rows are joined with two spaces.\n */\n\nexport interface TableColumn {\n header: string;\n /** Right-align numeric-ish columns. */\n align?: \"left\" | \"right\";\n}\n\nexport function renderTable(columns: TableColumn[], rows: string[][]): string {\n const widths = columns.map((column, index) => {\n const cells = [column.header, ...rows.map((row) => row[index] ?? \"\")];\n return Math.max(...cells.map((cell) => cell.length));\n });\n\n const pad = (value: string, index: number): string => {\n const width = widths[index] ?? value.length;\n return columns[index]?.align === \"right\" ? value.padStart(width) : value.padEnd(width);\n };\n\n const lines: string[] = [];\n lines.push(columns.map((column, index) => pad(column.header, index)).join(\" \"));\n for (const row of rows) {\n lines.push(row.map((cell, index) => pad(cell, index)).join(\" \"));\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Render a key-value block with aligned values:\n *\n * Risk HIGH\n * Affected 7 files\n */\nexport function renderKeyValue(entries: Array<[string, string]>): string {\n const width = Math.max(...entries.map(([key]) => key.length));\n return entries.map(([key, value]) => `${key.padEnd(width)} ${value}`).join(\"\\n\");\n}\n","import treeify from \"treeify\";\nimport type { TreeObject } from \"treeify\";\n\n/**\n * Tree rendering on top of `treeify`:\n *\n * ├─ src/index.ts\n * │ └─ src/main.ts\n *\n * `treeify` is a tiny pure function (no ink, no DOM), which keeps this layer\n * trivially testable. Leaf values are empty strings; `showValues` is off.\n */\n\nexport interface TreeNode {\n label: string;\n children?: TreeNode[];\n}\n\nfunction toTreeify(node: TreeNode): string | TreeObject {\n if (!node.children || node.children.length === 0) return \"\";\n const branch: TreeObject = {};\n for (const child of node.children) {\n branch[child.label] = toTreeify(child);\n }\n return branch;\n}\n\nexport function renderTree(nodes: TreeNode[]): string {\n if (nodes.length === 0) return \"\";\n const root: TreeObject = {};\n for (const node of nodes) {\n root[node.label] = toTreeify(node);\n }\n return treeify.asTree(root, false, false).trimEnd();\n}\n","import boxen from \"boxen\";\nimport chalk from \"chalk\";\nimport type { TextStyle } from \"../formatter/text.js\";\nimport { icon } from \"./icons.js\";\n\n/**\n * Brand identity primitives: the header card shown at the top of every\n * interactive command and thin hairline dividers between sections.\n */\n\nexport interface BrandOptions {\n /** Command label, e.g. `impact analysis`. */\n label: string;\n /** Semantic version to annotate the header with. */\n version?: string;\n style: TextStyle;\n}\n\n/** Width of the hairline divider (roughly half a terminal). */\nconst DIVIDER_WIDTH = 38;\n\n/**\n * Render the branded header. Colored terminals get a boxed banner:\n *\n * ╭─ ripple ───────────────────────────────╮\n * │ ❯ impact analysis · v0.1.1 │\n * ╰────────────────────────────────────────╯\n *\n * Colorless output falls back to a single plain line.\n */\nexport function brandHeader(options: BrandOptions): string {\n const { label, version, style } = options;\n if (!style.color) {\n return `ripple — ${label}${version ? ` · v${version}` : \"\"}`;\n }\n const tagline = `${icon(\"pointer\")} ${label}${version ? ` · v${version}` : \"\"}`;\n return boxen(` ${tagline}`, {\n padding: { left: 1, right: 1 },\n title: \"ripple\",\n borderStyle: \"round\",\n borderColor: \"cyan\",\n });\n}\n\n/**\n * Section header with a hairline separator above it in colored output:\n *\n * ──────────────────────────────────────────\n * Top impact\n */\nexport function sectionHeader(title: string, style: TextStyle): string {\n if (!style.color) return title;\n return `${chalk.dim(\"─\".repeat(DIVIDER_WIDTH))}\\n${chalk.bold(title)}`;\n}\n","import type { TextStyle } from \"../formatter/text.js\";\nimport { riskColor } from \"../formatter/text.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Risk gauge rendering. A 10-cell bar filled proportionally to the 0-100\n * score and tinted with the risk level color, e.g.:\n *\n * MEDIUM · 34.4/100 ███░░░░░░░\n *\n * The bar is color-only; colorless output omits it entirely so logs and\n * pipes stay clean and deterministic.\n */\n\nconst CELLS = 10;\nconst FILL = \"█\";\nconst EMPTY = \"░\";\n\nexport function riskGauge(score: number, level: RiskLevel, style: TextStyle): string {\n if (!style.color) return \"\";\n const filled = Math.max(0, Math.min(CELLS, Math.round((score / 100) * CELLS)));\n return riskColor(level)(FILL.repeat(filled) + EMPTY.repeat(CELLS - filled));\n}\n\n/** Cells filled for a score, exported for tests. */\nexport function filledCells(score: number): number {\n return Math.max(0, Math.min(CELLS, Math.round((score / 100) * CELLS)));\n}\n","import type { AnalysisResult } from \"../types/analysis.js\";\nimport type { AnalyzeJsonReport, GraphJsonReport } from \"../types/output.js\";\nimport type { OutputWriter } from \"../types/cli.js\";\nimport type { DependencyGraph, GraphStats } from \"../types/graph.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { renderKeyValue, renderTable, type TableColumn } from \"../formatter/table.js\";\nimport { renderTree, type TreeNode } from \"../formatter/tree.js\";\nimport {\n confidenceText,\n dim,\n formatDuration,\n pluralize,\n riskBadge,\n strong,\n type TextStyle,\n} from \"../formatter/text.js\";\nimport { brandHeader, sectionHeader } from \"../ui/brand.js\";\nimport { riskGauge } from \"../ui/gauge.js\";\nimport { icon } from \"../ui/icons.js\";\n\n/**\n * Report rendering. Terminal output is built here; JSON payloads are built\n * as plain data and serialized by `src/formatter/json.ts`.\n */\n\nexport interface ReportOptions {\n /** Working directory used to relativize display paths. */\n cwd: string;\n /** Whether to emit ANSI colors and styled layout. */\n color: boolean;\n /** Extra sections (risk factor breakdown). */\n verbose: boolean;\n /** Package version shown in the header card. */\n version?: string;\n /** Cap on affected files listed in the terminal tree. */\n listLimit?: number;\n}\n\nconst DEFAULT_LIST_LIMIT = 20;\n\nconst textStyle = (options: ReportOptions): TextStyle => ({ color: options.color });\n\n/** Project-relative path for display, with optional depth/cycle suffixes. */\nfunction fileLabel(filePath: string, depth: number, inCycle: boolean, style: TextStyle): string {\n const parts: string[] = [dim(filePath, style)];\n if (depth >= 0) parts.push(dim(`· depth ${depth}`, style));\n if (inCycle) parts.push(dim(\"· cycle\", style));\n return parts.join(\" \");\n}\n\n/** Impact categories inline, e.g. `4 routes · 2 components · 1 test`. */\nfunction impactLine(result: AnalysisResult, style: TextStyle): string {\n const { summary } = result;\n const parts: string[] = [];\n if (summary.routes > 0) parts.push(pluralize(summary.routes, \"route\"));\n if (summary.components > 0) parts.push(pluralize(summary.components, \"component\"));\n if (summary.tests > 0) parts.push(pluralize(summary.tests, \"test\"));\n if (summary.utilities > 0) parts.push(pluralize(summary.utilities, \"utility\"));\n return parts.length > 0 ? parts.join(\" · \") : dim(\"none\", style);\n}\n\n/** Build the affected-file tree: depth-1 files are roots, deeper files are\n * nested under the first (deterministic) affected importer. */\nfunction buildAffectedTree(result: AnalysisResult, cwd: string, style: TextStyle): TreeNode[] {\n const { affected, graph } = result;\n const sorted = [...affected.entries()].sort(\n ([, a], [, b]) => a.depth - b.depth || a.path.localeCompare(b.path),\n );\n\n const nodesByKey = new Map<string, TreeNode & { children: TreeNode[] }>();\n const depthByKey = new Map<string, number>();\n for (const [key, file] of sorted) {\n const node: TreeNode & { children: TreeNode[] } = { label: \"\", children: [] };\n node.label = fileLabel(displayPath(file.path, cwd), file.depth, file.inCycle, style);\n nodesByKey.set(key, node);\n depthByKey.set(key, file.depth);\n }\n\n const roots: TreeNode[] = [];\n for (const [key, file] of sorted) {\n const node = nodesByKey.get(key);\n if (!node) continue;\n\n if (file.depth === 1) {\n roots.push(node);\n continue;\n }\n\n const importers = graph.reverse.get(key) ?? [];\n const parents = [...importers]\n .filter(\n (candidate) => depthByKey.get(candidate) === file.depth - 1 && nodesByKey.has(candidate),\n )\n .sort((a, b) => (depthByKey.get(a) ?? 0) - (depthByKey.get(b) ?? 0) || a.localeCompare(b));\n\n const parent = parents[0] ? nodesByKey.get(parents[0]) : undefined;\n if (parent) {\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n return roots;\n}\n\n/** Render the full `ripple analyze` terminal report. */\nexport function renderAnalyzeReport(\n result: AnalysisResult,\n options: ReportOptions,\n writer: OutputWriter,\n): void {\n const style = textStyle(options);\n const { summary, risk } = result;\n const file = displayPath(result.targetPath, options.cwd);\n\n writer.writeLine(brandHeader({ label: \"impact analysis\", version: options.version, style }));\n writer.writeLine();\n\n const score = risk.score.toFixed(1);\n const gauge = riskGauge(risk.score, risk.level, style);\n const rows: Array<[string, string]> = [\n [\"File\", file],\n [\"Risk\", `${riskBadge(risk.level, style)} · ${score}/100${gauge ? ` ${gauge}` : \"\"}`],\n [\"Impact\", impactLine(result, style)],\n [\"Affected\", pluralize(summary.affectedFiles, \"file\")],\n [\"Max depth\", String(summary.maxDepth)],\n [\"Confidence\", confidenceText(summary.confidence, style)],\n [\"Duration\", dim(formatDuration(result.durationMs), style)],\n ];\n const width = Math.max(...rows.map(([key]) => key.length));\n for (const [key, value] of rows) {\n writer.writeLine(`${key.padEnd(width)} ${value}`);\n }\n writer.writeLine();\n\n writer.writeLine(sectionHeader(\"Top impact\", style));\n for (const area of summary.topImpact) {\n writer.writeLine(\n `${icon(\"bullet\")} ${strong(area.label, style)} ${dim(`(${area.count})`, style)}`,\n );\n }\n writer.writeLine();\n\n writer.writeLine(sectionHeader(\"Circular dependencies\", style));\n if (result.graph.cycles.length === 0) {\n writer.writeLine(dim(\"none\", style));\n } else {\n for (const cycle of result.graph.cycles) {\n const chain = cycle.path\n .map((key) => {\n const node = result.graph.nodes.get(key);\n return displayPath(node?.path ?? key, options.cwd);\n })\n .join(` ${icon(\"arrowRight\")} `);\n writer.writeLine(`${icon(\"circle\")} ${chain}`);\n }\n }\n writer.writeLine();\n\n if (summary.affectedFiles > 0) {\n writer.writeLine(sectionHeader(`Affected files (${summary.affectedFiles})`, style));\n const tree = buildAffectedTree(result, options.cwd, style);\n writer.writeLine(renderTree(tree));\n const limit = options.listLimit ?? DEFAULT_LIST_LIMIT;\n if (summary.affectedFiles > limit) {\n writer.writeLine(\n dim(`${summary.affectedFiles - limit} more… use --json for the full list`, style),\n );\n }\n writer.writeLine();\n }\n\n if (options.verbose) {\n writer.writeLine(sectionHeader(\"Risk factors\", style));\n const columns: TableColumn[] = [\n { header: \"Factor\" },\n { header: \"Weight\" },\n { header: \"Signal\" },\n { header: \"Points\" },\n ];\n const rowsVerbose = risk.factors.map((factor) => [\n factor.label,\n factor.weight.toFixed(2),\n factor.value.toFixed(2),\n factor.contribution.toFixed(2),\n ]);\n writer.writeLine(renderTable(columns, rowsVerbose));\n writer.writeLine();\n }\n\n if (style.color) {\n writer.writeLine(\n dim(`${icon(\"info\")} Tip: run \"ripple doctor\" to check project health`, style),\n );\n }\n}\n\n/** Build the machine-readable `analyze --json` payload. */\nexport function buildAnalyzeJsonReport(\n result: AnalysisResult,\n version: string,\n cwd: string,\n): AnalyzeJsonReport {\n const realPath = (key: string): string => result.graph.nodes.get(key)?.path ?? key;\n\n const affected = [...result.affected.values()]\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((file) => ({ ...file, path: displayPath(file.path, cwd) }));\n\n return {\n tool: \"ripple\",\n version,\n command: \"analyze\",\n file: displayPath(result.targetPath, cwd),\n risk: result.risk,\n summary: result.summary,\n affected,\n cycles: result.graph.cycles.map((cycle) => ({\n members: cycle.members.map((key) => displayPath(realPath(key), cwd)),\n path: cycle.path.map((key) => displayPath(realPath(key), cwd)),\n })),\n targetInCycle: result.targetInCycle,\n durationMs: result.durationMs,\n };\n}\n\nexport interface GraphReportInput {\n stats: GraphStats;\n cycles: DependencyGraph[\"cycles\"];\n nodes: DependencyGraph[\"nodes\"];\n cwd: string;\n /** For `ripple graph <file>`: forward and reverse file lists. */\n forward?: string[];\n reverse?: string[];\n}\n\n/** Render the `ripple graph` terminal report. */\nexport function renderGraphReport(\n input: GraphReportInput,\n options: ReportOptions,\n writer: OutputWriter,\n): void {\n const style = textStyle(options);\n const { stats } = input;\n\n writer.writeLine(brandHeader({ label: \"dependency graph\", version: options.version, style }));\n writer.writeLine();\n\n writer.writeLine(\n renderKeyValue([\n [\"Files\", String(stats.files)],\n [\"Edges\", String(stats.internalEdges)],\n [\"External\", String(stats.externalEdges)],\n [\"Unresolved\", String(stats.unresolvedEdges)],\n [\"Circular groups\", String(stats.cycles)],\n ]),\n );\n writer.writeLine();\n\n if (input.forward) {\n writer.writeLine(sectionHeader(\"Dependants (forward)\", style));\n writer.writeLine(renderTree(input.forward.map((path) => ({ label: path }))));\n writer.writeLine();\n }\n if (input.reverse) {\n writer.writeLine(sectionHeader(\"Dependents (reverse)\", style));\n writer.writeLine(renderTree(input.reverse.map((path) => ({ label: path }))));\n writer.writeLine();\n }\n\n writer.writeLine(sectionHeader(\"Circular dependencies\", style));\n if (input.cycles.length === 0) {\n writer.writeLine(dim(\"none\", style));\n } else {\n for (const cycle of input.cycles) {\n const chain = cycle.path\n .map((key) => {\n const node = input.nodes.get(key);\n return displayPath(node?.path ?? key, input.cwd);\n })\n .join(` ${icon(\"arrowRight\")} `);\n writer.writeLine(`${icon(\"circle\")} ${chain}`);\n }\n }\n}\n\n/** Build the machine-readable `graph --json` payload. */\nexport function buildGraphJsonReport(input: GraphReportInput, version: string): GraphJsonReport {\n const realPath = (key: string): string => input.nodes.get(key)?.path ?? key;\n return {\n tool: \"ripple\",\n version,\n command: \"graph\",\n fileCount: input.stats.files,\n edgeCount: input.stats.internalEdges,\n externalEdgeCount: input.stats.externalEdges,\n cycles: input.cycles.map((cycle) => ({\n members: cycle.members.map((key) => displayPath(realPath(key), input.cwd)),\n path: cycle.path.map((key) => displayPath(realPath(key), input.cwd)),\n })),\n ...(input.forward ? { forward: input.forward } : {}),\n ...(input.reverse ? { reverse: input.reverse } : {}),\n };\n}\n","/** Serialize a report object to pretty JSON. */\nexport function serializeJson(report: unknown): string {\n return `${JSON.stringify(report, null, 2)}\\n`;\n}\n","import { Project, ts } from \"ts-morph\";\n\n/**\n * Shared ts-morph `Project` factory.\n *\n * One project is created per analysis run and reused for every file:\n * ts-morph parses lazily per source file, so this keeps memory bounded while\n * avoiding per-file project overhead. Files are added individually — the\n * tsconfig is never auto-loaded, since Ripple controls discovery itself.\n */\nexport function createTsProject(): Project {\n return new Project({\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n allowJs: true,\n checkJs: false,\n jsx: ts.JsxEmit.Preserve,\n noEmit: true,\n target: ts.ScriptTarget.ESNext,\n },\n });\n}\n","import fg from \"fast-glob\";\n\n/**\n * File discovery on top of fast-glob.\n *\n * Patterns are resolved against `cwd`; results are absolute native paths.\n * A file may match several `include` patterns; results are deduplicated.\n */\n\nexport interface GlobOptions {\n cwd: string;\n /** Glob patterns to include. */\n patterns: string[];\n /** Glob patterns to ignore. */\n ignore: string[];\n}\n\nexport async function globFiles(options: GlobOptions): Promise<string[]> {\n const matches = await fg(options.patterns, {\n cwd: options.cwd,\n ignore: options.ignore,\n onlyFiles: true,\n absolute: true,\n unique: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n });\n return matches;\n}\n\n/** Convert a plain directory/segment name to an ignore glob that matches it at any depth. */\nexport function toIgnoreGlob(segment: string): string {\n const trimmed = segment.replace(/^\\/+|\\/+$/g, \"\");\n if (trimmed === \"\") return \"\";\n const glob = trimmed.includes(\"*\") || trimmed.includes(\"{\") ? trimmed : `**/${trimmed}/**`;\n return glob;\n}\n","import { sourceFileKind, SOURCE_EXTENSIONS } from \"../utils/paths.js\";\n\n/**\n * Canonical discovery rules: which extensions count as source files and which\n * directories are ignored by default. `src/config/defaults.ts` imports the\n * default ignore names from here so the knowledge lives in exactly one place.\n */\n\nexport const SOURCE_EXTENSION_GLOB = `*.{${SOURCE_EXTENSIONS.map((e) => e.slice(1)).join(\",\")}}`;\n\n/** Extensions accepted by the scanner. */\nexport const STANDARD_IGNORE_NAMES = [\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \"out\",\n \".git\",\n] as const;\n\n/** Whether a file path ends with a discoverable source extension. */\nexport function isSourceFile(filePath: string): boolean {\n return sourceFileKind(filePath) !== undefined;\n}\n","import { globFiles, toIgnoreGlob } from \"../utils/globs.js\";\nimport { isSourceFile } from \"./rules.js\";\n\n/**\n * Recursive source-file discovery for a project.\n *\n * Combines the configured `include` globs with the configured `ignore`\n * entries (plain directory names are converted to catch-all globs) and\n * filters results down to source extensions. Files may match multiple\n * patterns; the result is deduplicated and sorted for determinism.\n */\n\nexport interface DiscoveryOptions {\n rootDir: string;\n include: string[];\n ignore: string[];\n}\n\nexport async function discoverSourceFiles(options: DiscoveryOptions): Promise<string[]> {\n const ignoreGlobs = options.ignore\n .map(toIgnoreGlob)\n .filter((glob) => glob !== \"\")\n .concat([\"**/node_modules/**\"]);\n\n const files = await globFiles({\n cwd: options.rootDir,\n patterns: options.include,\n ignore: ignoreGlobs,\n });\n\n return files.filter(isSourceFile).sort((a, b) => a.localeCompare(b));\n}\n","import type { SourceFile } from \"ts-morph\";\nimport type { ExportInfo } from \"../types/parser.js\";\n\n/**\n * Extract the public export surface of a file:\n *\n * - `export const x`, `export function x`, `export class X`, ... (declarations)\n * - `export default ...`\n * - re-exports: `export { x } from \"...\"` and `export * from \"...\"`\n */\nexport function extractExports(sourceFile: SourceFile): ExportInfo {\n const named: string[] = [];\n const reExportedFrom: string[] = [];\n const reExportedAll: string[] = [];\n\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n const namedExports = decl.getNamedExports();\n\n if (specifier) {\n if (namedExports.length === 0) {\n reExportedAll.push(specifier);\n } else {\n reExportedFrom.push(specifier);\n }\n continue;\n }\n\n for (const namedExport of namedExports) {\n named.push(namedExport.getName());\n }\n }\n\n for (const statement of sourceFile.getVariableStatements()) {\n if (!statement.isExported()) continue;\n for (const declaration of statement.getDeclarations()) {\n named.push(declaration.getName());\n }\n }\n\n for (const fn of sourceFile.getFunctions()) {\n if (!fn.isExported()) continue;\n const name = fn.getName();\n if (name) named.push(name);\n }\n\n for (const cls of sourceFile.getClasses()) {\n if (!cls.isExported()) continue;\n const name = cls.getName();\n if (name) named.push(name);\n }\n\n for (const en of sourceFile.getEnums()) {\n if (!en.isExported()) continue;\n const name = en.getName();\n if (name) named.push(name);\n }\n\n for (const iface of sourceFile.getInterfaces()) {\n if (!iface.isExported()) continue;\n named.push(iface.getName());\n }\n\n for (const alias of sourceFile.getTypeAliases()) {\n if (!alias.isExported()) continue;\n named.push(alias.getName());\n }\n\n const hasDefault =\n sourceFile.getExportAssignments().length > 0 ||\n sourceFile.getFunctions().some((fn) => fn.isDefaultExport()) ||\n sourceFile.getClasses().some((cls) => cls.isDefaultExport());\n\n named.sort();\n return { named, hasDefault, reExportedFrom, reExportedAll };\n}\n","import { SyntaxKind, type ImportEqualsDeclaration, type SourceFile } from \"ts-morph\";\nimport type { ImportDeclaration, ImportSpecifier } from \"../types/parser.js\";\n\n/**\n * Extract every module specifier a file depends on:\n *\n * - `import ... from \"x\"` / bare `import \"x\"`\n * - `export { ... } from \"x\"` / `export * from \"x\"`\n * - `import(\"x\")` dynamic imports\n * - `require(\"x\")` and `import x = require(\"x\")`\n *\n * Only statically analyzable string-literal specifiers are reported.\n */\n\nfunction specifierFor(\n imported: string,\n alias: string | undefined,\n isType: boolean,\n): ImportSpecifier {\n return alias && alias !== imported\n ? { name: imported, alias, isType }\n : { name: imported, isType };\n}\n\nexport function extractImports(sourceFile: SourceFile): ImportDeclaration[] {\n const declarations: ImportDeclaration[] = [];\n\n for (const decl of sourceFile.getImportDeclarations()) {\n declarations.push({\n raw: decl.getModuleSpecifierValue(),\n kind: \"import\",\n isTypeOnly: decl.isTypeOnly(),\n specifiers: decl\n .getNamedImports()\n .map((named) =>\n specifierFor(named.getName(), named.getAliasNode()?.getText(), named.isTypeOnly()),\n ),\n });\n }\n\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n if (!specifier) continue;\n declarations.push({\n raw: specifier,\n kind: \"export-from\",\n isTypeOnly: decl.isTypeOnly(),\n specifiers: decl\n .getNamedExports()\n .map((named) =>\n specifierFor(named.getName(), named.getAliasNode()?.getText(), named.isTypeOnly()),\n ),\n });\n }\n\n const importEqualsNodes = sourceFile\n .getDescendantsOfKind(SyntaxKind.ImportEqualsDeclaration)\n .map((node) => node as ImportEqualsDeclaration);\n for (const decl of importEqualsNodes) {\n const literal = decl.getFirstDescendantByKind(SyntaxKind.StringLiteral);\n if (literal) {\n declarations.push({\n raw: literal.getLiteralText(),\n kind: \"require\",\n isTypeOnly: false,\n specifiers: [],\n });\n }\n }\n\n for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n const callee = call.getExpression().getText();\n if (callee !== \"require\" && callee !== \"import\") continue;\n const argument = call.getArguments()[0];\n if (!argument?.isKind(SyntaxKind.StringLiteral)) continue;\n declarations.push({\n raw: argument.getLiteralText(),\n kind: callee === \"require\" ? \"require\" : \"dynamic\",\n isTypeOnly: false,\n specifiers: [],\n });\n }\n\n return declarations;\n}\n","import type { SourceFile } from \"ts-morph\";\nimport type { SymbolInfo } from \"../types/parser.js\";\n\n/**\n * Extract top-level declarations of a file. Used by the risk engine to\n * estimate the public surface and by categorization to classify files.\n */\nexport function extractSymbols(sourceFile: SourceFile): SymbolInfo {\n return {\n functions: sourceFile.getFunctions().map((fn) => fn.getName() ?? \"(default)\"),\n classes: sourceFile.getClasses().map((cls) => cls.getName() ?? \"(default)\"),\n interfaces: sourceFile.getInterfaces().map((iface) => iface.getName()),\n enums: sourceFile.getEnums().map((en) => en.getName()),\n typeAliases: sourceFile.getTypeAliases().map((alias) => alias.getName()),\n };\n}\n","import type { Project, SourceFile } from \"ts-morph\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport { sourceFileKind } from \"../utils/paths.js\";\nimport { extractExports } from \"./exports.js\";\nimport { extractImports } from \"./imports.js\";\nimport { extractSymbols } from \"./symbols.js\";\n\n/**\n * Parse one file into a `ParsedFile`. A parse failure must never abort the\n * analysis: the error is recorded and the file keeps an empty surface so it\n * still participates in the graph as a node.\n */\nexport function parseSourceFile(project: Project, filePath: string): ParsedFile {\n let sourceFile: SourceFile;\n try {\n sourceFile = project.addSourceFileAtPath(filePath);\n } catch (error) {\n return {\n path: filePath,\n kind: sourceFileKind(filePath) ?? \"ts\",\n imports: [],\n exports: { named: [], hasDefault: false, reExportedFrom: [], reExportedAll: [] },\n symbols: { functions: [], classes: [], interfaces: [], enums: [], typeAliases: [] },\n parseError: error instanceof Error ? error.message : String(error),\n };\n }\n\n return {\n path: filePath,\n kind: sourceFileKind(filePath) ?? \"ts\",\n imports: extractImports(sourceFile),\n exports: extractExports(sourceFile),\n symbols: extractSymbols(sourceFile),\n };\n}\n\n/** Parse many files, reusing the shared project. Never throws. */\nexport function parseMany(project: Project, filePaths: string[]): ParsedFile[] {\n return filePaths.map((filePath) => parseSourceFile(project, filePath));\n}\n","import type { Cycle, DependencyGraph } from \"../types/graph.js\";\n\n/**\n * Cycle detection via Kosaraju's strongly-connected-components algorithm,\n * implemented iteratively so deep import chains can never overflow the call\n * stack.\n *\n * Every SCC with more than one node (or a self-loop) is a circular\n * dependency group. For each group we additionally walk one representative\n * cycle path so output shows the *actual import chain*, not just the member\n * set.\n *\n * Ripple reports cycle *groups*: two files in the same SCC are reported once,\n * not once per back edge.\n */\n\n/** Find SCCs in `graph`. Returns groups of node keys. */\nexport function findCycles(graph: DependencyGraph): Cycle[] {\n const nodeKeys = [...graph.nodes.keys()];\n\n // Pass 1: finish order via iterative DFS on the forward graph.\n const visited = new Set<string>();\n const finishOrder: string[] = [];\n\n for (const start of nodeKeys) {\n if (visited.has(start)) continue;\n const stack: Array<[node: string, neighborIndex: number]> = [[start, 0]];\n visited.add(start);\n\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n if (top === undefined) break;\n const [node, index] = top;\n const neighbors = [...(graph.forward.get(node) ?? [])];\n\n if (index < neighbors.length) {\n top[1] = index + 1;\n const neighbor = neighbors[index];\n if (neighbor === undefined) continue;\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n stack.push([neighbor, 0]);\n }\n } else {\n stack.pop();\n finishOrder.push(node);\n }\n }\n }\n\n // Pass 2: process in reverse finish order on the reverse graph.\n const componentOf = new Map<string, number>();\n const components: string[][] = [];\n\n for (let i = finishOrder.length - 1; i >= 0; i--) {\n const start = finishOrder[i];\n if (start === undefined || componentOf.has(start)) continue;\n\n const component: string[] = [];\n const stack = [start];\n componentOf.set(start, components.length);\n\n while (stack.length > 0) {\n const node = stack.pop();\n if (node === undefined) continue;\n component.push(node);\n for (const neighbor of graph.reverse.get(node) ?? []) {\n if (!componentOf.has(neighbor)) {\n componentOf.set(neighbor, components.length);\n stack.push(neighbor);\n }\n }\n }\n\n components.push(component);\n }\n\n const cycles: Cycle[] = [];\n for (const component of components) {\n if (component.length < 2) {\n const single = component[0];\n if (single !== undefined && graph.forward.get(single)?.has(single)) {\n cycles.push({ members: [single], path: [single, single] });\n }\n continue;\n }\n\n const members = [...component].sort();\n const componentSet = new Set(component);\n const path = representativeCyclePath(graph, component, componentSet);\n cycles.push({ members, path: path ?? [members[0]!, members[0]!] });\n }\n\n cycles.sort(\n (a, b) => a.members.length - b.members.length || a.members[0]!.localeCompare(b.members[0]!),\n );\n return cycles;\n}\n\n/**\n * Walk forward edges within the component until a node is revisited; the\n * segment from the first occurrence forms a cycle path (start == end).\n */\nfunction representativeCyclePath(\n graph: DependencyGraph,\n component: string[],\n componentSet: Set<string>,\n): string[] | undefined {\n const inPath = new Set<string>();\n const path: string[] = [];\n let current: string | undefined = component[0];\n\n for (let steps = 0; steps <= component.length * 2 && current !== undefined; steps++) {\n const firstOccurrence = inPath.has(current);\n if (firstOccurrence) {\n const start = path.indexOf(current);\n if (start === -1) return undefined;\n const cycle = path.slice(start);\n if (cycle.length > 1 || graph.forward.get(current)?.has(current)) {\n cycle.push(current);\n return cycle;\n }\n return undefined;\n }\n inPath.add(current);\n path.push(current);\n\n const next = [...(graph.forward.get(current) ?? [])].find((candidate) =>\n componentSet.has(candidate),\n );\n current = next;\n }\n\n return undefined;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { substituteAlias } from \"../config/aliases.js\";\nimport type { AliasMap } from \"../types/config.js\";\nimport type { EdgeKind } from \"../types/graph.js\";\nimport { extensionCandidates, jsToTsCandidate, pathKey } from \"../utils/paths.js\";\n\n/**\n * Module specifier resolution.\n *\n * Resolution pipeline for one import declaration:\n *\n * 1. Alias substitution (`ripple.config.ts` aliases + tsconfig `paths`).\n * 2. Relative/bare classification.\n * 3. Candidate probing: exact, extension candidates, directory index files.\n * `.js` specifiers may resolve to `.ts` files (NodeNext-style projects).\n * 4. Bare specifiers that cannot be probed are external.\n * 5. Relative imports that point at existing files outside the analyzed set\n * (assets like `.css`, `.json`, or ignored source files) are external —\n * they exist, Ripple just does not model them.\n *\n * The resolver is a pure function of its inputs and does no I/O beyond\n * cheap existence checks.\n */\n\nexport interface ResolverContext {\n /** Project root. */\n rootDir: string;\n aliases: AliasMap;\n /** Canonical keys of all discovered files. */\n fileKeys: Set<string>;\n}\n\nexport interface ResolvedEdge {\n /** Absolute path of the resolved file, for internal edges. */\n filePath?: string;\n kind: EdgeKind;\n}\n\n/** Replace the last extension-less segment and probe existing files. */\nfunction probeCandidates(base: string, fileKeys: Set<string>, rootDir: string): string | undefined {\n for (const candidate of extensionCandidates(base)) {\n const key = pathKey(candidate, rootDir);\n if (fileKeys.has(key)) return path.normalize(candidate);\n }\n const jsSwapped = jsToTsCandidate(base);\n if (jsSwapped !== base) {\n const swappedKey = pathKey(jsSwapped, rootDir);\n if (fileKeys.has(swappedKey)) return path.normalize(jsSwapped);\n }\n return undefined;\n}\n\n/** An absolute path exists on disk as a file or directory. */\nfunction existsOnDisk(filePath: string): boolean {\n try {\n fs.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve a specifier to an absolute candidate path (possibly\n * extension-less) or `undefined` when the specifier cannot be interpreted.\n */\nfunction specifierToBase(\n specifier: string,\n fromDir: string,\n context: ResolverContext,\n): string | undefined {\n const { rootDir, aliases } = context;\n\n if (specifier.startsWith(\"/\")) {\n return path.resolve(rootDir, specifier.slice(1));\n }\n if (specifier.startsWith(\".\")) {\n return path.resolve(fromDir, specifier);\n }\n const substituted = substituteAlias(specifier, aliases);\n if (substituted === undefined) return undefined;\n return path.isAbsolute(substituted) ? substituted : path.resolve(rootDir, substituted);\n}\n\n/** Resolve a specifier to a discovered file, or `undefined`. */\nfunction resolveToFile(base: string, context: ResolverContext): string | undefined {\n const { rootDir, fileKeys } = context;\n\n const exactKey = pathKey(base, rootDir);\n if (fileKeys.has(exactKey)) return path.normalize(base);\n\n const probed = probeCandidates(base, fileKeys, rootDir);\n if (probed) return probed;\n\n if (existsOnDisk(base) && fs.statSync(base).isDirectory()) {\n const indexProbed = probeCandidates(path.join(base, \"index\"), fileKeys, rootDir);\n if (indexProbed) return indexProbed;\n }\n\n return undefined;\n}\n\n/**\n * Resolve one import declaration from a source file. Returns the edge kind\n * and, for internal edges, the absolute target path.\n */\nexport function resolveEdge(\n specifier: string,\n fromPath: string,\n context: ResolverContext,\n): ResolvedEdge {\n const base = specifierToBase(specifier, path.dirname(fromPath), context);\n\n if (base !== undefined) {\n const resolved = resolveToFile(base, context);\n if (resolved !== undefined) return { filePath: resolved, kind: \"internal\" };\n if (existsOnDisk(base)) return { kind: \"external\" };\n }\n\n const isRelative = specifier.startsWith(\".\") || specifier.startsWith(\"/\");\n const isAlias = specifierToBase(specifier, path.dirname(fromPath), context) !== undefined;\n if (isRelative || isAlias) return { kind: \"unresolved\" };\n return { kind: \"external\" };\n}\n\n/**\n * Resolve every import of a file against the discovered file set.\n * Returns internal target paths, external specifiers and unresolved\n * specifiers, in declaration order.\n */\nexport function resolveImports(\n fromPath: string,\n importSpecifiers: string[],\n context: ResolverContext,\n): { internal: string[]; external: string[]; unresolved: string[] } {\n const internal: string[] = [];\n const external: string[] = [];\n const unresolved: string[] = [];\n\n for (const specifier of importSpecifiers) {\n const edge = resolveEdge(specifier, fromPath, context);\n if (edge.kind === \"internal\" && edge.filePath) {\n internal.push(edge.filePath);\n } else if (edge.kind === \"external\") {\n external.push(specifier);\n } else {\n unresolved.push(specifier);\n }\n }\n\n return { internal, external, unresolved };\n}\n","import type { Project } from \"ts-morph\";\nimport { parseMany } from \"../parser/parse.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { pathKey } from \"../utils/paths.js\";\nimport { findCycles } from \"./cycles.js\";\nimport { resolveImports, type ResolverContext } from \"./resolve.js\";\n\n/**\n * Build the in-memory dependency graph.\n *\n * 1. Parse every discovered file (shared ts-morph project).\n * 2. Resolve every import against the file set (aliases, index files, ...).\n * 3. Populate `forward` / `reverse` / `external` and graph stats.\n * 4. Detect cycles (SCC groups).\n *\n * `reverse` is built incrementally here so reverse traversals stay O(n).\n */\nexport function buildGraph(\n project: Project,\n filePaths: string[],\n context: ResolverContext,\n): DependencyGraph {\n const parsedFiles = parseMany(project, filePaths);\n\n const nodes: DependencyGraph[\"nodes\"] = new Map();\n const forward: DependencyGraph[\"forward\"] = new Map();\n const reverse: DependencyGraph[\"reverse\"] = new Map();\n const external: DependencyGraph[\"external\"] = new Map();\n\n let parsedCount = 0;\n let internalEdges = 0;\n let unresolvedEdges = 0;\n let externalEdges = 0;\n\n for (const parsed of parsedFiles) {\n const key = pathKey(parsed.path, context.rootDir);\n nodes.set(key, { path: parsed.path, parsed });\n if (!parsed.parseError) parsedCount++;\n }\n\n for (const parsed of parsedFiles) {\n const fromKey = pathKey(parsed.path, context.rootDir);\n const targets = new Set<string>();\n\n const {\n internal,\n external: externalSpecifiers,\n unresolved,\n } = resolveImports(\n parsed.path,\n parsed.imports.map((decl) => decl.raw),\n context,\n );\n\n internalEdges += internal.length;\n unresolvedEdges += unresolved.length;\n externalEdges += externalSpecifiers.length;\n\n for (const target of internal) {\n targets.add(pathKey(target, context.rootDir));\n }\n\n if (externalSpecifiers.length > 0) {\n external.set(fromKey, new Set(externalSpecifiers));\n }\n\n forward.set(fromKey, targets);\n for (const target of targets) {\n const importers = reverse.get(target) ?? new Set<string>();\n importers.add(fromKey);\n reverse.set(target, importers);\n }\n }\n\n const graph: DependencyGraph = {\n nodes,\n forward,\n reverse,\n external,\n cycles: [],\n stats: {\n files: parsedFiles.length,\n parsed: parsedCount,\n internalEdges,\n unresolvedEdges,\n externalEdges,\n cycles: 0,\n },\n };\n graph.cycles = findCycles(graph);\n graph.stats.cycles = graph.cycles.length;\n return graph;\n}\n\n/**\n * Look up a graph node by absolute path. Returns the node's canonical key\n * and its parsed surface, or `undefined` when the file is not in the graph.\n */\nexport function findNode(\n graph: DependencyGraph,\n filePath: string,\n rootDir: string,\n): { key: string; parsed: ParsedFile } | undefined {\n const key = pathKey(filePath, rootDir);\n const node = graph.nodes.get(key);\n if (!node) return undefined;\n return { key, parsed: node.parsed };\n}\n","import path from \"node:path\";\nimport { createTsProject } from \"../parser/ts-project.js\";\nimport { discoverSourceFiles } from \"../scanner/discover.js\";\nimport { buildGraph } from \"../graph/build.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport { detectEntryPoints } from \"../analyzer/categorize.js\";\nimport { pathKey, displayPath } from \"../utils/paths.js\";\nimport { fileNotFound } from \"../utils/errors.js\";\n\n/**\n * Shared pipeline for commands that need the full dependency graph\n * (analyze, graph, doctor). Loads context, discovers files, parses and\n * resolves everything into one graph, and detects entry points.\n */\n\nexport interface PipelineResult {\n graph: ReturnType<typeof buildGraph>;\n filePaths: string[];\n entryPoints: Set<string>;\n durationMs: number;\n}\n\nexport async function runPipeline(context: ProjectContext): Promise<PipelineResult> {\n const started = Date.now();\n const project = createTsProject();\n const filePaths = await discoverSourceFiles({\n rootDir: context.rootDir,\n include: context.config.include,\n ignore: context.config.ignore,\n });\n const graph = buildGraph(project, filePaths, {\n rootDir: context.rootDir,\n aliases: context.aliases,\n fileKeys: new Set(filePaths.map((p) => pathKey(p, context.rootDir))),\n });\n const entryPoints = await detectEntryPoints(context.rootDir);\n return { graph, filePaths, entryPoints, durationMs: Date.now() - started };\n}\n\n/** Resolve the `<file>` argument to an absolute path (cwd-relative). */\nexport function resolveTargetFile(fileArg: string, cwd: string): string {\n return path.isAbsolute(fileArg) ? fileArg : path.join(cwd, fileArg);\n}\n\n/** Verify the target path is part of the graph; throws `RippleError`. */\nexport function requireNode(\n graph: DependencyGraph,\n targetPath: string,\n rootDir: string,\n): { key: string } {\n const key = pathKey(targetPath, rootDir);\n if (!graph.nodes.has(key)) {\n throw fileNotFound(displayPath(targetPath, rootDir));\n }\n return { key };\n}\n","import { loadProjectContext } from \"../config/loader.js\";\nimport { analyzeFile } from \"../analyzer/analyze.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { buildAnalyzeJsonReport, renderAnalyzeReport } from \"../output/report.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport { requireNode, resolveTargetFile, runPipeline } from \"./pipeline.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { pathExists } from \"../utils/fs.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AnalyzeOptions, CommandContext } from \"../types/cli.js\";\n\n/**\n * `ripple analyze <file>`\n *\n * Full impact analysis of one file: reverse traversal, risk score, and a\n * terminal or JSON report.\n */\nexport async function analyzeCommand(\n fileArg: string,\n options: AnalyzeOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const targetPath = resolveTargetFile(fileArg, ctx.cwd);\n if (!(await pathExists(targetPath))) {\n throw new RippleError(`File not found: ${fileArg}`, ExitCode.NotFound);\n }\n\n const tracker = createStageTracker(!options.json);\n tracker.next(\"Loading config\");\n\n const started = Date.now();\n const context = await loadProjectContext(ctx.cwd, options.config);\n\n tracker.next(\"Building dependency graph\");\n const { graph, entryPoints, durationMs: pipelineMs } = await runPipeline(context);\n\n tracker.next(\"Analyzing impact\");\n const completed = Date.now();\n const result = analyzeFile({\n graph,\n context,\n entryPoints,\n targetKey: requireNode(graph, targetPath, context.rootDir).key,\n targetPath,\n durationMs: pipelineMs + (completed - started),\n ...(options.depth !== undefined ? { maxDepth: options.depth } : {}),\n });\n tracker.done();\n\n if (options.json) {\n const report = buildAnalyzeJsonReport(result, ctx.version, ctx.cwd);\n ctx.writer.write(serializeJson(report));\n return ExitCode.Success;\n }\n\n renderAnalyzeReport(\n result,\n {\n cwd: ctx.cwd,\n color: resolveColor(options.color),\n verbose: options.verbose,\n version: ctx.version,\n },\n ctx.writer,\n );\n return ExitCode.Success;\n}\n","import { loadProjectContext } from \"../config/loader.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { buildGraphJsonReport, renderGraphReport } from \"../output/report.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport { requireNode, resolveTargetFile, runPipeline } from \"./pipeline.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, GraphOptions } from \"../types/cli.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\n\n/**\n * `ripple graph [file]`\n *\n * Without a file: project-wide graph stats and circular dependencies.\n * With a file: the file's dependency tree — dependants (what it imports)\n * by default, or dependents (what imports it) with `--reverse`.\n */\n\ninterface WalkNode {\n key: string;\n depth: number;\n}\n\n/** BFS walk over an edge map, depth-capped, sorted by depth then path. */\nfunction walk(\n graph: DependencyGraph,\n startKey: string,\n edges: Map<string, Set<string>>,\n maxDepth: number | undefined,\n cwd: string,\n): string[] {\n const seen = new Set<string>([startKey]);\n const queue: WalkNode[] = [{ key: startKey, depth: 0 }];\n const entries: Array<{ path: string; depth: number }> = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n if (current.key !== startKey) {\n const nodePath = graph.nodes.get(current.key)?.path ?? current.key;\n entries.push({ path: displayPath(nodePath, cwd), depth: current.depth });\n }\n if (maxDepth !== undefined && current.depth >= maxDepth) continue;\n\n for (const candidate of edges.get(current.key) ?? []) {\n if (seen.has(candidate)) continue;\n seen.add(candidate);\n queue.push({ key: candidate, depth: current.depth + 1 });\n }\n }\n\n return entries\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((entry) => entry.path);\n}\n\nexport async function graphCommand(\n fileArg: string | undefined,\n options: GraphOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const tracker = createStageTracker(!options.json);\n tracker.next(\"Loading config\");\n const cwd = ctx.cwd;\n\n try {\n const context = await loadProjectContext(cwd, options.config);\n\n tracker.next(\"Building graph\");\n const { graph } = await runPipeline(context);\n\n const input = {\n stats: graph.stats,\n cycles: graph.cycles,\n nodes: graph.nodes,\n cwd,\n };\n\n if (!fileArg) {\n tracker.done();\n if (options.json) {\n const report = buildGraphJsonReport(input, ctx.version);\n ctx.writer.write(serializeJson(report));\n } else {\n renderGraphReport(\n input,\n {\n cwd,\n color: resolveColor(options.color),\n verbose: options.verbose,\n version: ctx.version,\n },\n ctx.writer,\n );\n }\n return ExitCode.Success;\n }\n\n const targetPath = resolveTargetFile(fileArg, cwd);\n const { key } = requireNode(graph, targetPath, context.rootDir);\n const dependants = walk(graph, key, graph.forward, options.depth, cwd);\n const dependents = walk(graph, key, graph.reverse, options.depth, cwd);\n\n tracker.done();\n\n if (options.json) {\n const report = buildGraphJsonReport(\n {\n ...input,\n ...(options.reverse ? { reverse: dependents } : { forward: dependants }),\n },\n ctx.version,\n );\n ctx.writer.write(serializeJson(report));\n } else {\n renderGraphReport(\n {\n ...input,\n forward: options.reverse ? undefined : dependants,\n reverse: options.reverse ? dependents : undefined,\n },\n { cwd, color: resolveColor(options.color), verbose: options.verbose, version: ctx.version },\n ctx.writer,\n );\n }\n return ExitCode.Success;\n } finally {\n tracker.done();\n }\n}\n","import ora from \"ora\";\n\n/**\n * Spinner for long-running commands. Becomes a no-op when the stream is not\n * a TTY (CI, pipes, tests) or when output is JSON — never pollute machines.\n */\nexport function createSpinner(enabled: boolean): { start(text: string): void; stop(): void } {\n if (!enabled || !process.stdout.isTTY) {\n return { start: () => {}, stop: () => {} };\n }\n let instance: ReturnType<typeof ora> | undefined;\n return {\n start(text: string): void {\n instance = ora(text).start();\n },\n stop(): void {\n instance?.stop();\n instance = undefined;\n },\n };\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport { loadConfig, loadProjectContext } from \"../config/loader.js\";\nimport { buildGraph } from \"../graph/build.js\";\nimport { createTsProject } from \"../parser/ts-project.js\";\nimport { discoverSourceFiles } from \"../scanner/discover.js\";\nimport { createSpinner } from \"../cli/spinner.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { brandHeader } from \"../ui/brand.js\";\nimport { icon } from \"../ui/icons.js\";\nimport { dim, type TextStyle } from \"../formatter/text.js\";\nimport { pathKey } from \"../utils/paths.js\";\nimport { findPackageJson } from \"../utils/fs.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, DoctorOptions } from \"../types/cli.js\";\n\n/**\n * `ripple doctor`\n *\n * Environment and project health check. Each check is independent; a failed\n * check is reported but does not abort the run. Exits non-zero when any\n * check fails.\n */\n\ninterface CheckResult {\n label: string;\n state: \"ok\" | \"warn\" | \"fail\";\n detail?: string;\n}\n\nexport async function doctorCommand(\n options: DoctorOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const color = resolveColor(options.color);\n const style: TextStyle = { color };\n const spinner = createSpinner(color);\n spinner.start(\"Running diagnostics…\");\n const results: CheckResult[] = [];\n const check = (label: string, state: \"ok\" | \"warn\" | \"fail\", detail?: string): void => {\n results.push({ label, state, detail });\n };\n\n try {\n check(\"Node.js runtime\", \"ok\", process.version);\n\n const packageJson = await findPackageJson(ctx.cwd);\n if (packageJson) {\n check(\"package.json\", \"ok\", path.relative(ctx.cwd, packageJson));\n } else {\n check(\"package.json\", \"fail\", \"not found in this directory or its parents\");\n }\n\n let context;\n try {\n const loaded = await loadConfig(ctx.cwd, options.config);\n check(\n \"ripple config\",\n \"ok\",\n loaded.configPath ? path.relative(ctx.cwd, loaded.configPath) : \"defaults\",\n );\n context = await loadProjectContext(ctx.cwd, options.config);\n } catch (error) {\n check(\"ripple config\", \"fail\", error instanceof Error ? error.message : String(error));\n renderResults(results, ctx, color);\n return ExitCode.InvalidConfig;\n }\n\n if (context.tsconfig) {\n check(\"tsconfig.json\", \"ok\", path.relative(ctx.cwd, context.tsconfig.path));\n } else {\n check(\"tsconfig.json\", \"warn\", \"not found — path aliases unavailable\");\n }\n\n const project = createTsProject();\n const filePaths = await discoverSourceFiles({\n rootDir: context.rootDir,\n include: context.config.include,\n ignore: context.config.ignore,\n });\n if (filePaths.length > 0) {\n check(\"source files\", \"ok\", `${filePaths.length} discovered`);\n } else {\n check(\"source files\", \"fail\", \"no source files matched the include globs\");\n }\n\n if (Object.keys(context.aliases).length > 0) {\n check(\"path aliases\", \"ok\", `${Object.keys(context.aliases).length} configured`);\n }\n\n const graph = buildGraph(project, filePaths, {\n rootDir: context.rootDir,\n aliases: context.aliases,\n fileKeys: new Set(filePaths.map((p) => pathKey(p, context.rootDir))),\n });\n\n const { stats } = graph;\n const parseRate = stats.files === 0 ? 1 : stats.parsed / stats.files;\n if (parseRate >= 0.99) {\n check(\"parse\", \"ok\", \"all files parsed cleanly\");\n } else if (parseRate >= 0.9) {\n check(\"parse\", \"warn\", `${stats.files - stats.parsed} file(s) failed to parse`);\n } else {\n check(\"parse\", \"fail\", `${stats.files - stats.parsed} file(s) failed to parse`);\n }\n\n if (stats.unresolvedEdges === 0) {\n check(\"import resolution\", \"ok\", \"all internal imports resolved\");\n } else {\n check(\"import resolution\", \"warn\", `${stats.unresolvedEdges} unresolved import(s)`);\n }\n\n if (stats.cycles === 0) {\n check(\"circular dependencies\", \"ok\", \"none found\");\n } else {\n check(\"circular dependencies\", \"warn\", `${stats.cycles} cycle group(s)`);\n }\n } finally {\n spinner.stop();\n }\n\n renderResults(results, ctx, color);\n const failed = results.some((check) => check.state === \"fail\");\n const warned = results.some((check) => check.state === \"warn\");\n const verdict = failed\n ? { icon: icon(\"cross\"), text: \"Diagnoses found problems.\", color: chalk.red }\n : warned\n ? { icon: icon(\"warning\"), text: \"Diagnoses passed with warnings.\", color: chalk.yellow }\n : { icon: icon(\"tick\"), text: \"All checks passed.\", color: chalk.green };\n const verdictIcon = style.color ? verdict.color(verdict.icon) : verdict.icon;\n ctx.writer.writeLine(`${verdictIcon} ${verdict.text}`);\n return failed ? ExitCode.Failure : ExitCode.Success;\n}\n\nfunction renderResults(results: CheckResult[], ctx: CommandContext, color: boolean): void {\n const style: TextStyle = { color };\n ctx.writer.writeLine(brandHeader({ label: \"project health check\", version: ctx.version, style }));\n ctx.writer.writeLine();\n\n const width = Math.max(...results.map((check) => check.label.length));\n for (const check of results) {\n const stateIcon =\n check.state === \"ok\"\n ? icon(\"tick\")\n : check.state === \"warn\"\n ? icon(\"warning\")\n : icon(\"cross\");\n const colored =\n check.state === \"ok\" ? chalk.green : check.state === \"warn\" ? chalk.yellow : chalk.red;\n const mark = style.color ? colored(stateIcon) : stateIcon;\n const detail = check.detail ? ` ${dim(check.detail, style)}` : \"\";\n ctx.writer.writeLine(`${mark} ${check.label.padEnd(width)}${detail}`);\n }\n ctx.writer.writeLine();\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { icon } from \"../ui/icons.js\";\nimport { dim } from \"../formatter/text.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, InitOptions } from \"../types/cli.js\";\n\n/**\n * `ripple init`\n *\n * Writes a `ripple.config.json` with the built-in defaults next to the\n * current directory. Refuses to overwrite an existing file unless `--force`.\n */\n\nconst INIT_FILENAME = \"ripple.config.json\";\n\nexport async function initCommand(options: InitOptions, ctx: CommandContext): Promise<ExitCode> {\n const style = { color: resolveColor(options.color) };\n const target = path.join(ctx.cwd, INIT_FILENAME);\n\n try {\n await fs.access(target);\n if (!options.force) {\n const mark = style.color ? chalk.red(icon(\"cross\")) : icon(\"cross\");\n ctx.writer.writeLine(\n `${mark} ${INIT_FILENAME} already exists. Pass --force to overwrite it.`,\n );\n return ExitCode.Failure;\n }\n } catch {\n /* file does not exist — safe to create */\n }\n\n const payload = {\n ...DEFAULT_CONFIG,\n };\n\n try {\n await fs.writeFile(target, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n const mark = style.color ? chalk.green(icon(\"tick\")) : icon(\"tick\");\n ctx.writer.writeLine(`${mark} Wrote ${INIT_FILENAME}`);\n ctx.writer.writeLine(\n ` ${dim(\"Edit it to tune include globs, aliases and risk weights.\", style)}`,\n );\n return ExitCode.Success;\n } catch (error) {\n const mark = style.color ? chalk.red(icon(\"cross\")) : icon(\"cross\");\n ctx.writer.writeLine(\n `${mark} Could not write ${INIT_FILENAME}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return ExitCode.Failure;\n }\n}\n","import { Command, CommanderError } from \"commander\";\nimport { analyzeCommand } from \"../commands/analyze.js\";\nimport { graphCommand } from \"../commands/graph.js\";\nimport { doctorCommand } from \"../commands/doctor.js\";\nimport { initCommand } from \"../commands/init.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, ExitCode as ExitCodeType } from \"../types/cli.js\";\n\n/**\n * CLI program definition. `run()` returns the process exit code instead of\n * calling `process.exit`, which keeps the CLI integration-testable.\n */\n\nconst PROGRAM_NAME = \"ripple\";\n\nexport function createProgram(ctx: CommandContext): Command {\n const program = new Command()\n .name(PROGRAM_NAME)\n .description(\"Dependency impact analysis for TypeScript and JavaScript projects.\")\n .version(ctx.version, \"-V, --version\", \"print the Ripple version\")\n .showHelpAfterError();\n\n program\n .command(\"analyze <file>\")\n .description(\"Analyze the impact of changing a file\")\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\"-v, --verbose\", \"include the risk factor breakdown\")\n .option(\"-d, --depth <number>\", \"cap the reverse traversal depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (file: string, options: Record<string, unknown>) => {\n const exitCode = await analyzeCommand(\n file,\n {\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"graph [file]\")\n .description(\"Show project graph stats, or the dependency tree of one file\")\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\"-v, --verbose\", \"include extra sections\")\n .option(\"-r, --reverse\", \"show dependents (what imports the file) instead of dependants\")\n .option(\"-d, --depth <number>\", \"cap the tree depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (file: string | undefined, options: Record<string, unknown>) => {\n const exitCode = await graphCommand(\n file,\n {\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n reverse: Boolean(options.reverse),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"doctor\")\n .description(\"Check the project and environment for Ripple readiness\")\n .option(\"-v, --verbose\", \"print detailed diagnostics\")\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await doctorCommand(\n {\n verbose: Boolean(options.verbose),\n config: options.config as string | undefined,\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"init\")\n .description(\"Create a ripple.config.json with the default settings\")\n .option(\"-f, --force\", \"overwrite an existing config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await initCommand(\n { force: Boolean(options.force), color: options.color as boolean | undefined },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"version\")\n .description(\"Print the Ripple version\")\n .action(() => {\n ctx.writer.writeLine(ctx.version);\n });\n\n program.addHelpText(\n \"beforeAll\",\n `ripple — dependency impact analysis for TypeScript and JavaScript\\n`,\n );\n\n return program;\n}\n\n/** Thrown internally to propagate a non-success exit code through commander. */\nclass ExitError extends Error {\n constructor(readonly exitCode: ExitCodeType) {\n super(`exit ${exitCode}`);\n this.name = \"ExitError\";\n }\n}\n\nfunction parsePositiveInt(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 1) {\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected a positive integer, got \"${value}\"`,\n );\n }\n return parsed;\n}\n\n/** Print an error to the error stream. */\nfunction printError(error: unknown, ctx: CommandContext): void {\n if (error instanceof RippleError) {\n ctx.errorWriter.writeLine(`✖ ${error.message}`);\n if (error.hint) ctx.errorWriter.writeLine(` ${error.hint}`);\n return;\n }\n if (error instanceof Error) {\n ctx.errorWriter.writeLine(`✖ ${error.message}`);\n return;\n }\n ctx.errorWriter.writeLine(`✖ ${String(error)}`);\n}\n\nexport interface RunOptions {\n argv: string[];\n ctx: CommandContext;\n}\n\n/** Parse arguments and run the CLI, returning the exit code. */\nexport async function run({ argv, ctx }: RunOptions): Promise<ExitCodeType> {\n const program = createProgram(ctx);\n program.exitOverride();\n\n try {\n await program.parseAsync(argv);\n return ExitCode.Success;\n } catch (error) {\n if (error instanceof ExitError) {\n return error.exitCode;\n }\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) return ExitCode.Success;\n return ExitCode.Failure;\n }\n printError(error, ctx);\n return error instanceof RippleError ? error.exitCode : ExitCode.Failure;\n }\n}\n","{\n \"name\": \"@alimaandev/ripple\",\n \"version\": \"0.2.0\",\n \"description\": \"Dependency impact analysis for TypeScript projects. Answers the question: what will break if I change this file?\",\n \"keywords\": [\n \"cli\",\n \"typescript\",\n \"dependencies\",\n \"impact-analysis\",\n \"refactoring\",\n \"risk\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Ali Sher <alishermaan0319@gmail.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/alimaandev/ripple.git\"\n },\n \"homepage\": \"https://github.com/alimaandev/ripple#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/alimaandev/ripple/issues\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"bin\": {\n \"ripple\": \"./dist/bin.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"pnpm@11.20.0\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"prepublishOnly\": \"pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build\"\n },\n \"dependencies\": {\n \"boxen\": \"^8.0.1\",\n \"chalk\": \"^6.0.0\",\n \"commander\": \"^15.0.0\",\n \"fast-glob\": \"^3.3.3\",\n \"figures\": \"^6.1.0\",\n \"jiti\": \"^2.7.0\",\n \"ora\": \"^9.4.1\",\n \"treeify\": \"^1.1.0\",\n \"ts-morph\": \"^28.0.0\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^10.0.1\",\n \"@types/node\": \"^26.1.2\",\n \"@types/treeify\": \"^1.0.3\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"eslint\": \"^10.8.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"prettier\": \"^3.9.6\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"^8.66.0\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","import { TerminalWriter } from \"../output/writer.js\";\nimport { run } from \"./program.js\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\n\n/**\n * Real CLI entry point. Keep this file thin — all logic lives in\n * `src/cli/program.ts` so the program stays integration-testable.\n */\n\nconst ctx = {\n writer: new TerminalWriter(),\n errorWriter: new TerminalWriter(process.stderr),\n cwd: process.cwd(),\n version: pkg.version,\n};\n\nconst exitCode = await run({ argv: process.argv, ctx });\nprocess.exitCode = exitCode;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/output/writer.ts","../src/types/cli.ts","../src/utils/fs.ts","../src/utils/errors.ts","../src/utils/tsconfig.ts","../src/config/aliases.ts","../src/config/loader.ts","../src/types/graph.ts","../src/analyzer/confidence.ts","../src/utils/paths.ts","../src/analyzer/categorize.ts","../src/analyzer/humanize.ts","../src/analyzer/impact.ts","../src/analyzer/reverse-traverse.ts","../src/risk/levels.ts","../src/risk/score.ts","../src/analyzer/analyze.ts","../src/formatter/text.ts","../src/ui/icons.ts","../src/ui/progress.ts","../src/ui/color.ts","../src/formatter/table.ts","../src/formatter/tree.ts","../src/ui/brand.ts","../src/ui/gauge.ts","../src/output/report.ts","../src/formatter/json.ts","../src/parser/ts-project.ts","../src/utils/globs.ts","../src/scanner/rules.ts","../src/scanner/discover.ts","../src/parser/exports.ts","../src/parser/imports.ts","../src/parser/symbols.ts","../src/parser/parse.ts","../src/graph/cycles.ts","../src/graph/resolve.ts","../src/graph/build.ts","../src/commands/pipeline.ts","../src/commands/analyze.ts","../src/commands/graph.ts","../src/cli/spinner.ts","../src/commands/doctor.ts","../src/commands/init.ts","../src/git/changed.ts","../src/commands/diff.ts","../src/cli/program.ts","../package.json","../src/cli/bin.ts"],"names":["fsSync","path","exitCode","chalk","ts","fs","ctx","check"],"mappings":";;;;;;;;;;;;;;;;;AAOO,IAAM,iBAAN,MAA6C;AAAA,EAClD,WAAA,CAA6B,MAAA,GAAgC,OAAA,CAAQ,MAAA,EAAQ;AAAhD,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAiD;AAAA,EAAjD,MAAA;AAAA,EAE7B,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,EACxB;AAAA,EAEA,SAAA,CAAU,OAAO,EAAA,EAAU;AACzB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI;AAAA,CAAI,CAAA;AAAA,EAC/B;AACF,CAAA;;;AC8CO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAA;AAAA,EACV,aAAA,EAAe;AACjB,CAAA;AC3DA,eAAsB,WAAW,QAAA,EAAoC;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,eAAe,QAAA,EAA2B;AACxD,EAAA,IAAI;AACF,IAAAA,GAAA,CAAO,WAAW,QAAQ,CAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,eAAsB,aAAa,QAAA,EAA+C;AAChF,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,EAAA,CAAG,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAeA,eAAsB,gBAAgB,QAAA,EAA+C;AACnF,EAAA,IAAI,OAAA,GAAUC,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACnC,EAAA,WAAS;AACP,IAAA,MAAM,SAAA,GAAYA,KAAA,CAAK,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AACnD,IAAA,IAAI,MAAM,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,SAAA;AACxC,IAAA,MAAM,MAAA,GAASA,KAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACnC,IAAA,IAAI,MAAA,KAAW,SAAS,OAAO,MAAA;AAC/B,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AACF;AAGA,eAAsB,uBAAuB,eAAA,EAA4C;AACvF,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,eAAe,CAAA;AAC9C,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,UAAU,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAI,CAAA;AACjE,IAAA,IAAI,OAAO,QAAA,CAAS,GAAA,KAAQ,UAAU,OAAA,CAAQ,IAAA,CAAK,SAAS,GAAG,CAAA;AAC/D,IAAA,IAAI,QAAA,CAAS,GAAA,IAAO,OAAO,QAAA,CAAS,GAAA,KAAQ,QAAA;AAC1C,MAAA,OAAA,CAAQ,KAAK,GAAG,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAC7C,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACrEO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EAC5B,QAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiBC,SAAAA,GAAqB,QAAA,CAAS,SAAS,IAAA,EAAe;AACjF,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAWA,SAAAA;AAChB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF,CAAA;AAGO,SAAS,aAAa,QAAA,EAA+B;AAC1D,EAAA,OAAO,IAAI,WAAA;AAAA,IACT,mBAAmB,QAAQ,CAAA,CAAA;AAAA,IAC3B,QAAA,CAAS,QAAA;AAAA,IACT;AAAA,GACF;AACF;ACVA,SAAS,cAAc,KAAA,EAA0B;AAC/C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACtB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAO,IAAA,KAAS,QAAQ,CAAA,GAC/D,EAAC;AACP;AAMO,SAAS,aAAa,YAAA,EAAgD;AAC3E,EAAA,IAAI,CAAC,cAAA,CAAe,YAAY,CAAA,EAAG,OAAO,MAAA;AAC1C,EAAA,MAAM,aAAa,EAAA,CAAG,cAAA,CAAe,YAAA,EAAc,EAAA,CAAG,IAAI,QAAQ,CAAA;AAClE,EAAA,IAAI,UAAA,CAAW,OAAO,OAAO,MAAA;AAE7B,EAAA,MAAM,GAAA,GAAMD,KAAAA,CAAK,OAAA,CAAQ,YAAY,CAAA;AACrC,EAAA,MAAM,SAAS,EAAA,CAAG,0BAAA;AAAA,IAChB,UAAA,CAAW,MAAA;AAAA,IACX,EAAA,CAAG,GAAA;AAAA,IACH,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAErC,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,QAAkC,EAAC;AACzC,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,KAAA,MAAW,CAAC,SAAS,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC9D,MAAA,KAAA,CAAM,OAAO,CAAA,GAAI,CAAC,GAAG,OAAO,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,GAAA;AAAA,IACA,OAAA,EAAS,QAAQ,OAAA,GAAUA,KAAAA,CAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,GAAI,MAAA;AAAA,IAChE,KAAA;AAAA,IACA,SAAS,aAAA,CAAc,UAAA,CAAW,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA;AAAA,IACtD,SAAS,aAAA,CAAc,UAAA,CAAW,MAAA,CAAO,OAAA,IAAW,EAAE;AAAA,GACxD;AACF;ACvCA,IAAM,QAAA,GAAW,GAAA;AAEjB,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,OAAO,KAAA,CAAM,SAAS,QAAQ,CAAA;AAChC;AAQA,SAAS,cAAA,CACP,GAAA,EACA,MAAA,EACA,OAAA,EACqC;AACrC,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACzC,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAE/C,EAAA,IAAI,WAAA,CAAY,UAAU,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,SAAS,UAAA,EAAY,MAAA,EAAQA,MAAK,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA,EAAE;AAAA,EAC7E;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,IAClC,MAAA,EAAQA,MAAK,IAAA,CAAKA,KAAAA,CAAK,QAAQ,OAAA,EAAS,aAAa,GAAG,QAAQ;AAAA,GAClE;AACF;AAMO,SAAS,aAAA,CACd,aAAA,EACA,QAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,GAAA;AAC1C,IAAA,KAAA,MAAW,CAAC,SAAS,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,QAAA,GAAWA,MAAK,UAAA,CAAW,KAAK,IAAI,KAAA,GAAQA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAC1E,MAAA,MAAA,CAAO,OAAO,CAAA,GAAI,QAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACzD,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AACjD,IAAA,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,GAAI,KAAA,CAAM,MAAA;AAAA,EAChC;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,eAAA,CAAgB,WAAmB,OAAA,EAAuC;AACxF,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACvD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAC1C,IAAA,IAAI,cAAc,EAAA,EAAI;AACpB,MAAA,IAAI,SAAA,KAAc,SAAS,OAAO,MAAA;AAClC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA;AAC1C,IAAA,IAAI,CAAC,UAAU,UAAA,CAAW,MAAM,KAAK,CAAC,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAClE,IAAA,MAAM,QAAA,GAAW,UAAU,KAAA,CAAM,MAAA,CAAO,QAAQ,SAAA,CAAU,MAAA,GAAS,OAAO,MAAM,CAAA;AAChF,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAC1C,IAAA,IAAI,UAAA,KAAe,IAAI,OAAO,MAAA;AAC9B,IAAA,OAAO,MAAA,CAAO,MAAM,CAAA,EAAG,UAAU,IAAI,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,MAAA;AACT;;;AC7EA,IAAM,iBAAA,GAAoB;AAAA,EACxB,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,OAAO,UAAA,CAAW,MAAA,CAAA,IAAA,CAAY,KAAK,EAAE,cAAA,EAAgB,MAAM,CAAA;AAEjE,SAAS,cAAA,CAAe,KAAa,YAAA,EAAsD;AACzF,EAAA,IAAI,YAAA,EAAc,OAAOA,KAAAA,CAAK,OAAA,CAAQ,KAAK,YAAY,CAAA;AACvD,EAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACzC,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AACzC,IAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG,OAAO,QAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,aAAa,UAAA,EAAsC;AAChE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAAA,EACvC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACpE,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,kBAAkBA,KAAAA,CAAK,QAAA,CAAS,UAAU,CAAC,KAAK,MAAM,CAAA,CAAA;AAAA,MACtD,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAS,QAAkC,OAAA,IAAW,MAAA;AAC5D,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,CAAA,EAAGA,KAAAA,CAAK,QAAA,CAAS,UAAU,CAAC,CAAA,4CAAA,CAAA;AAAA,MAC5B,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAA8B;AACpD,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,KAAK,CAAA;AACjD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AAC9C,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,CAAA;AAAA,EAAoB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAClE,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAOA,eAAsB,UAAA,CAAW,KAAa,YAAA,EAAkD;AAC9F,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,GAAA,EAAK,YAAY,CAAA;AAEnD,EAAA,IAAI,YAAA,IAAgB,CAAC,UAAA,EAAY;AAC/B,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,0BAA0B,YAAY,CAAA,CAAA;AAAA,MACtC,QAAA,CAAS,aAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,EAAE,MAAA,EAAQ,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAA,EAAG,OAAA,EAASA,KAAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAE;AAAA,EAC5E;AAEA,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,UAAU,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,eAAe,GAAG,CAAA;AACjC,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,SAASA,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAE;AACjE;AAOA,eAAsB,kBAAA,CACpB,KACA,kBAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAA,EAAK,kBAAkB,CAAA;AACvD,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,MAAA;AAE5B,EAAA,MAAM,YAAA,GAAeA,KAAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,OAAO,YAAY,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,aAAa,YAAY,CAAA;AAE1C,EAAA,MAAM,OAAA,GAAoB,aAAA,CAAc,MAAA,CAAO,OAAA,EAAS,UAAU,OAAO,CAAA;AAEzE,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,IAC/B;AAAA,GACF;AACF;;;AC9BO,SAAS,iBAAiB,KAAA,EAAqC;AACpE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,IAAA,KAAA,MAAWA,MAAAA,IAAQ,MAAM,OAAA,EAAS;AAChC,MAAA,OAAA,CAAQ,IAAIA,MAAI,CAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;ACrFO,SAAS,iBAAA,CAAkB,OAAmB,aAAA,EAAgC;AACnF,EAAA,MAAM,YAAY,KAAA,CAAM,KAAA,KAAU,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,eAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,UAAA,KAAe,CAAA,GAAI,CAAA,GAAI,MAAM,aAAA,GAAgB,UAAA;AAEpE,EAAA,IAAI,UAAA,GAAa,SAAA,IAAa,GAAA,GAAM,GAAA,GAAM,cAAA,CAAA;AAC1C,EAAA,IAAI,eAAe,UAAA,IAAc,IAAA;AAEjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA,GAAI,GAAG,CAAA;AAC9D;ACXO,IAAM,iBAAA,GAAoB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AAEvD,IAAM,wBAAwB,CAAC,GAAG,iBAAA,EAAmB,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAG5E,SAAS,QAAQ,QAAA,EAA0B;AAChD,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACpC;AAGO,SAAS,iBAAA,CAAkB,UAAkB,GAAA,EAAqB;AACvE,EAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AACnC;AAMO,SAAS,OAAA,CAAQ,UAAkB,GAAA,EAAqB;AAC7D,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,QAAA,EAAU,GAAG,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAQ,CAAA;AAC9B,EAAA,OAAO,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,KAAA,CAAM,aAAY,GAAI,KAAA;AAC9D;AAaO,SAAS,eAAe,QAAA,EAA2D;AACxF,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,MAAA;AAC5C,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,WAAA,EAAY;AAC/C,EAAA,OAAO,kBAAkB,QAAA,CAAS,GAAyC,IACtE,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GACZ,MAAA;AACN;AAGO,SAAS,oBAAoB,QAAA,EAA4B;AAC9D,EAAA,OAAO,qBAAA,CAAsB,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAW,GAAG,CAAA;AAC1D;AAOO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAClC,EAAA,IAAI,QAAQ,KAAA,EAAO,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AACnD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AACpD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AACpD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AACpD,EAAA,OAAO,SAAA;AACT;AAGO,SAAS,WAAA,CAAY,UAAkB,GAAA,EAAqB;AACjE,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAC5C,EAAA,OAAO,QAAQ,QAAA,KAAa,EAAA,GAAKA,MAAK,QAAA,CAAS,QAAQ,IAAI,QAAQ,CAAA;AACrE;AAMO,SAAS,YAAA,CAAa,UAAkB,IAAA,EAAkC;AAC/E,EAAA,MAAM,WAAW,OAAA,CAAQA,KAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAC,CAAA;AACtD,EAAA,IAAI,QAAA,CAAS,WAAW,IAAI,CAAA,IAAKA,MAAK,UAAA,CAAW,QAAQ,GAAG,OAAO,MAAA;AACnE,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACrC,EAAA,OAAO,OAAA,IAAW,OAAA,KAAY,EAAA,GAAK,OAAA,GAAU,MAAA;AAC/C;;;AC1EA,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AAEjD,IAAM,iBAAA,mBAAoB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,SAAS,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAEzF,IAAM,sCAAsB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,IAAI,CAAC,CAAA;AAExD,IAAM,gBAAA,mBAAmB,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,QAAQ,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,KAAK,CAAC,CAAA;AAEjF,IAAM,YAAA,GAAe,WAAA;AAErB,SAAS,gBAAA,CAAiB,UAAkB,OAAA,EAA2B;AACrE,EAAA,MAAM,WAAW,OAAA,CAAQA,KAAAA,CAAK,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AACzD,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,SAAU,EAAC;AACvC,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,KAAY,EAAA,IAAM,OAAA,KAAY,GAAG,CAAA;AAClF;AAEA,SAAS,YAAY,QAAA,EAA2B;AAC9C,EAAA,OAAO,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AACtC;AAEA,SAAS,UAAA,CAAW,MAAc,QAAA,EAA6B;AAC7D,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,gCAAA,CAAiC,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AACxD,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,YAAY,OAAO,CAAA;AACvD;AAEA,SAAS,eAAA,CAAgB,QAAA,EAAkB,SAAA,EAAmB,QAAA,EAA6B;AACzF,EAAA,IAAI,SAAA,KAAc,KAAA,IAAS,SAAA,KAAc,KAAA,EAAO,OAAO,IAAA;AACvD,EAAA,IAAI,CAAC,oBAAoB,GAAA,CAAI,QAAA,CAAS,GAAG,EAAE,CAAA,IAAK,EAAE,CAAA,EAAG,OAAO,KAAA;AAC5D,EAAA,OAAO,QAAA,CAAS,KAAK,QAAQ,CAAA;AAC/B;AAEA,SAAS,cAAc,QAAA,EAA6B;AAClD,EAAA,OAAO,SAAS,IAAA,CAAK,CAAC,YAAY,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAC,CAAA;AAClE;AAEA,SAAS,WAAA,CAAY,QAAA,EAAkB,OAAA,EAAiB,WAAA,EAAmC;AACzF,EAAA,IAAI,YAAY,GAAA,CAAIA,KAAAA,CAAK,UAAU,QAAQ,CAAC,GAAG,OAAO,IAAA;AAEtD,EAAA,MAAM,WAAW,OAAA,CAAQA,KAAAA,CAAK,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AACzD,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,KAAA;AACtC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACnC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,QAAA,CAAS,CAAC,CAAA,KAAM,KAAA,IAAS,SAAS,CAAC,CAAA,KAAM,IAAI,OAAO,KAAA;AAExD,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,CAAC,CAAA,IAAK,EAAA;AAChC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACpC,EAAA,MAAM,OAAO,GAAA,KAAQ,EAAA,GAAK,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,GAAG,CAAA;AAC1D,EAAA,OAAO,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAClC;AAYO,SAAS,kBAAkB,OAAA,EAA+D;AAC/F,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,OAAA;AAEjC,EAAA,OAAO,CAAC,QAAA,KAAiC;AACvC,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,EAAA,CAAG,EAAE,CAAA,IAAK,EAAA;AACpC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACpC,IAAA,MAAM,OAAO,GAAA,KAAQ,EAAA,GAAK,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,GAAG,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,QAAQ,EAAA,GAAK,EAAA,GAAK,SAAS,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAExE,IAAA,MAAM,aAAyB,EAAC;AAEhC,IAAA,IAAI,WAAA,CAAY,IAAI,CAAA,EAAG,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,SAAA,IACrC,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAC,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAE1F,IAAA,IAAI,WAAW,IAAA,EAAM,QAAQ,CAAA,EAAG,UAAA,CAAW,KAAK,MAAM,CAAA;AACtD,IAAA,IAAI,gBAAgB,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA,EAAG,UAAA,CAAW,KAAK,WAAW,CAAA;AAC3E,IAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,EAAG,UAAA,CAAW,KAAK,SAAS,CAAA;AACtD,IAAA,IAAI,YAAY,QAAA,EAAU,OAAA,EAAS,WAAW,CAAA,EAAG,UAAA,CAAW,KAAK,OAAO,CAAA;AACxE,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,UAAA,CAAW,KAAK,OAAO,CAAA;AAEpD,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAMA,eAAsB,kBAAkB,OAAA,EAAuC;AAC7E,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,EAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,OAAO,CAAA;AACrD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,OAAA,CAAQ,eAAe,CAAA;AAC/C,IAAA,KAAA,MAAW,KAAA,IAAS,MAAM,sBAAA,CAAuB,eAAe,CAAA,EAAG;AACjE,MAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA;AAC/C,MAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG,WAAA,CAAY,IAAIA,KAAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,CAAC,OAAA,EAASA,MAAK,IAAA,CAAK,OAAA,EAAS,KAAK,CAAC,CAAA;AACpD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,MAAW,QAAQ,gBAAA,EAAkB;AACnC,MAAA,KAAA,MAAW,aAAa,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA,EAAG;AAClD,QAAA,MAAM,SAAA,GAAYA,MAAK,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC3D,QAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG,WAAA,CAAY,IAAIA,KAAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;;;AChIA,IAAM,iBAAA,GAA4C;AAAA,EAChD,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAEA,SAAS,WAAW,OAAA,EAA2B;AAC7C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,kDAAkD,CAAA;AACnF,EAAA,OAAA,CAAQ,OAAA,IAAW,CAAC,OAAO,CAAA,EAAG,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,EAAa,CAAA;AAChE;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AACpD;AAEO,SAAS,aAAa,OAAA,EAAyB;AACpD,EAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,WAAW,OAAO,CAAA;AACjD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAI,CAAA,IAAK,UAAA,CAAW,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAClF;;;AC/CA,IAAM,gBAAA,GAAmB,CAAA;AAElB,SAAS,YAAA,CACd,QAAA,EACA,OAAA,EACA,UAAA,EACe;AACf,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAE3C,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,MAAA,EAAO,EAAG;AACpC,IAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,QAAA,EAAU,QAAA,GAAW,IAAA,CAAK,KAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,MAAA,EAAA;AACvC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,KAAA,EAAA;AACtC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG,UAAA,EAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG,SAAA,EAAA;AACzC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,OAAA,EAAA;AAEvC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,CAAW,IAAI,IAAA,EAAA,CAAO,UAAA,CAAW,IAAI,IAAI,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,MAAM,YAA6B,CAAC,GAAG,UAAA,CAAW,OAAA,EAAS,CAAA,CACxD,GAAA,CAAI,CAAC,CAAC,OAAO,KAAK,CAAA,MAAO,EAAE,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAG,KAAA,EAAM,CAAE,CAAA,CAC/D,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,cAAc,CAAA,CAAE,KAAK,CAAC,CAAA,CAClE,KAAA,CAAM,GAAG,gBAAgB,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,eAAe,QAAA,CAAS,IAAA;AAAA,IACxB,MAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;AChCO,SAAS,eAAA,CACd,KAAA,EACA,SAAA,EACA,OAAA,EACwB;AACxB,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,OAAA;AAEjC,EAAA,MAAM,QAAA,uBAA0C,GAAA,EAAI;AACpD,EAAA,MAAM,OAAA,mBAAU,IAAI,GAAA,CAAY,CAAC,SAAS,CAAC,CAAA;AAC3C,EAAA,MAAM,YAAA,GAAe,iBAAiB,KAAK,CAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA,EAAE;AAAA,EACjC;AAEA,EAAA,MAAM,QAA+C,EAAC;AACtD,EAAA,KAAA,MAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,SAAS,CAAA,IAAK,EAAC,EAAG;AACzD,IAAA,KAAA,CAAM,KAAK,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,CAAA;AAEvB,IAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,EAAM,IAAA,IAAQ,OAAA,CAAQ,GAAA;AAEvC,IAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,GAAA,EAAK;AAAA,MACxB,IAAA,EAAM,QAAA;AAAA,MACN,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAA,EAAQ,QAAQ,KAAA,KAAU,CAAA;AAAA,MAC1B,UAAA,EAAY,WAAW,QAAQ,CAAA;AAAA,MAC/B,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,GAAG;AAAA,KACtC,CAAA;AAED,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,KAAA,GAAQ,QAAA,EAAU;AACtD,MAAA,KAAA,MAAW,QAAA,IAAY,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,CAAA,IAAK,EAAC,EAAG;AAC3D,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC1B,UAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,QAAA,EAAU,OAAO,OAAA,CAAQ,KAAA,GAAQ,GAAG,CAAA;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,OAAA,EAAQ;AACvC;;;ACvEO,SAAS,YAAA,CAAa,OAAe,UAAA,EAAuC;AACjF,EAAA,IAAI,KAAA,IAAS,UAAA,CAAW,QAAA,EAAU,OAAO,UAAA;AACzC,EAAA,IAAI,KAAA,IAAS,UAAA,CAAW,IAAA,EAAM,OAAO,MAAA;AACrC,EAAA,IAAI,KAAA,IAAS,UAAA,CAAW,MAAA,EAAQ,OAAO,QAAA;AACvC,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3C;AAMO,SAAS,QAAA,CAAS,OAAe,GAAA,EAAqB;AAC3D,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAChE;;;ACKA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,WAAA,GAAc,EAAA;AAEpB,IAAM,OAAA,GAA8B;AAAA,EAClC;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,OAAc,QAAA,CAAS,OAAA,CAAQ,eAAe,kBAAkB;AAAA,GAC9E;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,sBAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,OAAe,OAAA,CAAQ,OAAA,GAAU,IAAI,CAAA,GAAI;AAAA,GACvD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,2BAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,EAAQ,KAAM,MAAM,OAAA,CAAQ,SAAA,GAAY,aAAA,EAAe,CAAA,EAAG,CAAC;AAAA,GACzE;AAAA,EACA;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,uBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,YAAA,EAAa,KAAM;AAC7B,MAAA,MAAM,EAAE,SAAQ,GAAI,YAAA;AACpB,MAAA,MAAM,KAAA,GACJ,QAAQ,KAAA,CAAM,MAAA,IAAU,QAAQ,UAAA,GAAa,CAAA,GAAI,CAAA,CAAA,GAAK,OAAA,CAAQ,cAAA,CAAe,MAAA;AAC/E,MAAA,OAAO,KAAA,CAAM,KAAA,GAAQ,WAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAAA,IACxC;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,EAAQ,KAAM,MAAM,OAAA,CAAQ,KAAA,GAAQ,SAAA,EAAW,CAAA,EAAG,CAAC;AAAA,GACjE;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,iBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,EAAQ,KAAM,MAAM,OAAA,CAAQ,MAAA,GAAS,UAAA,EAAY,CAAA,EAAG,CAAC;AAAA,GACnE;AAAA,EACA;AAAA,IACE,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,qBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,SAAS,CAAC,EAAE,aAAA,EAAc,KAAO,gBAAgB,CAAA,GAAI;AAAA;AAEzD,CAAA;AAEA,SAAS,SAAA,CAAU,YAA8B,KAAA,EAA0B;AACzE,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,WAAW,IAAmC,CAAA;AAC1F,EAAA,OAAO,cAAc,UAAA,CAAW,aAAA;AAClC;AAKO,SAAS,UAAU,KAAA,EAA8B;AACtD,EAAA,MAAM,OAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,UAAA,KAAe;AACxD,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,UAAA,EAAY,KAAK,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAc,IAAA,CAAK,KAAA,CAAM,SAAS,KAAA,GAAQ,GAAA,GAAM,GAAG,CAAA,GAAI;AAAA,KACzD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,KAAA;AAAA,IACZ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,MAAA,KAAW,GAAA,GAAM,MAAA,CAAO,YAAA,EAAc,CAAC,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAAA,IAClF,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,WAAW,UAAU,CAAA;AAAA,IACtD;AAAA,GACF;AACF;;;ACpFO,SAAS,WAAW,OAAA,EAAyB;AAClD,EAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAC1C,EAAA,OAAO,cAAA,CAAe,SAAS,CAAA,GAAI,SAAA,GAAY,OAAA;AACjD;AAEO,SAAS,YAAY,KAAA,EAAqC;AAC/D,EAAA,MAAM,EAAE,OAAO,OAAA,EAAS,WAAA,EAAa,WAAW,UAAA,EAAY,UAAA,EAAY,UAAS,GAAI,KAAA;AAErF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,UAAU,CAAA,CAAE,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,aAAa,iBAAA,CAAkB,EAAE,SAAS,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA;AAC9E,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,cAAa,GAAI,eAAA,CAAgB,OAAO,SAAA,EAAW;AAAA,IAC7E,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAK,CAAA,CAAE,IAAI,SAAS,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,aAAa,CAAA;AAC/D,EAAA,MAAM,UAAU,YAAA,CAAa,QAAA,EAAU,WAAW,OAAA,CAAQ,OAAO,GAAG,UAAU,CAAA;AAE9E,EAAA,MAAM,OAAO,SAAA,CAAU;AAAA,IACrB,OAAA;AAAA,IACA,cAAc,IAAA,CAAK,MAAA;AAAA,IACnB,aAAA;AAAA,IACA,UAAA,EAAY,QAAQ,MAAA,CAAO;AAAA,GAC5B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AC9DO,SAAS,GAAA,CAAI,MAAc,KAAA,EAA0B;AAC1D,EAAA,OAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AACzC;AAGO,SAAS,MAAA,CAAO,MAAc,KAAA,EAA0B;AAC7D,EAAA,OAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC1C;AAEA,IAAM,WAAA,GAA2D;AAAA,EAC/D,GAAA,EAAK,CAAC,IAAA,KAAS,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,EAC/B,MAAA,EAAQ,CAAC,IAAA,KAAS,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,EACnC,IAAA,EAAM,CAAC,IAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EAClC,UAAU,CAAC,IAAA,KAAS,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI;AACzC,CAAA;AAGO,SAAS,UAAU,KAAA,EAA4C;AACpE,EAAA,OAAO,YAAY,KAAK,CAAA;AAC1B;AAGO,SAAS,SAAA,CAAU,OAAkB,KAAA,EAA0B;AACpE,EAAA,OAAO,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAK,CAAA,CAAE,KAAK,CAAA,GAAI,KAAA;AACnD;AAGO,SAAS,cAAA,CAAe,SAAiB,KAAA,EAA0B;AACxE,EAAA,MAAM,IAAA,GAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AACvB,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,OAAO,IAAA;AACzB,EAAA,IAAI,OAAA,IAAW,EAAA,EAAI,OAAO,KAAA,CAAM,MAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,OAAA,IAAW,EAAA,EAAI,OAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAC3C,EAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AACvB;AAGO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,EAAA,GAAK,GAAA,EAAM,OAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC3B,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAClC;AAGO,SAAS,UAAU,KAAA,EAAe,IAAA,EAAc,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,EAAa;AAClF,EAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,KAAA,KAAU,CAAA,GAAI,OAAO,MAAM,CAAA,CAAA;AAChD;ACtCO,SAAS,KAAK,IAAA,EAAwB;AAC3C,EAAA,OAAO,QAAQ,IAAI,CAAA;AACrB;;;ACCA,IAAM,IAAA,GAAqB;AAAA,EACzB,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EACb,MAAM,MAAM;AAAA,EAAC;AACf,CAAA;AAEO,SAAS,mBAAmB,OAAA,EAAgC;AACjE,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAA,CAAO,OAAO,OAAO,IAAA;AAE9C,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,EAAA,KAAqB;AACjD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,EAAGE,KAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,IAAIA,KAAAA,CAAM,GAAA,CAAI,cAAA,CAAe,EAAE,CAAC,CAAC;AAAA;AAAA,KACxE;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,KAAA,EAAqB;AACxB,MAAA,IAAI,SAAS,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,GAAA,KAAQ,IAAI,CAAA;AAC7C,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,IAAA,GAAO,KAAK,GAAA,EAAI;AAAA,IAClB,CAAA;AAAA,IACA,IAAA,GAAa;AACX,MAAA,IAAI,SAAS,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,GAAA,KAAQ,IAAI,CAAA;AAC7C,MAAA,OAAA,GAAU,MAAA;AAAA,IACZ;AAAA,GACF;AACF;;;AC5CO,SAAS,aAAa,SAAA,EAAyC;AACpE,EAAA,IAAI,SAAA,KAAc,OAAO,OAAO,KAAA;AAChC,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,QAAA;AAC5B,EAAA,OAAO,OAAA,KAAY,UAAa,OAAA,KAAY,EAAA;AAC9C;;;ACCO,SAAS,WAAA,CAAY,SAAwB,IAAA,EAA0B;AAC5E,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU;AAC5C,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,CAAO,MAAA,EAAQ,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA,IAAK,EAAE,CAAC,CAAA;AACpE,IAAA,OAAO,IAAA,CAAK,IAAI,GAAG,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAe,KAAA,KAA0B;AACpD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA;AACrC,IAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,KAAA,KAAU,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,EACvF,CAAA;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC/E,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU,GAAA,CAAI,IAAA,EAAM,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAQO,SAAS,eAAe,OAAA,EAA0C;AACvE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAC5D,EAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAClF;ACrBA,SAAS,UAAU,IAAA,EAAqC;AACtD,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,KAAK,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,EAAA;AACzD,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,SAAA,CAAU,KAAK,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAA2B;AACpD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,SAAA,CAAU,IAAI,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,QAAQ,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,KAAK,EAAE,OAAA,EAAQ;AACpD;ACfA,IAAM,aAAA,GAAgB,EAAA;AAWf,SAAS,YAAY,OAAA,EAA+B;AACzD,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM,GAAI,OAAA;AAClC,EAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,IAAA,OAAO,iBAAY,KAAK,CAAA,EAAG,UAAU,CAAA,OAAA,EAAO,OAAO,KAAK,EAAE,CAAA,CAAA;AAAA,EAC5D;AACA,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAA,CAAK,SAAS,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,EAAG,OAAA,GAAU,CAAA,OAAA,EAAO,OAAO,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAC7E,EAAA,OAAO,KAAA,CAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI;AAAA,IAC1B,OAAA,EAAS,EAAE,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,IAC7B,KAAA,EAAO,QAAA;AAAA,IACP,WAAA,EAAa,OAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACd,CAAA;AACH;AAQO,SAAS,aAAA,CAAc,OAAe,KAAA,EAA0B;AACrE,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,OAAO,KAAA;AACzB,EAAA,OAAO,GAAGA,KAAAA,CAAM,GAAA,CAAI,SAAI,MAAA,CAAO,aAAa,CAAC,CAAC;AAAA,EAAKA,KAAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AACtE;;;ACvCA,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,IAAA,GAAO,QAAA;AACb,IAAM,KAAA,GAAQ,QAAA;AAEP,SAAS,SAAA,CAAU,KAAA,EAAe,KAAA,EAAkB,KAAA,EAA0B;AACnF,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,OAAO,EAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,GAAA,GAAO,KAAK,CAAC,CAAC,CAAA;AAC7E,EAAA,OAAO,SAAA,CAAU,KAAK,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,KAAA,GAAQ,MAAM,CAAC,CAAA;AAC5E;;;ACgBA,IAAM,kBAAA,GAAqB,EAAA;AAE3B,IAAM,YAAY,CAAC,OAAA,MAAuC,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAM,CAAA;AAGjF,SAAS,SAAA,CAAU,QAAA,EAAkB,KAAA,EAAe,OAAA,EAAkB,KAAA,EAA0B;AAC9F,EAAA,MAAM,KAAA,GAAkB,CAAC,GAAA,CAAI,QAAA,EAAU,KAAK,CAAC,CAAA;AAC7C,EAAA,IAAI,KAAA,IAAS,GAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,WAAA,EAAW,KAAK,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA;AACzD,EAAA,IAAI,SAAS,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,YAAA,EAAW,KAAK,CAAC,CAAA;AAC7C,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAGA,SAAS,UAAA,CAAW,QAAwB,KAAA,EAA0B;AACpE,EAAA,MAAM,EAAE,SAAQ,GAAI,MAAA;AACpB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG,KAAA,CAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AACrE,EAAA,IAAI,OAAA,CAAQ,aAAa,CAAA,EAAG,KAAA,CAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,UAAA,EAAY,WAAW,CAAC,CAAA;AACjF,EAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAC,CAAA;AAClE,EAAA,IAAI,OAAA,CAAQ,YAAY,CAAA,EAAG,KAAA,CAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAC,CAAA;AAC7E,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,CAAM,KAAK,QAAK,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AACjE;AAIA,SAAS,iBAAA,CAAkB,MAAA,EAAwB,GAAA,EAAa,KAAA,EAA8B;AAC5F,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,MAAA;AAC5B,EAAA,MAAM,SAAS,CAAC,GAAG,QAAA,CAAS,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,IACrC,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,IAAS,EAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI;AAAA,GACpE;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAiD;AACxE,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,MAAA,EAAQ;AAChC,IAAA,MAAM,OAA4C,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAU,EAAC,EAAE;AAC5E,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AACnF,IAAA,UAAA,CAAW,GAAA,CAAI,KAAK,IAAI,CAAA;AACxB,IAAA,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,MAAA,EAAQ;AAChC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,EAAC;AAC7C,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,SAAS,CAAA,CAC1B,MAAA;AAAA,MACC,CAAC,SAAA,KAAc,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,KAAM,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,UAAA,CAAW,GAAA,CAAI,SAAS;AAAA,MAExF,IAAA,CAAK,CAAC,GAAG,CAAA,KAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA,IAAK,CAAA,KAAM,UAAA,CAAW,IAAI,CAAC,CAAA,IAAK,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAE3F,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA,GAAI,WAAW,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,MAAA;AACzD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,mBAAA,CACd,MAAA,EACA,OAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,MAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,QAAQ,GAAG,CAAA;AAEvD,EAAA,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,iBAAA,EAAmB,SAAS,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAC3F,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAClC,EAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACrD,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,CAAC,QAAQ,IAAI,CAAA;AAAA,IACb,CAAC,MAAA,EAAQ,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,OAAO,KAAK,CAAC,CAAA,MAAA,EAAM,KAAK,OAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IACpF,CAAC,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,IACpC,CAAC,UAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,aAAA,EAAe,MAAM,CAAC,CAAA;AAAA,IACrD,CAAC,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IACtC,CAAC,YAAA,EAAc,cAAA,CAAe,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,IACxD,CAAC,YAAY,GAAA,CAAI,cAAA,CAAe,OAAO,UAAU,CAAA,EAAG,KAAK,CAAC;AAAA,GAC5D;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACzD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,EAAM;AAC/B,IAAA,MAAA,CAAO,SAAA,CAAU,GAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,YAAA,EAAc,KAAK,CAAC,CAAA;AACnD,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,SAAA,EAAW;AACpC,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,GAAG,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,OAAO,IAAA,CAAK,KAAA,EAAO,KAAK,CAAC,IAAI,GAAA,CAAI,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAC,CAAA;AAAA,KACjF;AAAA,EACF;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,uBAAA,EAAyB,KAAK,CAAC,CAAA;AAC9D,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ;AACvC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CACjB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAI,GAAG,CAAA;AACvC,QAAA,OAAO,WAAA,CAAY,IAAA,EAAM,IAAA,IAAQ,GAAA,EAAK,QAAQ,GAAG,CAAA;AAAA,MACnD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,CAAG,CAAA;AACjC,MAAA,MAAA,CAAO,UAAU,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,IAAI,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,UAAU,aAAA,CAAc,CAAA,gBAAA,EAAmB,QAAQ,aAAa,CAAA,CAAA,CAAA,EAAK,KAAK,CAAC,CAAA;AAClF,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,KAAK,KAAK,CAAA;AACzD,IAAA,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,IAAI,CAAC,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,IAAa,kBAAA;AACnC,IAAA,IAAI,OAAA,CAAQ,gBAAgB,KAAA,EAAO;AACjC,MAAA,MAAA,CAAO,SAAA;AAAA,QACL,IAAI,CAAA,EAAG,OAAA,CAAQ,aAAA,GAAgB,KAAK,4CAAuC,KAAK;AAAA,OAClF;AAAA,IACF;AACA,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,cAAA,EAAgB,KAAK,CAAC,CAAA;AACrD,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,EAAE,QAAQ,QAAA,EAAS;AAAA,MACnB,EAAE,QAAQ,QAAA,EAAS;AAAA,MACnB,EAAE,QAAQ,QAAA,EAAS;AAAA,MACnB,EAAE,QAAQ,QAAA;AAAS,KACrB;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAAA,MAC/C,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA;AAAA,MACvB,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAC;AAAA,KAC9B,CAAA;AACD,IAAA,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,OAAA,EAAS,WAAW,CAAC,CAAA;AAClD,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,qDAAqD,KAAK;AAAA,KAC/E;AAAA,EACF;AACF;AAGO,SAAS,sBAAA,CACd,MAAA,EACA,OAAA,EACA,GAAA,EACmB;AACnB,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAwB,MAAA,CAAO,MAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,IAAQ,GAAA;AAE/E,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,MAAA,CAAO,SAAS,MAAA,EAAQ,CAAA,CAC1C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,IAAS,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI,CAAC,CAAA,CAChE,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,MAAM,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,GAAG,GAAE,CAAE,CAAA;AAEjE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,GAAG,CAAA;AAAA,IACxC,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAA;AAAA,IACA,QAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC1C,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MACnE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,GAAG,CAAC;AAAA,KAC/D,CAAE,CAAA;AAAA,IACF,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,YAAY,MAAA,CAAO;AAAA,GACrB;AACF;AAaO,SAAS,iBAAA,CACd,KAAA,EACA,OAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAElB,EAAA,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,kBAAA,EAAoB,SAAS,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAC5F,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAA,CAAO,SAAA;AAAA,IACL,cAAA,CAAe;AAAA,MACb,CAAC,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAC7B,CAAC,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,MACrC,CAAC,UAAA,EAAY,MAAA,CAAO,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,MACxC,CAAC,YAAA,EAAc,MAAA,CAAO,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,MAC5C,CAAC,iBAAA,EAAmB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC;AAAA,KACzC;AAAA,GACH;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,sBAAA,EAAwB,KAAK,CAAC,CAAA;AAC7D,IAAA,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAACF,MAAAA,MAAU,EAAE,KAAA,EAAOA,MAAAA,EAAK,CAAE,CAAC,CAAC,CAAA;AAC3E,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AACA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,sBAAA,EAAwB,KAAK,CAAC,CAAA;AAC7D,IAAA,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAACA,MAAAA,MAAU,EAAE,KAAA,EAAOA,MAAAA,EAAK,CAAE,CAAC,CAAC,CAAA;AAC3E,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AAEA,EAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,uBAAA,EAAyB,KAAK,CAAC,CAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CACjB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,QAAA,OAAO,WAAA,CAAY,IAAA,EAAM,IAAA,IAAQ,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,MACjD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,CAAG,CAAA;AACjC,MAAA,MAAA,CAAO,UAAU,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AACF;AAGO,SAAS,oBAAA,CAAqB,OAAyB,OAAA,EAAkC;AAC9F,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAwB,KAAA,CAAM,MAAM,GAAA,CAAI,GAAG,GAAG,IAAA,IAAQ,GAAA;AACxE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,SAAA,EAAW,MAAM,KAAA,CAAM,KAAA;AAAA,IACvB,SAAA,EAAW,MAAM,KAAA,CAAM,aAAA;AAAA,IACvB,iBAAA,EAAmB,MAAM,KAAA,CAAM,aAAA;AAAA,IAC/B,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACnC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,MACzE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC;AAAA,KACrE,CAAE,CAAA;AAAA,IACF,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IAClD,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY;AAAC,GACpD;AACF;;;AC/SO,SAAS,cAAc,MAAA,EAAyB;AACrD,EAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAC3C;ACOO,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,IAAI,OAAA,CAAQ;AAAA,IACjB,2BAAA,EAA6B,IAAA;AAAA,IAC7B,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,KAAA;AAAA,MACT,GAAA,EAAKG,GAAG,OAAA,CAAQ,QAAA;AAAA,MAChB,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQA,GAAG,YAAA,CAAa;AAAA;AAC1B,GACD,CAAA;AACH;ACJA,eAAsB,UAAU,OAAA,EAAyC;AACvE,EAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,OAAA,CAAQ,QAAA,EAAU;AAAA,IACzC,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,MAAA,EAAQ,IAAA;AAAA,IACR,mBAAA,EAAqB,KAAA;AAAA,IACrB,cAAA,EAAgB;AAAA,GACjB,CAAA;AACD,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,aAAa,OAAA,EAAyB;AACpD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAChD,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,EAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,GAAA,EAAM,OAAO,CAAA,GAAA,CAAA;AACrF,EAAA,OAAO,IAAA;AACT;;;AC5BqC,CAAA,GAAA,EAAM,iBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AActF,SAAS,aAAa,QAAA,EAA2B;AACtD,EAAA,OAAO,cAAA,CAAe,QAAQ,CAAA,KAAM,MAAA;AACtC;;;ACNA,eAAsB,oBAAoB,OAAA,EAA8C;AACtF,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CACzB,GAAA,CAAI,YAAY,CAAA,CAChB,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,EAAE,CAAA,CAC5B,MAAA,CAAO,CAAC,oBAAoB,CAAC,CAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU;AAAA,IAC5B,KAAK,OAAA,CAAQ,OAAA;AAAA,IACb,UAAU,OAAA,CAAQ,OAAA;AAAA,IAClB,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,YAAY,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACrE;;;ACrBO,SAAS,eAAe,UAAA,EAAoC;AACjE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,gBAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,qBAAA,EAAsB,EAAG;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,uBAAA,EAAwB;AAC/C,IAAA,MAAM,YAAA,GAAe,KAAK,eAAA,EAAgB;AAE1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,QAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,MAC/B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,SAAA,IAAa,UAAA,CAAW,qBAAA,EAAsB,EAAG;AAC1D,IAAA,IAAI,CAAC,SAAA,CAAU,UAAA,EAAW,EAAG;AAC7B,IAAA,KAAA,MAAW,WAAA,IAAe,SAAA,CAAU,eAAA,EAAgB,EAAG;AACrD,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,UAAA,CAAW,YAAA,EAAa,EAAG;AAC1C,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,EAAW,EAAG;AACtB,IAAA,MAAM,IAAA,GAAO,GAAG,OAAA,EAAQ;AACxB,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,UAAA,CAAW,UAAA,EAAW,EAAG;AACzC,IAAA,IAAI,CAAC,GAAA,CAAI,UAAA,EAAW,EAAG;AACvB,IAAA,MAAM,IAAA,GAAO,IAAI,OAAA,EAAQ;AACzB,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,UAAA,CAAW,QAAA,EAAS,EAAG;AACtC,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,EAAW,EAAG;AACtB,IAAA,MAAM,IAAA,GAAO,GAAG,OAAA,EAAQ;AACxB,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,UAAA,CAAW,aAAA,EAAc,EAAG;AAC9C,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,EAAW,EAAG;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,EAC5B;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,UAAA,CAAW,cAAA,EAAe,EAAG;AAC/C,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,EAAW,EAAG;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,UAAA,GACJ,UAAA,CAAW,oBAAA,EAAqB,CAAE,MAAA,GAAS,KAC3C,UAAA,CAAW,YAAA,EAAa,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO,GAAG,eAAA,EAAiB,CAAA,IAC3D,UAAA,CAAW,UAAA,EAAW,CAAE,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,eAAA,EAAiB,CAAA;AAE7D,EAAA,KAAA,CAAM,IAAA,EAAK;AACX,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,cAAA,EAAgB,aAAA,EAAc;AAC5D;AC7DA,SAAS,YAAA,CACP,QAAA,EACA,KAAA,EACA,MAAA,EACiB;AACjB,EAAA,OAAO,KAAA,IAAS,KAAA,KAAU,QAAA,GACtB,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,MAAA,EAAO,GAChC,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAO;AAC/B;AAEO,SAAS,eAAe,UAAA,EAA6C;AAC1E,EAAA,MAAM,eAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,qBAAA,EAAsB,EAAG;AACrD,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,GAAA,EAAK,KAAK,uBAAA,EAAwB;AAAA,MAClC,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,MAC5B,UAAA,EAAY,IAAA,CACT,eAAA,EAAgB,CAChB,GAAA;AAAA,QAAI,CAAC,KAAA,KACJ,YAAA,CAAa,KAAA,CAAM,OAAA,EAAQ,EAAG,KAAA,CAAM,YAAA,EAAa,EAAG,OAAA,EAAQ,EAAG,KAAA,CAAM,YAAY;AAAA;AACnF,KACH,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,qBAAA,EAAsB,EAAG;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,uBAAA,EAAwB;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,GAAA,EAAK,SAAA;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,MAC5B,UAAA,EAAY,IAAA,CACT,eAAA,EAAgB,CAChB,GAAA;AAAA,QAAI,CAAC,KAAA,KACJ,YAAA,CAAa,KAAA,CAAM,OAAA,EAAQ,EAAG,KAAA,CAAM,YAAA,EAAa,EAAG,OAAA,EAAQ,EAAG,KAAA,CAAM,YAAY;AAAA;AACnF,KACH,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,iBAAA,GAAoB,WACvB,oBAAA,CAAqB,UAAA,CAAW,uBAAuB,CAAA,CACvD,GAAA,CAAI,CAAC,IAAA,KAAS,IAA+B,CAAA;AAChD,EAAA,KAAA,MAAW,QAAQ,iBAAA,EAAmB;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,wBAAA,CAAyB,UAAA,CAAW,aAAa,CAAA;AACtE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,GAAA,EAAK,QAAQ,cAAA,EAAe;AAAA,QAC5B,IAAA,EAAM,SAAA;AAAA,QACN,UAAA,EAAY,KAAA;AAAA,QACZ,YAAY;AAAC,OACd,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,oBAAA,CAAqB,UAAA,CAAW,cAAc,CAAA,EAAG;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,EAAc,CAAE,OAAA,EAAQ;AAC5C,IAAA,IAAI,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,QAAA,EAAU;AACjD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,EAAa,CAAE,CAAC,CAAA;AACtC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA,EAAG;AACjD,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,GAAA,EAAK,SAAS,cAAA,EAAe;AAAA,MAC7B,IAAA,EAAM,MAAA,KAAW,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,MACzC,UAAA,EAAY,KAAA;AAAA,MACZ,YAAY;AAAC,KACd,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,YAAA;AACT;;;AC7EO,SAAS,eAAe,UAAA,EAAoC;AACjE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,UAAA,CAAW,YAAA,EAAa,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,OAAA,EAAQ,IAAK,WAAW,CAAA;AAAA,IAC5E,OAAA,EAAS,UAAA,CAAW,UAAA,EAAW,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,EAAQ,IAAK,WAAW,CAAA;AAAA,IAC1E,UAAA,EAAY,WAAW,aAAA,EAAc,CAAE,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,IACrE,KAAA,EAAO,WAAW,QAAA,EAAS,CAAE,IAAI,CAAC,EAAA,KAAO,EAAA,CAAG,OAAA,EAAS,CAAA;AAAA,IACrD,WAAA,EAAa,WAAW,cAAA,EAAe,CAAE,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,EAAS;AAAA,GACzE;AACF;;;ACHO,SAAS,eAAA,CAAgB,SAAkB,QAAA,EAA8B;AAC9E,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,OAAA,CAAQ,oBAAoB,QAAQ,CAAA;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,cAAA,CAAe,QAAQ,CAAA,IAAK,IAAA;AAAA,MAClC,SAAS,EAAC;AAAA,MACV,OAAA,EAAS,EAAE,KAAA,EAAO,EAAC,EAAG,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,EAAC,EAAG,aAAA,EAAe,EAAC,EAAE;AAAA,MAC/E,SAAS,EAAE,SAAA,EAAW,EAAC,EAAG,SAAS,EAAC,EAAG,UAAA,EAAY,IAAI,KAAA,EAAO,EAAC,EAAG,WAAA,EAAa,EAAC,EAAE;AAAA,MAClF,YAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,KACnE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,cAAA,CAAe,QAAQ,CAAA,IAAK,IAAA;AAAA,IAClC,OAAA,EAAS,eAAe,UAAU,CAAA;AAAA,IAClC,OAAA,EAAS,eAAe,UAAU,CAAA;AAAA,IAClC,OAAA,EAAS,eAAe,UAAU;AAAA,GACpC;AACF;AAGO,SAAS,SAAA,CAAU,SAAkB,SAAA,EAAmC;AAC7E,EAAA,OAAO,UAAU,GAAA,CAAI,CAAC,aAAa,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAC,CAAA;AACvE;;;ACtBO,SAAS,WAAW,KAAA,EAAiC;AAC1D,EAAA,MAAM,WAAW,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAGvC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAsD,CAAC,CAAC,KAAA,EAAO,CAAC,CAAC,CAAA;AACvE,IAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAEjB,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAClC,MAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,MAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,GAAA;AACtB,MAAA,MAAM,SAAA,GAAY,CAAC,GAAI,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAI,CAAA,IAAK,EAAG,CAAA;AAErD,MAAA,IAAI,KAAA,GAAQ,UAAU,MAAA,EAAQ;AAC5B,QAAA,GAAA,CAAI,CAAC,IAAI,KAAA,GAAQ,CAAA;AACjB,QAAA,MAAM,QAAA,GAAW,UAAU,KAAK,CAAA;AAChC,QAAA,IAAI,aAAa,MAAA,EAAW;AAC5B,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC1B,UAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACpB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAC,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,GAAA,EAAI;AACV,QAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,MAAM,aAAyB,EAAC;AAEhC,EAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,IAAA,MAAM,KAAA,GAAQ,YAAY,CAAC,CAAA;AAC3B,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAEnD,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAK,CAAA;AACpB,IAAA,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,UAAA,CAAW,MAAM,CAAA;AAExC,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,EAAI;AACvB,MAAA,IAAI,SAAS,MAAA,EAAW;AACxB,MAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AACnB,MAAA,KAAA,MAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,IAAI,CAAA,IAAK,EAAC,EAAG;AACpD,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,UAAA,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,UAAA,CAAW,MAAM,CAAA;AAC3C,UAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,MAAA,GAAS,UAAU,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAA,KAAW,UAAa,KAAA,CAAM,OAAA,CAAQ,IAAI,MAAM,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,EAAG;AAClE,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,CAAC,MAAM,CAAA,EAAG,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,EAAG,CAAA;AAAA,MAC3D;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,SAAS,EAAE,IAAA,EAAK;AACpC,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,MAAMH,MAAAA,GAAO,uBAAA,CAAwB,KAAA,EAAO,SAAA,EAAW,YAAY,CAAA;AACnE,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAMA,MAAAA,IAAQ,CAAC,OAAA,CAAQ,CAAC,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAE,GAAG,CAAA;AAAA,EACnE;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,MAAA,IAAU,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAG,cAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAE;AAAA,GAC5F;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,uBAAA,CACP,KAAA,EACA,SAAA,EACA,YAAA,EACsB;AACtB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAMA,SAAiB,EAAC;AACxB,EAAA,IAAI,OAAA,GAA8B,UAAU,CAAC,CAAA;AAE7C,EAAA,KAAA,IAAS,KAAA,GAAQ,GAAG,KAAA,IAAS,SAAA,CAAU,SAAS,CAAA,IAAK,OAAA,KAAY,QAAW,KAAA,EAAA,EAAS;AACnF,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,KAAA,GAAQA,MAAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAClC,MAAA,IAAI,KAAA,KAAU,IAAI,OAAO,MAAA;AACzB,MAAA,MAAM,KAAA,GAAQA,MAAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,MAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,OAAO,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,EAAG;AAChE,QAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAA,CAAO,IAAI,OAAO,CAAA;AAClB,IAAAA,MAAAA,CAAK,KAAK,OAAO,CAAA;AAEjB,IAAA,MAAM,IAAA,GAAO,CAAC,GAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,OAAO,CAAA,IAAK,EAAG,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,SAAA,KACzD,YAAA,CAAa,GAAA,CAAI,SAAS;AAAA,KAC5B;AACA,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAEA,EAAA,OAAO,MAAA;AACT;AC9FA,SAAS,eAAA,CAAgB,IAAA,EAAc,QAAA,EAAuB,OAAA,EAAqC;AACjG,EAAA,KAAA,MAAW,SAAA,IAAa,mBAAA,CAAoB,IAAI,CAAA,EAAG;AACjD,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AACtC,IAAA,IAAI,SAAS,GAAA,CAAI,GAAG,GAAG,OAAOA,KAAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,SAAA,GAAY,gBAAgB,IAAI,CAAA;AACtC,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAC7C,IAAA,IAAI,SAAS,GAAA,CAAI,UAAU,GAAG,OAAOA,KAAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,aAAa,QAAA,EAA2B;AAC/C,EAAA,IAAI;AACF,IAAAI,GAAAA,CAAG,WAAW,QAAQ,CAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMA,SAAS,eAAA,CACP,SAAA,EACA,OAAA,EACA,OAAA,EACoB;AACpB,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,OAAA;AAE7B,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7B,IAAA,OAAOJ,MAAK,OAAA,CAAQ,OAAA,EAAS,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7B,IAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AACtD,EAAA,IAAI,WAAA,KAAgB,QAAW,OAAO,MAAA;AACtC,EAAA,OAAOA,KAAAA,CAAK,WAAW,WAAW,CAAA,GAAI,cAAcA,KAAAA,CAAK,OAAA,CAAQ,SAAS,WAAW,CAAA;AACvF;AAGA,SAAS,aAAA,CAAc,MAAc,OAAA,EAA8C;AACjF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,OAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACtC,EAAA,IAAI,SAAS,GAAA,CAAI,QAAQ,GAAG,OAAOA,KAAAA,CAAK,UAAU,IAAI,CAAA;AAEtD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AACtD,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,IAAKI,GAAAA,CAAG,SAAS,IAAI,CAAA,CAAE,aAAY,EAAG;AACzD,IAAA,MAAM,WAAA,GAAc,gBAAgBJ,KAAAA,CAAK,IAAA,CAAK,MAAM,OAAO,CAAA,EAAG,UAAU,OAAO,CAAA;AAC/E,IAAA,IAAI,aAAa,OAAO,WAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,WAAA,CACd,SAAA,EACA,QAAA,EACA,OAAA,EACc;AACd,EAAA,MAAM,OAAO,eAAA,CAAgB,SAAA,EAAWA,MAAK,OAAA,CAAQ,QAAQ,GAAG,OAAO,CAAA;AAEvE,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,IAAI,aAAa,MAAA,EAAW,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,UAAA,EAAW;AAC1E,IAAA,IAAI,aAAa,IAAI,CAAA,EAAG,OAAO,EAAE,MAAM,UAAA,EAAW;AAAA,EACpD;AAEA,EAAA,MAAM,aAAa,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,IAAK,SAAA,CAAU,WAAW,GAAG,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,gBAAgB,SAAA,EAAWA,KAAAA,CAAK,QAAQ,QAAQ,CAAA,EAAG,OAAO,CAAA,KAAM,MAAA;AAChF,EAAA,IAAI,UAAA,IAAc,OAAA,EAAS,OAAO,EAAE,MAAM,YAAA,EAAa;AACvD,EAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAC5B;AAOO,SAAS,cAAA,CACd,QAAA,EACA,gBAAA,EACA,OAAA,EACkE;AAClE,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,SAAA,EAAW,QAAA,EAAU,OAAO,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,QAAA,EAAU;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,MAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,UAAA,EAAW;AAC1C;;;ACtIO,SAAS,UAAA,CACd,OAAA,EACA,SAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,OAAA,EAAS,SAAS,CAAA;AAEhD,EAAA,MAAM,KAAA,uBAAsC,GAAA,EAAI;AAChD,EAAA,MAAM,OAAA,uBAA0C,GAAA,EAAI;AACpD,EAAA,MAAM,OAAA,uBAA0C,GAAA,EAAI;AACpD,EAAA,MAAM,QAAA,uBAA4C,GAAA,EAAI;AAEtD,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,EAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,QAAQ,OAAO,CAAA;AAChD,IAAA,KAAA,CAAM,IAAI,GAAA,EAAK,EAAE,MAAM,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,OAAO,UAAA,EAAY,WAAA,EAAA;AAAA,EAC1B;AAEA,EAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,QAAQ,OAAO,CAAA;AACpD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,QAAA,EAAU,kBAAA;AAAA,MACV;AAAA,KACF,GAAI,cAAA;AAAA,MACF,MAAA,CAAO,IAAA;AAAA,MACP,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,GAAG,CAAA;AAAA,MACrC;AAAA,KACF;AAEA,IAAA,aAAA,IAAiB,QAAA,CAAS,MAAA;AAC1B,IAAA,eAAA,IAAmB,UAAA,CAAW,MAAA;AAC9B,IAAA,aAAA,IAAiB,kBAAA,CAAmB,MAAA;AAEpC,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,IAAI,GAAA,CAAI,kBAAkB,CAAC,CAAA;AAAA,IACnD;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,OAAO,CAAA;AAC5B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,YAAY,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,wBAAS,GAAA,EAAY;AACzD,MAAA,SAAA,CAAU,IAAI,OAAO,CAAA;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,SAAS,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAyB;AAAA,IAC7B,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAQ,EAAC;AAAA,IACT,KAAA,EAAO;AAAA,MACL,OAAO,WAAA,CAAY,MAAA;AAAA,MACnB,MAAA,EAAQ,WAAA;AAAA,MACR,aAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA,EAAQ;AAAA;AACV,GACF;AACA,EAAA,KAAA,CAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,MAAA;AAClC,EAAA,OAAO,KAAA;AACT;;;ACtEA,eAAsB,YAAY,OAAA,EAAkD;AAClF,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB;AAAA,IAC1C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,OAAA,EAAS,QAAQ,MAAA,CAAO,OAAA;AAAA,IACxB,MAAA,EAAQ,QAAQ,MAAA,CAAO;AAAA,GACxB,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,SAAA,EAAW;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAA,EAAU,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAC,CAAC;AAAA,GACpE,CAAA;AACD,EAAA,MAAM,WAAA,GAAc,MAAM,iBAAA,CAAkB,OAAA,CAAQ,OAAO,CAAA;AAC3D,EAAA,OAAO,EAAE,OAAO,SAAA,EAAW,WAAA,EAAa,YAAY,IAAA,CAAK,GAAA,KAAQ,OAAA,EAAQ;AAC3E;AAGO,SAAS,iBAAA,CAAkB,SAAiB,GAAA,EAAqB;AACtE,EAAA,OAAOA,KAAAA,CAAK,WAAW,OAAO,CAAA,GAAI,UAAUA,KAAAA,CAAK,IAAA,CAAK,KAAK,OAAO,CAAA;AACpE;AAGO,SAAS,WAAA,CACd,KAAA,EACA,UAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,UAAA,EAAY,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,YAAA,CAAa,WAAA,CAAY,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,EAAE,GAAA,EAAI;AACf;;;ACtCA,eAAsB,cAAA,CACpB,OAAA,EACA,OAAA,EACAK,IAAAA,EACmB;AACnB,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,OAAA,EAASA,IAAAA,CAAI,GAAG,CAAA;AACrD,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,UAAU,CAAA,EAAI;AACnC,IAAA,MAAM,IAAI,WAAA,CAAY,CAAA,gBAAA,EAAmB,OAAO,CAAA,CAAA,EAAI,SAAS,QAAQ,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,CAAC,OAAA,CAAQ,IAAI,CAAA;AAChD,EAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,EAAA,MAAM,UAAU,MAAM,kBAAA,CAAmBA,IAAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AAEhE,EAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,EAAA,MAAM,EAAE,OAAO,WAAA,EAAa,UAAA,EAAY,YAAW,GAAI,MAAM,YAAY,OAAO,CAAA;AAEhF,EAAA,OAAA,CAAQ,KAAK,kBAAkB,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,SAAS,WAAA,CAAY;AAAA,IACzB,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAW,WAAA,CAAY,KAAA,EAAO,UAAA,EAAY,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA;AAAA,IAC3D,UAAA;AAAA,IACA,UAAA,EAAY,cAAc,SAAA,GAAY,OAAA,CAAA;AAAA,IACtC,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC,GAClE,CAAA;AACD,EAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,SAAS,sBAAA,CAAuB,MAAA,EAAQA,IAAAA,CAAI,OAAA,EAASA,KAAI,GAAG,CAAA;AAClE,IAAAA,IAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAM,CAAC,CAAA;AACtC,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAEA,EAAA,mBAAA;AAAA,IACE,MAAA;AAAA,IACA;AAAA,MACE,KAAKA,IAAAA,CAAI,GAAA;AAAA,MACT,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAASA,IAAAA,CAAI;AAAA,KACf;AAAA,IACAA,IAAAA,CAAI;AAAA,GACN;AACA,EAAA,OAAO,QAAA,CAAS,OAAA;AAClB;;;AC1CA,SAAS,IAAA,CACP,KAAA,EACA,QAAA,EACA,KAAA,EACA,UACA,GAAA,EACU;AACV,EAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAY,CAAC,QAAQ,CAAC,CAAA;AACvC,EAAA,MAAM,QAAoB,CAAC,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA;AACtD,EAAA,MAAM,UAAkD,EAAC;AAEzD,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,OAAA,CAAQ,QAAQ,QAAA,EAAU;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA,EAAG,QAAQ,OAAA,CAAQ,GAAA;AAC/D,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,CAAY,QAAA,EAAU,GAAG,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,KAAA,IAAS,QAAA,EAAU;AAEzD,IAAA,KAAA,MAAW,aAAa,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA,IAAK,EAAC,EAAG;AACpD,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAClB,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,OAAA,CAAQ,KAAA,GAAQ,GAAG,CAAA;AAAA,IACzD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CACJ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,IAAS,CAAA,CAAE,KAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA,CAChE,IAAI,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC9B;AAEA,eAAsB,YAAA,CACpB,OAAA,EACA,OAAA,EACAA,IAAAA,EACmB;AACnB,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,CAAC,OAAA,CAAQ,IAAI,CAAA;AAChD,EAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,EAAA,MAAM,MAAMA,IAAAA,CAAI,GAAA;AAEhB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,GAAA,EAAK,QAAQ,MAAM,CAAA;AAE5D,IAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,YAAY,OAAO,CAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb;AAAA,KACF;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,KAAA,EAAOA,IAAAA,CAAI,OAAO,CAAA;AACtD,QAAAA,IAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,iBAAA;AAAA,UACE,KAAA;AAAA,UACA;AAAA,YACE,GAAA;AAAA,YACA,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,YACjC,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,SAASA,IAAAA,CAAI;AAAA,WACf;AAAA,UACAA,IAAAA,CAAI;AAAA,SACN;AAAA,MACF;AACA,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAClB;AAEA,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,OAAA,EAAS,GAAG,CAAA;AACjD,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,YAAY,KAAA,EAAO,UAAA,EAAY,QAAQ,OAAO,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,EAAO,GAAA,EAAK,MAAM,OAAA,EAAS,OAAA,CAAQ,OAAO,GAAG,CAAA;AACrE,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,EAAO,GAAA,EAAK,MAAM,OAAA,EAAS,OAAA,CAAQ,OAAO,GAAG,CAAA;AAErE,IAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,MAAA,GAAS,oBAAA;AAAA,QACb;AAAA,UACE,GAAG,KAAA;AAAA,UACH,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,UAAA,EAAW,GAAI,EAAE,OAAA,EAAS,UAAA;AAAW,SACxE;AAAA,QACAA,IAAAA,CAAI;AAAA,OACN;AACA,MAAAA,IAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,iBAAA;AAAA,QACE;AAAA,UACE,GAAG,KAAA;AAAA,UACH,OAAA,EAAS,OAAA,CAAQ,OAAA,GAAU,KAAA,CAAA,GAAY,UAAA;AAAA,UACvC,OAAA,EAAS,OAAA,CAAQ,OAAA,GAAU,UAAA,GAAa,KAAA;AAAA,SAC1C;AAAA,QACA,EAAE,GAAA,EAAK,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,OAAA,EAASA,IAAAA,CAAI,OAAA,EAAQ;AAAA,QAC1FA,IAAAA,CAAI;AAAA,OACN;AAAA,IACF;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,EACf;AACF;AC5HO,SAAS,cAAc,OAAA,EAA+D;AAC3F,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,OAAO,KAAA,EAAO;AACrC,IAAA,OAAO,EAAE,OAAO,MAAM;AAAA,IAAC,CAAA,EAAG,MAAM,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC3C;AACA,EAAA,IAAI,QAAA;AACJ,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,EAAoB;AACxB,MAAA,QAAA,GAAW,GAAA,CAAI,IAAI,CAAA,CAAE,KAAA,EAAM;AAAA,IAC7B,CAAA;AAAA,IACA,IAAA,GAAa;AACX,MAAA,QAAA,EAAU,IAAA,EAAK;AACf,MAAA,QAAA,GAAW,MAAA;AAAA,IACb;AAAA,GACF;AACF;;;ACUA,eAAsB,aAAA,CACpB,SACAA,IAAAA,EACmB;AACnB,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACxC,EAAA,MAAM,KAAA,GAAmB,EAAE,KAAA,EAAM;AACjC,EAAA,MAAM,OAAA,GAAU,cAAc,KAAK,CAAA;AACnC,EAAA,OAAA,CAAQ,MAAM,2BAAsB,CAAA;AACpC,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,KAAA,EAA+B,MAAA,KAA0B;AACrF,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,IAAI;AACF,IAAA,KAAA,CAAM,iBAAA,EAAmB,IAAA,EAAM,OAAA,CAAQ,OAAO,CAAA;AAE9C,IAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgBA,IAAAA,CAAI,GAAG,CAAA;AACjD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,CAAM,gBAAgB,IAAA,EAAML,KAAAA,CAAK,SAASK,IAAAA,CAAI,GAAA,EAAK,WAAW,CAAC,CAAA;AAAA,IACjE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,cAAA,EAAgB,QAAQ,4CAA4C,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,UAAA,CAAWA,IAAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AACvD,MAAA,KAAA;AAAA,QACE,eAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA,CAAO,aAAaL,KAAAA,CAAK,QAAA,CAASK,KAAI,GAAA,EAAK,MAAA,CAAO,UAAU,CAAA,GAAI;AAAA,OAClE;AACA,MAAA,OAAA,GAAU,MAAM,kBAAA,CAAmBA,IAAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACd,MAAA,KAAA,CAAM,eAAA,EAAiB,QAAQ,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AACrF,MAAA,aAAA,CAAc,OAAA,EAASA,MAAK,KAAK,CAAA;AACjC,MAAA,OAAO,QAAA,CAAS,aAAA;AAAA,IAClB;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,KAAA,CAAM,eAAA,EAAiB,MAAML,KAAAA,CAAK,QAAA,CAASK,KAAI,GAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAC5E,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,eAAA,EAAiB,QAAQ,2CAAsC,CAAA;AAAA,IACvE;AAEA,IAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,IAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB;AAAA,MAC1C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,OAAA,EAAS,QAAQ,MAAA,CAAO,OAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,CAAO;AAAA,KACxB,CAAA;AACD,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAG,SAAA,CAAU,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,cAAA,EAAgB,QAAQ,2CAA2C,CAAA;AAAA,IAC3E;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC3C,MAAA,KAAA,CAAM,cAAA,EAAgB,MAAM,CAAA,EAAG,MAAA,CAAO,KAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,SAAA,EAAW;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAA,EAAU,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAC,CAAC;AAAA,KACpE,CAAA;AAED,IAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,IAAA,MAAM,YAAY,KAAA,CAAM,KAAA,KAAU,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AAC/D,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,KAAA,CAAM,OAAA,EAAS,MAAM,0BAA0B,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,aAAa,GAAA,EAAK;AAC3B,MAAA,KAAA,CAAM,SAAS,MAAA,EAAQ,CAAA,EAAG,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAChF,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAS,MAAA,EAAQ,CAAA,EAAG,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAChF;AAEA,IAAA,IAAI,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAC/B,MAAA,KAAA,CAAM,mBAAA,EAAqB,MAAM,+BAA+B,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,mBAAA,EAAqB,MAAA,EAAQ,CAAA,EAAG,KAAA,CAAM,eAAe,CAAA,qBAAA,CAAuB,CAAA;AAAA,IACpF;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,KAAA,CAAM,uBAAA,EAAyB,MAAM,YAAY,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,uBAAA,EAAyB,MAAA,EAAQ,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,eAAA,CAAiB,CAAA;AAAA,IACzE;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,EACf;AAEA,EAAA,aAAA,CAAc,OAAA,EAASA,MAAK,KAAK,CAAA;AACjC,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAACC,MAAAA,KAAUA,MAAAA,CAAM,UAAU,MAAM,CAAA;AAC7D,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAACA,MAAAA,KAAUA,MAAAA,CAAM,UAAU,MAAM,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,MAAA,GACZ,EAAE,IAAA,EAAM,KAAK,OAAO,CAAA,EAAG,IAAA,EAAM,2BAAA,EAA6B,OAAOJ,KAAAA,CAAM,GAAA,EAAI,GAC3E,MAAA,GACE,EAAE,IAAA,EAAM,IAAA,CAAK,SAAS,CAAA,EAAG,IAAA,EAAM,iCAAA,EAAmC,KAAA,EAAOA,KAAAA,CAAM,QAAO,GACtF,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAOA,MAAM,KAAA,EAAM;AAC3E,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAM,OAAA,CAAQ,IAAI,IAAI,OAAA,CAAQ,IAAA;AACxE,EAAAG,IAAAA,CAAI,OAAO,SAAA,CAAU,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACrD,EAAA,OAAO,MAAA,GAAS,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA;AAC9C;AAEA,SAAS,aAAA,CAAc,OAAA,EAAwBA,IAAAA,EAAqB,KAAA,EAAsB;AACxF,EAAA,MAAM,KAAA,GAAmB,EAAE,KAAA,EAAM;AACjC,EAAAA,IAAAA,CAAI,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,sBAAA,EAAwB,OAAA,EAASA,IAAAA,CAAI,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAChG,EAAAA,IAAAA,CAAI,OAAO,SAAA,EAAU;AAErB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACpE,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,SAAA,GACJ,KAAA,CAAM,KAAA,KAAU,IAAA,GACZ,KAAK,MAAM,CAAA,GACX,KAAA,CAAM,KAAA,KAAU,MAAA,GACd,IAAA,CAAK,SAAS,CAAA,GACd,KAAK,OAAO,CAAA;AACpB,IAAA,MAAM,OAAA,GACJ,KAAA,CAAM,KAAA,KAAU,IAAA,GAAOH,KAAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,KAAU,MAAA,GAASA,KAAAA,CAAM,MAAA,GAASA,KAAAA,CAAM,GAAA;AACrF,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQ,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAA,GAAK,EAAA;AAC/D,IAAAG,IAAAA,CAAI,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,EACtE;AACA,EAAAA,IAAAA,CAAI,OAAO,SAAA,EAAU;AACvB;ACzIA,IAAM,aAAA,GAAgB,oBAAA;AAEtB,eAAsB,WAAA,CAAY,SAAsBA,IAAAA,EAAwC;AAC9F,EAAA,MAAM,QAAQ,EAAE,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA,EAAE;AACnD,EAAA,MAAM,MAAA,GAASL,KAAAA,CAAK,IAAA,CAAKK,IAAAA,CAAI,KAAK,aAAa,CAAA;AAE/C,EAAA,IAAI;AACF,IAAA,MAAMD,EAAAA,CAAG,OAAO,MAAM,CAAA;AACtB,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQF,KAAAA,CAAM,GAAA,CAAI,KAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,OAAO,CAAA;AAClE,MAAAG,KAAI,MAAA,CAAO,SAAA;AAAA,QACT,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,aAAa,CAAA,8CAAA;AAAA,OAC1B;AACA,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAClB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,GAAG;AAAA,GACL;AAEA,EAAA,IAAI;AACF,IAAA,MAAMD,EAAAA,CAAG,UAAU,MAAA,EAAQ,CAAA,EAAG,KAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,MAAM,CAAA;AAC1E,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQF,KAAAA,CAAM,KAAA,CAAM,KAAK,MAAM,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA;AAClE,IAAAG,KAAI,MAAA,CAAO,SAAA,CAAU,GAAG,IAAI,CAAA,OAAA,EAAU,aAAa,CAAA,CAAE,CAAA;AACrD,IAAAA,KAAI,MAAA,CAAO,SAAA;AAAA,MACT,CAAA,EAAA,EAAK,GAAA,CAAI,0DAAA,EAA4D,KAAK,CAAC,CAAA;AAAA,KAC7E;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQH,KAAAA,CAAM,GAAA,CAAI,KAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,OAAO,CAAA;AAClE,IAAAG,KAAI,MAAA,CAAO,SAAA;AAAA,MACT,CAAA,EAAG,IAAI,CAAA,iBAAA,EAAoB,aAAa,CAAA,EAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACrG;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AACF;ACtCA,IAAM,aAAA,GAAgB,CAAC,aAAA,EAAe,MAAA,EAAQ,QAAQ,CAAA;AAEtD,SAAS,GAAA,CAAI,MAAgB,GAAA,EAAqB;AAChD,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,EAAM;AAAA,IAC/B,GAAA;AAAA,IACA,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,GACjC,EAAE,IAAA,EAAK;AACV;AAEA,SAAS,SAAA,CAAU,KAAa,GAAA,EAAsB;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,GAAA,CAAI,CAAC,aAAa,UAAA,EAAY,GAAG,GAAG,GAAG,CAAA;AACnD,IAAA,OAAO,IAAI,MAAA,GAAS,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,WAAA,CAAY,KAAa,SAAA,EAA4B;AACnE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,CAAC,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,WAAA,CAAY,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAA,EAAI,SAAS,QAAQ,CAAA;AAAA,IAC5E;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,IAAI,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA,EAAG,OAAO,SAAA;AAAA,EACxC;AACA,EAAA,MAAM,IAAI,WAAA;AAAA,IACR,wFAAA;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AAMO,SAAS,YAAA,CAAa,KAAa,IAAA,EAA6B;AACrE,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,EAAK,IAAI,CAAA;AACvC,EAAA,IAAI,UAAA,GAAa,SAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,GAAA,CAAI,CAAC,cAAc,SAAA,EAAW,MAAM,GAAG,GAAG,CAAA;AAC5D,IAAA,IAAI,WAAW,UAAA,GAAa,SAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAI,CAAC,MAAA,EAAQ,eAAe,qBAAA,EAAuB,UAAU,GAAG,GAAG,CAAA;AACnF,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,IAAA,IAAI,KAAK,IAAA,EAAK,QAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,YAAY,GAAA,CAAI,CAAC,YAAY,UAAA,EAAY,oBAAoB,GAAG,GAAG,CAAA;AACzE,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,EAAG;AACxC,IAAA,IAAI,KAAK,IAAA,EAAK,QAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,EAAE,WAAW,KAAA,EAAO,CAAC,GAAG,KAAK,CAAA,CAAE,MAAK,EAAE;AAC/C;;;AC3CA,IAAM,WAAA,GAAyC,EAAE,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AAEzF,IAAM,aAAwC,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAM,CAAA,EAAG,UAAU,CAAA,EAAE;AAEhF,IAAM,YAAA,GAA0C;AAAA,EAC9C,MAAA,EAAQ,oBAAA;AAAA,EACR,IAAA,EAAM,qBAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AASO,SAAS,YAAY,OAAA,EAAuC;AACjE,EAAA,MAAM,MAAA,GAAqB,EAAE,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AACrE,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,WAAA,EAAiC,CAAA,IAAK,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,YAAA,CAAa,QAAoB,IAAA,EAAyB;AACxE,EAAA,MAAM,SAAA,GAAY,WAAW,IAAI,CAAA;AACjC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,WAAA,CAAY,QAAA,IAAY,SAAA,IAAa,MAAA,CAAO,QAAA,GAAW,CAAA;AACzD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,SAAA,CAAW,CAAA;AAC1C,EAAA,IAAI,WAAA,CAAY,IAAA,IAAQ,SAAA,IAAa,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,KAAA,CAAO,CAAA;AACtF,EAAA,IAAI,WAAA,CAAY,MAAA,IAAU,SAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAA;AAC9F,EAAA,IAAI,WAAA,CAAY,GAAA,IAAO,SAAA,IAAa,MAAA,CAAO,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,IAAA,CAAM,CAAA;AAClF,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,GAAI,MAAA;AAChD;AAEA,eAAsB,WAAA,CAAY,SAAsBA,IAAAA,EAAwC;AAC9F,EAAA,MAAM,QAAmB,EAAE,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA,EAAE;AAC9D,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,CAAC,OAAA,CAAQ,IAAI,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,MAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AAEzB,EAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,YAAA,CAAaA,IAAAA,CAAI,GAAA,EAAK,QAAQ,IAAI,CAAA;AAElD,EAAA,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AACtC,EAAA,MAAM,UAAU,MAAM,kBAAA,CAAmBA,IAAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AAChE,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,YAAY,OAAO,CAAA;AAExD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA4B;AAC9C,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,KAAA,EAAO;AAC/B,IAAA,MAAM,GAAA,GAAML,KAAAA,CAAK,OAAA,CAAQK,IAAAA,CAAI,KAAK,GAAG,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,OAAO,CAAA;AACxC,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,GAAA;AAAA,MACJ,GAAA;AAAA,MACA,WAAA,CAAY;AAAA,QACV,KAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA,EAAW,GAAA;AAAA,QACX,UAAA,EAAY,GAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC,OAClE;AAAA,KACH;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,EAAA,MAAM,UAAU,CAAC,GAAG,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,KAAK,KAAK,CAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,YAAY,OAAO,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,WAAA,CAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,IAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAC3F,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAEhC,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAAA,KAAI,MAAA,CAAO,KAAA;AAAA,MACT,aAAA;AAAA,QACE,mBAAA;AAAA,UACE,OAAA,CAAQ,SAAA;AAAA,UACR,OAAA,CAAQ,KAAA;AAAA,UACR,KAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACAA,IAAAA,CAAI;AAAA;AACN;AACF,KACF;AACA,IAAA,OAAO,OAAA,GAAU,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA;AAAA,EAC/C;AAEA,EAAA,gBAAA;AAAA,IACE;AAAA,MACE,KAAKA,IAAAA,CAAI,GAAA;AAAA,MACT,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,IACAA,IAAAA,CAAI;AAAA,GACN;AACA,EAAA,OAAO,OAAA,GAAU,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA;AAC/C;AAgBO,SAAS,gBAAA,CAAiB,OAAwB,MAAA,EAA4B;AACnF,EAAA,MAAM,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,KAAA,EAAM,GACxF,KAAA;AAEF,EAAA,MAAA,CAAO,SAAA,CAAU,YAAY,EAAE,KAAA,EAAO,WAAW,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,CAAC,CAAA;AACtE,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,CAAC,SAAA,EAAW,SAAA,CAAU,KAAA,CAAM,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAC3C,CAAC,QAAA,EAAU,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAC5C,CAAC,UAAA,EAAY,GAAA,CAAI,eAAe,UAAU,CAAA,EAAG,KAAK,CAAC;AAAA,GACrD;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACzD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,EAAM;AAC/B,IAAA,MAAA,CAAO,SAAA,CAAU,GAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAM,OAAO,OAAA,GAAU,IAAA,CAAK,OAAO,CAAA,GAAI,KAAK,MAAM,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,OAAA,GAAUH,KAAAA,CAAM,GAAA,GAAMA,KAAAA,CAAM,KAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,UAAU,cAAA,GAAiB,aAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAO,OAAA,EAAS,KAAK,CAAC,CAAA,GAAI,OAAA;AAClE,EAAA,MAAA,CAAO,SAAA;AAAA,IACL,GAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,QAAA,EAAM,aAAa,MAAA,EAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,YAAA,CAAa,IAAI,CAAC,CAAA,CAAA,CAAA,EAAK,KAAK,CAAC,CAAA;AAAA,GACrG;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAA,CAAO,UAAU,aAAA,CAAc,CAAA,eAAA,EAAkB,QAAQ,MAAM,CAAA,OAAA,CAAA,EAAW,KAAK,CAAC,CAAA;AAChF,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,QAAQ,WAAA,CAAY,MAAA,CAAO,KAAK,KAAK,CAAA,IAAK,WAAW,IAAI,CAAA;AAC/D,IAAA,MAAM,WAAW,KAAA,GAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,KAAK,MAAM,CAAA;AACpD,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,GACvB,KAAA,GACEA,KAAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,GAClBA,KAAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,GACtB,QAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,UAAU,MAAA,CAAO,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACnE,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,GAAG,CAAA;AAC/C,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,GAAG,YAAY,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,SAAA,CAAU,OAAO,IAAA,CAAK,KAAA,EAAO,KAAK,CAAC,SAAM,KAAK,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAK,EAAE,CAAA;AAAA,KAC3G;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,GAAG,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA,EAAG,KAAK,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,qBAAA,EAAuB,KAAK,CAAC,CAAA;AAAA,KACzF;AAAA,EACF;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AACnB;AAEO,SAAS,mBAAA,CACd,WACA,gBAAA,EACA,KAAA,EACA,MACA,OAAA,EACA,MAAA,EACA,YACA,OAAA,EACgB;AAChB,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,GAAA;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAA,EAAe,OAAO,OAAA,CAAQ,aAAA;AAAA,QAC9B,eAAe,MAAA,CAAO;AAAA,OACvB,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,OAAO,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,EAAM,KAAA,IAAS,EAAA,KAAO,CAAA,CAAE,IAAA,EAAM,KAAA,IAAS,EAAA,CAAG,CAAA;AAElE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS,MAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,cAAc,gBAAA,CAAiB,MAAA;AAAA,IAC/B,KAAA;AAAA,IACA,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAM,SAAS,MAAA,EAAO;AAAA,IACrC;AAAA,GACF;AACF;;;AC/OA,IAAM,YAAA,GAAe,QAAA;AAEd,SAAS,cAAcG,IAAAA,EAA8B;AAC1D,EAAA,MAAM,UAAU,IAAI,OAAA,EAAQ,CACzB,IAAA,CAAK,YAAY,CAAA,CACjB,WAAA,CAAY,oEAAoE,CAAA,CAChF,QAAQA,IAAAA,CAAI,OAAA,EAAS,eAAA,EAAiB,0BAA0B,EAChE,kBAAA,EAAmB;AAEtB,EAAA,OAAA,CACG,OAAA,CAAQ,gBAAgB,CAAA,CACxB,WAAA,CAAY,uCAAuC,CAAA,CACnD,MAAA,CAAO,YAAA,EAAc,qCAAqC,CAAA,CAC1D,MAAA,CAAO,eAAA,EAAiB,mCAAmC,CAAA,CAC3D,MAAA,CAAO,sBAAA,EAAwB,iCAAA,EAAmC,gBAAgB,CAAA,CAClF,MAAA,CAAO,qBAAA,EAAuB,8BAA8B,CAAA,CAC5D,MAAA,CAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,MAAc,OAAA,KAAqC;AAChE,IAAA,MAAMJ,YAAW,MAAM,cAAA;AAAA,MACrB,IAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC1B,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAgB,GAAI,EAAC;AAAA,QACxE,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAiB,GAAI,EAAC;AAAA,QAC3E,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAI;AAAA,KACF;AACA,IAAA,IAAIJ,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,cAAc,CAAA,CACtB,WAAA,CAAY,8DAA8D,CAAA,CAC1E,MAAA,CAAO,YAAA,EAAc,qCAAqC,EAC1D,MAAA,CAAO,eAAA,EAAiB,wBAAwB,CAAA,CAChD,OAAO,eAAA,EAAiB,+DAA+D,CAAA,CACvF,MAAA,CAAO,sBAAA,EAAwB,oBAAA,EAAsB,gBAAgB,CAAA,CACrE,OAAO,qBAAA,EAAuB,8BAA8B,CAAA,CAC5D,MAAA,CAAO,cAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,MAA0B,OAAA,KAAqC;AAC5E,IAAA,MAAMA,YAAW,MAAM,YAAA;AAAA,MACrB,IAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC1B,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAgB,GAAI,EAAC;AAAA,QACxE,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAiB,GAAI,EAAC;AAAA,QAC3E,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAI;AAAA,KACF;AACA,IAAA,IAAIJ,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,+DAA+D,EAC3E,MAAA,CAAO,YAAA,EAAc,qCAAqC,CAAA,CAC1D,OAAO,eAAA,EAAiB,wBAAwB,EAChD,MAAA,CAAO,kBAAA,EAAoB,8DAA8D,CAAA,CACzF,MAAA;AAAA,IACC,oBAAA;AAAA,IACA,4DAAA;AAAA,IACA;AAAA,IAED,MAAA,CAAO,sBAAA,EAAwB,iCAAA,EAAmC,gBAAgB,EAClF,MAAA,CAAO,qBAAA,EAAuB,8BAA8B,CAAA,CAC5D,OAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,IAAA,MAAMA,YAAW,MAAM,WAAA;AAAA,MACrB;AAAA,QACE,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC1B,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAe,GAAI,EAAC;AAAA,QACrE,GAAI,QAAQ,IAAA,KAAS,MAAA,GACjB,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAuC,GACvD,EAAC;AAAA,QACL,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAgB,GAAI,EAAC;AAAA,QACxE,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAiB,GAAI,EAAC;AAAA,QAC3E,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAI;AAAA,KACF;AACA,IAAA,IAAIJ,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,wDAAwD,CAAA,CACpE,MAAA,CAAO,iBAAiB,4BAA4B,CAAA,CACpD,OAAO,qBAAA,EAAuB,8BAA8B,EAC5D,MAAA,CAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,IAAA,MAAMA,YAAW,MAAM,aAAA;AAAA,MACrB;AAAA,QACE,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAI;AAAA,KACF;AACA,IAAA,IAAIJ,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,MAAM,CAAA,CACd,WAAA,CAAY,uDAAuD,EACnE,MAAA,CAAO,aAAA,EAAe,mCAAmC,CAAA,CACzD,OAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,IAAA,MAAMA,YAAW,MAAM,WAAA;AAAA,MACrB,EAAE,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG,KAAA,EAAO,QAAQ,KAAA,EAA6B;AAAA,MAC7EI;AAAA,KACF;AACA,IAAA,IAAIJ,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,QAAQ,SAAS,CAAA,CACjB,YAAY,0BAA0B,CAAA,CACtC,OAAO,MAAM;AACZ,IAAAI,IAAAA,CAAI,MAAA,CAAO,SAAA,CAAUA,IAAAA,CAAI,OAAO,CAAA;AAAA,EAClC,CAAC,CAAA;AAEH,EAAA,OAAA,CAAQ,WAAA;AAAA,IACN,WAAA;AAAA,IACA,CAAA;AAAA;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT;AAGA,IAAM,SAAA,GAAN,cAAwB,KAAA,CAAM;AAAA,EAC5B,YAAqBJ,SAAAA,EAAwB;AAC3C,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQA,SAAQ,CAAA,CAAE,CAAA;AADL,IAAA,IAAA,CAAA,QAAA,GAAAA,SAAAA;AAEnB,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA,EACd;AAAA,EAHqB,QAAA;AAIvB,CAAA;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,SAAS,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA;AAAA,MACA,2BAAA;AAAA,MACA,qCAAqC,KAAK,CAAA,CAAA;AAAA,KAC5C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,eAAe,KAAA,EAA+C;AACrE,EAAA,IAAI,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAA,IAAU,UAAU,UAAA,EAAY;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,cAAA;AAAA,IACR,CAAA;AAAA,IACA,2BAAA;AAAA,IACA,kDAAkD,KAAK,CAAA,CAAA;AAAA,GACzD;AACF;AAGA,SAAS,UAAA,CAAW,OAAgBI,IAAAA,EAA2B;AAC7D,EAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,IAAAA,KAAI,WAAA,CAAY,SAAA,CAAU,CAAA,OAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,KAAA,CAAM,MAAMA,IAAAA,CAAI,YAAY,SAAA,CAAU,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC3D,IAAA;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAAA,KAAI,WAAA,CAAY,SAAA,CAAU,CAAA,OAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC9C,IAAA;AAAA,EACF;AACA,EAAAA,KAAI,WAAA,CAAY,SAAA,CAAU,UAAK,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAChD;AAQA,eAAsB,GAAA,CAAI,EAAE,IAAA,EAAM,GAAA,EAAAA,MAAI,EAAsC;AAC1E,EAAA,MAAM,OAAA,GAAU,cAAcA,IAAG,CAAA;AACjC,EAAA,OAAA,CAAQ,YAAA,EAAa;AAErB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,WAAW,IAAI,CAAA;AAC7B,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,MAAA,OAAO,KAAA,CAAM,QAAA;AAAA,IACf;AACA,IAAA,IAAI,iBAAiB,cAAA,EAAgB;AACnC,MAAA,IAAI,KAAA,CAAM,QAAA,KAAa,CAAA,EAAG,OAAO,QAAA,CAAS,OAAA;AAC1C,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAClB;AACA,IAAA,UAAA,CAAW,OAAOA,IAAG,CAAA;AACrB,IAAA,OAAO,KAAA,YAAiB,WAAA,GAAc,KAAA,CAAM,QAAA,GAAW,QAAA,CAAS,OAAA;AAAA,EAClE;AACF;;;ACtOA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OAiFb,CAAA;;;AC1EA,IAAM,GAAA,GAAM;AAAA,EACV,MAAA,EAAQ,IAAI,cAAA,EAAe;AAAA,EAC3B,WAAA,EAAa,IAAI,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA;AAAA,EAC9C,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EACjB,SAAS,eAAA,CAAI;AACf,CAAA;AAEA,IAAM,QAAA,GAAW,MAAM,GAAA,CAAI,EAAE,MAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AACtD,OAAA,CAAQ,QAAA,GAAW,QAAA","file":"bin.js","sourcesContent":["import type { OutputWriter } from \"../types/cli.js\";\n\n/**\n * Output writers. The CLI writes to stdout (or an injected stream); tests\n * use the in-memory implementation.\n */\n\nexport class TerminalWriter implements OutputWriter {\n constructor(private readonly stream: NodeJS.WritableStream = process.stdout) {}\n\n write(text: string): void {\n this.stream.write(text);\n }\n\n writeLine(text = \"\"): void {\n this.stream.write(`${text}\\n`);\n }\n}\n\nexport class InMemoryWriter implements OutputWriter {\n readonly chunks: string[] = [];\n\n write(text: string): void {\n this.chunks.push(text);\n }\n\n writeLine(text = \"\"): void {\n this.chunks.push(`${text}\\n`);\n }\n\n /** Full captured output. */\n get output(): string {\n return this.chunks.join(\"\");\n }\n\n /** Captured output split into lines (trailing newline removed). */\n get lines(): string[] {\n return this.output.replace(/\\n$/, \"\").split(\"\\n\");\n }\n}\n","/**\n * Shared contracts between the CLI layer and the analysis pipeline.\n * Kept free of commander types so the pipeline stays testable in isolation.\n */\n\n/** Parsed command-line options for `ripple analyze`. */\nexport interface AnalyzeOptions {\n json: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Cap on reverse traversal depth. `undefined` = unlimited. */\n depth?: number;\n /** Path to a config file. Overrides discovery. */\n config?: string;\n}\n\n/** Parsed command-line options for `ripple graph`. */\nexport interface GraphOptions {\n json: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Show the dependency tree of one file instead of project stats. */\n file?: string;\n /** Render dependents (reverse) instead of dependants (forward). */\n reverse: boolean;\n /** Cap on tree depth. */\n depth?: number;\n config?: string;\n}\n\n/** Parsed command-line options for `ripple doctor`. */\nexport interface DoctorOptions {\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n config?: string;\n}\n\n/** Parsed command-line options for `ripple init`. */\nexport interface InitOptions {\n force: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n}\n\n/** Parsed command-line options for `ripple diff`. */\nexport interface DiffOptions {\n json: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Git ref to compute the change set against. */\n base?: string;\n /** Minimum risk level that blocks the gate. */\n gate?: \"medium\" | \"high\" | \"critical\";\n /** Cap on reverse traversal depth per file. */\n depth?: number;\n config?: string;\n}\n\n/** Process exit codes used across commands. */\nexport const ExitCode = {\n Success: 0,\n Failure: 1,\n NotFound: 2,\n InvalidConfig: 3,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n/**\n * Abstraction over the destination of rendered output. The real CLI writes to\n * stdout; tests inject an in-memory implementation.\n */\nexport interface OutputWriter {\n write(text: string): void;\n writeLine(text?: string): void;\n}\n\n/** Everything commands need injected; no globals anywhere. */\nexport interface CommandContext {\n writer: OutputWriter;\n /** Stream for error messages (stderr in the real CLI). */\n errorWriter: OutputWriter;\n cwd: string;\n version: string;\n}\n","import fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Thin, safe filesystem helpers. All reads are optional: Ripple must never\n * crash the whole analysis because one file is unreadable.\n */\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function pathExistsSync(filePath: string): boolean {\n try {\n fsSync.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Read a file as UTF-8; returns `undefined` when unreadable. */\nexport async function readFileSafe(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\n/** Read a small JSON-ish file synchronously; returns `undefined` when unreadable. */\nexport function readJsonSafe(filePath: string): unknown | undefined {\n try {\n return JSON.parse(fsSync.readFileSync(filePath, \"utf8\"));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Find the closest package.json above `startDir`. Used to detect project\n * entry points (`main`, `bin`).\n */\nexport async function findPackageJson(startDir: string): Promise<string | undefined> {\n let current = path.resolve(startDir);\n for (;;) {\n const candidate = path.join(current, \"package.json\");\n if (await pathExists(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\n/** Read `main` / `bin` entries of a package.json for entry-point detection. */\nexport async function readPackageEntryPoints(packageJsonPath: string): Promise<string[]> {\n const raw = await readFileSafe(packageJsonPath);\n if (!raw) return [];\n try {\n const manifest = JSON.parse(raw) as { main?: string; bin?: string | Record<string, string> };\n const entries: string[] = [];\n if (typeof manifest.main === \"string\") entries.push(manifest.main);\n if (typeof manifest.bin === \"string\") entries.push(manifest.bin);\n if (manifest.bin && typeof manifest.bin === \"object\")\n entries.push(...Object.values(manifest.bin));\n return entries;\n } catch {\n return [];\n }\n}\n","import { ExitCode } from \"../types/cli.js\";\n\n/**\n * Error type surfaced to the CLI entry point. Carries an exit code and an\n * optional hint that explains how to recover.\n */\nexport class RippleError extends Error {\n readonly exitCode: ExitCode;\n readonly hint?: string;\n\n constructor(message: string, exitCode: ExitCode = ExitCode.Failure, hint?: string) {\n super(message);\n this.name = \"RippleError\";\n this.exitCode = exitCode;\n this.hint = hint;\n }\n}\n\n/** Thrown when a file passed to `ripple analyze` cannot be found. */\nexport function fileNotFound(filePath: string): RippleError {\n return new RippleError(\n `File not found: ${filePath}`,\n ExitCode.NotFound,\n \"Run `ripple graph` to list the files Ripple can analyze.\",\n );\n}\n","import path from \"node:path\";\nimport { ts } from \"ts-morph\";\nimport type { TsconfigInfo } from \"../types/project.js\";\nimport { pathExistsSync } from \"./fs.js\";\n\n/**\n * tsconfig.json loading and alias extraction.\n *\n * Uses the TypeScript compiler API (bundled with ts-morph) so that `extends`,\n * comments and JSONC are handled exactly like the real compiler handles them.\n */\nexport function findTsconfig(startDir: string): string | undefined {\n return ts.findConfigFile(startDir, pathExistsSync, \"tsconfig.json\");\n}\n\nfunction asStringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\n/**\n * Read and parse a tsconfig.json. Returns `undefined` when the file is\n * missing or malformed (callers decide how to surface that).\n */\nexport function readTsconfig(tsconfigPath: string): TsconfigInfo | undefined {\n if (!pathExistsSync(tsconfigPath)) return undefined;\n const readResult = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n if (readResult.error) return undefined;\n\n const dir = path.dirname(tsconfigPath);\n const parsed = ts.parseJsonConfigFileContent(\n readResult.config,\n ts.sys,\n dir,\n undefined,\n tsconfigPath,\n );\n if (parsed.errors.length > 0) return undefined;\n\n const options = parsed.options;\n const paths: Record<string, string[]> = {};\n if (options.paths) {\n for (const [pattern, targets] of Object.entries(options.paths)) {\n paths[pattern] = [...targets];\n }\n }\n\n return {\n path: tsconfigPath,\n dir,\n baseUrl: options.baseUrl ? path.resolve(dir, options.baseUrl) : undefined,\n paths,\n include: asStringArray(readResult.config.include ?? []),\n exclude: asStringArray(readResult.config.exclude ?? []),\n };\n}\n\n/**\n * Match a module specifier against `paths` patterns.\n *\n * Supports a single `*` wildcard in both pattern and replacement\n * (`\"@/*\": [\"./src/*\"]`). Returns the substituted absolute-ish path and the\n * captured wildcard value, or `undefined` when nothing matches.\n */\nexport function matchAlias(\n specifier: string,\n paths: Record<string, string[]>,\n): { target: string; matchedPattern: string } | undefined {\n for (const [pattern, replacements] of Object.entries(paths)) {\n const starIndex = pattern.indexOf(\"*\");\n if (starIndex === -1) {\n if (specifier === pattern) {\n const replacement = replacements[0];\n if (replacement) return { target: replacement, matchedPattern: pattern };\n }\n continue;\n }\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) continue;\n const captured = specifier.slice(prefix.length, specifier.length - suffix.length);\n\n for (const replacement of replacements) {\n const replacementStar = replacement.indexOf(\"*\");\n const target =\n replacementStar === -1\n ? replacement\n : replacement.slice(0, replacementStar) +\n captured +\n replacement.slice(replacementStar + 1);\n return { target, matchedPattern: pattern };\n }\n }\n return undefined;\n}\n","import path from \"node:path\";\nimport type { AliasMap } from \"../types/config.js\";\nimport type { TsconfigInfo } from \"../types/project.js\";\n\n/**\n * Alias normalization.\n *\n * User aliases (`ripple.config.ts`) and tsconfig `paths` are merged into one\n * map of pattern → absolute target. Both support a single `*` wildcard:\n *\n * `{ \"@\": \"./src\" }` → `{ \"@/*\": \"<root>/src/*\" }`\n * tsconfig `\"@/*\": [\"./src/*\"]` → `{ \"@/*\": \"<root>/src/*\" }`\n *\n * Keys without a wildcard are treated as prefixes, so `\"@\"` covers\n * `@/components/Button` the way TypeScript users expect.\n */\n\nconst WILDCARD = \"*\";\n\nfunction hasWildcard(value: string): boolean {\n return value.includes(WILDCARD);\n}\n\n/**\n * Normalize a user-config alias entry against `baseDir`.\n * Returns the pattern and its absolute target, or `undefined` for invalid\n * entries (empty key or non-relative target is allowed but must be absolute\n * after resolution).\n */\nfunction normalizeEntry(\n key: string,\n target: string,\n baseDir: string,\n): { pattern: string; target: string } {\n const trimmedKey = key.replace(/\\/+$/, \"\");\n const trimmedTarget = target.replace(/\\/+$/, \"\");\n\n if (hasWildcard(trimmedKey)) {\n return { pattern: trimmedKey, target: path.resolve(baseDir, trimmedTarget) };\n }\n return {\n pattern: `${trimmedKey}/${WILDCARD}`,\n target: path.join(path.resolve(baseDir, trimmedTarget), WILDCARD),\n };\n}\n\n/**\n * Merge user aliases and tsconfig paths into a single normalized map.\n * User aliases win on pattern collisions.\n */\nexport function buildAliasMap(\n configAliases: Record<string, string>,\n tsconfig: TsconfigInfo | undefined,\n rootDir: string,\n): AliasMap {\n const merged: AliasMap = {};\n\n if (tsconfig) {\n const base = tsconfig.baseUrl ?? tsconfig.dir;\n for (const [pattern, targets] of Object.entries(tsconfig.paths)) {\n const first = targets[0];\n if (!first) continue;\n const absolute = path.isAbsolute(first) ? first : path.resolve(base, first);\n merged[pattern] = absolute;\n }\n }\n\n for (const [key, target] of Object.entries(configAliases)) {\n if (key === \"\") continue;\n const entry = normalizeEntry(key, target, rootDir);\n merged[entry.pattern] = entry.target;\n }\n\n return merged;\n}\n\n/**\n * Substitute a specifier against an alias map. Returns the absolute-ish\n * candidate path or `undefined` when no pattern matches.\n */\nexport function substituteAlias(specifier: string, aliases: AliasMap): string | undefined {\n for (const [pattern, target] of Object.entries(aliases)) {\n const starIndex = pattern.indexOf(WILDCARD);\n if (starIndex === -1) {\n if (specifier === pattern) return target;\n continue;\n }\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) continue;\n const captured = specifier.slice(prefix.length, specifier.length - suffix.length);\n const targetStar = target.indexOf(WILDCARD);\n if (targetStar === -1) return target;\n return target.slice(0, targetStar) + captured + target.slice(targetStar + 1);\n }\n return undefined;\n}\n","import { createJiti } from \"jiti\";\nimport path from \"node:path\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AliasMap, RippleConfig } from \"../types/config.js\";\nimport type { LoadConfigResult, ProjectContext } from \"../types/project.js\";\nimport { pathExistsSync } from \"../utils/fs.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { readTsconfig } from \"../utils/tsconfig.js\";\nimport { buildAliasMap } from \"./aliases.js\";\nimport { formatSchemaIssues, rippleConfigSchema } from \"./schema.js\";\n\n/**\n * Config discovery and loading.\n *\n * Resolution order for `ripple.config.*`: `.ts`, `.mjs`, `.js`, `.cjs`,\n * `.json`. An explicit `--config <path>` always wins. The directory of the\n * resolved config file becomes the project root.\n */\n\nconst CONFIG_CANDIDATES = [\n \"ripple.config.ts\",\n \"ripple.config.mjs\",\n \"ripple.config.js\",\n \"ripple.config.cjs\",\n \"ripple.config.json\",\n] as const;\n\nconst jiti = createJiti(import.meta.url, { interopDefault: true });\n\nfunction findConfigFile(cwd: string, explicitPath: string | undefined): string | undefined {\n if (explicitPath) return path.resolve(cwd, explicitPath);\n for (const candidate of CONFIG_CANDIDATES) {\n const absolute = path.join(cwd, candidate);\n if (pathExistsSync(absolute)) return absolute;\n }\n return undefined;\n}\n\nasync function importConfig(configPath: string): Promise<unknown> {\n let loaded: unknown;\n try {\n loaded = await jiti.import(configPath);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new RippleError(\n `Could not load ${path.basename(configPath)}: ${detail}`,\n ExitCode.InvalidConfig,\n );\n }\n const value = (loaded as { default?: unknown })?.default ?? loaded;\n if (typeof value === \"function\") {\n throw new RippleError(\n `${path.basename(configPath)} must export a plain object, not a function.`,\n ExitCode.InvalidConfig,\n );\n }\n return value;\n}\n\nfunction validateConfig(value: unknown): RippleConfig {\n const result = rippleConfigSchema.safeParse(value);\n if (!result.success) {\n const issues = formatSchemaIssues(result.error);\n throw new RippleError(\n `Invalid config:\\n${issues.map((issue) => ` ${issue}`).join(\"\\n\")}`,\n ExitCode.InvalidConfig,\n );\n }\n return result.data;\n}\n\n/**\n * Load and validate the ripple config. Never throws for a *missing* config —\n * defaults apply. Throws `RippleError` for an explicit-but-missing path or an\n * invalid config file.\n */\nexport async function loadConfig(cwd: string, explicitPath?: string): Promise<LoadConfigResult> {\n const configPath = findConfigFile(cwd, explicitPath);\n\n if (explicitPath && !configPath) {\n throw new RippleError(\n `Config file not found: ${explicitPath}`,\n ExitCode.InvalidConfig,\n \"Pass a path that exists, or remove --config to use defaults.\",\n );\n }\n\n if (!configPath) {\n return { config: rippleConfigSchema.parse({}), rootDir: path.resolve(cwd) };\n }\n\n const raw = await importConfig(configPath);\n const config = validateConfig(raw);\n return { config, configPath, rootDir: path.dirname(configPath) };\n}\n\n/**\n * Assemble the full `ProjectContext`: config + tsconfig facts + merged alias\n * map. The alias map is baked into the context so downstream layers never\n * touch config shapes again.\n */\nexport async function loadProjectContext(\n cwd: string,\n explicitConfigPath?: string,\n): Promise<ProjectContext> {\n const loaded = await loadConfig(cwd, explicitConfigPath);\n const { config, rootDir } = loaded;\n\n const tsconfigPath = path.resolve(rootDir, config.tsconfigPath);\n const tsconfig = readTsconfig(tsconfigPath);\n\n const aliases: AliasMap = buildAliasMap(config.aliases, tsconfig, rootDir);\n\n return {\n rootDir,\n config,\n ...(tsconfig ? { tsconfig } : {}),\n aliases,\n };\n}\n","import type { ParsedFile } from \"./parser.js\";\n\n/**\n * Classification of a resolved import edge.\n */\nexport type EdgeKind = \"internal\" | \"external\" | \"unresolved\";\n\nexport interface ResolvedImport {\n /** The original declaration the edge was derived from. */\n raw: string;\n edgeKind: EdgeKind;\n /**\n * Absolute path of the resolved target. Only set when `edgeKind ===\n * \"internal\"`.\n */\n resolvedPath?: string;\n}\n\nexport interface GraphNode {\n /** Absolute path of the file. */\n path: string;\n parsed: ParsedFile;\n}\n\n/**\n * A circular dependency group: every file that is mutually reachable\n * (strongly connected component). `path` is a representative import chain\n * through the group, `members` the complete sorted member set.\n */\nexport interface Cycle {\n /** Complete sorted member paths of the cycle group. */\n members: string[];\n /** Representative ordered cycle path (first element === last element). */\n path: string[];\n}\n\n/**\n * Aggregate statistics of a graph, computed during build. Feeds the\n * confidence heuristic and `ripple graph` output.\n */\nexport interface GraphStats {\n /** Discovered files. */\n files: number;\n /** Files that parsed without errors. */\n parsed: number;\n /** Internal edges that resolved to a discovered file. */\n internalEdges: number;\n /** Relative/alias edges that resolved to nothing. */\n unresolvedEdges: number;\n /** Edges leaving the analyzed file set (packages, assets). */\n externalEdges: number;\n /** Circular dependency groups. */\n cycles: number;\n}\n\n/**\n * In-memory directed dependency graph.\n *\n * - `forward` maps a file to the set of files it imports.\n * - `reverse` maps a file to the set of files that import it.\n * - `external` maps a file to the set of specifiers that leave the project\n * (node_modules packages, assets, non-discovered files).\n */\nexport interface DependencyGraph {\n nodes: Map<string, GraphNode>;\n forward: Map<string, Set<string>>;\n reverse: Map<string, Set<string>>;\n external: Map<string, Set<string>>;\n cycles: Cycle[];\n stats: GraphStats;\n}\n\nexport function edgeCount(graph: DependencyGraph): number {\n let count = 0;\n for (const targets of graph.forward.values()) {\n count += targets.size;\n }\n return count;\n}\n\nexport function externalEdgeCount(graph: DependencyGraph): number {\n let count = 0;\n for (const targets of graph.external.values()) {\n count += targets.size;\n }\n return count;\n}\n\n/** All file paths that participate in at least one cycle. */\nexport function cycleMemberPaths(graph: DependencyGraph): Set<string> {\n const members = new Set<string>();\n for (const cycle of graph.cycles) {\n for (const path of cycle.members) {\n members.add(path);\n }\n }\n return members;\n}\n","import type { GraphStats } from \"../types/graph.js\";\n\n/**\n * Confidence heuristic: how much of the graph could be analyzed reliably.\n *\n * - Parse rate: fraction of discovered files that parsed without errors.\n * - Resolution rate: fraction of non-external import edges that resolved to\n * a known file.\n * - A cycle touching the analyzed file is a small uncertainty penalty.\n *\n * Range: 0-100, rounded.\n */\nexport function computeConfidence(stats: GraphStats, targetInCycle: boolean): number {\n const parseRate = stats.files === 0 ? 1 : stats.parsed / stats.files;\n const totalEdges = stats.internalEdges + stats.unresolvedEdges;\n const resolutionRate = totalEdges === 0 ? 1 : stats.internalEdges / totalEdges;\n\n let confidence = parseRate * (0.4 + 0.6 * resolutionRate);\n if (targetInCycle) confidence *= 0.95;\n\n return Math.round(Math.min(1, Math.max(0, confidence)) * 100);\n}\n","import path from \"node:path\";\n\n/**\n * Path helpers shared across Ripple.\n *\n * Canonical path keys are POSIX-style normalized absolute paths. On Windows\n * they are lower-cased because the filesystem is case-insensitive; two paths\n * differing only in case must not create two graph nodes.\n */\n\nexport const SOURCE_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\"] as const;\n\nexport const RESOLVABLE_EXTENSIONS = [...SOURCE_EXTENSIONS, \".mjs\", \".cjs\", \".d.ts\"] as const;\n\n/** Convert a path to forward slashes for display and matching. */\nexport function toPosix(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\n/** Normalize a path and make it absolute. */\nexport function normalizeAbsolute(filePath: string, cwd: string): string {\n return path.resolve(cwd, filePath);\n}\n\n/**\n * Canonical key for use in Maps/Sets: normalized, POSIX, and lower-cased on\n * Windows.\n */\nexport function pathKey(filePath: string, cwd: string): string {\n const absolute = normalizeAbsolute(filePath, cwd);\n const posix = toPosix(absolute);\n return process.platform === \"win32\" ? posix.toLowerCase() : posix;\n}\n\n/** Whether a module specifier is a relative import (`./` or `../`). */\nexport function isRelativeSpecifier(specifier: string): boolean {\n return specifier.startsWith(\"./\") || specifier.startsWith(\"../\");\n}\n\n/** Whether the specifier is a bare package import (`react`, `@scope/pkg`). */\nexport function isBareSpecifier(specifier: string): boolean {\n return !isRelativeSpecifier(specifier) && !specifier.startsWith(\"/\");\n}\n\n/** Source file kind from an absolute path. Declaration files are excluded. */\nexport function sourceFileKind(filePath: string): \"ts\" | \"tsx\" | \"js\" | \"jsx\" | undefined {\n if (/\\.d\\.[cm]?ts$/i.test(filePath)) return undefined;\n const ext = path.extname(filePath).toLowerCase();\n return SOURCE_EXTENSIONS.includes(ext as (typeof SOURCE_EXTENSIONS)[number])\n ? (ext.slice(1) as \"ts\" | \"tsx\" | \"js\" | \"jsx\")\n : undefined;\n}\n\n/** The extension-candidates list for resolving an extensionless import. */\nexport function extensionCandidates(basePath: string): string[] {\n return RESOLVABLE_EXTENSIONS.map((ext) => basePath + ext);\n}\n\n/**\n * TS-style JS extension swap: when a specifier imports `./x.js` but only\n * `./x.ts` exists (NodeNext-style projects), the candidate resolves to the TS\n * file.\n */\nexport function jsToTsCandidate(candidate: string): string {\n const ext = path.extname(candidate);\n if (ext === \".js\") return candidate.slice(0, -3) + \".ts\";\n if (ext === \".jsx\") return candidate.slice(0, -4) + \".tsx\";\n if (ext === \".mjs\") return candidate.slice(0, -4) + \".mts\";\n if (ext === \".cjs\") return candidate.slice(0, -4) + \".cts\";\n return candidate;\n}\n\n/** Human-readable relative path (from cwd) for display in output. */\nexport function displayPath(filePath: string, cwd: string): string {\n const relative = path.relative(cwd, filePath);\n return toPosix(relative === \"\" ? path.basename(filePath) : relative);\n}\n\n/**\n * First path segment of `filePath` relative to `root`, used for impact areas.\n * Returns `undefined` when the file is outside the root.\n */\nexport function firstSegment(filePath: string, root: string): string | undefined {\n const relative = toPosix(path.relative(root, filePath));\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) return undefined;\n const segment = relative.split(\"/\")[0];\n return segment && segment !== \"\" ? segment : undefined;\n}\n","import path from \"node:path\";\nimport { findPackageJson, pathExistsSync, readPackageEntryPoints } from \"../utils/fs.js\";\nimport { toPosix } from \"../utils/paths.js\";\nimport type { Category } from \"../types/analysis.js\";\n\n/**\n * Deterministic file categorization heuristics.\n *\n * A file can match several categories (a `page.tsx` is both a route and a\n * component). Everything here is path/name based — no source analysis — so\n * categorization is cheap, stable and easy to document.\n */\n\nconst ROUTE_FILE_NAMES = new Set([\n \"route\",\n \"page\",\n \"layout\",\n \"middleware\",\n \"loading\",\n \"error\",\n \"not-found\",\n]);\n\nconst ROUTE_DIR_NAMES = new Set([\"routes\", \"api\"]);\n\nconst UTILITY_DIR_NAMES = new Set([\"lib\", \"utils\", \"helpers\", \"shared\", \"common\", \"core\"]);\n\nconst COMPONENT_DIR_NAMES = new Set([\"components\", \"ui\"]);\n\nconst ENTRY_FILE_NAMES = new Set([\"index\", \"main\", \"app\", \"server\", \"cli\", \"bin\"]);\n\nconst TEST_SEGMENT = \"__tests__\";\n\nfunction relativeSegments(filePath: string, rootDir: string): string[] {\n const relative = toPosix(path.relative(rootDir, filePath));\n if (relative.startsWith(\"..\")) return [];\n return relative.split(\"/\").filter((segment) => segment !== \"\" && segment !== \".\");\n}\n\nfunction isRouteFile(basename: string): boolean {\n return ROUTE_FILE_NAMES.has(basename);\n}\n\nfunction isTestFile(name: string, segments: string[]): boolean {\n if (segments.includes(TEST_SEGMENT)) return true;\n if (/(^|[._-])(test|spec)([._-]|$)/i.test(name)) return true;\n return segments.some((segment) => segment === \"tests\");\n}\n\nfunction isComponentFile(basename: string, extension: string, segments: string[]): boolean {\n if (extension === \"tsx\" || extension === \"jsx\") return true;\n if (!COMPONENT_DIR_NAMES.has(segments.at(-2) ?? \"\")) return false;\n return /^[A-Z]/.test(basename);\n}\n\nfunction isUtilityFile(segments: string[]): boolean {\n return segments.some((segment) => UTILITY_DIR_NAMES.has(segment));\n}\n\nfunction isEntryFile(filePath: string, rootDir: string, entryPoints: Set<string>): boolean {\n if (entryPoints.has(path.normalize(filePath))) return true;\n\n const relative = toPosix(path.relative(rootDir, filePath));\n if (relative.startsWith(\"..\")) return false;\n const segments = relative.split(\"/\");\n if (segments.length !== 2) return false;\n if (segments[0] !== \"src\" && segments[0] !== \"\") return false;\n\n const basename = segments[1] ?? \"\";\n const dot = basename.lastIndexOf(\".\");\n const name = dot === -1 ? basename : basename.slice(0, dot);\n return ENTRY_FILE_NAMES.has(name);\n}\n\nexport interface CategorizerOptions {\n rootDir: string;\n /** Absolute paths of entry points (package.json `main`/`bin`, conventions). */\n entryPoints: Set<string>;\n}\n\n/**\n * Create a categorizer bound to a project. Returns a function that classifies\n * an absolute file path into zero or more categories.\n */\nexport function createCategorizer(options: CategorizerOptions): (filePath: string) => Category[] {\n const { rootDir, entryPoints } = options;\n\n return (filePath: string): Category[] => {\n const segments = relativeSegments(filePath, rootDir);\n const basename = segments.at(-1) ?? \"\";\n const dot = basename.lastIndexOf(\".\");\n const name = dot === -1 ? basename : basename.slice(0, dot);\n const extension = dot === -1 ? \"\" : basename.slice(dot + 1).toLowerCase();\n\n const categories: Category[] = [];\n\n if (isRouteFile(name)) categories.push(\"route\");\n else if (segments.some((segment) => ROUTE_DIR_NAMES.has(segment))) categories.push(\"route\");\n\n if (isTestFile(name, segments)) categories.push(\"test\");\n if (isComponentFile(name, extension, segments)) categories.push(\"component\");\n if (isUtilityFile(segments)) categories.push(\"utility\");\n if (isEntryFile(filePath, rootDir, entryPoints)) categories.push(\"entry\");\n if (categories.length === 0) categories.push(\"other\");\n\n return categories;\n };\n}\n\n/**\n * Detect entry points: package.json `main`/`bin` plus conventional root\n * entry file names (in the project root or `src/`).\n */\nexport async function detectEntryPoints(rootDir: string): Promise<Set<string>> {\n const entryPoints = new Set<string>();\n\n const packageJsonPath = await findPackageJson(rootDir);\n if (packageJsonPath) {\n const packageDir = path.dirname(packageJsonPath);\n for (const entry of await readPackageEntryPoints(packageJsonPath)) {\n const absolute = path.resolve(packageDir, entry);\n if (pathExistsSync(absolute)) entryPoints.add(path.normalize(absolute));\n }\n }\n\n const baseDirs = [rootDir, path.join(rootDir, \"src\")];\n for (const baseDir of baseDirs) {\n for (const name of ENTRY_FILE_NAMES) {\n for (const extension of [\"ts\", \"tsx\", \"js\", \"jsx\"]) {\n const candidate = path.join(baseDir, `${name}.${extension}`);\n if (pathExistsSync(candidate)) entryPoints.add(path.normalize(candidate));\n }\n }\n }\n\n return entryPoints;\n}\n","/**\n * Turn a directory segment into a human-readable impact-area label:\n *\n * - `user-profile` → `User Profile`\n * - `userProfile` → `User Profile`\n * - `oauth` → `OAuth` (known acronyms use their canonical casing)\n * - `authentication` → `Authentication`\n */\nconst ACRONYM_CANONICAL: Record<string, string> = {\n api: \"API\",\n ui: \"UI\",\n ux: \"UX\",\n oauth: \"OAuth\",\n jwt: \"JWT\",\n http: \"HTTP\",\n https: \"HTTPS\",\n ws: \"WS\",\n sse: \"SSE\",\n db: \"DB\",\n sql: \"SQL\",\n id: \"ID\",\n cli: \"CLI\",\n ci: \"CI\",\n cd: \"CD\",\n csv: \"CSV\",\n json: \"JSON\",\n pdf: \"PDF\",\n cors: \"CORS\",\n url: \"URL\",\n uri: \"URI\",\n uuid: \"UUID\",\n html: \"HTML\",\n css: \"CSS\",\n js: \"JS\",\n ts: \"TS\",\n tsx: \"TSX\",\n jsx: \"JSX\",\n aws: \"AWS\",\n s3: \"S3\",\n sms: \"SMS\",\n mfa: \"MFA\",\n otp: \"OTP\",\n smtp: \"SMTP\",\n rss: \"RSS\",\n};\n\nfunction splitWords(segment: string): string[] {\n const normalized = segment.replace(/[^a-zA-Z0-9]+/g, \" \");\n const matches = normalized.match(/[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|[0-9]+/g);\n return (matches ?? [segment]).map((word) => word.toLowerCase());\n}\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nexport function humanizeArea(segment: string): string {\n const words = splitWords(segment);\n if (words.length === 0) return capitalize(segment);\n return words.map((word) => ACRONYM_CANONICAL[word] ?? capitalize(word)).join(\" \");\n}\n","import type { ImpactSummary, TopImpactArea } from \"../types/analysis.js\";\nimport type { AffectedFile } from \"../types/analysis.js\";\nimport { firstSegment } from \"../utils/paths.js\";\nimport { humanizeArea } from \"./humanize.js\";\n\n/**\n * Aggregate the affected-file map into an `ImpactSummary`: per-category\n * counters, max depth and top impact areas.\n *\n * A file matched by several categories counts once per category — counts\n * therefore do not sum to `affectedFiles`.\n */\n\nconst MAX_IMPACT_AREAS = 5;\n\nexport function buildSummary(\n affected: Map<string, AffectedFile>,\n srcRoot: string,\n confidence: number,\n): ImpactSummary {\n let routes = 0;\n let tests = 0;\n let components = 0;\n let utilities = 0;\n let entries = 0;\n let maxDepth = 0;\n\n const areaCounts = new Map<string, number>();\n\n for (const file of affected.values()) {\n if (file.depth > maxDepth) maxDepth = file.depth;\n if (file.categories.includes(\"route\")) routes++;\n if (file.categories.includes(\"test\")) tests++;\n if (file.categories.includes(\"component\")) components++;\n if (file.categories.includes(\"utility\")) utilities++;\n if (file.categories.includes(\"entry\")) entries++;\n\n const area = firstSegment(file.path, srcRoot);\n if (area) {\n areaCounts.set(area, (areaCounts.get(area) ?? 0) + 1);\n }\n }\n\n const topImpact: TopImpactArea[] = [...areaCounts.entries()]\n .map(([label, count]) => ({ label: humanizeArea(label), count }))\n .sort((a, b) => b.count - a.count || a.label.localeCompare(b.label))\n .slice(0, MAX_IMPACT_AREAS);\n\n return {\n affectedFiles: affected.size,\n routes,\n tests,\n components,\n utilities,\n entries,\n maxDepth,\n topImpact,\n confidence,\n };\n}\n","import type { AffectedFile } from \"../types/analysis.js\";\nimport type { Category } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { cycleMemberPaths } from \"../types/graph.js\";\n\n/**\n * Reverse traversal: BFS over the reverse (importer) adjacency from a target\n * file, collecting every file that could be affected by changing it.\n *\n * - The target itself is never included in the result.\n * - `depth` is the number of import hops from the target (direct dependents\n * are depth 1).\n * - `maxDepth` caps the blast radius; `undefined` means unlimited.\n * - Visited set makes the traversal linear in the reachable subgraph.\n */\n\nexport interface ReverseTraversalOptions {\n maxDepth?: number;\n /** Classifies each visited file; provided by the caller for testability. */\n categorize: (filePath: string) => Category[];\n}\n\nexport interface ReverseTraversalResult {\n affected: Map<string, AffectedFile>;\n maxDepth: number;\n}\n\nexport function reverseTraverse(\n graph: DependencyGraph,\n targetKey: string,\n options: ReverseTraversalOptions,\n): ReverseTraversalResult {\n const { maxDepth, categorize } = options;\n\n const affected: Map<string, AffectedFile> = new Map();\n const visited = new Set<string>([targetKey]);\n const cycleMembers = cycleMemberPaths(graph);\n\n if (!graph.reverse.has(targetKey)) {\n return { affected, maxDepth: 0 };\n }\n\n const queue: Array<{ key: string; depth: number }> = [];\n for (const importer of graph.reverse.get(targetKey) ?? []) {\n queue.push({ key: importer, depth: 1 });\n }\n\n let deepest = 0;\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) break;\n\n if (visited.has(current.key)) continue;\n visited.add(current.key);\n\n deepest = Math.max(deepest, current.depth);\n const node = graph.nodes.get(current.key);\n const filePath = node?.path ?? current.key;\n\n affected.set(current.key, {\n path: filePath,\n depth: current.depth,\n direct: current.depth === 1,\n categories: categorize(filePath),\n inCycle: cycleMembers.has(current.key),\n });\n\n if (maxDepth === undefined || current.depth < maxDepth) {\n for (const importer of graph.reverse.get(current.key) ?? []) {\n if (!visited.has(importer)) {\n queue.push({ key: importer, depth: current.depth + 1 });\n }\n }\n }\n }\n\n return { affected, maxDepth: deepest };\n}\n","import type { RiskThresholds } from \"../types/config.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Map a 0-100 risk score to a level using the configured thresholds.\n */\nexport function scoreToLevel(score: number, thresholds: RiskThresholds): RiskLevel {\n if (score >= thresholds.critical) return \"CRITICAL\";\n if (score >= thresholds.high) return \"HIGH\";\n if (score >= thresholds.medium) return \"MEDIUM\";\n return \"LOW\";\n}\n\n/** Clamp a value into [min, max]. */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/**\n * Log-scale a count into [0, 1]: 0 stays 0, `cap` reaches 1, everything\n * above `cap` saturates. Prevents one huge graph from dominating the score.\n */\nexport function logScale(count: number, cap: number): number {\n if (count <= 0) return 0;\n return clamp(Math.log10(count + 1) / Math.log10(cap + 1), 0, 1);\n}\n","import type { ImpactSummary } from \"../types/analysis.js\";\nimport type { RiskConfig } from \"../types/config.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport type { RiskFactor, RiskResult } from \"../types/risk.js\";\nimport { clamp, logScale, scoreToLevel } from \"./levels.js\";\n\n/**\n * Deterministic weighted risk heuristic.\n *\n * Each factor normalizes a graph signal into [0, 1] (see the doc comments on\n * `FACTORS`). The score is the weighted sum of the factors scaled to 0-100.\n * Factors and thresholds are user-configurable; the defaults sum to 1.0.\n */\n\ninterface RiskInput {\n summary: ImpactSummary;\n targetParsed: ParsedFile;\n targetInCycle: boolean;\n riskConfig: RiskConfig;\n}\n\ninterface FactorDefinition {\n name: string;\n label: string;\n /** Default weight (config overrides). */\n defaultWeight: number;\n compute: (input: RiskInput) => number;\n}\n\n/** Saturation caps: the count at which a factor maxes out. */\nconst CAP_AFFECTED_FILES = 100;\nconst CAP_UTILITIES = 10;\nconst CAP_TESTS = 15;\nconst CAP_ROUTES = 10;\nconst CAP_EXPORTS = 20;\n\nconst FACTORS: FactorDefinition[] = [\n {\n name: \"affectedFiles\",\n label: \"Affected files\",\n defaultWeight: 0.3,\n compute: ({ summary }) => logScale(summary.affectedFiles, CAP_AFFECTED_FILES),\n },\n {\n name: \"entryPoint\",\n label: \"Entry point impacted\",\n defaultWeight: 0.15,\n compute: ({ summary }) => (summary.entries > 0 ? 1 : 0),\n },\n {\n name: \"sharedUtility\",\n label: \"Shared utilities impacted\",\n defaultWeight: 0.15,\n compute: ({ summary }) => clamp(summary.utilities / CAP_UTILITIES, 0, 1),\n },\n {\n name: \"publicExports\",\n label: \"Public export surface\",\n defaultWeight: 0.1,\n compute: ({ targetParsed }) => {\n const { exports } = targetParsed;\n const count =\n exports.named.length + (exports.hasDefault ? 1 : 0) + exports.reExportedFrom.length;\n return clamp(count / CAP_EXPORTS, 0, 1);\n },\n },\n {\n name: \"tests\",\n label: \"Tests affected\",\n defaultWeight: 0.1,\n compute: ({ summary }) => clamp(summary.tests / CAP_TESTS, 0, 1),\n },\n {\n name: \"routes\",\n label: \"Routes affected\",\n defaultWeight: 0.1,\n compute: ({ summary }) => clamp(summary.routes / CAP_ROUTES, 0, 1),\n },\n {\n name: \"cycleMembership\",\n label: \"Circular dependency\",\n defaultWeight: 0.1,\n compute: ({ targetInCycle }) => (targetInCycle ? 1 : 0),\n },\n];\n\nfunction weightFor(definition: FactorDefinition, input: RiskInput): number {\n const configured = input.riskConfig.weights[definition.name as keyof RiskConfig[\"weights\"]];\n return configured ?? definition.defaultWeight;\n}\n\n/**\n * Compute the risk score and per-factor breakdown for an analysis result.\n */\nexport function scoreRisk(input: RiskInput): RiskResult {\n const factors: RiskFactor[] = FACTORS.map((definition) => {\n const weight = weightFor(definition, input);\n const value = definition.compute(input);\n return {\n name: definition.name,\n label: definition.label,\n weight,\n value,\n contribution: Math.round(weight * value * 100 * 100) / 100,\n };\n });\n\n const score = clamp(\n Math.round(factors.reduce((sum, factor) => sum + factor.contribution, 0) * 100) / 100,\n 0,\n 100,\n );\n\n return {\n score,\n level: scoreToLevel(score, input.riskConfig.thresholds),\n factors,\n };\n}\n","import path from \"node:path\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { cycleMemberPaths } from \"../types/graph.js\";\nimport { pathExistsSync } from \"../utils/fs.js\";\nimport { computeConfidence } from \"./confidence.js\";\nimport { createCategorizer } from \"./categorize.js\";\nimport { buildSummary } from \"./impact.js\";\nimport { reverseTraverse } from \"./reverse-traverse.js\";\nimport { scoreRisk } from \"../risk/score.js\";\n\n/**\n * Orchestrates a single `ripple analyze` run on top of an already-built\n * graph. Everything the commands layer needs is injected; the function is\n * pure apart from cheap filesystem existence checks.\n */\n\nexport interface AnalyzeInput {\n graph: DependencyGraph;\n context: ProjectContext;\n /** Absolute paths of detected entry points. */\n entryPoints: Set<string>;\n /** Canonical graph key of the analyzed file. */\n targetKey: string;\n /** Absolute path of the analyzed file. */\n targetPath: string;\n /** Wall time of the whole run, for reporting. */\n durationMs: number;\n /** Cap on traversal depth (undefined = unlimited). */\n maxDepth?: number;\n}\n\n/** The source root (directory holding the source tree) for impact areas. */\nexport function sourceRoot(rootDir: string): string {\n const candidate = path.join(rootDir, \"src\");\n return pathExistsSync(candidate) ? candidate : rootDir;\n}\n\nexport function analyzeFile(input: AnalyzeInput): AnalysisResult {\n const { graph, context, entryPoints, targetKey, targetPath, durationMs, maxDepth } = input;\n\n const node = graph.nodes.get(targetKey);\n if (!node) {\n throw new Error(`Target file is not part of the graph: ${targetPath}`);\n }\n\n const categorize = createCategorizer({ rootDir: context.rootDir, entryPoints });\n const { affected, maxDepth: reachedDepth } = reverseTraverse(graph, targetKey, {\n maxDepth,\n categorize,\n });\n\n const targetInCycle = cycleMemberPaths(graph).has(targetKey);\n const confidence = computeConfidence(graph.stats, targetInCycle);\n const summary = buildSummary(affected, sourceRoot(context.rootDir), confidence);\n\n const risk = scoreRisk({\n summary,\n targetParsed: node.parsed,\n targetInCycle,\n riskConfig: context.config.risk,\n });\n\n return {\n targetPath,\n rootDir: context.rootDir,\n graph,\n affected,\n summary,\n risk,\n targetInCycle,\n durationMs,\n maxDepth: reachedDepth,\n };\n}\n","import chalk from \"chalk\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Terminal text helpers. All functions take a `color` flag so output stays\n * deterministic in tests and in `--json` mode.\n */\n\nexport interface TextStyle {\n color: boolean;\n}\n\n/** Muted/secondary text, e.g. hints and counts. */\nexport function dim(text: string, style: TextStyle): string {\n return style.color ? chalk.dim(text) : text;\n}\n\n/** Emphasized value text. */\nexport function strong(text: string, style: TextStyle): string {\n return style.color ? chalk.bold(text) : text;\n}\n\nconst RISK_COLORS: Record<RiskLevel, (text: string) => string> = {\n LOW: (text) => chalk.green(text),\n MEDIUM: (text) => chalk.yellow(text),\n HIGH: (text) => chalk.magenta(text),\n CRITICAL: (text) => chalk.red.bold(text),\n};\n\n/** Chalk style function for a risk level. */\nexport function riskColor(level: RiskLevel): (text: string) => string {\n return RISK_COLORS[level];\n}\n\n/** Colored risk level badge, e.g. ` HIGH `. */\nexport function riskBadge(level: RiskLevel, style: TextStyle): string {\n return style.color ? RISK_COLORS[level](level) : level;\n}\n\n/** Confidence percentage with a subtle color cue. */\nexport function confidenceText(percent: number, style: TextStyle): string {\n const text = `${percent}%`;\n if (!style.color) return text;\n if (percent >= 90) return chalk.green(text);\n if (percent >= 70) return chalk.yellow(text);\n return chalk.red(text);\n}\n\n/** Humanize a duration in milliseconds. */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\n/** Format a number with a plural-friendly noun, e.g. `7 files`. */\nexport function pluralize(count: number, noun: string, plural = `${noun}s`): string {\n return `${count} ${count === 1 ? noun : plural}`;\n}\n","import figures from \"figures\";\n\n/**\n * CLI glyph registry. `figures` keeps every symbol cross-platform and gives\n * a sensible fallback on consoles that cannot render Unicode.\n */\n\nexport type IconName =\n | \"tick\"\n | \"cross\"\n | \"warning\"\n | \"info\"\n | \"arrowRight\"\n | \"pointer\"\n | \"bullet\"\n | \"ellipsis\"\n | \"circle\";\n\n/** Resolve a named glyph for terminal output. */\nexport function icon(name: IconName): string {\n return figures[name];\n}\n","import chalk from \"chalk\";\nimport { formatDuration } from \"../formatter/text.js\";\nimport { icon } from \"./icons.js\";\n\n/**\n * Staged progress tracker. In interactive terminals each completed stage is\n * printed as a checkmarked line with its elapsed time:\n *\n * ✔ Loading config (2ms)\n * ✔ Building dependency graph (118ms)\n * ✔ Analyzing impact (1ms)\n *\n * Everywhere else (CI, pipes, JSON mode) it is a silent no-op.\n */\n\nexport interface StageTracker {\n /** Finish the previous stage (if any) and announce the next one. */\n next(label: string): void;\n /** Finish the current stage. */\n done(): void;\n}\n\nconst noop: StageTracker = {\n next: () => {},\n done: () => {},\n};\n\nexport function createStageTracker(enabled: boolean): StageTracker {\n if (!enabled || !process.stdout.isTTY) return noop;\n\n let current: string | undefined;\n let from = 0;\n\n const stamp = (label: string, ms: number): void => {\n process.stdout.write(\n `${chalk.green(icon(\"tick\"))} ${label} ${chalk.dim(formatDuration(ms))}\\n`,\n );\n };\n\n return {\n next(label: string): void {\n if (current) stamp(current, Date.now() - from);\n current = label;\n from = Date.now();\n },\n done(): void {\n if (current) stamp(current, Date.now() - from);\n current = undefined;\n },\n };\n}\n","/**\n * Resolve whether terminal output should be styled. Honors the explicit\n * `--no-color` flag first, then the standard `NO_COLOR` environment\n * variable (https://no-color.org). Actual ANSI emission is left to chalk,\n * which further disables itself when the stream is not a TTY.\n */\nexport function resolveColor(requested: boolean | undefined): boolean {\n if (requested === false) return false;\n const noColor = process.env.NO_COLOR;\n return noColor === undefined || noColor === \"\";\n}\n","/**\n * Simple aligned table rendering. Cells are padded to the widest cell in\n * their column; rows are joined with two spaces.\n */\n\nexport interface TableColumn {\n header: string;\n /** Right-align numeric-ish columns. */\n align?: \"left\" | \"right\";\n}\n\nexport function renderTable(columns: TableColumn[], rows: string[][]): string {\n const widths = columns.map((column, index) => {\n const cells = [column.header, ...rows.map((row) => row[index] ?? \"\")];\n return Math.max(...cells.map((cell) => cell.length));\n });\n\n const pad = (value: string, index: number): string => {\n const width = widths[index] ?? value.length;\n return columns[index]?.align === \"right\" ? value.padStart(width) : value.padEnd(width);\n };\n\n const lines: string[] = [];\n lines.push(columns.map((column, index) => pad(column.header, index)).join(\" \"));\n for (const row of rows) {\n lines.push(row.map((cell, index) => pad(cell, index)).join(\" \"));\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Render a key-value block with aligned values:\n *\n * Risk HIGH\n * Affected 7 files\n */\nexport function renderKeyValue(entries: Array<[string, string]>): string {\n const width = Math.max(...entries.map(([key]) => key.length));\n return entries.map(([key, value]) => `${key.padEnd(width)} ${value}`).join(\"\\n\");\n}\n","import treeify from \"treeify\";\nimport type { TreeObject } from \"treeify\";\n\n/**\n * Tree rendering on top of `treeify`:\n *\n * ├─ src/index.ts\n * │ └─ src/main.ts\n *\n * `treeify` is a tiny pure function (no ink, no DOM), which keeps this layer\n * trivially testable. Leaf values are empty strings; `showValues` is off.\n */\n\nexport interface TreeNode {\n label: string;\n children?: TreeNode[];\n}\n\nfunction toTreeify(node: TreeNode): string | TreeObject {\n if (!node.children || node.children.length === 0) return \"\";\n const branch: TreeObject = {};\n for (const child of node.children) {\n branch[child.label] = toTreeify(child);\n }\n return branch;\n}\n\nexport function renderTree(nodes: TreeNode[]): string {\n if (nodes.length === 0) return \"\";\n const root: TreeObject = {};\n for (const node of nodes) {\n root[node.label] = toTreeify(node);\n }\n return treeify.asTree(root, false, false).trimEnd();\n}\n","import boxen from \"boxen\";\nimport chalk from \"chalk\";\nimport type { TextStyle } from \"../formatter/text.js\";\nimport { icon } from \"./icons.js\";\n\n/**\n * Brand identity primitives: the header card shown at the top of every\n * interactive command and thin hairline dividers between sections.\n */\n\nexport interface BrandOptions {\n /** Command label, e.g. `impact analysis`. */\n label: string;\n /** Semantic version to annotate the header with. */\n version?: string;\n style: TextStyle;\n}\n\n/** Width of the hairline divider (roughly half a terminal). */\nconst DIVIDER_WIDTH = 38;\n\n/**\n * Render the branded header. Colored terminals get a boxed banner:\n *\n * ╭─ ripple ───────────────────────────────╮\n * │ ❯ impact analysis · v0.1.1 │\n * ╰────────────────────────────────────────╯\n *\n * Colorless output falls back to a single plain line.\n */\nexport function brandHeader(options: BrandOptions): string {\n const { label, version, style } = options;\n if (!style.color) {\n return `ripple — ${label}${version ? ` · v${version}` : \"\"}`;\n }\n const tagline = `${icon(\"pointer\")} ${label}${version ? ` · v${version}` : \"\"}`;\n return boxen(` ${tagline}`, {\n padding: { left: 1, right: 1 },\n title: \"ripple\",\n borderStyle: \"round\",\n borderColor: \"cyan\",\n });\n}\n\n/**\n * Section header with a hairline separator above it in colored output:\n *\n * ──────────────────────────────────────────\n * Top impact\n */\nexport function sectionHeader(title: string, style: TextStyle): string {\n if (!style.color) return title;\n return `${chalk.dim(\"─\".repeat(DIVIDER_WIDTH))}\\n${chalk.bold(title)}`;\n}\n","import type { TextStyle } from \"../formatter/text.js\";\nimport { riskColor } from \"../formatter/text.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Risk gauge rendering. A 10-cell bar filled proportionally to the 0-100\n * score and tinted with the risk level color, e.g.:\n *\n * MEDIUM · 34.4/100 ███░░░░░░░\n *\n * The bar is color-only; colorless output omits it entirely so logs and\n * pipes stay clean and deterministic.\n */\n\nconst CELLS = 10;\nconst FILL = \"█\";\nconst EMPTY = \"░\";\n\nexport function riskGauge(score: number, level: RiskLevel, style: TextStyle): string {\n if (!style.color) return \"\";\n const filled = Math.max(0, Math.min(CELLS, Math.round((score / 100) * CELLS)));\n return riskColor(level)(FILL.repeat(filled) + EMPTY.repeat(CELLS - filled));\n}\n\n/** Cells filled for a score, exported for tests. */\nexport function filledCells(score: number): number {\n return Math.max(0, Math.min(CELLS, Math.round((score / 100) * CELLS)));\n}\n","import type { AnalysisResult } from \"../types/analysis.js\";\nimport type { AnalyzeJsonReport, GraphJsonReport } from \"../types/output.js\";\nimport type { OutputWriter } from \"../types/cli.js\";\nimport type { DependencyGraph, GraphStats } from \"../types/graph.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { renderKeyValue, renderTable, type TableColumn } from \"../formatter/table.js\";\nimport { renderTree, type TreeNode } from \"../formatter/tree.js\";\nimport {\n confidenceText,\n dim,\n formatDuration,\n pluralize,\n riskBadge,\n strong,\n type TextStyle,\n} from \"../formatter/text.js\";\nimport { brandHeader, sectionHeader } from \"../ui/brand.js\";\nimport { riskGauge } from \"../ui/gauge.js\";\nimport { icon } from \"../ui/icons.js\";\n\n/**\n * Report rendering. Terminal output is built here; JSON payloads are built\n * as plain data and serialized by `src/formatter/json.ts`.\n */\n\nexport interface ReportOptions {\n /** Working directory used to relativize display paths. */\n cwd: string;\n /** Whether to emit ANSI colors and styled layout. */\n color: boolean;\n /** Extra sections (risk factor breakdown). */\n verbose: boolean;\n /** Package version shown in the header card. */\n version?: string;\n /** Cap on affected files listed in the terminal tree. */\n listLimit?: number;\n}\n\nconst DEFAULT_LIST_LIMIT = 20;\n\nconst textStyle = (options: ReportOptions): TextStyle => ({ color: options.color });\n\n/** Project-relative path for display, with optional depth/cycle suffixes. */\nfunction fileLabel(filePath: string, depth: number, inCycle: boolean, style: TextStyle): string {\n const parts: string[] = [dim(filePath, style)];\n if (depth >= 0) parts.push(dim(`· depth ${depth}`, style));\n if (inCycle) parts.push(dim(\"· cycle\", style));\n return parts.join(\" \");\n}\n\n/** Impact categories inline, e.g. `4 routes · 2 components · 1 test`. */\nfunction impactLine(result: AnalysisResult, style: TextStyle): string {\n const { summary } = result;\n const parts: string[] = [];\n if (summary.routes > 0) parts.push(pluralize(summary.routes, \"route\"));\n if (summary.components > 0) parts.push(pluralize(summary.components, \"component\"));\n if (summary.tests > 0) parts.push(pluralize(summary.tests, \"test\"));\n if (summary.utilities > 0) parts.push(pluralize(summary.utilities, \"utility\"));\n return parts.length > 0 ? parts.join(\" · \") : dim(\"none\", style);\n}\n\n/** Build the affected-file tree: depth-1 files are roots, deeper files are\n * nested under the first (deterministic) affected importer. */\nfunction buildAffectedTree(result: AnalysisResult, cwd: string, style: TextStyle): TreeNode[] {\n const { affected, graph } = result;\n const sorted = [...affected.entries()].sort(\n ([, a], [, b]) => a.depth - b.depth || a.path.localeCompare(b.path),\n );\n\n const nodesByKey = new Map<string, TreeNode & { children: TreeNode[] }>();\n const depthByKey = new Map<string, number>();\n for (const [key, file] of sorted) {\n const node: TreeNode & { children: TreeNode[] } = { label: \"\", children: [] };\n node.label = fileLabel(displayPath(file.path, cwd), file.depth, file.inCycle, style);\n nodesByKey.set(key, node);\n depthByKey.set(key, file.depth);\n }\n\n const roots: TreeNode[] = [];\n for (const [key, file] of sorted) {\n const node = nodesByKey.get(key);\n if (!node) continue;\n\n if (file.depth === 1) {\n roots.push(node);\n continue;\n }\n\n const importers = graph.reverse.get(key) ?? [];\n const parents = [...importers]\n .filter(\n (candidate) => depthByKey.get(candidate) === file.depth - 1 && nodesByKey.has(candidate),\n )\n .sort((a, b) => (depthByKey.get(a) ?? 0) - (depthByKey.get(b) ?? 0) || a.localeCompare(b));\n\n const parent = parents[0] ? nodesByKey.get(parents[0]) : undefined;\n if (parent) {\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n return roots;\n}\n\n/** Render the full `ripple analyze` terminal report. */\nexport function renderAnalyzeReport(\n result: AnalysisResult,\n options: ReportOptions,\n writer: OutputWriter,\n): void {\n const style = textStyle(options);\n const { summary, risk } = result;\n const file = displayPath(result.targetPath, options.cwd);\n\n writer.writeLine(brandHeader({ label: \"impact analysis\", version: options.version, style }));\n writer.writeLine();\n\n const score = risk.score.toFixed(1);\n const gauge = riskGauge(risk.score, risk.level, style);\n const rows: Array<[string, string]> = [\n [\"File\", file],\n [\"Risk\", `${riskBadge(risk.level, style)} · ${score}/100${gauge ? ` ${gauge}` : \"\"}`],\n [\"Impact\", impactLine(result, style)],\n [\"Affected\", pluralize(summary.affectedFiles, \"file\")],\n [\"Max depth\", String(summary.maxDepth)],\n [\"Confidence\", confidenceText(summary.confidence, style)],\n [\"Duration\", dim(formatDuration(result.durationMs), style)],\n ];\n const width = Math.max(...rows.map(([key]) => key.length));\n for (const [key, value] of rows) {\n writer.writeLine(`${key.padEnd(width)} ${value}`);\n }\n writer.writeLine();\n\n writer.writeLine(sectionHeader(\"Top impact\", style));\n for (const area of summary.topImpact) {\n writer.writeLine(\n `${icon(\"bullet\")} ${strong(area.label, style)} ${dim(`(${area.count})`, style)}`,\n );\n }\n writer.writeLine();\n\n writer.writeLine(sectionHeader(\"Circular dependencies\", style));\n if (result.graph.cycles.length === 0) {\n writer.writeLine(dim(\"none\", style));\n } else {\n for (const cycle of result.graph.cycles) {\n const chain = cycle.path\n .map((key) => {\n const node = result.graph.nodes.get(key);\n return displayPath(node?.path ?? key, options.cwd);\n })\n .join(` ${icon(\"arrowRight\")} `);\n writer.writeLine(`${icon(\"circle\")} ${chain}`);\n }\n }\n writer.writeLine();\n\n if (summary.affectedFiles > 0) {\n writer.writeLine(sectionHeader(`Affected files (${summary.affectedFiles})`, style));\n const tree = buildAffectedTree(result, options.cwd, style);\n writer.writeLine(renderTree(tree));\n const limit = options.listLimit ?? DEFAULT_LIST_LIMIT;\n if (summary.affectedFiles > limit) {\n writer.writeLine(\n dim(`${summary.affectedFiles - limit} more… use --json for the full list`, style),\n );\n }\n writer.writeLine();\n }\n\n if (options.verbose) {\n writer.writeLine(sectionHeader(\"Risk factors\", style));\n const columns: TableColumn[] = [\n { header: \"Factor\" },\n { header: \"Weight\" },\n { header: \"Signal\" },\n { header: \"Points\" },\n ];\n const rowsVerbose = risk.factors.map((factor) => [\n factor.label,\n factor.weight.toFixed(2),\n factor.value.toFixed(2),\n factor.contribution.toFixed(2),\n ]);\n writer.writeLine(renderTable(columns, rowsVerbose));\n writer.writeLine();\n }\n\n if (style.color) {\n writer.writeLine(\n dim(`${icon(\"info\")} Tip: run \"ripple doctor\" to check project health`, style),\n );\n }\n}\n\n/** Build the machine-readable `analyze --json` payload. */\nexport function buildAnalyzeJsonReport(\n result: AnalysisResult,\n version: string,\n cwd: string,\n): AnalyzeJsonReport {\n const realPath = (key: string): string => result.graph.nodes.get(key)?.path ?? key;\n\n const affected = [...result.affected.values()]\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((file) => ({ ...file, path: displayPath(file.path, cwd) }));\n\n return {\n tool: \"ripple\",\n version,\n command: \"analyze\",\n file: displayPath(result.targetPath, cwd),\n risk: result.risk,\n summary: result.summary,\n affected,\n cycles: result.graph.cycles.map((cycle) => ({\n members: cycle.members.map((key) => displayPath(realPath(key), cwd)),\n path: cycle.path.map((key) => displayPath(realPath(key), cwd)),\n })),\n targetInCycle: result.targetInCycle,\n durationMs: result.durationMs,\n };\n}\n\nexport interface GraphReportInput {\n stats: GraphStats;\n cycles: DependencyGraph[\"cycles\"];\n nodes: DependencyGraph[\"nodes\"];\n cwd: string;\n /** For `ripple graph <file>`: forward and reverse file lists. */\n forward?: string[];\n reverse?: string[];\n}\n\n/** Render the `ripple graph` terminal report. */\nexport function renderGraphReport(\n input: GraphReportInput,\n options: ReportOptions,\n writer: OutputWriter,\n): void {\n const style = textStyle(options);\n const { stats } = input;\n\n writer.writeLine(brandHeader({ label: \"dependency graph\", version: options.version, style }));\n writer.writeLine();\n\n writer.writeLine(\n renderKeyValue([\n [\"Files\", String(stats.files)],\n [\"Edges\", String(stats.internalEdges)],\n [\"External\", String(stats.externalEdges)],\n [\"Unresolved\", String(stats.unresolvedEdges)],\n [\"Circular groups\", String(stats.cycles)],\n ]),\n );\n writer.writeLine();\n\n if (input.forward) {\n writer.writeLine(sectionHeader(\"Dependants (forward)\", style));\n writer.writeLine(renderTree(input.forward.map((path) => ({ label: path }))));\n writer.writeLine();\n }\n if (input.reverse) {\n writer.writeLine(sectionHeader(\"Dependents (reverse)\", style));\n writer.writeLine(renderTree(input.reverse.map((path) => ({ label: path }))));\n writer.writeLine();\n }\n\n writer.writeLine(sectionHeader(\"Circular dependencies\", style));\n if (input.cycles.length === 0) {\n writer.writeLine(dim(\"none\", style));\n } else {\n for (const cycle of input.cycles) {\n const chain = cycle.path\n .map((key) => {\n const node = input.nodes.get(key);\n return displayPath(node?.path ?? key, input.cwd);\n })\n .join(` ${icon(\"arrowRight\")} `);\n writer.writeLine(`${icon(\"circle\")} ${chain}`);\n }\n }\n}\n\n/** Build the machine-readable `graph --json` payload. */\nexport function buildGraphJsonReport(input: GraphReportInput, version: string): GraphJsonReport {\n const realPath = (key: string): string => input.nodes.get(key)?.path ?? key;\n return {\n tool: \"ripple\",\n version,\n command: \"graph\",\n fileCount: input.stats.files,\n edgeCount: input.stats.internalEdges,\n externalEdgeCount: input.stats.externalEdges,\n cycles: input.cycles.map((cycle) => ({\n members: cycle.members.map((key) => displayPath(realPath(key), input.cwd)),\n path: cycle.path.map((key) => displayPath(realPath(key), input.cwd)),\n })),\n ...(input.forward ? { forward: input.forward } : {}),\n ...(input.reverse ? { reverse: input.reverse } : {}),\n };\n}\n","/** Serialize a report object to pretty JSON. */\nexport function serializeJson(report: unknown): string {\n return `${JSON.stringify(report, null, 2)}\\n`;\n}\n","import { Project, ts } from \"ts-morph\";\n\n/**\n * Shared ts-morph `Project` factory.\n *\n * One project is created per analysis run and reused for every file:\n * ts-morph parses lazily per source file, so this keeps memory bounded while\n * avoiding per-file project overhead. Files are added individually — the\n * tsconfig is never auto-loaded, since Ripple controls discovery itself.\n */\nexport function createTsProject(): Project {\n return new Project({\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n allowJs: true,\n checkJs: false,\n jsx: ts.JsxEmit.Preserve,\n noEmit: true,\n target: ts.ScriptTarget.ESNext,\n },\n });\n}\n","import fg from \"fast-glob\";\n\n/**\n * File discovery on top of fast-glob.\n *\n * Patterns are resolved against `cwd`; results are absolute native paths.\n * A file may match several `include` patterns; results are deduplicated.\n */\n\nexport interface GlobOptions {\n cwd: string;\n /** Glob patterns to include. */\n patterns: string[];\n /** Glob patterns to ignore. */\n ignore: string[];\n}\n\nexport async function globFiles(options: GlobOptions): Promise<string[]> {\n const matches = await fg(options.patterns, {\n cwd: options.cwd,\n ignore: options.ignore,\n onlyFiles: true,\n absolute: true,\n unique: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n });\n return matches;\n}\n\n/** Convert a plain directory/segment name to an ignore glob that matches it at any depth. */\nexport function toIgnoreGlob(segment: string): string {\n const trimmed = segment.replace(/^\\/+|\\/+$/g, \"\");\n if (trimmed === \"\") return \"\";\n const glob = trimmed.includes(\"*\") || trimmed.includes(\"{\") ? trimmed : `**/${trimmed}/**`;\n return glob;\n}\n","import { sourceFileKind, SOURCE_EXTENSIONS } from \"../utils/paths.js\";\n\n/**\n * Canonical discovery rules: which extensions count as source files and which\n * directories are ignored by default. `src/config/defaults.ts` imports the\n * default ignore names from here so the knowledge lives in exactly one place.\n */\n\nexport const SOURCE_EXTENSION_GLOB = `*.{${SOURCE_EXTENSIONS.map((e) => e.slice(1)).join(\",\")}}`;\n\n/** Extensions accepted by the scanner. */\nexport const STANDARD_IGNORE_NAMES = [\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \"out\",\n \".git\",\n] as const;\n\n/** Whether a file path ends with a discoverable source extension. */\nexport function isSourceFile(filePath: string): boolean {\n return sourceFileKind(filePath) !== undefined;\n}\n","import { globFiles, toIgnoreGlob } from \"../utils/globs.js\";\nimport { isSourceFile } from \"./rules.js\";\n\n/**\n * Recursive source-file discovery for a project.\n *\n * Combines the configured `include` globs with the configured `ignore`\n * entries (plain directory names are converted to catch-all globs) and\n * filters results down to source extensions. Files may match multiple\n * patterns; the result is deduplicated and sorted for determinism.\n */\n\nexport interface DiscoveryOptions {\n rootDir: string;\n include: string[];\n ignore: string[];\n}\n\nexport async function discoverSourceFiles(options: DiscoveryOptions): Promise<string[]> {\n const ignoreGlobs = options.ignore\n .map(toIgnoreGlob)\n .filter((glob) => glob !== \"\")\n .concat([\"**/node_modules/**\"]);\n\n const files = await globFiles({\n cwd: options.rootDir,\n patterns: options.include,\n ignore: ignoreGlobs,\n });\n\n return files.filter(isSourceFile).sort((a, b) => a.localeCompare(b));\n}\n","import type { SourceFile } from \"ts-morph\";\nimport type { ExportInfo } from \"../types/parser.js\";\n\n/**\n * Extract the public export surface of a file:\n *\n * - `export const x`, `export function x`, `export class X`, ... (declarations)\n * - `export default ...`\n * - re-exports: `export { x } from \"...\"` and `export * from \"...\"`\n */\nexport function extractExports(sourceFile: SourceFile): ExportInfo {\n const named: string[] = [];\n const reExportedFrom: string[] = [];\n const reExportedAll: string[] = [];\n\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n const namedExports = decl.getNamedExports();\n\n if (specifier) {\n if (namedExports.length === 0) {\n reExportedAll.push(specifier);\n } else {\n reExportedFrom.push(specifier);\n }\n continue;\n }\n\n for (const namedExport of namedExports) {\n named.push(namedExport.getName());\n }\n }\n\n for (const statement of sourceFile.getVariableStatements()) {\n if (!statement.isExported()) continue;\n for (const declaration of statement.getDeclarations()) {\n named.push(declaration.getName());\n }\n }\n\n for (const fn of sourceFile.getFunctions()) {\n if (!fn.isExported()) continue;\n const name = fn.getName();\n if (name) named.push(name);\n }\n\n for (const cls of sourceFile.getClasses()) {\n if (!cls.isExported()) continue;\n const name = cls.getName();\n if (name) named.push(name);\n }\n\n for (const en of sourceFile.getEnums()) {\n if (!en.isExported()) continue;\n const name = en.getName();\n if (name) named.push(name);\n }\n\n for (const iface of sourceFile.getInterfaces()) {\n if (!iface.isExported()) continue;\n named.push(iface.getName());\n }\n\n for (const alias of sourceFile.getTypeAliases()) {\n if (!alias.isExported()) continue;\n named.push(alias.getName());\n }\n\n const hasDefault =\n sourceFile.getExportAssignments().length > 0 ||\n sourceFile.getFunctions().some((fn) => fn.isDefaultExport()) ||\n sourceFile.getClasses().some((cls) => cls.isDefaultExport());\n\n named.sort();\n return { named, hasDefault, reExportedFrom, reExportedAll };\n}\n","import { SyntaxKind, type ImportEqualsDeclaration, type SourceFile } from \"ts-morph\";\nimport type { ImportDeclaration, ImportSpecifier } from \"../types/parser.js\";\n\n/**\n * Extract every module specifier a file depends on:\n *\n * - `import ... from \"x\"` / bare `import \"x\"`\n * - `export { ... } from \"x\"` / `export * from \"x\"`\n * - `import(\"x\")` dynamic imports\n * - `require(\"x\")` and `import x = require(\"x\")`\n *\n * Only statically analyzable string-literal specifiers are reported.\n */\n\nfunction specifierFor(\n imported: string,\n alias: string | undefined,\n isType: boolean,\n): ImportSpecifier {\n return alias && alias !== imported\n ? { name: imported, alias, isType }\n : { name: imported, isType };\n}\n\nexport function extractImports(sourceFile: SourceFile): ImportDeclaration[] {\n const declarations: ImportDeclaration[] = [];\n\n for (const decl of sourceFile.getImportDeclarations()) {\n declarations.push({\n raw: decl.getModuleSpecifierValue(),\n kind: \"import\",\n isTypeOnly: decl.isTypeOnly(),\n specifiers: decl\n .getNamedImports()\n .map((named) =>\n specifierFor(named.getName(), named.getAliasNode()?.getText(), named.isTypeOnly()),\n ),\n });\n }\n\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n if (!specifier) continue;\n declarations.push({\n raw: specifier,\n kind: \"export-from\",\n isTypeOnly: decl.isTypeOnly(),\n specifiers: decl\n .getNamedExports()\n .map((named) =>\n specifierFor(named.getName(), named.getAliasNode()?.getText(), named.isTypeOnly()),\n ),\n });\n }\n\n const importEqualsNodes = sourceFile\n .getDescendantsOfKind(SyntaxKind.ImportEqualsDeclaration)\n .map((node) => node as ImportEqualsDeclaration);\n for (const decl of importEqualsNodes) {\n const literal = decl.getFirstDescendantByKind(SyntaxKind.StringLiteral);\n if (literal) {\n declarations.push({\n raw: literal.getLiteralText(),\n kind: \"require\",\n isTypeOnly: false,\n specifiers: [],\n });\n }\n }\n\n for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n const callee = call.getExpression().getText();\n if (callee !== \"require\" && callee !== \"import\") continue;\n const argument = call.getArguments()[0];\n if (!argument?.isKind(SyntaxKind.StringLiteral)) continue;\n declarations.push({\n raw: argument.getLiteralText(),\n kind: callee === \"require\" ? \"require\" : \"dynamic\",\n isTypeOnly: false,\n specifiers: [],\n });\n }\n\n return declarations;\n}\n","import type { SourceFile } from \"ts-morph\";\nimport type { SymbolInfo } from \"../types/parser.js\";\n\n/**\n * Extract top-level declarations of a file. Used by the risk engine to\n * estimate the public surface and by categorization to classify files.\n */\nexport function extractSymbols(sourceFile: SourceFile): SymbolInfo {\n return {\n functions: sourceFile.getFunctions().map((fn) => fn.getName() ?? \"(default)\"),\n classes: sourceFile.getClasses().map((cls) => cls.getName() ?? \"(default)\"),\n interfaces: sourceFile.getInterfaces().map((iface) => iface.getName()),\n enums: sourceFile.getEnums().map((en) => en.getName()),\n typeAliases: sourceFile.getTypeAliases().map((alias) => alias.getName()),\n };\n}\n","import type { Project, SourceFile } from \"ts-morph\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport { sourceFileKind } from \"../utils/paths.js\";\nimport { extractExports } from \"./exports.js\";\nimport { extractImports } from \"./imports.js\";\nimport { extractSymbols } from \"./symbols.js\";\n\n/**\n * Parse one file into a `ParsedFile`. A parse failure must never abort the\n * analysis: the error is recorded and the file keeps an empty surface so it\n * still participates in the graph as a node.\n */\nexport function parseSourceFile(project: Project, filePath: string): ParsedFile {\n let sourceFile: SourceFile;\n try {\n sourceFile = project.addSourceFileAtPath(filePath);\n } catch (error) {\n return {\n path: filePath,\n kind: sourceFileKind(filePath) ?? \"ts\",\n imports: [],\n exports: { named: [], hasDefault: false, reExportedFrom: [], reExportedAll: [] },\n symbols: { functions: [], classes: [], interfaces: [], enums: [], typeAliases: [] },\n parseError: error instanceof Error ? error.message : String(error),\n };\n }\n\n return {\n path: filePath,\n kind: sourceFileKind(filePath) ?? \"ts\",\n imports: extractImports(sourceFile),\n exports: extractExports(sourceFile),\n symbols: extractSymbols(sourceFile),\n };\n}\n\n/** Parse many files, reusing the shared project. Never throws. */\nexport function parseMany(project: Project, filePaths: string[]): ParsedFile[] {\n return filePaths.map((filePath) => parseSourceFile(project, filePath));\n}\n","import type { Cycle, DependencyGraph } from \"../types/graph.js\";\n\n/**\n * Cycle detection via Kosaraju's strongly-connected-components algorithm,\n * implemented iteratively so deep import chains can never overflow the call\n * stack.\n *\n * Every SCC with more than one node (or a self-loop) is a circular\n * dependency group. For each group we additionally walk one representative\n * cycle path so output shows the *actual import chain*, not just the member\n * set.\n *\n * Ripple reports cycle *groups*: two files in the same SCC are reported once,\n * not once per back edge.\n */\n\n/** Find SCCs in `graph`. Returns groups of node keys. */\nexport function findCycles(graph: DependencyGraph): Cycle[] {\n const nodeKeys = [...graph.nodes.keys()];\n\n // Pass 1: finish order via iterative DFS on the forward graph.\n const visited = new Set<string>();\n const finishOrder: string[] = [];\n\n for (const start of nodeKeys) {\n if (visited.has(start)) continue;\n const stack: Array<[node: string, neighborIndex: number]> = [[start, 0]];\n visited.add(start);\n\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n if (top === undefined) break;\n const [node, index] = top;\n const neighbors = [...(graph.forward.get(node) ?? [])];\n\n if (index < neighbors.length) {\n top[1] = index + 1;\n const neighbor = neighbors[index];\n if (neighbor === undefined) continue;\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n stack.push([neighbor, 0]);\n }\n } else {\n stack.pop();\n finishOrder.push(node);\n }\n }\n }\n\n // Pass 2: process in reverse finish order on the reverse graph.\n const componentOf = new Map<string, number>();\n const components: string[][] = [];\n\n for (let i = finishOrder.length - 1; i >= 0; i--) {\n const start = finishOrder[i];\n if (start === undefined || componentOf.has(start)) continue;\n\n const component: string[] = [];\n const stack = [start];\n componentOf.set(start, components.length);\n\n while (stack.length > 0) {\n const node = stack.pop();\n if (node === undefined) continue;\n component.push(node);\n for (const neighbor of graph.reverse.get(node) ?? []) {\n if (!componentOf.has(neighbor)) {\n componentOf.set(neighbor, components.length);\n stack.push(neighbor);\n }\n }\n }\n\n components.push(component);\n }\n\n const cycles: Cycle[] = [];\n for (const component of components) {\n if (component.length < 2) {\n const single = component[0];\n if (single !== undefined && graph.forward.get(single)?.has(single)) {\n cycles.push({ members: [single], path: [single, single] });\n }\n continue;\n }\n\n const members = [...component].sort();\n const componentSet = new Set(component);\n const path = representativeCyclePath(graph, component, componentSet);\n cycles.push({ members, path: path ?? [members[0]!, members[0]!] });\n }\n\n cycles.sort(\n (a, b) => a.members.length - b.members.length || a.members[0]!.localeCompare(b.members[0]!),\n );\n return cycles;\n}\n\n/**\n * Walk forward edges within the component until a node is revisited; the\n * segment from the first occurrence forms a cycle path (start == end).\n */\nfunction representativeCyclePath(\n graph: DependencyGraph,\n component: string[],\n componentSet: Set<string>,\n): string[] | undefined {\n const inPath = new Set<string>();\n const path: string[] = [];\n let current: string | undefined = component[0];\n\n for (let steps = 0; steps <= component.length * 2 && current !== undefined; steps++) {\n const firstOccurrence = inPath.has(current);\n if (firstOccurrence) {\n const start = path.indexOf(current);\n if (start === -1) return undefined;\n const cycle = path.slice(start);\n if (cycle.length > 1 || graph.forward.get(current)?.has(current)) {\n cycle.push(current);\n return cycle;\n }\n return undefined;\n }\n inPath.add(current);\n path.push(current);\n\n const next = [...(graph.forward.get(current) ?? [])].find((candidate) =>\n componentSet.has(candidate),\n );\n current = next;\n }\n\n return undefined;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { substituteAlias } from \"../config/aliases.js\";\nimport type { AliasMap } from \"../types/config.js\";\nimport type { EdgeKind } from \"../types/graph.js\";\nimport { extensionCandidates, jsToTsCandidate, pathKey } from \"../utils/paths.js\";\n\n/**\n * Module specifier resolution.\n *\n * Resolution pipeline for one import declaration:\n *\n * 1. Alias substitution (`ripple.config.ts` aliases + tsconfig `paths`).\n * 2. Relative/bare classification.\n * 3. Candidate probing: exact, extension candidates, directory index files.\n * `.js` specifiers may resolve to `.ts` files (NodeNext-style projects).\n * 4. Bare specifiers that cannot be probed are external.\n * 5. Relative imports that point at existing files outside the analyzed set\n * (assets like `.css`, `.json`, or ignored source files) are external —\n * they exist, Ripple just does not model them.\n *\n * The resolver is a pure function of its inputs and does no I/O beyond\n * cheap existence checks.\n */\n\nexport interface ResolverContext {\n /** Project root. */\n rootDir: string;\n aliases: AliasMap;\n /** Canonical keys of all discovered files. */\n fileKeys: Set<string>;\n}\n\nexport interface ResolvedEdge {\n /** Absolute path of the resolved file, for internal edges. */\n filePath?: string;\n kind: EdgeKind;\n}\n\n/** Replace the last extension-less segment and probe existing files. */\nfunction probeCandidates(base: string, fileKeys: Set<string>, rootDir: string): string | undefined {\n for (const candidate of extensionCandidates(base)) {\n const key = pathKey(candidate, rootDir);\n if (fileKeys.has(key)) return path.normalize(candidate);\n }\n const jsSwapped = jsToTsCandidate(base);\n if (jsSwapped !== base) {\n const swappedKey = pathKey(jsSwapped, rootDir);\n if (fileKeys.has(swappedKey)) return path.normalize(jsSwapped);\n }\n return undefined;\n}\n\n/** An absolute path exists on disk as a file or directory. */\nfunction existsOnDisk(filePath: string): boolean {\n try {\n fs.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve a specifier to an absolute candidate path (possibly\n * extension-less) or `undefined` when the specifier cannot be interpreted.\n */\nfunction specifierToBase(\n specifier: string,\n fromDir: string,\n context: ResolverContext,\n): string | undefined {\n const { rootDir, aliases } = context;\n\n if (specifier.startsWith(\"/\")) {\n return path.resolve(rootDir, specifier.slice(1));\n }\n if (specifier.startsWith(\".\")) {\n return path.resolve(fromDir, specifier);\n }\n const substituted = substituteAlias(specifier, aliases);\n if (substituted === undefined) return undefined;\n return path.isAbsolute(substituted) ? substituted : path.resolve(rootDir, substituted);\n}\n\n/** Resolve a specifier to a discovered file, or `undefined`. */\nfunction resolveToFile(base: string, context: ResolverContext): string | undefined {\n const { rootDir, fileKeys } = context;\n\n const exactKey = pathKey(base, rootDir);\n if (fileKeys.has(exactKey)) return path.normalize(base);\n\n const probed = probeCandidates(base, fileKeys, rootDir);\n if (probed) return probed;\n\n if (existsOnDisk(base) && fs.statSync(base).isDirectory()) {\n const indexProbed = probeCandidates(path.join(base, \"index\"), fileKeys, rootDir);\n if (indexProbed) return indexProbed;\n }\n\n return undefined;\n}\n\n/**\n * Resolve one import declaration from a source file. Returns the edge kind\n * and, for internal edges, the absolute target path.\n */\nexport function resolveEdge(\n specifier: string,\n fromPath: string,\n context: ResolverContext,\n): ResolvedEdge {\n const base = specifierToBase(specifier, path.dirname(fromPath), context);\n\n if (base !== undefined) {\n const resolved = resolveToFile(base, context);\n if (resolved !== undefined) return { filePath: resolved, kind: \"internal\" };\n if (existsOnDisk(base)) return { kind: \"external\" };\n }\n\n const isRelative = specifier.startsWith(\".\") || specifier.startsWith(\"/\");\n const isAlias = specifierToBase(specifier, path.dirname(fromPath), context) !== undefined;\n if (isRelative || isAlias) return { kind: \"unresolved\" };\n return { kind: \"external\" };\n}\n\n/**\n * Resolve every import of a file against the discovered file set.\n * Returns internal target paths, external specifiers and unresolved\n * specifiers, in declaration order.\n */\nexport function resolveImports(\n fromPath: string,\n importSpecifiers: string[],\n context: ResolverContext,\n): { internal: string[]; external: string[]; unresolved: string[] } {\n const internal: string[] = [];\n const external: string[] = [];\n const unresolved: string[] = [];\n\n for (const specifier of importSpecifiers) {\n const edge = resolveEdge(specifier, fromPath, context);\n if (edge.kind === \"internal\" && edge.filePath) {\n internal.push(edge.filePath);\n } else if (edge.kind === \"external\") {\n external.push(specifier);\n } else {\n unresolved.push(specifier);\n }\n }\n\n return { internal, external, unresolved };\n}\n","import type { Project } from \"ts-morph\";\nimport { parseMany } from \"../parser/parse.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { pathKey } from \"../utils/paths.js\";\nimport { findCycles } from \"./cycles.js\";\nimport { resolveImports, type ResolverContext } from \"./resolve.js\";\n\n/**\n * Build the in-memory dependency graph.\n *\n * 1. Parse every discovered file (shared ts-morph project).\n * 2. Resolve every import against the file set (aliases, index files, ...).\n * 3. Populate `forward` / `reverse` / `external` and graph stats.\n * 4. Detect cycles (SCC groups).\n *\n * `reverse` is built incrementally here so reverse traversals stay O(n).\n */\nexport function buildGraph(\n project: Project,\n filePaths: string[],\n context: ResolverContext,\n): DependencyGraph {\n const parsedFiles = parseMany(project, filePaths);\n\n const nodes: DependencyGraph[\"nodes\"] = new Map();\n const forward: DependencyGraph[\"forward\"] = new Map();\n const reverse: DependencyGraph[\"reverse\"] = new Map();\n const external: DependencyGraph[\"external\"] = new Map();\n\n let parsedCount = 0;\n let internalEdges = 0;\n let unresolvedEdges = 0;\n let externalEdges = 0;\n\n for (const parsed of parsedFiles) {\n const key = pathKey(parsed.path, context.rootDir);\n nodes.set(key, { path: parsed.path, parsed });\n if (!parsed.parseError) parsedCount++;\n }\n\n for (const parsed of parsedFiles) {\n const fromKey = pathKey(parsed.path, context.rootDir);\n const targets = new Set<string>();\n\n const {\n internal,\n external: externalSpecifiers,\n unresolved,\n } = resolveImports(\n parsed.path,\n parsed.imports.map((decl) => decl.raw),\n context,\n );\n\n internalEdges += internal.length;\n unresolvedEdges += unresolved.length;\n externalEdges += externalSpecifiers.length;\n\n for (const target of internal) {\n targets.add(pathKey(target, context.rootDir));\n }\n\n if (externalSpecifiers.length > 0) {\n external.set(fromKey, new Set(externalSpecifiers));\n }\n\n forward.set(fromKey, targets);\n for (const target of targets) {\n const importers = reverse.get(target) ?? new Set<string>();\n importers.add(fromKey);\n reverse.set(target, importers);\n }\n }\n\n const graph: DependencyGraph = {\n nodes,\n forward,\n reverse,\n external,\n cycles: [],\n stats: {\n files: parsedFiles.length,\n parsed: parsedCount,\n internalEdges,\n unresolvedEdges,\n externalEdges,\n cycles: 0,\n },\n };\n graph.cycles = findCycles(graph);\n graph.stats.cycles = graph.cycles.length;\n return graph;\n}\n\n/**\n * Look up a graph node by absolute path. Returns the node's canonical key\n * and its parsed surface, or `undefined` when the file is not in the graph.\n */\nexport function findNode(\n graph: DependencyGraph,\n filePath: string,\n rootDir: string,\n): { key: string; parsed: ParsedFile } | undefined {\n const key = pathKey(filePath, rootDir);\n const node = graph.nodes.get(key);\n if (!node) return undefined;\n return { key, parsed: node.parsed };\n}\n","import path from \"node:path\";\nimport { createTsProject } from \"../parser/ts-project.js\";\nimport { discoverSourceFiles } from \"../scanner/discover.js\";\nimport { buildGraph } from \"../graph/build.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport { detectEntryPoints } from \"../analyzer/categorize.js\";\nimport { pathKey, displayPath } from \"../utils/paths.js\";\nimport { fileNotFound } from \"../utils/errors.js\";\n\n/**\n * Shared pipeline for commands that need the full dependency graph\n * (analyze, graph, doctor). Loads context, discovers files, parses and\n * resolves everything into one graph, and detects entry points.\n */\n\nexport interface PipelineResult {\n graph: ReturnType<typeof buildGraph>;\n filePaths: string[];\n entryPoints: Set<string>;\n durationMs: number;\n}\n\nexport async function runPipeline(context: ProjectContext): Promise<PipelineResult> {\n const started = Date.now();\n const project = createTsProject();\n const filePaths = await discoverSourceFiles({\n rootDir: context.rootDir,\n include: context.config.include,\n ignore: context.config.ignore,\n });\n const graph = buildGraph(project, filePaths, {\n rootDir: context.rootDir,\n aliases: context.aliases,\n fileKeys: new Set(filePaths.map((p) => pathKey(p, context.rootDir))),\n });\n const entryPoints = await detectEntryPoints(context.rootDir);\n return { graph, filePaths, entryPoints, durationMs: Date.now() - started };\n}\n\n/** Resolve the `<file>` argument to an absolute path (cwd-relative). */\nexport function resolveTargetFile(fileArg: string, cwd: string): string {\n return path.isAbsolute(fileArg) ? fileArg : path.join(cwd, fileArg);\n}\n\n/** Verify the target path is part of the graph; throws `RippleError`. */\nexport function requireNode(\n graph: DependencyGraph,\n targetPath: string,\n rootDir: string,\n): { key: string } {\n const key = pathKey(targetPath, rootDir);\n if (!graph.nodes.has(key)) {\n throw fileNotFound(displayPath(targetPath, rootDir));\n }\n return { key };\n}\n","import { loadProjectContext } from \"../config/loader.js\";\nimport { analyzeFile } from \"../analyzer/analyze.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { buildAnalyzeJsonReport, renderAnalyzeReport } from \"../output/report.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport { requireNode, resolveTargetFile, runPipeline } from \"./pipeline.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { pathExists } from \"../utils/fs.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AnalyzeOptions, CommandContext } from \"../types/cli.js\";\n\n/**\n * `ripple analyze <file>`\n *\n * Full impact analysis of one file: reverse traversal, risk score, and a\n * terminal or JSON report.\n */\nexport async function analyzeCommand(\n fileArg: string,\n options: AnalyzeOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const targetPath = resolveTargetFile(fileArg, ctx.cwd);\n if (!(await pathExists(targetPath))) {\n throw new RippleError(`File not found: ${fileArg}`, ExitCode.NotFound);\n }\n\n const tracker = createStageTracker(!options.json);\n tracker.next(\"Loading config\");\n\n const started = Date.now();\n const context = await loadProjectContext(ctx.cwd, options.config);\n\n tracker.next(\"Building dependency graph\");\n const { graph, entryPoints, durationMs: pipelineMs } = await runPipeline(context);\n\n tracker.next(\"Analyzing impact\");\n const completed = Date.now();\n const result = analyzeFile({\n graph,\n context,\n entryPoints,\n targetKey: requireNode(graph, targetPath, context.rootDir).key,\n targetPath,\n durationMs: pipelineMs + (completed - started),\n ...(options.depth !== undefined ? { maxDepth: options.depth } : {}),\n });\n tracker.done();\n\n if (options.json) {\n const report = buildAnalyzeJsonReport(result, ctx.version, ctx.cwd);\n ctx.writer.write(serializeJson(report));\n return ExitCode.Success;\n }\n\n renderAnalyzeReport(\n result,\n {\n cwd: ctx.cwd,\n color: resolveColor(options.color),\n verbose: options.verbose,\n version: ctx.version,\n },\n ctx.writer,\n );\n return ExitCode.Success;\n}\n","import { loadProjectContext } from \"../config/loader.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { buildGraphJsonReport, renderGraphReport } from \"../output/report.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport { requireNode, resolveTargetFile, runPipeline } from \"./pipeline.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, GraphOptions } from \"../types/cli.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\n\n/**\n * `ripple graph [file]`\n *\n * Without a file: project-wide graph stats and circular dependencies.\n * With a file: the file's dependency tree — dependants (what it imports)\n * by default, or dependents (what imports it) with `--reverse`.\n */\n\ninterface WalkNode {\n key: string;\n depth: number;\n}\n\n/** BFS walk over an edge map, depth-capped, sorted by depth then path. */\nfunction walk(\n graph: DependencyGraph,\n startKey: string,\n edges: Map<string, Set<string>>,\n maxDepth: number | undefined,\n cwd: string,\n): string[] {\n const seen = new Set<string>([startKey]);\n const queue: WalkNode[] = [{ key: startKey, depth: 0 }];\n const entries: Array<{ path: string; depth: number }> = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n if (current.key !== startKey) {\n const nodePath = graph.nodes.get(current.key)?.path ?? current.key;\n entries.push({ path: displayPath(nodePath, cwd), depth: current.depth });\n }\n if (maxDepth !== undefined && current.depth >= maxDepth) continue;\n\n for (const candidate of edges.get(current.key) ?? []) {\n if (seen.has(candidate)) continue;\n seen.add(candidate);\n queue.push({ key: candidate, depth: current.depth + 1 });\n }\n }\n\n return entries\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((entry) => entry.path);\n}\n\nexport async function graphCommand(\n fileArg: string | undefined,\n options: GraphOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const tracker = createStageTracker(!options.json);\n tracker.next(\"Loading config\");\n const cwd = ctx.cwd;\n\n try {\n const context = await loadProjectContext(cwd, options.config);\n\n tracker.next(\"Building graph\");\n const { graph } = await runPipeline(context);\n\n const input = {\n stats: graph.stats,\n cycles: graph.cycles,\n nodes: graph.nodes,\n cwd,\n };\n\n if (!fileArg) {\n tracker.done();\n if (options.json) {\n const report = buildGraphJsonReport(input, ctx.version);\n ctx.writer.write(serializeJson(report));\n } else {\n renderGraphReport(\n input,\n {\n cwd,\n color: resolveColor(options.color),\n verbose: options.verbose,\n version: ctx.version,\n },\n ctx.writer,\n );\n }\n return ExitCode.Success;\n }\n\n const targetPath = resolveTargetFile(fileArg, cwd);\n const { key } = requireNode(graph, targetPath, context.rootDir);\n const dependants = walk(graph, key, graph.forward, options.depth, cwd);\n const dependents = walk(graph, key, graph.reverse, options.depth, cwd);\n\n tracker.done();\n\n if (options.json) {\n const report = buildGraphJsonReport(\n {\n ...input,\n ...(options.reverse ? { reverse: dependents } : { forward: dependants }),\n },\n ctx.version,\n );\n ctx.writer.write(serializeJson(report));\n } else {\n renderGraphReport(\n {\n ...input,\n forward: options.reverse ? undefined : dependants,\n reverse: options.reverse ? dependents : undefined,\n },\n { cwd, color: resolveColor(options.color), verbose: options.verbose, version: ctx.version },\n ctx.writer,\n );\n }\n return ExitCode.Success;\n } finally {\n tracker.done();\n }\n}\n","import ora from \"ora\";\n\n/**\n * Spinner for long-running commands. Becomes a no-op when the stream is not\n * a TTY (CI, pipes, tests) or when output is JSON — never pollute machines.\n */\nexport function createSpinner(enabled: boolean): { start(text: string): void; stop(): void } {\n if (!enabled || !process.stdout.isTTY) {\n return { start: () => {}, stop: () => {} };\n }\n let instance: ReturnType<typeof ora> | undefined;\n return {\n start(text: string): void {\n instance = ora(text).start();\n },\n stop(): void {\n instance?.stop();\n instance = undefined;\n },\n };\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport { loadConfig, loadProjectContext } from \"../config/loader.js\";\nimport { buildGraph } from \"../graph/build.js\";\nimport { createTsProject } from \"../parser/ts-project.js\";\nimport { discoverSourceFiles } from \"../scanner/discover.js\";\nimport { createSpinner } from \"../cli/spinner.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { brandHeader } from \"../ui/brand.js\";\nimport { icon } from \"../ui/icons.js\";\nimport { dim, type TextStyle } from \"../formatter/text.js\";\nimport { pathKey } from \"../utils/paths.js\";\nimport { findPackageJson } from \"../utils/fs.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, DoctorOptions } from \"../types/cli.js\";\n\n/**\n * `ripple doctor`\n *\n * Environment and project health check. Each check is independent; a failed\n * check is reported but does not abort the run. Exits non-zero when any\n * check fails.\n */\n\ninterface CheckResult {\n label: string;\n state: \"ok\" | \"warn\" | \"fail\";\n detail?: string;\n}\n\nexport async function doctorCommand(\n options: DoctorOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const color = resolveColor(options.color);\n const style: TextStyle = { color };\n const spinner = createSpinner(color);\n spinner.start(\"Running diagnostics…\");\n const results: CheckResult[] = [];\n const check = (label: string, state: \"ok\" | \"warn\" | \"fail\", detail?: string): void => {\n results.push({ label, state, detail });\n };\n\n try {\n check(\"Node.js runtime\", \"ok\", process.version);\n\n const packageJson = await findPackageJson(ctx.cwd);\n if (packageJson) {\n check(\"package.json\", \"ok\", path.relative(ctx.cwd, packageJson));\n } else {\n check(\"package.json\", \"fail\", \"not found in this directory or its parents\");\n }\n\n let context;\n try {\n const loaded = await loadConfig(ctx.cwd, options.config);\n check(\n \"ripple config\",\n \"ok\",\n loaded.configPath ? path.relative(ctx.cwd, loaded.configPath) : \"defaults\",\n );\n context = await loadProjectContext(ctx.cwd, options.config);\n } catch (error) {\n check(\"ripple config\", \"fail\", error instanceof Error ? error.message : String(error));\n renderResults(results, ctx, color);\n return ExitCode.InvalidConfig;\n }\n\n if (context.tsconfig) {\n check(\"tsconfig.json\", \"ok\", path.relative(ctx.cwd, context.tsconfig.path));\n } else {\n check(\"tsconfig.json\", \"warn\", \"not found — path aliases unavailable\");\n }\n\n const project = createTsProject();\n const filePaths = await discoverSourceFiles({\n rootDir: context.rootDir,\n include: context.config.include,\n ignore: context.config.ignore,\n });\n if (filePaths.length > 0) {\n check(\"source files\", \"ok\", `${filePaths.length} discovered`);\n } else {\n check(\"source files\", \"fail\", \"no source files matched the include globs\");\n }\n\n if (Object.keys(context.aliases).length > 0) {\n check(\"path aliases\", \"ok\", `${Object.keys(context.aliases).length} configured`);\n }\n\n const graph = buildGraph(project, filePaths, {\n rootDir: context.rootDir,\n aliases: context.aliases,\n fileKeys: new Set(filePaths.map((p) => pathKey(p, context.rootDir))),\n });\n\n const { stats } = graph;\n const parseRate = stats.files === 0 ? 1 : stats.parsed / stats.files;\n if (parseRate >= 0.99) {\n check(\"parse\", \"ok\", \"all files parsed cleanly\");\n } else if (parseRate >= 0.9) {\n check(\"parse\", \"warn\", `${stats.files - stats.parsed} file(s) failed to parse`);\n } else {\n check(\"parse\", \"fail\", `${stats.files - stats.parsed} file(s) failed to parse`);\n }\n\n if (stats.unresolvedEdges === 0) {\n check(\"import resolution\", \"ok\", \"all internal imports resolved\");\n } else {\n check(\"import resolution\", \"warn\", `${stats.unresolvedEdges} unresolved import(s)`);\n }\n\n if (stats.cycles === 0) {\n check(\"circular dependencies\", \"ok\", \"none found\");\n } else {\n check(\"circular dependencies\", \"warn\", `${stats.cycles} cycle group(s)`);\n }\n } finally {\n spinner.stop();\n }\n\n renderResults(results, ctx, color);\n const failed = results.some((check) => check.state === \"fail\");\n const warned = results.some((check) => check.state === \"warn\");\n const verdict = failed\n ? { icon: icon(\"cross\"), text: \"Diagnoses found problems.\", color: chalk.red }\n : warned\n ? { icon: icon(\"warning\"), text: \"Diagnoses passed with warnings.\", color: chalk.yellow }\n : { icon: icon(\"tick\"), text: \"All checks passed.\", color: chalk.green };\n const verdictIcon = style.color ? verdict.color(verdict.icon) : verdict.icon;\n ctx.writer.writeLine(`${verdictIcon} ${verdict.text}`);\n return failed ? ExitCode.Failure : ExitCode.Success;\n}\n\nfunction renderResults(results: CheckResult[], ctx: CommandContext, color: boolean): void {\n const style: TextStyle = { color };\n ctx.writer.writeLine(brandHeader({ label: \"project health check\", version: ctx.version, style }));\n ctx.writer.writeLine();\n\n const width = Math.max(...results.map((check) => check.label.length));\n for (const check of results) {\n const stateIcon =\n check.state === \"ok\"\n ? icon(\"tick\")\n : check.state === \"warn\"\n ? icon(\"warning\")\n : icon(\"cross\");\n const colored =\n check.state === \"ok\" ? chalk.green : check.state === \"warn\" ? chalk.yellow : chalk.red;\n const mark = style.color ? colored(stateIcon) : stateIcon;\n const detail = check.detail ? ` ${dim(check.detail, style)}` : \"\";\n ctx.writer.writeLine(`${mark} ${check.label.padEnd(width)}${detail}`);\n }\n ctx.writer.writeLine();\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { icon } from \"../ui/icons.js\";\nimport { dim } from \"../formatter/text.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, InitOptions } from \"../types/cli.js\";\n\n/**\n * `ripple init`\n *\n * Writes a `ripple.config.json` with the built-in defaults next to the\n * current directory. Refuses to overwrite an existing file unless `--force`.\n */\n\nconst INIT_FILENAME = \"ripple.config.json\";\n\nexport async function initCommand(options: InitOptions, ctx: CommandContext): Promise<ExitCode> {\n const style = { color: resolveColor(options.color) };\n const target = path.join(ctx.cwd, INIT_FILENAME);\n\n try {\n await fs.access(target);\n if (!options.force) {\n const mark = style.color ? chalk.red(icon(\"cross\")) : icon(\"cross\");\n ctx.writer.writeLine(\n `${mark} ${INIT_FILENAME} already exists. Pass --force to overwrite it.`,\n );\n return ExitCode.Failure;\n }\n } catch {\n /* file does not exist — safe to create */\n }\n\n const payload = {\n ...DEFAULT_CONFIG,\n };\n\n try {\n await fs.writeFile(target, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n const mark = style.color ? chalk.green(icon(\"tick\")) : icon(\"tick\");\n ctx.writer.writeLine(`${mark} Wrote ${INIT_FILENAME}`);\n ctx.writer.writeLine(\n ` ${dim(\"Edit it to tune include globs, aliases and risk weights.\", style)}`,\n );\n return ExitCode.Success;\n } catch (error) {\n const mark = style.color ? chalk.red(icon(\"cross\")) : icon(\"cross\");\n ctx.writer.writeLine(\n `${mark} Could not write ${INIT_FILENAME}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return ExitCode.Failure;\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { ExitCode } from \"../types/cli.js\";\n\n/**\n * Git integration for `ripple diff`. All commands run in the project\n * directory and stay read-only — never modifies the working tree.\n */\n\nexport interface ChangedFiles {\n /** Human-readable base label, e.g. `origin/main`. */\n baseLabel: string;\n /** Repo-relative paths of changed files (tracked diffs + untracked). */\n files: string[];\n}\n\n/** Base refs tried in order when `--base` is not given. */\nconst DEFAULT_BASES = [\"origin/main\", \"main\", \"HEAD~1\"];\n\nfunction git(args: string[], cwd: string): string {\n return execFileSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n}\n\nfunction refExists(ref: string, cwd: string): boolean {\n try {\n const out = git([\"rev-parse\", \"--verify\", ref], cwd);\n return out.length > 0;\n } catch {\n return false;\n }\n}\n\n/** Resolve the base ref: the requested one, or the first default that exists. */\nexport function resolveBase(cwd: string, requested?: string): string {\n if (requested) {\n if (!refExists(requested, cwd)) {\n throw new RippleError(`Git ref not found: ${requested}`, ExitCode.NotFound);\n }\n return requested;\n }\n for (const candidate of DEFAULT_BASES) {\n if (refExists(candidate, cwd)) return candidate;\n }\n throw new RippleError(\n \"No git base ref found (tried origin/main, main, HEAD~1). Pass --base <ref> explicitly.\",\n ExitCode.NotFound,\n );\n}\n\n/**\n * Compute the changed file set: everything that differs from the base\n * (merged commits plus uncommitted edits) and any untracked files.\n */\nexport function changedFiles(cwd: string, base?: string): ChangedFiles {\n const baseLabel = resolveBase(cwd, base);\n let baseCommit = baseLabel;\n try {\n const mergeBase = git([\"merge-base\", baseLabel, \"HEAD\"], cwd);\n if (mergeBase) baseCommit = mergeBase;\n } catch {\n /* base may be HEAD or a single commit — use it directly */\n }\n\n const files = new Set<string>();\n const tracked = git([\"diff\", \"--name-only\", \"--diff-filter=ACMRT\", baseCommit], cwd);\n for (const line of tracked.split(\"\\n\")) {\n if (line.trim()) files.add(line.trim());\n }\n const untracked = git([\"ls-files\", \"--others\", \"--exclude-standard\"], cwd);\n for (const line of untracked.split(\"\\n\")) {\n if (line.trim()) files.add(line.trim());\n }\n\n return { baseLabel, files: [...files].sort() };\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport { loadProjectContext } from \"../config/loader.js\";\nimport { analyzeFile } from \"../analyzer/analyze.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { changedFiles } from \"../git/changed.js\";\nimport { brandHeader, sectionHeader } from \"../ui/brand.js\";\nimport { riskGauge } from \"../ui/gauge.js\";\nimport { icon } from \"../ui/icons.js\";\nimport {\n dim,\n formatDuration,\n pluralize,\n riskBadge,\n strong,\n type TextStyle,\n} from \"../formatter/text.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport { runPipeline } from \"./pipeline.js\";\nimport { displayPath, pathKey } from \"../utils/paths.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { CommandContext, DiffOptions, OutputWriter } from \"../types/cli.js\";\nimport type { DiffFileReport, DiffJsonReport, GateLevel } from \"../types/output.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * `ripple diff`\n *\n * Analyzes every changed file since a base git ref and gates the change set:\n * if any changed source file reaches the gate level (HIGH by default), the\n * command exits 1 so CI can block a merge; otherwise it exits 0.\n */\n\nconst LEVEL_INDEX: Record<RiskLevel, number> = { LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 3 };\n\nconst GATE_INDEX: Record<GateLevel, number> = { medium: 1, high: 2, critical: 3 };\n\nconst VERDICT_NOTE: Record<GateLevel, string> = {\n medium: \"no MEDIUM or worse\",\n high: \"no HIGH or CRITICAL\",\n critical: \"no CRITICAL\",\n};\n\nexport interface DiffCounts {\n low: number;\n medium: number;\n high: number;\n critical: number;\n}\n\nexport function countLevels(results: AnalysisResult[]): DiffCounts {\n const counts: DiffCounts = { low: 0, medium: 0, high: 0, critical: 0 };\n for (const result of results) {\n counts[result.risk.level.toLowerCase() as keyof DiffCounts] += 1;\n }\n return counts;\n}\n\n/** `2 HIGH · 1 CRITICAL` — counts for levels at or above the gate. */\nexport function riskySummary(counts: DiffCounts, gate: GateLevel): string {\n const gateIndex = GATE_INDEX[gate];\n const parts: string[] = [];\n if (LEVEL_INDEX.CRITICAL >= gateIndex && counts.critical > 0)\n parts.push(`${counts.critical} CRITICAL`);\n if (LEVEL_INDEX.HIGH >= gateIndex && counts.high > 0) parts.push(`${counts.high} HIGH`);\n if (LEVEL_INDEX.MEDIUM >= gateIndex && counts.medium > 0) parts.push(`${counts.medium} MEDIUM`);\n if (LEVEL_INDEX.LOW >= gateIndex && counts.low > 0) parts.push(`${counts.low} LOW`);\n return parts.length > 0 ? parts.join(\" · \") : \"none\";\n}\n\nexport async function diffCommand(options: DiffOptions, ctx: CommandContext): Promise<ExitCode> {\n const style: TextStyle = { color: resolveColor(options.color) };\n const tracker = createStageTracker(!options.json);\n const gate = options.gate ?? \"high\";\n const started = Date.now();\n\n tracker.next(\"Resolving git changes\");\n const changed = changedFiles(ctx.cwd, options.base);\n\n tracker.next(\"Analyzing changed files\");\n const context = await loadProjectContext(ctx.cwd, options.config);\n const { graph, entryPoints } = await runPipeline(context);\n\n const byRel = new Map<string, AnalysisResult>();\n const skipped: string[] = [];\n for (const rel of changed.files) {\n const abs = path.resolve(ctx.cwd, rel);\n const key = pathKey(abs, context.rootDir);\n if (!graph.nodes.has(key)) {\n skipped.push(rel);\n continue;\n }\n byRel.set(\n rel,\n analyzeFile({\n graph,\n context,\n entryPoints,\n targetKey: key,\n targetPath: abs,\n durationMs: 0,\n ...(options.depth !== undefined ? { maxDepth: options.depth } : {}),\n }),\n );\n }\n tracker.done();\n\n const results = [...byRel.values()].sort((a, b) => b.risk.score - a.risk.score);\n const counts = countLevels(results);\n const blocked = results.some((result) => LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate]);\n const durationMs = Date.now() - started;\n\n if (options.json) {\n ctx.writer.write(\n serializeJson(\n buildDiffJsonReport(\n changed.baseLabel,\n changed.files,\n byRel,\n gate,\n blocked,\n counts,\n durationMs,\n ctx.version,\n ),\n ),\n );\n return blocked ? ExitCode.Failure : ExitCode.Success;\n }\n\n renderDiffReport(\n {\n cwd: ctx.cwd,\n baseLabel: changed.baseLabel,\n files: changed.files,\n results,\n skipped,\n counts,\n gate,\n blocked,\n durationMs,\n style,\n },\n ctx.writer,\n );\n return blocked ? ExitCode.Failure : ExitCode.Success;\n}\n\nexport interface DiffRenderInput {\n /** Working directory used to relativize displayed paths. */\n cwd: string;\n baseLabel: string;\n files: string[];\n results: AnalysisResult[];\n skipped: string[];\n counts: DiffCounts;\n gate: GateLevel;\n blocked: boolean;\n durationMs: number;\n style: TextStyle;\n}\n\nexport function renderDiffReport(input: DiffRenderInput, writer: OutputWriter): void {\n const { cwd, baseLabel, files, results, skipped, counts, gate, blocked, durationMs, style } =\n input;\n\n writer.writeLine(brandHeader({ label: `diff vs ${baseLabel}`, style }));\n writer.writeLine();\n\n const rows: Array<[string, string]> = [\n [\"Changed\", pluralize(files.length, \"file\")],\n [\"Source\", pluralize(results.length, \"file\")],\n [\"Duration\", dim(formatDuration(durationMs), style)],\n ];\n const width = Math.max(...rows.map(([key]) => key.length));\n for (const [key, value] of rows) {\n writer.writeLine(`${key.padEnd(width)} ${value}`);\n }\n writer.writeLine();\n\n const mark = blocked ? icon(\"cross\") : icon(\"tick\");\n const color = blocked ? chalk.red : chalk.green;\n const markText = style.color ? color(mark) : mark;\n const verdict = blocked ? \"Gate blocked\" : \"Gate passed\";\n const verdictText = style.color ? color(strong(verdict, style)) : verdict;\n writer.writeLine(\n `${markText} ${verdictText} — ${riskySummary(counts, gate)} ${dim(`(${VERDICT_NOTE[gate]})`, style)}`,\n );\n writer.writeLine();\n\n writer.writeLine(sectionHeader(`Risk analysis (${results.length} files)`, style));\n for (const result of results) {\n const risky = LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate];\n const fileIcon = risky ? icon(\"cross\") : icon(\"tick\");\n const fileIconText = style.color\n ? risky\n ? chalk.red(fileIcon)\n : chalk.green(fileIcon)\n : fileIcon;\n const score = result.risk.score.toFixed(1);\n const gauge = riskGauge(result.risk.score, result.risk.level, style);\n const file = displayPath(result.targetPath, cwd);\n writer.writeLine(\n `${fileIconText} ${file} ${riskBadge(result.risk.level, style)} · ${score}/100${gauge ? ` ${gauge}` : \"\"}`,\n );\n }\n // skipped files\n for (const rel of skipped) {\n writer.writeLine(\n `${dim(icon(\"ellipsis\"), style)} ${dim(rel, style)} ${dim(\"(not a source file)\", style)}`,\n );\n }\n writer.writeLine();\n}\n\nexport function buildDiffJsonReport(\n baseLabel: string,\n changedFileNames: string[],\n byRel: Map<string, AnalysisResult>,\n gate: GateLevel,\n blocked: boolean,\n counts: DiffCounts,\n durationMs: number,\n version: string,\n): DiffJsonReport {\n const files: DiffFileReport[] = [];\n for (const rel of changedFileNames) {\n const result = byRel.get(rel);\n if (result) {\n files.push({\n file: rel,\n analyzed: true,\n risk: result.risk,\n affectedFiles: result.summary.affectedFiles,\n targetInCycle: result.targetInCycle,\n });\n } else {\n files.push({ file: rel, analyzed: false });\n }\n }\n files.sort((a, b) => (b.risk?.score ?? -1) - (a.risk?.score ?? -1));\n\n return {\n tool: \"ripple\",\n version,\n command: \"diff\",\n base: baseLabel,\n changedFiles: changedFileNames.length,\n files,\n gate: { level: gate, blocked, counts },\n durationMs,\n };\n}\n","import { Command, CommanderError } from \"commander\";\nimport { analyzeCommand } from \"../commands/analyze.js\";\nimport { graphCommand } from \"../commands/graph.js\";\nimport { doctorCommand } from \"../commands/doctor.js\";\nimport { initCommand } from \"../commands/init.js\";\nimport { diffCommand } from \"../commands/diff.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, ExitCode as ExitCodeType } from \"../types/cli.js\";\n\n/**\n * CLI program definition. `run()` returns the process exit code instead of\n * calling `process.exit`, which keeps the CLI integration-testable.\n */\n\nconst PROGRAM_NAME = \"ripple\";\n\nexport function createProgram(ctx: CommandContext): Command {\n const program = new Command()\n .name(PROGRAM_NAME)\n .description(\"Dependency impact analysis for TypeScript and JavaScript projects.\")\n .version(ctx.version, \"-V, --version\", \"print the Ripple version\")\n .showHelpAfterError();\n\n program\n .command(\"analyze <file>\")\n .description(\"Analyze the impact of changing a file\")\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\"-v, --verbose\", \"include the risk factor breakdown\")\n .option(\"-d, --depth <number>\", \"cap the reverse traversal depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (file: string, options: Record<string, unknown>) => {\n const exitCode = await analyzeCommand(\n file,\n {\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"graph [file]\")\n .description(\"Show project graph stats, or the dependency tree of one file\")\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\"-v, --verbose\", \"include extra sections\")\n .option(\"-r, --reverse\", \"show dependents (what imports the file) instead of dependants\")\n .option(\"-d, --depth <number>\", \"cap the tree depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (file: string | undefined, options: Record<string, unknown>) => {\n const exitCode = await graphCommand(\n file,\n {\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n reverse: Boolean(options.reverse),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"diff\")\n .description(\"Analyze changed files since a base ref and gate risky changes\")\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\"-v, --verbose\", \"include extra sections\")\n .option(\"-b, --base <ref>\", \"git ref to diff against (default: origin/main, main, HEAD~1)\")\n .option(\n \"-g, --gate <level>\",\n \"risk level that blocks the gate (medium | high | critical)\",\n parseGateLevel,\n )\n .option(\"-d, --depth <number>\", \"cap the reverse traversal depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await diffCommand(\n {\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n ...(options.base !== undefined ? { base: options.base as string } : {}),\n ...(options.gate !== undefined\n ? { gate: options.gate as \"medium\" | \"high\" | \"critical\" }\n : {}),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"doctor\")\n .description(\"Check the project and environment for Ripple readiness\")\n .option(\"-v, --verbose\", \"print detailed diagnostics\")\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await doctorCommand(\n {\n verbose: Boolean(options.verbose),\n config: options.config as string | undefined,\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"init\")\n .description(\"Create a ripple.config.json with the default settings\")\n .option(\"-f, --force\", \"overwrite an existing config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await initCommand(\n { force: Boolean(options.force), color: options.color as boolean | undefined },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"version\")\n .description(\"Print the Ripple version\")\n .action(() => {\n ctx.writer.writeLine(ctx.version);\n });\n\n program.addHelpText(\n \"beforeAll\",\n `ripple — dependency impact analysis for TypeScript and JavaScript\\n`,\n );\n\n return program;\n}\n\n/** Thrown internally to propagate a non-success exit code through commander. */\nclass ExitError extends Error {\n constructor(readonly exitCode: ExitCodeType) {\n super(`exit ${exitCode}`);\n this.name = \"ExitError\";\n }\n}\n\nfunction parsePositiveInt(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 1) {\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected a positive integer, got \"${value}\"`,\n );\n }\n return parsed;\n}\n\n/** Validate the `--gate` argument. */\nfunction parseGateLevel(value: string): \"medium\" | \"high\" | \"critical\" {\n if (value === \"medium\" || value === \"high\" || value === \"critical\") {\n return value;\n }\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected one of medium | high | critical, got \"${value}\"`,\n );\n}\n\n/** Print an error to the error stream. */\nfunction printError(error: unknown, ctx: CommandContext): void {\n if (error instanceof RippleError) {\n ctx.errorWriter.writeLine(`✖ ${error.message}`);\n if (error.hint) ctx.errorWriter.writeLine(` ${error.hint}`);\n return;\n }\n if (error instanceof Error) {\n ctx.errorWriter.writeLine(`✖ ${error.message}`);\n return;\n }\n ctx.errorWriter.writeLine(`✖ ${String(error)}`);\n}\n\nexport interface RunOptions {\n argv: string[];\n ctx: CommandContext;\n}\n\n/** Parse arguments and run the CLI, returning the exit code. */\nexport async function run({ argv, ctx }: RunOptions): Promise<ExitCodeType> {\n const program = createProgram(ctx);\n program.exitOverride();\n\n try {\n await program.parseAsync(argv);\n return ExitCode.Success;\n } catch (error) {\n if (error instanceof ExitError) {\n return error.exitCode;\n }\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) return ExitCode.Success;\n return ExitCode.Failure;\n }\n printError(error, ctx);\n return error instanceof RippleError ? error.exitCode : ExitCode.Failure;\n }\n}\n","{\n \"name\": \"@alimaandev/ripple\",\n \"version\": \"0.3.0\",\n \"description\": \"Dependency impact analysis for TypeScript projects. Answers the question: what will break if I change this file?\",\n \"keywords\": [\n \"cli\",\n \"typescript\",\n \"dependencies\",\n \"impact-analysis\",\n \"refactoring\",\n \"risk\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Ali Sher <alishermaan0319@gmail.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/alimaandev/ripple.git\"\n },\n \"homepage\": \"https://github.com/alimaandev/ripple#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/alimaandev/ripple/issues\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"bin\": {\n \"ripple\": \"./dist/bin.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"pnpm@11.20.0\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"prepublishOnly\": \"pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build\"\n },\n \"dependencies\": {\n \"boxen\": \"^8.0.1\",\n \"chalk\": \"^6.0.0\",\n \"commander\": \"^15.0.0\",\n \"fast-glob\": \"^3.3.3\",\n \"figures\": \"^6.1.0\",\n \"jiti\": \"^2.7.0\",\n \"ora\": \"^9.4.1\",\n \"treeify\": \"^1.1.0\",\n \"ts-morph\": \"^28.0.0\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^10.0.1\",\n \"@types/node\": \"^26.1.2\",\n \"@types/treeify\": \"^1.0.3\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"eslint\": \"^10.8.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"prettier\": \"^3.9.6\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"^8.66.0\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","import { TerminalWriter } from \"../output/writer.js\";\nimport { run } from \"./program.js\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\n\n/**\n * Real CLI entry point. Keep this file thin — all logic lives in\n * `src/cli/program.ts` so the program stays integration-testable.\n */\n\nconst ctx = {\n writer: new TerminalWriter(),\n errorWriter: new TerminalWriter(process.stderr),\n cwd: process.cwd(),\n version: pkg.version,\n};\n\nconst exitCode = await run({ argv: process.argv, ctx });\nprocess.exitCode = exitCode;\n"]}
|