clean-slop 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/version.ts","../../src/config/loader.ts","../../src/parsers/source-parser.ts","../../src/utils/constants.ts","../../src/rules/engine.ts","../../src/utils/ast.ts","../../src/rules/ai-slop/empty-catch.ts","../../src/rules/ai-slop/todo-implementation.ts","../../src/rules/ai-slop/giant-function.ts","../../src/rules/ai-slop/excessive-nesting.ts","../../src/rules/ai-slop/fake-validation.ts","../../src/rules/ai-slop/high-complexity.ts","../../src/rules/ai-slop/dead-code.ts","../../src/rules/security/unsafe-eval.ts","../../src/rules/security/hardcoded-secrets.ts","../../src/rules/security/sql-injection.ts","../../src/rules/security/command-injection.ts","../../src/rules/security/path-traversal.ts","../../src/rules/security/prototype-pollution.ts","../../src/rules/security/weak-crypto.ts","../../src/rules/security/dangerous-cors.ts","../../src/rules/reliability/unhandled-promise.ts","../../src/rules/reliability/missing-await.ts","../../src/rules/reliability/infinite-loop.ts","../../src/rules/maintainability/giant-file.ts","../../src/rules/maintainability/circular-imports.ts","../../src/rules/production-readiness/no-console-log.ts","../../src/rules/production-readiness/no-localhost-urls.ts","../../src/rules/index.ts","../../src/scanners/scanner.ts","../../src/reporters/text-reporter.ts","../../src/reporters/json-reporter.ts","../../src/reporters/markdown-reporter.ts","../../src/reporters/sarif-reporter.ts","../../src/reporters/html-reporter.ts","../../src/reporters/index.ts","../../src/cli/commands/scan.ts","../../src/cli/commands/check.ts","../../src/cli/commands/watch.ts","../../src/cli/commands/doctor.ts","../../src/cli/commands/init.ts","../../src/cli/commands/report.ts","../../src/cli/index.ts"],"names":["path","rule","traverse","getLocation","MAX_LINES","fs","relPath","formatDuration","process"],"mappings":"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","file":"index.js","sourcesContent":["export const PACKAGE_VERSION = '1.0.0';\n","import { cosmiconfig } from 'cosmiconfig';\nimport path from 'path';\nimport type { ResolvedConfig, RuleCategory, Severity, UserConfig } from '../types.js';\nimport { PACKAGE_VERSION } from '../version.js';\n\nconst DEFAULT_INCLUDE = [\n '**/*.js',\n '**/*.jsx',\n '**/*.ts',\n '**/*.tsx',\n '**/*.mjs',\n '**/*.cjs',\n];\n\nconst DEFAULT_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.next/**',\n '**/coverage/**',\n '**/.turbo/**',\n '**/*.min.js',\n '**/*.bundle.js',\n '**/*.generated.*',\n '**/__generated__/**',\n];\n\nconst DEFAULT_IGNORE_PATTERNS: string[] = [];\n\nconst DEFAULT_CATEGORIES: Record<RuleCategory, boolean> = {\n 'ai-slop': true,\n 'security': true,\n 'reliability': true,\n 'maintainability': true,\n 'production-readiness': true,\n};\n\nconst DEFAULT_MAX_ISSUES: Partial<Record<Severity, number>> = {};\n\nfunction computeGrade(score: number): 'A' | 'B' | 'C' | 'D' | 'F' {\n if (score >= 90) return 'A';\n if (score >= 75) return 'B';\n if (score >= 60) return 'C';\n if (score >= 40) return 'D';\n return 'F';\n}\n\nexport { computeGrade };\n\nexport async function loadConfig(cwd: string, configPath?: string): Promise<ResolvedConfig> {\n const explorer = cosmiconfig('clean-slop', {\n searchPlaces: [\n 'clean-slop.config.js',\n 'clean-slop.config.ts',\n 'clean-slop.config.mjs',\n 'clean-slop.config.cjs',\n '.clean-slop.js',\n '.clean-slop.json',\n '.clean-slop.yaml',\n '.clean-slop.yml',\n 'package.json',\n ],\n packageProp: 'clean-slop',\n });\n\n let userConfig: UserConfig = {};\n\n try {\n const result = configPath\n ? await explorer.load(configPath)\n : await explorer.search(cwd);\n\n if (result && !result.isEmpty) {\n userConfig = result.config as UserConfig;\n }\n } catch {\n // No config found; proceed with defaults\n }\n\n return resolveConfig(userConfig, cwd);\n}\n\nexport function resolveConfig(userConfig: UserConfig, cwd: string): ResolvedConfig {\n return {\n root: path.resolve(cwd),\n version: PACKAGE_VERSION,\n include: userConfig.include ?? DEFAULT_INCLUDE,\n exclude: userConfig.exclude ?? DEFAULT_EXCLUDE,\n categories: {\n ...DEFAULT_CATEGORIES,\n ...userConfig.categories,\n },\n rules: userConfig.rules ?? {},\n failThreshold: userConfig.failThreshold ?? 70,\n maxIssues: {\n ...DEFAULT_MAX_ISSUES,\n ...userConfig.maxIssues,\n },\n plugins: userConfig.plugins ?? [],\n reporter: userConfig.reporter ?? 'text',\n output: userConfig.output ?? null,\n verbose: userConfig.verbose ?? false,\n ignorePatterns: userConfig.ignorePatterns ?? DEFAULT_IGNORE_PATTERNS,\n tsConfigPath: userConfig.tsConfigPath ?? null,\n };\n}\n\nexport function generateDefaultConfig(): string {\n return `/** @type {import('clean-slop').UserConfig} */\nexport default {\n // Files to include in scanning\n include: [\n '**/*.js',\n '**/*.jsx',\n '**/*.ts',\n '**/*.tsx',\n '**/*.mjs',\n '**/*.cjs',\n ],\n\n // Files to exclude from scanning\n exclude: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.next/**',\n '**/coverage/**',\n '**/*.min.js',\n '**/*.generated.*',\n '**/__generated__/**',\n ],\n\n // Enable or disable entire rule categories\n categories: {\n 'ai-slop': true,\n 'security': true,\n 'reliability': true,\n 'maintainability': true,\n 'production-readiness': true,\n },\n\n // Per-rule severity overrides or 'off' to disable\n rules: {\n // 'security/hardcoded-secrets': 'critical',\n // 'ai-slop/empty-catch': 'off',\n },\n\n // Minimum overall score before CI fails (0-100)\n failThreshold: 70,\n\n // Maximum allowed issues per severity\n maxIssues: {\n critical: 0,\n high: 5,\n },\n\n // Output reporter: 'text' | 'json' | 'html' | 'markdown' | 'sarif'\n reporter: 'text',\n\n // Output file path (null = stdout)\n // output: './reports/clean-slop-report.html',\n\n // Additional ignore patterns\n ignorePatterns: [],\n};\n`;\n}\n","import { parse } from '@typescript-eslint/typescript-estree';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport type { Language, ParsedFile } from '../types.js';\n\nexport class ParseError extends Error {\n constructor(\n message: string,\n public readonly filePath: string,\n public override readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'ParseError';\n }\n}\n\nfunction detectLanguage(filePath: string): Language {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case '.ts':\n return 'typescript';\n case '.tsx':\n return 'tsx';\n case '.jsx':\n return 'jsx';\n default:\n return 'javascript';\n }\n}\n\nfunction isTypeScriptLike(language: Language): boolean {\n return language === 'typescript' || language === 'tsx';\n}\n\nexport async function parseFile(filePath: string): Promise<ParsedFile> {\n const source = await fs.readFile(filePath, 'utf-8');\n return parseSource(filePath, source);\n}\n\nexport function parseSource(filePath: string, source: string): ParsedFile {\n const language = detectLanguage(filePath);\n\n try {\n const ast = parse(source, {\n jsx: language === 'jsx' || language === 'tsx',\n tsx: language === 'tsx',\n loc: true,\n range: true,\n comment: true,\n tokens: false,\n errorOnUnknownASTType: false,\n allowInvalidAST: true,\n suppressDeprecatedPropertyWarnings: true,\n });\n\n return { filePath, source, ast, language };\n } catch (err) {\n // Try again without TypeScript-specific syntax for JS files\n if (!isTypeScriptLike(language)) {\n try {\n const ast = parse(source, {\n jsx: language === 'jsx',\n loc: true,\n range: true,\n comment: true,\n tokens: false,\n errorOnUnknownASTType: false,\n allowInvalidAST: true,\n suppressDeprecatedPropertyWarnings: true,\n });\n return { filePath, source, ast, language };\n } catch {\n // Fall through to the original error\n }\n }\n\n const message =\n err instanceof Error\n ? err.message\n : 'Unknown parse error';\n\n throw new ParseError(\n `Failed to parse ${filePath}: ${message}`,\n filePath,\n err,\n );\n }\n}\n\nexport function extractSnippet(\n source: string,\n line: number,\n contextLines = 2,\n): string {\n const lines = source.split('\\n');\n const start = Math.max(0, line - 1 - contextLines);\n const end = Math.min(lines.length, line + contextLines);\n\n return lines\n .slice(start, end)\n .map((l, i) => {\n const lineNum = start + i + 1;\n const marker = lineNum === line ? '>' : ' ';\n return `${marker} ${String(lineNum).padStart(4, ' ')} | ${l}`;\n })\n .join('\\n');\n}\n","export const DOCS_BASE_URL = 'https://clean-slop.dev/docs';\nexport const PACKAGE_NAME = 'clean-slop';\n\nexport const SEVERITY_ORDER: Record<string, number> = {\n critical: 5,\n high: 4,\n medium: 3,\n low: 2,\n info: 1,\n};\n\nexport const SEVERITY_COLORS: Record<string, string> = {\n critical: '\\x1b[31m', // red\n high: '\\x1b[91m', // bright red\n medium: '\\x1b[33m', // yellow\n low: '\\x1b[36m', // cyan\n info: '\\x1b[37m', // gray\n};\n\nexport const RESET = '\\x1b[0m';\nexport const BOLD = '\\x1b[1m';\nexport const DIM = '\\x1b[2m';\nexport const GREEN = '\\x1b[32m';\nexport const YELLOW = '\\x1b[33m';\nexport const RED = '\\x1b[31m';\nexport const CYAN = '\\x1b[36m';\nexport const GRAY = '\\x1b[90m';\n","import type {\n Issue,\n ParsedFile,\n ResolvedConfig,\n Rule,\n RuleCategory,\n RuleContext,\n RuleSeverityOverride,\n Severity,\n} from '../types.js';\nimport { DOCS_BASE_URL } from '../utils/constants.js';\nimport { extractSnippet } from '../parsers/source-parser.js';\n\nexport class RuleEngine {\n private rules: Map<string, Rule> = new Map();\n\n register(rule: Rule): void {\n if (this.rules.has(rule.meta.id)) {\n throw new Error(`Rule \"${rule.meta.id}\" is already registered.`);\n }\n this.rules.set(rule.meta.id, rule);\n }\n\n registerAll(rules: Rule[]): void {\n for (const rule of rules) {\n this.register(rule);\n }\n }\n\n getRule(id: string): Rule | undefined {\n return this.rules.get(id);\n }\n\n getRules(): Rule[] {\n return Array.from(this.rules.values());\n }\n\n getRulesByCategory(category: RuleCategory): Rule[] {\n return this.getRules().filter((r) => r.meta.category === category);\n }\n\n runOnFile(parsedFile: ParsedFile, config: ResolvedConfig): Issue[] {\n const issues: Issue[] = [];\n\n for (const rule of this.rules.values()) {\n // Check category is enabled\n if (!config.categories[rule.meta.category]) continue;\n\n // Check rule-level override\n const ruleConfig = config.rules[rule.meta.id];\n const severityOverride = this.resolveSeverityOverride(ruleConfig);\n if (severityOverride === 'off') continue;\n\n const effectiveSeverity = severityOverride ?? rule.meta.severity;\n\n const ruleIssues: Issue[] = [];\n\n const context: RuleContext = {\n filePath: parsedFile.filePath,\n source: parsedFile.source,\n ast: parsedFile.ast,\n config,\n report(partial) {\n const snippet =\n partial.snippet ??\n extractSnippet(parsedFile.source, partial.location.line);\n\n ruleIssues.push({\n ruleId: rule.meta.id,\n ruleName: rule.meta.name,\n category: rule.meta.category,\n severity: effectiveSeverity,\n confidence: rule.meta.confidence,\n docsUrl: rule.meta.docsUrl ?? `${DOCS_BASE_URL}/rules/${rule.meta.id}`,\n snippet,\n ...partial,\n });\n },\n };\n\n try {\n rule.create(context);\n } catch {\n // Rule execution errors should not crash the scan\n }\n\n issues.push(...ruleIssues);\n }\n\n return issues;\n }\n\n private resolveSeverityOverride(\n ruleConfig: ResolvedConfig['rules'][string] | undefined,\n ): Severity | 'off' | null {\n if (ruleConfig === undefined) return null;\n\n if (typeof ruleConfig === 'string') {\n return ruleConfig as RuleSeverityOverride;\n }\n\n if (typeof ruleConfig === 'object' && ruleConfig !== null) {\n if ('severity' in ruleConfig && ruleConfig.severity) {\n return ruleConfig.severity as RuleSeverityOverride;\n }\n }\n\n return null;\n }\n}\n","/**\n * Lightweight AST traversal utilities that work with the\n * @typescript-eslint/typescript-estree AST format.\n */\n\nexport type ASTNode = Record<string, unknown> & {\n type: string;\n loc?: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n};\n\nexport type Visitor = {\n [nodeType: string]: (node: ASTNode) => void;\n};\n\n/**\n * Walk an AST depth-first, calling visitor handlers by node type.\n */\nexport function traverse(ast: unknown, visitor: Visitor): void {\n if (!ast || typeof ast !== 'object') return;\n\n const node = ast as ASTNode;\n\n if (typeof node.type === 'string') {\n const handler = visitor[node.type];\n if (handler) handler(node);\n\n const wildcard = visitor['*'];\n if (wildcard) wildcard(node);\n }\n\n for (const key of Object.keys(node)) {\n if (key === 'parent') continue;\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n traverse(item, visitor);\n }\n } else if (child && typeof child === 'object' && 'type' in (child as object)) {\n traverse(child, visitor);\n }\n }\n}\n\n/**\n * Collect all nodes of a given type from an AST subtree.\n */\nexport function findAll(ast: unknown, nodeType: string): ASTNode[] {\n const results: ASTNode[] = [];\n traverse(ast, {\n [nodeType](node) {\n results.push(node);\n },\n });\n return results;\n}\n\n/**\n * Find the first node of a given type.\n */\nexport function findFirst(ast: unknown, nodeType: string): ASTNode | null {\n for (const node of findAll(ast, nodeType)) {\n return node;\n }\n return null;\n}\n\n/**\n * Get the start location of a node, with safe fallback.\n */\nexport function getLocation(\n node: ASTNode,\n filePath: string,\n): { file: string; line: number; column: number } {\n return {\n file: filePath,\n line: node.loc?.start.line ?? 1,\n column: node.loc?.start.column ?? 0,\n };\n}\n\n/**\n * Get a string value from a node's property if it is a string literal.\n */\nexport function getStringValue(node: ASTNode | unknown): string | null {\n if (!node || typeof node !== 'object') return null;\n const n = node as ASTNode;\n if (n.type === 'Literal' && typeof n.value === 'string') return n.value;\n if (n.type === 'TemplateLiteral') {\n const quasis = n.quasis as ASTNode[] | undefined;\n if (quasis && quasis.length === 1) {\n const cooked = (quasis[0] as Record<string, unknown>)?.value as Record<string, unknown> | undefined;\n if (typeof cooked?.cooked === 'string') return cooked.cooked;\n }\n }\n return null;\n}\n\n/**\n * Get a callee name from a CallExpression node.\n */\nexport function getCalleeName(node: ASTNode): string | null {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return null;\n\n if (callee.type === 'Identifier') {\n return callee.name as string;\n }\n\n if (callee.type === 'MemberExpression') {\n const obj = callee.object as ASTNode | undefined;\n const prop = callee.property as ASTNode | undefined;\n if (obj && prop) {\n const objName = obj.name as string | undefined;\n const propName = prop.name as string | undefined;\n if (objName && propName) return `${objName}.${propName}`;\n }\n }\n\n return null;\n}\n\n/**\n * Check whether a node represents a function of any kind.\n */\nexport function isFunctionNode(node: ASTNode): boolean {\n return (\n node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression' ||\n node.type === 'ArrowFunctionExpression'\n );\n}\n\n/**\n * Count the number of statements inside a function body.\n */\nexport function countFunctionLines(node: ASTNode): number {\n if (!node.loc) return 0;\n return (node.loc.end.line - node.loc.start.line) + 1;\n}\n\n/**\n * Calculate cyclomatic complexity of a function node.\n * Counts: if, else if, case, ternary, &&, ||, ??, for, while, do, catch.\n */\nexport function cyclomaticComplexity(funcNode: ASTNode): number {\n let complexity = 1;\n\n traverse(funcNode, {\n IfStatement() { complexity++; },\n SwitchCase(node) {\n if (node.test !== null) complexity++;\n },\n ConditionalExpression() { complexity++; },\n LogicalExpression(node) {\n if (node.operator === '&&' || node.operator === '||' || node.operator === '??') {\n complexity++;\n }\n },\n ForStatement() { complexity++; },\n ForInStatement() { complexity++; },\n ForOfStatement() { complexity++; },\n WhileStatement() { complexity++; },\n DoWhileStatement() { complexity++; },\n CatchClause() { complexity++; },\n });\n\n return complexity;\n}\n\n/**\n * Get the maximum nesting depth of a function body.\n */\nexport function maxNestingDepth(ast: unknown, startDepth = 0): number {\n if (!ast || typeof ast !== 'object') return startDepth;\n const node = ast as ASTNode;\n\n const nestingTypes = new Set([\n 'IfStatement', 'ForStatement', 'ForInStatement', 'ForOfStatement',\n 'WhileStatement', 'DoWhileStatement', 'SwitchStatement', 'TryStatement',\n 'WithStatement',\n ]);\n\n let max = startDepth;\n\n const walk = (n: unknown, depth: number): void => {\n if (!n || typeof n !== 'object') return;\n const nn = n as ASTNode;\n\n const currentDepth = nestingTypes.has(nn.type) ? depth + 1 : depth;\n if (currentDepth > max) max = currentDepth;\n\n for (const key of Object.keys(nn)) {\n if (key === 'parent') continue;\n const child = nn[key];\n if (Array.isArray(child)) {\n for (const item of child) walk(item, currentDepth);\n } else if (child && typeof child === 'object' && 'type' in (child as object)) {\n walk(child, currentDepth);\n }\n }\n };\n\n walk(node, startDepth);\n return max;\n}\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/empty-catch',\n name: 'Empty Catch Block',\n category: 'ai-slop',\n severity: 'high',\n confidence: 'certain',\n description: 'Detects catch blocks that silently swallow errors.',\n rationale:\n 'Empty catch blocks are a hallmark of AI-generated code that handles the error path ' +\n 'syntactically but not semantically. They hide failures, making bugs invisible in production.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/empty-catch',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CatchClause(node: ASTNode) {\n const body = node.body as ASTNode | undefined;\n if (!body) return;\n\n const bodyNode = body as ASTNode & { body?: unknown[] };\n const statements = bodyNode.body ?? [];\n\n // A catch is empty if it has zero statements or only comments\n const hasStatements = statements.some((stmt: unknown) => {\n const s = stmt as ASTNode;\n // Allow if there is at least one non-comment statement\n return s.type !== 'EmptyStatement';\n });\n\n if (!hasStatements) {\n context.report({\n message: 'Catch block is empty and silently swallows errors.',\n explanation:\n 'This catch block catches exceptions but does nothing with them. ' +\n 'Errors are silently discarded, making it impossible to detect or diagnose failures.',\n impact:\n 'Silent error swallowing causes mysterious failures in production. ' +\n 'Debugging becomes extremely difficult because the exception trail disappears.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'At minimum, log the error. Consider re-throwing if the caller should know about the failure.',\n code: 'catch (err) {\\n console.error(\"Unexpected error:\", err);\\n // or: throw err;\\n}',\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst TODO_PATTERN = /\\b(TODO|FIXME|HACK|XXX|TEMP|TEMPORARY|PLACEHOLDER|NOT IMPLEMENTED|NOT_IMPLEMENTED)\\b/i;\nconst THROW_NOT_IMPLEMENTED = /not.?implemented|to.?do|todo/i;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/todo-implementation',\n name: 'TODO / Placeholder Implementation',\n category: 'ai-slop',\n severity: 'high',\n confidence: 'high',\n description: 'Detects TODO comments, placeholder implementations, and unfinished code.',\n rationale:\n 'AI code generators frequently produce functions with TODO bodies, placeholder returns, ' +\n 'or throw new Error(\"Not implemented\"). These skeletons look complete but break at runtime.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/todo-implementation',\n fixable: false,\n },\n\n create(context) {\n // Scan comments embedded in the AST\n const astWithComments = context.ast as { comments?: ASTNode[] };\n const comments: ASTNode[] = astWithComments.comments ?? [];\n\n for (const comment of comments) {\n const value = (comment.value as string | undefined) ?? '';\n if (TODO_PATTERN.test(value)) {\n context.report({\n message: `${comment.type === 'Line' ? '//' : '/*'} comment contains TODO/FIXME marker.`,\n explanation:\n 'This comment indicates unfinished work. In production builds, TODO markers ' +\n 'represent missing functionality that was never implemented.',\n impact:\n 'Incomplete implementations cause runtime failures, data corruption, or silent no-ops ' +\n 'when the unfinished code path is reached.',\n location: getLocation(comment, context.filePath),\n fix: {\n description: 'Implement the described functionality or create a tracked issue and remove the inline marker.',\n },\n });\n }\n }\n\n // Detect `throw new Error(\"Not implemented\")` patterns\n traverse(context.ast, {\n ThrowStatement(node: ASTNode) {\n const argument = node.argument as ASTNode | undefined;\n if (!argument) return;\n\n if (\n argument.type === 'NewExpression' ||\n argument.type === 'CallExpression'\n ) {\n const callee = argument.callee as ASTNode | undefined;\n if (!callee) return;\n\n const calleeName =\n callee.type === 'Identifier' ? (callee.name as string) : null;\n if (calleeName !== 'Error') return;\n\n const args = (argument.arguments as ASTNode[] | undefined) ?? [];\n if (args.length === 0) return;\n\n const firstArg = args[0] as ASTNode;\n const msgValue =\n firstArg.type === 'Literal' ? String(firstArg.value) : '';\n\n if (THROW_NOT_IMPLEMENTED.test(msgValue)) {\n context.report({\n message: `Placeholder implementation: throw new Error(\"${msgValue}\")`,\n explanation:\n 'This function throws \"Not implemented\" or a similar placeholder. ' +\n 'It was likely auto-generated and never completed.',\n impact:\n 'Calling this function in production causes an immediate unhandled exception.',\n location: getLocation(node, context.filePath),\n fix: {\n description: 'Implement the function body or remove it from the codebase.',\n },\n });\n }\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, countFunctionLines, isFunctionNode } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst MAX_LINES = 80;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/giant-function',\n name: 'Giant Function',\n category: 'ai-slop',\n severity: 'medium',\n confidence: 'certain',\n description: `Detects functions exceeding ${MAX_LINES} lines, a common sign of AI-generated monoliths.`,\n rationale:\n 'AI code generators tend to dump entire workflows into single functions without decomposing ' +\n 'them. Functions longer than 80 lines are difficult to understand, test, and maintain.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/giant-function',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n });\n\n function checkFunction(node: ASTNode): void {\n if (!isFunctionNode(node)) return;\n\n const lines = countFunctionLines(node);\n if (lines <= MAX_LINES) return;\n\n const idNode = node.id as ASTNode | undefined;\n const name = idNode ? String(idNode.name) : '<anonymous>';\n\n context.report({\n message: `Function \"${name}\" is ${lines} lines long (limit: ${MAX_LINES}).`,\n explanation:\n `This function is ${lines} lines long. Long functions are a strong indicator of ` +\n 'AI-generated code that placed all logic in one place without decomposition.',\n impact:\n 'Giant functions are untestable, unreadable, and violate the single-responsibility principle. ' +\n 'They make bug-fixing and code review slow and error-prone.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Break the function into smaller, focused functions. ' +\n 'Aim for functions under 40 lines that do one thing well.',\n },\n metadata: {\n lines,\n },\n });\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, maxNestingDepth, isFunctionNode } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst MAX_DEPTH = 4;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/excessive-nesting',\n name: 'Excessive Nesting',\n category: 'ai-slop',\n severity: 'medium',\n confidence: 'certain',\n description: `Detects functions with control-flow nesting deeper than ${MAX_DEPTH} levels.`,\n rationale:\n 'Deeply nested code is a strong sign of AI-generated logic that was not refactored. ' +\n 'Early returns, guard clauses, and extracted helper functions eliminate deep nesting.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/excessive-nesting',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n });\n\n function checkFunction(node: ASTNode): void {\n if (!isFunctionNode(node)) return;\n\n const depth = maxNestingDepth(node.body as unknown, 0);\n if (depth <= MAX_DEPTH) return;\n\n const idNode = node.id as ASTNode | undefined;\n const name = idNode ? String(idNode.name) : '<anonymous>';\n\n context.report({\n message: `Function \"${name}\" has nesting depth of ${depth} (limit: ${MAX_DEPTH}).`,\n explanation:\n `This function contains ${depth} levels of nested blocks. ` +\n 'Each additional level of nesting makes logic exponentially harder to follow.',\n impact:\n 'Deeply nested code is error-prone, difficult to test, and nearly impossible to review. ' +\n 'Bugs introduced in deep nesting often escape code review.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use early returns to flatten nesting. Extract deeply-nested logic into named helper functions. ' +\n 'Consider inversion of conditions to reduce if/else chains.',\n },\n metadata: { depth },\n });\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects validation functions that always return true or do nothing meaningful.\n *\n * Common AI-generated pattern:\n * function validateEmail(email) { return email.includes('@'); }\n * function isValid(data) { return true; }\n */\n\nconst VALIDATION_NAME_PATTERN =\n /^(validate|isValid|check|verify|sanitize|assert)/i;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/fake-validation',\n name: 'Fake Validation',\n category: 'ai-slop',\n severity: 'high',\n confidence: 'medium',\n description:\n 'Detects validation functions that trivially return true without meaningful checks.',\n rationale:\n 'AI code generators often produce validation functions with names that imply safety ' +\n 'but bodies that unconditionally approve all input. This creates a false sense of security.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/fake-validation',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n });\n\n function checkFunction(node: ASTNode): void {\n const idNode = (node.id ?? (node.parent as ASTNode | undefined)?.id) as ASTNode | undefined;\n\n let name: string | null = null;\n\n // Named function\n if (idNode?.type === 'Identifier') {\n name = String(idNode.name);\n }\n\n // Variable declarator: const validateX = () => ...\n const parent = node.parent as ASTNode | undefined;\n if (!name && parent?.type === 'VariableDeclarator') {\n const idPart = parent.id as ASTNode | undefined;\n if (idPart?.type === 'Identifier') {\n name = String(idPart.name);\n }\n }\n\n if (!name || !VALIDATION_NAME_PATTERN.test(name)) return;\n\n const body = node.body as ASTNode | undefined;\n if (!body) return;\n\n // Arrow function with expression body: const isValid = () => true\n if (body.type !== 'BlockStatement') {\n if (body.type === 'Literal' && body.value === true) {\n reportFakeValidation(node, name);\n }\n return;\n }\n\n const statements = (body as ASTNode & { body?: unknown[] }).body ?? [];\n\n // Single return true;\n if (statements.length === 1) {\n const stmt = statements[0] as ASTNode;\n if (stmt.type === 'ReturnStatement') {\n const arg = stmt.argument as ASTNode | undefined;\n if (arg?.type === 'Literal' && arg.value === true) {\n reportFakeValidation(node, name);\n }\n }\n }\n }\n\n function reportFakeValidation(node: ASTNode, name: string): void {\n context.report({\n message: `\"${name}\" appears to be a fake validation function that always returns true.`,\n explanation:\n `The function \"${name}\" has a name suggesting it performs validation, ` +\n 'but its body unconditionally returns true. All inputs will pass validation.',\n impact:\n 'Fake validation creates false security. Malicious or malformed input bypasses ' +\n 'what appears to be a safety check, potentially causing data corruption or security breaches.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Implement real validation logic that checks the input against expected constraints. ' +\n 'Use a validation library such as zod, joi, or yup for complex schemas.',\n },\n });\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, cyclomaticComplexity, isFunctionNode } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst COMPLEXITY_THRESHOLD = 10;\nconst COMPLEXITY_HIGH = 20;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/high-complexity',\n name: 'High Cyclomatic Complexity',\n category: 'ai-slop',\n severity: 'medium',\n confidence: 'certain',\n description: `Detects functions with cyclomatic complexity exceeding ${COMPLEXITY_THRESHOLD}.`,\n rationale:\n 'High complexity is a reliable indicator of AI-generated code that concatenated ' +\n 'multiple responsibilities into a single function. Complex functions are difficult to test ' +\n 'and almost impossible to reason about correctly.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/high-complexity',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n });\n\n function checkFunction(node: ASTNode): void {\n if (!isFunctionNode(node)) return;\n\n const complexity = cyclomaticComplexity(node);\n if (complexity <= COMPLEXITY_THRESHOLD) return;\n\n const idNode = node.id as ASTNode | undefined;\n const name = idNode ? String(idNode.name) : '<anonymous>';\n const isHigh = complexity >= COMPLEXITY_HIGH;\n\n context.report({\n message: `Function \"${name}\" has cyclomatic complexity of ${complexity} (limit: ${COMPLEXITY_THRESHOLD}).`,\n explanation:\n `Cyclomatic complexity measures the number of independent paths through code. ` +\n `A complexity of ${complexity} means this function has at least ${complexity} independent ` +\n 'execution paths that all need to be understood and tested.',\n impact:\n isHigh\n ? 'Extreme complexity. This function cannot be reliably tested or maintained. ' +\n 'Defects introduced here will be very difficult to locate.'\n : 'High complexity makes this function difficult to test thoroughly. ' +\n 'Each untested path is a potential production defect.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Extract independent logic branches into well-named helper functions. ' +\n 'Aim for functions with complexity under 5. Consider strategy or command patterns ' +\n 'for functions that switch on a type discriminant.',\n },\n metadata: { complexity },\n });\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { findAll, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/dead-code',\n name: 'Dead Code After Return',\n category: 'ai-slop',\n severity: 'medium',\n confidence: 'certain',\n description: 'Detects unreachable code that follows a return, throw, break, or continue statement.',\n rationale:\n 'Dead code after early exits is a common artifact of AI code generation. It indicates ' +\n 'that the generator added logic without tracking control flow, producing code that never executes.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/dead-code',\n fixable: true,\n },\n\n create(context) {\n const terminatingTypes = new Set([\n 'ReturnStatement',\n 'ThrowStatement',\n 'BreakStatement',\n 'ContinueStatement',\n ]);\n\n // Find all block statements\n const blocks = findAll(context.ast, 'BlockStatement');\n\n for (const block of blocks) {\n const statements = (block as ASTNode & { body?: ASTNode[] }).body ?? [];\n\n for (let i = 0; i < statements.length - 1; i++) {\n const stmt = statements[i];\n if (!stmt) continue;\n\n if (terminatingTypes.has(stmt.type)) {\n const nextStmt = statements[i + 1];\n if (!nextStmt) continue;\n\n // Don't flag the closing statement of an else chain\n if (nextStmt.type === 'IfStatement') continue;\n\n context.report({\n message: `Unreachable code after ${stmt.type}.`,\n explanation:\n `The statement at this line is unreachable because a ${stmt.type} on the previous line ` +\n 'will always exit this block before this code can execute.',\n impact:\n 'Dead code bloats the bundle, misleads maintainers, and indicates logic errors. ' +\n 'Code that was intended to run but is unreachable represents a latent bug.',\n location: getLocation(nextStmt, context.filePath),\n fix: {\n description:\n 'Remove the unreachable code. If it was intended to run, move it before the terminating statement.',\n },\n });\n\n // Only report the first occurrence per block to avoid noise\n break;\n }\n }\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, getCalleeName } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst DANGEROUS_EVAL_APIS = new Set([\n 'eval',\n 'Function',\n 'execScript',\n]);\n\nconst rule: Rule = {\n meta: {\n id: 'security/unsafe-eval',\n name: 'Unsafe eval / Function Constructor',\n category: 'security',\n severity: 'critical',\n confidence: 'high',\n description: 'Detects use of eval() and the Function constructor, which execute arbitrary code.',\n rationale:\n 'eval() and new Function() execute strings as JavaScript code. When any part of the ' +\n 'string comes from user input or external data, this is a code injection vulnerability.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/unsafe-eval',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n const name = getCalleeName(node);\n if (name && DANGEROUS_EVAL_APIS.has(name)) {\n context.report({\n message: `Unsafe use of ${name}().`,\n explanation:\n `${name}() evaluates its argument as JavaScript code at runtime. ` +\n 'If any part of the evaluated string is derived from external data, ' +\n 'an attacker can inject and execute arbitrary code.',\n impact:\n 'Code injection via eval is one of the highest-severity vulnerabilities in web applications. ' +\n 'It allows complete application compromise, data exfiltration, and remote code execution.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Replace eval() with explicit logic. ' +\n 'If you need to parse JSON, use JSON.parse(). ' +\n 'If you need dynamic behavior, use a lookup table or strategy pattern.',\n },\n });\n }\n },\n\n NewExpression(node: ASTNode) {\n const callee = node.callee as ASTNode | undefined;\n if (callee?.type === 'Identifier' && callee.name === 'Function') {\n context.report({\n message: 'Unsafe use of new Function() constructor.',\n explanation:\n 'new Function() constructs and executes JavaScript from a string at runtime. ' +\n 'This is functionally equivalent to eval() and shares the same injection risks.',\n impact:\n 'Allows arbitrary code execution if the string argument contains any external data. ' +\n 'Bypasses Content Security Policy directives and static analysis.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Eliminate the dynamic code construction. ' +\n 'Use explicit functions, closures, or a sandboxed evaluation library (e.g., vm2) ' +\n 'if dynamic execution is genuinely required.',\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\ninterface SecretPattern {\n name: string;\n pattern: RegExp;\n description: string;\n}\n\nconst SECRET_PATTERNS: SecretPattern[] = [\n {\n name: 'API Key',\n pattern: /(?:api[_-]?key|apikey)\\s*[:=]\\s*['\"][a-zA-Z0-9_-]{20,}['\"]/i,\n description: 'hardcoded API key',\n },\n {\n name: 'AWS Access Key',\n pattern: /AKIA[0-9A-Z]{16}/,\n description: 'AWS access key ID',\n },\n {\n name: 'AWS Secret',\n pattern: /aws[_-]?secret[_-]?(?:access[_-]?)?key\\s*[:=]\\s*['\"][^'\"]{20,}['\"]/i,\n description: 'AWS secret access key',\n },\n {\n name: 'Private Key',\n pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/,\n description: 'PEM private key',\n },\n {\n name: 'Password',\n pattern: /(?:password|passwd|pwd)\\s*[:=]\\s*['\"][^'\"]{4,}['\"]/i,\n description: 'hardcoded password',\n },\n {\n name: 'JWT Secret',\n pattern: /(?:jwt[_-]?secret|token[_-]?secret)\\s*[:=]\\s*['\"][^'\"]{8,}['\"]/i,\n description: 'hardcoded JWT signing secret',\n },\n {\n name: 'Database URL',\n pattern: /(?:mongo(?:db)?|postgres(?:ql)?|mysql|redis):\\/\\/[^:'\"]+:[^@'\"]+@/i,\n description: 'database connection string with credentials',\n },\n {\n name: 'Generic Secret',\n pattern: /(?:secret|token)\\s*[:=]\\s*['\"][a-zA-Z0-9+/=_-]{20,}['\"]/i,\n description: 'hardcoded secret or token',\n },\n {\n name: 'GitHub Token',\n pattern: /ghp_[a-zA-Z0-9]{36}/,\n description: 'GitHub personal access token',\n },\n {\n name: 'Stripe Key',\n pattern: /(?:sk|pk)_(?:live|test)_[a-zA-Z0-9]{24,}/,\n description: 'Stripe API key',\n },\n];\n\n// Strings that indicate the value is a placeholder, not a real secret\nconst PLACEHOLDER_PATTERNS = [\n /^(?:your[-_]?)?(?:api[-_]?)?(?:key|secret|token|password)$/i,\n /^<.+>$/,\n /^xxx/i,\n /^placeholder/i,\n /^\\*+$/,\n /^test$/i,\n /^example$/i,\n /^change[-_]?me/i,\n /process\\.env\\./,\n];\n\nfunction isPlaceholder(value: string): boolean {\n return PLACEHOLDER_PATTERNS.some((p) => p.test(value));\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/hardcoded-secrets',\n name: 'Hardcoded Secrets',\n category: 'security',\n severity: 'critical',\n confidence: 'high',\n description: 'Detects API keys, passwords, tokens, and secrets hardcoded in source files.',\n rationale:\n 'Hardcoded credentials are one of the most common causes of security breaches. ' +\n 'When code is committed to version control, credentials are permanently exposed ' +\n 'in history even if removed later.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/hardcoded-secrets',\n fixable: false,\n },\n\n create(context) {\n const lines = context.source.split('\\n');\n\n lines.forEach((line, index) => {\n for (const { name, pattern, description } of SECRET_PATTERNS) {\n if (!pattern.test(line)) continue;\n\n // Try to extract the value portion and check if it is a placeholder\n const valueMatch = line.match(/[:=]\\s*['\"]([^'\"]+)['\"]/);\n if (valueMatch && valueMatch[1] && isPlaceholder(valueMatch[1])) continue;\n\n context.report({\n message: `Possible hardcoded ${name} detected.`,\n explanation:\n `A potential ${description} was found hardcoded in source. ` +\n 'Credentials in source files are committed to version control and accessible to anyone ' +\n 'with repository access, including in private repositories through history and forks.',\n impact:\n 'Exposed credentials can be used to access cloud infrastructure, databases, and third-party services. ' +\n 'Even after removal, they remain in git history. Rotation is required immediately.',\n location: {\n file: context.filePath,\n line: index + 1,\n column: 0,\n },\n fix: {\n description:\n 'Remove the credential from source. Store secrets in environment variables (process.env.SECRET_NAME) ' +\n 'or a secrets manager (AWS Secrets Manager, HashiCorp Vault, Doppler). ' +\n 'Rotate the exposed credential immediately.',\n code: \"const apiKey = process.env.API_KEY;\\nif (!apiKey) throw new Error('API_KEY environment variable is required.');\",\n },\n });\n\n // One report per line is enough\n break;\n }\n });\n\n // Also check string literals in the AST for patterns that line-scanning might miss\n traverse(context.ast, {\n Literal(node: ASTNode) {\n if (typeof node.value !== 'string') return;\n const val: string = node.value;\n\n if (val.length < 20) return;\n if (isPlaceholder(val)) return;\n\n for (const { name, pattern, description } of SECRET_PATTERNS) {\n if (pattern.test(val)) {\n context.report({\n message: `String literal appears to be a hardcoded ${name}.`,\n explanation:\n `The string \"${val.slice(0, 8)}...\" matches a pattern for a ${description}. ` +\n 'Hardcoding credentials in string literals exposes them in source control.',\n impact:\n 'Immediate rotation of the credential is required. All historical commits ' +\n 'containing this value must be treated as compromised.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Replace with an environment variable reference: process.env.SECRET_NAME',\n },\n });\n break;\n }\n }\n },\n });\n\n function traverse(ast: unknown, visitor: Record<string, (n: ASTNode) => void>): void {\n if (!ast || typeof ast !== 'object') return;\n const node = ast as ASTNode;\n if (typeof node.type === 'string') {\n visitor[node.type]?.(node);\n }\n for (const key of Object.keys(node)) {\n if (key === 'parent') continue;\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) traverse(item, visitor);\n } else if (child && typeof child === 'object' && 'type' in (child as object)) {\n traverse(child, visitor);\n }\n }\n }\n\n function getLocation(node: ASTNode, filePath: string) {\n return {\n file: filePath,\n line: node.loc?.start.line ?? 1,\n column: node.loc?.start.column ?? 0,\n };\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects SQL injection vulnerabilities by looking for template literals or\n * string concatenation that embeds variables into SQL query strings.\n *\n * Patterns detected:\n * db.query(`SELECT * FROM users WHERE id = ${userId}`)\n * db.query(\"SELECT * FROM users WHERE id = \" + userId)\n * connection.execute(\"INSERT INTO \" + tableName + \" VALUES (?)\")\n */\n\nconst SQL_KEYWORDS = /\\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE|EXEC|EXECUTE|UNION|FROM|WHERE|JOIN)\\b/i;\n\nconst SQL_CALL_PATTERNS = [\n 'query', 'execute', 'exec', 'run', 'prepare', 'raw',\n 'db.query', 'db.execute', 'pool.query', 'connection.query',\n 'knex.raw', 'sequelize.query',\n];\n\nfunction looksLikeSqlCall(node: ASTNode): boolean {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return false;\n\n if (callee.type === 'Identifier') {\n return SQL_CALL_PATTERNS.includes(String(callee.name));\n }\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier') {\n return SQL_CALL_PATTERNS.some((p) => p.endsWith(`.${prop.name}`) || p === prop.name);\n }\n }\n\n return false;\n}\n\nfunction containsSqlKeywords(str: string): boolean {\n return SQL_KEYWORDS.test(str);\n}\n\nfunction getTemplateRawContent(node: ASTNode): string {\n const quasis = (node.quasis as ASTNode[] | undefined) ?? [];\n return quasis\n .map((q) => {\n const val = q.value as Record<string, unknown> | undefined;\n return String(val?.cooked ?? val?.raw ?? '');\n })\n .join('...');\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/sql-injection',\n name: 'SQL Injection',\n category: 'security',\n severity: 'critical',\n confidence: 'high',\n description:\n 'Detects SQL queries built with string concatenation or template literals containing variables.',\n rationale:\n 'SQL injection remains the most prevalent web application vulnerability. ' +\n 'Embedding JavaScript variables directly into SQL strings gives attackers control ' +\n 'over query structure.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/sql-injection',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n if (!looksLikeSqlCall(node)) return;\n\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const firstArg = args[0] as ASTNode | undefined;\n if (!firstArg) return;\n\n // Check template literal with expressions: `SELECT ... ${variable}`\n if (firstArg.type === 'TemplateLiteral') {\n const expressions = (firstArg.expressions as ASTNode[] | undefined) ?? [];\n if (expressions.length === 0) return;\n\n const rawContent = getTemplateRawContent(firstArg);\n if (!containsSqlKeywords(rawContent)) return;\n\n context.report({\n message: 'Possible SQL injection: template literal with expressions passed to query function.',\n explanation:\n 'This SQL query is built using a template literal that embeds JavaScript variables. ' +\n 'If any of the interpolated values derive from user input, an attacker can alter the ' +\n 'query structure by injecting SQL syntax.',\n impact:\n 'SQL injection can lead to unauthorized data access, data modification, ' +\n 'authentication bypass, and in some configurations, remote code execution on the database server.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use parameterized queries or prepared statements. ' +\n 'Pass user-controlled values as parameters, never as part of the SQL string.',\n code:\n '// Instead of:\\n' +\n '// db.query(`SELECT * FROM users WHERE id = ${userId}`)\\n\\n' +\n '// Use parameterized queries:\\n' +\n 'db.query(\"SELECT * FROM users WHERE id = ?\", [userId])',\n },\n });\n }\n\n // Check string concatenation: \"SELECT...\" + variable\n if (firstArg.type === 'BinaryExpression' && firstArg.operator === '+') {\n const leftStr = extractLeftmostString(firstArg);\n if (leftStr && containsSqlKeywords(leftStr)) {\n context.report({\n message: 'Possible SQL injection: string concatenation in SQL query.',\n explanation:\n 'This SQL query is constructed by concatenating strings and variables. ' +\n 'Variables injected into a SQL string allow attackers to manipulate the query.',\n impact:\n 'SQL injection can expose the entire database, bypass authentication, ' +\n 'and enable destructive operations (DROP TABLE, etc.).',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Replace string concatenation with parameterized queries. ' +\n 'Never construct SQL from variables.',\n code:\n 'db.query(\\n \"SELECT * FROM users WHERE name = ? AND role = ?\",\\n [userName, userRole]\\n)',\n },\n });\n }\n }\n },\n });\n\n function extractLeftmostString(node: ASTNode): string | null {\n if (node.type === 'Literal' && typeof node.value === 'string') {\n return node.value;\n }\n if (node.type === 'BinaryExpression' && node.operator === '+') {\n return extractLeftmostString(node.left as ASTNode);\n }\n return null;\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst DANGEROUS_CHILD_PROCESS = new Set([\n 'exec', 'execSync', 'spawn', 'spawnSync', 'execFile', 'execFileSync',\n]);\n\nfunction looksLikeChildProcessCall(node: ASTNode): boolean {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return false;\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier') {\n return DANGEROUS_CHILD_PROCESS.has(String(prop.name));\n }\n }\n\n if (callee.type === 'Identifier') {\n return DANGEROUS_CHILD_PROCESS.has(String(callee.name));\n }\n\n return false;\n}\n\nfunction firstArgIsDynamic(node: ASTNode): boolean {\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const first = args[0] as ASTNode | undefined;\n if (!first) return false;\n\n // Static strings are generally safe (though not always)\n if (first.type === 'Literal') return false;\n\n // Template literals with expressions are dangerous\n if (first.type === 'TemplateLiteral') {\n const expressions = (first.expressions as ASTNode[] | undefined) ?? [];\n return expressions.length > 0;\n }\n\n // Any other expression (variable, concatenation, function call) is suspicious\n return true;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/command-injection',\n name: 'Command Injection',\n category: 'security',\n severity: 'critical',\n confidence: 'high',\n description:\n 'Detects child_process calls that build shell commands from variables, enabling command injection.',\n rationale:\n 'Passing user-controlled data to exec(), spawn(), or similar APIs allows an attacker ' +\n 'to inject shell metacharacters that execute arbitrary system commands.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/command-injection',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n if (!looksLikeChildProcessCall(node)) return;\n if (!firstArgIsDynamic(node)) return;\n\n const callee = node.callee as ASTNode;\n const prop = (callee.type === 'MemberExpression'\n ? (callee.property as ASTNode).name\n : (callee as ASTNode).name) as string;\n\n context.report({\n message: `Possible command injection: dynamic argument passed to child_process.${prop}().`,\n explanation:\n `The first argument to ${prop}() appears to be dynamically constructed. ` +\n 'If any part of this argument derives from external input, an attacker can inject ' +\n 'shell metacharacters (e.g. ; rm -rf /) to execute arbitrary commands on the server.',\n impact:\n 'Command injection on a server results in full system compromise: data theft, ' +\n 'ransomware deployment, lateral movement, and persistent access.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use execFile() or spawn() with an argument array instead of exec() with a shell string. ' +\n 'Never pass user input to a shell command. Validate and whitelist all inputs.',\n code:\n \"// Dangerous:\\n// exec(`ls ${userInput}`)\\n\\n// Safe:\\nimport { execFile } from 'child_process';\\nexecFile('ls', [sanitizedPath], callback);\",\n },\n });\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst FS_WRITE_METHODS = new Set([\n 'readFile', 'readFileSync', 'writeFile', 'writeFileSync',\n 'readdir', 'readdirSync', 'createReadStream', 'createWriteStream',\n 'unlink', 'unlinkSync', 'stat', 'statSync', 'access', 'accessSync',\n 'open', 'openSync',\n]);\n\nfunction isFsCallWithDynamicPath(node: ASTNode): boolean {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return false;\n\n let methodName: string | null = null;\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier') methodName = String(prop.name);\n } else if (callee.type === 'Identifier') {\n methodName = String(callee.name);\n }\n\n if (!methodName || !FS_WRITE_METHODS.has(methodName)) return false;\n\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const first = args[0] as ASTNode | undefined;\n if (!first) return false;\n\n return first.type !== 'Literal';\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/path-traversal',\n name: 'Path Traversal',\n category: 'security',\n severity: 'critical',\n confidence: 'medium',\n description:\n 'Detects file system operations with dynamic paths that may allow path traversal attacks.',\n rationale:\n 'Path traversal occurs when an attacker uses \"../\" sequences in user-controlled input ' +\n 'to escape the intended directory and access arbitrary files.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/path-traversal',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n if (isFsCallWithDynamicPath(node)) {\n const callee = node.callee as ASTNode;\n const prop = callee.type === 'MemberExpression'\n ? String((callee.property as ASTNode).name)\n : String((callee as ASTNode).name);\n\n context.report({\n message: `Possible path traversal: dynamic path passed to fs.${prop}().`,\n explanation:\n `${prop}() is called with a non-literal path argument. ` +\n 'If this path is influenced by user input without sanitization, ' +\n 'an attacker can use \"../\" sequences to escape the intended directory.',\n impact:\n 'Successful path traversal allows reading sensitive system files (/etc/passwd, .env, ' +\n 'private keys), writing malicious content to arbitrary locations, or deleting critical files.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Resolve the path and verify it begins with the intended base directory before use.',\n code:\n \"import path from 'path';\\n\\nconst baseDir = path.resolve('./uploads');\\nconst safePath = path.resolve(baseDir, userInput);\\n\\nif (!safePath.startsWith(baseDir + path.sep)) {\\n throw new Error('Path traversal detected');\\n}\\n\\nfs.readFile(safePath, 'utf-8');\",\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects patterns that may allow prototype pollution:\n * obj[userInput] = value // bracket assignment with variable key\n * Object.assign(target, userInput) // merging untrusted object\n * _.merge(target, userInput) // lodash merge with untrusted object\n */\n\nconst MERGE_FUNCTIONS = new Set([\n 'Object.assign',\n '_.merge',\n '_.extend',\n '_.defaultsDeep',\n 'merge',\n 'deepMerge',\n 'deepExtend',\n]);\n\nfunction getFullCalleeName(node: ASTNode): string | null {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return null;\n\n if (callee.type === 'Identifier') return String(callee.name);\n\n if (callee.type === 'MemberExpression') {\n const obj = callee.object as ASTNode | undefined;\n const prop = callee.property as ASTNode | undefined;\n\n if (obj?.type === 'Identifier' && prop?.type === 'Identifier') {\n return `${obj.name}.${prop.name}`;\n }\n }\n\n return null;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/prototype-pollution',\n name: 'Prototype Pollution',\n category: 'security',\n severity: 'high',\n confidence: 'medium',\n description:\n 'Detects patterns that may allow attackers to pollute Object.prototype.',\n rationale:\n 'Prototype pollution allows an attacker to inject properties into Object.prototype, ' +\n 'affecting all objects in the application. This can bypass security checks, cause denial ' +\n 'of service, or enable remote code execution.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/prototype-pollution',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n // Detect: obj[variable] = value where variable could be __proto__\n AssignmentExpression(node: ASTNode) {\n const left = node.left as ASTNode | undefined;\n if (!left) return;\n\n if (left.type !== 'MemberExpression') return;\n if (!left.computed) return; // only bracket notation\n\n const prop = left.property as ASTNode | undefined;\n if (!prop) return;\n\n // Static string keys that are dangerous\n if (prop.type === 'Literal') {\n const key = String(prop.value);\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n context.report({\n message: `Assignment to dangerous property \"${key}\" may cause prototype pollution.`,\n explanation:\n `Assigning to obj[\"${key}\"] can modify Object.prototype when \"obj\" is a ` +\n 'user-controlled JSON payload or when the key is not validated.',\n impact:\n 'Prototype pollution can override security checks that compare against default values, ' +\n 'corrupt application state, and in some environments enable code execution.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Never assign to __proto__, constructor, or prototype from external input. ' +\n 'Validate object keys against an allowlist before assignment.',\n },\n });\n }\n } else {\n // Dynamic key - report as potential issue\n context.report({\n message: 'Dynamic bracket assignment may allow prototype pollution if key is not validated.',\n explanation:\n 'Writing to obj[dynamicKey] with an unvalidated key allows an attacker to set ' +\n '__proto__ or constructor, polluting Object.prototype for all objects.',\n impact:\n 'If the key comes from user-controlled input (query params, JSON body, headers), ' +\n 'this is an exploitable prototype pollution vulnerability.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Validate the key against an allowlist before assignment: ' +\n 'if (ALLOWED_KEYS.has(key)) obj[key] = value; ' +\n 'Or use Object.create(null) for dictionary objects.',\n },\n });\n }\n },\n\n // Detect Object.assign(target, untrustedSource) and lodash merge\n CallExpression(node: ASTNode) {\n const name = getFullCalleeName(node);\n if (!name || !MERGE_FUNCTIONS.has(name)) return;\n\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n if (args.length < 2) return;\n\n // The second argument is the source - if it comes from a variable (not a literal), flag it\n const source = args[1] as ASTNode;\n if (source.type !== 'ObjectExpression') {\n context.report({\n message: `${name}() with a non-literal source may introduce prototype pollution.`,\n explanation:\n `${name}() recursively copies properties from the source object. ` +\n 'If the source derives from user input and contains __proto__ or constructor keys, ' +\n \"it will pollute the target object's prototype chain.\",\n impact:\n 'All objects in the application share Object.prototype. Polluting it can ' +\n 'override security-relevant default values and cause widespread application misbehavior.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n `Sanitize the source before passing it to ${name}(). ` +\n 'Use a library like defu or structuredClone with property filtering, ' +\n 'or validate the source against a schema before merging.',\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst WEAK_HASH_ALGORITHMS = new Set(['md5', 'sha1', 'sha-1', 'md4', 'rc4', 'des', '3des']);\nconst WEAK_CIPHER_MODES = new Set(['ecb', 'cbc']); // ECB is never safe; CBC needs IV validation\n\nconst MATH_RANDOM_DESC =\n 'Math.random() is a pseudo-random number generator not suitable for cryptographic use.';\n\nconst rule: Rule = {\n meta: {\n id: 'security/weak-crypto',\n name: 'Weak Cryptography',\n category: 'security',\n severity: 'high',\n confidence: 'high',\n description:\n 'Detects use of weak or broken cryptographic algorithms (MD5, SHA1, ECB mode, Math.random).',\n rationale:\n 'MD5 and SHA1 are cryptographically broken. Using them for password hashing or data ' +\n 'integrity provides no real security. Math.random() is predictable and must not be used ' +\n 'for tokens, keys, or any security-sensitive value.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/weak-crypto',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return;\n\n // Math.random()\n if (\n callee.type === 'MemberExpression' &&\n (callee.object as ASTNode)?.type === 'Identifier' &&\n String((callee.object as ASTNode).name) === 'Math' &&\n (callee.property as ASTNode)?.type === 'Identifier' &&\n String((callee.property as ASTNode).name) === 'random'\n ) {\n context.report({\n message: 'Math.random() is not cryptographically secure.',\n explanation: MATH_RANDOM_DESC,\n impact:\n 'Using Math.random() for security tokens, session IDs, or passwords produces ' +\n 'predictable values that attackers can guess or enumerate.',\n location: getLocation(node, context.filePath),\n fix: {\n description: 'Use the Web Crypto API or Node.js crypto module for secure random values.',\n code:\n \"// Node.js:\\nimport { randomBytes } from 'crypto';\\nconst token = randomBytes(32).toString('hex');\\n\\n// Browser:\\nconst array = new Uint8Array(32);\\ncrypto.getRandomValues(array);\",\n },\n });\n }\n\n // crypto.createHash('md5') / crypto.createHash('sha1')\n if (\n callee.type === 'MemberExpression' &&\n (callee.property as ASTNode)?.type === 'Identifier' &&\n String((callee.property as ASTNode).name) === 'createHash'\n ) {\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const algoArg = args[0] as ASTNode | undefined;\n\n if (algoArg?.type === 'Literal') {\n const algo = String(algoArg.value).toLowerCase();\n if (WEAK_HASH_ALGORITHMS.has(algo)) {\n context.report({\n message: `Weak hash algorithm \"${algoArg.value}\" used in createHash().`,\n explanation:\n `${algoArg.value} is a broken hash algorithm. ` +\n 'It is vulnerable to collision attacks and should not be used for ' +\n 'data integrity checks, password hashing, or digital signatures.',\n impact:\n 'Broken hash algorithms allow attackers to forge hashes, bypass integrity checks, ' +\n 'and crack password hashes rapidly using precomputed tables.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n \"Replace with SHA-256 or SHA-3 for general hashing: crypto.createHash('sha256'). \" +\n 'For password hashing, use bcrypt, argon2, or scrypt instead of any raw hash.',\n },\n });\n }\n }\n }\n\n // crypto.createCipheriv with ECB or CBC mode\n if (\n callee.type === 'MemberExpression' &&\n (callee.property as ASTNode)?.type === 'Identifier' &&\n String((callee.property as ASTNode).name) === 'createCipheriv'\n ) {\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const algoArg = args[0] as ASTNode | undefined;\n\n if (algoArg?.type === 'Literal') {\n const algo = String(algoArg.value).toLowerCase();\n if ([...WEAK_CIPHER_MODES].some((m) => algo.includes(m))) {\n context.report({\n message: `Insecure cipher mode detected: \"${algoArg.value}\".`,\n explanation:\n `AES-ECB produces identical ciphertext for identical plaintext blocks, ` +\n 'revealing patterns in encrypted data. AES-CBC is also prone to padding oracle attacks.',\n impact:\n 'Insecure cipher modes can expose plaintext structure to passive observers ' +\n 'and may be fully decryptable by an active attacker.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n \"Use AES-GCM (Authenticated Encryption): crypto.createCipheriv('aes-256-gcm', key, iv). \" +\n 'Always use a unique IV per encryption operation.',\n },\n });\n }\n }\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nfunction getPropertyValue(props: ASTNode[], keyName: string): ASTNode | undefined {\n for (const prop of props) {\n if (prop.type !== 'Property') continue;\n const key = prop.key as ASTNode | undefined;\n const keyStr =\n key?.type === 'Identifier'\n ? String(key.name)\n : key?.type === 'Literal'\n ? String(key.value)\n : null;\n\n if (keyStr === keyName) {\n return prop.value as ASTNode | undefined;\n }\n }\n return undefined;\n}\n\nfunction getLiteralString(node: ASTNode | undefined): string | null {\n if (!node) return null;\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value;\n return null;\n}\n\nfunction getLiteralBool(node: ASTNode | undefined): boolean | null {\n if (!node) return null;\n if (node.type === 'Literal' && typeof node.value === 'boolean') return node.value;\n return null;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/dangerous-cors',\n name: 'Dangerous CORS / Cookie Configuration',\n category: 'security',\n severity: 'high',\n confidence: 'high',\n description:\n 'Detects wildcard CORS origins, insecure cookie settings, and overly permissive configurations.',\n rationale:\n 'CORS misconfiguration and insecure cookie attributes are among the most common ' +\n 'security mistakes in Node.js backends. They enable CSRF, session hijacking, and ' +\n 'cross-origin data leakage.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/dangerous-cors',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return;\n\n // cors({ origin: '*' }) or cors({ origin: true })\n const isCorsCall =\n (callee.type === 'Identifier' && String(callee.name) === 'cors') ||\n (callee.type === 'MemberExpression' &&\n String((callee.property as ASTNode).name) === 'cors');\n\n if (isCorsCall) {\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const configArg = args[0] as ASTNode | undefined;\n\n if (!configArg || configArg.type !== 'ObjectExpression') return;\n\n const props = (configArg.properties as ASTNode[] | undefined) ?? [];\n const originNode = getPropertyValue(props, 'origin');\n\n if (!originNode) return;\n\n const originStr = getLiteralString(originNode);\n const originBool = getLiteralBool(originNode);\n\n if (originStr === '*' || originBool === true) {\n context.report({\n message: `CORS configured with permissive origin: ${JSON.stringify(originStr ?? originBool)}.`,\n explanation:\n 'Setting CORS origin to \"*\" or true allows any website to make cross-origin ' +\n 'requests to this API. When combined with cookies or Authorization headers, ' +\n 'this enables cross-site request forgery (CSRF) attacks.',\n impact:\n 'Malicious websites can make authenticated requests on behalf of logged-in users, ' +\n 'read sensitive API responses, and exfiltrate data.',\n location: getLocation(originNode, context.filePath),\n fix: {\n description:\n 'Specify an explicit allowlist of trusted origins. Use an environment variable ' +\n 'to configure origins per deployment environment.',\n code:\n \"cors({\\n origin: process.env.ALLOWED_ORIGINS?.split(',') ?? [],\\n credentials: true,\\n})\",\n },\n });\n }\n }\n },\n\n ObjectExpression(node: ASTNode) {\n const props = (node.properties as ASTNode[] | undefined) ?? [];\n\n // Check for httpOnly: false on cookies\n const httpOnlyNode = getPropertyValue(props, 'httpOnly');\n if (httpOnlyNode && getLiteralBool(httpOnlyNode) === false) {\n context.report({\n message: 'Cookie configured with httpOnly: false.',\n explanation:\n 'Setting httpOnly: false makes cookies accessible to JavaScript via document.cookie. ' +\n 'This allows cross-site scripting (XSS) attacks to steal session cookies.',\n impact:\n 'A single XSS vulnerability in your application can lead to session hijacking ' +\n 'for all users if cookies are not protected with httpOnly.',\n location: getLocation(httpOnlyNode, context.filePath),\n fix: {\n description:\n 'Set httpOnly: true for all session and authentication cookies. ' +\n 'Never set httpOnly: false unless the cookie is explicitly intended for JavaScript access.',\n },\n });\n }\n\n // Check for secure: false on cookies\n const secureNode = getPropertyValue(props, 'secure');\n if (secureNode && getLiteralBool(secureNode) === false) {\n context.report({\n message: 'Cookie configured with secure: false.',\n explanation:\n 'Setting secure: false allows cookies to be transmitted over unencrypted HTTP connections. ' +\n 'This exposes session tokens to network interception.',\n impact:\n 'Cookies sent over HTTP can be captured by network observers, enabling session hijacking ' +\n 'and man-in-the-middle attacks.',\n location: getLocation(secureNode, context.filePath),\n fix: {\n description:\n 'Set secure: true for all session and authentication cookies. ' +\n 'Use a conditional based on NODE_ENV only in local development.',\n code: \"secure: process.env.NODE_ENV === 'production'\",\n },\n });\n }\n\n // Check for sameSite: 'none' without secure\n const sameSiteNode = getPropertyValue(props, 'sameSite');\n if (sameSiteNode && getLiteralString(sameSiteNode)?.toLowerCase() === 'none') {\n const secureValue = getPropertyValue(props, 'secure');\n if (!secureValue || getLiteralBool(secureValue) !== true) {\n context.report({\n message: \"Cookie has sameSite: 'none' without secure: true.\",\n explanation:\n \"sameSite: 'none' is required for cross-site cookies but is only valid when \" +\n 'combined with secure: true. Without it, the cookie is rejected by modern browsers.',\n impact:\n 'Cross-origin requests will fail in production because the browser will reject ' +\n \"the cookie. This may also enable CSRF if the application is served over HTTP.\",\n location: getLocation(sameSiteNode, context.filePath),\n fix: {\n description:\n \"Add secure: true when using sameSite: 'none'. Cross-site cookies require HTTPS.\",\n },\n });\n }\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects Promise-returning calls that are not awaited, .catch()'d, or returned.\n *\n * Common patterns:\n * someAsyncFn(); // fire-and-forget without handling rejection\n * fetch('/api/data'); // not awaited, not .catch()'d\n * Promise.all([...]); // result not used\n */\n\nconst KNOWN_ASYNC_APIS = new Set([\n 'fetch',\n 'axios',\n 'mongoose.connect',\n 'connect',\n 'disconnect',\n 'save',\n 'create',\n 'find',\n 'findOne',\n 'findById',\n 'update',\n 'updateOne',\n 'deleteOne',\n 'remove',\n 'sendMail',\n 'publish',\n 'subscribe',\n 'emit',\n 'send',\n 'write',\n 'close',\n 'end',\n 'open',\n 'connect',\n 'mkdir',\n 'unlink',\n 'copyFile',\n 'rename',\n 'readFile',\n 'writeFile',\n 'appendFile',\n]);\n\nfunction getCallName(node: ASTNode): string | null {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return null;\n\n if (callee.type === 'Identifier') return String(callee.name);\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier') return String(prop.name);\n }\n\n return null;\n}\n\nfunction isPromiseChained(node: ASTNode): boolean {\n // Check if the parent is a .then() or .catch() or .finally() call\n const parent = node.parent as ASTNode | undefined;\n if (!parent) return false;\n\n if (\n parent.type === 'MemberExpression' ||\n parent.type === 'CallExpression'\n ) {\n return true;\n }\n\n // Check if it's in an await expression\n if (parent.type === 'AwaitExpression') return true;\n\n // Check if it's in a return statement\n if (parent.type === 'ReturnStatement') return true;\n\n // Check if it's assigned\n if (parent.type === 'VariableDeclarator') return true;\n if (parent.type === 'AssignmentExpression') return true;\n\n return false;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'reliability/unhandled-promise',\n name: 'Unhandled Promise',\n category: 'reliability',\n severity: 'high',\n confidence: 'medium',\n description:\n 'Detects Promise-returning function calls that are not awaited, returned, or error-handled.',\n rationale:\n 'Unhandled Promise rejections crash Node.js processes in versions >= 15 and cause ' +\n 'silent failures in older versions. Fire-and-forget async calls hide errors that should ' +\n 'be surfaced to callers.',\n docsUrl: 'https://clean-slop.dev/docs/rules/reliability/unhandled-promise',\n fixable: false,\n },\n\n create(context) {\n // We look for ExpressionStatement → CallExpression where the call\n // is likely async but the result is not used.\n traverse(context.ast, {\n ExpressionStatement(node: ASTNode) {\n const expr = node.expression as ASTNode | undefined;\n if (!expr || expr.type !== 'CallExpression') return;\n\n const name = getCallName(expr);\n if (!name) return;\n\n if (!KNOWN_ASYNC_APIS.has(name)) return;\n\n // Check if it's inside an async context\n // We approximate: if expression is used standalone, it's fire-and-forget\n if (isPromiseChained(expr)) return;\n\n context.report({\n message: `Possible unhandled Promise: result of ${name}() is not awaited or handled.`,\n explanation:\n `${name}() likely returns a Promise, but the result is discarded. ` +\n 'If this Promise rejects, the error will be swallowed or crash the process.',\n impact:\n 'Unhandled rejections in production cause process crashes (Node.js >= 15) or ' +\n 'silent data loss. Operations you expect to complete may silently fail.',\n location: getLocation(expr, context.filePath),\n fix: {\n description:\n 'Await the Promise inside an async function, or add .catch() to handle rejection explicitly.',\n code:\n '// Option 1: await in an async function\\nawait someAsyncFn();\\n\\n// Option 2: explicit catch\\nsomeAsyncFn().catch((err) => {\\n logger.error(\"Operation failed:\", err);\\n});',\n },\n });\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects async functions that return a value without awaiting it,\n * or that call async functions without await inside them.\n *\n * Specifically looks for:\n * async function foo() { return fetch('/api'); } // should be: return await fetch(...)\n */\n\nfunction isAsyncFunction(node: ASTNode): boolean {\n return (\n node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression' ||\n node.type === 'ArrowFunctionExpression'\n ) && node.async === true;\n}\n\nconst LIKELY_ASYNC = new Set([\n 'fetch', 'readFile', 'writeFile', 'connect', 'query', 'execute',\n 'findOne', 'find', 'save', 'create', 'update', 'delete',\n 'sendMail', 'publish', 'subscribe',\n]);\n\nfunction looksAsync(node: ASTNode): boolean {\n if (node.type !== 'CallExpression') return false;\n\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return false;\n\n if (callee.type === 'Identifier' && LIKELY_ASYNC.has(String(callee.name))) return true;\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier' && LIKELY_ASYNC.has(String(prop.name))) return true;\n }\n\n return false;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'reliability/missing-await',\n name: 'Missing Await',\n category: 'reliability',\n severity: 'high',\n confidence: 'medium',\n description:\n 'Detects async functions that return un-awaited Promises or call async APIs without await.',\n rationale:\n 'Forgetting await is one of the most common async bugs in JavaScript. ' +\n 'The function appears to return a value but actually returns a Promise, ' +\n 'causing unexpected behavior in callers that expect a resolved value.',\n docsUrl: 'https://clean-slop.dev/docs/rules/reliability/missing-await',\n fixable: true,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkAsyncFn,\n FunctionExpression: checkAsyncFn,\n ArrowFunctionExpression: checkAsyncFn,\n });\n\n function checkAsyncFn(fn: ASTNode): void {\n if (!isAsyncFunction(fn)) return;\n\n const body = fn.body as ASTNode | undefined;\n if (!body) return;\n\n // Arrow function with expression body: async () => fetch(...)\n if (body.type !== 'BlockStatement') {\n if (looksAsync(body)) {\n context.report({\n message: 'Async arrow function returns a Promise without await.',\n explanation:\n 'The expression body of this async arrow function appears to return a Promise directly. ' +\n 'The outer async function wraps this in another Promise, which may not be what was intended.',\n impact:\n 'Callers awaiting this function will receive a resolved Promise<Promise<T>> rather than T. ' +\n 'This causes subtle type errors and may result in unhandled rejections.',\n location: getLocation(fn, context.filePath),\n fix: {\n description:\n 'Add await to the expression body: async () => await fetch(...)',\n code: 'const getData = async () => await fetch(\"/api/data\");',\n },\n });\n }\n return;\n }\n\n // Look for return statements that return un-awaited async calls\n const statements = (body as ASTNode & { body?: ASTNode[] }).body ?? [];\n\n for (const stmt of statements) {\n if (stmt.type !== 'ReturnStatement') continue;\n\n const returnArg = stmt.argument as ASTNode | undefined;\n if (!returnArg) continue;\n\n if (looksAsync(returnArg)) {\n context.report({\n message: 'Async function returns a Promise without await.',\n explanation:\n 'This async function returns a likely-async call without awaiting it. ' +\n 'While this compiles correctly, it loses error context and may cause confusing stack traces. ' +\n 'In try/catch blocks, the catch will not trigger for the returned Promise.',\n impact:\n 'In a try/catch block, exceptions from the returned Promise will not be caught ' +\n 'by the surrounding catch clause. This creates invisible error-handling gaps.',\n location: getLocation(stmt, context.filePath),\n fix: {\n description:\n 'Add await before the return value to ensure errors are caught properly.',\n code: 'return await someAsyncOperation();',\n },\n });\n }\n }\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, findAll } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects likely infinite loops:\n * while (true) { ... } without a break or return\n * for (;;) { ... } without a break or return\n * for loops with no termination condition\n */\n\nfunction hasExitStatement(body: ASTNode): boolean {\n const exits = findAll(body, 'BreakStatement');\n if (exits.length > 0) return true;\n\n const returns = findAll(body, 'ReturnStatement');\n if (returns.length > 0) return true;\n\n const throws = findAll(body, 'ThrowStatement');\n if (throws.length > 0) return true;\n\n return false;\n}\n\nfunction isLiteralTrue(node: ASTNode | null | undefined): boolean {\n if (!node) return false;\n return node.type === 'Literal' && node.value === true;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'reliability/infinite-loop',\n name: 'Potential Infinite Loop',\n category: 'reliability',\n severity: 'high',\n confidence: 'medium',\n description: 'Detects while(true) and for(;;) loops without reachable exit conditions.',\n rationale:\n 'Infinite loops without an exit condition hang server processes, exhaust CPU, ' +\n 'and cause denial of service. They are commonly introduced by AI-generated code ' +\n 'that models polling or retry logic incorrectly.',\n docsUrl: 'https://clean-slop.dev/docs/rules/reliability/infinite-loop',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n WhileStatement(node: ASTNode) {\n const test = node.test as ASTNode | undefined;\n if (!isLiteralTrue(test)) return;\n\n const body = node.body as ASTNode | undefined;\n if (!body) return;\n\n if (!hasExitStatement(body)) {\n context.report({\n message: 'while(true) loop with no break, return, or throw detected.',\n explanation:\n 'This while(true) loop has no reachable exit statement (break, return, or throw). ' +\n 'It will run indefinitely, blocking the event loop or hanging a thread.',\n impact:\n 'An infinite loop blocks the Node.js event loop, rendering the server completely ' +\n 'unresponsive. This is an exploitable denial-of-service condition.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Add an explicit exit condition or convert to a recursive function with a base case. ' +\n 'For polling, use setInterval() instead of an infinite loop.',\n },\n });\n }\n },\n\n ForStatement(node: ASTNode) {\n // for(;;) - no test expression\n const test = node.test as ASTNode | undefined | null;\n if (test !== null && test !== undefined) return;\n\n const body = node.body as ASTNode | undefined;\n if (!body) return;\n\n if (!hasExitStatement(body)) {\n context.report({\n message: 'for(;;) loop with no break, return, or throw detected.',\n explanation:\n 'This for(;;) loop has no termination condition and no exit statement. ' +\n 'It will run indefinitely.',\n impact:\n 'Blocks the Node.js event loop and causes complete server unresponsiveness.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Add a break condition or convert to a while loop with an explicit termination check.',\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\n\nconst MAX_LINES = 400;\nconst EXTREME_LINES = 1000;\n\nconst rule: Rule = {\n meta: {\n id: 'maintainability/giant-file',\n name: 'Giant File',\n category: 'maintainability',\n severity: 'medium',\n confidence: 'certain',\n description: `Detects source files exceeding ${MAX_LINES} lines.`,\n rationale:\n 'Large files concentrate unrelated logic, creating merge conflicts, slow code review, ' +\n 'and unclear ownership. They are a common artifact of AI code generation that did not ' +\n 'decompose responsibilities into modules.',\n docsUrl: 'https://clean-slop.dev/docs/rules/maintainability/giant-file',\n fixable: false,\n },\n\n create(context) {\n const lineCount = context.source.split('\\n').length;\n\n if (lineCount <= MAX_LINES) return;\n\n const isExtreme = lineCount > EXTREME_LINES;\n\n context.report({\n message: `File is ${lineCount} lines long (limit: ${MAX_LINES}).`,\n explanation:\n `This file contains ${lineCount} lines. Files this large violate the single-responsibility ` +\n 'principle and make it difficult for contributors to understand the module boundaries.',\n impact: isExtreme\n ? 'Extremely large files cause slow IDE performance, painful code reviews, and high ' +\n 'cognitive load. They are effectively unmaintainable.'\n : 'Large files slow code review and increase the chance that related changes land in ' +\n 'the wrong file, leading to tangled responsibility.',\n location: {\n file: context.filePath,\n line: 1,\n column: 0,\n },\n fix: {\n description:\n 'Split the file into focused modules. ' +\n 'Group related functions into a dedicated file. ' +\n 'A file should do one thing and export a cohesive set of related functionality.',\n },\n metadata: { lineCount },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { findAll } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\nimport path from 'path';\n\n/**\n * Single-file circular import detection.\n *\n * Full circular import detection requires a multi-file graph analysis phase.\n * This rule performs single-file analysis: it flags when a file imports from\n * a path that also appears as an export target (barrel imports that re-export\n * the importer), which is a common source of circular dependencies.\n */\n\nconst rule: Rule = {\n meta: {\n id: 'maintainability/circular-imports',\n name: 'Potential Circular Import',\n category: 'maintainability',\n severity: 'medium',\n confidence: 'low',\n description:\n 'Identifies import patterns that commonly cause circular dependency cycles.',\n rationale:\n 'Circular imports cause initialization order issues, undefined module exports at ' +\n 'runtime, and confusing bugs that differ between bundlers. They are a sign of ' +\n 'poor module boundary design.',\n docsUrl: 'https://clean-slop.dev/docs/rules/maintainability/circular-imports',\n fixable: false,\n },\n\n create(context) {\n const dir = path.dirname(context.filePath);\n const base = path.basename(context.filePath, path.extname(context.filePath));\n\n // Find all import declarations\n const imports = findAll(context.ast, 'ImportDeclaration');\n\n for (const imp of imports) {\n const src = imp.source as ASTNode | undefined;\n if (!src || src.type !== 'Literal') continue;\n\n const importPath = String(src.value);\n if (!importPath.startsWith('.')) continue;\n\n // Resolve the imported path\n const resolved = path.resolve(dir, importPath);\n const resolvedBase = path.basename(resolved);\n\n // Flag index imports from the same directory (classic barrel self-import)\n if (\n resolvedBase === 'index' &&\n path.dirname(resolved) === dir &&\n base !== 'index'\n ) {\n context.report({\n message: `Import from \"${importPath}\" may create a circular dependency.`,\n explanation:\n `This file imports from \"${importPath}\", which is the index barrel of the same directory. ` +\n 'If the index file re-exports this module, a circular dependency exists.',\n impact:\n 'Circular dependencies can cause modules to initialize with undefined exports, ' +\n 'leading to hard-to-debug runtime errors that only appear in specific import orders.',\n location: {\n file: context.filePath,\n line: imp.loc?.start.line ?? 1,\n column: imp.loc?.start.column ?? 0,\n },\n fix: {\n description:\n 'Import directly from the source module rather than through the barrel index. ' +\n \"Instead of `import { foo } from './index'`, use `import { foo } from './foo'`.\",\n },\n });\n }\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst DEBUG_METHODS = new Set([\n 'console.log',\n 'console.debug',\n 'console.dir',\n 'console.trace',\n 'console.table',\n]);\n\n// These are acceptable in production\nconst ALLOWED_CONSOLE = new Set([\n 'console.error',\n 'console.warn',\n 'console.info',\n]);\n\nconst rule: Rule = {\n meta: {\n id: 'production-readiness/no-console-log',\n name: 'Console Debug Statement',\n category: 'production-readiness',\n severity: 'low',\n confidence: 'certain',\n description:\n 'Detects console.log and other debug console methods left in production code.',\n rationale:\n 'Debug console statements leak internal application data, degrade performance, ' +\n 'and indicate code that was not reviewed before shipping.',\n docsUrl: 'https://clean-slop.dev/docs/rules/production-readiness/no-console-log',\n fixable: true,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n const callee = node.callee as ASTNode | undefined;\n if (!callee || callee.type !== 'MemberExpression') return;\n\n const obj = callee.object as ASTNode | undefined;\n const prop = callee.property as ASTNode | undefined;\n\n if (\n obj?.type !== 'Identifier' ||\n String(obj.name) !== 'console' ||\n prop?.type !== 'Identifier'\n ) {\n return;\n }\n\n const method = String(prop.name);\n const fullName = `console.${method}`;\n\n if (ALLOWED_CONSOLE.has(fullName)) return;\n\n if (DEBUG_METHODS.has(fullName)) {\n context.report({\n message: `${fullName}() should not be present in production code.`,\n explanation:\n `${fullName}() is a debug statement that was likely left over during development. ` +\n 'Console output pollutes server logs, leaks internal state, and can expose ' +\n 'sensitive data (tokens, user objects, query results) to log aggregation systems.',\n impact:\n 'Debug logs appearing in production obscure real errors, violate data handling ' +\n 'requirements, and may trigger compliance alerts for PII exposure.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Remove the console statement. For intentional logging, use a structured logger ' +\n '(pino, winston, bunyan) that supports log levels and structured output.',\n code:\n \"import pino from 'pino';\\n\\nconst logger = pino();\\nlogger.debug({ userId }, 'User lookup completed');\",\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst LOCALHOST_PATTERN = /https?:\\/\\/(?:localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0)(?::\\d+)?/i;\nconst DEBUG_FLAG_NAMES = /^(?:debug|DEBUG|isDebug|IS_DEBUG|debugMode|DEBUG_MODE|devMode|DEV_MODE|testMode|TEST_MODE)$/;\nconst MOCK_FUNCTION_NAMES = /^(?:mock|fake|stub|dummy|placeholder)[\\w_]*/i;\nconst TEST_CREDENTIAL_PATTERNS = [\n /test[_-]?(password|secret|token|key)/i,\n /password\\s*[:=]\\s*['\"](?:test|password|1234|admin|secret)['\"]/i,\n /secret\\s*[:=]\\s*['\"](?:test|secret|dev|development)['\"]/i,\n];\n\nconst rule: Rule = {\n meta: {\n id: 'production-readiness/no-localhost-urls',\n name: 'Localhost URL / Debug Flag / Mock Implementation',\n category: 'production-readiness',\n severity: 'medium',\n confidence: 'high',\n description:\n 'Detects hardcoded localhost URLs, debug flags set to true, and mock/stub implementations.',\n rationale:\n 'Localhost URLs, active debug flags, and mock implementations in source code are ' +\n 'telltale signs that development shortcuts were committed to production.',\n docsUrl: 'https://clean-slop.dev/docs/rules/production-readiness/no-localhost-urls',\n fixable: false,\n },\n\n create(context) {\n // Scan raw source for localhost URLs and test credentials (line-by-line)\n const lines = context.source.split('\\n');\n lines.forEach((line, index) => {\n if (LOCALHOST_PATTERN.test(line)) {\n context.report({\n message: 'Hardcoded localhost URL detected.',\n explanation:\n 'This line contains a localhost URL. In production, this will fail to connect ' +\n 'to the intended service because localhost resolves to the server itself.',\n impact:\n 'API calls to localhost in production silently fail or hit incorrect services, ' +\n 'causing user-facing errors and data integrity issues.',\n location: { file: context.filePath, line: index + 1, column: 0 },\n fix: {\n description:\n 'Replace with an environment variable: process.env.API_BASE_URL or similar.',\n code: \"const apiUrl = process.env.API_BASE_URL ?? 'https://api.yourdomain.com';\",\n },\n });\n }\n\n for (const pattern of TEST_CREDENTIAL_PATTERNS) {\n if (pattern.test(line)) {\n context.report({\n message: 'Test or placeholder credential detected.',\n explanation:\n 'This line appears to contain a test credential with an obvious value (e.g., \"password\", \"secret\"). ' +\n 'Test credentials committed to source indicate authentication logic that was never hardened.',\n impact:\n 'Test credentials in production allow unauthorized access. Obvious values like \"test\" or \"1234\" ' +\n 'are among the first tried in credential stuffing attacks.',\n location: { file: context.filePath, line: index + 1, column: 0 },\n fix: {\n description:\n 'Use environment variables for all credentials. Rotate any credential that has been committed.',\n },\n });\n break;\n }\n }\n });\n\n // AST-based checks\n traverse(context.ast, {\n // debug = true or DEBUG_MODE = true\n AssignmentExpression(node: ASTNode) {\n const left = node.left as ASTNode | undefined;\n const right = node.right as ASTNode | undefined;\n\n if (left?.type !== 'Identifier') return;\n if (!DEBUG_FLAG_NAMES.test(String(left.name))) return;\n if (right?.type !== 'Literal' || right.value !== true) return;\n\n context.report({\n message: `Debug flag \"${left.name}\" is set to true.`,\n explanation:\n `The variable \"${left.name}\" suggests a debug mode toggle that is hardcoded to true. ` +\n 'Debug mode typically enables verbose logging, disables security checks, and activates ' +\n 'development-only code paths.',\n impact:\n 'Active debug flags in production expose internal state, disable security controls, ' +\n 'and degrade performance through excessive logging.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Drive debug mode from an environment variable: const debug = process.env.DEBUG === \"true\";',\n },\n });\n },\n\n // Variable initializer: const debug = true\n VariableDeclarator(node: ASTNode) {\n const id = node.id as ASTNode | undefined;\n const init = node.init as ASTNode | undefined;\n\n if (id?.type !== 'Identifier') return;\n if (!DEBUG_FLAG_NAMES.test(String(id.name))) return;\n if (init?.type !== 'Literal' || init.value !== true) return;\n\n context.report({\n message: `Debug flag \"${id.name}\" initialized to true.`,\n explanation:\n `\"${id.name}\" is a debug flag initialized with true. ` +\n 'This likely enables a development-only code path.',\n impact:\n 'Debug mode active in production may disable security checks, ' +\n 'expose stack traces to end users, or generate excessive log output.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use an environment variable: const debug = process.env.NODE_ENV !== \"production\";',\n },\n });\n },\n\n // Function named mockX, fakeX, stubX\n FunctionDeclaration(node: ASTNode) {\n const id = node.id as ASTNode | undefined;\n if (!id || !MOCK_FUNCTION_NAMES.test(String(id.name))) return;\n\n context.report({\n message: `Function \"${id.name}\" appears to be a mock or stub implementation.`,\n explanation:\n `The name \"${id.name}\" suggests this is a placeholder implementation ` +\n 'that was never replaced with a real one.',\n impact:\n 'Mock implementations in production return fabricated data, bypassing real logic ' +\n 'and producing incorrect results for end users.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Implement the real function or remove it entirely. Mock functions belong in test files only.',\n },\n });\n },\n });\n\n function traverse(ast: unknown, visitor: Record<string, (n: ASTNode) => void>): void {\n if (!ast || typeof ast !== 'object') return;\n const node = ast as ASTNode;\n if (typeof node.type === 'string') visitor[node.type]?.(node);\n for (const key of Object.keys(node)) {\n if (key === 'parent') continue;\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) traverse(item, visitor);\n } else if (child && typeof child === 'object' && 'type' in (child as object)) {\n traverse(child, visitor);\n }\n }\n }\n\n function getLocation(node: ASTNode, filePath: string) {\n return { file: filePath, line: node.loc?.start.line ?? 1, column: node.loc?.start.column ?? 0 };\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../types.js';\n\n// AI Slop rules\nimport emptyCatch from './ai-slop/empty-catch.js';\nimport todoImplementation from './ai-slop/todo-implementation.js';\nimport giantFunction from './ai-slop/giant-function.js';\nimport excessiveNesting from './ai-slop/excessive-nesting.js';\nimport fakeValidation from './ai-slop/fake-validation.js';\nimport highComplexity from './ai-slop/high-complexity.js';\nimport deadCode from './ai-slop/dead-code.js';\n\n// Security rules\nimport unsafeEval from './security/unsafe-eval.js';\nimport hardcodedSecrets from './security/hardcoded-secrets.js';\nimport sqlInjection from './security/sql-injection.js';\nimport commandInjection from './security/command-injection.js';\nimport pathTraversal from './security/path-traversal.js';\nimport prototypePollution from './security/prototype-pollution.js';\nimport weakCrypto from './security/weak-crypto.js';\nimport dangerousCors from './security/dangerous-cors.js';\n\n// Reliability rules\nimport unhandledPromise from './reliability/unhandled-promise.js';\nimport missingAwait from './reliability/missing-await.js';\nimport infiniteLoop from './reliability/infinite-loop.js';\n\n// Maintainability rules\nimport giantFile from './maintainability/giant-file.js';\nimport circularImports from './maintainability/circular-imports.js';\n\n// Production readiness rules\nimport noConsoleLog from './production-readiness/no-console-log.js';\nimport noLocalhostUrls from './production-readiness/no-localhost-urls.js';\n\nexport const BUILT_IN_RULES: Rule[] = [\n // AI Slop\n emptyCatch,\n todoImplementation,\n giantFunction,\n excessiveNesting,\n fakeValidation,\n highComplexity,\n deadCode,\n\n // Security\n unsafeEval,\n hardcodedSecrets,\n sqlInjection,\n commandInjection,\n pathTraversal,\n prototypePollution,\n weakCrypto,\n dangerousCors,\n\n // Reliability\n unhandledPromise,\n missingAwait,\n infiniteLoop,\n\n // Maintainability\n giantFile,\n circularImports,\n\n // Production Readiness\n noConsoleLog,\n noLocalhostUrls,\n];\n\nexport { RuleEngine } from './engine.js';\n","import fg from 'fast-glob';\nimport ignore from 'ignore';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport isBinaryPath from 'is-binary-path';\nimport type {\n FileResult,\n Issue,\n ParsedFile,\n ResolvedConfig,\n RuleCategory,\n ScanResult,\n} from '../types.js';\nimport { ParseError, parseSource } from '../parsers/source-parser.js';\nimport { RuleEngine } from '../rules/engine.js';\nimport { BUILT_IN_RULES } from '../rules/index.js';\nimport { computeGrade } from '../config/loader.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { SEVERITY_ORDER } from '../utils/constants.js';\n\nexport interface ScanOptions {\n config: ResolvedConfig;\n onFile?: (filePath: string, index: number, total: number) => void;\n onIssue?: (issue: Issue) => void;\n}\n\nasync function loadGitignore(root: string): Promise<ReturnType<typeof ignore>> {\n const ig = ignore();\n\n const gitignorePath = path.join(root, '.gitignore');\n try {\n const content = await fs.readFile(gitignorePath, 'utf-8');\n ig.add(content);\n } catch {\n // No .gitignore found; that's fine\n }\n\n return ig;\n}\n\nexport async function discoverFiles(config: ResolvedConfig): Promise<string[]> {\n const files = await fg(config.include, {\n cwd: config.root,\n ignore: config.exclude,\n absolute: true,\n followSymbolicLinks: false,\n onlyFiles: true,\n });\n\n const ig = await loadGitignore(config.root);\n\n // Add user-specified ignore patterns\n if (config.ignorePatterns.length > 0) {\n ig.add(config.ignorePatterns);\n }\n\n return files.filter((f) => {\n if (isBinaryPath(f)) return false;\n\n const relative = path.relative(config.root, f);\n try {\n return !ig.ignores(relative);\n } catch {\n return true;\n }\n });\n}\n\nfunction buildEngine(_config: ResolvedConfig): RuleEngine {\n const engine = new RuleEngine();\n engine.registerAll(BUILT_IN_RULES);\n return engine;\n}\n\nfunction computeScore(issues: Issue[], config: ResolvedConfig) {\n const categories: RuleCategory[] = [\n 'ai-slop',\n 'security',\n 'reliability',\n 'maintainability',\n 'production-readiness',\n ];\n\n const categoryScores = categories.map((cat) => {\n const catIssues = issues.filter((i) => i.category === cat);\n\n // Weighted deduction per severity\n const deductions: Record<string, number> = {\n critical: 20,\n high: 10,\n medium: 4,\n low: 1,\n info: 0,\n };\n\n const totalDeduction = catIssues.reduce(\n (sum, i) => sum + (deductions[i.severity] ?? 0),\n 0,\n );\n\n const raw = Math.max(0, 100 - totalDeduction);\n\n return {\n category: cat,\n score: raw,\n issueCount: catIssues.length,\n criticalCount: catIssues.filter((i) => i.severity === 'critical').length,\n highCount: catIssues.filter((i) => i.severity === 'high').length,\n mediumCount: catIssues.filter((i) => i.severity === 'medium').length,\n lowCount: catIssues.filter((i) => i.severity === 'low').length,\n };\n });\n\n const overall =\n categoryScores.reduce((sum, c) => sum + c.score, 0) / categoryScores.length;\n\n const grade = computeGrade(overall);\n\n return {\n overall: Math.round(overall),\n categories: categoryScores,\n grade,\n productionReady: overall >= config.failThreshold && issues.filter((i) => i.severity === 'critical').length === 0,\n };\n}\n\nexport async function scan(options: ScanOptions): Promise<ScanResult> {\n const { config, onFile } = options;\n const startTime = Date.now();\n\n const engine = buildEngine(config);\n\n const files = await discoverFiles(config);\n const fileResults: FileResult[] = [];\n const allIssues: Issue[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const filePath = files[i];\n if (!filePath) continue;\n\n onFile?.(filePath, i, files.length);\n\n let parsed: ParsedFile;\n let source: string;\n\n try {\n source = await fs.readFile(filePath, 'utf-8');\n\n // Skip empty files\n if (!source.trim()) {\n fileResults.push({ file: filePath, issues: [], skipped: true, skipReason: 'empty file' });\n continue;\n }\n\n // Skip very large files (> 2MB)\n if (source.length > 2_000_000) {\n fileResults.push({ file: filePath, issues: [], skipped: true, skipReason: 'file too large' });\n continue;\n }\n\n parsed = parseSource(filePath, source);\n } catch (err) {\n const parseError = err instanceof ParseError ? err.message : String(err);\n fileResults.push({ file: filePath, issues: [], parseError });\n continue;\n }\n\n const issues = engine.runOnFile(parsed, config);\n\n // Respect per-severity maxIssues cap across entire scan\n // (we track totals and stop reporting once caps are hit — deferred to reporter layer)\n const sortedIssues = issues.sort((a, b) => {\n return (SEVERITY_ORDER[b.severity] ?? 0) - (SEVERITY_ORDER[a.severity] ?? 0);\n });\n\n fileResults.push({ file: filePath, issues: sortedIssues });\n allIssues.push(...sortedIssues);\n\n options.onIssue && sortedIssues.forEach(options.onIssue);\n }\n\n const score = computeScore(allIssues, config);\n\n return {\n root: config.root,\n timestamp: new Date().toISOString(),\n version: PACKAGE_VERSION,\n files: fileResults,\n issues: allIssues.sort(\n (a, b) => (SEVERITY_ORDER[b.severity] ?? 0) - (SEVERITY_ORDER[a.severity] ?? 0),\n ),\n score,\n durationMs: Date.now() - startTime,\n config,\n };\n}\n","import path from 'path';\nimport type { Issue, ScanResult, Severity } from '../types.js';\nimport {\n BOLD,\n CYAN,\n DIM,\n GRAY,\n GREEN,\n RED,\n RESET,\n SEVERITY_COLORS,\n YELLOW,\n} from '../utils/constants.js';\n\nfunction pad(str: string, width: number): string {\n return str.padEnd(width);\n}\n\nfunction formatSeverity(severity: Severity): string {\n const color = SEVERITY_COLORS[severity] ?? '';\n const label = severity.toUpperCase().padEnd(8);\n return `${color}${label}${RESET}`;\n}\n\nfunction formatScore(score: number): string {\n if (score >= 90) return `${GREEN}${score}${RESET}`;\n if (score >= 70) return `${YELLOW}${score}${RESET}`;\n return `${RED}${score}${RESET}`;\n}\n\nfunction formatGrade(grade: string): string {\n if (grade === 'A') return `${GREEN}${grade}${RESET}`;\n if (grade === 'B') return `${GREEN}${grade}${RESET}`;\n if (grade === 'C') return `${YELLOW}${grade}${RESET}`;\n if (grade === 'D') return `${YELLOW}${grade}${RESET}`;\n return `${RED}${grade}${RESET}`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\nfunction formatRelativePath(root: string, filePath: string): string {\n return path.relative(root, filePath);\n}\n\nfunction renderSeparator(char = '-', width = 80): string {\n return GRAY + char.repeat(width) + RESET;\n}\n\nfunction renderIssue(issue: Issue, root: string, verbose: boolean): string {\n const lines: string[] = [];\n\n const relPath = formatRelativePath(root, issue.location.file);\n const loc = `${relPath}:${issue.location.line}:${issue.location.column}`;\n\n lines.push(\n ` ${formatSeverity(issue.severity)} ${BOLD}${issue.message}${RESET}`,\n );\n lines.push(` ${DIM}${loc}${RESET} ${GRAY}[${issue.ruleId}]${RESET}`);\n\n if (verbose) {\n lines.push('');\n lines.push(` ${DIM}${issue.explanation}${RESET}`);\n\n if (issue.impact) {\n lines.push('');\n lines.push(` ${YELLOW}Impact:${RESET} ${issue.impact}`);\n }\n\n if (issue.snippet) {\n lines.push('');\n lines.push(\n issue.snippet\n .split('\\n')\n .map((l) => ` ${GRAY}${l}${RESET}`)\n .join('\\n'),\n );\n }\n\n if (issue.fix) {\n lines.push('');\n lines.push(` ${CYAN}Fix:${RESET} ${issue.fix.description}`);\n if (issue.fix.code) {\n lines.push('');\n lines.push(\n issue.fix.code\n .split('\\n')\n .map((l) => ` ${DIM}${l}${RESET}`)\n .join('\\n'),\n );\n }\n }\n\n if (issue.docsUrl) {\n lines.push('');\n lines.push(` ${DIM}${issue.docsUrl}${RESET}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function generateTextReport(result: ScanResult): string {\n const { score, issues, files, durationMs, config, root, version } = result;\n const verbose = config.verbose;\n const lines: string[] = [];\n\n // Header\n lines.push('');\n lines.push(`${BOLD}clean-slop v${version}${RESET} ${DIM}Production Readiness Engine${RESET}`);\n lines.push(renderSeparator('=', 80));\n lines.push('');\n\n // Files grouped by file path\n const fileGroups = new Map<string, Issue[]>();\n for (const issue of issues) {\n const key = issue.location.file;\n if (!fileGroups.has(key)) fileGroups.set(key, []);\n fileGroups.get(key)!.push(issue);\n }\n\n if (issues.length === 0) {\n lines.push(`${GREEN}No issues found.${RESET}`);\n } else {\n for (const [filePath, fileIssues] of fileGroups) {\n const relPath = formatRelativePath(root, filePath);\n lines.push(`${BOLD}${relPath}${RESET}`);\n lines.push(renderSeparator('-', 80));\n\n for (const issue of fileIssues) {\n lines.push(renderIssue(issue, root, verbose));\n lines.push('');\n }\n }\n }\n\n // Score card\n lines.push(renderSeparator('=', 80));\n lines.push(`${BOLD}Score Card${RESET}`);\n lines.push(renderSeparator('-', 80));\n\n for (const cat of score.categories) {\n const label = pad(cat.category, 24);\n const catScore = formatScore(cat.score);\n const counts = DIM +\n (cat.criticalCount > 0 ? ` ${cat.criticalCount} critical` : '') +\n (cat.highCount > 0 ? ` ${cat.highCount} high` : '') +\n (cat.mediumCount > 0 ? ` ${cat.mediumCount} medium` : '') +\n (cat.lowCount > 0 ? ` ${cat.lowCount} low` : '') +\n RESET;\n lines.push(` ${label} ${catScore}/100${counts}`);\n }\n\n lines.push('');\n lines.push(\n ` ${pad('Overall Score', 24)} ${formatScore(score.overall)}/100 Grade: ${formatGrade(score.grade)}`,\n );\n lines.push('');\n\n // Summary\n const criticalCount = issues.filter((i) => i.severity === 'critical').length;\n const highCount = issues.filter((i) => i.severity === 'high').length;\n const mediumCount = issues.filter((i) => i.severity === 'medium').length;\n const lowCount = issues.filter((i) => i.severity === 'low').length;\n\n lines.push(renderSeparator('-', 80));\n lines.push(\n ` ${issues.length} issue${issues.length !== 1 ? 's' : ''} found across ${files.filter((f) => !f.skipped && !f.parseError).length} files` +\n ` (${formatDuration(durationMs)})`,\n );\n\n if (criticalCount > 0) lines.push(` ${RED}${criticalCount} critical${RESET}`);\n if (highCount > 0) lines.push(` ${YELLOW}${highCount} high${RESET}`);\n if (mediumCount > 0) lines.push(` ${YELLOW}${mediumCount} medium${RESET}`);\n if (lowCount > 0) lines.push(` ${DIM}${lowCount} low${RESET}`);\n\n lines.push('');\n\n if (score.productionReady) {\n lines.push(` ${GREEN}PRODUCTION READY${RESET} Score above threshold (${config.failThreshold})`);\n } else {\n lines.push(\n ` ${RED}NOT PRODUCTION READY${RESET} Score ${score.overall} below threshold (${config.failThreshold})`,\n );\n }\n\n lines.push('');\n\n const parseErrors = files.filter((f) => f.parseError);\n if (parseErrors.length > 0) {\n lines.push(`${YELLOW}Parse errors in ${parseErrors.length} file(s):${RESET}`);\n for (const f of parseErrors) {\n lines.push(` ${DIM}${f.file}: ${f.parseError}${RESET}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { ScanResult } from '../types.js';\n\nexport function generateJsonReport(result: ScanResult): string {\n return JSON.stringify(result, null, 2);\n}\n","import path from 'path';\nimport type { Issue, ScanResult, Severity } from '../types.js';\n\nconst SEVERITY_EMOJI: Record<Severity, string> = {\n critical: 'CRITICAL',\n high: 'HIGH',\n medium: 'MEDIUM',\n low: 'LOW',\n info: 'INFO',\n};\n\nfunction scoreBadge(score: number): string {\n const color = score >= 90 ? 'brightgreen' : score >= 70 ? 'yellow' : 'red';\n return `![score](https://img.shields.io/badge/score-${score}%2F100-${color})`;\n}\n\nfunction gradeBadge(grade: string): string {\n const color =\n grade === 'A' || grade === 'B' ? 'brightgreen' :\n grade === 'C' ? 'yellow' :\n 'red';\n return `![grade](https://img.shields.io/badge/grade-${grade}-${color})`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\nfunction relPath(root: string, filePath: string): string {\n return path.relative(root, filePath);\n}\n\nfunction renderIssueMd(issue: Issue, root: string): string {\n const lines: string[] = [];\n const loc = `${relPath(root, issue.location.file)}:${issue.location.line}`;\n\n lines.push(`#### ${SEVERITY_EMOJI[issue.severity]}: ${issue.message}`);\n lines.push('');\n lines.push(`- **Rule:** \\`${issue.ruleId}\\``);\n lines.push(`- **Location:** \\`${loc}\\``);\n lines.push(`- **Confidence:** ${issue.confidence}`);\n lines.push('');\n lines.push(issue.explanation);\n\n if (issue.impact) {\n lines.push('');\n lines.push(`**Impact:** ${issue.impact}`);\n }\n\n if (issue.snippet) {\n lines.push('');\n lines.push('```');\n lines.push(issue.snippet);\n lines.push('```');\n }\n\n if (issue.fix) {\n lines.push('');\n lines.push(`**Fix:** ${issue.fix.description}`);\n if (issue.fix.code) {\n lines.push('');\n lines.push('```javascript');\n lines.push(issue.fix.code);\n lines.push('```');\n }\n }\n\n if (issue.docsUrl) {\n lines.push('');\n lines.push(`[Documentation](${issue.docsUrl})`);\n }\n\n lines.push('');\n lines.push('---');\n\n return lines.join('\\n');\n}\n\nexport function generateMarkdownReport(result: ScanResult): string {\n const { score, issues, files, durationMs, config, root, version, timestamp } = result;\n const lines: string[] = [];\n\n // Header\n lines.push('# clean-slop Report');\n lines.push('');\n lines.push(`> Generated by clean-slop v${version} on ${new Date(timestamp).toUTCString()}`);\n lines.push('');\n\n // Score summary\n lines.push('## Score Summary');\n lines.push('');\n lines.push(`${scoreBadge(score.overall)} ${gradeBadge(score.grade)}`);\n lines.push('');\n lines.push('| Category | Score | Issues |');\n lines.push('|----------|-------|--------|');\n\n for (const cat of score.categories) {\n const emoji = cat.score >= 90 ? '✅' : cat.score >= 70 ? '⚠️' : '❌';\n lines.push(\n `| ${cat.category} | ${emoji} ${cat.score}/100 | ${cat.issueCount} |`,\n );\n }\n\n lines.push('');\n lines.push(`**Overall Score:** ${score.overall}/100 &nbsp; **Grade:** ${score.grade}`);\n lines.push('');\n\n const productionStatus = score.productionReady\n ? '✅ **PRODUCTION READY**'\n : '❌ **NOT PRODUCTION READY**';\n lines.push(productionStatus);\n lines.push('');\n\n // Severity breakdown\n const criticalIssues = issues.filter((i) => i.severity === 'critical');\n const highIssues = issues.filter((i) => i.severity === 'high');\n const mediumIssues = issues.filter((i) => i.severity === 'medium');\n const lowIssues = issues.filter((i) => i.severity === 'low');\n\n lines.push('## Issue Breakdown');\n lines.push('');\n lines.push(`| Severity | Count |`);\n lines.push(`|----------|-------|`);\n lines.push(`| Critical | ${criticalIssues.length} |`);\n lines.push(`| High | ${highIssues.length} |`);\n lines.push(`| Medium | ${mediumIssues.length} |`);\n lines.push(`| Low | ${lowIssues.length} |`);\n lines.push(`| **Total** | **${issues.length}** |`);\n lines.push('');\n\n // Critical issues first\n if (criticalIssues.length > 0) {\n lines.push('## Critical Issues');\n lines.push('');\n for (const issue of criticalIssues) {\n lines.push(renderIssueMd(issue, root));\n }\n }\n\n // High issues\n if (highIssues.length > 0) {\n lines.push('## High Severity Issues');\n lines.push('');\n for (const issue of highIssues) {\n lines.push(renderIssueMd(issue, root));\n }\n }\n\n // Medium issues\n if (mediumIssues.length > 0) {\n lines.push('<details>');\n lines.push('<summary>Medium Severity Issues</summary>');\n lines.push('');\n for (const issue of mediumIssues) {\n lines.push(renderIssueMd(issue, root));\n }\n lines.push('</details>');\n lines.push('');\n }\n\n // Low issues\n if (lowIssues.length > 0) {\n lines.push('<details>');\n lines.push('<summary>Low Severity Issues</summary>');\n lines.push('');\n for (const issue of lowIssues) {\n lines.push(renderIssueMd(issue, root));\n }\n lines.push('</details>');\n lines.push('');\n }\n\n // File stats\n lines.push('## Scan Statistics');\n lines.push('');\n lines.push(`- **Files scanned:** ${files.filter((f) => !f.skipped && !f.parseError).length}`);\n lines.push(`- **Files skipped:** ${files.filter((f) => f.skipped).length}`);\n lines.push(`- **Parse errors:** ${files.filter((f) => f.parseError).length}`);\n lines.push(`- **Duration:** ${formatDuration(durationMs)}`);\n lines.push(`- **Fail threshold:** ${config.failThreshold}/100`);\n lines.push('');\n\n const parseErrors = files.filter((f) => f.parseError);\n if (parseErrors.length > 0) {\n lines.push('### Parse Errors');\n lines.push('');\n for (const f of parseErrors) {\n lines.push(`- \\`${relPath(root, f.file)}\\`: ${f.parseError}`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n lines.push('*Generated by [clean-slop](https://github.com/clean-slop/clean-slop)*');\n\n return lines.join('\\n');\n}\n","import path from 'path';\nimport type { Issue, ScanResult, Severity } from '../types.js';\nimport { PACKAGE_VERSION } from '../version.js';\n\n/**\n * SARIF 2.1.0 reporter\n * https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html\n *\n * Compatible with:\n * - GitHub Code Scanning\n * - VS Code SARIF Viewer\n * - Azure DevOps\n */\n\ntype SarifLevel = 'error' | 'warning' | 'note' | 'none';\n\nfunction severityToSarifLevel(severity: Severity): SarifLevel {\n switch (severity) {\n case 'critical':\n case 'high':\n return 'error';\n case 'medium':\n return 'warning';\n case 'low':\n return 'note';\n case 'info':\n return 'none';\n }\n}\n\nfunction toSarifSecuritySeverity(severity: Severity): string {\n switch (severity) {\n case 'critical': return '9.5';\n case 'high': return '7.5';\n case 'medium': return '5.0';\n case 'low': return '2.5';\n case 'info': return '0.0';\n }\n}\n\nfunction fileUri(filePath: string): string {\n // Convert to file:// URI\n const normalized = filePath.replace(/\\\\/g, '/');\n return normalized.startsWith('/') ? `file://${normalized}` : `file:///${normalized}`;\n}\n\nexport function generateSarifReport(result: ScanResult): string {\n const { issues, root } = result;\n\n // Collect unique rules\n const ruleMap = new Map<string, Issue>();\n for (const issue of issues) {\n if (!ruleMap.has(issue.ruleId)) {\n ruleMap.set(issue.ruleId, issue);\n }\n }\n\n const sarifRules = Array.from(ruleMap.values()).map((issue) => ({\n id: issue.ruleId,\n name: issue.ruleName.replace(/\\s+/g, ''),\n shortDescription: {\n text: issue.message,\n },\n fullDescription: {\n text: issue.explanation,\n },\n help: {\n text: issue.fix?.description ?? 'See documentation for details.',\n markdown: issue.fix?.code\n ? `${issue.fix.description}\\n\\n\\`\\`\\`javascript\\n${issue.fix.code}\\n\\`\\`\\``\n : issue.fix?.description ?? 'See documentation for details.',\n },\n helpUri: issue.docsUrl ?? `https://clean-slop.dev/docs/rules/${issue.ruleId}`,\n properties: {\n tags: [issue.category],\n 'security-severity': toSarifSecuritySeverity(issue.severity),\n precision: issue.confidence === 'certain' ? 'very-high' : issue.confidence,\n 'problem.severity': issue.severity,\n },\n }));\n\n const sarifResults = issues.map((issue) => ({\n ruleId: issue.ruleId,\n level: severityToSarifLevel(issue.severity),\n message: {\n text: `${issue.message}\\n\\n${issue.explanation}${issue.impact ? `\\n\\nImpact: ${issue.impact}` : ''}`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: {\n uri: path.relative(root, issue.location.file).replace(/\\\\/g, '/'),\n uriBaseId: '%SRCROOT%',\n },\n region: {\n startLine: issue.location.line,\n startColumn: issue.location.column + 1,\n endLine: issue.location.endLine ?? issue.location.line,\n endColumn: (issue.location.endColumn ?? issue.location.column) + 1,\n },\n },\n },\n ],\n partialFingerprints: {\n primaryLocationLineHash: Buffer.from(\n `${issue.ruleId}:${issue.location.file}:${issue.location.line}`,\n ).toString('base64'),\n },\n properties: {\n confidence: issue.confidence,\n category: issue.category,\n },\n }));\n\n const sarif = {\n $schema: 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: 'clean-slop',\n version: PACKAGE_VERSION,\n informationUri: 'https://github.com/clean-slop/clean-slop',\n semanticVersion: PACKAGE_VERSION,\n rules: sarifRules,\n },\n },\n originalUriBaseIds: {\n '%SRCROOT%': {\n uri: fileUri(root) + '/',\n },\n },\n results: sarifResults,\n columnKind: 'utf16CodeUnits',\n },\n ],\n };\n\n return JSON.stringify(sarif, null, 2);\n}\n","import path from 'path';\nimport type { Issue, ScanResult, Severity } from '../types.js';\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nfunction severityColor(severity: Severity): string {\n switch (severity) {\n case 'critical': return '#dc2626';\n case 'high': return '#ea580c';\n case 'medium': return '#d97706';\n case 'low': return '#2563eb';\n case 'info': return '#6b7280';\n }\n}\n\nfunction scoreColor(score: number): string {\n if (score >= 90) return '#16a34a';\n if (score >= 70) return '#d97706';\n return '#dc2626';\n}\n\nfunction renderIssueCard(issue: Issue, root: string): string {\n const relPath = path.relative(root, issue.location.file).replace(/\\\\/g, '/');\n const color = severityColor(issue.severity);\n\n return `\n <div class=\"issue-card\" data-severity=\"${issue.severity}\" data-category=\"${issue.category}\">\n <div class=\"issue-header\">\n <span class=\"severity-badge\" style=\"background:${color}\">${issue.severity.toUpperCase()}</span>\n <span class=\"issue-rule\">${escapeHtml(issue.ruleId)}</span>\n <span class=\"issue-confidence\">${escapeHtml(issue.confidence)} confidence</span>\n </div>\n <div class=\"issue-message\">${escapeHtml(issue.message)}</div>\n <div class=\"issue-location\">${escapeHtml(relPath)}:${issue.location.line}</div>\n <div class=\"issue-explanation\">${escapeHtml(issue.explanation)}</div>\n ${issue.impact ? `<div class=\"issue-impact\"><strong>Impact:</strong> ${escapeHtml(issue.impact)}</div>` : ''}\n ${issue.snippet ? `<pre class=\"issue-snippet\"><code>${escapeHtml(issue.snippet)}</code></pre>` : ''}\n ${issue.fix ? `\n <div class=\"issue-fix\">\n <strong>Fix:</strong> ${escapeHtml(issue.fix.description)}\n ${issue.fix.code ? `<pre class=\"fix-code\"><code>${escapeHtml(issue.fix.code)}</code></pre>` : ''}\n </div>\n ` : ''}\n ${issue.docsUrl ? `<a class=\"docs-link\" href=\"${escapeHtml(issue.docsUrl)}\" target=\"_blank\" rel=\"noopener\">Documentation</a>` : ''}\n </div>`;\n}\n\nexport function generateHtmlReport(result: ScanResult): string {\n const { score, issues, files, durationMs, root, version, timestamp } = result;\n\n const criticalCount = issues.filter((i) => i.severity === 'critical').length;\n const highCount = issues.filter((i) => i.severity === 'high').length;\n const mediumCount = issues.filter((i) => i.severity === 'medium').length;\n const lowCount = issues.filter((i) => i.severity === 'low').length;\n const scannedCount = files.filter((f) => !f.skipped && !f.parseError).length;\n\n const issueCards = issues.map((i) => renderIssueCard(i, root)).join('\\n');\n\n const categoryRows = score.categories.map((cat) => {\n const color = scoreColor(cat.score);\n return `\n <tr>\n <td>${escapeHtml(cat.category)}</td>\n <td><span style=\"color:${color};font-weight:600\">${cat.score}/100</span></td>\n <td>${cat.issueCount}</td>\n <td>${cat.criticalCount}</td>\n <td>${cat.highCount}</td>\n <td>${cat.mediumCount}</td>\n <td>${cat.lowCount}</td>\n </tr>`;\n }).join('\\n');\n\n const durationStr = durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`;\n const overallColor = scoreColor(score.overall);\n const readyBg = score.productionReady ? '#16a34a' : '#dc2626';\n const readyText = score.productionReady ? 'PRODUCTION READY' : 'NOT PRODUCTION READY';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>clean-slop Report</title>\n <style>\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #0f172a; color: #e2e8f0; line-height: 1.6; }\n .container { max-width: 1200px; margin: 0 auto; padding: 2rem; }\n header { border-bottom: 1px solid #1e293b; padding-bottom: 2rem; margin-bottom: 2rem; }\n header h1 { font-size: 1.75rem; font-weight: 700; color: #f8fafc; letter-spacing: -0.025em; }\n header p { color: #64748b; margin-top: 0.25rem; font-size: 0.875rem; }\n .score-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; margin-bottom: 2rem; }\n .score-card { background: #1e293b; border: 1px solid #334155; border-radius: 8px; padding: 1.25rem; }\n .score-card .label { font-size: 0.75rem; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.05em; }\n .score-card .value { font-size: 2rem; font-weight: 700; margin-top: 0.25rem; }\n .ready-badge { display: inline-block; background: ${readyBg}; color: #fff; font-size: 0.8rem; font-weight: 600; padding: 0.35rem 0.9rem; border-radius: 9999px; margin-bottom: 2rem; letter-spacing: 0.05em; }\n table { width: 100%; border-collapse: collapse; background: #1e293b; border-radius: 8px; overflow: hidden; margin-bottom: 2rem; font-size: 0.875rem; }\n th { background: #0f172a; text-align: left; padding: 0.75rem 1rem; color: #94a3b8; font-weight: 500; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; }\n td { padding: 0.75rem 1rem; border-top: 1px solid #334155; }\n .filters { display: flex; gap: 0.5rem; flex-wrap: wrap; margin-bottom: 1.5rem; }\n .filter-btn { background: #1e293b; border: 1px solid #334155; color: #94a3b8; padding: 0.35rem 0.9rem; border-radius: 6px; cursor: pointer; font-size: 0.8rem; transition: all 0.15s; }\n .filter-btn:hover, .filter-btn.active { background: #334155; color: #f1f5f9; border-color: #475569; }\n .issue-card { background: #1e293b; border: 1px solid #334155; border-radius: 8px; padding: 1.25rem; margin-bottom: 1rem; }\n .issue-header { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; }\n .severity-badge { font-size: 0.7rem; font-weight: 700; color: #fff; padding: 0.2rem 0.6rem; border-radius: 4px; letter-spacing: 0.05em; }\n .issue-rule { font-family: monospace; font-size: 0.8rem; color: #64748b; }\n .issue-confidence { font-size: 0.75rem; color: #475569; margin-left: auto; }\n .issue-message { font-weight: 600; color: #f1f5f9; margin-bottom: 0.5rem; }\n .issue-location { font-family: monospace; font-size: 0.8rem; color: #64748b; margin-bottom: 0.75rem; }\n .issue-explanation { font-size: 0.875rem; color: #94a3b8; margin-bottom: 0.75rem; }\n .issue-impact { font-size: 0.875rem; color: #fbbf24; margin-bottom: 0.75rem; }\n .issue-snippet { background: #0f172a; border: 1px solid #334155; border-radius: 6px; padding: 1rem; margin-bottom: 0.75rem; overflow-x: auto; }\n .issue-snippet code, .fix-code code { font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.8rem; color: #94a3b8; white-space: pre; }\n .issue-fix { font-size: 0.875rem; color: #86efac; margin-bottom: 0.75rem; }\n .fix-code { background: #0f172a; border: 1px solid #334155; border-radius: 6px; padding: 1rem; margin-top: 0.5rem; overflow-x: auto; }\n .docs-link { font-size: 0.8rem; color: #60a5fa; text-decoration: none; }\n .docs-link:hover { text-decoration: underline; }\n .section-title { font-size: 1.1rem; font-weight: 600; color: #f8fafc; margin-bottom: 1rem; border-bottom: 1px solid #1e293b; padding-bottom: 0.5rem; }\n .empty-state { text-align: center; padding: 3rem; color: #64748b; }\n .stat-row { display: flex; gap: 2rem; flex-wrap: wrap; color: #64748b; font-size: 0.875rem; margin-bottom: 2rem; }\n .hidden { display: none; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <h1>clean-slop Report</h1>\n <p>v${escapeHtml(version)} &nbsp;·&nbsp; ${escapeHtml(new Date(timestamp).toUTCString())} &nbsp;·&nbsp; ${escapeHtml(root)}</p>\n </header>\n\n <div class=\"score-grid\">\n <div class=\"score-card\">\n <div class=\"label\">Overall Score</div>\n <div class=\"value\" style=\"color:${overallColor}\">${score.overall}<span style=\"font-size:1rem;color:#64748b\">/100</span></div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">Grade</div>\n <div class=\"value\" style=\"color:${overallColor}\">${escapeHtml(score.grade)}</div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">Total Issues</div>\n <div class=\"value\" style=\"color:#f1f5f9\">${issues.length}</div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">Critical</div>\n <div class=\"value\" style=\"color:#dc2626\">${criticalCount}</div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">High</div>\n <div class=\"value\" style=\"color:#ea580c\">${highCount}</div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">Files Scanned</div>\n <div class=\"value\" style=\"color:#f1f5f9\">${scannedCount}</div>\n </div>\n </div>\n\n <div class=\"ready-badge\">${readyText}</div>\n\n <div class=\"section-title\">Category Scores</div>\n <table>\n <thead>\n <tr>\n <th>Category</th><th>Score</th><th>Total</th><th>Critical</th><th>High</th><th>Medium</th><th>Low</th>\n </tr>\n </thead>\n <tbody>${categoryRows}</tbody>\n </table>\n\n <div class=\"section-title\">Issues</div>\n <div class=\"stat-row\">\n <span>${issues.length} issue${issues.length !== 1 ? 's' : ''} &nbsp;·&nbsp; ${scannedCount} files &nbsp;·&nbsp; ${durationStr}</span>\n </div>\n\n <div class=\"filters\">\n <button class=\"filter-btn active\" onclick=\"filterIssues('all')\">All (${issues.length})</button>\n <button class=\"filter-btn\" onclick=\"filterIssues('critical')\">Critical (${criticalCount})</button>\n <button class=\"filter-btn\" onclick=\"filterIssues('high')\">High (${highCount})</button>\n <button class=\"filter-btn\" onclick=\"filterIssues('medium')\">Medium (${mediumCount})</button>\n <button class=\"filter-btn\" onclick=\"filterIssues('low')\">Low (${lowCount})</button>\n </div>\n\n <div id=\"issues-container\">\n ${issues.length === 0 ? '<div class=\"empty-state\">No issues found.</div>' : issueCards}\n </div>\n </div>\n\n <script>\n function filterIssues(severity) {\n document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));\n event.target.classList.add('active');\n document.querySelectorAll('.issue-card').forEach(card => {\n if (severity === 'all' || card.dataset.severity === severity) {\n card.classList.remove('hidden');\n } else {\n card.classList.add('hidden');\n }\n });\n }\n </script>\n</body>\n</html>`;\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport type { ScanResult } from '../types.js';\nimport { generateTextReport } from './text-reporter.js';\nimport { generateJsonReport } from './json-reporter.js';\nimport { generateMarkdownReport } from './markdown-reporter.js';\nimport { generateSarifReport } from './sarif-reporter.js';\nimport { generateHtmlReport } from './html-reporter.js';\n\nexport type ReporterName = 'text' | 'json' | 'html' | 'markdown' | 'sarif';\n\nexport function generate(\n result: ScanResult,\n reporter: ReporterName = 'text',\n): string {\n switch (reporter) {\n case 'json':\n return generateJsonReport(result);\n case 'html':\n return generateHtmlReport(result);\n case 'markdown':\n return generateMarkdownReport(result);\n case 'sarif':\n return generateSarifReport(result);\n case 'text':\n default:\n return generateTextReport(result);\n }\n}\n\nexport async function writeReport(\n content: string,\n outputPath: string,\n): Promise<void> {\n const dir = path.dirname(outputPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(outputPath, content, 'utf-8');\n}\n","import path from 'path';\nimport process from 'process';\nimport { loadConfig } from '../../config/loader.js';\nimport { scan } from '../../scanners/scanner.js';\nimport type { ScanOptions } from '../../scanners/scanner.js';\nimport { generate, writeReport } from '../../reporters/index.js';\nimport type { ReporterName } from '../../reporters/index.js';\nimport type { ResolvedConfig, Severity } from '../../types.js';\nimport {\n BOLD,\n DIM,\n GREEN,\n RED,\n RESET,\n} from '../../utils/constants.js';\n\nexport interface ScanCommandOptions {\n config?: string;\n reporter?: string;\n output?: string;\n failThreshold?: string;\n maxCritical?: string;\n maxHigh?: string;\n aiSlop?: boolean;\n security?: boolean;\n reliability?: boolean;\n maintainability?: boolean;\n productionReadiness?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n ci?: boolean;\n}\n\nfunction clearLine(): void {\n if (process.stdout.isTTY) {\n process.stdout.write('\\r\\x1b[K');\n }\n}\n\nfunction printProgress(filePath: string, index: number, total: number): void {\n if (!process.stdout.isTTY) return;\n const pct = Math.round(((index + 1) / total) * 100);\n const short = filePath.length > 60 ? '...' + filePath.slice(-57) : filePath;\n process.stdout.write(`\\r${DIM}Scanning [${pct}%] ${short}${RESET}`);\n}\n\nexport async function runScan(\n directory: string | undefined,\n options: ScanCommandOptions,\n): Promise<void> {\n const ci = options.ci ?? !process.stdout.isTTY;\n const cwd = directory ? path.resolve(directory) : process.cwd();\n\n // Load config\n const baseConfig = await loadConfig(cwd, options.config);\n\n // Apply CLI overrides\n const config: ResolvedConfig = {\n ...baseConfig,\n verbose: options.verbose ?? baseConfig.verbose,\n reporter: (options.reporter as ReporterName | undefined) ?? baseConfig.reporter,\n output: options.output ?? baseConfig.output,\n failThreshold: options.failThreshold\n ? parseInt(options.failThreshold, 10)\n : baseConfig.failThreshold,\n categories: {\n 'ai-slop': options.aiSlop === false ? false : (baseConfig.categories['ai-slop'] ?? true),\n 'security': options.security === false ? false : (baseConfig.categories['security'] ?? true),\n 'reliability': options.reliability === false ? false : (baseConfig.categories['reliability'] ?? true),\n 'maintainability': options.maintainability === false ? false : (baseConfig.categories['maintainability'] ?? true),\n 'production-readiness': options.productionReadiness === false ? false : (baseConfig.categories['production-readiness'] ?? true),\n },\n };\n\n if (options.maxCritical !== undefined) {\n config.maxIssues = { ...config.maxIssues, critical: parseInt(options.maxCritical, 10) };\n }\n if (options.maxHigh !== undefined) {\n config.maxIssues = { ...config.maxIssues, high: parseInt(options.maxHigh, 10) };\n }\n\n if (!ci && !options.quiet) {\n console.log(`\\n${BOLD}clean-slop${RESET} ${DIM}Production Readiness Engine${RESET}`);\n console.log(`${DIM}Scanning ${cwd}${RESET}\\n`);\n }\n\n const scanOptions: ScanOptions = { config };\n if (!options.quiet && !ci) scanOptions.onFile = printProgress;\n\n const result = await scan(scanOptions);\n\n if (!ci && !options.quiet && process.stdout.isTTY) {\n clearLine();\n }\n\n // Generate report\n const reporterName = config.reporter as ReporterName;\n const reportContent = generate(result, reporterName);\n\n if (config.output) {\n await writeReport(reportContent, config.output);\n if (!options.quiet) {\n console.log(`${GREEN}Report written to ${config.output}${RESET}`);\n }\n } else {\n process.stdout.write(reportContent);\n }\n\n // Determine exit code\n let shouldFail = false;\n\n // Score threshold\n if (result.score.overall < config.failThreshold) {\n shouldFail = true;\n }\n\n // maxIssues per severity\n for (const [sev, max] of Object.entries(config.maxIssues)) {\n if (max === undefined) continue;\n const count = result.issues.filter((i) => i.severity === (sev as Severity)).length;\n if (count > max) {\n shouldFail = true;\n if (!options.quiet && !ci) {\n console.error(\n `${RED}${count} ${sev} issue${count !== 1 ? 's' : ''} found (max allowed: ${max})${RESET}`,\n );\n }\n }\n }\n\n if (shouldFail) {\n process.exit(1);\n }\n}\n","import path from 'path';\nimport process from 'process';\nimport { loadConfig } from '../../config/loader.js';\nimport { scan } from '../../scanners/scanner.js';\nimport { GREEN, RED, RESET, BOLD, DIM } from '../../utils/constants.js';\n\nexport interface CheckCommandOptions {\n config?: string;\n failThreshold?: string;\n maxCritical?: string;\n}\n\nexport async function runCheck(\n directory: string | undefined,\n options: CheckCommandOptions,\n): Promise<void> {\n const cwd = directory ? path.resolve(directory) : process.cwd();\n const baseConfig = await loadConfig(cwd, options.config);\n\n const config = {\n ...baseConfig,\n failThreshold: options.failThreshold\n ? parseInt(options.failThreshold, 10)\n : baseConfig.failThreshold,\n verbose: false,\n };\n\n if (options.maxCritical !== undefined) {\n config.maxIssues = {\n ...config.maxIssues,\n critical: parseInt(options.maxCritical, 10),\n };\n }\n\n const result = await scan({ config });\n\n const criticalCount = result.issues.filter((i) => i.severity === 'critical').length;\n const maxCritical = config.maxIssues.critical ?? 0;\n const criticalExceeded = criticalCount > maxCritical;\n const scorePassed = result.score.overall >= config.failThreshold;\n const passed = scorePassed && !criticalExceeded;\n\n if (passed) {\n console.log(\n `${GREEN}${BOLD}PASS${RESET} Score: ${result.score.overall}/100 Grade: ${result.score.grade} ` +\n `${DIM}(threshold: ${config.failThreshold})${RESET}`,\n );\n process.exit(0);\n } else {\n const reasons: string[] = [];\n if (!scorePassed) {\n reasons.push(\n `score ${result.score.overall} below threshold ${config.failThreshold}`,\n );\n }\n if (criticalExceeded) {\n reasons.push(\n `${criticalCount} critical issue${criticalCount !== 1 ? 's' : ''} (max: ${maxCritical})`,\n );\n }\n\n console.error(\n `${RED}${BOLD}FAIL${RESET} Score: ${result.score.overall}/100 Grade: ${result.score.grade}`,\n );\n for (const reason of reasons) {\n console.error(` ${RED}${reason}${RESET}`);\n }\n process.exit(1);\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport process from 'process';\nimport { loadConfig } from '../../config/loader.js';\nimport { scan } from '../../scanners/scanner.js';\nimport { generateTextReport } from '../../reporters/text-reporter.js';\nimport { BOLD, CYAN, DIM, GREEN, RED, RESET } from '../../utils/constants.js';\n\nexport interface WatchCommandOptions {\n config?: string;\n verbose?: boolean;\n}\n\nconst DEBOUNCE_MS = 500;\n\nexport async function runWatch(\n directory: string | undefined,\n options: WatchCommandOptions,\n): Promise<void> {\n const cwd = directory ? path.resolve(directory) : process.cwd();\n const config = await loadConfig(cwd, options.config);\n\n if (options.verbose) config.verbose = true;\n\n console.log(\n `\\n${BOLD}clean-slop watch${RESET} ${DIM}Watching ${cwd}${RESET}`,\n );\n console.log(`${DIM}Press Ctrl+C to stop.${RESET}\\n`);\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let running = false;\n\n async function runScanCycle(changedFile?: string): Promise<void> {\n if (running) return;\n running = true;\n\n if (changedFile) {\n const rel = path.relative(cwd, changedFile);\n console.log(`${CYAN}Changed:${RESET} ${rel}`);\n }\n\n const startMsg = `${DIM}Scanning...${RESET}`;\n process.stdout.write(startMsg);\n\n try {\n const result = await scan({ config });\n process.stdout.write('\\r\\x1b[K');\n\n const report = generateTextReport(result);\n console.log(report);\n\n if (result.score.productionReady) {\n console.log(`${GREEN}Score: ${result.score.overall}/100${RESET}\\n`);\n } else {\n console.log(`${RED}Score: ${result.score.overall}/100${RESET}\\n`);\n }\n } catch (err) {\n process.stdout.write('\\r\\x1b[K');\n console.error(\n `${RED}Scan error:${RESET} ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n running = false;\n }\n\n // Initial scan\n await runScanCycle();\n\n // Watch for changes\n const watcher = fs.watch(\n cwd,\n { recursive: true },\n (event, filename) => {\n if (!filename) return;\n\n // Filter to JS/TS files only\n if (!/\\.(js|jsx|ts|tsx|mjs|cjs)$/.test(filename)) return;\n\n // Skip excluded paths\n if (\n filename.includes('node_modules') ||\n filename.includes('dist') ||\n filename.includes('.next')\n ) return;\n\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n void runScanCycle(path.join(cwd, filename));\n }, DEBOUNCE_MS);\n },\n );\n\n process.on('SIGINT', () => {\n watcher.close();\n console.log(`\\n${DIM}Watch stopped.${RESET}\\n`);\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise<void>(() => {});\n}\n","import process from 'process';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport { execSync } from 'child_process';\nimport { loadConfig } from '../../config/loader.js';\nimport { BUILT_IN_RULES } from '../../rules/index.js';\nimport {\n BOLD, CYAN, DIM, GREEN, RED, RESET, YELLOW,\n} from '../../utils/constants.js';\nimport { PACKAGE_VERSION } from '../../version.js';\n\nfunction check(label: string, ok: boolean, detail?: string): void {\n const icon = ok ? `${GREEN}✓${RESET}` : `${RED}✗${RESET}`;\n const msg = detail ? ` ${icon} ${label} ${DIM}${detail}${RESET}` : ` ${icon} ${label}`;\n console.log(msg);\n}\n\nfunction warn(label: string, detail?: string): void {\n const msg = detail\n ? ` ${YELLOW}!${RESET} ${label} ${DIM}${detail}${RESET}`\n : ` ${YELLOW}!${RESET} ${label}`;\n console.log(msg);\n}\n\nfunction info(label: string, detail?: string): void {\n const msg = detail\n ? ` ${CYAN}i${RESET} ${label} ${DIM}${detail}${RESET}`\n : ` ${CYAN}i${RESET} ${label}`;\n console.log(msg);\n}\n\nfunction getNodeVersion(): string {\n return process.version;\n}\n\nfunction meetsNodeMinimum(): boolean {\n const [major] = process.version.replace('v', '').split('.').map(Number);\n return (major ?? 0) >= 18;\n}\n\nfunction getNpmVersion(): string | null {\n try {\n return execSync('npm --version', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return null;\n }\n}\n\nexport async function runDoctor(): Promise<void> {\n const cwd = process.cwd();\n\n console.log(`\\n${BOLD}clean-slop doctor${RESET}\\n`);\n console.log(`${DIM}Diagnosing environment and configuration...${RESET}\\n`);\n\n // --- Environment ---\n console.log(`${BOLD}Environment${RESET}`);\n const nodeVersion = getNodeVersion();\n const nodeOk = meetsNodeMinimum();\n check('Node.js version', nodeOk, `${nodeVersion} (requires >= 18)`);\n\n const npmVersion = getNpmVersion();\n check('npm available', npmVersion !== null, npmVersion ?? 'not found');\n\n info('Platform', process.platform);\n info('Architecture', process.arch);\n info('clean-slop version', PACKAGE_VERSION);\n console.log();\n\n // --- Configuration ---\n console.log(`${BOLD}Configuration${RESET}`);\n\n let config;\n try {\n config = await loadConfig(cwd);\n check('Configuration loaded', true, `root: ${config.root}`);\n info('Fail threshold', `${config.failThreshold}/100`);\n info('Reporter', config.reporter);\n info('Output', config.output ?? 'stdout');\n\n const enabledCategories = Object.entries(config.categories)\n .filter(([, v]) => v)\n .map(([k]) => k);\n info('Enabled categories', enabledCategories.join(', '));\n\n const ruleOverrides = Object.keys(config.rules).length;\n info('Rule overrides', `${ruleOverrides}`);\n } catch (err) {\n check('Configuration loaded', false, err instanceof Error ? err.message : String(err));\n }\n console.log();\n\n // --- Project ---\n console.log(`${BOLD}Project${RESET}`);\n\n const pkgPath = path.join(cwd, 'package.json');\n try {\n const raw = await fs.readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(raw) as Record<string, unknown>;\n check('package.json found', true, String(pkg.name ?? '(no name)'));\n\n const allDeps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const hasTs = 'typescript' in allDeps;\n info('TypeScript project', String(hasTs));\n } catch {\n check('package.json found', false, 'Could not read package.json');\n }\n\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n try {\n await fs.access(tsconfigPath);\n check('tsconfig.json found', true);\n } catch {\n warn('tsconfig.json not found', 'TypeScript projects should include tsconfig.json');\n }\n\n const gitPath = path.join(cwd, '.git');\n try {\n await fs.access(gitPath);\n check('Git repository', true);\n } catch {\n warn('Not a git repository', 'clean-slop works best in a git repository');\n }\n\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n await fs.access(gitignorePath);\n check('.gitignore found', true);\n } catch {\n warn('.gitignore not found', 'Add a .gitignore to exclude build artifacts');\n }\n\n console.log();\n\n // --- Rules ---\n console.log(`${BOLD}Rules${RESET}`);\n info('Built-in rules loaded', `${BUILT_IN_RULES.length}`);\n\n const byCategory = new Map<string, number>();\n for (const rule of BUILT_IN_RULES) {\n byCategory.set(rule.meta.category, (byCategory.get(rule.meta.category) ?? 0) + 1);\n }\n for (const [cat, count] of byCategory) {\n info(` ${cat}`, `${count} rules`);\n }\n\n console.log();\n\n // --- Summary ---\n if (!meetsNodeMinimum()) {\n console.log(\n `${RED}Node.js >= 18 is required. Please upgrade your Node.js installation.${RESET}\\n`,\n );\n process.exit(1);\n }\n\n console.log(`${GREEN}Environment looks good.${RESET}\\n`);\n}\n","import path from 'path';\nimport fs from 'fs/promises';\nimport process from 'process';\nimport { generateDefaultConfig } from '../../config/loader.js';\nimport { GREEN, RED, RESET, YELLOW, BOLD } from '../../utils/constants.js';\n\nexport interface InitCommandOptions {\n force?: boolean;\n}\n\nexport async function runInit(options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n const configPath = path.join(cwd, 'clean-slop.config.js');\n\n try {\n await fs.access(configPath);\n // File exists\n if (!options.force) {\n console.log(\n `${YELLOW}clean-slop.config.js already exists.${RESET} ` +\n `Use ${BOLD}--force${RESET} to overwrite it.`,\n );\n process.exit(1);\n }\n } catch {\n // File does not exist — proceed\n }\n\n const content = generateDefaultConfig();\n\n try {\n await fs.writeFile(configPath, content, 'utf-8');\n console.log(`${GREEN}Created clean-slop.config.js${RESET}`);\n console.log(`${RESET}Edit it to customize rules, categories, and thresholds.\\n`);\n } catch (err) {\n console.error(\n `${RED}Failed to write config file: ${err instanceof Error ? err.message : String(err)}${RESET}`,\n );\n process.exit(1);\n }\n}\n","import path from 'path';\nimport process from 'process';\nimport { loadConfig } from '../../config/loader.js';\nimport { scan } from '../../scanners/scanner.js';\nimport { generate, writeReport } from '../../reporters/index.js';\nimport type { ReporterName } from '../../reporters/index.js';\nimport { GREEN, RESET } from '../../utils/constants.js';\n\nexport interface ReportCommandOptions {\n config?: string;\n reporter?: string;\n output?: string;\n}\n\nexport async function runReport(\n directory: string | undefined,\n options: ReportCommandOptions,\n): Promise<void> {\n const cwd = directory ? path.resolve(directory) : process.cwd();\n const baseConfig = await loadConfig(cwd, options.config);\n\n const reporterName = (options.reporter ?? baseConfig.reporter) as ReporterName;\n const outputPath = options.output ?? baseConfig.output;\n\n if (!outputPath && reporterName === 'html') {\n const defaultOut = path.join(cwd, 'clean-slop-report.html');\n baseConfig.output = defaultOut;\n } else if (outputPath) {\n baseConfig.output = outputPath;\n }\n\n const config = { ...baseConfig, reporter: reporterName };\n\n console.log(`Scanning ${cwd}...`);\n const result = await scan({ config });\n\n const content = generate(result, reporterName);\n\n if (config.output) {\n await writeReport(content, config.output);\n console.log(`${GREEN}Report written to ${config.output}${RESET}`);\n } else {\n process.stdout.write(content);\n }\n}\n","import { Command } from 'commander';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { runScan } from './commands/scan.js';\nimport { runCheck } from './commands/check.js';\nimport { runWatch } from './commands/watch.js';\nimport { runDoctor } from './commands/doctor.js';\nimport { runInit } from './commands/init.js';\nimport { runReport } from './commands/report.js';\n\nexport { createCLI };\n\nfunction createCLI(): Command {\n const program = new Command();\n\n program\n .name('clean-slop')\n .description(\n 'Production Readiness Engine for JavaScript and TypeScript projects.\\n' +\n 'Prevents low-quality, insecure, and AI-generated code from reaching production.',\n )\n .version(PACKAGE_VERSION, '-v, --version', 'Print the current version')\n .helpOption('-h, --help', 'Display help information');\n\n // Default command: scan (also explicit)\n program\n .command('scan [directory]', { isDefault: true })\n .description('Scan a directory for issues (default command)')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('--reporter <name>', 'Reporter to use: text, json, html, markdown, sarif', 'text')\n .option('-o, --output <file>', 'Write report to a file instead of stdout')\n .option('--fail-threshold <score>', 'Minimum score before exiting with code 1', '70')\n .option('--max-critical <n>', 'Maximum allowed critical issues (0 = none)', '0')\n .option('--max-high <n>', 'Maximum allowed high issues')\n .option('--no-ai-slop', 'Disable AI slop rules')\n .option('--no-security', 'Disable security rules')\n .option('--no-reliability', 'Disable reliability rules')\n .option('--no-maintainability', 'Disable maintainability rules')\n .option('--no-production-readiness', 'Disable production readiness rules')\n .option('--verbose', 'Print full issue details including snippets and fixes')\n .option('--quiet', 'Only print the score summary, suppress issue list')\n .option('--ci', 'CI mode: machine-readable exit codes, no color')\n .action(runScan);\n\n program\n .command('check [directory]')\n .description('Quick check: exit 0 if production ready, 1 if not')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('--fail-threshold <score>', 'Minimum passing score', '70')\n .option('--max-critical <n>', 'Maximum critical issues allowed', '0')\n .action(runCheck);\n\n program\n .command('watch [directory]')\n .description('Watch for file changes and re-scan automatically')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('--verbose', 'Print full issue details')\n .action(runWatch);\n\n program\n .command('report [directory]')\n .description('Generate a report from the last scan or run a fresh scan')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('--reporter <name>', 'Reporter: text, json, html, markdown, sarif', 'html')\n .option('-o, --output <file>', 'Output file path')\n .action(runReport);\n\n program\n .command('doctor')\n .description('Diagnose the current environment, config, and installation')\n .action(runDoctor);\n\n program\n .command('init')\n .description('Create a clean-slop.config.js in the current directory')\n .option('--force', 'Overwrite existing config file')\n .action(runInit);\n\n return program;\n}\n"]}
1
+ {"version":3,"sources":["../../src/version.ts","../../src/config/loader.ts","../../src/parsers/source-parser.ts","../../src/utils/constants.ts","../../src/rules/engine.ts","../../src/utils/ast.ts","../../src/rules/ai-slop/empty-catch.ts","../../src/rules/ai-slop/todo-implementation.ts","../../src/rules/ai-slop/giant-function.ts","../../src/rules/ai-slop/excessive-nesting.ts","../../src/rules/ai-slop/fake-validation.ts","../../src/rules/ai-slop/high-complexity.ts","../../src/rules/ai-slop/dead-code.ts","../../src/rules/security/unsafe-eval.ts","../../src/rules/security/hardcoded-secrets.ts","../../src/rules/security/sql-injection.ts","../../src/rules/security/command-injection.ts","../../src/rules/security/path-traversal.ts","../../src/rules/security/prototype-pollution.ts","../../src/rules/security/weak-crypto.ts","../../src/rules/security/dangerous-cors.ts","../../src/rules/reliability/unhandled-promise.ts","../../src/rules/reliability/missing-await.ts","../../src/rules/reliability/infinite-loop.ts","../../src/rules/maintainability/giant-file.ts","../../src/rules/maintainability/circular-imports.ts","../../src/rules/production-readiness/no-console-log.ts","../../src/rules/production-readiness/no-localhost-urls.ts","../../src/rules/index.ts","../../src/scanners/scanner.ts","../../src/reporters/text-reporter.ts","../../src/reporters/json-reporter.ts","../../src/reporters/markdown-reporter.ts","../../src/reporters/sarif-reporter.ts","../../src/reporters/html-reporter.ts","../../src/reporters/index.ts","../../src/cli/commands/scan.ts","../../src/cli/commands/check.ts","../../src/cli/commands/watch.ts","../../src/cli/commands/doctor.ts","../../src/cli/commands/init.ts","../../src/cli/commands/report.ts","../../src/cli/index.ts"],"names":["path","rule","traverse","getLocation","MAX_LINES","fs","relPath","formatDuration","process"],"mappings":";;;;;;;;;;;;;;AAAO,IAAM,eAAA,GAAkB,OAAA;ACK/B,IAAM,kBAAkB,CAAC,SAAA,EAAW,YAAY,SAAA,EAAW,UAAA,EAAY,YAAY,UAAU,CAAA;AAE7F,IAAM,eAAA,GAAkB;AAAA,EACtB,oBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,0BAAoC,EAAC;AAE3C,IAAM,kBAAA,GAAoD;AAAA,EACxD,SAAA,EAAW,IAAA;AAAA,EACX,QAAA,EAAU,IAAA;AAAA,EACV,WAAA,EAAa,IAAA;AAAA,EACb,eAAA,EAAiB,IAAA;AAAA,EACjB,sBAAA,EAAwB;AAC1B,CAAA;AAEA,IAAM,qBAAwD,EAAC;AAE/D,SAAS,aAAa,KAAA,EAA4C;AAChE,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,GAAA;AACxB,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,GAAA;AACxB,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,GAAA;AACxB,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,GAAA;AACxB,EAAA,OAAO,GAAA;AACT;AAIA,eAAsB,UAAA,CAAW,KAAa,UAAA,EAA8C;AAC1F,EAAA,MAAM,QAAA,GAAW,YAAY,YAAA,EAAc;AAAA,IACzC,YAAA,EAAc;AAAA,MACZ,sBAAA;AAAA,MACA,sBAAA;AAAA,MACA,uBAAA;AAAA,MACA,uBAAA;AAAA,MACA,gBAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,IAAI,aAAyB,EAAC;AAE9B,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,UAAA,GAAa,MAAM,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA,GAAI,MAAM,QAAA,CAAS,MAAA,CAAO,GAAG,CAAA;AAEvF,IAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,OAAA,EAAS;AAC7B,MAAA,UAAA,GAAa,MAAA,CAAO,MAAA;AAAA,IACtB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,aAAA,CAAc,YAAY,GAAG,CAAA;AACtC;AAEO,SAAS,aAAA,CAAc,YAAwB,GAAA,EAA6B;AACjF,EAAA,OAAO;AAAA,IACL,IAAA,EAAMA,KAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAAA,IACtB,OAAA,EAAS,eAAA;AAAA,IACT,OAAA,EAAS,WAAW,OAAA,IAAW,eAAA;AAAA,IAC/B,OAAA,EAAS,WAAW,OAAA,IAAW,eAAA;AAAA,IAC/B,UAAA,EAAY;AAAA,MACV,GAAG,kBAAA;AAAA,MACH,GAAG,UAAA,CAAW;AAAA,KAChB;AAAA,IACA,KAAA,EAAO,UAAA,CAAW,KAAA,IAAS,EAAC;AAAA,IAC5B,aAAA,EAAe,WAAW,aAAA,IAAiB,EAAA;AAAA,IAC3C,SAAA,EAAW;AAAA,MACT,GAAG,kBAAA;AAAA,MACH,GAAG,UAAA,CAAW;AAAA,KAChB;AAAA,IACA,OAAA,EAAS,UAAA,CAAW,OAAA,IAAW,EAAC;AAAA,IAChC,QAAA,EAAU,WAAW,QAAA,IAAY,MAAA;AAAA,IACjC,MAAA,EAAQ,WAAW,MAAA,IAAU,IAAA;AAAA,IAC7B,OAAA,EAAS,WAAW,OAAA,IAAW,KAAA;AAAA,IAC/B,cAAA,EAAgB,WAAW,cAAA,IAAkB,uBAAA;AAAA,IAC7C,YAAA,EAAc,WAAW,YAAA,IAAgB;AAAA,GAC3C;AACF;AAEO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;AA0DT;ACxJO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EACpC,WAAA,CACE,OAAA,EACgB,QAAA,EACS,KAAA,EACzB;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAHG,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACS,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGzB,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AAAA,EALkB,QAAA;AAAA,EACS,KAAA;AAK7B,CAAA;AAEA,SAAS,eAAe,QAAA,EAA4B;AAClD,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,WAAA,EAAY;AAC/C,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,KAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT;AACE,MAAA,OAAO,YAAA;AAAA;AAEb;AAEA,SAAS,iBAAiB,QAAA,EAA6B;AACrD,EAAA,OAAO,QAAA,KAAa,gBAAgB,QAAA,KAAa,KAAA;AACnD;AAOO,SAAS,WAAA,CAAY,UAAkB,MAAA,EAA4B;AACxE,EAAA,MAAM,QAAA,GAAW,eAAe,QAAQ,CAAA;AAExC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,EAAQ;AAAA,MACxB,GAAA,EAAK,QAAA,KAAa,KAAA,IAAS,QAAA,KAAa,KAAA;AAAA,MACxC,KAAK,QAAA,KAAa,KAAA;AAAA,MAClB,GAAA,EAAK,IAAA;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ,KAAA;AAAA,MACR,qBAAA,EAAuB,KAAA;AAAA,MACvB,eAAA,EAAiB,IAAA;AAAA,MACjB,kCAAA,EAAoC;AAAA,KACrC,CAAA;AAED,IAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,QAAA,EAAS;AAAA,EAC3C,SAAS,GAAA,EAAK;AAEZ,IAAA,IAAI,CAAC,gBAAA,CAAiB,QAAQ,CAAA,EAAG;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,MAAA,EAAQ;AAAA,UACxB,KAAK,QAAA,KAAa,KAAA;AAAA,UAClB,GAAA,EAAK,IAAA;AAAA,UACL,KAAA,EAAO,IAAA;AAAA,UACP,OAAA,EAAS,IAAA;AAAA,UACT,MAAA,EAAQ,KAAA;AAAA,UACR,qBAAA,EAAuB,KAAA;AAAA,UACvB,eAAA,EAAiB,IAAA;AAAA,UACjB,kCAAA,EAAoC;AAAA,SACrC,CAAA;AACD,QAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,GAAA,EAAK,QAAA,EAAS;AAAA,MAC3C,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,qBAAA;AAErD,IAAA,MAAM,IAAI,WAAW,CAAA,gBAAA,EAAmB,QAAQ,KAAK,OAAO,CAAA,CAAA,EAAI,UAAU,GAAG,CAAA;AAAA,EAC/E;AACF;AAEO,SAAS,cAAA,CAAe,MAAA,EAAgB,IAAA,EAAc,YAAA,GAAe,CAAA,EAAW;AACrF,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAC/B,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,IAAI,YAAY,CAAA;AACjD,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,OAAO,YAAY,CAAA;AAEtD,EAAA,OAAO,KAAA,CACJ,MAAM,KAAA,EAAO,GAAG,EAChB,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACb,IAAA,MAAM,OAAA,GAAU,QAAQ,CAAA,GAAI,CAAA;AAC5B,IAAA,MAAM,MAAA,GAAS,OAAA,KAAY,IAAA,GAAO,GAAA,GAAM,GAAA;AACxC,IAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,EAAM,CAAC,CAAA,CAAA;AAAA,EAC7D,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AACd;;;AC/FO,IAAM,aAAA,GAAgB,6BAAA;AAGtB,IAAM,cAAA,GAAyC;AAAA,EACpD,QAAA,EAAU,CAAA;AAAA,EACV,IAAA,EAAM,CAAA;AAAA,EACN,MAAA,EAAQ,CAAA;AAAA,EACR,GAAA,EAAK,CAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,eAAA,GAA0C;AAAA,EACrD,QAAA,EAAU,UAAA;AAAA;AAAA,EACV,IAAA,EAAM,UAAA;AAAA;AAAA,EACN,MAAA,EAAQ,UAAA;AAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA;AAAA,EACL,IAAA,EAAM;AAAA;AACR,CAAA;AAEO,IAAM,KAAA,GAAQ,SAAA;AACd,IAAM,IAAA,GAAO,SAAA;AACb,IAAM,GAAA,GAAM,SAAA;AACZ,IAAM,KAAA,GAAQ,UAAA;AACd,IAAM,MAAA,GAAS,UAAA;AACf,IAAM,GAAA,GAAM,UAAA;AACZ,IAAM,IAAA,GAAO,UAAA;AACb,IAAM,IAAA,GAAO,UAAA;;;ACbb,IAAM,aAAN,MAAiB;AAAA,EACd,KAAA,uBAA+B,GAAA,EAAI;AAAA,EAE3C,SAASC,MAAAA,EAAkB;AACzB,IAAA,IAAI,KAAK,KAAA,CAAM,GAAA,CAAIA,MAAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAASA,MAAAA,CAAK,IAAA,CAAK,EAAE,CAAA,wBAAA,CAA0B,CAAA;AAAA,IACjE;AACA,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAIA,MAAAA,CAAK,IAAA,CAAK,IAAIA,MAAI,CAAA;AAAA,EACnC;AAAA,EAEA,YAAY,KAAA,EAAqB;AAC/B,IAAA,KAAA,MAAWA,UAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,SAASA,MAAI,CAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,QAAQ,EAAA,EAA8B;AACpC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAAA,EAC1B;AAAA,EAEA,QAAA,GAAmB;AACjB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EACvC;AAAA,EAEA,mBAAmB,QAAA,EAAgC;AACjD,IAAA,OAAO,IAAA,CAAK,UAAS,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,QAAQ,CAAA;AAAA,EACnE;AAAA,EAEA,SAAA,CAAU,YAAwB,MAAA,EAAiC;AACjE,IAAA,MAAM,SAAkB,EAAC;AAEzB,IAAA,KAAA,MAAWA,MAAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,MAAA,EAAO,EAAG;AAEtC,MAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAWA,MAAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,EAAG;AAG5C,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAMA,MAAAA,CAAK,KAAK,EAAE,CAAA;AAC5C,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,uBAAA,CAAwB,UAAU,CAAA;AAChE,MAAA,IAAI,qBAAqB,KAAA,EAAO;AAEhC,MAAA,MAAM,iBAAA,GAAoB,gBAAA,IAAoBA,MAAAA,CAAK,IAAA,CAAK,QAAA;AAExD,MAAA,MAAM,aAAsB,EAAC;AAE7B,MAAA,MAAM,OAAA,GAAuB;AAAA,QAC3B,UAAU,UAAA,CAAW,QAAA;AAAA,QACrB,QAAQ,UAAA,CAAW,MAAA;AAAA,QACnB,KAAK,UAAA,CAAW,GAAA;AAAA,QAChB,MAAA;AAAA,QACA,OAAO,OAAA,EAAS;AACd,UAAA,MAAM,OAAA,GACJ,QAAQ,OAAA,IAAW,cAAA,CAAe,WAAW,MAAA,EAAQ,OAAA,CAAQ,SAAS,IAAI,CAAA;AAE5E,UAAA,UAAA,CAAW,IAAA,CAAK;AAAA,YACd,MAAA,EAAQA,OAAK,IAAA,CAAK,EAAA;AAAA,YAClB,QAAA,EAAUA,OAAK,IAAA,CAAK,IAAA;AAAA,YACpB,QAAA,EAAUA,OAAK,IAAA,CAAK,QAAA;AAAA,YACpB,QAAA,EAAU,iBAAA;AAAA,YACV,UAAA,EAAYA,OAAK,IAAA,CAAK,UAAA;AAAA,YACtB,OAAA,EAASA,OAAK,IAAA,CAAK,OAAA,IAAW,GAAG,aAAa,CAAA,OAAA,EAAUA,MAAAA,CAAK,IAAA,CAAK,EAAE,CAAA,CAAA;AAAA,YACpE,OAAA;AAAA,YACA,GAAG;AAAA,WACJ,CAAA;AAAA,QACH;AAAA,OACF;AAEA,MAAA,IAAI;AACF,QAAAA,MAAAA,CAAK,OAAO,OAAO,CAAA;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,UAAU,CAAA;AAAA,IAC3B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,wBACN,UAAA,EACyB;AACzB,IAAA,IAAI,UAAA,KAAe,QAAW,OAAO,IAAA;AAErC,IAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,KAAe,IAAA,EAAM;AACzD,MAAA,IAAI,UAAA,IAAc,UAAA,IAAc,UAAA,CAAW,QAAA,EAAU;AACnD,QAAA,OAAO,UAAA,CAAW,QAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;;;ACxFO,SAAS,QAAA,CAAS,KAAc,OAAA,EAAwB;AAC7D,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAErC,EAAA,MAAM,IAAA,GAAO,GAAA;AAEb,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AACjC,IAAA,IAAI,OAAA,UAAiB,IAAI,CAAA;AAEzB,IAAA,MAAM,QAAA,GAAW,QAAQ,GAAG,CAAA;AAC5B,IAAA,IAAI,QAAA,WAAmB,IAAI,CAAA;AAAA,EAC7B;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,IAAA,IAAI,QAAQ,QAAA,EAAU;AACtB,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,QAAA,CAAS,MAAM,OAAO,CAAA;AAAA,MACxB;AAAA,IACF,WAAW,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAW,KAAA,EAAkB;AAC5E,MAAA,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,IACzB;AAAA,EACF;AACF;AAKO,SAAS,OAAA,CAAQ,KAAc,QAAA,EAA6B;AACjE,EAAA,MAAM,UAAqB,EAAC;AAC5B,EAAA,QAAA,CAAS,GAAA,EAAK;AAAA,IACZ,CAAC,QAAQ,CAAA,CAAE,IAAA,EAAM;AACf,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB;AAAA,GACD,CAAA;AACD,EAAA,OAAO,OAAA;AACT;AAeO,SAAS,WAAA,CACd,MACA,QAAA,EACgD;AAChD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,IAC9B,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,MAAA,IAAU;AAAA,GACpC;AACF;AAuBO,SAAS,cAAc,IAAA,EAA8B;AAC1D,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc;AAChC,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,IAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AACnB,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AACpB,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,MAAM,UAAU,GAAA,CAAI,IAAA;AACpB,MAAA,MAAM,WAAW,IAAA,CAAK,IAAA;AACtB,MAAA,IAAI,WAAW,QAAA,EAAU,OAAO,CAAA,EAAG,OAAO,IAAI,QAAQ,CAAA,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,eAAe,IAAA,EAAwB;AACrD,EAAA,OACE,KAAK,IAAA,KAAS,qBAAA,IACd,KAAK,IAAA,KAAS,oBAAA,IACd,KAAK,IAAA,KAAS,yBAAA;AAElB;AAKO,SAAS,mBAAmB,IAAA,EAAuB;AACxD,EAAA,IAAI,CAAC,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACtB,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,CAAI,OAAO,IAAA,CAAK,GAAA,CAAI,MAAM,IAAA,GAAO,CAAA;AACnD;AAMO,SAAS,qBAAqB,QAAA,EAA2B;AAC9D,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,QAAA,CAAS,QAAA,EAAU;AAAA,IACjB,WAAA,GAAc;AACZ,MAAA,UAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,WAAW,IAAA,EAAM;AACf,MAAA,IAAI,IAAA,CAAK,SAAS,IAAA,EAAM,UAAA,EAAA;AAAA,IAC1B,CAAA;AAAA,IACA,qBAAA,GAAwB;AACtB,MAAA,UAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,kBAAkB,IAAA,EAAM;AACtB,MAAA,IAAI,IAAA,CAAK,aAAa,IAAA,IAAQ,IAAA,CAAK,aAAa,IAAA,IAAQ,IAAA,CAAK,aAAa,IAAA,EAAM;AAC9E,QAAA,UAAA,EAAA;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,YAAA,GAAe;AACb,MAAA,UAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,cAAA,GAAiB;AACf,MAAA,UAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,cAAA,GAAiB;AACf,MAAA,UAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,cAAA,GAAiB;AACf,MAAA,UAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,gBAAA,GAAmB;AACjB,MAAA,UAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,UAAA,EAAA;AAAA,IACF;AAAA,GACD,CAAA;AAED,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,eAAA,CAAgB,GAAA,EAAc,UAAA,GAAa,CAAA,EAAW;AACpE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,UAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,GAAA;AAEb,EAAA,MAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,IAC3B,aAAA;AAAA,IACA,cAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,GAAA,GAAM,UAAA;AAEV,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAY,KAAA,KAAwB;AAChD,IAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU;AACjC,IAAA,MAAM,EAAA,GAAK,CAAA;AAEX,IAAA,MAAM,eAAe,YAAA,CAAa,GAAA,CAAI,GAAG,IAAI,CAAA,GAAI,QAAQ,CAAA,GAAI,KAAA;AAC7D,IAAA,IAAI,YAAA,GAAe,KAAK,GAAA,GAAM,YAAA;AAE9B,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG;AACjC,MAAA,IAAI,QAAQ,QAAA,EAAU;AACtB,MAAA,MAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AACpB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,QAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAAA,MACnD,WAAW,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAW,KAAA,EAAkB;AAC5E,QAAA,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,IAAA,CAAK,MAAM,UAAU,CAAA;AACrB,EAAA,OAAO,GAAA;AACT;;;AClOA,IAAM,IAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,qBAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,oDAAA;AAAA,IACb,SAAA,EACE,iLAAA;AAAA,IAEF,OAAA,EAAS,uDAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,YAAY,IAAA,EAAe;AACzB,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,IAAI,CAAC,IAAA,EAAM;AAEX,QAAA,MAAM,QAAA,GAAW,IAAA;AACjB,QAAA,MAAM,UAAA,GAAa,QAAA,CAAS,IAAA,IAAQ,EAAC;AAGrC,QAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,CAAC,IAAA,KAAkB;AACvD,UAAA,MAAM,CAAA,GAAI,IAAA;AAEV,UAAA,OAAO,EAAE,IAAA,KAAS,gBAAA;AAAA,QACpB,CAAC,CAAA;AAED,QAAA,IAAI,CAAC,aAAA,EAAe;AAClB,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,oDAAA;AAAA,YACT,WAAA,EACE,qJAAA;AAAA,YAEF,MAAA,EACE,iJAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE,8FAAA;AAAA,cACF,IAAA,EAAM;AAAA;AACR,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,mBAAA,GAAQ,IAAA;;;ACrDf,IAAM,YAAA,GACJ,uFAAA;AACF,IAAM,qBAAA,GAAwB,+BAAA;AAE9B,IAAMA,KAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,6BAAA;AAAA,IACJ,IAAA,EAAM,mCAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EAAa,0EAAA;AAAA,IACb,SAAA,EACE,mLAAA;AAAA,IAEF,OAAA,EAAS,+DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AAEd,IAAA,MAAM,kBAAkB,OAAA,CAAQ,GAAA;AAChC,IAAA,MAAM,QAAA,GAAsB,eAAA,CAAgB,QAAA,IAAY,EAAC;AAEzD,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAS,QAAQ,KAAA,IAAgC,EAAA;AACvD,MAAA,IAAI,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,SAAS,CAAA,EAAG,OAAA,CAAQ,IAAA,KAAS,MAAA,GAAS,OAAO,IAAI,CAAA,oCAAA,CAAA;AAAA,UACjD,WAAA,EACE,wIAAA;AAAA,UAEF,MAAA,EACE,gIAAA;AAAA,UAEF,QAAA,EAAU,WAAA,CAAY,OAAA,EAAS,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC/C,GAAA,EAAK;AAAA,YACH,WAAA,EACE;AAAA;AACJ,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,QAAA,IAAI,CAAC,QAAA,EAAU;AAEf,QAAA,IAAI,QAAA,CAAS,IAAA,KAAS,eAAA,IAAmB,QAAA,CAAS,SAAS,gBAAA,EAAkB;AAC3E,UAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,UAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,KAAS,YAAA,GAAgB,OAAO,IAAA,GAAkB,IAAA;AAC5E,UAAA,IAAI,eAAe,OAAA,EAAS;AAE5B,UAAA,MAAM,IAAA,GAAQ,QAAA,CAAS,SAAA,IAAuC,EAAC;AAC/D,UAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,UAAA,MAAM,QAAA,GAAW,KAAK,CAAC,CAAA;AACvB,UAAA,MAAM,WAAW,QAAA,CAAS,IAAA,KAAS,YAAY,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,EAAA;AAExE,UAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,QAAQ,CAAA,EAAG;AACxC,YAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,cACb,OAAA,EAAS,gDAAgD,QAAQ,CAAA,EAAA,CAAA;AAAA,cACjE,WAAA,EACE,oHAAA;AAAA,cAEF,MAAA,EACE,8EAAA;AAAA,cACF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,cAC5C,GAAA,EAAK;AAAA,gBACH,WAAA,EAAa;AAAA;AACf,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,2BAAA,GAAQA,KAAAA;;;ACnFf,IAAM,SAAA,GAAY,EAAA;AAElB,IAAMA,KAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,+BAA+B,SAAS,CAAA,gDAAA,CAAA;AAAA,IACrD,SAAA,EACE,kLAAA;AAAA,IAEF,OAAA,EAAS,0DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,mBAAA,EAAqB,aAAA;AAAA,MACrB,kBAAA,EAAoB,aAAA;AAAA,MACpB,uBAAA,EAAyB;AAAA,KAC1B,CAAA;AAED,IAAA,SAAS,cAAc,IAAA,EAAqB;AAC1C,MAAA,IAAI,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AAE3B,MAAA,MAAM,KAAA,GAAQ,mBAAmB,IAAI,CAAA;AACrC,MAAA,IAAI,SAAS,SAAA,EAAW;AAExB,MAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,MAAA,MAAM,IAAA,GAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,GAAI,aAAA;AAE5C,MAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,QACb,SAAS,CAAA,UAAA,EAAa,IAAI,CAAA,KAAA,EAAQ,KAAK,uBAAuB,SAAS,CAAA,EAAA,CAAA;AAAA,QACvE,WAAA,EACE,oBAAoB,KAAK,CAAA,iIAAA,CAAA;AAAA,QAE3B,MAAA,EACE,yJAAA;AAAA,QAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAC5C,GAAA,EAAK;AAAA,UACH,WAAA,EACE;AAAA,SAEJ;AAAA,QACA,QAAA,EAAU;AAAA,UACR;AAAA;AACF,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;AAEA,IAAO,sBAAA,GAAQA,KAAAA;;;ACvDf,IAAM,SAAA,GAAY,CAAA;AAElB,IAAMA,KAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,2BAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,2DAA2D,SAAS,CAAA,QAAA,CAAA;AAAA,IACjF,SAAA,EACE,yKAAA;AAAA,IAEF,OAAA,EAAS,6DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,mBAAA,EAAqB,aAAA;AAAA,MACrB,kBAAA,EAAoB,aAAA;AAAA,MACpB,uBAAA,EAAyB;AAAA,KAC1B,CAAA;AAED,IAAA,SAAS,cAAc,IAAA,EAAqB;AAC1C,MAAA,IAAI,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AAE3B,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,IAAA,CAAK,IAAA,EAAiB,CAAC,CAAA;AACrD,MAAA,IAAI,SAAS,SAAA,EAAW;AAExB,MAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,MAAA,MAAM,IAAA,GAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,GAAI,aAAA;AAE5C,MAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,QACb,SAAS,CAAA,UAAA,EAAa,IAAI,CAAA,uBAAA,EAA0B,KAAK,YAAY,SAAS,CAAA,EAAA,CAAA;AAAA,QAC9E,WAAA,EACE,0BAA0B,KAAK,CAAA,sGAAA,CAAA;AAAA,QAEjC,MAAA,EACE,kJAAA;AAAA,QAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAC5C,GAAA,EAAK;AAAA,UACH,WAAA,EACE;AAAA,SAEJ;AAAA,QACA,QAAA,EAAU,EAAE,KAAA;AAAM,OACnB,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;AAEA,IAAO,yBAAA,GAAQA,KAAAA;;;AC7Cf,IAAM,uBAAA,GAA0B,mDAAA;AAEhC,IAAMA,KAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,yBAAA;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EACE,oFAAA;AAAA,IACF,SAAA,EACE,+KAAA;AAAA,IAEF,OAAA,EAAS,2DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,mBAAA,EAAqB,aAAA;AAAA,MACrB,kBAAA,EAAoB,aAAA;AAAA,MACpB,uBAAA,EAAyB;AAAA,KAC1B,CAAA;AAED,IAAA,SAAS,cAAc,IAAA,EAAqB;AAC1C,MAAA,MAAM,MAAA,GAAU,IAAA,CAAK,EAAA,IAAO,IAAA,CAAK,MAAA,EAAgC,EAAA;AAEjE,MAAA,IAAI,IAAA,GAAsB,IAAA;AAG1B,MAAA,IAAI,MAAA,EAAQ,SAAS,YAAA,EAAc;AACjC,QAAA,IAAA,GAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,MAC3B;AAGA,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,IAAI,CAAC,IAAA,IAAQ,MAAA,EAAQ,IAAA,KAAS,oBAAA,EAAsB;AAClD,QAAA,MAAM,SAAS,MAAA,CAAO,EAAA;AACtB,QAAA,IAAI,MAAA,EAAQ,SAAS,YAAA,EAAc;AACjC,UAAA,IAAA,GAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,uBAAA,CAAwB,IAAA,CAAK,IAAI,CAAA,EAAG;AAElD,MAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,IAAI,IAAA,CAAK,SAAS,gBAAA,EAAkB;AAClC,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,UAAU,IAAA,EAAM;AAClD,UAAA,oBAAA,CAAqB,MAAM,IAAI,CAAA;AAAA,QACjC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAc,IAAA,CAAwC,IAAA,IAAQ,EAAC;AAGrE,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,QAAA,IAAI,IAAA,CAAK,SAAS,iBAAA,EAAmB;AACnC,UAAA,MAAM,MAAM,IAAA,CAAK,QAAA;AACjB,UAAA,IAAI,GAAA,EAAK,IAAA,KAAS,SAAA,IAAa,GAAA,CAAI,UAAU,IAAA,EAAM;AACjD,YAAA,oBAAA,CAAqB,MAAM,IAAI,CAAA;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,SAAS,oBAAA,CAAqB,MAAe,IAAA,EAAoB;AAC/D,MAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,QACb,OAAA,EAAS,IAAI,IAAI,CAAA,oEAAA,CAAA;AAAA,QACjB,WAAA,EACE,iBAAiB,IAAI,CAAA,2HAAA,CAAA;AAAA,QAEvB,MAAA,EACE,4KAAA;AAAA,QAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAC5C,GAAA,EAAK;AAAA,UACH,WAAA,EACE;AAAA;AAEJ,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;AAEA,IAAO,uBAAA,GAAQA,KAAAA;;;ACnGf,IAAM,oBAAA,GAAuB,EAAA;AAC7B,IAAM,eAAA,GAAkB,EAAA;AAExB,IAAMA,KAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,yBAAA;AAAA,IACJ,IAAA,EAAM,4BAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,0DAA0D,oBAAoB,CAAA,CAAA,CAAA;AAAA,IAC3F,SAAA,EACE,2NAAA;AAAA,IAGF,OAAA,EAAS,2DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,mBAAA,EAAqB,aAAA;AAAA,MACrB,kBAAA,EAAoB,aAAA;AAAA,MACpB,uBAAA,EAAyB;AAAA,KAC1B,CAAA;AAED,IAAA,SAAS,cAAc,IAAA,EAAqB;AAC1C,MAAA,IAAI,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AAE3B,MAAA,MAAM,UAAA,GAAa,qBAAqB,IAAI,CAAA;AAC5C,MAAA,IAAI,cAAc,oBAAA,EAAsB;AAExC,MAAA,MAAM,SAAS,IAAA,CAAK,EAAA;AACpB,MAAA,MAAM,IAAA,GAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,GAAI,aAAA;AAC5C,MAAA,MAAM,SAAS,UAAA,IAAc,eAAA;AAE7B,MAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,QACb,SAAS,CAAA,UAAA,EAAa,IAAI,CAAA,+BAAA,EAAkC,UAAU,YAAY,oBAAoB,CAAA,EAAA,CAAA;AAAA,QACtG,WAAA,EACE,CAAA,6FAAA,EACmB,UAAU,CAAA,kCAAA,EAAqC,UAAU,CAAA,uEAAA,CAAA;AAAA,QAE9E,MAAA,EAAQ,SACJ,sIAAA,GAEA,wHAAA;AAAA,QAEJ,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,QAC5C,GAAA,EAAK;AAAA,UACH,WAAA,EACE;AAAA,SAGJ;AAAA,QACA,QAAA,EAAU,EAAE,UAAA;AAAW,OACxB,CAAA;AAAA,IACH;AAAA,EACF;AACF,CAAA;AAEA,IAAO,uBAAA,GAAQA,KAAAA;;;AC5Df,IAAMA,KAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,mBAAA;AAAA,IACJ,IAAA,EAAM,wBAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EACE,sFAAA;AAAA,IACF,SAAA,EACE,wLAAA;AAAA,IAEF,OAAA,EAAS,qDAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,MAC/B,iBAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,gBAAgB,CAAA;AAEpD,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,UAAA,GAAc,KAAA,CAAyC,IAAA,IAAQ,EAAC;AAEtE,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC9C,QAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,QAAA,IAAI,CAAC,IAAA,EAAM;AAEX,QAAA,IAAI,gBAAA,CAAiB,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,UAAA,MAAM,QAAA,GAAW,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA;AACjC,UAAA,IAAI,CAAC,QAAA,EAAU;AAGf,UAAA,IAAI,QAAA,CAAS,SAAS,aAAA,EAAe;AAErC,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,CAAA,uBAAA,EAA0B,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA;AAAA,YAC5C,WAAA,EACE,CAAA,oDAAA,EAAuD,IAAA,CAAK,IAAI,CAAA,+EAAA,CAAA;AAAA,YAElE,MAAA,EACE,0JAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,QAAA,EAAU,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAChD,GAAA,EAAK;AAAA,cACH,WAAA,EACE;AAAA;AACJ,WACD,CAAA;AAGD,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAEA,IAAO,iBAAA,GAAQA,KAAAA;;;AChEf,IAAM,sCAAsB,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,UAAA,EAAY,YAAY,CAAC,CAAA;AAEtE,IAAMA,KAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,sBAAA;AAAA,IACJ,IAAA,EAAM,oCAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EACE,mFAAA;AAAA,IACF,SAAA,EACE,2KAAA;AAAA,IAEF,OAAA,EAAS,wDAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,MAAM,IAAA,GAAO,cAAc,IAAI,CAAA;AAC/B,QAAA,IAAI,IAAA,IAAQ,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAA,EAAG;AACzC,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,iBAAiB,IAAI,CAAA,GAAA,CAAA;AAAA,YAC9B,WAAA,EACE,GAAG,IAAI,CAAA,8KAAA,CAAA;AAAA,YAGT,MAAA,EACE,sLAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE;AAAA;AAGJ,WACD,CAAA;AAAA,QACH;AAAA,MACF,CAAA;AAAA,MAEA,cAAc,IAAA,EAAe;AAC3B,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAI,MAAA,EAAQ,IAAA,KAAS,YAAA,IAAgB,MAAA,CAAO,SAAS,UAAA,EAAY;AAC/D,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,2CAAA;AAAA,YACT,WAAA,EACE,4JAAA;AAAA,YAEF,MAAA,EACE,qJAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE;AAAA;AAGJ,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,mBAAA,GAAQA,KAAAA;;;AC/Df,IAAM,eAAA,GAAmC;AAAA,EACvC;AAAA,IACE,IAAA,EAAM,SAAA;AAAA,IACN,OAAA,EAAS,6DAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,kBAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,qEAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,aAAA;AAAA,IACN,OAAA,EAAS,+CAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,UAAA;AAAA,IACN,OAAA,EAAS,qDAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,iEAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,oEAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,OAAA,EAAS,0DAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,OAAA,EAAS,qBAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,OAAA,EAAS,0CAAA;AAAA,IACT,WAAA,EAAa;AAAA;AAEjB,CAAA;AAGA,IAAM,oBAAA,GAAuB;AAAA,EAC3B,6DAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,cAAc,KAAA,EAAwB;AAC7C,EAAA,OAAO,qBAAqB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,KAAK,CAAC,CAAA;AACvD;AAEA,IAAMA,KAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,4BAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EAAa,6EAAA;AAAA,IACb,SAAA,EACE,gMAAA;AAAA,IAGF,OAAA,EAAS,8DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAEvC,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,KAAA,MAAW,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,MAAiB,eAAA,EAAiB;AAC5D,QAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AAGzB,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AACvD,QAAA,IAAI,UAAA,IAAc,WAAW,CAAC,CAAA,IAAK,cAAc,UAAA,CAAW,CAAC,CAAC,CAAA,EAAG;AAEjE,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,OAAA,EAAS,sBAAsB,IAAI,CAAA,UAAA,CAAA;AAAA,UACnC,WAAA,EACE,eAAe,WAAW,CAAA,0MAAA,CAAA;AAAA,UAG5B,MAAA,EACE,wLAAA;AAAA,UAEF,QAAA,EAAU;AAAA,YACR,MAAM,OAAA,CAAQ,QAAA;AAAA,YACd,MAAM,KAAA,GAAQ,CAAA;AAAA,YACd,MAAA,EAAQ;AAAA,WACV;AAAA,UACA,GAAA,EAAK;AAAA,YACH,WAAA,EACE,sNAAA;AAAA,YAGF,IAAA,EAAM;AAAA;AACR,SACD,CAAA;AAGD,QAAA;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAAC,SAAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,QAAQ,IAAA,EAAe;AACrB,QAAA,IAAI,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,EAAU;AACpC,QAAA,MAAM,MAAc,IAAA,CAAK,KAAA;AAEzB,QAAA,IAAI,GAAA,CAAI,SAAS,EAAA,EAAI;AACrB,QAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AAExB,QAAA,KAAA,MAAW,EAAE,IAAA,EAAM,OAAA,EAAS,WAAA,MAAiB,eAAA,EAAiB;AAC5D,UAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA,EAAG;AACrB,YAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,cACb,OAAA,EAAS,4CAA4C,IAAI,CAAA,CAAA,CAAA;AAAA,cACzD,WAAA,EACE,eAAe,GAAA,CAAI,KAAA,CAAM,GAAG,CAAC,CAAC,gCAAgC,WAAW,CAAA,2EAAA,CAAA;AAAA,cAE3E,MAAA,EACE,gIAAA;AAAA,cAEF,QAAA,EAAUC,YAAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,cAC5C,GAAA,EAAK;AAAA,gBACH,WAAA,EACE;AAAA;AACJ,aACD,CAAA;AACD,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,SAASD,SAAAA,CAAS,KAAc,OAAA,EAAqD;AACnF,MAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACrC,MAAA,MAAM,IAAA,GAAO,GAAA;AACb,MAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,QAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,IAAI,CAAA;AAAA,MAC3B;AACA,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,QAAA,IAAI,QAAQ,QAAA,EAAU;AACtB,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,UAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAOA,SAAAA,CAAS,MAAM,OAAO,CAAA;AAAA,QAClD,WAAW,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAW,KAAA,EAAkB;AAC5E,UAAAA,SAAAA,CAAS,OAAO,OAAO,CAAA;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,SAASC,YAAAA,CAAY,MAAe,QAAA,EAAkB;AACpD,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,QAC9B,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,MAAA,IAAU;AAAA,OACpC;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAEA,IAAO,yBAAA,GAAQF,KAAAA;;;AClLf,IAAM,YAAA,GACJ,kGAAA;AAEF,IAAM,iBAAA,GAAoB;AAAA,EACxB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,iBAAiB,IAAA,EAAwB;AAChD,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc;AAChC,IAAA,OAAO,iBAAA,CAAkB,QAAA,CAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AACpB,IAAA,IAAI,IAAA,EAAM,SAAS,YAAA,EAAc;AAC/B,MAAA,OAAO,iBAAA,CAAkB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA,IAAK,CAAA,KAAM,KAAK,IAAI,CAAA;AAAA,IACrF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,oBAAoB,GAAA,EAAsB;AACjD,EAAA,OAAO,YAAA,CAAa,KAAK,GAAG,CAAA;AAC9B;AAEA,SAAS,sBAAsB,IAAA,EAAuB;AACpD,EAAA,MAAM,MAAA,GAAU,IAAA,CAAK,MAAA,IAAoC,EAAC;AAC1D,EAAA,OAAO,MAAA,CACJ,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,MAAM,CAAA,CAAE,KAAA;AACd,IAAA,OAAO,MAAA,CAAO,GAAA,EAAK,MAAA,IAAU,GAAA,EAAK,OAAO,EAAE,CAAA;AAAA,EAC7C,CAAC,CAAA,CACA,IAAA,CAAK,KAAK,CAAA;AACf;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,wBAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EACE,gGAAA;AAAA,IACF,SAAA,EACE,gLAAA;AAAA,IAGF,OAAA,EAAS,0DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,IAAI,CAAC,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAE7B,QAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,SAAA,IAAuC,EAAC;AAC3D,QAAA,MAAM,QAAA,GAAW,KAAK,CAAC,CAAA;AACvB,QAAA,IAAI,CAAC,QAAA,EAAU;AAGf,QAAA,IAAI,QAAA,CAAS,SAAS,iBAAA,EAAmB;AACvC,UAAA,MAAM,WAAA,GAAe,QAAA,CAAS,WAAA,IAAyC,EAAC;AACxE,UAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAE9B,UAAA,MAAM,UAAA,GAAa,sBAAsB,QAAQ,CAAA;AACjD,UAAA,IAAI,CAAC,mBAAA,CAAoB,UAAU,CAAA,EAAG;AAEtC,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EACE,qFAAA;AAAA,YACF,WAAA,EACE,iNAAA;AAAA,YAGF,MAAA,EACE,yKAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE,+HAAA;AAAA,cAEF,IAAA,EACE;AAAA;AAIJ,WACD,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,QAAA,CAAS,IAAA,KAAS,kBAAA,IAAsB,QAAA,CAAS,aAAa,GAAA,EAAK;AACrE,UAAA,MAAM,OAAA,GAAU,sBAAsB,QAAQ,CAAA;AAC9C,UAAA,IAAI,OAAA,IAAW,mBAAA,CAAoB,OAAO,CAAA,EAAG;AAC3C,YAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,cACb,OAAA,EAAS,4DAAA;AAAA,cACT,WAAA,EACE,qJAAA;AAAA,cAEF,MAAA,EACE,4HAAA;AAAA,cAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,cAC5C,GAAA,EAAK;AAAA,gBACH,WAAA,EACE,8FAAA;AAAA,gBAEF,IAAA,EAAM;AAAA;AACR,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAED,IAAA,SAAS,sBAAsB,IAAA,EAA8B;AAC3D,MAAA,IAAI,KAAK,IAAA,KAAS,SAAA,IAAa,OAAO,IAAA,CAAK,UAAU,QAAA,EAAU;AAC7D,QAAA,OAAO,IAAA,CAAK,KAAA;AAAA,MACd;AACA,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,kBAAA,IAAsB,IAAA,CAAK,aAAa,GAAA,EAAK;AAC7D,QAAA,OAAO,qBAAA,CAAsB,KAAK,IAAe,CAAA;AAAA,MACnD;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;AAEA,IAAO,qBAAA,GAAQA,MAAAA;;;AC3Jf,IAAM,uBAAA,uBAA8B,GAAA,CAAI;AAAA,EACtC,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,0BAA0B,IAAA,EAAwB;AACzD,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AACpB,IAAA,IAAI,IAAA,EAAM,SAAS,YAAA,EAAc;AAC/B,MAAA,OAAO,uBAAA,CAAwB,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc;AAChC,IAAA,OAAO,uBAAA,CAAwB,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAkB,IAAA,EAAwB;AACjD,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,SAAA,IAAuC,EAAC;AAC3D,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAGnB,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,SAAA,EAAW,OAAO,KAAA;AAGrC,EAAA,IAAI,KAAA,CAAM,SAAS,iBAAA,EAAmB;AACpC,IAAA,MAAM,WAAA,GAAe,KAAA,CAAM,WAAA,IAAyC,EAAC;AACrE,IAAA,OAAO,YAAY,MAAA,GAAS,CAAA;AAAA,EAC9B;AAGA,EAAA,OAAO,IAAA;AACT;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,4BAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EACE,mGAAA;AAAA,IACF,SAAA,EACE,4JAAA;AAAA,IAEF,OAAA,EAAS,8DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,IAAI,CAAC,yBAAA,CAA0B,IAAI,CAAA,EAAG;AACtC,QAAA,IAAI,CAAC,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAE9B,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,MAAM,OACJ,MAAA,CAAO,IAAA,KAAS,qBACX,MAAA,CAAO,QAAA,CAAqB,OAC5B,MAAA,CAAmB,IAAA;AAG1B,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,OAAA,EAAS,wEAAwE,IAAI,CAAA,GAAA,CAAA;AAAA,UACrF,WAAA,EACE,yBAAyB,IAAI,CAAA,8MAAA,CAAA;AAAA,UAG/B,MAAA,EACE,8IAAA;AAAA,UAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC5C,GAAA,EAAK;AAAA,YACH,WAAA,EACE,sKAAA;AAAA,YAEF,IAAA,EAAM;AAAA;AACR,SACD,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,yBAAA,GAAQA,MAAAA;;;AChGf,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,UAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,wBAAwB,IAAA,EAAwB;AACvD,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,EAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AACpB,IAAA,IAAI,MAAM,IAAA,KAAS,YAAA,EAAc,UAAA,GAAa,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAChE,CAAA,MAAA,IAAW,MAAA,CAAO,IAAA,KAAS,YAAA,EAAc;AACvC,IAAA,UAAA,GAAa,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,CAAC,UAAA,IAAc,CAAC,iBAAiB,GAAA,CAAI,UAAU,GAAG,OAAO,KAAA;AAE7D,EAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,SAAA,IAAuC,EAAC;AAC3D,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAEnB,EAAA,OAAO,MAAM,IAAA,KAAS,SAAA;AACxB;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,yBAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,UAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EACE,0FAAA;AAAA,IACF,SAAA,EACE,mJAAA;AAAA,IAEF,OAAA,EAAS,2DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,IAAI,uBAAA,CAAwB,IAAI,CAAA,EAAG;AACjC,UAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,UAAA,MAAM,IAAA,GACJ,MAAA,CAAO,IAAA,KAAS,kBAAA,GACZ,MAAA,CAAQ,MAAA,CAAO,QAAA,CAAqB,IAAI,CAAA,GACxC,MAAA,CAAQ,MAAA,CAAmB,IAAI,CAAA;AAErC,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,sDAAsD,IAAI,CAAA,GAAA,CAAA;AAAA,YACnE,WAAA,EACE,GAAG,IAAI,CAAA,mLAAA,CAAA;AAAA,YAGT,MAAA,EACE,kLAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE,oFAAA;AAAA,cACF,IAAA,EAAM;AAAA;AACR,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,sBAAA,GAAQA,MAAAA;;;AClFf,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,eAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,kBAAkB,IAAA,EAA8B;AACvD,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,OAAO,IAAA,KAAS,YAAA,EAAc,OAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AAE3D,EAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,IAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AACnB,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AAEpB,IAAA,IAAI,GAAA,EAAK,IAAA,KAAS,YAAA,IAAgB,IAAA,EAAM,SAAS,YAAA,EAAc;AAC7D,MAAA,OAAO,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,8BAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EAAa,wEAAA;AAAA,IACb,SAAA,EACE,yNAAA;AAAA,IAGF,OAAA,EAAS,gEAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA;AAAA,MAEpB,qBAAqB,IAAA,EAAe;AAClC,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,IAAI,CAAC,IAAA,EAAM;AAEX,QAAA,IAAI,IAAA,CAAK,SAAS,kBAAA,EAAoB;AACtC,QAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAEpB,QAAA,MAAM,OAAO,IAAA,CAAK,QAAA;AAClB,QAAA,IAAI,CAAC,IAAA,EAAM;AAGX,QAAA,IAAI,IAAA,CAAK,SAAS,SAAA,EAAW;AAC3B,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAC7B,UAAA,IAAI,GAAA,KAAQ,WAAA,IAAe,GAAA,KAAQ,aAAA,IAAiB,QAAQ,WAAA,EAAa;AACvE,YAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,cACb,OAAA,EAAS,qCAAqC,GAAG,CAAA,gCAAA,CAAA;AAAA,cACjD,WAAA,EACE,qBAAqB,GAAG,CAAA,6GAAA,CAAA;AAAA,cAE1B,MAAA,EACE,kKAAA;AAAA,cAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,cAC5C,GAAA,EAAK;AAAA,gBACH,WAAA,EACE;AAAA;AAEJ,aACD,CAAA;AAAA,UACH;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EACE,mFAAA;AAAA,YACF,WAAA,EACE,oJAAA;AAAA,YAEF,MAAA,EACE,2IAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE;AAAA;AAGJ,WACD,CAAA;AAAA,QACH;AAAA,MACF,CAAA;AAAA;AAAA,MAGA,eAAe,IAAA,EAAe;AAC5B,QAAA,MAAM,IAAA,GAAO,kBAAkB,IAAI,CAAA;AACnC,QAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA,EAAG;AAEzC,QAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,SAAA,IAAuC,EAAC;AAC3D,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AAGrB,QAAA,MAAM,MAAA,GAAS,KAAK,CAAC,CAAA;AACrB,QAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,GAAG,IAAI,CAAA,+DAAA,CAAA;AAAA,YAChB,WAAA,EACE,GAAG,IAAI,CAAA,+LAAA,CAAA;AAAA,YAGT,MAAA,EACE,iKAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE,4CAA4C,IAAI,CAAA,+HAAA;AAAA;AAGpD,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,2BAAA,GAAQA,MAAAA;;;AC5If,IAAM,oBAAA,mBAAuB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAM,CAAC,CAAA;AAC1F,IAAM,oCAAoB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAEhD,IAAM,gBAAA,GACJ,uFAAA;AAEF,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,sBAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EACE,4FAAA;AAAA,IACF,SAAA,EACE,8NAAA;AAAA,IAGF,OAAA,EAAS,wDAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,QAAA,IACE,MAAA,CAAO,SAAS,kBAAA,IACf,MAAA,CAAO,QAAoB,IAAA,KAAS,YAAA,IACrC,MAAA,CAAQ,MAAA,CAAO,MAAA,CAAmB,IAAI,MAAM,MAAA,IAC3C,MAAA,CAAO,UAAsB,IAAA,KAAS,YAAA,IACvC,OAAQ,MAAA,CAAO,QAAA,CAAqB,IAAI,CAAA,KAAM,QAAA,EAC9C;AACA,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,gDAAA;AAAA,YACT,WAAA,EAAa,gBAAA;AAAA,YACb,MAAA,EACE,uIAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE,2EAAA;AAAA,cACF,IAAA,EAAM;AAAA;AACR,WACD,CAAA;AAAA,QACH;AAGA,QAAA,IACE,MAAA,CAAO,IAAA,KAAS,kBAAA,IACf,MAAA,CAAO,QAAA,EAAsB,IAAA,KAAS,YAAA,IACvC,MAAA,CAAQ,MAAA,CAAO,QAAA,CAAqB,IAAI,CAAA,KAAM,YAAA,EAC9C;AACA,UAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,SAAA,IAAuC,EAAC;AAC3D,UAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AAEtB,UAAA,IAAI,OAAA,EAAS,SAAS,SAAA,EAAW;AAC/B,YAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,EAAE,WAAA,EAAY;AAC/C,YAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,IAAI,CAAA,EAAG;AAClC,cAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,gBACb,OAAA,EAAS,CAAA,qBAAA,EAAwB,OAAA,CAAQ,KAAK,CAAA,uBAAA,CAAA;AAAA,gBAC9C,WAAA,EACE,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,6JAAA,CAAA;AAAA,gBAGlB,MAAA,EACE,8IAAA;AAAA,gBAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,gBAC5C,GAAA,EAAK;AAAA,kBACH,WAAA,EACE;AAAA;AAEJ,eACD,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAGA,QAAA,IACE,MAAA,CAAO,IAAA,KAAS,kBAAA,IACf,MAAA,CAAO,QAAA,EAAsB,IAAA,KAAS,YAAA,IACvC,MAAA,CAAQ,MAAA,CAAO,QAAA,CAAqB,IAAI,CAAA,KAAM,gBAAA,EAC9C;AACA,UAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,SAAA,IAAuC,EAAC;AAC3D,UAAA,MAAM,OAAA,GAAU,KAAK,CAAC,CAAA;AAEtB,UAAA,IAAI,OAAA,EAAS,SAAS,SAAA,EAAW;AAC/B,YAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,KAAK,EAAE,WAAA,EAAY;AAC/C,YAAA,IAAI,CAAC,GAAG,iBAAiB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AACxD,cAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,gBACb,OAAA,EAAS,CAAA,gCAAA,EAAmC,OAAA,CAAQ,KAAK,CAAA,EAAA,CAAA;AAAA,gBACzD,WAAA,EACE,CAAA,4JAAA,CAAA;AAAA,gBAEF,MAAA,EACE,+HAAA;AAAA,gBAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,gBAC5C,GAAA,EAAK;AAAA,kBACH,WAAA,EACE;AAAA;AAEJ,eACD,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,mBAAA,GAAQA,MAAAA;;;ACvHf,SAAS,gBAAA,CAAiB,OAAkB,OAAA,EAAsC;AAChF,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,SAAS,UAAA,EAAY;AAC9B,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA;AACjB,IAAA,MAAM,MAAA,GACJ,GAAA,EAAK,IAAA,KAAS,YAAA,GACV,OAAO,GAAA,CAAI,IAAI,CAAA,GACf,GAAA,EAAK,IAAA,KAAS,SAAA,GACZ,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAChB,IAAA;AAER,IAAA,IAAI,WAAW,OAAA,EAAS;AACtB,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAiB,IAAA,EAA0C;AAClE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,IAAa,OAAO,KAAK,KAAA,KAAU,QAAA,SAAiB,IAAA,CAAK,KAAA;AAC3E,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAe,IAAA,EAA2C;AACjE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,IAAA,CAAK,SAAS,SAAA,IAAa,OAAO,KAAK,KAAA,KAAU,SAAA,SAAkB,IAAA,CAAK,KAAA;AAC5E,EAAA,OAAO,IAAA;AACT;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,yBAAA;AAAA,IACJ,IAAA,EAAM,uCAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EACE,gGAAA;AAAA,IACF,SAAA,EACE,2LAAA;AAAA,IAGF,OAAA,EAAS,2DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,QAAA,MAAM,aACH,MAAA,CAAO,IAAA,KAAS,YAAA,IAAgB,MAAA,CAAO,OAAO,IAAI,CAAA,KAAM,MAAA,IACxD,MAAA,CAAO,SAAS,kBAAA,IACf,MAAA,CAAQ,MAAA,CAAO,QAAA,CAAqB,IAAI,CAAA,KAAM,MAAA;AAElD,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,MAAM,IAAA,GAAQ,IAAA,CAAK,SAAA,IAAuC,EAAC;AAC3D,UAAA,MAAM,SAAA,GAAY,KAAK,CAAC,CAAA;AAExB,UAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,kBAAA,EAAoB;AAEzD,UAAA,MAAM,KAAA,GAAS,SAAA,CAAU,UAAA,IAAwC,EAAC;AAClE,UAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,EAAO,QAAQ,CAAA;AAEnD,UAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,UAAA,MAAM,SAAA,GAAY,iBAAiB,UAAU,CAAA;AAC7C,UAAA,MAAM,UAAA,GAAa,eAAe,UAAU,CAAA;AAE5C,UAAA,IAAI,SAAA,KAAc,GAAA,IAAO,UAAA,KAAe,IAAA,EAAM;AAC5C,YAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,cACb,SAAS,CAAA,wCAAA,EAA2C,IAAA,CAAK,SAAA,CAAU,SAAA,IAAa,UAAU,CAAC,CAAA,CAAA,CAAA;AAAA,cAC3F,WAAA,EACE,+MAAA;AAAA,cAGF,MAAA,EACE,qIAAA;AAAA,cAEF,QAAA,EAAU,WAAA,CAAY,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAAA,cAClD,GAAA,EAAK;AAAA,gBACH,WAAA,EACE,gIAAA;AAAA,gBAEF,IAAA,EAAM;AAAA;AACR,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MAEA,iBAAiB,IAAA,EAAe;AAC9B,QAAA,MAAM,KAAA,GAAS,IAAA,CAAK,UAAA,IAAwC,EAAC;AAG7D,QAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AACvD,QAAA,IAAI,YAAA,IAAgB,cAAA,CAAe,YAAY,CAAA,KAAM,KAAA,EAAO;AAC1D,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,yCAAA;AAAA,YACT,WAAA,EACE,8JAAA;AAAA,YAEF,MAAA,EACE,wIAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,YAAA,EAAc,OAAA,CAAQ,QAAQ,CAAA;AAAA,YACpD,GAAA,EAAK;AAAA,cACH,WAAA,EACE;AAAA;AAEJ,WACD,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,EAAO,QAAQ,CAAA;AACnD,QAAA,IAAI,UAAA,IAAc,cAAA,CAAe,UAAU,CAAA,KAAM,KAAA,EAAO;AACtD,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,uCAAA;AAAA,YACT,WAAA,EACE,gJAAA;AAAA,YAEF,MAAA,EACE,wHAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAClD,GAAA,EAAK;AAAA,cACH,WAAA,EACE,6HAAA;AAAA,cAEF,IAAA,EAAM;AAAA;AACR,WACD,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AACvD,QAAA,IAAI,gBAAgB,gBAAA,CAAiB,YAAY,CAAA,EAAG,WAAA,OAAkB,MAAA,EAAQ;AAC5E,UAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,KAAA,EAAO,QAAQ,CAAA;AACpD,UAAA,IAAI,CAAC,WAAA,IAAe,cAAA,CAAe,WAAW,MAAM,IAAA,EAAM;AACxD,YAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,cACb,OAAA,EAAS,mDAAA;AAAA,cACT,WAAA,EACE,+JAAA;AAAA,cAEF,MAAA,EACE,6JAAA;AAAA,cAEF,QAAA,EAAU,WAAA,CAAY,YAAA,EAAc,OAAA,CAAQ,QAAQ,CAAA;AAAA,cACpD,GAAA,EAAK;AAAA,gBACH,WAAA,EACE;AAAA;AACJ,aACD,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,sBAAA,GAAQA,MAAAA;;;AC5Jf,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,OAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,YAAY,IAAA,EAA8B;AACjD,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,IAAI,OAAO,IAAA,KAAS,YAAA,EAAc,OAAO,MAAA,CAAO,OAAO,IAAI,CAAA;AAE3D,EAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AACpB,IAAA,IAAI,MAAM,IAAA,KAAS,YAAA,EAAc,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,iBAAiB,IAAA,EAAwB;AAEhD,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,kBAAA,IAAsB,MAAA,CAAO,SAAS,gBAAA,EAAkB;AAC1E,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,iBAAA,EAAmB,OAAO,IAAA;AAG9C,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,iBAAA,EAAmB,OAAO,IAAA;AAG9C,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,oBAAA,EAAsB,OAAO,IAAA;AACjD,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,sBAAA,EAAwB,OAAO,IAAA;AAEnD,EAAA,OAAO,KAAA;AACT;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,+BAAA;AAAA,IACJ,IAAA,EAAM,mBAAA;AAAA,IACN,QAAA,EAAU,aAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EACE,4FAAA;AAAA,IACF,SAAA,EACE,iMAAA;AAAA,IAGF,OAAA,EAAS,iEAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AAGd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,oBAAoB,IAAA,EAAe;AACjC,QAAA,MAAM,OAAO,IAAA,CAAK,UAAA;AAClB,QAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,gBAAA,EAAkB;AAE7C,QAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAC7B,QAAA,IAAI,CAAC,IAAA,EAAM;AAEX,QAAA,IAAI,CAAC,gBAAA,CAAiB,GAAA,CAAI,IAAI,CAAA,EAAG;AAIjC,QAAA,IAAI,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAE5B,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,OAAA,EAAS,yCAAyC,IAAI,CAAA,6BAAA,CAAA;AAAA,UACtD,WAAA,EACE,GAAG,IAAI,CAAA,oIAAA,CAAA;AAAA,UAET,MAAA,EACE,oJAAA;AAAA,UAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC5C,GAAA,EAAK;AAAA,YACH,WAAA,EACE,6FAAA;AAAA,YACF,IAAA,EAAM;AAAA;AACR,SACD,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,yBAAA,GAAQA,MAAAA;;;AC7Hf,SAAS,gBAAgB,IAAA,EAAwB;AAC/C,EAAA,OAAA,CACG,IAAA,CAAK,IAAA,KAAS,qBAAA,IACb,IAAA,CAAK,IAAA,KAAS,wBACd,IAAA,CAAK,IAAA,KAAS,yBAAA,KAChB,IAAA,CAAK,KAAA,KAAU,IAAA;AAEnB;AAEA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,OAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,SAAS,WAAW,IAAA,EAAwB;AAC1C,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,gBAAA,EAAkB,OAAO,KAAA;AAE3C,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,EAAA,IAAI,CAAC,QAAQ,OAAO,KAAA;AAEpB,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,YAAA,IAAgB,YAAA,CAAa,GAAA,CAAI,OAAO,MAAA,CAAO,IAAI,CAAC,CAAA,EAAG,OAAO,IAAA;AAElF,EAAA,IAAI,MAAA,CAAO,SAAS,kBAAA,EAAoB;AACtC,IAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AACpB,IAAA,IAAI,IAAA,EAAM,IAAA,KAAS,YAAA,IAAgB,YAAA,CAAa,GAAA,CAAI,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,OAAO,IAAA;AAAA,EACjF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,2BAAA;AAAA,IACJ,IAAA,EAAM,eAAA;AAAA,IACN,QAAA,EAAU,aAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EACE,2FAAA;AAAA,IACF,SAAA,EACE,kNAAA;AAAA,IAGF,OAAA,EAAS,6DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,mBAAA,EAAqB,YAAA;AAAA,MACrB,kBAAA,EAAoB,YAAA;AAAA,MACpB,uBAAA,EAAyB;AAAA,KAC1B,CAAA;AAED,IAAA,SAAS,aAAa,EAAA,EAAmB;AACvC,MAAA,IAAI,CAAC,eAAA,CAAgB,EAAE,CAAA,EAAG;AAE1B,MAAA,MAAM,OAAO,EAAA,CAAG,IAAA;AAChB,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,IAAI,IAAA,CAAK,SAAS,gBAAA,EAAkB;AAClC,QAAA,IAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACpB,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,uDAAA;AAAA,YACT,WAAA,EACE,oLAAA;AAAA,YAEF,MAAA,EACE,kKAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,EAAA,EAAI,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC1C,GAAA,EAAK;AAAA,cACH,WAAA,EAAa,gEAAA;AAAA,cACb,IAAA,EAAM;AAAA;AACR,WACD,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAGA,MAAA,MAAM,UAAA,GAAc,IAAA,CAAwC,IAAA,IAAQ,EAAC;AAErE,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,QAAA,IAAI,IAAA,CAAK,SAAS,iBAAA,EAAmB;AAErC,QAAA,MAAM,YAAY,IAAA,CAAK,QAAA;AACvB,QAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,iDAAA;AAAA,YACT,WAAA,EACE,4OAAA;AAAA,YAGF,MAAA,EACE,4JAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE,yEAAA;AAAA,cACF,IAAA,EAAM;AAAA;AACR,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAEA,IAAO,qBAAA,GAAQA,MAAAA;;;AC/Hf,SAAS,iBAAiB,IAAA,EAAwB;AAChD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,EAAM,gBAAgB,CAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,IAAA,EAAM,iBAAiB,CAAA;AAC/C,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,EAAM,gBAAgB,CAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA;AAE9B,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,IAAA,EAA2C;AAChE,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,OAAO,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,KAAA,KAAU,IAAA;AACnD;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,2BAAA;AAAA,IACJ,IAAA,EAAM,yBAAA;AAAA,IACN,QAAA,EAAU,aAAA;AAAA,IACV,QAAA,EAAU,MAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,WAAA,EAAa,0EAAA;AAAA,IACb,SAAA,EACE,6MAAA;AAAA,IAGF,OAAA,EAAS,6DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,IAAI,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG;AAE1B,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,IAAI,CAAC,IAAA,EAAM;AAEX,QAAA,IAAI,CAAC,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAC3B,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,4DAAA;AAAA,YACT,WAAA,EACE,yJAAA;AAAA,YAEF,MAAA,EACE,mJAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE;AAAA;AAEJ,WACD,CAAA;AAAA,QACH;AAAA,MACF,CAAA;AAAA,MAEA,aAAa,IAAA,EAAe;AAE1B,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,IAAI,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAW;AAEzC,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,IAAI,CAAC,IAAA,EAAM;AAEX,QAAA,IAAI,CAAC,gBAAA,CAAiB,IAAI,CAAA,EAAG;AAC3B,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,wDAAA;AAAA,YACT,WAAA,EACE,iGAAA;AAAA,YAEF,MAAA,EAAQ,4EAAA;AAAA,YACR,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE;AAAA;AACJ,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,qBAAA,GAAQA,MAAAA;;;AClGf,IAAMG,UAAAA,GAAY,GAAA;AAClB,IAAM,aAAA,GAAgB,GAAA;AAEtB,IAAMH,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,4BAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,iBAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,kCAAkCG,UAAS,CAAA,OAAA,CAAA;AAAA,IACxD,SAAA,EACE,oNAAA;AAAA,IAGF,OAAA,EAAS,8DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA;AAE7C,IAAA,IAAI,aAAaA,UAAAA,EAAW;AAE5B,IAAA,MAAM,YAAY,SAAA,GAAY,aAAA;AAE9B,IAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,MACb,OAAA,EAAS,CAAA,QAAA,EAAW,SAAS,CAAA,oBAAA,EAAuBA,UAAS,CAAA,EAAA,CAAA;AAAA,MAC7D,WAAA,EACE,sBAAsB,SAAS,CAAA,gJAAA,CAAA;AAAA,MAEjC,MAAA,EAAQ,YACJ,uIAAA,GAEA,sIAAA;AAAA,MAEJ,QAAA,EAAU;AAAA,QACR,MAAM,OAAA,CAAQ,QAAA;AAAA,QACd,IAAA,EAAM,CAAA;AAAA,QACN,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,GAAA,EAAK;AAAA,QACH,WAAA,EACE;AAAA,OAGJ;AAAA,MACA,QAAA,EAAU,EAAE,SAAA;AAAU,KACvB,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,kBAAA,GAAQH,MAAAA;ACxCf,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,kCAAA;AAAA,IACJ,IAAA,EAAM,2BAAA;AAAA,IACN,QAAA,EAAU,iBAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,KAAA;AAAA,IACZ,WAAA,EAAa,4EAAA;AAAA,IACb,SAAA,EACE,2LAAA;AAAA,IAGF,OAAA,EAAS,oEAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,MAAM,GAAA,GAAMD,KAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AACzC,IAAA,MAAM,IAAA,GAAOA,MAAK,QAAA,CAAS,OAAA,CAAQ,UAAUA,KAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAG3E,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,mBAAmB,CAAA;AAExD,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,MAAM,MAAM,GAAA,CAAI,MAAA;AAChB,MAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,KAAS,SAAA,EAAW;AAEpC,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACnC,MAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,EAAG;AAGjC,MAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAA;AAC7C,MAAA,MAAM,YAAA,GAAeA,KAAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAG3C,MAAA,IAAI,YAAA,KAAiB,WAAWA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,KAAM,GAAA,IAAO,SAAS,OAAA,EAAS;AAClF,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,OAAA,EAAS,gBAAgB,UAAU,CAAA,mCAAA,CAAA;AAAA,UACnC,WAAA,EACE,2BAA2B,UAAU,CAAA,2HAAA,CAAA;AAAA,UAEvC,MAAA,EACE,mKAAA;AAAA,UAEF,QAAA,EAAU;AAAA,YACR,MAAM,OAAA,CAAQ,QAAA;AAAA,YACd,IAAA,EAAM,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,YAC7B,MAAA,EAAQ,GAAA,CAAI,GAAA,EAAK,KAAA,CAAM,MAAA,IAAU;AAAA,WACnC;AAAA,UACA,GAAA,EAAK;AAAA,YACH,WAAA,EACE;AAAA;AAEJ,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAEA,IAAO,wBAAA,GAAQC,MAAAA;;;ACtEf,IAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,EAC5B,aAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,eAAA,EAAiB,cAAA,EAAgB,cAAc,CAAC,CAAA;AAEjF,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,qCAAA;AAAA,IACJ,IAAA,EAAM,yBAAA;AAAA,IACN,QAAA,EAAU,sBAAA;AAAA,IACV,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,8EAAA;AAAA,IACb,SAAA,EACE,wIAAA;AAAA,IAEF,OAAA,EAAS,uEAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AACd,IAAA,QAAA,CAAS,QAAQ,GAAA,EAAK;AAAA,MACpB,eAAe,IAAA,EAAe;AAC5B,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,kBAAA,EAAoB;AAEnD,QAAA,MAAM,MAAM,MAAA,CAAO,MAAA;AACnB,QAAA,MAAM,OAAO,MAAA,CAAO,QAAA;AAEpB,QAAA,IACE,GAAA,EAAK,IAAA,KAAS,YAAA,IACd,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,KAAM,SAAA,IACrB,IAAA,EAAM,IAAA,KAAS,YAAA,EACf;AACA,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC/B,QAAA,MAAM,QAAA,GAAW,WAAW,MAAM,CAAA,CAAA;AAElC,QAAA,IAAI,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAA,EAAG;AAEnC,QAAA,IAAI,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC/B,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,GAAG,QAAQ,CAAA,4CAAA,CAAA;AAAA,YACpB,WAAA,EACE,GAAG,QAAQ,CAAA,gOAAA,CAAA;AAAA,YAGb,MAAA,EACE,iJAAA;AAAA,YAEF,QAAA,EAAU,WAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,YAC5C,GAAA,EAAK;AAAA,cACH,WAAA,EACE,wJAAA;AAAA,cAEF,IAAA,EAAM;AAAA;AACR,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAA;AAEA,IAAO,sBAAA,GAAQA,MAAAA;;;ACzEf,IAAM,iBAAA,GAAoB,4DAAA;AAC1B,IAAM,gBAAA,GACJ,6FAAA;AACF,IAAM,mBAAA,GAAsB,8CAAA;AAC5B,IAAM,wBAAA,GAA2B;AAAA,EAC/B,uCAAA;AAAA,EACA,gEAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAMA,MAAAA,GAAa;AAAA,EACjB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,wCAAA;AAAA,IACJ,IAAA,EAAM,kDAAA;AAAA,IACN,QAAA,EAAU,sBAAA;AAAA,IACV,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,MAAA;AAAA,IACZ,WAAA,EACE,2FAAA;AAAA,IACF,SAAA,EACE,yJAAA;AAAA,IAEF,OAAA,EAAS,0EAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAO,OAAA,EAAS;AAEd,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,MAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,OAAA,EAAS,mCAAA;AAAA,UACT,WAAA,EACE,uJAAA;AAAA,UAEF,MAAA,EACE,qIAAA;AAAA,UAEF,QAAA,EAAU,EAAE,IAAA,EAAM,OAAA,CAAQ,UAAU,IAAA,EAAM,KAAA,GAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,UAC/D,GAAA,EAAK;AAAA,YACH,WAAA,EACE,4EAAA;AAAA,YACF,IAAA,EAAM;AAAA;AACR,SACD,CAAA;AAAA,MACH;AAEA,MAAA,KAAA,MAAW,WAAW,wBAAA,EAA0B;AAC9C,QAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG;AACtB,UAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,YACb,OAAA,EAAS,0CAAA;AAAA,YACT,WAAA,EACE,gMAAA;AAAA,YAEF,MAAA,EACE,0JAAA;AAAA,YAEF,QAAA,EAAU,EAAE,IAAA,EAAM,OAAA,CAAQ,UAAU,IAAA,EAAM,KAAA,GAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE;AAAA,YAC/D,GAAA,EAAK;AAAA,cACH,WAAA,EACE;AAAA;AACJ,WACD,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAGD,IAAAC,SAAAA,CAAS,QAAQ,GAAA,EAAK;AAAA;AAAA,MAEpB,qBAAqB,IAAA,EAAe;AAClC,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAEnB,QAAA,IAAI,IAAA,EAAM,SAAS,YAAA,EAAc;AACjC,QAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG;AAC/C,QAAA,IAAI,KAAA,EAAO,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,UAAU,IAAA,EAAM;AAEvD,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,OAAA,EAAS,CAAA,YAAA,EAAe,IAAA,CAAK,IAAI,CAAA,iBAAA,CAAA;AAAA,UACjC,WAAA,EACE,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,4KAAA,CAAA;AAAA,UAG5B,MAAA,EACE,uIAAA;AAAA,UAEF,QAAA,EAAUC,YAAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC5C,GAAA,EAAK;AAAA,YACH,WAAA,EACE;AAAA;AACJ,SACD,CAAA;AAAA,MACH,CAAA;AAAA;AAAA,MAGA,mBAAmB,IAAA,EAAe;AAChC,QAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAChB,QAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,QAAA,IAAI,EAAA,EAAI,SAAS,YAAA,EAAc;AAC/B,QAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,OAAO,EAAA,CAAG,IAAI,CAAC,CAAA,EAAG;AAC7C,QAAA,IAAI,IAAA,EAAM,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,UAAU,IAAA,EAAM;AAErD,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,OAAA,EAAS,CAAA,YAAA,EAAe,EAAA,CAAG,IAAI,CAAA,sBAAA,CAAA;AAAA,UAC/B,WAAA,EACE,CAAA,CAAA,EAAI,EAAA,CAAG,IAAI,CAAA,0FAAA,CAAA;AAAA,UAEb,MAAA,EACE,kIAAA;AAAA,UAEF,QAAA,EAAUA,YAAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC5C,GAAA,EAAK;AAAA,YACH,WAAA,EACE;AAAA;AACJ,SACD,CAAA;AAAA,MACH,CAAA;AAAA;AAAA,MAGA,oBAAoB,IAAA,EAAe;AACjC,QAAA,MAAM,KAAK,IAAA,CAAK,EAAA;AAChB,QAAA,IAAI,CAAC,MAAM,CAAC,mBAAA,CAAoB,KAAK,MAAA,CAAO,EAAA,CAAG,IAAI,CAAC,CAAA,EAAG;AAEvD,QAAA,OAAA,CAAQ,MAAA,CAAO;AAAA,UACb,OAAA,EAAS,CAAA,UAAA,EAAa,EAAA,CAAG,IAAI,CAAA,8CAAA,CAAA;AAAA,UAC7B,WAAA,EACE,CAAA,UAAA,EAAa,EAAA,CAAG,IAAI,CAAA,wFAAA,CAAA;AAAA,UAEtB,MAAA,EACE,gIAAA;AAAA,UAEF,QAAA,EAAUA,YAAAA,CAAY,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,UAC5C,GAAA,EAAK;AAAA,YACH,WAAA,EACE;AAAA;AACJ,SACD,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAED,IAAA,SAASD,SAAAA,CAAS,KAAc,OAAA,EAAqD;AACnF,MAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AACrC,MAAA,MAAM,IAAA,GAAO,GAAA;AACb,MAAA,IAAI,OAAO,KAAK,IAAA,KAAS,QAAA,UAAkB,IAAA,CAAK,IAAI,IAAI,IAAI,CAAA;AAC5D,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,QAAA,IAAI,QAAQ,QAAA,EAAU;AACtB,QAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,UAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAOA,SAAAA,CAAS,MAAM,OAAO,CAAA;AAAA,QAClD,WAAW,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,UAAW,KAAA,EAAkB;AAC5E,UAAAA,SAAAA,CAAS,OAAO,OAAO,CAAA;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,SAASC,YAAAA,CAAY,MAAe,QAAA,EAAkB;AACpD,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,QAC9B,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,MAAA,IAAU;AAAA,OACpC;AAAA,IACF;AAAA,EACF;AACF,CAAA;AAEA,IAAO,yBAAA,GAAQF,MAAAA;;;AC1IR,IAAM,cAAA,GAAyB;AAAA;AAAA,EAEpC,mBAAA;AAAA,EACA,2BAAA;AAAA,EACA,sBAAA;AAAA,EACA,yBAAA;AAAA,EACA,uBAAA;AAAA,EACA,uBAAA;AAAA,EACA,iBAAA;AAAA;AAAA,EAGA,mBAAA;AAAA,EACA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,yBAAA;AAAA,EACA,sBAAA;AAAA,EACA,2BAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA;AAAA,EAGA,yBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA;AAAA,EAGA,kBAAA;AAAA,EACA,wBAAA;AAAA;AAAA,EAGA,sBAAA;AAAA,EACA;AACF,CAAA;;;ACxCA,eAAe,cAAc,IAAA,EAAkD;AAC7E,EAAA,MAAM,KAAK,MAAA,EAAO;AAElB,EAAA,MAAM,aAAA,GAAgBD,KAAAA,CAAK,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA;AAClD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMK,GAAA,CAAG,QAAA,CAAS,eAAe,OAAO,CAAA;AACxD,IAAA,EAAA,CAAG,IAAI,OAAO,CAAA;AAAA,EAChB,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,EAAA;AACT;AAEA,eAAsB,cAAc,MAAA,EAA2C;AAC7E,EAAA,MAAM,KAAA,GAAQ,MAAM,EAAA,CAAG,MAAA,CAAO,OAAA,EAAS;AAAA,IACrC,KAAK,MAAA,CAAO,IAAA;AAAA,IACZ,QAAQ,MAAA,CAAO,OAAA;AAAA,IACf,QAAA,EAAU,IAAA;AAAA,IACV,mBAAA,EAAqB,KAAA;AAAA,IACrB,SAAA,EAAW;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,EAAA,GAAK,MAAM,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAG1C,EAAA,IAAI,MAAA,CAAO,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AACpC,IAAA,EAAA,CAAG,GAAA,CAAI,OAAO,cAAc,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AACzB,IAAA,IAAI,YAAA,CAAa,CAAC,CAAA,EAAG,OAAO,KAAA;AAE5B,IAAA,MAAM,QAAA,GAAWL,KAAAA,CAAK,QAAA,CAAS,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7C,IAAA,IAAI;AACF,MAAA,OAAO,CAAC,EAAA,CAAG,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,YAAY,OAAA,EAAqC;AACxD,EAAA,MAAM,MAAA,GAAS,IAAI,UAAA,EAAW;AAC9B,EAAA,MAAA,CAAO,YAAY,cAAc,CAAA;AACjC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YAAA,CAAa,QAAiB,MAAA,EAAwB;AAC7D,EAAA,MAAM,UAAA,GAA6B;AAAA,IACjC,SAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC7C,IAAA,MAAM,YAAY,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,GAAG,CAAA;AAGzD,IAAA,MAAM,UAAA,GAAqC;AAAA,MACzC,QAAA,EAAU,EAAA;AAAA,MACV,IAAA,EAAM,EAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAA,EAAI,CAAC,CAAA;AAE1F,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,cAAc,CAAA;AAE5C,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,GAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,YAAY,SAAA,CAAU,MAAA;AAAA,MACtB,aAAA,EAAe,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,UAAU,CAAA,CAAE,MAAA;AAAA,MAClE,SAAA,EAAW,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,MAAM,CAAA,CAAE,MAAA;AAAA,MAC1D,WAAA,EAAa,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA,CAAE,MAAA;AAAA,MAC9D,QAAA,EAAU,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,KAAK,CAAA,CAAE;AAAA,KAC1D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA,GAAI,cAAA,CAAe,MAAA;AAErF,EAAA,MAAM,KAAA,GAAQ,aAAa,OAAO,CAAA;AAElC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAAA,IAC3B,UAAA,EAAY,cAAA;AAAA,IACZ,KAAA;AAAA,IACA,eAAA,EACE,OAAA,IAAW,MAAA,CAAO,aAAA,IAClB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,UAAU,CAAA,CAAE,MAAA,KAAW;AAAA,GAC/D;AACF;AAEA,eAAsB,KAAK,OAAA,EAA2C;AACpE,EAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,OAAA;AAC3B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,MAAM,MAAA,GAAS,YAAkB,CAAA;AAEjC,EAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc,MAAM,CAAA;AACxC,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,MAAM,YAAqB,EAAC;AAE5B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,CAAC,CAAA;AACxB,IAAA,IAAI,CAAC,QAAA,EAAU;AAEf,IAAA,MAAA,GAAS,QAAA,EAAU,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA;AAElC,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,MAAMK,GAAA,CAAG,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAG5C,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,EAAK,EAAG;AAClB,QAAA,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,EAAC,EAAG,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,YAAA,EAAc,CAAA;AACxF,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,SAAS,GAAA,EAAW;AAC7B,QAAA,WAAA,CAAY,IAAA,CAAK;AAAA,UACf,IAAA,EAAM,QAAA;AAAA,UACN,QAAQ,EAAC;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,UAAA,EAAY;AAAA,SACb,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,GAAS,WAAA,CAAY,UAAU,MAAM,CAAA;AAAA,IACvC,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,aAAa,GAAA,YAAe,UAAA,GAAa,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACvE,MAAA,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,QAAQ,EAAC,EAAG,YAAY,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAA;AAI9C,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACzC,MAAA,OAAA,CAAQ,cAAA,CAAe,EAAE,QAAQ,CAAA,IAAK,MAAM,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAA;AAAA,IAC5E,CAAC,CAAA;AAED,IAAA,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,cAAc,CAAA;AACzD,IAAA,SAAA,CAAU,IAAA,CAAK,GAAG,YAAY,CAAA;AAE9B,IAAA,OAAA,CAAQ,OAAA,IAAW,YAAA,CAAa,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,EACzD;AAEA,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAA,EAAW,MAAM,CAAA;AAE5C,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,OAAA,EAAS,eAAA;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,QAAQ,SAAA,CAAU,IAAA;AAAA,MAChB,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA;AAAA,KAC/E;AAAA,IACA,KAAA;AAAA,IACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,IACzB;AAAA,GACF;AACF;ACxLA,SAAS,GAAA,CAAI,KAAa,KAAA,EAAuB;AAC/C,EAAA,OAAO,GAAA,CAAI,OAAO,KAAK,CAAA;AACzB;AAEA,SAAS,eAAe,QAAA,EAA4B;AAClD,EAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,QAAQ,CAAA,IAAK,EAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,WAAA,EAAY,CAAE,OAAO,CAAC,CAAA;AAC7C,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AACjC;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AAChD,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AACjD,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AAC/B;AAEA,SAAS,YAAY,KAAA,EAAuB;AAC1C,EAAA,IAAI,KAAA,KAAU,KAAK,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AAClD,EAAA,IAAI,KAAA,KAAU,KAAK,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AAClD,EAAA,IAAI,KAAA,KAAU,KAAK,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AACnD,EAAA,IAAI,KAAA,KAAU,KAAK,OAAO,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AACnD,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,KAAK,GAAG,KAAK,CAAA,CAAA;AAC/B;AAEA,SAAS,eAAe,EAAA,EAAoB;AAC1C,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;AAEA,SAAS,kBAAA,CAAmB,MAAc,QAAA,EAA0B;AAClE,EAAA,OAAOL,KAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AACrC;AAEA,SAAS,eAAA,CAAgB,IAAA,GAAO,GAAA,EAAK,KAAA,GAAQ,EAAA,EAAY;AACvD,EAAA,OAAO,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AACrC;AAEA,SAAS,WAAA,CAAY,KAAA,EAAc,IAAA,EAAc,OAAA,EAA0B;AACzE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,MAAMM,QAAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,KAAA,CAAM,SAAS,IAAI,CAAA;AAC5D,EAAA,MAAM,GAAA,GAAM,CAAA,EAAGA,QAAO,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,CAAA;AAEtE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,KAAA,CAAM,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAChF,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAErE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,CAAA,EAAG,MAAM,WAAW,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAEjD,IAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,MAAM,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,MAAM,OAAA,CACH,KAAA,CAAM,IAAI,CAAA,CACV,IAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,IAAI,GAAG,CAAC,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,CAClC,KAAK,IAAI;AAAA,OACd;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,CAAE,CAAA;AAC3D,MAAA,IAAI,KAAA,CAAM,IAAI,IAAA,EAAM;AAClB,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,MAAM,GAAA,CAAI,IAAA,CACP,MAAM,IAAI,CAAA,CACV,IAAI,CAAC,CAAA,KAAM,CAAA,IAAA,EAAO,GAAG,GAAG,CAAC,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA,CACnC,KAAK,IAAI;AAAA,SACd;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,OAAA,EAAS;AACjB,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,CAAA,EAAG,MAAM,OAAO,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,mBAAmB,MAAA,EAA4B;AAC7D,EAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,YAAY,MAAA,EAAQ,IAAA,EAAM,SAAQ,GAAI,MAAA;AACpE,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,YAAA,EAAe,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAE,CAAA;AAC7F,EAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,EAAK,EAAE,CAAC,CAAA;AACnC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAqB;AAC5C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,IAAA;AAC3B,IAAA,IAAI,CAAC,WAAW,GAAA,CAAI,GAAG,GAAG,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAChD,IAAA,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,CAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EACjC;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAE,CAAA;AAAA,EAC/C,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,CAAA,IAAK,UAAA,EAAY;AAC/C,MAAA,MAAMA,QAAAA,GAAU,kBAAA,CAAmB,IAAA,EAAM,QAAQ,CAAA;AACjD,MAAA,KAAA,CAAM,KAAK,CAAA,EAAG,IAAI,GAAGA,QAAO,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,EAAK,EAAE,CAAC,CAAA;AAEnC,MAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,IAAA,EAAM,OAAO,CAAC,CAAA;AAC5C,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,EAAK,EAAE,CAAC,CAAA;AACnC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,UAAA,EAAa,KAAK,CAAA,CAAE,CAAA;AACtC,EAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,EAAK,EAAE,CAAC,CAAA;AAEnC,EAAA,KAAA,MAAW,GAAA,IAAO,MAAM,UAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,EAAE,CAAA;AAClC,IAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA;AACtC,IAAA,MAAM,MAAA,GACJ,GAAA,IACC,GAAA,CAAI,aAAA,GAAgB,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,aAAa,CAAA,SAAA,CAAA,GAAc,EAAA,CAAA,IAC5D,GAAA,CAAI,SAAA,GAAY,CAAA,GAAI,KAAK,GAAA,CAAI,SAAS,CAAA,KAAA,CAAA,GAAU,EAAA,CAAA,IAChD,GAAA,CAAI,WAAA,GAAc,CAAA,GAAI,CAAA,EAAA,EAAK,IAAI,WAAW,CAAA,OAAA,CAAA,GAAY,EAAA,CAAA,IACtD,GAAA,CAAI,WAAW,CAAA,GAAI,CAAA,EAAA,EAAK,GAAA,CAAI,QAAQ,SAAS,EAAA,CAAA,GAC9C,KAAA;AACF,IAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAK,IAAI,QAAQ,CAAA,IAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAAA,EAClD;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,EAAA,EAAK,GAAA,CAAI,eAAA,EAAiB,EAAE,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,KAAA,CAAM,OAAO,CAAC,CAAA,cAAA,EAAiB,WAAA,CAAY,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,GACtG;AACA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,UAAU,CAAA,CAAE,MAAA;AACtE,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,MAAM,CAAA,CAAE,MAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA,CAAE,MAAA;AAClE,EAAA,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,KAAK,CAAA,CAAE,MAAA;AAE5D,EAAA,KAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,EAAK,EAAE,CAAC,CAAA;AACnC,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,MAAA,EAAS,MAAA,CAAO,WAAW,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,MAAM,CAAA,SAAA,EACzH,cAAA,CAAe,UAAU,CAAC,CAAA,CAAA;AAAA,GACpC;AAEA,EAAA,IAAI,aAAA,GAAgB,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,aAAa,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AAC7E,EAAA,IAAI,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,EAAG,SAAS,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA;AACpE,EAAA,IAAI,WAAA,GAAc,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,MAAM,CAAA,EAAG,WAAW,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAC1E,EAAA,IAAI,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,KAAK,CAAA,CAAE,CAAA;AAE9D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,KAAK,KAAK,CAAA,gBAAA,EAAmB,KAAK,CAAA,yBAAA,EAA4B,OAAO,aAAa,CAAA,CAAA;AAAA,KACpF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,EAAA,EAAK,GAAG,CAAA,oBAAA,EAAuB,KAAK,WAAW,KAAA,CAAM,OAAO,CAAA,kBAAA,EAAqB,MAAA,CAAO,aAAa,CAAA,CAAA;AAAA,KACvG;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,MAAM,cAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACpD,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,MAAM,CAAA,gBAAA,EAAmB,YAAY,MAAM,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AAC5E,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,UAAU,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,IACzD;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACvMO,SAAS,mBAAmB,MAAA,EAA4B;AAC7D,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AACvC;ACDA,IAAM,cAAA,GAA2C;AAAA,EAC/C,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,MAAM,QAAQ,KAAA,IAAS,EAAA,GAAK,aAAA,GAAgB,KAAA,IAAS,KAAK,QAAA,GAAW,KAAA;AACrE,EAAA,OAAO,CAAA,4CAAA,EAA+C,KAAK,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,CAAA;AAC5E;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,MAAM,KAAA,GAAQ,UAAU,GAAA,IAAO,KAAA,KAAU,MAAM,aAAA,GAAgB,KAAA,KAAU,MAAM,QAAA,GAAW,KAAA;AAC1F,EAAA,OAAO,CAAA,4CAAA,EAA+C,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA;AACtE;AAEA,SAASC,gBAAe,EAAA,EAAoB;AAC1C,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;AAEA,SAAS,OAAA,CAAQ,MAAc,QAAA,EAA0B;AACvD,EAAA,OAAOP,KAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AACrC;AAEA,SAAS,aAAA,CAAc,OAAc,IAAA,EAAsB;AACzD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,QAAA,CAAS,IAAI,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,CAAA;AAExE,EAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AACrE,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,CAAA,EAAA,CAAI,CAAA;AAC5C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,GAAG,CAAA,EAAA,CAAI,CAAA;AACvC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,KAAA,CAAM,UAAU,CAAA,CAAE,CAAA;AAClD,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,MAAM,WAAW,CAAA;AAE5B,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AACxB,IAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,MAAM,GAAA,EAAK;AACb,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,KAAA,CAAM,IAAI,IAAA,EAAM;AAClB,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,eAAe,CAAA;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAChD;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAEhB,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,uBAAuB,MAAA,EAA4B;AACjE,EAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,YAAY,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,SAAA,EAAU,GAAI,MAAA;AAC/E,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,2BAAA,EAA8B,OAAO,CAAA,IAAA,EAAO,IAAI,KAAK,SAAS,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,CAAA;AAC1F,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,UAAA,CAAW,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,CAAA,CAAE,CAAA;AACpE,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAC1C,EAAA,KAAA,CAAM,KAAK,+BAA+B,CAAA;AAE1C,EAAA,KAAA,MAAW,GAAA,IAAO,MAAM,UAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,IAAS,EAAA,GAAK,WAAM,GAAA,CAAI,KAAA,IAAS,KAAK,cAAA,GAAO,QAAA;AAC/D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAA,CAAI,QAAQ,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA,OAAA,EAAU,GAAA,CAAI,UAAU,CAAA,EAAA,CAAI,CAAA;AAAA,EAClF;AAEA,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,EAAsB,KAAA,CAAM,OAAO,CAAA,uBAAA,EAA0B,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACrF,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,eAAA,GAC3B,6BAAA,GACA,iCAAA;AACJ,EAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA;AAC3B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,MAAM,iBAAiB,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,UAAU,CAAA;AACrE,EAAA,MAAM,aAAa,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,MAAM,CAAA;AAC7D,EAAA,MAAM,eAAe,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,QAAQ,CAAA;AACjE,EAAA,MAAM,YAAY,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,KAAK,CAAA;AAE3D,EAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,CAAA,oBAAA,CAAsB,CAAA;AACjC,EAAA,KAAA,CAAM,KAAK,CAAA,oBAAA,CAAsB,CAAA;AACjC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,cAAA,CAAe,MAAM,CAAA,EAAA,CAAI,CAAA;AACpD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,UAAA,CAAW,MAAM,CAAA,EAAA,CAAI,CAAA;AAC5C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,YAAA,CAAa,MAAM,CAAA,EAAA,CAAI,CAAA;AAChD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,SAAA,CAAU,MAAM,CAAA,EAAA,CAAI,CAAA;AAC1C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,MAAA,CAAO,MAAM,CAAA,IAAA,CAAM,CAAA;AACjD,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAGb,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACvC;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,KAAA,CAAM,KAAK,yBAAyB,CAAA;AACpC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACvC;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,IAAA,KAAA,CAAM,KAAK,2CAA2C,CAAA;AACtD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACvC;AACA,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AACtB,IAAA,KAAA,CAAM,KAAK,wCAAwC,CAAA;AACnD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,MAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,IACvC;AACA,IAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAGA,EAAA,KAAA,CAAM,KAAK,oBAAoB,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAC5F,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwB,KAAA,CAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAC1E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,KAAA,CAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAU,CAAA,CAAE,MAAM,CAAA,CAAE,CAAA;AAC5E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmBO,eAAAA,CAAe,UAAU,CAAC,CAAA,CAAE,CAAA;AAC1D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,aAAa,CAAA,IAAA,CAAM,CAAA;AAC9D,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,MAAM,cAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AACpD,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,KAAA,CAAM,KAAK,kBAAkB,CAAA;AAC7B,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,OAAA,CAAQ,IAAA,EAAM,CAAA,CAAE,IAAI,CAAC,CAAA,IAAA,EAAO,CAAA,CAAE,UAAU,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,uEAAuE,CAAA;AAElF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;ACjLA,SAAS,qBAAqB,QAAA,EAAgC;AAC5D,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,UAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA;AAEb;AAEA,SAAS,wBAAwB,QAAA,EAA4B;AAC3D,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,UAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,KAAA;AAAA;AAEb;AAEA,SAAS,QAAQ,QAAA,EAA0B;AAEzC,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC9C,EAAA,OAAO,UAAA,CAAW,WAAW,GAAG,CAAA,GAAI,UAAU,UAAU,CAAA,CAAA,GAAK,WAAW,UAAU,CAAA,CAAA;AACpF;AAEO,SAAS,oBAAoB,MAAA,EAA4B;AAC9D,EAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAK,GAAI,MAAA;AAGzB,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAmB;AACvC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IAC9D,IAAI,KAAA,CAAM,MAAA;AAAA,IACV,IAAA,EAAM,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAAA,IACvC,gBAAA,EAAkB;AAAA,MAChB,MAAM,KAAA,CAAM;AAAA,KACd;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,MAAM,KAAA,CAAM;AAAA,KACd;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,KAAA,CAAM,GAAA,EAAK,WAAA,IAAe,gCAAA;AAAA,MAChC,UAAU,KAAA,CAAM,GAAA,EAAK,OACjB,CAAA,EAAG,KAAA,CAAM,IAAI,WAAW;;AAAA;AAAA,EAAyB,KAAA,CAAM,IAAI,IAAI;AAAA,MAAA,CAAA,GAC9D,KAAA,CAAM,KAAK,WAAA,IAAe;AAAA,KACjC;AAAA,IACA,OAAA,EAAS,KAAA,CAAM,OAAA,IAAW,CAAA,kCAAA,EAAqC,MAAM,MAAM,CAAA,CAAA;AAAA,IAC3E,UAAA,EAAY;AAAA,MACV,IAAA,EAAM,CAAC,KAAA,CAAM,QAAQ,CAAA;AAAA,MACrB,mBAAA,EAAqB,uBAAA,CAAwB,KAAA,CAAM,QAAQ,CAAA;AAAA,MAC3D,SAAA,EAAW,KAAA,CAAM,UAAA,KAAe,SAAA,GAAY,cAAc,KAAA,CAAM,UAAA;AAAA,MAChE,oBAAoB,KAAA,CAAM;AAAA;AAC5B,GACF,CAAE,CAAA;AAEF,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IAC1C,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,KAAA,EAAO,oBAAA,CAAqB,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC1C,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAA,EAAG,KAAA,CAAM,OAAO;;AAAA,EAAO,KAAA,CAAM,WAAW,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS;;AAAA,QAAA,EAAe,KAAA,CAAM,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA,KACpG;AAAA,IACA,SAAA,EAAW;AAAA,MACT;AAAA,QACE,gBAAA,EAAkB;AAAA,UAChB,gBAAA,EAAkB;AAAA,YAChB,GAAA,EAAKP,KAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,SAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAAA,YAChE,SAAA,EAAW;AAAA,WACb;AAAA,UACA,MAAA,EAAQ;AAAA,YACN,SAAA,EAAW,MAAM,QAAA,CAAS,IAAA;AAAA,YAC1B,WAAA,EAAa,KAAA,CAAM,QAAA,CAAS,MAAA,GAAS,CAAA;AAAA,YACrC,OAAA,EAAS,KAAA,CAAM,QAAA,CAAS,OAAA,IAAW,MAAM,QAAA,CAAS,IAAA;AAAA,YAClD,YAAY,KAAA,CAAM,QAAA,CAAS,SAAA,IAAa,KAAA,CAAM,SAAS,MAAA,IAAU;AAAA;AACnE;AACF;AACF,KACF;AAAA,IACA,mBAAA,EAAqB;AAAA,MACnB,yBAAyB,MAAA,CAAO,IAAA;AAAA,QAC9B,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AAAA,OAC/D,CAAE,SAAS,QAAQ;AAAA,KACrB;AAAA,IACA,UAAA,EAAY;AAAA,MACV,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,UAAU,KAAA,CAAM;AAAA;AAClB,GACF,CAAE,CAAA;AAEF,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,OAAA,EACE,gGAAA;AAAA,IACF,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ;AAAA,QACE,IAAA,EAAM;AAAA,UACJ,MAAA,EAAQ;AAAA,YACN,IAAA,EAAM,YAAA;AAAA,YACN,OAAA,EAAS,eAAA;AAAA,YACT,cAAA,EAAgB,0CAAA;AAAA,YAChB,eAAA,EAAiB,eAAA;AAAA,YACjB,KAAA,EAAO;AAAA;AACT,SACF;AAAA,QACA,kBAAA,EAAoB;AAAA,UAClB,WAAA,EAAa;AAAA,YACX,GAAA,EAAK,OAAA,CAAQ,IAAI,CAAA,GAAI;AAAA;AACvB,SACF;AAAA,QACA,OAAA,EAAS,YAAA;AAAA,QACT,UAAA,EAAY;AAAA;AACd;AACF,GACF;AAEA,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACtC;AC/IA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,OAAO,IACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;AAEA,SAAS,cAAc,QAAA,EAA4B;AACjD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,UAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,KAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,SAAA;AAAA;AAEb;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,SAAA;AACxB,EAAA,IAAI,KAAA,IAAS,IAAI,OAAO,SAAA;AACxB,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,eAAA,CAAgB,OAAc,IAAA,EAAsB;AAC3D,EAAA,MAAMM,QAAAA,GAAUN,KAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,KAAA,CAAM,SAAS,IAAI,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC3E,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,QAAQ,CAAA;AAE1C,EAAA,OAAO;AAAA,2CAAA,EACoC,KAAA,CAAM,QAAQ,CAAA,iBAAA,EAAoB,KAAA,CAAM,QAAQ,CAAA;AAAA;AAAA,uDAAA,EAEpC,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA;AAAA,iCAAA,EAC5D,UAAA,CAAW,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,uCAAA,EAClB,UAAA,CAAW,KAAA,CAAM,UAAU,CAAC,CAAA;AAAA;AAAA,iCAAA,EAElC,UAAA,CAAW,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,kCAAA,EACxB,WAAWM,QAAO,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,qCAAA,EACvC,UAAA,CAAW,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,MAAA,EAC5D,KAAA,CAAM,SAAS,CAAA,mDAAA,EAAsD,UAAA,CAAW,MAAM,MAAM,CAAC,WAAW,EAAE;AAAA,MAAA,EAC1G,KAAA,CAAM,UAAU,CAAA,iCAAA,EAAoC,UAAA,CAAW,MAAM,OAAO,CAAC,kBAAkB,EAAE;AAAA,MAAA,EAEjG,MAAM,GAAA,GACF;AAAA;AAAA,gCAAA,EAEsB,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,WAAW,CAAC;AAAA,UAAA,EACvD,KAAA,CAAM,GAAA,CAAI,IAAA,GAAO,CAAA,4BAAA,EAA+B,UAAA,CAAW,MAAM,GAAA,CAAI,IAAI,CAAC,CAAA,aAAA,CAAA,GAAkB,EAAE;AAAA;AAAA,MAAA,CAAA,GAG9F,EACN;AAAA,MAAA,EACE,KAAA,CAAM,UAAU,CAAA,2BAAA,EAA8B,UAAA,CAAW,MAAM,OAAO,CAAC,uDAAuD,EAAE;AAAA,UAAA,CAAA;AAExI;AAEO,SAAS,mBAAmB,MAAA,EAA4B;AAC7D,EAAA,MAAM,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,YAAY,IAAA,EAAM,OAAA,EAAS,WAAU,GAAI,MAAA;AAEvE,EAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,UAAU,CAAA,CAAE,MAAA;AACtE,EAAA,MAAM,SAAA,GAAY,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,MAAM,CAAA,CAAE,MAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,QAAQ,CAAA,CAAE,MAAA;AAClE,EAAA,MAAM,QAAA,GAAW,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,KAAK,CAAA,CAAE,MAAA;AAC5D,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,MAAA;AAEtE,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAExE,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,UAAA,CACxB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,OAAO;AAAA;AAAA,YAAA,EAEC,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,+BAAA,EACL,KAAK,CAAA,kBAAA,EAAqB,GAAA,CAAI,KAAK,CAAA;AAAA,YAAA,EACtD,IAAI,UAAU,CAAA;AAAA,YAAA,EACd,IAAI,aAAa,CAAA;AAAA,YAAA,EACjB,IAAI,SAAS,CAAA;AAAA,YAAA,EACb,IAAI,WAAW,CAAA;AAAA,YAAA,EACf,IAAI,QAAQ,CAAA;AAAA,WAAA,CAAA;AAAA,EAEtB,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,WAAA,GAAc,UAAA,GAAa,GAAA,GAAO,CAAA,EAAG,UAAU,CAAA,EAAA,CAAA,GAAO,CAAA,EAAA,CAAI,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC7F,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,KAAA,CAAM,OAAO,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,eAAA,GAAkB,SAAA,GAAY,SAAA;AACpD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,eAAA,GAAkB,kBAAA,GAAqB,sBAAA;AAE/D,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sDAAA,EAiB+C,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,EAgCnD,UAAA,CAAW,OAAO,CAAC,CAAA,kBAAA,EAAkB,WAAW,IAAI,IAAA,CAAK,SAAS,CAAA,CAAE,aAAa,CAAC,CAAA,kBAAA,EAAkB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,wCAAA,EAMtF,YAAY,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,wCAAA,EAI9B,YAAY,CAAA,EAAA,EAAK,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,EAI/B,OAAO,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,EAIb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,EAIb,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,EAIT,YAAY,CAAA;AAAA;AAAA;;AAAA,6BAAA,EAIhC,SAAS,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAA,EASzB,YAAY,CAAA;AAAA;;AAAA;AAAA;AAAA,YAAA,EAKb,MAAA,CAAO,MAAM,CAAA,MAAA,EAAS,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,kBAAA,EAAkB,YAAY,CAAA,wBAAA,EAAwB,WAAW,CAAA;AAAA;;AAAA;AAAA,2EAAA,EAItD,OAAO,MAAM,CAAA;AAAA,8EAAA,EACV,aAAa,CAAA;AAAA,sEAAA,EACrB,SAAS,CAAA;AAAA,0EAAA,EACL,WAAW,CAAA;AAAA,oEAAA,EACjB,QAAQ,CAAA;AAAA;;AAAA;AAAA,MAAA,EAItE,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,iDAAA,GAAoD,UAAU;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AAmB5F;;;AChNO,SAAS,QAAA,CAAS,MAAA,EAAoB,QAAA,GAAyB,MAAA,EAAgB;AACpF,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,MAAA;AACH,MAAA,OAAO,mBAAmB,MAAM,CAAA;AAAA,IAClC,KAAK,MAAA;AACH,MAAA,OAAO,mBAAmB,MAAM,CAAA;AAAA,IAClC,KAAK,UAAA;AACH,MAAA,OAAO,uBAAuB,MAAM,CAAA;AAAA,IACtC,KAAK,OAAA;AACH,MAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,IACnC,KAAK,MAAA;AAAA,IACL;AACE,MAAA,OAAO,mBAAmB,MAAM,CAAA;AAAA;AAEtC;AAEA,eAAsB,WAAA,CAAY,SAAiB,UAAA,EAAmC;AACpF,EAAA,MAAM,GAAA,GAAMN,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA;AACnC,EAAA,MAAMK,IAAG,KAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AACvC,EAAA,MAAMA,GAAAA,CAAG,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AACjD;;;ACJA,SAAS,SAAA,GAAkB;AACzB,EAAA,IAAI,OAAA,CAAQ,OAAO,KAAA,EAAO;AACxB,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,UAAU,CAAA;AAAA,EACjC;AACF;AAEA,SAAS,aAAA,CAAc,QAAA,EAAkB,KAAA,EAAe,KAAA,EAAqB;AAC3E,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO;AAC3B,EAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAA,CAAQ,KAAA,GAAQ,CAAA,IAAK,QAAS,GAAG,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,GAAS,EAAA,GAAK,QAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,GAAI,QAAA;AACnE,EAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,EAAA,EAAK,GAAG,CAAA,UAAA,EAAa,GAAG,CAAA,GAAA,EAAM,KAAK,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AACpE;AAEA,eAAsB,OAAA,CACpB,WACA,OAAA,EACe;AACf,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,EAAA,IAAM,CAAC,QAAQ,MAAA,CAAO,KAAA;AACzC,EAAA,MAAM,MAAM,SAAA,GAAYL,KAAAA,CAAK,QAAQ,SAAS,CAAA,GAAI,QAAQ,GAAA,EAAI;AAG9D,EAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,MAAM,CAAA;AAGvD,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,GAAG,UAAA;AAAA,IACH,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,UAAA,CAAW,OAAA;AAAA,IACvC,QAAA,EAAW,OAAA,CAAQ,QAAA,IAAyC,UAAA,CAAW,QAAA;AAAA,IACvE,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,UAAA,CAAW,MAAA;AAAA,IACrC,aAAA,EAAe,QAAQ,aAAA,GACnB,QAAA,CAAS,QAAQ,aAAA,EAAe,EAAE,IAClC,UAAA,CAAW,aAAA;AAAA,IACf,UAAA,EAAY;AAAA,MACV,SAAA,EAAW,QAAQ,MAAA,KAAW,KAAA,GAAQ,QAAS,UAAA,CAAW,UAAA,CAAW,SAAS,CAAA,IAAK,IAAA;AAAA,MACnF,QAAA,EAAU,QAAQ,QAAA,KAAa,KAAA,GAAQ,QAAS,UAAA,CAAW,UAAA,CAAW,UAAU,CAAA,IAAK,IAAA;AAAA,MACrF,WAAA,EACE,QAAQ,WAAA,KAAgB,KAAA,GAAQ,QAAS,UAAA,CAAW,UAAA,CAAW,aAAa,CAAA,IAAK,IAAA;AAAA,MACnF,eAAA,EACE,QAAQ,eAAA,KAAoB,KAAA,GACxB,QACC,UAAA,CAAW,UAAA,CAAW,iBAAiB,CAAA,IAAK,IAAA;AAAA,MACnD,sBAAA,EACE,QAAQ,mBAAA,KAAwB,KAAA,GAC5B,QACC,UAAA,CAAW,UAAA,CAAW,sBAAsB,CAAA,IAAK;AAAA;AAC1D,GACF;AAEA,EAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY,EAAE,GAAG,MAAA,CAAO,SAAA,EAAW,UAAU,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,EAAE;AAAA,EACxF;AACA,EAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,IAAA,MAAA,CAAO,SAAA,GAAY,EAAE,GAAG,MAAA,CAAO,SAAA,EAAW,MAAM,QAAA,CAAS,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,EAAE;AAAA,EAChF;AAEA,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,OAAA,CAAQ,KAAA,EAAO;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,IAAI,CAAA,UAAA,EAAa,KAAK,KAAK,GAAG,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAE,CAAA;AACpF,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,GAAG,CAAA,SAAA,EAAY,GAAG,GAAG,KAAK;AAAA,CAAI,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,WAAA,GAA2B,EAAE,MAAA,EAAO;AAC1C,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,EAAA,cAAgB,MAAA,GAAS,aAAA;AAEhD,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAW,CAAA;AAErC,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,QAAQ,KAAA,IAAS,OAAA,CAAQ,OAAO,KAAA,EAAO;AACjD,IAAA,SAAA,EAAU;AAAA,EACZ;AAGA,EAAA,MAAM,eAAe,MAAA,CAAO,QAAA;AAC5B,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AAEnD,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,WAAA,CAAY,aAAA,EAAe,MAAA,CAAO,MAAM,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,CAAA,kBAAA,EAAqB,OAAO,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,aAAa,CAAA;AAAA,EACpC;AAGA,EAAA,IAAI,UAAA,GAAa,KAAA;AAGjB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,aAAA,EAAe;AAC/C,IAAA,UAAA,GAAa,IAAA;AAAA,EACf;AAGA,EAAA,KAAA,MAAW,CAAC,KAAK,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AACzD,IAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,IAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAc,GAAgB,CAAA,CAAE,MAAA;AAC5E,IAAA,IAAI,QAAQ,GAAA,EAAK;AACf,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,EAAA,EAAI;AACzB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,CAAA,EAAG,GAAG,CAAA,EAAG,KAAK,IAAI,GAAG,CAAA,MAAA,EAAS,KAAA,KAAU,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,qBAAA,EAAwB,GAAG,IAAI,KAAK,CAAA;AAAA,SAC1F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AC1HA,eAAsB,QAAA,CACpB,WACA,OAAA,EACe;AACf,EAAA,MAAM,MAAM,SAAA,GAAYA,KAAAA,CAAK,QAAQ,SAAS,CAAA,GAAIQ,QAAQ,GAAA,EAAI;AAC9D,EAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,MAAM,CAAA;AAEvD,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,UAAA;AAAA,IACH,aAAA,EAAe,QAAQ,aAAA,GACnB,QAAA,CAAS,QAAQ,aAAA,EAAe,EAAE,IAClC,UAAA,CAAW,aAAA;AAAA,IACf,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW;AACrC,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,GAAG,MAAA,CAAO,SAAA;AAAA,MACV,QAAA,EAAU,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,EAAE;AAAA,KAC5C;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAE,QAAQ,CAAA;AAEpC,EAAA,MAAM,aAAA,GAAgB,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,UAAU,CAAA,CAAE,MAAA;AAC7E,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,SAAA,CAAU,QAAA,IAAY,CAAA;AACjD,EAAA,MAAM,mBAAmB,aAAA,GAAgB,WAAA;AACzC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,OAAA,IAAW,MAAA,CAAO,aAAA;AACnD,EAAA,MAAM,MAAA,GAAS,eAAe,CAAC,gBAAA;AAE/B,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAG,KAAK,CAAA,EAAG,IAAI,OAAO,KAAK,CAAA,SAAA,EAAY,OAAO,KAAA,CAAM,OAAO,gBAAgB,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAA,EACxF,GAAG,eAAe,MAAA,CAAO,aAAa,IAAI,KAAK,CAAA;AAAA,KACtD;AACA,IAAAA,OAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA,MAAO;AACL,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,iBAAA,EAAoB,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAAA,IACtF;AACA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,EAAG,aAAa,CAAA,eAAA,EAAkB,aAAA,KAAkB,IAAI,GAAA,GAAM,EAAE,UAAU,WAAW,CAAA,CAAA;AAAA,OACvF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,CAAA,EAAG,GAAG,CAAA,EAAG,IAAI,CAAA,IAAA,EAAO,KAAK,CAAA,SAAA,EAAY,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAM,KAAK,CAAA;AAAA,KAC7F;AACA,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,OAAA,CAAQ,MAAM,CAAA,EAAA,EAAK,GAAG,GAAG,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,IAC3C;AACA,IAAAA,OAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;ACtDA,IAAM,WAAA,GAAc,GAAA;AAEpB,eAAsB,QAAA,CACpB,WACA,OAAA,EACe;AACf,EAAA,MAAM,MAAM,SAAA,GAAYR,KAAAA,CAAK,QAAQ,SAAS,CAAA,GAAIQ,QAAQ,GAAA,EAAI;AAC9D,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,MAAM,CAAA;AAEnD,EAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,IAAA;AAEtC,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,IAAI,mBAAmB,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,SAAA,EAAY,GAAG,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAC9E,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,qBAAA,EAAwB,KAAK;AAAA,CAAI,CAAA;AAEnD,EAAA,IAAI,aAAA,GAAsD,IAAA;AAC1D,EAAA,IAAI,OAAA,GAAU,KAAA;AAEd,EAAA,eAAe,aAAa,WAAA,EAAqC;AAC/D,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,OAAA,GAAU,IAAA;AAEV,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,GAAA,GAAMR,KAAAA,CAAK,QAAA,CAAS,GAAA,EAAK,WAAW,CAAA;AAC1C,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAI,WAAW,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,GAAG,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA;AAC1C,IAAAQ,OAAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAE7B,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAE,QAAQ,CAAA;AACpC,MAAAA,OAAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAE/B,MAAA,MAAM,MAAA,GAAS,mBAAmB,MAAM,CAAA;AACxC,MAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAElB,MAAA,IAAI,MAAA,CAAO,MAAM,eAAA,EAAiB;AAChC,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,CAAA,OAAA,EAAU,OAAO,KAAA,CAAM,OAAO,OAAO,KAAK;AAAA,CAAI,CAAA;AAAA,MACpE,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,GAAG,CAAA,OAAA,EAAU,OAAO,KAAA,CAAM,OAAO,OAAO,KAAK;AAAA,CAAI,CAAA;AAAA,MAClE;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAAA,OAAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAC/B,MAAA,OAAA,CAAQ,KAAA;AAAA,QACN,CAAA,EAAG,GAAG,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,EAAI,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,OAC/E;AAAA,IACF;AAEA,IAAA,OAAA,GAAU,KAAA;AAAA,EACZ;AAGA,EAAA,MAAM,YAAA,EAAa;AAGnB,EAAA,MAAM,OAAA,GAAUH,GAAAA,CAAG,KAAA,CAAM,GAAA,EAAK,EAAE,WAAW,IAAA,EAAK,EAAG,CAAC,KAAA,EAAO,QAAA,KAAa;AACtE,IAAA,IAAI,CAAC,QAAA,EAAU;AAGf,IAAA,IAAI,CAAC,4BAAA,CAA6B,IAAA,CAAK,QAAQ,CAAA,EAAG;AAGlD,IAAA,IACE,QAAA,CAAS,QAAA,CAAS,cAAc,CAAA,IAChC,QAAA,CAAS,SAAS,MAAM,CAAA,IACxB,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA;AAEzB,MAAA;AAEF,IAAA,IAAI,aAAA,eAA4B,aAAa,CAAA;AAC7C,IAAA,aAAA,GAAgB,WAAW,MAAM;AAC/B,MAAA,KAAK,YAAA,CAAaL,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,IAC5C,GAAG,WAAW,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAAQ,OAAAA,CAAQ,EAAA,CAAG,QAAA,EAAU,MAAM;AACzB,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,GAAG,iBAAiB,KAAK;AAAA,CAAI,CAAA;AAC9C,IAAAA,OAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AAGD,EAAA,MAAM,IAAI,QAAc,MAAM;AAAA,EAAC,CAAC,CAAA;AAClC;ACvFA,SAAS,KAAA,CAAM,KAAA,EAAe,EAAA,EAAa,MAAA,EAAuB;AAChE,EAAA,MAAM,IAAA,GAAO,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,MAAA,EAAI,KAAK,CAAA,CAAA,GAAK,CAAA,EAAG,GAAG,CAAA,MAAA,EAAI,KAAK,CAAA,CAAA;AACvD,EAAA,MAAM,MAAM,MAAA,GAAS,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,GAAG,CAAA,EAAG,MAAM,GAAG,KAAK,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,IAAI,KAAK,KAAK,CAAA,CAAA;AACzF,EAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AACjB;AAEA,SAAS,IAAA,CAAK,OAAe,MAAA,EAAuB;AAClD,EAAA,MAAM,GAAA,GAAM,SACR,CAAA,EAAA,EAAK,MAAM,IAAI,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,GAAG,GAAG,MAAM,CAAA,EAAG,KAAK,CAAA,CAAA,GACvD,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,KAAK,KAAK,KAAK,CAAA,CAAA;AAClC,EAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AACjB;AAEA,SAAS,IAAA,CAAK,OAAe,MAAA,EAAuB;AAClD,EAAA,MAAM,GAAA,GAAM,SACR,CAAA,EAAA,EAAK,IAAI,IAAI,KAAK,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,GAAG,GAAG,MAAM,CAAA,EAAG,KAAK,CAAA,CAAA,GACrD,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,KAAK,KAAK,KAAK,CAAA,CAAA;AAChC,EAAA,OAAA,CAAQ,IAAI,GAAG,CAAA;AACjB;AAEA,SAAS,cAAA,GAAyB;AAChC,EAAA,OAAOA,OAAAA,CAAQ,OAAA;AACjB;AAEA,SAAS,gBAAA,GAA4B;AACnC,EAAA,MAAM,CAAC,KAAK,CAAA,GAAIA,OAAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AACtE,EAAA,OAAA,CAAQ,SAAS,CAAA,KAAM,EAAA;AACzB;AAEA,SAAS,aAAA,GAA+B;AACtC,EAAA,IAAI;AACF,IAAA,OAAO,QAAA,CAAS,eAAA,EAAiB,EAAE,QAAA,EAAU,OAAA,EAAS,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA,EAAG,EAAE,IAAA,EAAK;AAAA,EAChG,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAsB,SAAA,GAA2B;AAC/C,EAAA,MAAM,GAAA,GAAMA,QAAQ,GAAA,EAAI;AAExB,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,IAAI,oBAAoB,KAAK;AAAA,CAAI,CAAA;AAClD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,2CAAA,EAA8C,KAAK;AAAA,CAAI,CAAA;AAGzE,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,WAAA,EAAc,KAAK,CAAA,CAAE,CAAA;AACxC,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,EAAA,KAAA,CAAM,iBAAA,EAAmB,MAAA,EAAQ,CAAA,EAAG,WAAW,CAAA,iBAAA,CAAmB,CAAA;AAElE,EAAA,MAAM,aAAa,aAAA,EAAc;AACjC,EAAA,KAAA,CAAM,eAAA,EAAiB,UAAA,KAAe,IAAA,EAAM,UAAA,IAAc,WAAW,CAAA;AAErE,EAAA,IAAA,CAAK,UAAA,EAAYA,QAAQ,QAAQ,CAAA;AACjC,EAAA,IAAA,CAAK,cAAA,EAAgBA,QAAQ,IAAI,CAAA;AACjC,EAAA,IAAA,CAAK,sBAAsB,eAAe,CAAA;AAC1C,EAAA,OAAA,CAAQ,GAAA,EAAI;AAGZ,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAE,CAAA;AAE1C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,WAAW,GAAG,CAAA;AAC7B,IAAA,KAAA,CAAM,sBAAA,EAAwB,IAAA,EAAM,CAAA,MAAA,EAAS,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAC1D,IAAA,IAAA,CAAK,gBAAA,EAAkB,CAAA,EAAG,MAAA,CAAO,aAAa,CAAA,IAAA,CAAM,CAAA;AACpD,IAAA,IAAA,CAAK,UAAA,EAAY,OAAO,QAAQ,CAAA;AAChC,IAAA,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,MAAA,IAAU,QAAQ,CAAA;AAExC,IAAA,MAAM,oBAAoB,MAAA,CAAO,OAAA,CAAQ,OAAO,UAAU,CAAA,CACvD,OAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,CAAA,CACnB,GAAA,CAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;AACjB,IAAA,IAAA,CAAK,oBAAA,EAAsB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA;AAEvD,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,MAAA;AAChD,IAAA,IAAA,CAAK,gBAAA,EAAkB,CAAA,EAAG,aAAa,CAAA,CAAE,CAAA;AAAA,EAC3C,SAAS,GAAA,EAAK;AACZ,IAAA,KAAA,CAAM,sBAAA,EAAwB,OAAO,GAAA,YAAe,KAAA,GAAQ,IAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACvF;AACA,EAAA,OAAA,CAAQ,GAAA,EAAI;AAGZ,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAEpC,EAAA,MAAM,OAAA,GAAUR,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AAC7C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMK,GAAAA,CAAG,QAAA,CAAS,SAAS,OAAO,CAAA;AAC9C,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC1B,IAAA,KAAA,CAAM,sBAAsB,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,WAAW,CAAC,CAAA;AAEjE,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,GAAI,GAAA,CAAI,YAAA;AAAA,MACR,GAAI,GAAA,CAAI;AAAA,KACV;AAEA,IAAA,MAAM,QAAQ,YAAA,IAAgB,OAAA;AAC9B,IAAA,IAAA,CAAK,oBAAA,EAAsB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EAC1C,CAAA,CAAA,MAAQ;AACN,IAAA,KAAA,CAAM,oBAAA,EAAsB,OAAO,6BAA6B,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,YAAA,GAAeL,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,eAAe,CAAA;AACnD,EAAA,IAAI;AACF,IAAA,MAAMK,GAAAA,CAAG,OAAO,YAAY,CAAA;AAC5B,IAAA,KAAA,CAAM,uBAAuB,IAAI,CAAA;AAAA,EACnC,CAAA,CAAA,MAAQ;AACN,IAAA,IAAA,CAAK,2BAA2B,kDAAkD,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,OAAA,GAAUL,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAMK,GAAAA,CAAG,OAAO,OAAO,CAAA;AACvB,IAAA,KAAA,CAAM,kBAAkB,IAAI,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,IAAA,CAAK,wBAAwB,2CAA2C,CAAA;AAAA,EAC1E;AAEA,EAAA,MAAM,aAAA,GAAgBL,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,YAAY,CAAA;AACjD,EAAA,IAAI;AACF,IAAA,MAAMK,GAAAA,CAAG,OAAO,aAAa,CAAA;AAC7B,IAAA,KAAA,CAAM,oBAAoB,IAAI,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AACN,IAAA,IAAA,CAAK,wBAAwB,6CAA6C,CAAA;AAAA,EAC5E;AAEA,EAAA,OAAA,CAAQ,GAAA,EAAI;AAGZ,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAA;AAClC,EAAA,IAAA,CAAK,uBAAA,EAAyB,CAAA,EAAG,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAExD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,KAAA,MAAWJ,UAAQ,cAAA,EAAgB;AACjC,IAAA,UAAA,CAAW,GAAA,CAAIA,MAAAA,CAAK,IAAA,CAAK,QAAA,EAAA,CAAW,UAAA,CAAW,GAAA,CAAIA,MAAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,EAClF;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,UAAA,EAAY;AACrC,IAAA,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,EAAI,CAAA,EAAG,KAAK,CAAA,MAAA,CAAQ,CAAA;AAAA,EACnC;AAEA,EAAA,OAAA,CAAQ,GAAA,EAAI;AAGZ,EAAA,IAAI,CAAC,kBAAiB,EAAG;AACvB,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAG,GAAG,CAAA,oEAAA,EAAuE,KAAK;AAAA;AAAA,KACpF;AACA,IAAAO,OAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA,uBAAA,EAA0B,KAAK;AAAA,CAAI,CAAA;AACzD;ACpJA,eAAsB,QAAQ,OAAA,EAA4C;AACxE,EAAA,MAAM,GAAA,GAAMA,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,UAAA,GAAaR,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,sBAAsB,CAAA;AAExD,EAAA,IAAI;AACF,IAAA,MAAMK,GAAAA,CAAG,OAAO,UAAU,CAAA;AAE1B,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,GAAG,MAAM,CAAA,oCAAA,EAAuC,KAAK,CAAA,KAAA,EAC5C,IAAI,UAAU,KAAK,CAAA,iBAAA;AAAA,OAC9B;AACA,MAAAG,OAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,UAAU,qBAAA,EAAsB;AAEtC,EAAA,IAAI;AACF,IAAA,MAAMH,GAAAA,CAAG,SAAA,CAAU,UAAA,EAAY,OAAA,EAAS,OAAO,CAAA;AAC/C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA,4BAAA,EAA+B,KAAK,CAAA,CAAE,CAAA;AAC1D,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,CAAA;AAAA,CAA2D,CAAA;AAAA,EACjF,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA;AAAA,MACN,CAAA,EAAG,GAAG,CAAA,6BAAA,EAAgC,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,KAAK,CAAA;AAAA,KAChG;AACA,IAAAG,OAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AC1BA,eAAsB,SAAA,CACpB,WACA,OAAA,EACe;AACf,EAAA,MAAM,MAAM,SAAA,GAAYR,KAAAA,CAAK,QAAQ,SAAS,CAAA,GAAIQ,QAAQ,GAAA,EAAI;AAC9D,EAAA,MAAM,UAAA,GAAa,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,MAAM,CAAA;AAEvD,EAAA,MAAM,YAAA,GAAgB,OAAA,CAAQ,QAAA,IAAY,UAAA,CAAW,QAAA;AACrD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,IAAU,UAAA,CAAW,MAAA;AAEhD,EAAA,IAAI,CAAC,UAAA,IAAc,YAAA,KAAiB,MAAA,EAAQ;AAC1C,IAAA,MAAM,UAAA,GAAaR,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,wBAAwB,CAAA;AAC1D,IAAA,UAAA,CAAW,MAAA,GAAS,UAAA;AAAA,EACtB,WAAW,UAAA,EAAY;AACrB,IAAA,UAAA,CAAW,MAAA,GAAS,UAAA;AAAA,EACtB;AAEA,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,UAAA,EAAY,UAAU,YAAA,EAAa;AAEvD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,GAAG,CAAA,GAAA,CAAK,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAE,QAAQ,CAAA;AAEpC,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,EAAQ,YAAY,CAAA;AAE7C,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,MAAM,WAAA,CAAY,OAAA,EAAS,MAAA,CAAO,MAAM,CAAA;AACxC,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,CAAA,kBAAA,EAAqB,OAAO,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,CAAA;AAAA,EAClE,CAAA,MAAO;AACL,IAAAQ,OAAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AAAA,EAC9B;AACF;;;ACjCA,SAAS,SAAA,GAAqB;AAC5B,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,EAAQ;AAE5B,EAAA,OAAA,CACG,IAAA,CAAK,YAAY,CAAA,CACjB,WAAA;AAAA,IACC;AAAA,GAEF,CACC,QAAQ,eAAA,EAAiB,eAAA,EAAiB,2BAA2B,CAAA,CACrE,UAAA,CAAW,cAAc,0BAA0B,CAAA;AAGtD,EAAA,OAAA,CACG,OAAA,CAAQ,kBAAA,EAAoB,EAAE,SAAA,EAAW,MAAM,CAAA,CAC/C,WAAA,CAAY,+CAA+C,CAAA,CAC3D,MAAA,CAAO,qBAAA,EAAuB,4BAA4B,EAC1D,MAAA,CAAO,mBAAA,EAAqB,oDAAA,EAAsD,MAAM,CAAA,CACxF,MAAA,CAAO,qBAAA,EAAuB,0CAA0C,EACxE,MAAA,CAAO,0BAAA,EAA4B,0CAAA,EAA4C,IAAI,EACnF,MAAA,CAAO,oBAAA,EAAsB,4CAAA,EAA8C,GAAG,EAC9E,MAAA,CAAO,gBAAA,EAAkB,6BAA6B,CAAA,CACtD,MAAA,CAAO,cAAA,EAAgB,uBAAuB,CAAA,CAC9C,OAAO,eAAA,EAAiB,wBAAwB,CAAA,CAChD,MAAA,CAAO,kBAAA,EAAoB,2BAA2B,CAAA,CACtD,MAAA,CAAO,wBAAwB,+BAA+B,CAAA,CAC9D,MAAA,CAAO,2BAAA,EAA6B,oCAAoC,CAAA,CACxE,MAAA,CAAO,WAAA,EAAa,uDAAuD,CAAA,CAC3E,MAAA,CAAO,SAAA,EAAW,mDAAmD,EACrE,MAAA,CAAO,MAAA,EAAQ,gDAAgD,CAAA,CAC/D,OAAO,OAAO,CAAA;AAEjB,EAAA,OAAA,CACG,OAAA,CAAQ,mBAAmB,CAAA,CAC3B,WAAA,CAAY,mDAAmD,CAAA,CAC/D,MAAA,CAAO,uBAAuB,4BAA4B,CAAA,CAC1D,OAAO,0BAAA,EAA4B,uBAAA,EAAyB,IAAI,CAAA,CAChE,MAAA,CAAO,sBAAsB,iCAAA,EAAmC,GAAG,CAAA,CACnE,MAAA,CAAO,QAAQ,CAAA;AAElB,EAAA,OAAA,CACG,OAAA,CAAQ,mBAAmB,CAAA,CAC3B,WAAA,CAAY,kDAAkD,CAAA,CAC9D,MAAA,CAAO,qBAAA,EAAuB,4BAA4B,EAC1D,MAAA,CAAO,WAAA,EAAa,0BAA0B,CAAA,CAC9C,OAAO,QAAQ,CAAA;AAElB,EAAA,OAAA,CACG,OAAA,CAAQ,oBAAoB,CAAA,CAC5B,WAAA,CAAY,0DAA0D,CAAA,CACtE,MAAA,CAAO,uBAAuB,4BAA4B,CAAA,CAC1D,OAAO,mBAAA,EAAqB,6CAAA,EAA+C,MAAM,CAAA,CACjF,MAAA,CAAO,uBAAuB,kBAAkB,CAAA,CAChD,OAAO,SAAS,CAAA;AAEnB,EAAA,OAAA,CACG,QAAQ,QAAQ,CAAA,CAChB,YAAY,4DAA4D,CAAA,CACxE,OAAO,SAAS,CAAA;AAEnB,EAAA,OAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,wDAAwD,CAAA,CACpE,MAAA,CAAO,SAAA,EAAW,gCAAgC,CAAA,CAClD,MAAA,CAAO,OAAO,CAAA;AAEjB,EAAA,OAAO,OAAA;AACT","file":"index.js","sourcesContent":["export const PACKAGE_VERSION = '1.0.0';\n","import { cosmiconfig } from 'cosmiconfig';\nimport path from 'path';\nimport type { ResolvedConfig, RuleCategory, Severity, UserConfig } from '../types.js';\nimport { PACKAGE_VERSION } from '../version.js';\n\nconst DEFAULT_INCLUDE = ['**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx', '**/*.mjs', '**/*.cjs'];\n\nconst DEFAULT_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.next/**',\n '**/coverage/**',\n '**/.turbo/**',\n '**/*.min.js',\n '**/*.bundle.js',\n '**/*.generated.*',\n '**/__generated__/**',\n];\n\nconst DEFAULT_IGNORE_PATTERNS: string[] = [];\n\nconst DEFAULT_CATEGORIES: Record<RuleCategory, boolean> = {\n 'ai-slop': true,\n security: true,\n reliability: true,\n maintainability: true,\n 'production-readiness': true,\n};\n\nconst DEFAULT_MAX_ISSUES: Partial<Record<Severity, number>> = {};\n\nfunction computeGrade(score: number): 'A' | 'B' | 'C' | 'D' | 'F' {\n if (score >= 90) return 'A';\n if (score >= 75) return 'B';\n if (score >= 60) return 'C';\n if (score >= 40) return 'D';\n return 'F';\n}\n\nexport { computeGrade };\n\nexport async function loadConfig(cwd: string, configPath?: string): Promise<ResolvedConfig> {\n const explorer = cosmiconfig('clean-slop', {\n searchPlaces: [\n 'clean-slop.config.js',\n 'clean-slop.config.ts',\n 'clean-slop.config.mjs',\n 'clean-slop.config.cjs',\n '.clean-slop.js',\n '.clean-slop.json',\n '.clean-slop.yaml',\n '.clean-slop.yml',\n 'package.json',\n ],\n packageProp: 'clean-slop',\n });\n\n let userConfig: UserConfig = {};\n\n try {\n const result = configPath ? await explorer.load(configPath) : await explorer.search(cwd);\n\n if (result && !result.isEmpty) {\n userConfig = result.config as UserConfig;\n }\n } catch {\n // No config found; proceed with defaults\n }\n\n return resolveConfig(userConfig, cwd);\n}\n\nexport function resolveConfig(userConfig: UserConfig, cwd: string): ResolvedConfig {\n return {\n root: path.resolve(cwd),\n version: PACKAGE_VERSION,\n include: userConfig.include ?? DEFAULT_INCLUDE,\n exclude: userConfig.exclude ?? DEFAULT_EXCLUDE,\n categories: {\n ...DEFAULT_CATEGORIES,\n ...userConfig.categories,\n },\n rules: userConfig.rules ?? {},\n failThreshold: userConfig.failThreshold ?? 70,\n maxIssues: {\n ...DEFAULT_MAX_ISSUES,\n ...userConfig.maxIssues,\n },\n plugins: userConfig.plugins ?? [],\n reporter: userConfig.reporter ?? 'text',\n output: userConfig.output ?? null,\n verbose: userConfig.verbose ?? false,\n ignorePatterns: userConfig.ignorePatterns ?? DEFAULT_IGNORE_PATTERNS,\n tsConfigPath: userConfig.tsConfigPath ?? null,\n };\n}\n\nexport function generateDefaultConfig(): string {\n return `/** @type {import('clean-slop').UserConfig} */\nexport default {\n // Files to include in scanning\n include: [\n '**/*.js',\n '**/*.jsx',\n '**/*.ts',\n '**/*.tsx',\n '**/*.mjs',\n '**/*.cjs',\n ],\n\n // Files to exclude from scanning\n exclude: [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.next/**',\n '**/coverage/**',\n '**/*.min.js',\n '**/*.generated.*',\n '**/__generated__/**',\n ],\n\n // Enable or disable entire rule categories\n categories: {\n 'ai-slop': true,\n 'security': true,\n 'reliability': true,\n 'maintainability': true,\n 'production-readiness': true,\n },\n\n // Per-rule severity overrides or 'off' to disable\n rules: {\n // 'security/hardcoded-secrets': 'critical',\n // 'ai-slop/empty-catch': 'off',\n },\n\n // Minimum overall score before CI fails (0-100)\n failThreshold: 70,\n\n // Maximum allowed issues per severity\n maxIssues: {\n critical: 0,\n high: 5,\n },\n\n // Output reporter: 'text' | 'json' | 'html' | 'markdown' | 'sarif'\n reporter: 'text',\n\n // Output file path (null = stdout)\n // output: './reports/clean-slop-report.html',\n\n // Additional ignore patterns\n ignorePatterns: [],\n};\n`;\n}\n","import { parse } from '@typescript-eslint/typescript-estree';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport type { Language, ParsedFile } from '../types.js';\n\nexport class ParseError extends Error {\n constructor(\n message: string,\n public readonly filePath: string,\n public override readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'ParseError';\n }\n}\n\nfunction detectLanguage(filePath: string): Language {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case '.ts':\n return 'typescript';\n case '.tsx':\n return 'tsx';\n case '.jsx':\n return 'jsx';\n default:\n return 'javascript';\n }\n}\n\nfunction isTypeScriptLike(language: Language): boolean {\n return language === 'typescript' || language === 'tsx';\n}\n\nexport async function parseFile(filePath: string): Promise<ParsedFile> {\n const source = await fs.readFile(filePath, 'utf-8');\n return parseSource(filePath, source);\n}\n\nexport function parseSource(filePath: string, source: string): ParsedFile {\n const language = detectLanguage(filePath);\n\n try {\n const ast = parse(source, {\n jsx: language === 'jsx' || language === 'tsx',\n tsx: language === 'tsx',\n loc: true,\n range: true,\n comment: true,\n tokens: false,\n errorOnUnknownASTType: false,\n allowInvalidAST: true,\n suppressDeprecatedPropertyWarnings: true,\n });\n\n return { filePath, source, ast, language };\n } catch (err) {\n // Try again without TypeScript-specific syntax for JS files\n if (!isTypeScriptLike(language)) {\n try {\n const ast = parse(source, {\n jsx: language === 'jsx',\n loc: true,\n range: true,\n comment: true,\n tokens: false,\n errorOnUnknownASTType: false,\n allowInvalidAST: true,\n suppressDeprecatedPropertyWarnings: true,\n });\n return { filePath, source, ast, language };\n } catch {\n // Fall through to the original error\n }\n }\n\n const message = err instanceof Error ? err.message : 'Unknown parse error';\n\n throw new ParseError(`Failed to parse ${filePath}: ${message}`, filePath, err);\n }\n}\n\nexport function extractSnippet(source: string, line: number, contextLines = 2): string {\n const lines = source.split('\\n');\n const start = Math.max(0, line - 1 - contextLines);\n const end = Math.min(lines.length, line + contextLines);\n\n return lines\n .slice(start, end)\n .map((l, i) => {\n const lineNum = start + i + 1;\n const marker = lineNum === line ? '>' : ' ';\n return `${marker} ${String(lineNum).padStart(4, ' ')} | ${l}`;\n })\n .join('\\n');\n}\n","export const DOCS_BASE_URL = 'https://clean-slop.dev/docs';\nexport const PACKAGE_NAME = 'clean-slop';\n\nexport const SEVERITY_ORDER: Record<string, number> = {\n critical: 5,\n high: 4,\n medium: 3,\n low: 2,\n info: 1,\n};\n\nexport const SEVERITY_COLORS: Record<string, string> = {\n critical: '\\x1b[31m', // red\n high: '\\x1b[91m', // bright red\n medium: '\\x1b[33m', // yellow\n low: '\\x1b[36m', // cyan\n info: '\\x1b[37m', // gray\n};\n\nexport const RESET = '\\x1b[0m';\nexport const BOLD = '\\x1b[1m';\nexport const DIM = '\\x1b[2m';\nexport const GREEN = '\\x1b[32m';\nexport const YELLOW = '\\x1b[33m';\nexport const RED = '\\x1b[31m';\nexport const CYAN = '\\x1b[36m';\nexport const GRAY = '\\x1b[90m';\n","import type {\n Issue,\n ParsedFile,\n ResolvedConfig,\n Rule,\n RuleCategory,\n RuleContext,\n RuleSeverityOverride,\n Severity,\n} from '../types.js';\nimport { DOCS_BASE_URL } from '../utils/constants.js';\nimport { extractSnippet } from '../parsers/source-parser.js';\n\nexport class RuleEngine {\n private rules: Map<string, Rule> = new Map();\n\n register(rule: Rule): void {\n if (this.rules.has(rule.meta.id)) {\n throw new Error(`Rule \"${rule.meta.id}\" is already registered.`);\n }\n this.rules.set(rule.meta.id, rule);\n }\n\n registerAll(rules: Rule[]): void {\n for (const rule of rules) {\n this.register(rule);\n }\n }\n\n getRule(id: string): Rule | undefined {\n return this.rules.get(id);\n }\n\n getRules(): Rule[] {\n return Array.from(this.rules.values());\n }\n\n getRulesByCategory(category: RuleCategory): Rule[] {\n return this.getRules().filter((r) => r.meta.category === category);\n }\n\n runOnFile(parsedFile: ParsedFile, config: ResolvedConfig): Issue[] {\n const issues: Issue[] = [];\n\n for (const rule of this.rules.values()) {\n // Check category is enabled\n if (!config.categories[rule.meta.category]) continue;\n\n // Check rule-level override\n const ruleConfig = config.rules[rule.meta.id];\n const severityOverride = this.resolveSeverityOverride(ruleConfig);\n if (severityOverride === 'off') continue;\n\n const effectiveSeverity = severityOverride ?? rule.meta.severity;\n\n const ruleIssues: Issue[] = [];\n\n const context: RuleContext = {\n filePath: parsedFile.filePath,\n source: parsedFile.source,\n ast: parsedFile.ast,\n config,\n report(partial) {\n const snippet =\n partial.snippet ?? extractSnippet(parsedFile.source, partial.location.line);\n\n ruleIssues.push({\n ruleId: rule.meta.id,\n ruleName: rule.meta.name,\n category: rule.meta.category,\n severity: effectiveSeverity,\n confidence: rule.meta.confidence,\n docsUrl: rule.meta.docsUrl ?? `${DOCS_BASE_URL}/rules/${rule.meta.id}`,\n snippet,\n ...partial,\n });\n },\n };\n\n try {\n rule.create(context);\n } catch {\n // Rule execution errors should not crash the scan\n }\n\n issues.push(...ruleIssues);\n }\n\n return issues;\n }\n\n private resolveSeverityOverride(\n ruleConfig: ResolvedConfig['rules'][string] | undefined,\n ): Severity | 'off' | null {\n if (ruleConfig === undefined) return null;\n\n if (typeof ruleConfig === 'string') {\n return ruleConfig as RuleSeverityOverride;\n }\n\n if (typeof ruleConfig === 'object' && ruleConfig !== null) {\n if ('severity' in ruleConfig && ruleConfig.severity) {\n return ruleConfig.severity as RuleSeverityOverride;\n }\n }\n\n return null;\n }\n}\n","/**\n * Lightweight AST traversal utilities that work with the\n * @typescript-eslint/typescript-estree AST format.\n */\n\nexport type ASTNode = Record<string, unknown> & {\n type: string;\n loc?: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n};\n\nexport type Visitor = {\n [nodeType: string]: (node: ASTNode) => void;\n};\n\n/**\n * Walk an AST depth-first, calling visitor handlers by node type.\n */\nexport function traverse(ast: unknown, visitor: Visitor): void {\n if (!ast || typeof ast !== 'object') return;\n\n const node = ast as ASTNode;\n\n if (typeof node.type === 'string') {\n const handler = visitor[node.type];\n if (handler) handler(node);\n\n const wildcard = visitor['*'];\n if (wildcard) wildcard(node);\n }\n\n for (const key of Object.keys(node)) {\n if (key === 'parent') continue;\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n traverse(item, visitor);\n }\n } else if (child && typeof child === 'object' && 'type' in (child as object)) {\n traverse(child, visitor);\n }\n }\n}\n\n/**\n * Collect all nodes of a given type from an AST subtree.\n */\nexport function findAll(ast: unknown, nodeType: string): ASTNode[] {\n const results: ASTNode[] = [];\n traverse(ast, {\n [nodeType](node) {\n results.push(node);\n },\n });\n return results;\n}\n\n/**\n * Find the first node of a given type.\n */\nexport function findFirst(ast: unknown, nodeType: string): ASTNode | null {\n for (const node of findAll(ast, nodeType)) {\n return node;\n }\n return null;\n}\n\n/**\n * Get the start location of a node, with safe fallback.\n */\nexport function getLocation(\n node: ASTNode,\n filePath: string,\n): { file: string; line: number; column: number } {\n return {\n file: filePath,\n line: node.loc?.start.line ?? 1,\n column: node.loc?.start.column ?? 0,\n };\n}\n\n/**\n * Get a string value from a node's property if it is a string literal.\n */\nexport function getStringValue(node: ASTNode | unknown): string | null {\n if (!node || typeof node !== 'object') return null;\n const n = node as ASTNode;\n if (n.type === 'Literal' && typeof n.value === 'string') return n.value;\n if (n.type === 'TemplateLiteral') {\n const quasis = n.quasis as ASTNode[] | undefined;\n if (quasis && quasis.length === 1) {\n const cooked = (quasis[0] as Record<string, unknown>)?.value as\n Record<string, unknown> | undefined;\n if (typeof cooked?.cooked === 'string') return cooked.cooked;\n }\n }\n return null;\n}\n\n/**\n * Get a callee name from a CallExpression node.\n */\nexport function getCalleeName(node: ASTNode): string | null {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return null;\n\n if (callee.type === 'Identifier') {\n return callee.name as string;\n }\n\n if (callee.type === 'MemberExpression') {\n const obj = callee.object as ASTNode | undefined;\n const prop = callee.property as ASTNode | undefined;\n if (obj && prop) {\n const objName = obj.name as string | undefined;\n const propName = prop.name as string | undefined;\n if (objName && propName) return `${objName}.${propName}`;\n }\n }\n\n return null;\n}\n\n/**\n * Check whether a node represents a function of any kind.\n */\nexport function isFunctionNode(node: ASTNode): boolean {\n return (\n node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression' ||\n node.type === 'ArrowFunctionExpression'\n );\n}\n\n/**\n * Count the number of statements inside a function body.\n */\nexport function countFunctionLines(node: ASTNode): number {\n if (!node.loc) return 0;\n return node.loc.end.line - node.loc.start.line + 1;\n}\n\n/**\n * Calculate cyclomatic complexity of a function node.\n * Counts: if, else if, case, ternary, &&, ||, ??, for, while, do, catch.\n */\nexport function cyclomaticComplexity(funcNode: ASTNode): number {\n let complexity = 1;\n\n traverse(funcNode, {\n IfStatement() {\n complexity++;\n },\n SwitchCase(node) {\n if (node.test !== null) complexity++;\n },\n ConditionalExpression() {\n complexity++;\n },\n LogicalExpression(node) {\n if (node.operator === '&&' || node.operator === '||' || node.operator === '??') {\n complexity++;\n }\n },\n ForStatement() {\n complexity++;\n },\n ForInStatement() {\n complexity++;\n },\n ForOfStatement() {\n complexity++;\n },\n WhileStatement() {\n complexity++;\n },\n DoWhileStatement() {\n complexity++;\n },\n CatchClause() {\n complexity++;\n },\n });\n\n return complexity;\n}\n\n/**\n * Get the maximum nesting depth of a function body.\n */\nexport function maxNestingDepth(ast: unknown, startDepth = 0): number {\n if (!ast || typeof ast !== 'object') return startDepth;\n const node = ast as ASTNode;\n\n const nestingTypes = new Set([\n 'IfStatement',\n 'ForStatement',\n 'ForInStatement',\n 'ForOfStatement',\n 'WhileStatement',\n 'DoWhileStatement',\n 'SwitchStatement',\n 'TryStatement',\n 'WithStatement',\n ]);\n\n let max = startDepth;\n\n const walk = (n: unknown, depth: number): void => {\n if (!n || typeof n !== 'object') return;\n const nn = n as ASTNode;\n\n const currentDepth = nestingTypes.has(nn.type) ? depth + 1 : depth;\n if (currentDepth > max) max = currentDepth;\n\n for (const key of Object.keys(nn)) {\n if (key === 'parent') continue;\n const child = nn[key];\n if (Array.isArray(child)) {\n for (const item of child) walk(item, currentDepth);\n } else if (child && typeof child === 'object' && 'type' in (child as object)) {\n walk(child, currentDepth);\n }\n }\n };\n\n walk(node, startDepth);\n return max;\n}\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/empty-catch',\n name: 'Empty Catch Block',\n category: 'ai-slop',\n severity: 'high',\n confidence: 'certain',\n description: 'Detects catch blocks that silently swallow errors.',\n rationale:\n 'Empty catch blocks are a hallmark of AI-generated code that handles the error path ' +\n 'syntactically but not semantically. They hide failures, making bugs invisible in production.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/empty-catch',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CatchClause(node: ASTNode) {\n const body = node.body as ASTNode | undefined;\n if (!body) return;\n\n const bodyNode = body as ASTNode & { body?: unknown[] };\n const statements = bodyNode.body ?? [];\n\n // A catch is empty if it has zero statements or only comments\n const hasStatements = statements.some((stmt: unknown) => {\n const s = stmt as ASTNode;\n // Allow if there is at least one non-comment statement\n return s.type !== 'EmptyStatement';\n });\n\n if (!hasStatements) {\n context.report({\n message: 'Catch block is empty and silently swallows errors.',\n explanation:\n 'This catch block catches exceptions but does nothing with them. ' +\n 'Errors are silently discarded, making it impossible to detect or diagnose failures.',\n impact:\n 'Silent error swallowing causes mysterious failures in production. ' +\n 'Debugging becomes extremely difficult because the exception trail disappears.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'At minimum, log the error. Consider re-throwing if the caller should know about the failure.',\n code: 'catch (err) {\\n console.error(\"Unexpected error:\", err);\\n // or: throw err;\\n}',\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst TODO_PATTERN =\n /\\b(TODO|FIXME|HACK|XXX|TEMP|TEMPORARY|PLACEHOLDER|NOT IMPLEMENTED|NOT_IMPLEMENTED)\\b/i;\nconst THROW_NOT_IMPLEMENTED = /not.?implemented|to.?do|todo/i;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/todo-implementation',\n name: 'TODO / Placeholder Implementation',\n category: 'ai-slop',\n severity: 'high',\n confidence: 'high',\n description: 'Detects TODO comments, placeholder implementations, and unfinished code.',\n rationale:\n 'AI code generators frequently produce functions with TODO bodies, placeholder returns, ' +\n 'or throw new Error(\"Not implemented\"). These skeletons look complete but break at runtime.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/todo-implementation',\n fixable: false,\n },\n\n create(context) {\n // Scan comments embedded in the AST\n const astWithComments = context.ast as { comments?: ASTNode[] };\n const comments: ASTNode[] = astWithComments.comments ?? [];\n\n for (const comment of comments) {\n const value = (comment.value as string | undefined) ?? '';\n if (TODO_PATTERN.test(value)) {\n context.report({\n message: `${comment.type === 'Line' ? '//' : '/*'} comment contains TODO/FIXME marker.`,\n explanation:\n 'This comment indicates unfinished work. In production builds, TODO markers ' +\n 'represent missing functionality that was never implemented.',\n impact:\n 'Incomplete implementations cause runtime failures, data corruption, or silent no-ops ' +\n 'when the unfinished code path is reached.',\n location: getLocation(comment, context.filePath),\n fix: {\n description:\n 'Implement the described functionality or create a tracked issue and remove the inline marker.',\n },\n });\n }\n }\n\n // Detect `throw new Error(\"Not implemented\")` patterns\n traverse(context.ast, {\n ThrowStatement(node: ASTNode) {\n const argument = node.argument as ASTNode | undefined;\n if (!argument) return;\n\n if (argument.type === 'NewExpression' || argument.type === 'CallExpression') {\n const callee = argument.callee as ASTNode | undefined;\n if (!callee) return;\n\n const calleeName = callee.type === 'Identifier' ? (callee.name as string) : null;\n if (calleeName !== 'Error') return;\n\n const args = (argument.arguments as ASTNode[] | undefined) ?? [];\n if (args.length === 0) return;\n\n const firstArg = args[0] as ASTNode;\n const msgValue = firstArg.type === 'Literal' ? String(firstArg.value) : '';\n\n if (THROW_NOT_IMPLEMENTED.test(msgValue)) {\n context.report({\n message: `Placeholder implementation: throw new Error(\"${msgValue}\")`,\n explanation:\n 'This function throws \"Not implemented\" or a similar placeholder. ' +\n 'It was likely auto-generated and never completed.',\n impact:\n 'Calling this function in production causes an immediate unhandled exception.',\n location: getLocation(node, context.filePath),\n fix: {\n description: 'Implement the function body or remove it from the codebase.',\n },\n });\n }\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, countFunctionLines, isFunctionNode } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst MAX_LINES = 80;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/giant-function',\n name: 'Giant Function',\n category: 'ai-slop',\n severity: 'medium',\n confidence: 'certain',\n description: `Detects functions exceeding ${MAX_LINES} lines, a common sign of AI-generated monoliths.`,\n rationale:\n 'AI code generators tend to dump entire workflows into single functions without decomposing ' +\n 'them. Functions longer than 80 lines are difficult to understand, test, and maintain.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/giant-function',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n });\n\n function checkFunction(node: ASTNode): void {\n if (!isFunctionNode(node)) return;\n\n const lines = countFunctionLines(node);\n if (lines <= MAX_LINES) return;\n\n const idNode = node.id as ASTNode | undefined;\n const name = idNode ? String(idNode.name) : '<anonymous>';\n\n context.report({\n message: `Function \"${name}\" is ${lines} lines long (limit: ${MAX_LINES}).`,\n explanation:\n `This function is ${lines} lines long. Long functions are a strong indicator of ` +\n 'AI-generated code that placed all logic in one place without decomposition.',\n impact:\n 'Giant functions are untestable, unreadable, and violate the single-responsibility principle. ' +\n 'They make bug-fixing and code review slow and error-prone.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Break the function into smaller, focused functions. ' +\n 'Aim for functions under 40 lines that do one thing well.',\n },\n metadata: {\n lines,\n },\n });\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, maxNestingDepth, isFunctionNode } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst MAX_DEPTH = 4;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/excessive-nesting',\n name: 'Excessive Nesting',\n category: 'ai-slop',\n severity: 'medium',\n confidence: 'certain',\n description: `Detects functions with control-flow nesting deeper than ${MAX_DEPTH} levels.`,\n rationale:\n 'Deeply nested code is a strong sign of AI-generated logic that was not refactored. ' +\n 'Early returns, guard clauses, and extracted helper functions eliminate deep nesting.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/excessive-nesting',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n });\n\n function checkFunction(node: ASTNode): void {\n if (!isFunctionNode(node)) return;\n\n const depth = maxNestingDepth(node.body as unknown, 0);\n if (depth <= MAX_DEPTH) return;\n\n const idNode = node.id as ASTNode | undefined;\n const name = idNode ? String(idNode.name) : '<anonymous>';\n\n context.report({\n message: `Function \"${name}\" has nesting depth of ${depth} (limit: ${MAX_DEPTH}).`,\n explanation:\n `This function contains ${depth} levels of nested blocks. ` +\n 'Each additional level of nesting makes logic exponentially harder to follow.',\n impact:\n 'Deeply nested code is error-prone, difficult to test, and nearly impossible to review. ' +\n 'Bugs introduced in deep nesting often escape code review.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use early returns to flatten nesting. Extract deeply-nested logic into named helper functions. ' +\n 'Consider inversion of conditions to reduce if/else chains.',\n },\n metadata: { depth },\n });\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects validation functions that always return true or do nothing meaningful.\n *\n * Common AI-generated pattern:\n * function validateEmail(email) { return email.includes('@'); }\n * function isValid(data) { return true; }\n */\n\nconst VALIDATION_NAME_PATTERN = /^(validate|isValid|check|verify|sanitize|assert)/i;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/fake-validation',\n name: 'Fake Validation',\n category: 'ai-slop',\n severity: 'high',\n confidence: 'medium',\n description:\n 'Detects validation functions that trivially return true without meaningful checks.',\n rationale:\n 'AI code generators often produce validation functions with names that imply safety ' +\n 'but bodies that unconditionally approve all input. This creates a false sense of security.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/fake-validation',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n });\n\n function checkFunction(node: ASTNode): void {\n const idNode = (node.id ?? (node.parent as ASTNode | undefined)?.id) as ASTNode | undefined;\n\n let name: string | null = null;\n\n // Named function\n if (idNode?.type === 'Identifier') {\n name = String(idNode.name);\n }\n\n // Variable declarator: const validateX = () => ...\n const parent = node.parent as ASTNode | undefined;\n if (!name && parent?.type === 'VariableDeclarator') {\n const idPart = parent.id as ASTNode | undefined;\n if (idPart?.type === 'Identifier') {\n name = String(idPart.name);\n }\n }\n\n if (!name || !VALIDATION_NAME_PATTERN.test(name)) return;\n\n const body = node.body as ASTNode | undefined;\n if (!body) return;\n\n // Arrow function with expression body: const isValid = () => true\n if (body.type !== 'BlockStatement') {\n if (body.type === 'Literal' && body.value === true) {\n reportFakeValidation(node, name);\n }\n return;\n }\n\n const statements = (body as ASTNode & { body?: unknown[] }).body ?? [];\n\n // Single return true;\n if (statements.length === 1) {\n const stmt = statements[0] as ASTNode;\n if (stmt.type === 'ReturnStatement') {\n const arg = stmt.argument as ASTNode | undefined;\n if (arg?.type === 'Literal' && arg.value === true) {\n reportFakeValidation(node, name);\n }\n }\n }\n }\n\n function reportFakeValidation(node: ASTNode, name: string): void {\n context.report({\n message: `\"${name}\" appears to be a fake validation function that always returns true.`,\n explanation:\n `The function \"${name}\" has a name suggesting it performs validation, ` +\n 'but its body unconditionally returns true. All inputs will pass validation.',\n impact:\n 'Fake validation creates false security. Malicious or malformed input bypasses ' +\n 'what appears to be a safety check, potentially causing data corruption or security breaches.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Implement real validation logic that checks the input against expected constraints. ' +\n 'Use a validation library such as zod, joi, or yup for complex schemas.',\n },\n });\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, cyclomaticComplexity, isFunctionNode } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst COMPLEXITY_THRESHOLD = 10;\nconst COMPLEXITY_HIGH = 20;\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/high-complexity',\n name: 'High Cyclomatic Complexity',\n category: 'ai-slop',\n severity: 'medium',\n confidence: 'certain',\n description: `Detects functions with cyclomatic complexity exceeding ${COMPLEXITY_THRESHOLD}.`,\n rationale:\n 'High complexity is a reliable indicator of AI-generated code that concatenated ' +\n 'multiple responsibilities into a single function. Complex functions are difficult to test ' +\n 'and almost impossible to reason about correctly.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/high-complexity',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkFunction,\n FunctionExpression: checkFunction,\n ArrowFunctionExpression: checkFunction,\n });\n\n function checkFunction(node: ASTNode): void {\n if (!isFunctionNode(node)) return;\n\n const complexity = cyclomaticComplexity(node);\n if (complexity <= COMPLEXITY_THRESHOLD) return;\n\n const idNode = node.id as ASTNode | undefined;\n const name = idNode ? String(idNode.name) : '<anonymous>';\n const isHigh = complexity >= COMPLEXITY_HIGH;\n\n context.report({\n message: `Function \"${name}\" has cyclomatic complexity of ${complexity} (limit: ${COMPLEXITY_THRESHOLD}).`,\n explanation:\n `Cyclomatic complexity measures the number of independent paths through code. ` +\n `A complexity of ${complexity} means this function has at least ${complexity} independent ` +\n 'execution paths that all need to be understood and tested.',\n impact: isHigh\n ? 'Extreme complexity. This function cannot be reliably tested or maintained. ' +\n 'Defects introduced here will be very difficult to locate.'\n : 'High complexity makes this function difficult to test thoroughly. ' +\n 'Each untested path is a potential production defect.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Extract independent logic branches into well-named helper functions. ' +\n 'Aim for functions with complexity under 5. Consider strategy or command patterns ' +\n 'for functions that switch on a type discriminant.',\n },\n metadata: { complexity },\n });\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { findAll, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst rule: Rule = {\n meta: {\n id: 'ai-slop/dead-code',\n name: 'Dead Code After Return',\n category: 'ai-slop',\n severity: 'medium',\n confidence: 'certain',\n description:\n 'Detects unreachable code that follows a return, throw, break, or continue statement.',\n rationale:\n 'Dead code after early exits is a common artifact of AI code generation. It indicates ' +\n 'that the generator added logic without tracking control flow, producing code that never executes.',\n docsUrl: 'https://clean-slop.dev/docs/rules/ai-slop/dead-code',\n fixable: true,\n },\n\n create(context) {\n const terminatingTypes = new Set([\n 'ReturnStatement',\n 'ThrowStatement',\n 'BreakStatement',\n 'ContinueStatement',\n ]);\n\n // Find all block statements\n const blocks = findAll(context.ast, 'BlockStatement');\n\n for (const block of blocks) {\n const statements = (block as ASTNode & { body?: ASTNode[] }).body ?? [];\n\n for (let i = 0; i < statements.length - 1; i++) {\n const stmt = statements[i];\n if (!stmt) continue;\n\n if (terminatingTypes.has(stmt.type)) {\n const nextStmt = statements[i + 1];\n if (!nextStmt) continue;\n\n // Don't flag the closing statement of an else chain\n if (nextStmt.type === 'IfStatement') continue;\n\n context.report({\n message: `Unreachable code after ${stmt.type}.`,\n explanation:\n `The statement at this line is unreachable because a ${stmt.type} on the previous line ` +\n 'will always exit this block before this code can execute.',\n impact:\n 'Dead code bloats the bundle, misleads maintainers, and indicates logic errors. ' +\n 'Code that was intended to run but is unreachable represents a latent bug.',\n location: getLocation(nextStmt, context.filePath),\n fix: {\n description:\n 'Remove the unreachable code. If it was intended to run, move it before the terminating statement.',\n },\n });\n\n // Only report the first occurrence per block to avoid noise\n break;\n }\n }\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, getCalleeName } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst DANGEROUS_EVAL_APIS = new Set(['eval', 'Function', 'execScript']);\n\nconst rule: Rule = {\n meta: {\n id: 'security/unsafe-eval',\n name: 'Unsafe eval / Function Constructor',\n category: 'security',\n severity: 'critical',\n confidence: 'high',\n description:\n 'Detects use of eval() and the Function constructor, which execute arbitrary code.',\n rationale:\n 'eval() and new Function() execute strings as JavaScript code. When any part of the ' +\n 'string comes from user input or external data, this is a code injection vulnerability.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/unsafe-eval',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n const name = getCalleeName(node);\n if (name && DANGEROUS_EVAL_APIS.has(name)) {\n context.report({\n message: `Unsafe use of ${name}().`,\n explanation:\n `${name}() evaluates its argument as JavaScript code at runtime. ` +\n 'If any part of the evaluated string is derived from external data, ' +\n 'an attacker can inject and execute arbitrary code.',\n impact:\n 'Code injection via eval is one of the highest-severity vulnerabilities in web applications. ' +\n 'It allows complete application compromise, data exfiltration, and remote code execution.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Replace eval() with explicit logic. ' +\n 'If you need to parse JSON, use JSON.parse(). ' +\n 'If you need dynamic behavior, use a lookup table or strategy pattern.',\n },\n });\n }\n },\n\n NewExpression(node: ASTNode) {\n const callee = node.callee as ASTNode | undefined;\n if (callee?.type === 'Identifier' && callee.name === 'Function') {\n context.report({\n message: 'Unsafe use of new Function() constructor.',\n explanation:\n 'new Function() constructs and executes JavaScript from a string at runtime. ' +\n 'This is functionally equivalent to eval() and shares the same injection risks.',\n impact:\n 'Allows arbitrary code execution if the string argument contains any external data. ' +\n 'Bypasses Content Security Policy directives and static analysis.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Eliminate the dynamic code construction. ' +\n 'Use explicit functions, closures, or a sandboxed evaluation library (e.g., vm2) ' +\n 'if dynamic execution is genuinely required.',\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\ninterface SecretPattern {\n name: string;\n pattern: RegExp;\n description: string;\n}\n\nconst SECRET_PATTERNS: SecretPattern[] = [\n {\n name: 'API Key',\n pattern: /(?:api[_-]?key|apikey)\\s*[:=]\\s*['\"][a-zA-Z0-9_-]{20,}['\"]/i,\n description: 'hardcoded API key',\n },\n {\n name: 'AWS Access Key',\n pattern: /AKIA[0-9A-Z]{16}/,\n description: 'AWS access key ID',\n },\n {\n name: 'AWS Secret',\n pattern: /aws[_-]?secret[_-]?(?:access[_-]?)?key\\s*[:=]\\s*['\"][^'\"]{20,}['\"]/i,\n description: 'AWS secret access key',\n },\n {\n name: 'Private Key',\n pattern: /-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----/,\n description: 'PEM private key',\n },\n {\n name: 'Password',\n pattern: /(?:password|passwd|pwd)\\s*[:=]\\s*['\"][^'\"]{4,}['\"]/i,\n description: 'hardcoded password',\n },\n {\n name: 'JWT Secret',\n pattern: /(?:jwt[_-]?secret|token[_-]?secret)\\s*[:=]\\s*['\"][^'\"]{8,}['\"]/i,\n description: 'hardcoded JWT signing secret',\n },\n {\n name: 'Database URL',\n pattern: /(?:mongo(?:db)?|postgres(?:ql)?|mysql|redis):\\/\\/[^:'\"]+:[^@'\"]+@/i,\n description: 'database connection string with credentials',\n },\n {\n name: 'Generic Secret',\n pattern: /(?:secret|token)\\s*[:=]\\s*['\"][a-zA-Z0-9+/=_-]{20,}['\"]/i,\n description: 'hardcoded secret or token',\n },\n {\n name: 'GitHub Token',\n pattern: /ghp_[a-zA-Z0-9]{36}/,\n description: 'GitHub personal access token',\n },\n {\n name: 'Stripe Key',\n pattern: /(?:sk|pk)_(?:live|test)_[a-zA-Z0-9]{24,}/,\n description: 'Stripe API key',\n },\n];\n\n// Strings that indicate the value is a placeholder, not a real secret\nconst PLACEHOLDER_PATTERNS = [\n /^(?:your[-_]?)?(?:api[-_]?)?(?:key|secret|token|password)$/i,\n /^<.+>$/,\n /^xxx/i,\n /^placeholder/i,\n /^\\*+$/,\n /^test$/i,\n /^example$/i,\n /^change[-_]?me/i,\n /process\\.env\\./,\n];\n\nfunction isPlaceholder(value: string): boolean {\n return PLACEHOLDER_PATTERNS.some((p) => p.test(value));\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/hardcoded-secrets',\n name: 'Hardcoded Secrets',\n category: 'security',\n severity: 'critical',\n confidence: 'high',\n description: 'Detects API keys, passwords, tokens, and secrets hardcoded in source files.',\n rationale:\n 'Hardcoded credentials are one of the most common causes of security breaches. ' +\n 'When code is committed to version control, credentials are permanently exposed ' +\n 'in history even if removed later.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/hardcoded-secrets',\n fixable: false,\n },\n\n create(context) {\n const lines = context.source.split('\\n');\n\n lines.forEach((line, index) => {\n for (const { name, pattern, description } of SECRET_PATTERNS) {\n if (!pattern.test(line)) continue;\n\n // Try to extract the value portion and check if it is a placeholder\n const valueMatch = line.match(/[:=]\\s*['\"]([^'\"]+)['\"]/);\n if (valueMatch && valueMatch[1] && isPlaceholder(valueMatch[1])) continue;\n\n context.report({\n message: `Possible hardcoded ${name} detected.`,\n explanation:\n `A potential ${description} was found hardcoded in source. ` +\n 'Credentials in source files are committed to version control and accessible to anyone ' +\n 'with repository access, including in private repositories through history and forks.',\n impact:\n 'Exposed credentials can be used to access cloud infrastructure, databases, and third-party services. ' +\n 'Even after removal, they remain in git history. Rotation is required immediately.',\n location: {\n file: context.filePath,\n line: index + 1,\n column: 0,\n },\n fix: {\n description:\n 'Remove the credential from source. Store secrets in environment variables (process.env.SECRET_NAME) ' +\n 'or a secrets manager (AWS Secrets Manager, HashiCorp Vault, Doppler). ' +\n 'Rotate the exposed credential immediately.',\n code: \"const apiKey = process.env.API_KEY;\\nif (!apiKey) throw new Error('API_KEY environment variable is required.');\",\n },\n });\n\n // One report per line is enough\n break;\n }\n });\n\n // Also check string literals in the AST for patterns that line-scanning might miss\n traverse(context.ast, {\n Literal(node: ASTNode) {\n if (typeof node.value !== 'string') return;\n const val: string = node.value;\n\n if (val.length < 20) return;\n if (isPlaceholder(val)) return;\n\n for (const { name, pattern, description } of SECRET_PATTERNS) {\n if (pattern.test(val)) {\n context.report({\n message: `String literal appears to be a hardcoded ${name}.`,\n explanation:\n `The string \"${val.slice(0, 8)}...\" matches a pattern for a ${description}. ` +\n 'Hardcoding credentials in string literals exposes them in source control.',\n impact:\n 'Immediate rotation of the credential is required. All historical commits ' +\n 'containing this value must be treated as compromised.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Replace with an environment variable reference: process.env.SECRET_NAME',\n },\n });\n break;\n }\n }\n },\n });\n\n function traverse(ast: unknown, visitor: Record<string, (n: ASTNode) => void>): void {\n if (!ast || typeof ast !== 'object') return;\n const node = ast as ASTNode;\n if (typeof node.type === 'string') {\n visitor[node.type]?.(node);\n }\n for (const key of Object.keys(node)) {\n if (key === 'parent') continue;\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) traverse(item, visitor);\n } else if (child && typeof child === 'object' && 'type' in (child as object)) {\n traverse(child, visitor);\n }\n }\n }\n\n function getLocation(node: ASTNode, filePath: string) {\n return {\n file: filePath,\n line: node.loc?.start.line ?? 1,\n column: node.loc?.start.column ?? 0,\n };\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects SQL injection vulnerabilities by looking for template literals or\n * string concatenation that embeds variables into SQL query strings.\n *\n * Patterns detected:\n * db.query(`SELECT * FROM users WHERE id = ${userId}`)\n * db.query(\"SELECT * FROM users WHERE id = \" + userId)\n * connection.execute(\"INSERT INTO \" + tableName + \" VALUES (?)\")\n */\n\nconst SQL_KEYWORDS =\n /\\b(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE|ALTER|TRUNCATE|EXEC|EXECUTE|UNION|FROM|WHERE|JOIN)\\b/i;\n\nconst SQL_CALL_PATTERNS = [\n 'query',\n 'execute',\n 'exec',\n 'run',\n 'prepare',\n 'raw',\n 'db.query',\n 'db.execute',\n 'pool.query',\n 'connection.query',\n 'knex.raw',\n 'sequelize.query',\n];\n\nfunction looksLikeSqlCall(node: ASTNode): boolean {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return false;\n\n if (callee.type === 'Identifier') {\n return SQL_CALL_PATTERNS.includes(String(callee.name));\n }\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier') {\n return SQL_CALL_PATTERNS.some((p) => p.endsWith(`.${prop.name}`) || p === prop.name);\n }\n }\n\n return false;\n}\n\nfunction containsSqlKeywords(str: string): boolean {\n return SQL_KEYWORDS.test(str);\n}\n\nfunction getTemplateRawContent(node: ASTNode): string {\n const quasis = (node.quasis as ASTNode[] | undefined) ?? [];\n return quasis\n .map((q) => {\n const val = q.value as Record<string, unknown> | undefined;\n return String(val?.cooked ?? val?.raw ?? '');\n })\n .join('...');\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/sql-injection',\n name: 'SQL Injection',\n category: 'security',\n severity: 'critical',\n confidence: 'high',\n description:\n 'Detects SQL queries built with string concatenation or template literals containing variables.',\n rationale:\n 'SQL injection remains the most prevalent web application vulnerability. ' +\n 'Embedding JavaScript variables directly into SQL strings gives attackers control ' +\n 'over query structure.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/sql-injection',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n if (!looksLikeSqlCall(node)) return;\n\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const firstArg = args[0] as ASTNode | undefined;\n if (!firstArg) return;\n\n // Check template literal with expressions: `SELECT ... ${variable}`\n if (firstArg.type === 'TemplateLiteral') {\n const expressions = (firstArg.expressions as ASTNode[] | undefined) ?? [];\n if (expressions.length === 0) return;\n\n const rawContent = getTemplateRawContent(firstArg);\n if (!containsSqlKeywords(rawContent)) return;\n\n context.report({\n message:\n 'Possible SQL injection: template literal with expressions passed to query function.',\n explanation:\n 'This SQL query is built using a template literal that embeds JavaScript variables. ' +\n 'If any of the interpolated values derive from user input, an attacker can alter the ' +\n 'query structure by injecting SQL syntax.',\n impact:\n 'SQL injection can lead to unauthorized data access, data modification, ' +\n 'authentication bypass, and in some configurations, remote code execution on the database server.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use parameterized queries or prepared statements. ' +\n 'Pass user-controlled values as parameters, never as part of the SQL string.',\n code:\n '// Instead of:\\n' +\n '// db.query(`SELECT * FROM users WHERE id = ${userId}`)\\n\\n' +\n '// Use parameterized queries:\\n' +\n 'db.query(\"SELECT * FROM users WHERE id = ?\", [userId])',\n },\n });\n }\n\n // Check string concatenation: \"SELECT...\" + variable\n if (firstArg.type === 'BinaryExpression' && firstArg.operator === '+') {\n const leftStr = extractLeftmostString(firstArg);\n if (leftStr && containsSqlKeywords(leftStr)) {\n context.report({\n message: 'Possible SQL injection: string concatenation in SQL query.',\n explanation:\n 'This SQL query is constructed by concatenating strings and variables. ' +\n 'Variables injected into a SQL string allow attackers to manipulate the query.',\n impact:\n 'SQL injection can expose the entire database, bypass authentication, ' +\n 'and enable destructive operations (DROP TABLE, etc.).',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Replace string concatenation with parameterized queries. ' +\n 'Never construct SQL from variables.',\n code: 'db.query(\\n \"SELECT * FROM users WHERE name = ? AND role = ?\",\\n [userName, userRole]\\n)',\n },\n });\n }\n }\n },\n });\n\n function extractLeftmostString(node: ASTNode): string | null {\n if (node.type === 'Literal' && typeof node.value === 'string') {\n return node.value;\n }\n if (node.type === 'BinaryExpression' && node.operator === '+') {\n return extractLeftmostString(node.left as ASTNode);\n }\n return null;\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst DANGEROUS_CHILD_PROCESS = new Set([\n 'exec',\n 'execSync',\n 'spawn',\n 'spawnSync',\n 'execFile',\n 'execFileSync',\n]);\n\nfunction looksLikeChildProcessCall(node: ASTNode): boolean {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return false;\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier') {\n return DANGEROUS_CHILD_PROCESS.has(String(prop.name));\n }\n }\n\n if (callee.type === 'Identifier') {\n return DANGEROUS_CHILD_PROCESS.has(String(callee.name));\n }\n\n return false;\n}\n\nfunction firstArgIsDynamic(node: ASTNode): boolean {\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const first = args[0] as ASTNode | undefined;\n if (!first) return false;\n\n // Static strings are generally safe (though not always)\n if (first.type === 'Literal') return false;\n\n // Template literals with expressions are dangerous\n if (first.type === 'TemplateLiteral') {\n const expressions = (first.expressions as ASTNode[] | undefined) ?? [];\n return expressions.length > 0;\n }\n\n // Any other expression (variable, concatenation, function call) is suspicious\n return true;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/command-injection',\n name: 'Command Injection',\n category: 'security',\n severity: 'critical',\n confidence: 'high',\n description:\n 'Detects child_process calls that build shell commands from variables, enabling command injection.',\n rationale:\n 'Passing user-controlled data to exec(), spawn(), or similar APIs allows an attacker ' +\n 'to inject shell metacharacters that execute arbitrary system commands.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/command-injection',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n if (!looksLikeChildProcessCall(node)) return;\n if (!firstArgIsDynamic(node)) return;\n\n const callee = node.callee as ASTNode;\n const prop = (\n callee.type === 'MemberExpression'\n ? (callee.property as ASTNode).name\n : (callee as ASTNode).name\n ) as string;\n\n context.report({\n message: `Possible command injection: dynamic argument passed to child_process.${prop}().`,\n explanation:\n `The first argument to ${prop}() appears to be dynamically constructed. ` +\n 'If any part of this argument derives from external input, an attacker can inject ' +\n 'shell metacharacters (e.g. ; rm -rf /) to execute arbitrary commands on the server.',\n impact:\n 'Command injection on a server results in full system compromise: data theft, ' +\n 'ransomware deployment, lateral movement, and persistent access.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use execFile() or spawn() with an argument array instead of exec() with a shell string. ' +\n 'Never pass user input to a shell command. Validate and whitelist all inputs.',\n code: \"// Dangerous:\\n// exec(`ls ${userInput}`)\\n\\n// Safe:\\nimport { execFile } from 'child_process';\\nexecFile('ls', [sanitizedPath], callback);\",\n },\n });\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst FS_WRITE_METHODS = new Set([\n 'readFile',\n 'readFileSync',\n 'writeFile',\n 'writeFileSync',\n 'readdir',\n 'readdirSync',\n 'createReadStream',\n 'createWriteStream',\n 'unlink',\n 'unlinkSync',\n 'stat',\n 'statSync',\n 'access',\n 'accessSync',\n 'open',\n 'openSync',\n]);\n\nfunction isFsCallWithDynamicPath(node: ASTNode): boolean {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return false;\n\n let methodName: string | null = null;\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier') methodName = String(prop.name);\n } else if (callee.type === 'Identifier') {\n methodName = String(callee.name);\n }\n\n if (!methodName || !FS_WRITE_METHODS.has(methodName)) return false;\n\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const first = args[0] as ASTNode | undefined;\n if (!first) return false;\n\n return first.type !== 'Literal';\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/path-traversal',\n name: 'Path Traversal',\n category: 'security',\n severity: 'critical',\n confidence: 'medium',\n description:\n 'Detects file system operations with dynamic paths that may allow path traversal attacks.',\n rationale:\n 'Path traversal occurs when an attacker uses \"../\" sequences in user-controlled input ' +\n 'to escape the intended directory and access arbitrary files.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/path-traversal',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n if (isFsCallWithDynamicPath(node)) {\n const callee = node.callee as ASTNode;\n const prop =\n callee.type === 'MemberExpression'\n ? String((callee.property as ASTNode).name)\n : String((callee as ASTNode).name);\n\n context.report({\n message: `Possible path traversal: dynamic path passed to fs.${prop}().`,\n explanation:\n `${prop}() is called with a non-literal path argument. ` +\n 'If this path is influenced by user input without sanitization, ' +\n 'an attacker can use \"../\" sequences to escape the intended directory.',\n impact:\n 'Successful path traversal allows reading sensitive system files (/etc/passwd, .env, ' +\n 'private keys), writing malicious content to arbitrary locations, or deleting critical files.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Resolve the path and verify it begins with the intended base directory before use.',\n code: \"import path from 'path';\\n\\nconst baseDir = path.resolve('./uploads');\\nconst safePath = path.resolve(baseDir, userInput);\\n\\nif (!safePath.startsWith(baseDir + path.sep)) {\\n throw new Error('Path traversal detected');\\n}\\n\\nfs.readFile(safePath, 'utf-8');\",\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects patterns that may allow prototype pollution:\n * obj[userInput] = value // bracket assignment with variable key\n * Object.assign(target, userInput) // merging untrusted object\n * _.merge(target, userInput) // lodash merge with untrusted object\n */\n\nconst MERGE_FUNCTIONS = new Set([\n 'Object.assign',\n '_.merge',\n '_.extend',\n '_.defaultsDeep',\n 'merge',\n 'deepMerge',\n 'deepExtend',\n]);\n\nfunction getFullCalleeName(node: ASTNode): string | null {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return null;\n\n if (callee.type === 'Identifier') return String(callee.name);\n\n if (callee.type === 'MemberExpression') {\n const obj = callee.object as ASTNode | undefined;\n const prop = callee.property as ASTNode | undefined;\n\n if (obj?.type === 'Identifier' && prop?.type === 'Identifier') {\n return `${obj.name}.${prop.name}`;\n }\n }\n\n return null;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/prototype-pollution',\n name: 'Prototype Pollution',\n category: 'security',\n severity: 'high',\n confidence: 'medium',\n description: 'Detects patterns that may allow attackers to pollute Object.prototype.',\n rationale:\n 'Prototype pollution allows an attacker to inject properties into Object.prototype, ' +\n 'affecting all objects in the application. This can bypass security checks, cause denial ' +\n 'of service, or enable remote code execution.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/prototype-pollution',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n // Detect: obj[variable] = value where variable could be __proto__\n AssignmentExpression(node: ASTNode) {\n const left = node.left as ASTNode | undefined;\n if (!left) return;\n\n if (left.type !== 'MemberExpression') return;\n if (!left.computed) return; // only bracket notation\n\n const prop = left.property as ASTNode | undefined;\n if (!prop) return;\n\n // Static string keys that are dangerous\n if (prop.type === 'Literal') {\n const key = String(prop.value);\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n context.report({\n message: `Assignment to dangerous property \"${key}\" may cause prototype pollution.`,\n explanation:\n `Assigning to obj[\"${key}\"] can modify Object.prototype when \"obj\" is a ` +\n 'user-controlled JSON payload or when the key is not validated.',\n impact:\n 'Prototype pollution can override security checks that compare against default values, ' +\n 'corrupt application state, and in some environments enable code execution.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Never assign to __proto__, constructor, or prototype from external input. ' +\n 'Validate object keys against an allowlist before assignment.',\n },\n });\n }\n } else {\n // Dynamic key - report as potential issue\n context.report({\n message:\n 'Dynamic bracket assignment may allow prototype pollution if key is not validated.',\n explanation:\n 'Writing to obj[dynamicKey] with an unvalidated key allows an attacker to set ' +\n '__proto__ or constructor, polluting Object.prototype for all objects.',\n impact:\n 'If the key comes from user-controlled input (query params, JSON body, headers), ' +\n 'this is an exploitable prototype pollution vulnerability.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Validate the key against an allowlist before assignment: ' +\n 'if (ALLOWED_KEYS.has(key)) obj[key] = value; ' +\n 'Or use Object.create(null) for dictionary objects.',\n },\n });\n }\n },\n\n // Detect Object.assign(target, untrustedSource) and lodash merge\n CallExpression(node: ASTNode) {\n const name = getFullCalleeName(node);\n if (!name || !MERGE_FUNCTIONS.has(name)) return;\n\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n if (args.length < 2) return;\n\n // The second argument is the source - if it comes from a variable (not a literal), flag it\n const source = args[1] as ASTNode;\n if (source.type !== 'ObjectExpression') {\n context.report({\n message: `${name}() with a non-literal source may introduce prototype pollution.`,\n explanation:\n `${name}() recursively copies properties from the source object. ` +\n 'If the source derives from user input and contains __proto__ or constructor keys, ' +\n \"it will pollute the target object's prototype chain.\",\n impact:\n 'All objects in the application share Object.prototype. Polluting it can ' +\n 'override security-relevant default values and cause widespread application misbehavior.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n `Sanitize the source before passing it to ${name}(). ` +\n 'Use a library like defu or structuredClone with property filtering, ' +\n 'or validate the source against a schema before merging.',\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst WEAK_HASH_ALGORITHMS = new Set(['md5', 'sha1', 'sha-1', 'md4', 'rc4', 'des', '3des']);\nconst WEAK_CIPHER_MODES = new Set(['ecb', 'cbc']); // ECB is never safe; CBC needs IV validation\n\nconst MATH_RANDOM_DESC =\n 'Math.random() is a pseudo-random number generator not suitable for cryptographic use.';\n\nconst rule: Rule = {\n meta: {\n id: 'security/weak-crypto',\n name: 'Weak Cryptography',\n category: 'security',\n severity: 'high',\n confidence: 'high',\n description:\n 'Detects use of weak or broken cryptographic algorithms (MD5, SHA1, ECB mode, Math.random).',\n rationale:\n 'MD5 and SHA1 are cryptographically broken. Using them for password hashing or data ' +\n 'integrity provides no real security. Math.random() is predictable and must not be used ' +\n 'for tokens, keys, or any security-sensitive value.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/weak-crypto',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return;\n\n // Math.random()\n if (\n callee.type === 'MemberExpression' &&\n (callee.object as ASTNode)?.type === 'Identifier' &&\n String((callee.object as ASTNode).name) === 'Math' &&\n (callee.property as ASTNode)?.type === 'Identifier' &&\n String((callee.property as ASTNode).name) === 'random'\n ) {\n context.report({\n message: 'Math.random() is not cryptographically secure.',\n explanation: MATH_RANDOM_DESC,\n impact:\n 'Using Math.random() for security tokens, session IDs, or passwords produces ' +\n 'predictable values that attackers can guess or enumerate.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use the Web Crypto API or Node.js crypto module for secure random values.',\n code: \"// Node.js:\\nimport { randomBytes } from 'crypto';\\nconst token = randomBytes(32).toString('hex');\\n\\n// Browser:\\nconst array = new Uint8Array(32);\\ncrypto.getRandomValues(array);\",\n },\n });\n }\n\n // crypto.createHash('md5') / crypto.createHash('sha1')\n if (\n callee.type === 'MemberExpression' &&\n (callee.property as ASTNode)?.type === 'Identifier' &&\n String((callee.property as ASTNode).name) === 'createHash'\n ) {\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const algoArg = args[0] as ASTNode | undefined;\n\n if (algoArg?.type === 'Literal') {\n const algo = String(algoArg.value).toLowerCase();\n if (WEAK_HASH_ALGORITHMS.has(algo)) {\n context.report({\n message: `Weak hash algorithm \"${algoArg.value}\" used in createHash().`,\n explanation:\n `${algoArg.value} is a broken hash algorithm. ` +\n 'It is vulnerable to collision attacks and should not be used for ' +\n 'data integrity checks, password hashing, or digital signatures.',\n impact:\n 'Broken hash algorithms allow attackers to forge hashes, bypass integrity checks, ' +\n 'and crack password hashes rapidly using precomputed tables.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n \"Replace with SHA-256 or SHA-3 for general hashing: crypto.createHash('sha256'). \" +\n 'For password hashing, use bcrypt, argon2, or scrypt instead of any raw hash.',\n },\n });\n }\n }\n }\n\n // crypto.createCipheriv with ECB or CBC mode\n if (\n callee.type === 'MemberExpression' &&\n (callee.property as ASTNode)?.type === 'Identifier' &&\n String((callee.property as ASTNode).name) === 'createCipheriv'\n ) {\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const algoArg = args[0] as ASTNode | undefined;\n\n if (algoArg?.type === 'Literal') {\n const algo = String(algoArg.value).toLowerCase();\n if ([...WEAK_CIPHER_MODES].some((m) => algo.includes(m))) {\n context.report({\n message: `Insecure cipher mode detected: \"${algoArg.value}\".`,\n explanation:\n `AES-ECB produces identical ciphertext for identical plaintext blocks, ` +\n 'revealing patterns in encrypted data. AES-CBC is also prone to padding oracle attacks.',\n impact:\n 'Insecure cipher modes can expose plaintext structure to passive observers ' +\n 'and may be fully decryptable by an active attacker.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n \"Use AES-GCM (Authenticated Encryption): crypto.createCipheriv('aes-256-gcm', key, iv). \" +\n 'Always use a unique IV per encryption operation.',\n },\n });\n }\n }\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nfunction getPropertyValue(props: ASTNode[], keyName: string): ASTNode | undefined {\n for (const prop of props) {\n if (prop.type !== 'Property') continue;\n const key = prop.key as ASTNode | undefined;\n const keyStr =\n key?.type === 'Identifier'\n ? String(key.name)\n : key?.type === 'Literal'\n ? String(key.value)\n : null;\n\n if (keyStr === keyName) {\n return prop.value as ASTNode | undefined;\n }\n }\n return undefined;\n}\n\nfunction getLiteralString(node: ASTNode | undefined): string | null {\n if (!node) return null;\n if (node.type === 'Literal' && typeof node.value === 'string') return node.value;\n return null;\n}\n\nfunction getLiteralBool(node: ASTNode | undefined): boolean | null {\n if (!node) return null;\n if (node.type === 'Literal' && typeof node.value === 'boolean') return node.value;\n return null;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'security/dangerous-cors',\n name: 'Dangerous CORS / Cookie Configuration',\n category: 'security',\n severity: 'high',\n confidence: 'high',\n description:\n 'Detects wildcard CORS origins, insecure cookie settings, and overly permissive configurations.',\n rationale:\n 'CORS misconfiguration and insecure cookie attributes are among the most common ' +\n 'security mistakes in Node.js backends. They enable CSRF, session hijacking, and ' +\n 'cross-origin data leakage.',\n docsUrl: 'https://clean-slop.dev/docs/rules/security/dangerous-cors',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return;\n\n // cors({ origin: '*' }) or cors({ origin: true })\n const isCorsCall =\n (callee.type === 'Identifier' && String(callee.name) === 'cors') ||\n (callee.type === 'MemberExpression' &&\n String((callee.property as ASTNode).name) === 'cors');\n\n if (isCorsCall) {\n const args = (node.arguments as ASTNode[] | undefined) ?? [];\n const configArg = args[0] as ASTNode | undefined;\n\n if (!configArg || configArg.type !== 'ObjectExpression') return;\n\n const props = (configArg.properties as ASTNode[] | undefined) ?? [];\n const originNode = getPropertyValue(props, 'origin');\n\n if (!originNode) return;\n\n const originStr = getLiteralString(originNode);\n const originBool = getLiteralBool(originNode);\n\n if (originStr === '*' || originBool === true) {\n context.report({\n message: `CORS configured with permissive origin: ${JSON.stringify(originStr ?? originBool)}.`,\n explanation:\n 'Setting CORS origin to \"*\" or true allows any website to make cross-origin ' +\n 'requests to this API. When combined with cookies or Authorization headers, ' +\n 'this enables cross-site request forgery (CSRF) attacks.',\n impact:\n 'Malicious websites can make authenticated requests on behalf of logged-in users, ' +\n 'read sensitive API responses, and exfiltrate data.',\n location: getLocation(originNode, context.filePath),\n fix: {\n description:\n 'Specify an explicit allowlist of trusted origins. Use an environment variable ' +\n 'to configure origins per deployment environment.',\n code: \"cors({\\n origin: process.env.ALLOWED_ORIGINS?.split(',') ?? [],\\n credentials: true,\\n})\",\n },\n });\n }\n }\n },\n\n ObjectExpression(node: ASTNode) {\n const props = (node.properties as ASTNode[] | undefined) ?? [];\n\n // Check for httpOnly: false on cookies\n const httpOnlyNode = getPropertyValue(props, 'httpOnly');\n if (httpOnlyNode && getLiteralBool(httpOnlyNode) === false) {\n context.report({\n message: 'Cookie configured with httpOnly: false.',\n explanation:\n 'Setting httpOnly: false makes cookies accessible to JavaScript via document.cookie. ' +\n 'This allows cross-site scripting (XSS) attacks to steal session cookies.',\n impact:\n 'A single XSS vulnerability in your application can lead to session hijacking ' +\n 'for all users if cookies are not protected with httpOnly.',\n location: getLocation(httpOnlyNode, context.filePath),\n fix: {\n description:\n 'Set httpOnly: true for all session and authentication cookies. ' +\n 'Never set httpOnly: false unless the cookie is explicitly intended for JavaScript access.',\n },\n });\n }\n\n // Check for secure: false on cookies\n const secureNode = getPropertyValue(props, 'secure');\n if (secureNode && getLiteralBool(secureNode) === false) {\n context.report({\n message: 'Cookie configured with secure: false.',\n explanation:\n 'Setting secure: false allows cookies to be transmitted over unencrypted HTTP connections. ' +\n 'This exposes session tokens to network interception.',\n impact:\n 'Cookies sent over HTTP can be captured by network observers, enabling session hijacking ' +\n 'and man-in-the-middle attacks.',\n location: getLocation(secureNode, context.filePath),\n fix: {\n description:\n 'Set secure: true for all session and authentication cookies. ' +\n 'Use a conditional based on NODE_ENV only in local development.',\n code: \"secure: process.env.NODE_ENV === 'production'\",\n },\n });\n }\n\n // Check for sameSite: 'none' without secure\n const sameSiteNode = getPropertyValue(props, 'sameSite');\n if (sameSiteNode && getLiteralString(sameSiteNode)?.toLowerCase() === 'none') {\n const secureValue = getPropertyValue(props, 'secure');\n if (!secureValue || getLiteralBool(secureValue) !== true) {\n context.report({\n message: \"Cookie has sameSite: 'none' without secure: true.\",\n explanation:\n \"sameSite: 'none' is required for cross-site cookies but is only valid when \" +\n 'combined with secure: true. Without it, the cookie is rejected by modern browsers.',\n impact:\n 'Cross-origin requests will fail in production because the browser will reject ' +\n 'the cookie. This may also enable CSRF if the application is served over HTTP.',\n location: getLocation(sameSiteNode, context.filePath),\n fix: {\n description:\n \"Add secure: true when using sameSite: 'none'. Cross-site cookies require HTTPS.\",\n },\n });\n }\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects Promise-returning calls that are not awaited, .catch()'d, or returned.\n *\n * Common patterns:\n * someAsyncFn(); // fire-and-forget without handling rejection\n * fetch('/api/data'); // not awaited, not .catch()'d\n * Promise.all([...]); // result not used\n */\n\nconst KNOWN_ASYNC_APIS = new Set([\n 'fetch',\n 'axios',\n 'mongoose.connect',\n 'connect',\n 'disconnect',\n 'save',\n 'create',\n 'find',\n 'findOne',\n 'findById',\n 'update',\n 'updateOne',\n 'deleteOne',\n 'remove',\n 'sendMail',\n 'publish',\n 'subscribe',\n 'emit',\n 'send',\n 'write',\n 'close',\n 'end',\n 'open',\n 'connect',\n 'mkdir',\n 'unlink',\n 'copyFile',\n 'rename',\n 'readFile',\n 'writeFile',\n 'appendFile',\n]);\n\nfunction getCallName(node: ASTNode): string | null {\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return null;\n\n if (callee.type === 'Identifier') return String(callee.name);\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier') return String(prop.name);\n }\n\n return null;\n}\n\nfunction isPromiseChained(node: ASTNode): boolean {\n // Check if the parent is a .then() or .catch() or .finally() call\n const parent = node.parent as ASTNode | undefined;\n if (!parent) return false;\n\n if (parent.type === 'MemberExpression' || parent.type === 'CallExpression') {\n return true;\n }\n\n // Check if it's in an await expression\n if (parent.type === 'AwaitExpression') return true;\n\n // Check if it's in a return statement\n if (parent.type === 'ReturnStatement') return true;\n\n // Check if it's assigned\n if (parent.type === 'VariableDeclarator') return true;\n if (parent.type === 'AssignmentExpression') return true;\n\n return false;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'reliability/unhandled-promise',\n name: 'Unhandled Promise',\n category: 'reliability',\n severity: 'high',\n confidence: 'medium',\n description:\n 'Detects Promise-returning function calls that are not awaited, returned, or error-handled.',\n rationale:\n 'Unhandled Promise rejections crash Node.js processes in versions >= 15 and cause ' +\n 'silent failures in older versions. Fire-and-forget async calls hide errors that should ' +\n 'be surfaced to callers.',\n docsUrl: 'https://clean-slop.dev/docs/rules/reliability/unhandled-promise',\n fixable: false,\n },\n\n create(context) {\n // We look for ExpressionStatement → CallExpression where the call\n // is likely async but the result is not used.\n traverse(context.ast, {\n ExpressionStatement(node: ASTNode) {\n const expr = node.expression as ASTNode | undefined;\n if (!expr || expr.type !== 'CallExpression') return;\n\n const name = getCallName(expr);\n if (!name) return;\n\n if (!KNOWN_ASYNC_APIS.has(name)) return;\n\n // Check if it's inside an async context\n // We approximate: if expression is used standalone, it's fire-and-forget\n if (isPromiseChained(expr)) return;\n\n context.report({\n message: `Possible unhandled Promise: result of ${name}() is not awaited or handled.`,\n explanation:\n `${name}() likely returns a Promise, but the result is discarded. ` +\n 'If this Promise rejects, the error will be swallowed or crash the process.',\n impact:\n 'Unhandled rejections in production cause process crashes (Node.js >= 15) or ' +\n 'silent data loss. Operations you expect to complete may silently fail.',\n location: getLocation(expr, context.filePath),\n fix: {\n description:\n 'Await the Promise inside an async function, or add .catch() to handle rejection explicitly.',\n code: '// Option 1: await in an async function\\nawait someAsyncFn();\\n\\n// Option 2: explicit catch\\nsomeAsyncFn().catch((err) => {\\n logger.error(\"Operation failed:\", err);\\n});',\n },\n });\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects async functions that return a value without awaiting it,\n * or that call async functions without await inside them.\n *\n * Specifically looks for:\n * async function foo() { return fetch('/api'); } // should be: return await fetch(...)\n */\n\nfunction isAsyncFunction(node: ASTNode): boolean {\n return (\n (node.type === 'FunctionDeclaration' ||\n node.type === 'FunctionExpression' ||\n node.type === 'ArrowFunctionExpression') &&\n node.async === true\n );\n}\n\nconst LIKELY_ASYNC = new Set([\n 'fetch',\n 'readFile',\n 'writeFile',\n 'connect',\n 'query',\n 'execute',\n 'findOne',\n 'find',\n 'save',\n 'create',\n 'update',\n 'delete',\n 'sendMail',\n 'publish',\n 'subscribe',\n]);\n\nfunction looksAsync(node: ASTNode): boolean {\n if (node.type !== 'CallExpression') return false;\n\n const callee = node.callee as ASTNode | undefined;\n if (!callee) return false;\n\n if (callee.type === 'Identifier' && LIKELY_ASYNC.has(String(callee.name))) return true;\n\n if (callee.type === 'MemberExpression') {\n const prop = callee.property as ASTNode | undefined;\n if (prop?.type === 'Identifier' && LIKELY_ASYNC.has(String(prop.name))) return true;\n }\n\n return false;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'reliability/missing-await',\n name: 'Missing Await',\n category: 'reliability',\n severity: 'high',\n confidence: 'medium',\n description:\n 'Detects async functions that return un-awaited Promises or call async APIs without await.',\n rationale:\n 'Forgetting await is one of the most common async bugs in JavaScript. ' +\n 'The function appears to return a value but actually returns a Promise, ' +\n 'causing unexpected behavior in callers that expect a resolved value.',\n docsUrl: 'https://clean-slop.dev/docs/rules/reliability/missing-await',\n fixable: true,\n },\n\n create(context) {\n traverse(context.ast, {\n FunctionDeclaration: checkAsyncFn,\n FunctionExpression: checkAsyncFn,\n ArrowFunctionExpression: checkAsyncFn,\n });\n\n function checkAsyncFn(fn: ASTNode): void {\n if (!isAsyncFunction(fn)) return;\n\n const body = fn.body as ASTNode | undefined;\n if (!body) return;\n\n // Arrow function with expression body: async () => fetch(...)\n if (body.type !== 'BlockStatement') {\n if (looksAsync(body)) {\n context.report({\n message: 'Async arrow function returns a Promise without await.',\n explanation:\n 'The expression body of this async arrow function appears to return a Promise directly. ' +\n 'The outer async function wraps this in another Promise, which may not be what was intended.',\n impact:\n 'Callers awaiting this function will receive a resolved Promise<Promise<T>> rather than T. ' +\n 'This causes subtle type errors and may result in unhandled rejections.',\n location: getLocation(fn, context.filePath),\n fix: {\n description: 'Add await to the expression body: async () => await fetch(...)',\n code: 'const getData = async () => await fetch(\"/api/data\");',\n },\n });\n }\n return;\n }\n\n // Look for return statements that return un-awaited async calls\n const statements = (body as ASTNode & { body?: ASTNode[] }).body ?? [];\n\n for (const stmt of statements) {\n if (stmt.type !== 'ReturnStatement') continue;\n\n const returnArg = stmt.argument as ASTNode | undefined;\n if (!returnArg) continue;\n\n if (looksAsync(returnArg)) {\n context.report({\n message: 'Async function returns a Promise without await.',\n explanation:\n 'This async function returns a likely-async call without awaiting it. ' +\n 'While this compiles correctly, it loses error context and may cause confusing stack traces. ' +\n 'In try/catch blocks, the catch will not trigger for the returned Promise.',\n impact:\n 'In a try/catch block, exceptions from the returned Promise will not be caught ' +\n 'by the surrounding catch clause. This creates invisible error-handling gaps.',\n location: getLocation(stmt, context.filePath),\n fix: {\n description:\n 'Add await before the return value to ensure errors are caught properly.',\n code: 'return await someAsyncOperation();',\n },\n });\n }\n }\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation, findAll } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\n/**\n * Detects likely infinite loops:\n * while (true) { ... } without a break or return\n * for (;;) { ... } without a break or return\n * for loops with no termination condition\n */\n\nfunction hasExitStatement(body: ASTNode): boolean {\n const exits = findAll(body, 'BreakStatement');\n if (exits.length > 0) return true;\n\n const returns = findAll(body, 'ReturnStatement');\n if (returns.length > 0) return true;\n\n const throws = findAll(body, 'ThrowStatement');\n if (throws.length > 0) return true;\n\n return false;\n}\n\nfunction isLiteralTrue(node: ASTNode | null | undefined): boolean {\n if (!node) return false;\n return node.type === 'Literal' && node.value === true;\n}\n\nconst rule: Rule = {\n meta: {\n id: 'reliability/infinite-loop',\n name: 'Potential Infinite Loop',\n category: 'reliability',\n severity: 'high',\n confidence: 'medium',\n description: 'Detects while(true) and for(;;) loops without reachable exit conditions.',\n rationale:\n 'Infinite loops without an exit condition hang server processes, exhaust CPU, ' +\n 'and cause denial of service. They are commonly introduced by AI-generated code ' +\n 'that models polling or retry logic incorrectly.',\n docsUrl: 'https://clean-slop.dev/docs/rules/reliability/infinite-loop',\n fixable: false,\n },\n\n create(context) {\n traverse(context.ast, {\n WhileStatement(node: ASTNode) {\n const test = node.test as ASTNode | undefined;\n if (!isLiteralTrue(test)) return;\n\n const body = node.body as ASTNode | undefined;\n if (!body) return;\n\n if (!hasExitStatement(body)) {\n context.report({\n message: 'while(true) loop with no break, return, or throw detected.',\n explanation:\n 'This while(true) loop has no reachable exit statement (break, return, or throw). ' +\n 'It will run indefinitely, blocking the event loop or hanging a thread.',\n impact:\n 'An infinite loop blocks the Node.js event loop, rendering the server completely ' +\n 'unresponsive. This is an exploitable denial-of-service condition.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Add an explicit exit condition or convert to a recursive function with a base case. ' +\n 'For polling, use setInterval() instead of an infinite loop.',\n },\n });\n }\n },\n\n ForStatement(node: ASTNode) {\n // for(;;) - no test expression\n const test = node.test as ASTNode | undefined | null;\n if (test !== null && test !== undefined) return;\n\n const body = node.body as ASTNode | undefined;\n if (!body) return;\n\n if (!hasExitStatement(body)) {\n context.report({\n message: 'for(;;) loop with no break, return, or throw detected.',\n explanation:\n 'This for(;;) loop has no termination condition and no exit statement. ' +\n 'It will run indefinitely.',\n impact: 'Blocks the Node.js event loop and causes complete server unresponsiveness.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Add a break condition or convert to a while loop with an explicit termination check.',\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\n\nconst MAX_LINES = 400;\nconst EXTREME_LINES = 1000;\n\nconst rule: Rule = {\n meta: {\n id: 'maintainability/giant-file',\n name: 'Giant File',\n category: 'maintainability',\n severity: 'medium',\n confidence: 'certain',\n description: `Detects source files exceeding ${MAX_LINES} lines.`,\n rationale:\n 'Large files concentrate unrelated logic, creating merge conflicts, slow code review, ' +\n 'and unclear ownership. They are a common artifact of AI code generation that did not ' +\n 'decompose responsibilities into modules.',\n docsUrl: 'https://clean-slop.dev/docs/rules/maintainability/giant-file',\n fixable: false,\n },\n\n create(context) {\n const lineCount = context.source.split('\\n').length;\n\n if (lineCount <= MAX_LINES) return;\n\n const isExtreme = lineCount > EXTREME_LINES;\n\n context.report({\n message: `File is ${lineCount} lines long (limit: ${MAX_LINES}).`,\n explanation:\n `This file contains ${lineCount} lines. Files this large violate the single-responsibility ` +\n 'principle and make it difficult for contributors to understand the module boundaries.',\n impact: isExtreme\n ? 'Extremely large files cause slow IDE performance, painful code reviews, and high ' +\n 'cognitive load. They are effectively unmaintainable.'\n : 'Large files slow code review and increase the chance that related changes land in ' +\n 'the wrong file, leading to tangled responsibility.',\n location: {\n file: context.filePath,\n line: 1,\n column: 0,\n },\n fix: {\n description:\n 'Split the file into focused modules. ' +\n 'Group related functions into a dedicated file. ' +\n 'A file should do one thing and export a cohesive set of related functionality.',\n },\n metadata: { lineCount },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { findAll } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\nimport path from 'path';\n\n/**\n * Single-file circular import detection.\n *\n * Full circular import detection requires a multi-file graph analysis phase.\n * This rule performs single-file analysis: it flags when a file imports from\n * a path that also appears as an export target (barrel imports that re-export\n * the importer), which is a common source of circular dependencies.\n */\n\nconst rule: Rule = {\n meta: {\n id: 'maintainability/circular-imports',\n name: 'Potential Circular Import',\n category: 'maintainability',\n severity: 'medium',\n confidence: 'low',\n description: 'Identifies import patterns that commonly cause circular dependency cycles.',\n rationale:\n 'Circular imports cause initialization order issues, undefined module exports at ' +\n 'runtime, and confusing bugs that differ between bundlers. They are a sign of ' +\n 'poor module boundary design.',\n docsUrl: 'https://clean-slop.dev/docs/rules/maintainability/circular-imports',\n fixable: false,\n },\n\n create(context) {\n const dir = path.dirname(context.filePath);\n const base = path.basename(context.filePath, path.extname(context.filePath));\n\n // Find all import declarations\n const imports = findAll(context.ast, 'ImportDeclaration');\n\n for (const imp of imports) {\n const src = imp.source as ASTNode | undefined;\n if (!src || src.type !== 'Literal') continue;\n\n const importPath = String(src.value);\n if (!importPath.startsWith('.')) continue;\n\n // Resolve the imported path\n const resolved = path.resolve(dir, importPath);\n const resolvedBase = path.basename(resolved);\n\n // Flag index imports from the same directory (classic barrel self-import)\n if (resolvedBase === 'index' && path.dirname(resolved) === dir && base !== 'index') {\n context.report({\n message: `Import from \"${importPath}\" may create a circular dependency.`,\n explanation:\n `This file imports from \"${importPath}\", which is the index barrel of the same directory. ` +\n 'If the index file re-exports this module, a circular dependency exists.',\n impact:\n 'Circular dependencies can cause modules to initialize with undefined exports, ' +\n 'leading to hard-to-debug runtime errors that only appear in specific import orders.',\n location: {\n file: context.filePath,\n line: imp.loc?.start.line ?? 1,\n column: imp.loc?.start.column ?? 0,\n },\n fix: {\n description:\n 'Import directly from the source module rather than through the barrel index. ' +\n \"Instead of `import { foo } from './index'`, use `import { foo } from './foo'`.\",\n },\n });\n }\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport { traverse, getLocation } from '../../utils/ast.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst DEBUG_METHODS = new Set([\n 'console.log',\n 'console.debug',\n 'console.dir',\n 'console.trace',\n 'console.table',\n]);\n\n// These are acceptable in production\nconst ALLOWED_CONSOLE = new Set(['console.error', 'console.warn', 'console.info']);\n\nconst rule: Rule = {\n meta: {\n id: 'production-readiness/no-console-log',\n name: 'Console Debug Statement',\n category: 'production-readiness',\n severity: 'low',\n confidence: 'certain',\n description: 'Detects console.log and other debug console methods left in production code.',\n rationale:\n 'Debug console statements leak internal application data, degrade performance, ' +\n 'and indicate code that was not reviewed before shipping.',\n docsUrl: 'https://clean-slop.dev/docs/rules/production-readiness/no-console-log',\n fixable: true,\n },\n\n create(context) {\n traverse(context.ast, {\n CallExpression(node: ASTNode) {\n const callee = node.callee as ASTNode | undefined;\n if (!callee || callee.type !== 'MemberExpression') return;\n\n const obj = callee.object as ASTNode | undefined;\n const prop = callee.property as ASTNode | undefined;\n\n if (\n obj?.type !== 'Identifier' ||\n String(obj.name) !== 'console' ||\n prop?.type !== 'Identifier'\n ) {\n return;\n }\n\n const method = String(prop.name);\n const fullName = `console.${method}`;\n\n if (ALLOWED_CONSOLE.has(fullName)) return;\n\n if (DEBUG_METHODS.has(fullName)) {\n context.report({\n message: `${fullName}() should not be present in production code.`,\n explanation:\n `${fullName}() is a debug statement that was likely left over during development. ` +\n 'Console output pollutes server logs, leaks internal state, and can expose ' +\n 'sensitive data (tokens, user objects, query results) to log aggregation systems.',\n impact:\n 'Debug logs appearing in production obscure real errors, violate data handling ' +\n 'requirements, and may trigger compliance alerts for PII exposure.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Remove the console statement. For intentional logging, use a structured logger ' +\n '(pino, winston, bunyan) that supports log levels and structured output.',\n code: \"import pino from 'pino';\\n\\nconst logger = pino();\\nlogger.debug({ userId }, 'User lookup completed');\",\n },\n });\n }\n },\n });\n },\n};\n\nexport default rule;\n","import type { Rule } from '../../types.js';\nimport type { ASTNode } from '../../utils/ast.js';\n\nconst LOCALHOST_PATTERN = /https?:\\/\\/(?:localhost|127\\.0\\.0\\.1|0\\.0\\.0\\.0)(?::\\d+)?/i;\nconst DEBUG_FLAG_NAMES =\n /^(?:debug|DEBUG|isDebug|IS_DEBUG|debugMode|DEBUG_MODE|devMode|DEV_MODE|testMode|TEST_MODE)$/;\nconst MOCK_FUNCTION_NAMES = /^(?:mock|fake|stub|dummy|placeholder)[\\w_]*/i;\nconst TEST_CREDENTIAL_PATTERNS = [\n /test[_-]?(password|secret|token|key)/i,\n /password\\s*[:=]\\s*['\"](?:test|password|1234|admin|secret)['\"]/i,\n /secret\\s*[:=]\\s*['\"](?:test|secret|dev|development)['\"]/i,\n];\n\nconst rule: Rule = {\n meta: {\n id: 'production-readiness/no-localhost-urls',\n name: 'Localhost URL / Debug Flag / Mock Implementation',\n category: 'production-readiness',\n severity: 'medium',\n confidence: 'high',\n description:\n 'Detects hardcoded localhost URLs, debug flags set to true, and mock/stub implementations.',\n rationale:\n 'Localhost URLs, active debug flags, and mock implementations in source code are ' +\n 'telltale signs that development shortcuts were committed to production.',\n docsUrl: 'https://clean-slop.dev/docs/rules/production-readiness/no-localhost-urls',\n fixable: false,\n },\n\n create(context) {\n // Scan raw source for localhost URLs and test credentials (line-by-line)\n const lines = context.source.split('\\n');\n lines.forEach((line, index) => {\n if (LOCALHOST_PATTERN.test(line)) {\n context.report({\n message: 'Hardcoded localhost URL detected.',\n explanation:\n 'This line contains a localhost URL. In production, this will fail to connect ' +\n 'to the intended service because localhost resolves to the server itself.',\n impact:\n 'API calls to localhost in production silently fail or hit incorrect services, ' +\n 'causing user-facing errors and data integrity issues.',\n location: { file: context.filePath, line: index + 1, column: 0 },\n fix: {\n description:\n 'Replace with an environment variable: process.env.API_BASE_URL or similar.',\n code: \"const apiUrl = process.env.API_BASE_URL ?? 'https://api.yourdomain.com';\",\n },\n });\n }\n\n for (const pattern of TEST_CREDENTIAL_PATTERNS) {\n if (pattern.test(line)) {\n context.report({\n message: 'Test or placeholder credential detected.',\n explanation:\n 'This line appears to contain a test credential with an obvious value (e.g., \"password\", \"secret\"). ' +\n 'Test credentials committed to source indicate authentication logic that was never hardened.',\n impact:\n 'Test credentials in production allow unauthorized access. Obvious values like \"test\" or \"1234\" ' +\n 'are among the first tried in credential stuffing attacks.',\n location: { file: context.filePath, line: index + 1, column: 0 },\n fix: {\n description:\n 'Use environment variables for all credentials. Rotate any credential that has been committed.',\n },\n });\n break;\n }\n }\n });\n\n // AST-based checks\n traverse(context.ast, {\n // debug = true or DEBUG_MODE = true\n AssignmentExpression(node: ASTNode) {\n const left = node.left as ASTNode | undefined;\n const right = node.right as ASTNode | undefined;\n\n if (left?.type !== 'Identifier') return;\n if (!DEBUG_FLAG_NAMES.test(String(left.name))) return;\n if (right?.type !== 'Literal' || right.value !== true) return;\n\n context.report({\n message: `Debug flag \"${left.name}\" is set to true.`,\n explanation:\n `The variable \"${left.name}\" suggests a debug mode toggle that is hardcoded to true. ` +\n 'Debug mode typically enables verbose logging, disables security checks, and activates ' +\n 'development-only code paths.',\n impact:\n 'Active debug flags in production expose internal state, disable security controls, ' +\n 'and degrade performance through excessive logging.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Drive debug mode from an environment variable: const debug = process.env.DEBUG === \"true\";',\n },\n });\n },\n\n // Variable initializer: const debug = true\n VariableDeclarator(node: ASTNode) {\n const id = node.id as ASTNode | undefined;\n const init = node.init as ASTNode | undefined;\n\n if (id?.type !== 'Identifier') return;\n if (!DEBUG_FLAG_NAMES.test(String(id.name))) return;\n if (init?.type !== 'Literal' || init.value !== true) return;\n\n context.report({\n message: `Debug flag \"${id.name}\" initialized to true.`,\n explanation:\n `\"${id.name}\" is a debug flag initialized with true. ` +\n 'This likely enables a development-only code path.',\n impact:\n 'Debug mode active in production may disable security checks, ' +\n 'expose stack traces to end users, or generate excessive log output.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Use an environment variable: const debug = process.env.NODE_ENV !== \"production\";',\n },\n });\n },\n\n // Function named mockX, fakeX, stubX\n FunctionDeclaration(node: ASTNode) {\n const id = node.id as ASTNode | undefined;\n if (!id || !MOCK_FUNCTION_NAMES.test(String(id.name))) return;\n\n context.report({\n message: `Function \"${id.name}\" appears to be a mock or stub implementation.`,\n explanation:\n `The name \"${id.name}\" suggests this is a placeholder implementation ` +\n 'that was never replaced with a real one.',\n impact:\n 'Mock implementations in production return fabricated data, bypassing real logic ' +\n 'and producing incorrect results for end users.',\n location: getLocation(node, context.filePath),\n fix: {\n description:\n 'Implement the real function or remove it entirely. Mock functions belong in test files only.',\n },\n });\n },\n });\n\n function traverse(ast: unknown, visitor: Record<string, (n: ASTNode) => void>): void {\n if (!ast || typeof ast !== 'object') return;\n const node = ast as ASTNode;\n if (typeof node.type === 'string') visitor[node.type]?.(node);\n for (const key of Object.keys(node)) {\n if (key === 'parent') continue;\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) traverse(item, visitor);\n } else if (child && typeof child === 'object' && 'type' in (child as object)) {\n traverse(child, visitor);\n }\n }\n }\n\n function getLocation(node: ASTNode, filePath: string) {\n return {\n file: filePath,\n line: node.loc?.start.line ?? 1,\n column: node.loc?.start.column ?? 0,\n };\n }\n },\n};\n\nexport default rule;\n","import type { Rule } from '../types.js';\n\n// AI Slop rules\nimport emptyCatch from './ai-slop/empty-catch.js';\nimport todoImplementation from './ai-slop/todo-implementation.js';\nimport giantFunction from './ai-slop/giant-function.js';\nimport excessiveNesting from './ai-slop/excessive-nesting.js';\nimport fakeValidation from './ai-slop/fake-validation.js';\nimport highComplexity from './ai-slop/high-complexity.js';\nimport deadCode from './ai-slop/dead-code.js';\n\n// Security rules\nimport unsafeEval from './security/unsafe-eval.js';\nimport hardcodedSecrets from './security/hardcoded-secrets.js';\nimport sqlInjection from './security/sql-injection.js';\nimport commandInjection from './security/command-injection.js';\nimport pathTraversal from './security/path-traversal.js';\nimport prototypePollution from './security/prototype-pollution.js';\nimport weakCrypto from './security/weak-crypto.js';\nimport dangerousCors from './security/dangerous-cors.js';\n\n// Reliability rules\nimport unhandledPromise from './reliability/unhandled-promise.js';\nimport missingAwait from './reliability/missing-await.js';\nimport infiniteLoop from './reliability/infinite-loop.js';\n\n// Maintainability rules\nimport giantFile from './maintainability/giant-file.js';\nimport circularImports from './maintainability/circular-imports.js';\n\n// Production readiness rules\nimport noConsoleLog from './production-readiness/no-console-log.js';\nimport noLocalhostUrls from './production-readiness/no-localhost-urls.js';\n\nexport const BUILT_IN_RULES: Rule[] = [\n // AI Slop\n emptyCatch,\n todoImplementation,\n giantFunction,\n excessiveNesting,\n fakeValidation,\n highComplexity,\n deadCode,\n\n // Security\n unsafeEval,\n hardcodedSecrets,\n sqlInjection,\n commandInjection,\n pathTraversal,\n prototypePollution,\n weakCrypto,\n dangerousCors,\n\n // Reliability\n unhandledPromise,\n missingAwait,\n infiniteLoop,\n\n // Maintainability\n giantFile,\n circularImports,\n\n // Production Readiness\n noConsoleLog,\n noLocalhostUrls,\n];\n\nexport { RuleEngine } from './engine.js';\n","import fg from 'fast-glob';\nimport ignore from 'ignore';\nimport fs from 'fs/promises';\nimport path from 'path';\nimport isBinaryPath from 'is-binary-path';\nimport type {\n FileResult,\n Issue,\n ParsedFile,\n ResolvedConfig,\n RuleCategory,\n ScanResult,\n} from '../types.js';\nimport { ParseError, parseSource } from '../parsers/source-parser.js';\nimport { RuleEngine } from '../rules/engine.js';\nimport { BUILT_IN_RULES } from '../rules/index.js';\nimport { computeGrade } from '../config/loader.js';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { SEVERITY_ORDER } from '../utils/constants.js';\n\nexport interface ScanOptions {\n config: ResolvedConfig;\n onFile?: (filePath: string, index: number, total: number) => void;\n onIssue?: (issue: Issue) => void;\n}\n\nasync function loadGitignore(root: string): Promise<ReturnType<typeof ignore>> {\n const ig = ignore();\n\n const gitignorePath = path.join(root, '.gitignore');\n try {\n const content = await fs.readFile(gitignorePath, 'utf-8');\n ig.add(content);\n } catch {\n // No .gitignore found; that's fine\n }\n\n return ig;\n}\n\nexport async function discoverFiles(config: ResolvedConfig): Promise<string[]> {\n const files = await fg(config.include, {\n cwd: config.root,\n ignore: config.exclude,\n absolute: true,\n followSymbolicLinks: false,\n onlyFiles: true,\n });\n\n const ig = await loadGitignore(config.root);\n\n // Add user-specified ignore patterns\n if (config.ignorePatterns.length > 0) {\n ig.add(config.ignorePatterns);\n }\n\n return files.filter((f) => {\n if (isBinaryPath(f)) return false;\n\n const relative = path.relative(config.root, f);\n try {\n return !ig.ignores(relative);\n } catch {\n return true;\n }\n });\n}\n\nfunction buildEngine(_config: ResolvedConfig): RuleEngine {\n const engine = new RuleEngine();\n engine.registerAll(BUILT_IN_RULES);\n return engine;\n}\n\nfunction computeScore(issues: Issue[], config: ResolvedConfig) {\n const categories: RuleCategory[] = [\n 'ai-slop',\n 'security',\n 'reliability',\n 'maintainability',\n 'production-readiness',\n ];\n\n const categoryScores = categories.map((cat) => {\n const catIssues = issues.filter((i) => i.category === cat);\n\n // Weighted deduction per severity\n const deductions: Record<string, number> = {\n critical: 20,\n high: 10,\n medium: 4,\n low: 1,\n info: 0,\n };\n\n const totalDeduction = catIssues.reduce((sum, i) => sum + (deductions[i.severity] ?? 0), 0);\n\n const raw = Math.max(0, 100 - totalDeduction);\n\n return {\n category: cat,\n score: raw,\n issueCount: catIssues.length,\n criticalCount: catIssues.filter((i) => i.severity === 'critical').length,\n highCount: catIssues.filter((i) => i.severity === 'high').length,\n mediumCount: catIssues.filter((i) => i.severity === 'medium').length,\n lowCount: catIssues.filter((i) => i.severity === 'low').length,\n };\n });\n\n const overall = categoryScores.reduce((sum, c) => sum + c.score, 0) / categoryScores.length;\n\n const grade = computeGrade(overall);\n\n return {\n overall: Math.round(overall),\n categories: categoryScores,\n grade,\n productionReady:\n overall >= config.failThreshold &&\n issues.filter((i) => i.severity === 'critical').length === 0,\n };\n}\n\nexport async function scan(options: ScanOptions): Promise<ScanResult> {\n const { config, onFile } = options;\n const startTime = Date.now();\n\n const engine = buildEngine(config);\n\n const files = await discoverFiles(config);\n const fileResults: FileResult[] = [];\n const allIssues: Issue[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const filePath = files[i];\n if (!filePath) continue;\n\n onFile?.(filePath, i, files.length);\n\n let parsed: ParsedFile;\n let source: string;\n\n try {\n source = await fs.readFile(filePath, 'utf-8');\n\n // Skip empty files\n if (!source.trim()) {\n fileResults.push({ file: filePath, issues: [], skipped: true, skipReason: 'empty file' });\n continue;\n }\n\n // Skip very large files (> 2MB)\n if (source.length > 2_000_000) {\n fileResults.push({\n file: filePath,\n issues: [],\n skipped: true,\n skipReason: 'file too large',\n });\n continue;\n }\n\n parsed = parseSource(filePath, source);\n } catch (err) {\n const parseError = err instanceof ParseError ? err.message : String(err);\n fileResults.push({ file: filePath, issues: [], parseError });\n continue;\n }\n\n const issues = engine.runOnFile(parsed, config);\n\n // Respect per-severity maxIssues cap across entire scan\n // (we track totals and stop reporting once caps are hit — deferred to reporter layer)\n const sortedIssues = issues.sort((a, b) => {\n return (SEVERITY_ORDER[b.severity] ?? 0) - (SEVERITY_ORDER[a.severity] ?? 0);\n });\n\n fileResults.push({ file: filePath, issues: sortedIssues });\n allIssues.push(...sortedIssues);\n\n options.onIssue && sortedIssues.forEach(options.onIssue);\n }\n\n const score = computeScore(allIssues, config);\n\n return {\n root: config.root,\n timestamp: new Date().toISOString(),\n version: PACKAGE_VERSION,\n files: fileResults,\n issues: allIssues.sort(\n (a, b) => (SEVERITY_ORDER[b.severity] ?? 0) - (SEVERITY_ORDER[a.severity] ?? 0),\n ),\n score,\n durationMs: Date.now() - startTime,\n config,\n };\n}\n","import path from 'path';\nimport type { Issue, ScanResult, Severity } from '../types.js';\nimport {\n BOLD,\n CYAN,\n DIM,\n GRAY,\n GREEN,\n RED,\n RESET,\n SEVERITY_COLORS,\n YELLOW,\n} from '../utils/constants.js';\n\nfunction pad(str: string, width: number): string {\n return str.padEnd(width);\n}\n\nfunction formatSeverity(severity: Severity): string {\n const color = SEVERITY_COLORS[severity] ?? '';\n const label = severity.toUpperCase().padEnd(8);\n return `${color}${label}${RESET}`;\n}\n\nfunction formatScore(score: number): string {\n if (score >= 90) return `${GREEN}${score}${RESET}`;\n if (score >= 70) return `${YELLOW}${score}${RESET}`;\n return `${RED}${score}${RESET}`;\n}\n\nfunction formatGrade(grade: string): string {\n if (grade === 'A') return `${GREEN}${grade}${RESET}`;\n if (grade === 'B') return `${GREEN}${grade}${RESET}`;\n if (grade === 'C') return `${YELLOW}${grade}${RESET}`;\n if (grade === 'D') return `${YELLOW}${grade}${RESET}`;\n return `${RED}${grade}${RESET}`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\nfunction formatRelativePath(root: string, filePath: string): string {\n return path.relative(root, filePath);\n}\n\nfunction renderSeparator(char = '-', width = 80): string {\n return GRAY + char.repeat(width) + RESET;\n}\n\nfunction renderIssue(issue: Issue, root: string, verbose: boolean): string {\n const lines: string[] = [];\n\n const relPath = formatRelativePath(root, issue.location.file);\n const loc = `${relPath}:${issue.location.line}:${issue.location.column}`;\n\n lines.push(` ${formatSeverity(issue.severity)} ${BOLD}${issue.message}${RESET}`);\n lines.push(` ${DIM}${loc}${RESET} ${GRAY}[${issue.ruleId}]${RESET}`);\n\n if (verbose) {\n lines.push('');\n lines.push(` ${DIM}${issue.explanation}${RESET}`);\n\n if (issue.impact) {\n lines.push('');\n lines.push(` ${YELLOW}Impact:${RESET} ${issue.impact}`);\n }\n\n if (issue.snippet) {\n lines.push('');\n lines.push(\n issue.snippet\n .split('\\n')\n .map((l) => ` ${GRAY}${l}${RESET}`)\n .join('\\n'),\n );\n }\n\n if (issue.fix) {\n lines.push('');\n lines.push(` ${CYAN}Fix:${RESET} ${issue.fix.description}`);\n if (issue.fix.code) {\n lines.push('');\n lines.push(\n issue.fix.code\n .split('\\n')\n .map((l) => ` ${DIM}${l}${RESET}`)\n .join('\\n'),\n );\n }\n }\n\n if (issue.docsUrl) {\n lines.push('');\n lines.push(` ${DIM}${issue.docsUrl}${RESET}`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function generateTextReport(result: ScanResult): string {\n const { score, issues, files, durationMs, config, root, version } = result;\n const verbose = config.verbose;\n const lines: string[] = [];\n\n // Header\n lines.push('');\n lines.push(`${BOLD}clean-slop v${version}${RESET} ${DIM}Production Readiness Engine${RESET}`);\n lines.push(renderSeparator('=', 80));\n lines.push('');\n\n // Files grouped by file path\n const fileGroups = new Map<string, Issue[]>();\n for (const issue of issues) {\n const key = issue.location.file;\n if (!fileGroups.has(key)) fileGroups.set(key, []);\n fileGroups.get(key)!.push(issue);\n }\n\n if (issues.length === 0) {\n lines.push(`${GREEN}No issues found.${RESET}`);\n } else {\n for (const [filePath, fileIssues] of fileGroups) {\n const relPath = formatRelativePath(root, filePath);\n lines.push(`${BOLD}${relPath}${RESET}`);\n lines.push(renderSeparator('-', 80));\n\n for (const issue of fileIssues) {\n lines.push(renderIssue(issue, root, verbose));\n lines.push('');\n }\n }\n }\n\n // Score card\n lines.push(renderSeparator('=', 80));\n lines.push(`${BOLD}Score Card${RESET}`);\n lines.push(renderSeparator('-', 80));\n\n for (const cat of score.categories) {\n const label = pad(cat.category, 24);\n const catScore = formatScore(cat.score);\n const counts =\n DIM +\n (cat.criticalCount > 0 ? ` ${cat.criticalCount} critical` : '') +\n (cat.highCount > 0 ? ` ${cat.highCount} high` : '') +\n (cat.mediumCount > 0 ? ` ${cat.mediumCount} medium` : '') +\n (cat.lowCount > 0 ? ` ${cat.lowCount} low` : '') +\n RESET;\n lines.push(` ${label} ${catScore}/100${counts}`);\n }\n\n lines.push('');\n lines.push(\n ` ${pad('Overall Score', 24)} ${formatScore(score.overall)}/100 Grade: ${formatGrade(score.grade)}`,\n );\n lines.push('');\n\n // Summary\n const criticalCount = issues.filter((i) => i.severity === 'critical').length;\n const highCount = issues.filter((i) => i.severity === 'high').length;\n const mediumCount = issues.filter((i) => i.severity === 'medium').length;\n const lowCount = issues.filter((i) => i.severity === 'low').length;\n\n lines.push(renderSeparator('-', 80));\n lines.push(\n ` ${issues.length} issue${issues.length !== 1 ? 's' : ''} found across ${files.filter((f) => !f.skipped && !f.parseError).length} files` +\n ` (${formatDuration(durationMs)})`,\n );\n\n if (criticalCount > 0) lines.push(` ${RED}${criticalCount} critical${RESET}`);\n if (highCount > 0) lines.push(` ${YELLOW}${highCount} high${RESET}`);\n if (mediumCount > 0) lines.push(` ${YELLOW}${mediumCount} medium${RESET}`);\n if (lowCount > 0) lines.push(` ${DIM}${lowCount} low${RESET}`);\n\n lines.push('');\n\n if (score.productionReady) {\n lines.push(\n ` ${GREEN}PRODUCTION READY${RESET} Score above threshold (${config.failThreshold})`,\n );\n } else {\n lines.push(\n ` ${RED}NOT PRODUCTION READY${RESET} Score ${score.overall} below threshold (${config.failThreshold})`,\n );\n }\n\n lines.push('');\n\n const parseErrors = files.filter((f) => f.parseError);\n if (parseErrors.length > 0) {\n lines.push(`${YELLOW}Parse errors in ${parseErrors.length} file(s):${RESET}`);\n for (const f of parseErrors) {\n lines.push(` ${DIM}${f.file}: ${f.parseError}${RESET}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { ScanResult } from '../types.js';\n\nexport function generateJsonReport(result: ScanResult): string {\n return JSON.stringify(result, null, 2);\n}\n","import path from 'path';\nimport type { Issue, ScanResult, Severity } from '../types.js';\n\nconst SEVERITY_EMOJI: Record<Severity, string> = {\n critical: 'CRITICAL',\n high: 'HIGH',\n medium: 'MEDIUM',\n low: 'LOW',\n info: 'INFO',\n};\n\nfunction scoreBadge(score: number): string {\n const color = score >= 90 ? 'brightgreen' : score >= 70 ? 'yellow' : 'red';\n return `![score](https://img.shields.io/badge/score-${score}%2F100-${color})`;\n}\n\nfunction gradeBadge(grade: string): string {\n const color = grade === 'A' || grade === 'B' ? 'brightgreen' : grade === 'C' ? 'yellow' : 'red';\n return `![grade](https://img.shields.io/badge/grade-${grade}-${color})`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\nfunction relPath(root: string, filePath: string): string {\n return path.relative(root, filePath);\n}\n\nfunction renderIssueMd(issue: Issue, root: string): string {\n const lines: string[] = [];\n const loc = `${relPath(root, issue.location.file)}:${issue.location.line}`;\n\n lines.push(`#### ${SEVERITY_EMOJI[issue.severity]}: ${issue.message}`);\n lines.push('');\n lines.push(`- **Rule:** \\`${issue.ruleId}\\``);\n lines.push(`- **Location:** \\`${loc}\\``);\n lines.push(`- **Confidence:** ${issue.confidence}`);\n lines.push('');\n lines.push(issue.explanation);\n\n if (issue.impact) {\n lines.push('');\n lines.push(`**Impact:** ${issue.impact}`);\n }\n\n if (issue.snippet) {\n lines.push('');\n lines.push('```');\n lines.push(issue.snippet);\n lines.push('```');\n }\n\n if (issue.fix) {\n lines.push('');\n lines.push(`**Fix:** ${issue.fix.description}`);\n if (issue.fix.code) {\n lines.push('');\n lines.push('```javascript');\n lines.push(issue.fix.code);\n lines.push('```');\n }\n }\n\n if (issue.docsUrl) {\n lines.push('');\n lines.push(`[Documentation](${issue.docsUrl})`);\n }\n\n lines.push('');\n lines.push('---');\n\n return lines.join('\\n');\n}\n\nexport function generateMarkdownReport(result: ScanResult): string {\n const { score, issues, files, durationMs, config, root, version, timestamp } = result;\n const lines: string[] = [];\n\n // Header\n lines.push('# clean-slop Report');\n lines.push('');\n lines.push(`> Generated by clean-slop v${version} on ${new Date(timestamp).toUTCString()}`);\n lines.push('');\n\n // Score summary\n lines.push('## Score Summary');\n lines.push('');\n lines.push(`${scoreBadge(score.overall)} ${gradeBadge(score.grade)}`);\n lines.push('');\n lines.push('| Category | Score | Issues |');\n lines.push('|----------|-------|--------|');\n\n for (const cat of score.categories) {\n const emoji = cat.score >= 90 ? '✅' : cat.score >= 70 ? '⚠️' : '❌';\n lines.push(`| ${cat.category} | ${emoji} ${cat.score}/100 | ${cat.issueCount} |`);\n }\n\n lines.push('');\n lines.push(`**Overall Score:** ${score.overall}/100 &nbsp; **Grade:** ${score.grade}`);\n lines.push('');\n\n const productionStatus = score.productionReady\n ? '✅ **PRODUCTION READY**'\n : '❌ **NOT PRODUCTION READY**';\n lines.push(productionStatus);\n lines.push('');\n\n // Severity breakdown\n const criticalIssues = issues.filter((i) => i.severity === 'critical');\n const highIssues = issues.filter((i) => i.severity === 'high');\n const mediumIssues = issues.filter((i) => i.severity === 'medium');\n const lowIssues = issues.filter((i) => i.severity === 'low');\n\n lines.push('## Issue Breakdown');\n lines.push('');\n lines.push(`| Severity | Count |`);\n lines.push(`|----------|-------|`);\n lines.push(`| Critical | ${criticalIssues.length} |`);\n lines.push(`| High | ${highIssues.length} |`);\n lines.push(`| Medium | ${mediumIssues.length} |`);\n lines.push(`| Low | ${lowIssues.length} |`);\n lines.push(`| **Total** | **${issues.length}** |`);\n lines.push('');\n\n // Critical issues first\n if (criticalIssues.length > 0) {\n lines.push('## Critical Issues');\n lines.push('');\n for (const issue of criticalIssues) {\n lines.push(renderIssueMd(issue, root));\n }\n }\n\n // High issues\n if (highIssues.length > 0) {\n lines.push('## High Severity Issues');\n lines.push('');\n for (const issue of highIssues) {\n lines.push(renderIssueMd(issue, root));\n }\n }\n\n // Medium issues\n if (mediumIssues.length > 0) {\n lines.push('<details>');\n lines.push('<summary>Medium Severity Issues</summary>');\n lines.push('');\n for (const issue of mediumIssues) {\n lines.push(renderIssueMd(issue, root));\n }\n lines.push('</details>');\n lines.push('');\n }\n\n // Low issues\n if (lowIssues.length > 0) {\n lines.push('<details>');\n lines.push('<summary>Low Severity Issues</summary>');\n lines.push('');\n for (const issue of lowIssues) {\n lines.push(renderIssueMd(issue, root));\n }\n lines.push('</details>');\n lines.push('');\n }\n\n // File stats\n lines.push('## Scan Statistics');\n lines.push('');\n lines.push(`- **Files scanned:** ${files.filter((f) => !f.skipped && !f.parseError).length}`);\n lines.push(`- **Files skipped:** ${files.filter((f) => f.skipped).length}`);\n lines.push(`- **Parse errors:** ${files.filter((f) => f.parseError).length}`);\n lines.push(`- **Duration:** ${formatDuration(durationMs)}`);\n lines.push(`- **Fail threshold:** ${config.failThreshold}/100`);\n lines.push('');\n\n const parseErrors = files.filter((f) => f.parseError);\n if (parseErrors.length > 0) {\n lines.push('### Parse Errors');\n lines.push('');\n for (const f of parseErrors) {\n lines.push(`- \\`${relPath(root, f.file)}\\`: ${f.parseError}`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n lines.push('*Generated by [clean-slop](https://github.com/clean-slop/clean-slop)*');\n\n return lines.join('\\n');\n}\n","import path from 'path';\nimport type { Issue, ScanResult, Severity } from '../types.js';\nimport { PACKAGE_VERSION } from '../version.js';\n\n/**\n * SARIF 2.1.0 reporter\n * https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html\n *\n * Compatible with:\n * - GitHub Code Scanning\n * - VS Code SARIF Viewer\n * - Azure DevOps\n */\n\ntype SarifLevel = 'error' | 'warning' | 'note' | 'none';\n\nfunction severityToSarifLevel(severity: Severity): SarifLevel {\n switch (severity) {\n case 'critical':\n case 'high':\n return 'error';\n case 'medium':\n return 'warning';\n case 'low':\n return 'note';\n case 'info':\n return 'none';\n }\n}\n\nfunction toSarifSecuritySeverity(severity: Severity): string {\n switch (severity) {\n case 'critical':\n return '9.5';\n case 'high':\n return '7.5';\n case 'medium':\n return '5.0';\n case 'low':\n return '2.5';\n case 'info':\n return '0.0';\n }\n}\n\nfunction fileUri(filePath: string): string {\n // Convert to file:// URI\n const normalized = filePath.replace(/\\\\/g, '/');\n return normalized.startsWith('/') ? `file://${normalized}` : `file:///${normalized}`;\n}\n\nexport function generateSarifReport(result: ScanResult): string {\n const { issues, root } = result;\n\n // Collect unique rules\n const ruleMap = new Map<string, Issue>();\n for (const issue of issues) {\n if (!ruleMap.has(issue.ruleId)) {\n ruleMap.set(issue.ruleId, issue);\n }\n }\n\n const sarifRules = Array.from(ruleMap.values()).map((issue) => ({\n id: issue.ruleId,\n name: issue.ruleName.replace(/\\s+/g, ''),\n shortDescription: {\n text: issue.message,\n },\n fullDescription: {\n text: issue.explanation,\n },\n help: {\n text: issue.fix?.description ?? 'See documentation for details.',\n markdown: issue.fix?.code\n ? `${issue.fix.description}\\n\\n\\`\\`\\`javascript\\n${issue.fix.code}\\n\\`\\`\\``\n : (issue.fix?.description ?? 'See documentation for details.'),\n },\n helpUri: issue.docsUrl ?? `https://clean-slop.dev/docs/rules/${issue.ruleId}`,\n properties: {\n tags: [issue.category],\n 'security-severity': toSarifSecuritySeverity(issue.severity),\n precision: issue.confidence === 'certain' ? 'very-high' : issue.confidence,\n 'problem.severity': issue.severity,\n },\n }));\n\n const sarifResults = issues.map((issue) => ({\n ruleId: issue.ruleId,\n level: severityToSarifLevel(issue.severity),\n message: {\n text: `${issue.message}\\n\\n${issue.explanation}${issue.impact ? `\\n\\nImpact: ${issue.impact}` : ''}`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: {\n uri: path.relative(root, issue.location.file).replace(/\\\\/g, '/'),\n uriBaseId: '%SRCROOT%',\n },\n region: {\n startLine: issue.location.line,\n startColumn: issue.location.column + 1,\n endLine: issue.location.endLine ?? issue.location.line,\n endColumn: (issue.location.endColumn ?? issue.location.column) + 1,\n },\n },\n },\n ],\n partialFingerprints: {\n primaryLocationLineHash: Buffer.from(\n `${issue.ruleId}:${issue.location.file}:${issue.location.line}`,\n ).toString('base64'),\n },\n properties: {\n confidence: issue.confidence,\n category: issue.category,\n },\n }));\n\n const sarif = {\n $schema:\n 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json',\n version: '2.1.0',\n runs: [\n {\n tool: {\n driver: {\n name: 'clean-slop',\n version: PACKAGE_VERSION,\n informationUri: 'https://github.com/clean-slop/clean-slop',\n semanticVersion: PACKAGE_VERSION,\n rules: sarifRules,\n },\n },\n originalUriBaseIds: {\n '%SRCROOT%': {\n uri: fileUri(root) + '/',\n },\n },\n results: sarifResults,\n columnKind: 'utf16CodeUnits',\n },\n ],\n };\n\n return JSON.stringify(sarif, null, 2);\n}\n","import path from 'path';\nimport type { Issue, ScanResult, Severity } from '../types.js';\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;');\n}\n\nfunction severityColor(severity: Severity): string {\n switch (severity) {\n case 'critical':\n return '#dc2626';\n case 'high':\n return '#ea580c';\n case 'medium':\n return '#d97706';\n case 'low':\n return '#2563eb';\n case 'info':\n return '#6b7280';\n }\n}\n\nfunction scoreColor(score: number): string {\n if (score >= 90) return '#16a34a';\n if (score >= 70) return '#d97706';\n return '#dc2626';\n}\n\nfunction renderIssueCard(issue: Issue, root: string): string {\n const relPath = path.relative(root, issue.location.file).replace(/\\\\/g, '/');\n const color = severityColor(issue.severity);\n\n return `\n <div class=\"issue-card\" data-severity=\"${issue.severity}\" data-category=\"${issue.category}\">\n <div class=\"issue-header\">\n <span class=\"severity-badge\" style=\"background:${color}\">${issue.severity.toUpperCase()}</span>\n <span class=\"issue-rule\">${escapeHtml(issue.ruleId)}</span>\n <span class=\"issue-confidence\">${escapeHtml(issue.confidence)} confidence</span>\n </div>\n <div class=\"issue-message\">${escapeHtml(issue.message)}</div>\n <div class=\"issue-location\">${escapeHtml(relPath)}:${issue.location.line}</div>\n <div class=\"issue-explanation\">${escapeHtml(issue.explanation)}</div>\n ${issue.impact ? `<div class=\"issue-impact\"><strong>Impact:</strong> ${escapeHtml(issue.impact)}</div>` : ''}\n ${issue.snippet ? `<pre class=\"issue-snippet\"><code>${escapeHtml(issue.snippet)}</code></pre>` : ''}\n ${\n issue.fix\n ? `\n <div class=\"issue-fix\">\n <strong>Fix:</strong> ${escapeHtml(issue.fix.description)}\n ${issue.fix.code ? `<pre class=\"fix-code\"><code>${escapeHtml(issue.fix.code)}</code></pre>` : ''}\n </div>\n `\n : ''\n }\n ${issue.docsUrl ? `<a class=\"docs-link\" href=\"${escapeHtml(issue.docsUrl)}\" target=\"_blank\" rel=\"noopener\">Documentation</a>` : ''}\n </div>`;\n}\n\nexport function generateHtmlReport(result: ScanResult): string {\n const { score, issues, files, durationMs, root, version, timestamp } = result;\n\n const criticalCount = issues.filter((i) => i.severity === 'critical').length;\n const highCount = issues.filter((i) => i.severity === 'high').length;\n const mediumCount = issues.filter((i) => i.severity === 'medium').length;\n const lowCount = issues.filter((i) => i.severity === 'low').length;\n const scannedCount = files.filter((f) => !f.skipped && !f.parseError).length;\n\n const issueCards = issues.map((i) => renderIssueCard(i, root)).join('\\n');\n\n const categoryRows = score.categories\n .map((cat) => {\n const color = scoreColor(cat.score);\n return `\n <tr>\n <td>${escapeHtml(cat.category)}</td>\n <td><span style=\"color:${color};font-weight:600\">${cat.score}/100</span></td>\n <td>${cat.issueCount}</td>\n <td>${cat.criticalCount}</td>\n <td>${cat.highCount}</td>\n <td>${cat.mediumCount}</td>\n <td>${cat.lowCount}</td>\n </tr>`;\n })\n .join('\\n');\n\n const durationStr = durationMs < 1000 ? `${durationMs}ms` : `${(durationMs / 1000).toFixed(2)}s`;\n const overallColor = scoreColor(score.overall);\n const readyBg = score.productionReady ? '#16a34a' : '#dc2626';\n const readyText = score.productionReady ? 'PRODUCTION READY' : 'NOT PRODUCTION READY';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>clean-slop Report</title>\n <style>\n *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; background: #0f172a; color: #e2e8f0; line-height: 1.6; }\n .container { max-width: 1200px; margin: 0 auto; padding: 2rem; }\n header { border-bottom: 1px solid #1e293b; padding-bottom: 2rem; margin-bottom: 2rem; }\n header h1 { font-size: 1.75rem; font-weight: 700; color: #f8fafc; letter-spacing: -0.025em; }\n header p { color: #64748b; margin-top: 0.25rem; font-size: 0.875rem; }\n .score-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; margin-bottom: 2rem; }\n .score-card { background: #1e293b; border: 1px solid #334155; border-radius: 8px; padding: 1.25rem; }\n .score-card .label { font-size: 0.75rem; color: #94a3b8; text-transform: uppercase; letter-spacing: 0.05em; }\n .score-card .value { font-size: 2rem; font-weight: 700; margin-top: 0.25rem; }\n .ready-badge { display: inline-block; background: ${readyBg}; color: #fff; font-size: 0.8rem; font-weight: 600; padding: 0.35rem 0.9rem; border-radius: 9999px; margin-bottom: 2rem; letter-spacing: 0.05em; }\n table { width: 100%; border-collapse: collapse; background: #1e293b; border-radius: 8px; overflow: hidden; margin-bottom: 2rem; font-size: 0.875rem; }\n th { background: #0f172a; text-align: left; padding: 0.75rem 1rem; color: #94a3b8; font-weight: 500; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; }\n td { padding: 0.75rem 1rem; border-top: 1px solid #334155; }\n .filters { display: flex; gap: 0.5rem; flex-wrap: wrap; margin-bottom: 1.5rem; }\n .filter-btn { background: #1e293b; border: 1px solid #334155; color: #94a3b8; padding: 0.35rem 0.9rem; border-radius: 6px; cursor: pointer; font-size: 0.8rem; transition: all 0.15s; }\n .filter-btn:hover, .filter-btn.active { background: #334155; color: #f1f5f9; border-color: #475569; }\n .issue-card { background: #1e293b; border: 1px solid #334155; border-radius: 8px; padding: 1.25rem; margin-bottom: 1rem; }\n .issue-header { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; }\n .severity-badge { font-size: 0.7rem; font-weight: 700; color: #fff; padding: 0.2rem 0.6rem; border-radius: 4px; letter-spacing: 0.05em; }\n .issue-rule { font-family: monospace; font-size: 0.8rem; color: #64748b; }\n .issue-confidence { font-size: 0.75rem; color: #475569; margin-left: auto; }\n .issue-message { font-weight: 600; color: #f1f5f9; margin-bottom: 0.5rem; }\n .issue-location { font-family: monospace; font-size: 0.8rem; color: #64748b; margin-bottom: 0.75rem; }\n .issue-explanation { font-size: 0.875rem; color: #94a3b8; margin-bottom: 0.75rem; }\n .issue-impact { font-size: 0.875rem; color: #fbbf24; margin-bottom: 0.75rem; }\n .issue-snippet { background: #0f172a; border: 1px solid #334155; border-radius: 6px; padding: 1rem; margin-bottom: 0.75rem; overflow-x: auto; }\n .issue-snippet code, .fix-code code { font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.8rem; color: #94a3b8; white-space: pre; }\n .issue-fix { font-size: 0.875rem; color: #86efac; margin-bottom: 0.75rem; }\n .fix-code { background: #0f172a; border: 1px solid #334155; border-radius: 6px; padding: 1rem; margin-top: 0.5rem; overflow-x: auto; }\n .docs-link { font-size: 0.8rem; color: #60a5fa; text-decoration: none; }\n .docs-link:hover { text-decoration: underline; }\n .section-title { font-size: 1.1rem; font-weight: 600; color: #f8fafc; margin-bottom: 1rem; border-bottom: 1px solid #1e293b; padding-bottom: 0.5rem; }\n .empty-state { text-align: center; padding: 3rem; color: #64748b; }\n .stat-row { display: flex; gap: 2rem; flex-wrap: wrap; color: #64748b; font-size: 0.875rem; margin-bottom: 2rem; }\n .hidden { display: none; }\n </style>\n</head>\n<body>\n <div class=\"container\">\n <header>\n <h1>clean-slop Report</h1>\n <p>v${escapeHtml(version)} &nbsp;·&nbsp; ${escapeHtml(new Date(timestamp).toUTCString())} &nbsp;·&nbsp; ${escapeHtml(root)}</p>\n </header>\n\n <div class=\"score-grid\">\n <div class=\"score-card\">\n <div class=\"label\">Overall Score</div>\n <div class=\"value\" style=\"color:${overallColor}\">${score.overall}<span style=\"font-size:1rem;color:#64748b\">/100</span></div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">Grade</div>\n <div class=\"value\" style=\"color:${overallColor}\">${escapeHtml(score.grade)}</div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">Total Issues</div>\n <div class=\"value\" style=\"color:#f1f5f9\">${issues.length}</div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">Critical</div>\n <div class=\"value\" style=\"color:#dc2626\">${criticalCount}</div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">High</div>\n <div class=\"value\" style=\"color:#ea580c\">${highCount}</div>\n </div>\n <div class=\"score-card\">\n <div class=\"label\">Files Scanned</div>\n <div class=\"value\" style=\"color:#f1f5f9\">${scannedCount}</div>\n </div>\n </div>\n\n <div class=\"ready-badge\">${readyText}</div>\n\n <div class=\"section-title\">Category Scores</div>\n <table>\n <thead>\n <tr>\n <th>Category</th><th>Score</th><th>Total</th><th>Critical</th><th>High</th><th>Medium</th><th>Low</th>\n </tr>\n </thead>\n <tbody>${categoryRows}</tbody>\n </table>\n\n <div class=\"section-title\">Issues</div>\n <div class=\"stat-row\">\n <span>${issues.length} issue${issues.length !== 1 ? 's' : ''} &nbsp;·&nbsp; ${scannedCount} files &nbsp;·&nbsp; ${durationStr}</span>\n </div>\n\n <div class=\"filters\">\n <button class=\"filter-btn active\" onclick=\"filterIssues('all')\">All (${issues.length})</button>\n <button class=\"filter-btn\" onclick=\"filterIssues('critical')\">Critical (${criticalCount})</button>\n <button class=\"filter-btn\" onclick=\"filterIssues('high')\">High (${highCount})</button>\n <button class=\"filter-btn\" onclick=\"filterIssues('medium')\">Medium (${mediumCount})</button>\n <button class=\"filter-btn\" onclick=\"filterIssues('low')\">Low (${lowCount})</button>\n </div>\n\n <div id=\"issues-container\">\n ${issues.length === 0 ? '<div class=\"empty-state\">No issues found.</div>' : issueCards}\n </div>\n </div>\n\n <script>\n function filterIssues(severity) {\n document.querySelectorAll('.filter-btn').forEach(b => b.classList.remove('active'));\n event.target.classList.add('active');\n document.querySelectorAll('.issue-card').forEach(card => {\n if (severity === 'all' || card.dataset.severity === severity) {\n card.classList.remove('hidden');\n } else {\n card.classList.add('hidden');\n }\n });\n }\n </script>\n</body>\n</html>`;\n}\n","import fs from 'fs/promises';\nimport path from 'path';\nimport type { ScanResult } from '../types.js';\nimport { generateTextReport } from './text-reporter.js';\nimport { generateJsonReport } from './json-reporter.js';\nimport { generateMarkdownReport } from './markdown-reporter.js';\nimport { generateSarifReport } from './sarif-reporter.js';\nimport { generateHtmlReport } from './html-reporter.js';\n\nexport type ReporterName = 'text' | 'json' | 'html' | 'markdown' | 'sarif';\n\nexport function generate(result: ScanResult, reporter: ReporterName = 'text'): string {\n switch (reporter) {\n case 'json':\n return generateJsonReport(result);\n case 'html':\n return generateHtmlReport(result);\n case 'markdown':\n return generateMarkdownReport(result);\n case 'sarif':\n return generateSarifReport(result);\n case 'text':\n default:\n return generateTextReport(result);\n }\n}\n\nexport async function writeReport(content: string, outputPath: string): Promise<void> {\n const dir = path.dirname(outputPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(outputPath, content, 'utf-8');\n}\n","import path from 'path';\nimport process from 'process';\nimport { loadConfig } from '../../config/loader.js';\nimport { scan } from '../../scanners/scanner.js';\nimport type { ScanOptions } from '../../scanners/scanner.js';\nimport { generate, writeReport } from '../../reporters/index.js';\nimport type { ReporterName } from '../../reporters/index.js';\nimport type { ResolvedConfig, Severity } from '../../types.js';\nimport { BOLD, DIM, GREEN, RED, RESET } from '../../utils/constants.js';\n\nexport interface ScanCommandOptions {\n config?: string;\n reporter?: string;\n output?: string;\n failThreshold?: string;\n maxCritical?: string;\n maxHigh?: string;\n aiSlop?: boolean;\n security?: boolean;\n reliability?: boolean;\n maintainability?: boolean;\n productionReadiness?: boolean;\n verbose?: boolean;\n quiet?: boolean;\n ci?: boolean;\n}\n\nfunction clearLine(): void {\n if (process.stdout.isTTY) {\n process.stdout.write('\\r\\x1b[K');\n }\n}\n\nfunction printProgress(filePath: string, index: number, total: number): void {\n if (!process.stdout.isTTY) return;\n const pct = Math.round(((index + 1) / total) * 100);\n const short = filePath.length > 60 ? '...' + filePath.slice(-57) : filePath;\n process.stdout.write(`\\r${DIM}Scanning [${pct}%] ${short}${RESET}`);\n}\n\nexport async function runScan(\n directory: string | undefined,\n options: ScanCommandOptions,\n): Promise<void> {\n const ci = options.ci ?? !process.stdout.isTTY;\n const cwd = directory ? path.resolve(directory) : process.cwd();\n\n // Load config\n const baseConfig = await loadConfig(cwd, options.config);\n\n // Apply CLI overrides\n const config: ResolvedConfig = {\n ...baseConfig,\n verbose: options.verbose ?? baseConfig.verbose,\n reporter: (options.reporter as ReporterName | undefined) ?? baseConfig.reporter,\n output: options.output ?? baseConfig.output,\n failThreshold: options.failThreshold\n ? parseInt(options.failThreshold, 10)\n : baseConfig.failThreshold,\n categories: {\n 'ai-slop': options.aiSlop === false ? false : (baseConfig.categories['ai-slop'] ?? true),\n security: options.security === false ? false : (baseConfig.categories['security'] ?? true),\n reliability:\n options.reliability === false ? false : (baseConfig.categories['reliability'] ?? true),\n maintainability:\n options.maintainability === false\n ? false\n : (baseConfig.categories['maintainability'] ?? true),\n 'production-readiness':\n options.productionReadiness === false\n ? false\n : (baseConfig.categories['production-readiness'] ?? true),\n },\n };\n\n if (options.maxCritical !== undefined) {\n config.maxIssues = { ...config.maxIssues, critical: parseInt(options.maxCritical, 10) };\n }\n if (options.maxHigh !== undefined) {\n config.maxIssues = { ...config.maxIssues, high: parseInt(options.maxHigh, 10) };\n }\n\n if (!ci && !options.quiet) {\n console.log(`\\n${BOLD}clean-slop${RESET} ${DIM}Production Readiness Engine${RESET}`);\n console.log(`${DIM}Scanning ${cwd}${RESET}\\n`);\n }\n\n const scanOptions: ScanOptions = { config };\n if (!options.quiet && !ci) scanOptions.onFile = printProgress;\n\n const result = await scan(scanOptions);\n\n if (!ci && !options.quiet && process.stdout.isTTY) {\n clearLine();\n }\n\n // Generate report\n const reporterName = config.reporter as ReporterName;\n const reportContent = generate(result, reporterName);\n\n if (config.output) {\n await writeReport(reportContent, config.output);\n if (!options.quiet) {\n console.log(`${GREEN}Report written to ${config.output}${RESET}`);\n }\n } else {\n process.stdout.write(reportContent);\n }\n\n // Determine exit code\n let shouldFail = false;\n\n // Score threshold\n if (result.score.overall < config.failThreshold) {\n shouldFail = true;\n }\n\n // maxIssues per severity\n for (const [sev, max] of Object.entries(config.maxIssues)) {\n if (max === undefined) continue;\n const count = result.issues.filter((i) => i.severity === (sev as Severity)).length;\n if (count > max) {\n shouldFail = true;\n if (!options.quiet && !ci) {\n console.error(\n `${RED}${count} ${sev} issue${count !== 1 ? 's' : ''} found (max allowed: ${max})${RESET}`,\n );\n }\n }\n }\n\n if (shouldFail) {\n process.exit(1);\n }\n}\n","import path from 'path';\nimport process from 'process';\nimport { loadConfig } from '../../config/loader.js';\nimport { scan } from '../../scanners/scanner.js';\nimport { GREEN, RED, RESET, BOLD, DIM } from '../../utils/constants.js';\n\nexport interface CheckCommandOptions {\n config?: string;\n failThreshold?: string;\n maxCritical?: string;\n}\n\nexport async function runCheck(\n directory: string | undefined,\n options: CheckCommandOptions,\n): Promise<void> {\n const cwd = directory ? path.resolve(directory) : process.cwd();\n const baseConfig = await loadConfig(cwd, options.config);\n\n const config = {\n ...baseConfig,\n failThreshold: options.failThreshold\n ? parseInt(options.failThreshold, 10)\n : baseConfig.failThreshold,\n verbose: false,\n };\n\n if (options.maxCritical !== undefined) {\n config.maxIssues = {\n ...config.maxIssues,\n critical: parseInt(options.maxCritical, 10),\n };\n }\n\n const result = await scan({ config });\n\n const criticalCount = result.issues.filter((i) => i.severity === 'critical').length;\n const maxCritical = config.maxIssues.critical ?? 0;\n const criticalExceeded = criticalCount > maxCritical;\n const scorePassed = result.score.overall >= config.failThreshold;\n const passed = scorePassed && !criticalExceeded;\n\n if (passed) {\n console.log(\n `${GREEN}${BOLD}PASS${RESET} Score: ${result.score.overall}/100 Grade: ${result.score.grade} ` +\n `${DIM}(threshold: ${config.failThreshold})${RESET}`,\n );\n process.exit(0);\n } else {\n const reasons: string[] = [];\n if (!scorePassed) {\n reasons.push(`score ${result.score.overall} below threshold ${config.failThreshold}`);\n }\n if (criticalExceeded) {\n reasons.push(\n `${criticalCount} critical issue${criticalCount !== 1 ? 's' : ''} (max: ${maxCritical})`,\n );\n }\n\n console.error(\n `${RED}${BOLD}FAIL${RESET} Score: ${result.score.overall}/100 Grade: ${result.score.grade}`,\n );\n for (const reason of reasons) {\n console.error(` ${RED}${reason}${RESET}`);\n }\n process.exit(1);\n }\n}\n","import path from 'path';\nimport fs from 'fs';\nimport process from 'process';\nimport { loadConfig } from '../../config/loader.js';\nimport { scan } from '../../scanners/scanner.js';\nimport { generateTextReport } from '../../reporters/text-reporter.js';\nimport { BOLD, CYAN, DIM, GREEN, RED, RESET } from '../../utils/constants.js';\n\nexport interface WatchCommandOptions {\n config?: string;\n verbose?: boolean;\n}\n\nconst DEBOUNCE_MS = 500;\n\nexport async function runWatch(\n directory: string | undefined,\n options: WatchCommandOptions,\n): Promise<void> {\n const cwd = directory ? path.resolve(directory) : process.cwd();\n const config = await loadConfig(cwd, options.config);\n\n if (options.verbose) config.verbose = true;\n\n console.log(`\\n${BOLD}clean-slop watch${RESET} ${DIM}Watching ${cwd}${RESET}`);\n console.log(`${DIM}Press Ctrl+C to stop.${RESET}\\n`);\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n let running = false;\n\n async function runScanCycle(changedFile?: string): Promise<void> {\n if (running) return;\n running = true;\n\n if (changedFile) {\n const rel = path.relative(cwd, changedFile);\n console.log(`${CYAN}Changed:${RESET} ${rel}`);\n }\n\n const startMsg = `${DIM}Scanning...${RESET}`;\n process.stdout.write(startMsg);\n\n try {\n const result = await scan({ config });\n process.stdout.write('\\r\\x1b[K');\n\n const report = generateTextReport(result);\n console.log(report);\n\n if (result.score.productionReady) {\n console.log(`${GREEN}Score: ${result.score.overall}/100${RESET}\\n`);\n } else {\n console.log(`${RED}Score: ${result.score.overall}/100${RESET}\\n`);\n }\n } catch (err) {\n process.stdout.write('\\r\\x1b[K');\n console.error(\n `${RED}Scan error:${RESET} ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n running = false;\n }\n\n // Initial scan\n await runScanCycle();\n\n // Watch for changes\n const watcher = fs.watch(cwd, { recursive: true }, (event, filename) => {\n if (!filename) return;\n\n // Filter to JS/TS files only\n if (!/\\.(js|jsx|ts|tsx|mjs|cjs)$/.test(filename)) return;\n\n // Skip excluded paths\n if (\n filename.includes('node_modules') ||\n filename.includes('dist') ||\n filename.includes('.next')\n )\n return;\n\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n void runScanCycle(path.join(cwd, filename));\n }, DEBOUNCE_MS);\n });\n\n process.on('SIGINT', () => {\n watcher.close();\n console.log(`\\n${DIM}Watch stopped.${RESET}\\n`);\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise<void>(() => {});\n}\n","import process from 'process';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport { execSync } from 'child_process';\nimport { loadConfig } from '../../config/loader.js';\nimport { BUILT_IN_RULES } from '../../rules/index.js';\nimport { BOLD, CYAN, DIM, GREEN, RED, RESET, YELLOW } from '../../utils/constants.js';\nimport { PACKAGE_VERSION } from '../../version.js';\n\nfunction check(label: string, ok: boolean, detail?: string): void {\n const icon = ok ? `${GREEN}✓${RESET}` : `${RED}✗${RESET}`;\n const msg = detail ? ` ${icon} ${label} ${DIM}${detail}${RESET}` : ` ${icon} ${label}`;\n console.log(msg);\n}\n\nfunction warn(label: string, detail?: string): void {\n const msg = detail\n ? ` ${YELLOW}!${RESET} ${label} ${DIM}${detail}${RESET}`\n : ` ${YELLOW}!${RESET} ${label}`;\n console.log(msg);\n}\n\nfunction info(label: string, detail?: string): void {\n const msg = detail\n ? ` ${CYAN}i${RESET} ${label} ${DIM}${detail}${RESET}`\n : ` ${CYAN}i${RESET} ${label}`;\n console.log(msg);\n}\n\nfunction getNodeVersion(): string {\n return process.version;\n}\n\nfunction meetsNodeMinimum(): boolean {\n const [major] = process.version.replace('v', '').split('.').map(Number);\n return (major ?? 0) >= 18;\n}\n\nfunction getNpmVersion(): string | null {\n try {\n return execSync('npm --version', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return null;\n }\n}\n\nexport async function runDoctor(): Promise<void> {\n const cwd = process.cwd();\n\n console.log(`\\n${BOLD}clean-slop doctor${RESET}\\n`);\n console.log(`${DIM}Diagnosing environment and configuration...${RESET}\\n`);\n\n // --- Environment ---\n console.log(`${BOLD}Environment${RESET}`);\n const nodeVersion = getNodeVersion();\n const nodeOk = meetsNodeMinimum();\n check('Node.js version', nodeOk, `${nodeVersion} (requires >= 18)`);\n\n const npmVersion = getNpmVersion();\n check('npm available', npmVersion !== null, npmVersion ?? 'not found');\n\n info('Platform', process.platform);\n info('Architecture', process.arch);\n info('clean-slop version', PACKAGE_VERSION);\n console.log();\n\n // --- Configuration ---\n console.log(`${BOLD}Configuration${RESET}`);\n\n let config;\n try {\n config = await loadConfig(cwd);\n check('Configuration loaded', true, `root: ${config.root}`);\n info('Fail threshold', `${config.failThreshold}/100`);\n info('Reporter', config.reporter);\n info('Output', config.output ?? 'stdout');\n\n const enabledCategories = Object.entries(config.categories)\n .filter(([, v]) => v)\n .map(([k]) => k);\n info('Enabled categories', enabledCategories.join(', '));\n\n const ruleOverrides = Object.keys(config.rules).length;\n info('Rule overrides', `${ruleOverrides}`);\n } catch (err) {\n check('Configuration loaded', false, err instanceof Error ? err.message : String(err));\n }\n console.log();\n\n // --- Project ---\n console.log(`${BOLD}Project${RESET}`);\n\n const pkgPath = path.join(cwd, 'package.json');\n try {\n const raw = await fs.readFile(pkgPath, 'utf-8');\n const pkg = JSON.parse(raw) as Record<string, unknown>;\n check('package.json found', true, String(pkg.name ?? '(no name)'));\n\n const allDeps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const hasTs = 'typescript' in allDeps;\n info('TypeScript project', String(hasTs));\n } catch {\n check('package.json found', false, 'Could not read package.json');\n }\n\n const tsconfigPath = path.join(cwd, 'tsconfig.json');\n try {\n await fs.access(tsconfigPath);\n check('tsconfig.json found', true);\n } catch {\n warn('tsconfig.json not found', 'TypeScript projects should include tsconfig.json');\n }\n\n const gitPath = path.join(cwd, '.git');\n try {\n await fs.access(gitPath);\n check('Git repository', true);\n } catch {\n warn('Not a git repository', 'clean-slop works best in a git repository');\n }\n\n const gitignorePath = path.join(cwd, '.gitignore');\n try {\n await fs.access(gitignorePath);\n check('.gitignore found', true);\n } catch {\n warn('.gitignore not found', 'Add a .gitignore to exclude build artifacts');\n }\n\n console.log();\n\n // --- Rules ---\n console.log(`${BOLD}Rules${RESET}`);\n info('Built-in rules loaded', `${BUILT_IN_RULES.length}`);\n\n const byCategory = new Map<string, number>();\n for (const rule of BUILT_IN_RULES) {\n byCategory.set(rule.meta.category, (byCategory.get(rule.meta.category) ?? 0) + 1);\n }\n for (const [cat, count] of byCategory) {\n info(` ${cat}`, `${count} rules`);\n }\n\n console.log();\n\n // --- Summary ---\n if (!meetsNodeMinimum()) {\n console.log(\n `${RED}Node.js >= 18 is required. Please upgrade your Node.js installation.${RESET}\\n`,\n );\n process.exit(1);\n }\n\n console.log(`${GREEN}Environment looks good.${RESET}\\n`);\n}\n","import path from 'path';\nimport fs from 'fs/promises';\nimport process from 'process';\nimport { generateDefaultConfig } from '../../config/loader.js';\nimport { GREEN, RED, RESET, YELLOW, BOLD } from '../../utils/constants.js';\n\nexport interface InitCommandOptions {\n force?: boolean;\n}\n\nexport async function runInit(options: InitCommandOptions): Promise<void> {\n const cwd = process.cwd();\n const configPath = path.join(cwd, 'clean-slop.config.js');\n\n try {\n await fs.access(configPath);\n // File exists\n if (!options.force) {\n console.log(\n `${YELLOW}clean-slop.config.js already exists.${RESET} ` +\n `Use ${BOLD}--force${RESET} to overwrite it.`,\n );\n process.exit(1);\n }\n } catch {\n // File does not exist — proceed\n }\n\n const content = generateDefaultConfig();\n\n try {\n await fs.writeFile(configPath, content, 'utf-8');\n console.log(`${GREEN}Created clean-slop.config.js${RESET}`);\n console.log(`${RESET}Edit it to customize rules, categories, and thresholds.\\n`);\n } catch (err) {\n console.error(\n `${RED}Failed to write config file: ${err instanceof Error ? err.message : String(err)}${RESET}`,\n );\n process.exit(1);\n }\n}\n","import path from 'path';\nimport process from 'process';\nimport { loadConfig } from '../../config/loader.js';\nimport { scan } from '../../scanners/scanner.js';\nimport { generate, writeReport } from '../../reporters/index.js';\nimport type { ReporterName } from '../../reporters/index.js';\nimport { GREEN, RESET } from '../../utils/constants.js';\n\nexport interface ReportCommandOptions {\n config?: string;\n reporter?: string;\n output?: string;\n}\n\nexport async function runReport(\n directory: string | undefined,\n options: ReportCommandOptions,\n): Promise<void> {\n const cwd = directory ? path.resolve(directory) : process.cwd();\n const baseConfig = await loadConfig(cwd, options.config);\n\n const reporterName = (options.reporter ?? baseConfig.reporter) as ReporterName;\n const outputPath = options.output ?? baseConfig.output;\n\n if (!outputPath && reporterName === 'html') {\n const defaultOut = path.join(cwd, 'clean-slop-report.html');\n baseConfig.output = defaultOut;\n } else if (outputPath) {\n baseConfig.output = outputPath;\n }\n\n const config = { ...baseConfig, reporter: reporterName };\n\n console.log(`Scanning ${cwd}...`);\n const result = await scan({ config });\n\n const content = generate(result, reporterName);\n\n if (config.output) {\n await writeReport(content, config.output);\n console.log(`${GREEN}Report written to ${config.output}${RESET}`);\n } else {\n process.stdout.write(content);\n }\n}\n","import { Command } from 'commander';\nimport { PACKAGE_VERSION } from '../version.js';\nimport { runScan } from './commands/scan.js';\nimport { runCheck } from './commands/check.js';\nimport { runWatch } from './commands/watch.js';\nimport { runDoctor } from './commands/doctor.js';\nimport { runInit } from './commands/init.js';\nimport { runReport } from './commands/report.js';\n\nexport { createCLI };\n\nfunction createCLI(): Command {\n const program = new Command();\n\n program\n .name('clean-slop')\n .description(\n 'Production Readiness Engine for JavaScript and TypeScript projects.\\n' +\n 'Prevents low-quality, insecure, and AI-generated code from reaching production.',\n )\n .version(PACKAGE_VERSION, '-v, --version', 'Print the current version')\n .helpOption('-h, --help', 'Display help information');\n\n // Default command: scan (also explicit)\n program\n .command('scan [directory]', { isDefault: true })\n .description('Scan a directory for issues (default command)')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('--reporter <name>', 'Reporter to use: text, json, html, markdown, sarif', 'text')\n .option('-o, --output <file>', 'Write report to a file instead of stdout')\n .option('--fail-threshold <score>', 'Minimum score before exiting with code 1', '70')\n .option('--max-critical <n>', 'Maximum allowed critical issues (0 = none)', '0')\n .option('--max-high <n>', 'Maximum allowed high issues')\n .option('--no-ai-slop', 'Disable AI slop rules')\n .option('--no-security', 'Disable security rules')\n .option('--no-reliability', 'Disable reliability rules')\n .option('--no-maintainability', 'Disable maintainability rules')\n .option('--no-production-readiness', 'Disable production readiness rules')\n .option('--verbose', 'Print full issue details including snippets and fixes')\n .option('--quiet', 'Only print the score summary, suppress issue list')\n .option('--ci', 'CI mode: machine-readable exit codes, no color')\n .action(runScan);\n\n program\n .command('check [directory]')\n .description('Quick check: exit 0 if production ready, 1 if not')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('--fail-threshold <score>', 'Minimum passing score', '70')\n .option('--max-critical <n>', 'Maximum critical issues allowed', '0')\n .action(runCheck);\n\n program\n .command('watch [directory]')\n .description('Watch for file changes and re-scan automatically')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('--verbose', 'Print full issue details')\n .action(runWatch);\n\n program\n .command('report [directory]')\n .description('Generate a report from the last scan or run a fresh scan')\n .option('-c, --config <path>', 'Path to configuration file')\n .option('--reporter <name>', 'Reporter: text, json, html, markdown, sarif', 'html')\n .option('-o, --output <file>', 'Output file path')\n .action(runReport);\n\n program\n .command('doctor')\n .description('Diagnose the current environment, config, and installation')\n .action(runDoctor);\n\n program\n .command('init')\n .description('Create a clean-slop.config.js in the current directory')\n .option('--force', 'Overwrite existing config file')\n .action(runInit);\n\n return program;\n}\n"]}