bilmem 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/relations.ts","../../src/core/knowledge.ts","../../src/core/quarantine.ts","../../src/core/unknown.ts","../../src/core/outcome.ts","../../src/core/learn.ts","../../src/core/dependencies.ts","../../src/jev/scorer.ts","../../src/jev/matcher.ts","../../src/search/indexer.ts","../../src/search/retriever.ts","../../src/core/resolver.ts"],"sourcesContent":["import type { EvidenceRelation, RelationType } from './types.js';\n\n/**\n * Lightweight, in-memory graph structure for managing relations between\n * files, observations, evidence, and knowledge nodes.\n */\nexport class EvidenceGraph {\n private fromMap = new Map<string, EvidenceRelation[]>();\n private toMap = new Map<string, EvidenceRelation[]>();\n\n constructor(relations: EvidenceRelation[] = []) {\n for (const rel of relations) {\n this.addRelation(rel);\n }\n }\n\n addRelation(relation: EvidenceRelation): void {\n if (!relation || !relation.from || !relation.to || !relation.type) {\n return;\n }\n\n // Prevent identical duplicate edges\n const existing = this.getRelationsBetween(relation.from, relation.to);\n const dup = existing.find((r) => r.type === relation.type);\n if (dup) {\n // If weight differs, increase weight\n dup.weight = (dup.weight ?? 1) + (relation.weight ?? 1);\n return;\n }\n\n const fromList = this.fromMap.get(relation.from) ?? [];\n fromList.push(relation);\n this.fromMap.set(relation.from, fromList);\n\n const toList = this.toMap.get(relation.to) ?? [];\n toList.push(relation);\n this.toMap.set(relation.to, toList);\n }\n\n getRelationsFrom(fromId: string): EvidenceRelation[] {\n return this.fromMap.get(fromId) ?? [];\n }\n\n getRelationsTo(toId: string): EvidenceRelation[] {\n return this.toMap.get(toId) ?? [];\n }\n\n getRelationsBetween(fromId: string, toId: string): EvidenceRelation[] {\n const fromList = this.fromMap.get(fromId);\n if (!fromList) return [];\n return fromList.filter((r) => r.to === toId);\n }\n\n getAllRelations(): EvidenceRelation[] {\n const all: EvidenceRelation[] = [];\n for (const list of this.fromMap.values()) {\n all.push(...list);\n }\n return all;\n }\n\n findCoChanged(file: string, threshold = 1): Array<{ file: string; weight: number }> {\n const relations = this.getRelationsFrom(file).filter((r) => r.type === 'CO_CHANGED');\n const result: Array<{ file: string; weight: number }> = [];\n\n for (const rel of relations) {\n const w = rel.weight ?? 1;\n if (w >= threshold) {\n result.push({ file: rel.to, weight: w });\n }\n }\n\n return result.sort((a, b) => b.weight - a.weight);\n }\n\n findConnected(id: string, maxDepth = 2): string[] {\n const visited = new Set<string>();\n const queue: Array<{ node: string; depth: number }> = [{ node: id, depth: 0 }];\n\n while (queue.length > 0) {\n const { node, depth } = queue.shift()!;\n if (visited.has(node)) continue;\n visited.add(node);\n\n if (depth < maxDepth) {\n const outRels = this.getRelationsFrom(node);\n for (const r of outRels) {\n if (!visited.has(r.to)) {\n queue.push({ node: r.to, depth: depth + 1 });\n }\n }\n const inRels = this.getRelationsTo(node);\n for (const r of inRels) {\n if (!visited.has(r.from)) {\n queue.push({ node: r.from, depth: depth + 1 });\n }\n }\n }\n }\n\n visited.delete(id);\n return Array.from(visited);\n }\n\n toJSON(): EvidenceRelation[] {\n return this.getAllRelations();\n }\n\n static fromJSON(relations: EvidenceRelation[]): EvidenceGraph {\n return new EvidenceGraph(relations);\n }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n Knowledge,\n KnowledgeType,\n KnowledgeStatus,\n KnowledgeStage,\n KnowledgeHistoryEntry,\n KnowledgeOutcomesSummary,\n Scope,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction,\n ConfidenceTier\n} from './types.js';\nimport { determineInitialStage, calculateKnowledgeValue, evaluatePromotion } from './quarantine.js';\nimport type { MetricEvent } from '../stats/types.js';\n\n/**\n * Deterministic mapping between confidence tiers and normalized float scores.\n * Replaces arbitrary precision floats with explainable thresholds.\n */\nexport function tierToConfidence(tier: ConfidenceTier): number {\n switch (tier) {\n case 'low':\n return 0.50;\n case 'medium':\n return 0.75;\n case 'high':\n return 0.95;\n }\n}\n\nexport function confidenceToTier(score: number): ConfidenceTier {\n if (score >= 0.85) return 'high';\n if (score >= 0.65) return 'medium';\n return 'low';\n}\n\nexport function hashString(input: string): string {\n return createHash('sha256').update(input.trim().toLowerCase()).digest('hex').slice(0, 16);\n}\n\nexport function createObservation(params: {\n source: string;\n claim: string;\n provenance?: Provenance;\n confidence?: number;\n positive?: string[];\n negative?: string[];\n details?: Record<string, unknown>;\n}): Observation {\n const provenance: Provenance = params.provenance ?? {\n type: 'file',\n path: params.source,\n timestamp: new Date().toISOString()\n };\n const contentForHash = `${params.source}:${params.claim}:${provenance.commit || provenance.timestamp || Date.now()}`;\n const id = `obs_${hashString(contentForHash)}`;\n\n return {\n id,\n source: params.source,\n claim: params.claim.trim(),\n provenance,\n confidence: Math.min(1.0, Math.max(0.0, params.confidence ?? 0.8)),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n details: params.details,\n recordedAt: new Date().toISOString()\n };\n}\n\n/**\n * Creates or consolidates evidence based on underlying source.\n * Crucial constraint: Multiple agents reading the same source must NOT count as independent evidence.\n */\nexport function createEvidence(\n observation: Observation,\n type: 'supports' | 'contradicts' | 'observes' = 'supports'\n): Evidence {\n const sourceHash = hashString(observation.source);\n const id = `evi_${sourceHash}`;\n\n return {\n id,\n source: observation.source,\n sourceHash,\n observationIds: [observation.id],\n type,\n claim: observation.claim,\n provenance: observation.provenance,\n weight: 1.0,\n firstObservedAt: observation.recordedAt,\n lastObservedAt: observation.recordedAt\n };\n}\n\nexport function createKnowledge(params: {\n id: string;\n type?: KnowledgeType;\n status?: KnowledgeStatus;\n stage?: KnowledgeStage;\n statement: string;\n positive?: string[];\n negative?: string[];\n relations?: string[];\n depends_on?: string[];\n resolves?: string[];\n question?: string;\n confidence?: number;\n confidenceTier?: ConfidenceTier;\n evidence?: string[];\n scope?: Scope;\n tags?: string[];\n history?: KnowledgeHistoryEntry[];\n outcomesSummary?: KnowledgeOutcomesSummary;\n}): Knowledge {\n const now = new Date().toISOString();\n const confidenceTier =\n params.confidenceTier ??\n (params.confidence !== undefined ? confidenceToTier(params.confidence) : undefined);\n const confidence =\n params.confidence !== undefined\n ? params.confidence\n : (confidenceTier ? tierToConfidence(confidenceTier) : 0.85);\n\n const dependsOn = new Set<string>(params.depends_on ?? []);\n if (params.evidence) {\n for (const ev of params.evidence) {\n if (ev.startsWith('file:') || ev.startsWith('test:') || ev.startsWith('code:')) {\n dependsOn.add(ev);\n } else if (ev.includes('/') || ev.endsWith('.json') || ev.endsWith('.yaml') || ev.endsWith('.yml')) {\n dependsOn.add(`file:${ev}`);\n }\n }\n }\n\n const initialStage = params.stage ?? determineInitialStage({\n type: params.type ?? 'lesson',\n evidence: params.evidence ?? [],\n confidence\n });\n\n const status = params.status ?? (initialStage === 'candidate' ? 'candidate' : 'active');\n\n const history: KnowledgeHistoryEntry[] = params.history ?? [\n {\n timestamp: now,\n stage: initialStage,\n status,\n reason: `Initial knowledge recorded (${params.type ?? 'lesson'})`,\n source: params.evidence?.[0]\n }\n ];\n\n const knowledgeItem: Knowledge = {\n id: params.id.trim(),\n type: params.type ?? 'lesson',\n status,\n stage: initialStage,\n statement: params.statement.trim(),\n positive: Array.from(new Set(params.positive?.map((p) => p.trim().toLowerCase()) ?? [])),\n negative: Array.from(new Set(params.negative?.map((n) => n.trim().toLowerCase()) ?? [])),\n relations: Array.from(new Set(params.relations?.map((r) => r.trim()) ?? [])),\n depends_on: Array.from(dependsOn),\n resolves: params.resolves ? Array.from(new Set(params.resolves.map((r) => r.trim()))) : undefined,\n question: params.question?.trim(),\n confidence: Math.min(1.0, Math.max(0.0, confidence)),\n confidenceTier,\n evidence: Array.from(new Set(params.evidence ?? [])),\n scope: params.scope ?? 'project',\n tags: Array.from(new Set(params.tags?.map((t) => t.trim().toLowerCase()) ?? [])),\n temporal: {\n revision: 1\n },\n metrics: {\n reuse_count: 0,\n support_count: 1,\n contradiction_count: 0,\n successful_outcomes: 0,\n failed_outcomes: 0\n },\n outcomesSummary: params.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n },\n history,\n value: 0,\n createdAt: now,\n updatedAt: now\n };\n\n knowledgeItem.value = calculateKnowledgeValue(knowledgeItem);\n return knowledgeItem;\n}\n\n/**\n * Calculate effective confidence combining evidence ratio and outcome history.\n */\nexport function calculateEffectiveConfidence(knowledge: Knowledge): number {\n const m = knowledge.metrics;\n const base = knowledge.confidence;\n\n // Evidence ratio dampening: heavily penalizes contradictions\n const evRatio = (m.support_count + 1) / (m.support_count + 3 * m.contradiction_count + 1);\n\n const totalOutcomes = m.successful_outcomes + m.failed_outcomes;\n let outRatio = 1.0;\n let evWeight = 0.6;\n let outWeight = 0.4;\n\n if (totalOutcomes === 0) {\n evWeight = 0.85;\n outWeight = 0.15;\n } else {\n outRatio = (m.successful_outcomes + 1) / (totalOutcomes + 1);\n }\n\n const effective = base * (evWeight * evRatio + outWeight * outRatio);\n return Math.round(Math.min(1.0, Math.max(0.05, effective)) * 100) / 100;\n}\n\nconst knowledgeTokenCache = new WeakMap<Knowledge, Set<string>>();\n\n/**\n * Tokenize string into lowercase terms for lexical similarity comparison.\n */\nfunction tokenize(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getCachedTokens(k: Knowledge): Set<string> {\n let tokens = knowledgeTokenCache.get(k);\n if (!tokens) {\n tokens = tokenize(k.statement);\n knowledgeTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\nfunction jaccardSimilarity(setA: Set<string>, setB: Set<string>): number {\n if (setA.size === 0 && setB.size === 0) return 1.0;\n let intersection = 0;\n for (const item of setA) {\n if (setB.has(item)) intersection++;\n }\n const union = setA.size + setB.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Known polar antonym word pairs.\n */\nconst POLAR_ANTONYMS: Array<[string, string]> = [\n ['enabled', 'disabled'],\n ['enable', 'disable'],\n ['active', 'inactive'],\n ['true', 'false'],\n ['on', 'off'],\n ['yes', 'no'],\n ['allowed', 'disallowed'],\n ['allowed', 'prohibited'],\n ['allowed', 'forbidden'],\n ['permit', 'deny'],\n ['allow', 'forbid'],\n ['allow', 'prohibit'],\n ['always', 'never'],\n ['should', 'should not'],\n ['must', 'must not'],\n ['required', 'optional'],\n ['required', 'forbidden'],\n ['valid', 'invalid'],\n ['safe', 'unsafe'],\n ['sync', 'async'],\n ['synchronous', 'asynchronous'],\n ['public', 'private']\n];\n\nconst NEGATION_PATTERNS = [\n /\\bnot\\b/i,\n /\\bnever\\b/i,\n /\\bno\\b/i,\n /\\bcannot\\b/i,\n /\\bwithout\\b/i,\n /\\bdisallow\\b/i,\n /\\bforbid\\b/i,\n /\\bprohibit\\b/i,\n /\\bavoid\\b/i\n];\n\n/**\n * Checks if two statements express opposite polarity or semantic contradiction.\n * Essential rule: High lexical similarity does NOT imply MERGE.\n * \"cache enabled in production\" vs \"cache disabled in production\" have opposite polarity.\n */\nexport function detectPolarContradiction(\n stmtA: string,\n stmtB: string\n): { contradicted: boolean; reason?: string } {\n const lowerA = stmtA.toLowerCase();\n const lowerB = stmtB.toLowerCase();\n\n // 1. Check known antonym pairs\n for (const [pos, neg] of POLAR_ANTONYMS) {\n const aHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerA);\n const aHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerA);\n const bHasPos = new RegExp(`\\\\b${pos}\\\\b`, 'i').test(lowerB);\n const bHasNeg = new RegExp(`\\\\b${neg}\\\\b`, 'i').test(lowerB);\n\n if ((aHasPos && bHasNeg) || (aHasNeg && bHasPos)) {\n return {\n contradicted: true,\n reason: `Polar opposite terms detected: '${pos}' vs '${neg}'`\n };\n }\n }\n\n // 2. Check asymmetric negation (one statement has negation, the other does not)\n const aHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerA));\n const bHasNegation = NEGATION_PATTERNS.some((p) => p.test(lowerB));\n\n if (aHasNegation !== bHasNegation) {\n return {\n contradicted: true,\n reason: 'Asymmetric negation detected (one statement asserts, the other negates)'\n };\n }\n\n return { contradicted: false };\n}\n\n/**\n * Reconcile an incoming candidate lesson with existing knowledge.\n * Classifies the action as: NEW, MERGE, UPDATE, SUPPORT, CONTRADICT, SPECIALIZE, GENERALIZE, IGNORE.\n */\nexport function reconcileKnowledge(\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[]\n): ReconciliationResult {\n const candidateId = candidate.id?.trim();\n const candidateStmt = candidate.statement.trim();\n const candidateTokens = tokenize(candidateStmt);\n const candidatePos = new Set((candidate.positive ?? []).map((p) => p.trim().toLowerCase()));\n\n // 1. Direct ID match\n if (candidateId) {\n const directMatch = existingList.find((k) => k.id === candidateId);\n if (directMatch) {\n // Check for exact identical statement\n if (directMatch.statement.trim().toLowerCase() === candidateStmt.toLowerCase()) {\n // If evidence is identical and cues are identical, IGNORE to avoid duplicate bloat\n const hasNewEvidence = (candidate.evidence ?? []).some((e) => !directMatch.evidence.includes(e));\n if (!hasNewEvidence) {\n return {\n action: 'IGNORE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Identical statement and evidence already recorded'\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Confirms existing knowledge with new evidence source'\n };\n }\n\n // Check if candidate contradicts existing statement (e.g. contains negation or opposing cues)\n const opposingPositive = (candidate.negative ?? []).some((n) => directMatch.positive.includes(n));\n const opposingNegative = (candidate.positive ?? []).some((p) => directMatch.negative.includes(p));\n const polarCheck = detectPolarContradiction(candidateStmt, directMatch.statement);\n\n if (opposingPositive || opposingNegative || polarCheck.contradicted) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !directMatch.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(directMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(directMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Conflicting claim applies under specialized context cues: [${distinctCues.join(', ')}] (${polarCheck.reason || 'opposing polarity'})`\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: `Contradicts existing statement (${polarCheck.reason || 'opposing polarity'}) for ID \"${directMatch.id}\"`\n };\n }\n\n return {\n action: 'UPDATE',\n targetId: directMatch.id,\n knowledge: directMatch,\n reason: 'Refines or updates existing knowledge statement'\n };\n }\n }\n\n // 2. Search for nearby existing knowledge by statement similarity and contextual overlap\n let bestMatch: Knowledge | null = null;\n let bestSim = 0;\n let bestPolarCheck: { contradicted: boolean; reason?: string } = { contradicted: false };\n\n for (const existing of existingList) {\n const existingTokens = getCachedTokens(existing);\n const sim = jaccardSimilarity(candidateTokens, existingTokens);\n\n // Explicit polar contradiction check: opposing polar assertions on same topic\n const polarCheck = detectPolarContradiction(candidateStmt, existing.statement);\n if (polarCheck.contradicted) {\n let sharedCount = 0;\n for (const t of candidateTokens) {\n if (existingTokens.has(t)) sharedCount++;\n }\n const sharedCues = (candidate.positive ?? []).filter((p) => existing.positive.includes(p));\n if (sharedCount >= 2 || (sharedCues.length >= 1 && sim >= 0.35) || sim >= 0.40) {\n bestMatch = existing;\n bestSim = Math.max(sim, 0.85);\n bestPolarCheck = polarCheck;\n break;\n }\n }\n\n if (sim > bestSim) {\n bestSim = sim;\n bestMatch = existing;\n bestPolarCheck = polarCheck;\n }\n }\n\n if (bestMatch && bestSim >= 0.70) {\n // CRITICAL: First evaluate contradiction and polar polarity BEFORE any merge decision!\n const polarCheck = bestPolarCheck.contradicted\n ? bestPolarCheck\n : detectPolarContradiction(candidateStmt, bestMatch.statement);\n const hasOpposingCues =\n (candidate.negative ?? []).some((n) => bestMatch!.positive.includes(n)) ||\n (candidate.positive ?? []).some((p) => bestMatch!.negative.includes(p));\n\n if (polarCheck.contradicted || hasOpposingCues) {\n // Check if contexts differ (e.g. dev vs prod) -> SPECIALIZE\n const distinctCues = Array.from(candidatePos).filter((c) => !bestMatch!.positive.includes(c));\n const mentionsEnvA = /(development|dev|local|staging|test)/i.test(candidateStmt);\n const mentionsEnvB = /(production|prod)/i.test(bestMatch.statement);\n const mentionsEnvBDev = /(development|dev|local|staging|test)/i.test(bestMatch.statement);\n const mentionsEnvAProd = /(production|prod)/i.test(candidateStmt);\n\n if (distinctCues.length > 0 || (mentionsEnvA && mentionsEnvB) || (mentionsEnvBDev && mentionsEnvAProd)) {\n return {\n action: 'SPECIALIZE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `High textual similarity (${Math.round(bestSim * 100)}%) with polar distinction across contexts (${polarCheck.reason || 'opposing cues'})`,\n score: bestSim\n };\n }\n\n return {\n action: 'CONTRADICT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Contradicting statement (${polarCheck.reason || 'opposing cues'}) despite high textual similarity (${Math.round(bestSim * 100)}%)`,\n score: bestSim\n };\n }\n\n // Only if polarity is compatible and similarity is nearly identical:\n if (bestSim >= 0.90) {\n return {\n action: 'MERGE',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Nearly identical statement (${Math.round(bestSim * 100)}% match) with compatible polarity; merging cues and evidence`,\n score: bestSim\n };\n }\n\n return {\n action: 'SUPPORT',\n targetId: bestMatch.id,\n knowledge: bestMatch,\n reason: `Supports existing knowledge (${Math.round(bestSim * 100)}% similarity) with compatible polarity`,\n score: bestSim\n };\n }\n\n // 3. Fallback: completely new knowledge\n return {\n action: 'NEW',\n reason: 'No conflicting or matching knowledge found; creating new knowledge entry'\n };\n}\n\n/**\n * Apply reconciliation to knowledge base.\n */\nexport function applyReconciliation(\n reconciliation: ReconciliationResult,\n candidate: Partial<Knowledge> & { statement: string },\n existingList: Knowledge[],\n storage?: { appendMetricEvent(event: MetricEvent): Promise<void> }\n): { updatedKnowledge: Knowledge; action: ReconciliationAction; createdId: string } {\n const now = new Date().toISOString();\n\n switch (reconciliation.action) {\n case 'SUPPORT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n\n // Add new evidence refs\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) {\n target.evidence.push(e);\n }\n }\n }\n\n // Merge positive/negative cues if any new\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Confirmed with supporting evidence',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'SUPPORT', createdId: target.id };\n }\n\n case 'MERGE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.support_count++;\n target.metrics.last_used = now;\n storage?.appendMetricEvent({\n type: 'knowledge_merged',\n knowledgeId: target.id,\n targetId: reconciliation.targetId,\n timestamp: Date.now()\n });\n\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (candidate.positive) {\n for (const p of candidate.positive) {\n const lp = p.trim().toLowerCase();\n if (!target.positive.includes(lp)) target.positive.push(lp);\n }\n }\n\n if (candidate.negative) {\n for (const n of candidate.negative) {\n const ln = n.trim().toLowerCase();\n if (!target.negative.includes(ln)) target.negative.push(ln);\n }\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n\n const promotion = evaluatePromotion(target);\n if (promotion.promoted && promotion.newStage) {\n target.stage = promotion.newStage;\n if (target.stage === 'active' && target.status === 'candidate') {\n target.status = 'active';\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: promotion.reason || `Promoted to ${target.stage}`,\n source: candidate.evidence?.[0]\n });\n } else {\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Merged with compatible knowledge candidate',\n source: candidate.evidence?.[0]\n });\n }\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n return { updatedKnowledge: target, action: 'MERGE', createdId: target.id };\n }\n\n case 'UPDATE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.statement = candidate.statement;\n if (candidate.type) target.type = candidate.type;\n if (candidate.positive) {\n target.positive = Array.from(new Set([...target.positive, ...candidate.positive.map((p) => p.toLowerCase())]));\n }\n if (candidate.negative) {\n target.negative = Array.from(new Set([...target.negative, ...candidate.negative.map((n) => n.toLowerCase())]));\n }\n if (candidate.evidence) {\n target.evidence = Array.from(new Set([...target.evidence, ...candidate.evidence]));\n }\n\n target.temporal = {\n revision: (target.temporal?.revision ?? 1) + 1,\n valid_from: { timestamp: now }\n };\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Updated statement and context',\n source: candidate.evidence?.[0]\n });\n\n target.updatedAt = now;\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n storage?.appendMetricEvent({\n type: 'knowledge_strengthened',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'UPDATE', createdId: target.id };\n }\n\n case 'CONTRADICT': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n target.metrics.contradiction_count++;\n if (candidate.evidence) {\n for (const e of candidate.evidence) {\n if (!target.evidence.includes(e)) target.evidence.push(e);\n }\n }\n\n if (target.metrics.contradiction_count > target.metrics.support_count) {\n target.status = 'contradicted';\n }\n\n if (!target.history) {\n target.history = [\n {\n timestamp: target.createdAt || now,\n stage: target.stage,\n status: target.status,\n reason: 'Initial knowledge recorded',\n source: target.evidence?.[0]\n }\n ];\n }\n target.history.push({\n timestamp: now,\n stage: target.stage,\n status: target.status,\n reason: reconciliation.reason || 'Contradicted by opposing claim',\n source: candidate.evidence?.[0]\n });\n\n target.confidence = calculateEffectiveConfidence(target);\n target.value = calculateKnowledgeValue(target);\n target.updatedAt = now;\n storage?.appendMetricEvent({\n type: 'contradiction_detected',\n knowledgeId: target.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'CONTRADICT', createdId: target.id };\n }\n\n case 'SPECIALIZE': {\n // Create specialized branch\n const parent = existingList.find((k) => k.id === reconciliation.targetId);\n const subContext = candidate.positive?.[0] || 'specialized';\n const newId =\n candidate.id && candidate.id !== parent?.id\n ? candidate.id\n : `${parent ? parent.id : 'knowledge'}.${subContext}`;\n\n const created = createKnowledge({\n id: newId,\n type: candidate.type ?? parent?.type ?? 'lesson',\n statement: candidate.statement,\n positive: candidate.positive ?? [],\n negative: candidate.negative ?? [],\n relations: parent ? [parent.id, ...(candidate.relations ?? [])] : (candidate.relations ?? []),\n confidence: candidate.confidence ?? 0.85,\n evidence: candidate.evidence ?? [],\n scope: candidate.scope ?? parent?.scope ?? 'project',\n tags: candidate.tags ?? parent?.tags ?? []\n });\n\n if (parent) {\n if (!parent.relations.includes(newId)) {\n parent.relations.push(newId);\n }\n if (!parent.history) {\n parent.history = [\n {\n timestamp: parent.createdAt || now,\n stage: parent.stage,\n status: parent.status,\n reason: 'Initial knowledge recorded'\n }\n ];\n }\n parent.history.push({\n timestamp: now,\n stage: parent.stage,\n status: parent.status,\n reason: `Specialized into contextual branch ${newId}`\n });\n }\n\n storage?.appendMetricEvent({\n type: 'knowledge_specialized',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n\n return { updatedKnowledge: created, action: 'SPECIALIZE', createdId: created.id };\n }\n\n case 'IGNORE': {\n const target = existingList.find((k) => k.id === reconciliation.targetId)!;\n storage?.appendMetricEvent({\n type: 'duplicate_ignored',\n timestamp: Date.now()\n });\n return { updatedKnowledge: target, action: 'IGNORE', createdId: target.id };\n }\n\n case 'NEW':\n default: {\n const newId = candidate.id || `kn_${hashString(candidate.statement)}`;\n const created = createKnowledge({\n id: newId,\n type: candidate.type,\n statement: candidate.statement,\n positive: candidate.positive,\n negative: candidate.negative,\n relations: candidate.relations,\n confidence: candidate.confidence,\n evidence: candidate.evidence,\n scope: candidate.scope,\n tags: candidate.tags\n });\n storage?.appendMetricEvent({\n type: 'knowledge_created',\n knowledgeId: created.id,\n timestamp: Date.now()\n });\n return { updatedKnowledge: created, action: 'NEW', createdId: created.id };\n }\n }\n}\n","import type {\n Knowledge,\n KnowledgeStage,\n OutcomeRecord,\n KnowledgeBudgetConfig\n} from './types.js';\n\n/**\n * Determines initial quarantine stage for a new knowledge item.\n * Deterministic facts (e.g. compiler config, explicit package manifests) skip probation directly to 'active'.\n * Speculative lessons, heuristics, and inferences start in 'candidate' stage.\n */\nexport function determineInitialStage(knowledge: Partial<Knowledge>): KnowledgeStage {\n if (\n knowledge.type === 'fact' ||\n knowledge.type === 'architecture' ||\n knowledge.confidenceTier === 'high' ||\n (knowledge.confidence !== undefined && knowledge.confidence >= 0.85)\n ) {\n return 'active';\n }\n if (\n knowledge.type === 'rule' &&\n ((knowledge.evidence?.length ?? 0) >= 2 || (knowledge.confidence !== undefined && knowledge.confidence >= 0.75))\n ) {\n return 'probation';\n }\n if (knowledge.confidence !== undefined && knowledge.confidence >= 0.70) {\n return 'probation';\n }\n return 'candidate';\n}\n\n/**\n * Evaluates whether a knowledge item qualifies for promotion along the quarantine ladder:\n * CANDIDATE -> PROBATION -> ACTIVE\n */\nexport function evaluatePromotion(knowledge: Knowledge): {\n promoted: boolean;\n newStage: KnowledgeStage;\n reason?: string;\n} {\n const stage = knowledge.stage ?? 'candidate';\n const supportCount = knowledge.metrics.support_count;\n const reuseCount = knowledge.metrics.reuse_count;\n const successCount = Math.max(knowledge.outcomesSummary?.successful ?? 0, knowledge.metrics.successful_outcomes ?? 0);\n const misleadingCount = Math.max(knowledge.outcomesSummary?.misleading ?? 0, knowledge.metrics.failed_outcomes ?? 0);\n\n if (stage === 'candidate') {\n // Promote to probation if supported by 2+ independent sources or high confidence evidence\n if (supportCount >= 2 || (knowledge.evidence && knowledge.evidence.length >= 2) || knowledge.confidence >= 0.85) {\n return {\n promoted: true,\n newStage: 'probation',\n reason: `Supported by ${supportCount} sources / ${knowledge.evidence.length} evidence nodes`\n };\n }\n } else if (stage === 'probation') {\n // Promote to active if successfully reused or confirmed by positive task outcome without misleading outcomes\n if ((successCount > 0 && misleadingCount === 0) || (reuseCount >= 2 && misleadingCount === 0)) {\n return {\n promoted: true,\n newStage: 'active',\n reason: `Verified by ${successCount} successful task outcomes and ${reuseCount} reuses`\n };\n }\n }\n\n return { promoted: false, newStage: stage };\n}\n\n/**\n * Calculates deterministic knowledge value metric.\n * Combines reuse frequency, evidence backing, successful task outcomes, and penalizes misleading outcomes.\n * Used during compaction and knowledge budget management.\n */\nexport function calculateKnowledgeValue(knowledge: Knowledge): number {\n const reuse = knowledge.metrics.reuse_count;\n const success = knowledge.outcomesSummary?.successful ?? knowledge.metrics.successful_outcomes;\n const misleading = knowledge.outcomesSummary?.misleading ?? knowledge.metrics.failed_outcomes;\n const evidenceCount = Math.min(knowledge.evidence.length, 6);\n const confidence = knowledge.confidence;\n\n let value = (reuse * 2.5) + (success * 4.0) + (evidenceCount * 1.5) + (confidence * 2.0) - (misleading * 5.0);\n\n if (knowledge.status === 'active') value += 5.0;\n if (knowledge.status === 'needs_revalidation') value -= 3.0;\n if (knowledge.status === 'contradicted') value -= 8.0;\n if (knowledge.status === 'stale') value -= 4.0;\n if (knowledge.stage === 'active') value += 3.0;\n if (knowledge.stage === 'candidate') value -= 1.0;\n\n return Math.round(value * 10) / 10;\n}\n\n/**\n * Applies a task outcome record to a knowledge item:\n * Updates outcome telemetry, recalculates value, and triggers promotion or demotion.\n */\nexport function recordOutcomeOnKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): { updatedKnowledge: Knowledge; actionTaken?: string } {\n const now = new Date().toISOString();\n const summary = knowledge.outcomesSummary ?? {\n applied: 0,\n successful: 0,\n misleading: 0,\n neutral: 0\n };\n\n summary.applied++;\n let actionTaken: string | undefined;\n\n if (outcome.result === 'success') {\n summary.successful++;\n knowledge.metrics.successful_outcomes++;\n knowledge.metrics.reuse_count++;\n // Check if probation item qualifies for promotion\n const promo = evaluatePromotion({ ...knowledge, outcomesSummary: summary });\n if (promo.promoted) {\n knowledge.stage = promo.newStage;\n actionTaken = `Promoted to ${promo.newStage} (${promo.reason})`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: knowledge.status,\n action: 'promote',\n reason: promo.reason\n });\n knowledge.history = history;\n }\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n summary.misleading++;\n knowledge.metrics.failed_outcomes++;\n // Demote or mark needs_revalidation if misleading outcomes dominate\n if (summary.misleading >= 2 && summary.misleading > summary.successful) {\n knowledge.status = 'needs_revalidation';\n actionTaken = `Marked needs_revalidation: ${summary.misleading} misleading outcomes recorded`;\n const history = knowledge.history ?? [];\n history.push({\n timestamp: now,\n status: 'needs_revalidation',\n action: 'demote',\n reason: actionTaken\n });\n knowledge.history = history;\n }\n } else {\n summary.neutral++;\n }\n\n knowledge.outcomesSummary = summary;\n knowledge.value = calculateKnowledgeValue(knowledge);\n knowledge.updatedAt = now;\n\n return { updatedKnowledge: knowledge, actionTaken };\n}\n\n/**\n * Enforces knowledge budget without arbitrarily deleting provenance.\n * When active knowledge exceeds budget, demotes lowest-value items to probation/candidate.\n */\nexport function enforceKnowledgeBudget(\n knowledgeList: Knowledge[],\n budget?: KnowledgeBudgetConfig\n): { modifiedList: Knowledge[]; demotedCount: number } {\n if (!budget || !budget.active || budget.active <= 0) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n const activeItems = knowledgeList.filter((k) => k.status === 'active' && k.stage === 'active');\n if (activeItems.length <= budget.active) {\n return { modifiedList: knowledgeList, demotedCount: 0 };\n }\n\n // Sort active items by value ascending (lowest value first)\n activeItems.sort((a, b) => calculateKnowledgeValue(a) - calculateKnowledgeValue(b));\n\n const excessCount = activeItems.length - budget.active;\n const toDemote = new Set(activeItems.slice(0, excessCount).map((k) => k.id));\n const now = new Date().toISOString();\n\n const modifiedList = knowledgeList.map((k) => {\n if (toDemote.has(k.id)) {\n const history = k.history ?? [];\n k.stage = 'probation';\n k.status = 'probation';\n k.updatedAt = now;\n k.history = [\n ...history,\n {\n timestamp: now,\n stage: 'probation',\n status: 'probation',\n action: 'budget_demotion',\n reason: `Active items exceeded budget (${budget.active}). Demoted to probation based on knowledge value.`\n }\n ];\n return k;\n }\n return k;\n });\n\n return { modifiedList, demotedCount: excessCount };\n}\n","import type {\n UnknownRecord,\n UnknownState,\n UnknownReason,\n UnknownNextAction,\n Scope\n} from './types.js';\n\nexport function createUnknown(params: {\n id: string;\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n checked?: string[];\n next?: UnknownNextAction;\n scope?: Scope;\n}): UnknownRecord {\n const now = new Date().toISOString();\n return {\n id: params.id.trim(),\n state: params.state ?? 'UNKNOWN',\n reason: params.reason ?? 'NOT_OBSERVED',\n statement: params.statement?.trim(),\n checked: Array.from(new Set(params.checked?.map((c) => c.trim()) ?? [])),\n next: params.next,\n scope: params.scope ?? 'project',\n createdAt: now,\n updatedAt: now\n };\n}\n\n/**\n * Checks if a specific path or query was already investigated,\n * helping agents avoid repeating useless investigations.\n */\nexport function hasBeenInvestigated(\n unknowns: UnknownRecord[],\n target: string\n): { investigated: boolean; record?: UnknownRecord; reason?: string } {\n const normalizedTarget = target.trim().toLowerCase();\n\n for (const record of unknowns) {\n if (record.id.toLowerCase() === normalizedTarget) {\n return { investigated: true, record, reason: record.reason };\n }\n\n const checkedMatch = record.checked.some((c) => {\n const nc = c.toLowerCase();\n return nc === normalizedTarget || normalizedTarget.startsWith(nc.replace('/**', ''));\n });\n\n if (checkedMatch) {\n return { investigated: true, record, reason: record.reason };\n }\n }\n\n return { investigated: false };\n}\n\n/**\n * Update an existing unknown with new checked paths or update its state when partially known or resolved.\n */\nexport function updateUnknown(\n record: UnknownRecord,\n updates: {\n state?: UnknownState;\n reason?: UnknownReason;\n statement?: string;\n addChecked?: string[];\n next?: UnknownNextAction;\n }\n): UnknownRecord {\n const checked = new Set(record.checked);\n if (updates.addChecked) {\n for (const c of updates.addChecked) {\n checked.add(c.trim());\n }\n }\n\n return {\n ...record,\n state: updates.state ?? record.state,\n reason: updates.reason ?? record.reason,\n statement: updates.statement !== undefined ? updates.statement : record.statement,\n checked: Array.from(checked),\n next: updates.next !== undefined ? updates.next : record.next,\n updatedAt: new Date().toISOString()\n };\n}\n","import { hashString, calculateEffectiveConfidence } from './knowledge.js';\nimport type {\n OutcomeRecord,\n OutcomeType,\n Knowledge,\n BilmemMetrics\n} from './types.js';\n\nexport function createOutcome(params: {\n knowledgeId?: string;\n taskId?: string;\n result: OutcomeType;\n context?: {\n positive?: string[];\n negative?: string[];\n };\n feedback?: string;\n}): OutcomeRecord {\n const content = `${params.knowledgeId || 'none'}:${params.result}:${Date.now()}`;\n return {\n id: `out_${hashString(content)}`,\n knowledgeId: params.knowledgeId,\n taskId: params.taskId,\n result: params.result,\n context: params.context,\n feedback: params.feedback,\n timestamp: new Date().toISOString()\n };\n}\n\n/**\n * Apply outcome to a knowledge unit and recalculate its confidence.\n */\nexport function applyOutcomeToKnowledge(\n knowledge: Knowledge,\n outcome: OutcomeRecord\n): Knowledge {\n const now = new Date().toISOString();\n knowledge.metrics.reuse_count++;\n knowledge.metrics.last_used = now;\n\n if (outcome.result === 'success') {\n knowledge.metrics.successful_outcomes++;\n } else if (outcome.result === 'failure' || outcome.result === 'reverted') {\n knowledge.metrics.failed_outcomes++;\n }\n\n // Recalculate effective confidence\n knowledge.confidence = calculateEffectiveConfidence(knowledge);\n knowledge.updatedAt = now;\n return knowledge;\n}\n\nexport class MetricsTracker {\n private metrics: BilmemMetrics = {\n knowledgeHits: 0,\n knowledgeMisses: 0,\n knowledgeReused: 0,\n unknownsResolved: 0,\n repeatedInvestigationsPrevented: 0,\n candidateKnowledgeMerged: 0,\n staleKnowledgeDetected: 0,\n contradictionsDetected: 0,\n knowledgePromoted: 0,\n knowledgeSuperseded: 0\n };\n\n constructor(initial?: Partial<BilmemMetrics>) {\n if (initial) {\n this.metrics = { ...this.metrics, ...initial };\n }\n }\n\n recordHit(): void {\n this.metrics.knowledgeHits++;\n }\n\n recordMiss(): void {\n this.metrics.knowledgeMisses++;\n }\n\n recordReused(): void {\n this.metrics.knowledgeReused++;\n }\n\n recordUnknownResolved(): void {\n this.metrics.unknownsResolved++;\n }\n\n recordInvestigationPrevented(): void {\n this.metrics.repeatedInvestigationsPrevented++;\n }\n\n recordCandidateMerged(): void {\n this.metrics.candidateKnowledgeMerged++;\n }\n\n recordStaleDetected(): void {\n this.metrics.staleKnowledgeDetected++;\n }\n\n recordContradiction(): void {\n this.metrics.contradictionsDetected++;\n }\n\n recordPromoted(): void {\n this.metrics.knowledgePromoted++;\n }\n\n recordSuperseded(): void {\n this.metrics.knowledgeSuperseded++;\n }\n\n getMetrics(): BilmemMetrics {\n return { ...this.metrics };\n }\n\n toJSON(): BilmemMetrics {\n return this.metrics;\n }\n}\n","import { createHash } from 'node:crypto';\nimport type {\n TaskTrajectory,\n Knowledge,\n Observation,\n Evidence,\n Provenance,\n ReconciliationResult,\n ReconciliationAction\n} from './types.js';\nimport {\n createObservation,\n createEvidence,\n createKnowledge,\n reconcileKnowledge,\n applyReconciliation\n} from './knowledge.js';\n\nexport interface DistilledLesson {\n id: string;\n statement: string;\n positive: string[];\n negative: string[];\n confidence: number;\n evidence: string[];\n tags: string[];\n reasoning: string;\n}\n\nexport interface TrajectoryLearningResult {\n taskId: string;\n observations: Observation[];\n evidence: Evidence[];\n candidateLessons: Array<Partial<Knowledge> & { statement: string }>;\n reconciliations: Array<{\n candidate: Partial<Knowledge> & { statement: string };\n result: ReconciliationResult;\n appliedKnowledge?: Knowledge;\n action: ReconciliationAction;\n }>;\n dryRun: boolean;\n}\n\n/**\n * Distill a task trajectory into a compact, reusable candidate lesson.\n * Avoids dumping raw trajectories into permanent memory;\n * extracts only the crystallized insight (what worked, what failed, negative patterns).\n */\nexport function distillTrajectory(trajectory: TaskTrajectory): DistilledLesson | null {\n const events = trajectory.events || [];\n if (events.length === 0) return null;\n\n const failures = events.filter((e) => e.type === 'failure' || e.type === 'revert');\n const successes = events.filter((e) => e.type === 'success');\n const corrections = events.filter((e) => e.type === 'user_correction');\n\n // If nothing succeeded or no significant signal, do not create spurious memory\n if (successes.length === 0 && corrections.length === 0 && failures.length === 0) {\n return null;\n }\n\n const positiveSignals = new Set<string>();\n const negativeSignals = new Set<string>();\n const tags = new Set<string>(['lesson', 'trajectory']);\n\n // Extract negative signals from failures and rejected hypotheses\n for (const f of failures) {\n negativeSignals.add(f.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (f.path) negativeSignals.add(f.path.toLowerCase());\n }\n\n // Extract positive signals from successful attempts & goal\n for (const s of successes) {\n positiveSignals.add(s.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n if (s.path) positiveSignals.add(s.path.toLowerCase());\n }\n\n // Extract from user corrections\n for (const c of corrections) {\n positiveSignals.add(c.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n tags.add('user-correction');\n }\n\n // Extract tokens from goal\n const goalTokens = trajectory.goal\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length > 3);\n for (const t of goalTokens) {\n positiveSignals.add(t);\n }\n\n // Compose statement\n let statement = '';\n let reasoning = '';\n\n if (corrections.length > 0) {\n const lastCorr = corrections[corrections.length - 1];\n statement = `Corrected approach for \"${trajectory.goal}\": ${lastCorr.description}`;\n reasoning = `Based on user correction during task ${trajectory.taskId}`;\n } else if (successes.length > 0) {\n const lastSuccess = successes[successes.length - 1];\n if (failures.length > 0) {\n const firstFailure = failures[0];\n statement = `When addressing \"${trajectory.goal}\": prefer ${lastSuccess.description} over ${firstFailure.description}`;\n reasoning = `Initial attempt (${firstFailure.description}) failed/reverted; resolved by ${lastSuccess.description}`;\n } else {\n statement = `Effective pattern for \"${trajectory.goal}\": ${lastSuccess.description}`;\n reasoning = `Directly succeeded in task ${trajectory.taskId}`;\n }\n } else if (failures.length > 0) {\n const failureList = failures.map((f) => f.description).join(', ');\n statement = `Avoid for \"${trajectory.goal}\": approaches [${failureList}] failed`;\n reasoning = `Recorded ${failures.length} failed attempts in task ${trajectory.taskId}`;\n }\n\n const hash = createHash('sha256')\n .update(`${trajectory.goal}:${statement}`)\n .digest('hex')\n .slice(0, 12);\n const id = `lesson.${trajectory.taskId || hash}`;\n\n return {\n id,\n statement,\n positive: Array.from(positiveSignals).slice(0, 8),\n negative: Array.from(negativeSignals).slice(0, 8),\n confidence: corrections.length > 0 ? 0.95 : successes.length > 0 ? 0.85 : 0.65,\n evidence: [`trajectory:${trajectory.taskId}`],\n tags: Array.from(tags),\n reasoning\n };\n}\n\n/**\n * Executes the complete staged trajectory learning pipeline:\n * trajectory → observations → candidate lessons → reconcile → knowledge\n *\n * Honors the \"Memory should grow by refinement, not accumulation\" principle.\n * Raw trajectory is never dumped directly to knowledge.\n */\nexport function learnFromTrajectory(\n trajectory: TaskTrajectory,\n existingKnowledge: Knowledge[] = [],\n options: { dryRun?: boolean; storage?: { appendMetricEvent(event: any): Promise<void> } } = {}\n): TrajectoryLearningResult {\n const dryRun = options.dryRun ?? false;\n const storage = options.storage;\n const now = new Date().toISOString();\n const taskId = trajectory.taskId || `task_${Date.now()}`;\n const events = trajectory.events || [];\n\n // Step 1: Trajectory -> Observations\n const observations: Observation[] = [];\n events.forEach((event, idx) => {\n let obsType: Provenance['type'] = 'agent';\n let confidence = 0.75;\n const positive: string[] = [taskId, event.type];\n const negative: string[] = [];\n\n if (event.type === 'user_correction') {\n obsType = 'user';\n confidence = 0.98;\n } else if (event.type === 'failure' || event.type === 'revert') {\n obsType = 'test';\n confidence = 0.95;\n negative.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'success') {\n obsType = 'agent';\n confidence = 0.95;\n positive.push(event.description.toLowerCase().replace(/[^a-z0-9_-]/g, '-'));\n } else if (event.type === 'hypothesis') {\n confidence = 0.50; // Inferred / speculative\n }\n\n if (event.path) positive.push(event.path.toLowerCase());\n\n observations.push(\n createObservation({\n source: `trajectory:${taskId}:${event.type}:${idx}`,\n claim: `[${event.type.toUpperCase()}] ${event.description}`,\n provenance: {\n type: obsType,\n path: event.path,\n timestamp: event.timestamp || now\n },\n confidence,\n positive,\n negative: negative.length > 0 ? negative : undefined,\n details: { taskId, eventIndex: idx, eventType: event.type, ...(event.data || {}) }\n })\n );\n });\n\n // Step 2: Observations -> Evidence Nodes\n const evidence: Evidence[] = observations.map((obs) => {\n const isFailure = obs.claim.startsWith('[FAILURE]') || obs.claim.startsWith('[REVERT]');\n return createEvidence(obs, isFailure ? 'contradicts' : 'supports');\n });\n\n // Step 3: Evidence -> Candidate Lessons\n const distilled = distillTrajectory(trajectory);\n const candidateLessons: Array<Partial<Knowledge> & { statement: string }> = [];\n\n if (distilled) {\n // Attach observation IDs as evidence backing\n candidateLessons.push({\n id: distilled.id,\n type: 'lesson',\n statement: distilled.statement,\n positive: distilled.positive,\n negative: distilled.negative,\n confidence: distilled.confidence,\n evidence: evidence.map((e) => e.source),\n tags: distilled.tags,\n scope: 'project'\n });\n }\n\n // Step 4: Candidate Lessons -> Reconcile\n const reconciliations: TrajectoryLearningResult['reconciliations'] = [];\n const currentKnowledgeList = [...existingKnowledge];\n\n for (const candidate of candidateLessons) {\n const recResult = reconcileKnowledge(candidate, currentKnowledgeList);\n\n if (dryRun) {\n reconciliations.push({\n candidate,\n result: recResult,\n action: recResult.action\n });\n } else {\n const { updatedKnowledge, action } = applyReconciliation(\n recResult,\n candidate,\n currentKnowledgeList,\n storage\n );\n reconciliations.push({\n candidate,\n result: recResult,\n appliedKnowledge: updatedKnowledge,\n action\n });\n }\n }\n\n return {\n taskId,\n observations,\n evidence,\n candidateLessons,\n reconciliations,\n dryRun\n };\n}\n\n/**\n * Handle explicit user correction as high-quality evidence.\n * Prevents future agents from repeatedly making the same invalid assumption.\n */\nexport function processUserCorrection(params: {\n topic: string;\n incorrectAssumption: string;\n correctFact: string;\n context?: string[];\n author?: string;\n}): {\n observation: Observation;\n knowledge: Knowledge;\n} {\n const now = new Date().toISOString();\n const prov: Provenance = {\n type: 'user',\n timestamp: now,\n ...(params.author ? { author: params.author } : {})\n };\n\n const claim = `User correction on ${params.topic}: ${params.correctFact} (supersedes assumption: ${params.incorrectAssumption})`;\n\n const observation = createObservation({\n source: `user:correction:${params.topic.toLowerCase()}`,\n claim,\n provenance: prov,\n confidence: 1.0,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()]\n });\n\n const evidence = createEvidence(observation, 'supports');\n\n const knowledge = createKnowledge({\n id: `correction.${params.topic.toLowerCase().replace(/[^a-z0-9_-]/g, '.')}`,\n type: 'rule',\n status: 'active',\n statement: params.correctFact,\n positive: [params.topic.toLowerCase(), ...(params.context ?? [])],\n negative: [params.incorrectAssumption.toLowerCase()],\n confidence: 1.0,\n confidenceTier: 'high',\n evidence: [evidence.id, observation.source],\n tags: ['user-correction', params.topic.toLowerCase()]\n });\n\n return { observation, knowledge };\n}\n","import type { Knowledge, KnowledgeStatus } from './types.js';\n\nexport interface SourceDependencyIndex {\n // source key (e.g. \"src/auth/session.ts\", \"file:src/auth/session.ts\") -> Set of knowledge IDs\n sourceToKnowledge: Map<string, Set<string>>;\n}\n\nexport function normalizeSourceKey(source: string): string {\n return source.replace(/^(file|code|test|doc):/, '').trim().toLowerCase();\n}\n\n/**\n * Builds a reverse index mapping source paths / files to the knowledge IDs that depend on them.\n */\nexport function buildDependencyIndex(knowledgeList: Knowledge[]): SourceDependencyIndex {\n const sourceToKnowledge = new Map<string, Set<string>>();\n\n for (const k of knowledgeList) {\n const allDependencies = new Set<string>();\n\n // Explicit depends_on\n if (k.depends_on) {\n for (const d of k.depends_on) {\n allDependencies.add(normalizeSourceKey(d));\n }\n }\n\n // Implicit evidence references\n if (k.evidence) {\n for (const ev of k.evidence) {\n allDependencies.add(normalizeSourceKey(ev));\n }\n }\n\n for (const dep of allDependencies) {\n if (!dep) continue;\n let set = sourceToKnowledge.get(dep);\n if (!set) {\n set = new Set<string>();\n sourceToKnowledge.set(dep, set);\n }\n set.add(k.id);\n }\n }\n\n return { sourceToKnowledge };\n}\n\nexport interface StalenessCheckResult {\n knowledgeId: string;\n affected: boolean;\n status: KnowledgeStatus;\n changedSources: string[];\n unchangedSources: string[];\n reason?: string;\n}\n\n/**\n * Checks a knowledge item against a list of changed file paths / sources.\n * If any supporting dependency changed, marks as 'needs_revalidation'.\n */\nexport function checkKnowledgeStaleness(\n knowledge: Knowledge,\n changedSources: string[]\n): StalenessCheckResult {\n const normChanged = new Set(changedSources.map(normalizeSourceKey));\n const allDeps = [\n ...(knowledge.depends_on ?? []).map(normalizeSourceKey),\n ...knowledge.evidence.map(normalizeSourceKey)\n ];\n\n const changed: string[] = [];\n const unchanged: string[] = [];\n\n for (const dep of allDeps) {\n if (!dep) continue;\n // Check direct match or path containment\n const isChanged = normChanged.has(dep) || Array.from(normChanged).some((c) => dep.includes(c) || c.includes(dep));\n if (isChanged) {\n changed.push(dep);\n } else {\n unchanged.push(dep);\n }\n }\n\n if (changed.length > 0) {\n const reason = `Supporting dependency changed: ${changed.join(', ')}. Unchanged evidence: ${unchanged.join(', ') || 'none'}`;\n return {\n knowledgeId: knowledge.id,\n affected: true,\n status: 'needs_revalidation',\n changedSources: changed,\n unchangedSources: unchanged,\n reason\n };\n }\n\n return {\n knowledgeId: knowledge.id,\n affected: false,\n status: knowledge.status,\n changedSources: [],\n unchangedSources: allDeps\n };\n}\n\n/**\n * Marks knowledge units as 'needs_revalidation' when their underlying dependencies change,\n * preserving transparent history and reasons without deleting the knowledge.\n */\nexport function markStaleKnowledge(\n knowledgeList: Knowledge[],\n changedSources: string[]\n): { updatedKnowledge: Knowledge[]; affectedCount: number } {\n const now = new Date().toISOString();\n let affectedCount = 0;\n const updatedKnowledge: Knowledge[] = [];\n\n for (const k of knowledgeList) {\n if (k.status === 'superseded' || k.status === 'invalid' || k.status === 'invalidated') {\n updatedKnowledge.push(k);\n continue;\n }\n\n const res = checkKnowledgeStaleness(k, changedSources);\n if (res.affected) {\n affectedCount++;\n const history = k.history ?? [];\n const updated: Knowledge = {\n ...k,\n status: 'needs_revalidation',\n updatedAt: now,\n history: [\n ...history,\n {\n timestamp: now,\n status: 'needs_revalidation',\n action: 'source_changed',\n reason: res.reason\n }\n ]\n };\n updatedKnowledge.push(updated);\n } else {\n updatedKnowledge.push(k);\n }\n }\n\n return { updatedKnowledge, affectedCount };\n}\n\n/**\n * Checks a list of knowledge units against changed sources and returns the affected items.\n */\nexport function checkKnowledgeListStaleness(\n knowledgeList: Knowledge[],\n changedSources: string[]\n): {\n affectedKnowledge: Knowledge[];\n updatedKnowledge: Knowledge[];\n affectedCount: number;\n} {\n const { updatedKnowledge, affectedCount } = markStaleKnowledge(knowledgeList, changedSources);\n const affectedKnowledge = updatedKnowledge.filter((k) => k.status === 'needs_revalidation');\n return { affectedKnowledge, updatedKnowledge, affectedCount };\n}\n","import type {\n Knowledge,\n JevMatchStatus,\n JevExplanation,\n JevResult,\n Scope\n} from '../core/types.js';\n\nexport interface QueryContext {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n}\n\nconst statementTokenCache = new WeakMap<Knowledge, Set<string>>();\n\nfunction extractTokens(text?: string): Set<string> {\n if (!text) return new Set();\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2)\n );\n}\n\nfunction getKnowledgeStatementTokens(k: Knowledge): Set<string> {\n let tokens = statementTokenCache.get(k);\n if (!tokens) {\n tokens = extractTokens(k.statement);\n statementTokenCache.set(k, tokens);\n }\n return tokens;\n}\n\n/**\n * Evaluates JEV-style positive and negative contextual proximity for a knowledge unit.\n */\nexport function evaluateJev(\n knowledge: Knowledge,\n context: QueryContext\n): JevResult {\n const queryTokens = extractTokens(context.query);\n const contextPos = new Set((context.positive ?? []).map((p) => p.trim().toLowerCase()));\n const contextNeg = new Set((context.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n const knowPos = new Set((knowledge.positive ?? []).map((p) => p.trim().toLowerCase()));\n const knowNeg = new Set((knowledge.negative ?? []).map((n) => n.trim().toLowerCase()));\n\n // 1. Negative Conflict Detection\n const negativeConflicts: string[] = [];\n\n // Knowledge forbids something present in positive context\n for (const n of knowNeg) {\n if (contextPos.has(n) || queryTokens.has(n)) {\n negativeConflicts.push(`Knowledge forbids \"${n}\", which was present in context`);\n }\n }\n\n // Context forbids something present in knowledge\n for (const p of knowPos) {\n if (contextNeg.has(p)) {\n negativeConflicts.push(`Context forbids \"${p}\", which is required by knowledge`);\n }\n }\n\n // 2. Positive Matches\n const positiveMatches: string[] = [];\n\n // Direct cue overlap\n for (const p of knowPos) {\n if (contextPos.has(p)) {\n positiveMatches.push(`Context cue: ${p}`);\n } else {\n // Check if any query token matches or stems into cue\n for (const q of queryTokens) {\n if (p === q || p.startsWith(q) || q.startsWith(p)) {\n positiveMatches.push(`Query term match: ${p}`);\n break;\n }\n }\n }\n }\n\n // Statement query token overlap\n const stmtTokens = getKnowledgeStatementTokens(knowledge);\n let queryOverlapCount = 0;\n for (const q of queryTokens) {\n let matched = false;\n for (const st of stmtTokens) {\n if (q === st || q.startsWith(st) || st.startsWith(q)) {\n matched = true;\n break;\n }\n }\n if (matched) {\n queryOverlapCount++;\n positiveMatches.push(`Statement term: ${q}`);\n }\n }\n\n // 3. Positive Score Calculation\n const totalCues = Math.max(1, knowPos.size);\n const matchedCuesCount = positiveMatches.filter((m) => m.startsWith('Context cue') || m.startsWith('Query term')).length;\n const cueMatchRatio = matchedCuesCount / totalCues;\n const tokenOverlapScore = queryTokens.size > 0 ? queryOverlapCount / Math.max(1, queryTokens.size) : 0;\n const rawPositiveScore = 0.65 * cueMatchRatio + 0.35 * tokenOverlapScore;\n\n // 4. Scope Alignment\n let scopeMultiplier = 1.0;\n const targetScope = (context.scope ?? 'project').toLowerCase();\n const knowScope = (knowledge.scope ?? 'project').toLowerCase();\n\n if (targetScope === knowScope) {\n scopeMultiplier = 1.0;\n } else if (knowScope === 'global' || targetScope.startsWith(knowScope)) {\n scopeMultiplier = 0.85;\n } else if (knowScope === 'project' && targetScope.startsWith('branch:')) {\n scopeMultiplier = 0.90;\n } else {\n // Mismatched scopes\n scopeMultiplier = 0.30;\n }\n\n // 5. Confidence and Evidence Ratio\n const m = knowledge.metrics;\n const evRatio = (m.support_count + 1) / (m.support_count + 2 * m.contradiction_count + 1);\n const confidenceFactor = knowledge.confidence * evRatio;\n\n // 6. Outcome Boost / Penalty\n let outcomeAdjustment = 0;\n if (m.successful_outcomes > 0) {\n outcomeAdjustment += Math.min(0.10, m.successful_outcomes * 0.03);\n }\n if (m.failed_outcomes > 0) {\n outcomeAdjustment -= Math.min(0.20, m.failed_outcomes * 0.05);\n }\n\n // 7. Base Combined Score\n let score = (rawPositiveScore * 0.45 + confidenceFactor * 0.40 + outcomeAdjustment) * scopeMultiplier;\n\n // Stale or Contradicted Status Penalty\n if (knowledge.status === 'stale') {\n score *= 0.6;\n } else if (knowledge.status === 'contradicted') {\n score *= 0.3;\n } else if (knowledge.status === 'invalid' || knowledge.status === 'superseded') {\n score *= 0.1;\n }\n\n // 8. Negative Conflict Penalty & Decision\n let status: JevMatchStatus = 'POSSIBLE';\n const reasons: string[] = [];\n\n if (negativeConflicts.length > 0) {\n // Severe penalty for negative conflicts\n score = Math.max(0.01, score * 0.2);\n status = 'REJECT';\n reasons.push(`Rejected due to ${negativeConflicts.length} negative contextual conflicts.`);\n } else if (score >= 0.45 && positiveMatches.length > 0) {\n status = 'MATCH';\n reasons.push(`Strong contextual match with ${positiveMatches.length} matching signals.`);\n } else if (score >= 0.25) {\n status = 'POSSIBLE';\n reasons.push(`Potential match; partial contextual overlap.`);\n } else {\n status = 'REJECT';\n reasons.push(`Insufficient contextual match score (${score.toFixed(2)} < 0.25).`);\n }\n\n const finalScore = Math.round(Math.min(1.0, Math.max(0.0, score)) * 100) / 100;\n\n const explanation: JevExplanation = {\n positiveMatches,\n negativeConflicts,\n score: finalScore,\n confidence: knowledge.confidence,\n status,\n reasons\n };\n\n return {\n knowledge,\n status,\n score: finalScore,\n explanation\n };\n}\n","import type { Knowledge, JevResult } from '../core/types.js';\nimport { evaluateJev, type QueryContext } from './scorer.js';\n\n/**\n * Re-ranks a small set of candidate knowledge units using JEV contextual evaluation.\n */\nexport function rerankCandidates(\n candidates: Knowledge[],\n context: QueryContext\n): JevResult[] {\n const results: JevResult[] = [];\n\n for (const candidate of candidates) {\n const res = evaluateJev(candidate, context);\n results.push(res);\n }\n\n // Sort: MATCH first, then POSSIBLE, then REJECT; within each group, highest score first\n const statusPriority: Record<string, number> = {\n MATCH: 3,\n POSSIBLE: 2,\n REJECT: 1\n };\n\n results.sort((a, b) => {\n const prioDiff = (statusPriority[b.status] ?? 0) - (statusPriority[a.status] ?? 0);\n if (prioDiff !== 0) return prioDiff;\n const scoreDiff = b.score - a.score;\n if (Math.abs(scoreDiff) > 0.001) return scoreDiff;\n return b.knowledge.confidence - a.knowledge.confidence;\n });\n\n return results;\n}\n","import { create, insert, remove, search, type AnyOrama } from '@orama/orama';\nimport type { Knowledge } from '../core/types.js';\n\n/**\n * Rebuildable in-memory search index powered by Orama.\n * Note: Orama is strictly a candidate retrieval cache, NEVER the canonical source of truth.\n */\nexport class SearchIndex {\n private db: AnyOrama | null = null;\n private idToDocId = new Map<string, string>();\n\n async init(): Promise<void> {\n this.db = await create({\n schema: {\n id: 'string',\n statement: 'string',\n type: 'string',\n scope: 'string',\n status: 'string',\n positive: 'string[]',\n negative: 'string[]',\n tags: 'string[]'\n }\n });\n this.idToDocId.clear();\n }\n\n async buildIndex(knowledgeList: Knowledge[]): Promise<void> {\n await this.init();\n for (const item of knowledgeList) {\n await this.upsert(item);\n }\n }\n\n async upsert(item: Knowledge): Promise<void> {\n if (!this.db) {\n await this.init();\n }\n\n // If already in index, remove first\n const existingDocId = this.idToDocId.get(item.id);\n if (existingDocId) {\n try {\n await remove(this.db!, existingDocId);\n } catch {\n // Ignore if already deleted\n }\n this.idToDocId.delete(item.id);\n }\n\n const docId = await insert(this.db!, {\n id: item.id,\n statement: item.statement,\n type: item.type,\n scope: item.scope,\n status: item.status,\n positive: item.positive,\n negative: item.negative,\n tags: item.tags ?? []\n });\n\n this.idToDocId.set(item.id, docId);\n }\n\n async delete(id: string): Promise<void> {\n if (!this.db) return;\n const docId = this.idToDocId.get(id);\n if (docId) {\n try {\n await remove(this.db, docId);\n } catch {\n // Ignore\n }\n this.idToDocId.delete(id);\n }\n }\n\n async searchCandidates(term: string, limit = 25): Promise<string[]> {\n if (!this.db) {\n return [];\n }\n\n const cleanTerm = term.trim();\n if (!cleanTerm) {\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n\n try {\n const results = await search(this.db, {\n term: cleanTerm,\n limit,\n threshold: 0.2\n });\n\n return results.hits.map((h) => (h.document as any).id as string);\n } catch {\n // Fallback: term might contain special characters or fail tokenization\n return Array.from(this.idToDocId.keys()).slice(0, limit);\n }\n }\n\n size(): number {\n return this.idToDocId.size;\n }\n}\n\nexport { SearchIndex as OramaIndex };\n\n","import type { Knowledge, JevResult, Scope } from '../core/types.js';\nimport { rerankCandidates } from '../jev/matcher.js';\nimport type { QueryContext } from '../jev/scorer.js';\nimport type { SearchIndex } from './indexer.js';\n\nexport interface LookupOptions {\n query?: string;\n positive?: string[];\n negative?: string[];\n scope?: Scope;\n limit?: number;\n includeRejected?: boolean;\n}\n\nexport interface KnowledgeStoreProvider {\n getKnowledge(id: string): Promise<Knowledge | undefined>;\n getAllKnowledge(): Promise<Knowledge[]>;\n}\n\nexport class Retriever {\n constructor(\n private index: SearchIndex,\n private store: KnowledgeStoreProvider\n ) {}\n\n /**\n * Executes the full Bilmem retrieval pipeline:\n * 1. Query / Context\n * 2. Candidate retrieval (small candidate set)\n * 3. JEV contextual reranking\n * 4. MATCH / POSSIBLE / REJECT classification with explanations\n */\n async lookup(options: LookupOptions = {}): Promise<JevResult[]> {\n const limit = options.limit ?? 5;\n const query = options.query?.trim() ?? '';\n const positive = options.positive ?? [];\n const negative = options.negative ?? [];\n const scope = options.scope ?? 'project';\n\n const searchTerms: string[] = [];\n if (query) searchTerms.push(query);\n if (positive.length > 0) searchTerms.push(...positive.slice(0, 3));\n\n const searchTerm = searchTerms.join(' ').trim();\n\n // 1. Retrieve Candidate IDs from Orama\n let candidateIds = await this.index.searchCandidates(searchTerm, 30);\n\n // If no candidate found via search or empty term, get active items from store\n let candidates: Knowledge[] = [];\n if (candidateIds.length === 0) {\n const all = await this.store.getAllKnowledge();\n candidates = all.filter((k) => k.status !== 'invalid' && k.status !== 'superseded');\n } else {\n for (const id of candidateIds) {\n const item = await this.store.getKnowledge(id);\n if (item && item.status !== 'invalid' && item.status !== 'superseded') {\n candidates.push(item);\n }\n }\n\n // If candidates are very few (< 5), broaden candidate pool with active knowledge\n if (candidates.length < 5) {\n const all = await this.store.getAllKnowledge();\n for (const k of all) {\n if (!candidateIds.includes(k.id) && k.status !== 'invalid' && k.status !== 'superseded') {\n candidates.push(k);\n if (candidates.length >= 20) break;\n }\n }\n }\n }\n\n // 2. JEV Reranking on Candidates\n const queryContext: QueryContext = {\n query,\n positive,\n negative,\n scope\n };\n\n const reranked = rerankCandidates(candidates, queryContext);\n\n // 3. Filter by includeRejected and limit\n const filtered = options.includeRejected\n ? reranked\n : reranked.filter((r) => r.status !== 'REJECT');\n\n return filtered.slice(0, limit);\n }\n}\n\nexport { Retriever as BilmemRetriever };\n\n","import type {\n Knowledge,\n InvestigationReceipt,\n ResolutionResult,\n ResolutionState,\n ResolutionReason,\n ResolveOptions,\n NextEvidenceAction,\n ActionType,\n Scope,\n JevResult\n} from './types.js';\nimport { rerankCandidates } from '../jev/index.js';\nimport { SearchIndex } from '../search/indexer.js';\nimport { Retriever } from '../search/retriever.js';\nimport type { Storage } from '../storage/canonical.js';\n\n/**\n * Relative cost table for evidence-gathering actions.\n * Smallest action likely to resolve uncertainty is preferred.\n */\nexport const RELATIVE_COSTS: Record<ActionType, number> = {\n USE_KNOWLEDGE: 1,\n INSPECT_TEST: 2,\n INSPECT_FILE: 2,\n INSPECT_SYMBOL: 2.5,\n CHECK_DOCUMENTATION: 2.5,\n CHECK_GIT: 3,\n SEARCH_REPOSITORY: 4,\n ASK_USER: 3.5, // Context-dependent; cheaper than broad scan when specifically targeted\n STOP: 1\n};\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, ' ')\n .split(/\\s+/)\n .filter((t) => t.length > 2);\n}\n\n/**\n * Core Epistemic Resolver:\n * Answers: \"Do I know enough to act, what do I know does not apply,\n * what am I missing, and what is the cheapest next step to resolve the uncertainty?\"\n */\nexport async function resolveEpistemicQuery(\n options: ResolveOptions,\n storage: Storage,\n retriever?: Retriever | SearchIndex\n): Promise<ResolutionResult> {\n const question = options.question.trim();\n const positive = (options.positive ?? []).map((p) => p.trim().toLowerCase());\n const negative = (options.negative ?? []).map((n) => n.trim().toLowerCase());\n const scope = options.scope ?? 'project';\n\n // 1. Context Extraction: extract keywords from the question + explicit cues\n const queryTokens = tokenize(question);\n const contextualCues = Array.from(new Set([...positive, ...queryTokens]));\n\n // 2. Candidate Retrieval & 3. JEV Applicability Filtering\n const allKnowledge = await storage.getAllKnowledge();\n let jevResults: JevResult[];\n\n if (retriever instanceof Retriever) {\n jevResults = await retriever.lookup({\n query: question,\n positive: options.positive,\n negative: options.negative,\n scope,\n limit: options.limit ?? 25,\n includeRejected: true\n });\n } else {\n let candidatePool: Knowledge[] = [];\n if (retriever instanceof SearchIndex) {\n const queryTerm = queryTokens.slice(0, 5).join(' ');\n const ids = await retriever.searchCandidates(queryTerm, 30);\n for (const id of ids) {\n const item = await storage.getKnowledge(id);\n if (item) candidatePool.push(item);\n }\n }\n if (candidatePool.length === 0) {\n candidatePool = allKnowledge;\n }\n for (const k of allKnowledge) {\n if (!candidatePool.some((c) => c.id === k.id) && k.positive.some((p) => contextualCues.includes(p))) {\n candidatePool.push(k);\n }\n }\n jevResults = rerankCandidates(candidatePool, {\n positive: options.positive,\n negative: options.negative,\n scope\n });\n }\n\n const matchingItems: Knowledge[] = [];\n const rejectedItems: Array<{ id: string; reason: string }> = [];\n\n for (const res of jevResults) {\n let jevReason = 'INSUFFICIENT_CONTEXT';\n if (res.explanation.negativeConflicts.length > 0) {\n jevReason = 'HARD_NEGATIVE';\n } else if (res.explanation.reasons.some((r) => r.toLowerCase().includes('scope'))) {\n jevReason = 'SCOPE_MISMATCH';\n } else if (res.knowledge.status === 'stale' || res.knowledge.status === 'needs_revalidation') {\n jevReason = 'STALE_KNOWLEDGE';\n }\n\n await storage.appendMetricEvent({\n type: 'jev_result',\n knowledgeId: res.knowledge.id,\n result: res.status,\n reason: jevReason,\n timestamp: Date.now()\n });\n\n if (jevReason === 'HARD_NEGATIVE') {\n await storage.appendMetricEvent({\n type: 'jev_hard_negative',\n knowledgeId: res.knowledge.id,\n timestamp: Date.now()\n });\n }\n\n if (res.status === 'REJECT') {\n const conflictMsg = res.explanation.negativeConflicts.length > 0\n ? `${res.explanation.negativeConflicts.join(', ')} conflicts with current context`\n : (res.explanation.reasons[0] || 'Context mismatch');\n rejectedItems.push({\n id: res.knowledge.id,\n reason: conflictMsg\n });\n } else if (res.status === 'MATCH' || res.status === 'POSSIBLE') {\n matchingItems.push(res.knowledge);\n }\n }\n\n // 4. Retrieve Past Investigation Receipts to Avoid Redundant Work\n const receipts = await storage.getAllReceipts();\n const previouslyChecked = new Set<string>();\n const previouslyRejectedTargets = new Map<string, string>();\n\n // Find receipts relating to this question or overlapping context\n for (const r of receipts) {\n const qOverlap = tokenize(r.question).filter((t) => queryTokens.includes(t));\n if (qOverlap.length >= 2 || (r.positive && r.positive.some((p) => contextualCues.includes(p)))) {\n await storage.appendMetricEvent({\n type: 'investigation_reused',\n investigationId: r.id,\n timestamp: Date.now()\n });\n for (const c of r.checked) {\n previouslyChecked.add(c);\n }\n for (const rej of r.rejected) {\n previouslyRejectedTargets.set(rej.target, rej.reason);\n }\n }\n }\n\n // Add paths from existing evidence of matching items to checked list\n for (const m of matchingItems) {\n for (const ev of m.evidence) {\n previouslyChecked.add(ev.replace(/^(code|file|test|doc):/, ''));\n }\n if (m.depends_on) {\n for (const dep of m.depends_on) {\n previouslyChecked.add(dep.replace(/^(code|file|test|doc):/, ''));\n }\n }\n }\n\n // 5. Evidence & Staleness Evaluation\n const staleCandidates = matchingItems.filter((k) => k.status === 'needs_revalidation' || k.status === 'stale');\n const contradictedCandidates = matchingItems.filter((k) => k.status === 'contradicted');\n const activeCandidates = matchingItems.filter(\n (k) =>\n (k.status === 'active' || k.stage === 'active' || k.stage === 'probation') &&\n k.status !== 'needs_revalidation' &&\n k.status !== 'stale' &&\n k.status !== 'contradicted' &&\n k.status !== 'invalid' &&\n k.status !== 'superseded'\n );\n\n // 6. Question Memory: Check if a learned QUESTION exists for this uncertainty pattern\n const questionKnowledge = allKnowledge.filter((k) => k.type === 'question');\n let learnedQuestionToAsk: { question: string; targetTopic: string; reason: string } | undefined;\n\n for (const qk of questionKnowledge) {\n const matchesCues = qk.positive.some((p) => contextualCues.includes(p));\n const conflicts = qk.negative.some((n) => negative.includes(n));\n if (matchesCues && !conflicts && qk.question) {\n learnedQuestionToAsk = {\n question: qk.question,\n targetTopic: qk.resolves?.[0] || 'uncertainty',\n reason: `Learned question for [${qk.positive.join(', ')}] uncertainty`\n };\n break;\n }\n }\n\n // 7. Missing Aspects / Gap Analysis\n const coveredTokens = new Set<string>();\n for (const k of activeCandidates) {\n for (const t of tokenize(k.statement)) coveredTokens.add(t);\n for (const p of k.positive) coveredTokens.add(p);\n }\n\n const missingAspects: string[] = [];\n for (const qt of queryTokens) {\n if (!['how', 'what', 'why', 'when', 'where', 'are', 'the', 'for', 'with', 'does', 'from'].includes(qt)) {\n if (!coveredTokens.has(qt)) {\n missingAspects.push(qt);\n }\n }\n }\n\n // 8. Determine Resolution State\n let state: ResolutionState = 'UNKNOWN';\n let reason: ResolutionReason | undefined;\n\n if (activeCandidates.length === 0 && staleCandidates.length > 0) {\n state = 'STALE';\n reason = 'STALE_EVIDENCE';\n } else if (activeCandidates.length === 0 && contradictedCandidates.length > 0) {\n state = 'CONFLICTED';\n reason = 'CONFLICTING_EVIDENCE';\n } else if (activeCandidates.length === 0) {\n state = 'UNKNOWN';\n reason = rejectedItems.length > 0 && matchingItems.length === 0 ? 'CONTEXT_MISMATCH' : 'NOT_OBSERVED';\n } else if (missingAspects.length === 0 && activeCandidates.some((k) => k.confidence >= 0.85)) {\n state = 'KNOWN';\n } else {\n state = 'PARTIALLY_KNOWN';\n reason = 'INSUFFICIENT_EVIDENCE';\n }\n\n // 9. Deterministic Next Evidence Action Planner\n const checkedArray = Array.from(previouslyChecked);\n let nextAction: NextEvidenceAction | undefined;\n let fallback: ResolutionResult['fallback'];\n\n if (state === 'KNOWN') {\n nextAction = {\n type: 'USE_KNOWLEDGE',\n target: activeCandidates[0].id,\n reason: `Sufficient high-confidence knowledge available (${activeCandidates[0].id})`,\n relativeCost: RELATIVE_COSTS.USE_KNOWLEDGE,\n expectedInfoGain: 0.95\n };\n } else if (state === 'CONFLICTED') {\n nextAction = {\n type: 'ASK_USER',\n reason: 'Opposing credible knowledge requires contextual disambiguation',\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: `Conflicting conventions exist for \"${question}\". Which context applies?`\n };\n } else if (state === 'STALE') {\n const staleItem = staleCandidates[0];\n const targetSource = staleItem.depends_on?.[0] || staleItem.evidence[0] || 'source';\n nextAction = {\n type: 'INSPECT_FILE',\n target: targetSource.replace(/^(code|file|test|doc):/, ''),\n reason: `Revalidate stale knowledge (${staleItem.id}) whose dependencies changed`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.85\n };\n } else {\n // PARTIALLY_KNOWN or UNKNOWN: find cheapest untried action\n // Candidate actions ranked by expected information gain / relative cost\n\n // Priority 1: Learned Question from Question Memory (if high expected value)\n if (learnedQuestionToAsk) {\n nextAction = {\n type: 'ASK_USER',\n reason: learnedQuestionToAsk.reason,\n relativeCost: RELATIVE_COSTS.ASK_USER,\n expectedInfoGain: 0.9\n };\n fallback = {\n type: 'ask',\n question: learnedQuestionToAsk.question\n };\n } else {\n // Priority 2: Check candidate test or file evidence not yet inspected\n const testCandidates = [\n `tests/${queryTokens[0] || 'module'}.test.ts`,\n `test/${queryTokens[0] || 'module'}.test.ts`,\n `tests/session-refresh.test.ts`\n ];\n\n const uninspectedTest = testCandidates.find(\n (t) => !previouslyChecked.has(t) && !previouslyRejectedTargets.has(t)\n );\n\n const fileCandidates = [\n `src/${queryTokens[0] || 'auth'}/${queryTokens[1] || 'index'}.ts`,\n `src/${queryTokens[0] || 'index'}.ts`\n ];\n\n const uninspectedFile = fileCandidates.find(\n (f) => !previouslyChecked.has(f) && !previouslyRejectedTargets.has(f)\n );\n\n for (const t of testCandidates) {\n if (previouslyChecked.has(t)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: t,\n timestamp: Date.now()\n });\n }\n }\n for (const f of fileCandidates) {\n if (previouslyChecked.has(f)) {\n await storage.appendMetricEvent({\n type: 'source_read_avoided',\n source: f,\n timestamp: Date.now()\n });\n }\n }\n\n if (uninspectedTest && missingAspects.some((m) => m.includes('order') || m.includes('test') || m.includes('behavior'))) {\n nextAction = {\n type: 'INSPECT_TEST',\n target: uninspectedTest,\n reason: `Targeted test inspection for unconfirmed aspect: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_TEST,\n expectedInfoGain: 0.8\n };\n } else if (uninspectedFile) {\n nextAction = {\n type: 'INSPECT_FILE',\n target: uninspectedFile,\n reason: `Direct source inspection for missing context: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.INSPECT_FILE,\n expectedInfoGain: 0.75\n };\n } else {\n // Fallback to targeted symbol/repository search\n nextAction = {\n type: 'SEARCH_REPOSITORY',\n target: missingAspects.slice(0, 3).join(' ') || question,\n reason: `Targeted search for unobserved aspects: ${missingAspects.join(', ')}`,\n relativeCost: RELATIVE_COSTS.SEARCH_REPOSITORY,\n expectedInfoGain: 0.6\n };\n }\n\n fallback = {\n type: 'ask',\n question: `Could you clarify: ${question}? (Missing: ${missingAspects.join(', ') || 'specifics'})`\n };\n }\n }\n\n // Record Metric Events\n if (state === 'KNOWN' || (nextAction && nextAction.type !== 'SEARCH_REPOSITORY' && nextAction.type !== 'STOP')) {\n await storage.appendMetricEvent({\n type: 'broad_search_avoided',\n targetAction: nextAction?.type,\n timestamp: Date.now()\n });\n }\n\n for (const k of activeCandidates) {\n await storage.appendMetricEvent({\n type: 'knowledge_reused',\n knowledgeId: k.id,\n timestamp: Date.now()\n });\n }\n\n if (learnedQuestionToAsk || fallback?.type === 'ask') {\n await storage.appendMetricEvent({\n type: 'question_suggested',\n question: learnedQuestionToAsk?.question || fallback?.question,\n timestamp: Date.now()\n });\n }\n\n await storage.appendMetricEvent({\n type: 'resolve',\n state,\n action: nextAction?.type,\n question,\n timestamp: Date.now()\n });\n\n // 10. Record Investigation Receipt\n const receiptId = `receipt_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;\n const receipt: InvestigationReceipt = {\n id: receiptId,\n question,\n checked: checkedArray,\n findings: activeCandidates.map((c) => c.statement),\n rejected: rejectedItems.map((r) => ({ target: r.id, reason: r.reason })),\n missing: missingAspects,\n next: nextAction,\n status: state === 'KNOWN' ? 'resolved' : 'unresolved',\n timestamp: new Date().toISOString(),\n positive,\n negative\n };\n\n await storage.saveReceipt(receipt);\n\n return {\n state,\n reason,\n known: activeCandidates.map((k) => ({\n id: k.id,\n statement: k.statement,\n confidence: k.confidenceTier ?? k.confidence,\n confidenceTier: k.confidenceTier,\n stage: k.stage\n })),\n applicable: positive.length > 0 ? positive : contextualCues.slice(0, 5),\n rejected: rejectedItems,\n missing: missingAspects,\n checked: checkedArray,\n next: nextAction,\n fallback,\n receiptId\n };\n}\n"],"mappings":";AAMO,IAAM,gBAAN,MAAM,eAAc;AAAA,EACjB,UAAU,oBAAI,IAAgC;AAAA,EAC9C,QAAQ,oBAAI,IAAgC;AAAA,EAEpD,YAAY,YAAgC,CAAC,GAAG;AAC9C,eAAW,OAAO,WAAW;AAC3B,WAAK,YAAY,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,YAAY,UAAkC;AAC5C,QAAI,CAAC,YAAY,CAAC,SAAS,QAAQ,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AACjE;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,oBAAoB,SAAS,MAAM,SAAS,EAAE;AACpE,UAAM,MAAM,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,IAAI;AACzD,QAAI,KAAK;AAEP,UAAI,UAAU,IAAI,UAAU,MAAM,SAAS,UAAU;AACrD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,CAAC;AACrD,aAAS,KAAK,QAAQ;AACtB,SAAK,QAAQ,IAAI,SAAS,MAAM,QAAQ;AAExC,UAAM,SAAS,KAAK,MAAM,IAAI,SAAS,EAAE,KAAK,CAAC;AAC/C,WAAO,KAAK,QAAQ;AACpB,SAAK,MAAM,IAAI,SAAS,IAAI,MAAM;AAAA,EACpC;AAAA,EAEA,iBAAiB,QAAoC;AACnD,WAAO,KAAK,QAAQ,IAAI,MAAM,KAAK,CAAC;AAAA,EACtC;AAAA,EAEA,eAAe,MAAkC;AAC/C,WAAO,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC;AAAA,EAClC;AAAA,EAEA,oBAAoB,QAAgB,MAAkC;AACpE,UAAM,WAAW,KAAK,QAAQ,IAAI,MAAM;AACxC,QAAI,CAAC,SAAU,QAAO,CAAC;AACvB,WAAO,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI;AAAA,EAC7C;AAAA,EAEA,kBAAsC;AACpC,UAAM,MAA0B,CAAC;AACjC,eAAW,QAAQ,KAAK,QAAQ,OAAO,GAAG;AACxC,UAAI,KAAK,GAAG,IAAI;AAAA,IAClB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,MAAc,YAAY,GAA4C;AAClF,UAAM,YAAY,KAAK,iBAAiB,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AACnF,UAAM,SAAkD,CAAC;AAEzD,eAAW,OAAO,WAAW;AAC3B,YAAM,IAAI,IAAI,UAAU;AACxB,UAAI,KAAK,WAAW;AAClB,eAAO,KAAK,EAAE,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;AAAA,MACzC;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAAA,EAClD;AAAA,EAEA,cAAc,IAAY,WAAW,GAAa;AAChD,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,QAAgD,CAAC,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC;AAE7E,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,MAAM;AACpC,UAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,cAAQ,IAAI,IAAI;AAEhB,UAAI,QAAQ,UAAU;AACpB,cAAM,UAAU,KAAK,iBAAiB,IAAI;AAC1C,mBAAW,KAAK,SAAS;AACvB,cAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,GAAG;AACtB,kBAAM,KAAK,EAAE,MAAM,EAAE,IAAI,OAAO,QAAQ,EAAE,CAAC;AAAA,UAC7C;AAAA,QACF;AACA,cAAM,SAAS,KAAK,eAAe,IAAI;AACvC,mBAAW,KAAK,QAAQ;AACtB,cAAI,CAAC,QAAQ,IAAI,EAAE,IAAI,GAAG;AACxB,kBAAM,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,QAAQ,EAAE,CAAC;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,OAAO,EAAE;AACjB,WAAO,MAAM,KAAK,OAAO;AAAA,EAC3B;AAAA,EAEA,SAA6B;AAC3B,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA,EAEA,OAAO,SAAS,WAA8C;AAC5D,WAAO,IAAI,eAAc,SAAS;AAAA,EACpC;AACF;;;AC/GA,SAAS,kBAAkB;;;ACYpB,SAAS,sBAAsB,WAA+C;AACnF,MACE,UAAU,SAAS,UACnB,UAAU,SAAS,kBACnB,UAAU,mBAAmB,UAC5B,UAAU,eAAe,UAAa,UAAU,cAAc,MAC/D;AACA,WAAO;AAAA,EACT;AACA,MACE,UAAU,SAAS,YACjB,UAAU,UAAU,UAAU,MAAM,KAAM,UAAU,eAAe,UAAa,UAAU,cAAc,OAC1G;AACA,WAAO;AAAA,EACT;AACA,MAAI,UAAU,eAAe,UAAa,UAAU,cAAc,KAAM;AACtE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAMO,SAAS,kBAAkB,WAIhC;AACA,QAAM,QAAQ,UAAU,SAAS;AACjC,QAAM,eAAe,UAAU,QAAQ;AACvC,QAAM,aAAa,UAAU,QAAQ;AACrC,QAAM,eAAe,KAAK,IAAI,UAAU,iBAAiB,cAAc,GAAG,UAAU,QAAQ,uBAAuB,CAAC;AACpH,QAAM,kBAAkB,KAAK,IAAI,UAAU,iBAAiB,cAAc,GAAG,UAAU,QAAQ,mBAAmB,CAAC;AAEnH,MAAI,UAAU,aAAa;AAEzB,QAAI,gBAAgB,KAAM,UAAU,YAAY,UAAU,SAAS,UAAU,KAAM,UAAU,cAAc,MAAM;AAC/G,aAAO;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ,gBAAgB,YAAY,cAAc,UAAU,SAAS,MAAM;AAAA,MAC7E;AAAA,IACF;AAAA,EACF,WAAW,UAAU,aAAa;AAEhC,QAAK,eAAe,KAAK,oBAAoB,KAAO,cAAc,KAAK,oBAAoB,GAAI;AAC7F,aAAO;AAAA,QACL,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ,eAAe,YAAY,iCAAiC,UAAU;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,OAAO,UAAU,MAAM;AAC5C;AAOO,SAAS,wBAAwB,WAA8B;AACpE,QAAM,QAAQ,UAAU,QAAQ;AAChC,QAAM,UAAU,UAAU,iBAAiB,cAAc,UAAU,QAAQ;AAC3E,QAAM,aAAa,UAAU,iBAAiB,cAAc,UAAU,QAAQ;AAC9E,QAAM,gBAAgB,KAAK,IAAI,UAAU,SAAS,QAAQ,CAAC;AAC3D,QAAM,aAAa,UAAU;AAE7B,MAAI,QAAS,QAAQ,MAAQ,UAAU,IAAQ,gBAAgB,MAAQ,aAAa,IAAQ,aAAa;AAEzG,MAAI,UAAU,WAAW,SAAU,UAAS;AAC5C,MAAI,UAAU,WAAW,qBAAsB,UAAS;AACxD,MAAI,UAAU,WAAW,eAAgB,UAAS;AAClD,MAAI,UAAU,WAAW,QAAS,UAAS;AAC3C,MAAI,UAAU,UAAU,SAAU,UAAS;AAC3C,MAAI,UAAU,UAAU,YAAa,UAAS;AAE9C,SAAO,KAAK,MAAM,QAAQ,EAAE,IAAI;AAClC;AAMO,SAAS,yBACd,WACA,SACuD;AACvD,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,UAAU,UAAU,mBAAmB;AAAA,IAC3C,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,SAAS;AAAA,EACX;AAEA,UAAQ;AACR,MAAI;AAEJ,MAAI,QAAQ,WAAW,WAAW;AAChC,YAAQ;AACR,cAAU,QAAQ;AAClB,cAAU,QAAQ;AAElB,UAAM,QAAQ,kBAAkB,EAAE,GAAG,WAAW,iBAAiB,QAAQ,CAAC;AAC1E,QAAI,MAAM,UAAU;AAClB,gBAAU,QAAQ,MAAM;AACxB,oBAAc,eAAe,MAAM,QAAQ,KAAK,MAAM,MAAM;AAC5D,YAAM,UAAU,UAAU,WAAW,CAAC;AACtC,cAAQ,KAAK;AAAA,QACX,WAAW;AAAA,QACX,QAAQ,UAAU;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ,MAAM;AAAA,MAChB,CAAC;AACD,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF,WAAW,QAAQ,WAAW,aAAa,QAAQ,WAAW,YAAY;AACxE,YAAQ;AACR,cAAU,QAAQ;AAElB,QAAI,QAAQ,cAAc,KAAK,QAAQ,aAAa,QAAQ,YAAY;AACtE,gBAAU,SAAS;AACnB,oBAAc,8BAA8B,QAAQ,UAAU;AAC9D,YAAM,UAAU,UAAU,WAAW,CAAC;AACtC,cAAQ,KAAK;AAAA,QACX,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AACD,gBAAU,UAAU;AAAA,IACtB;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,YAAU,kBAAkB;AAC5B,YAAU,QAAQ,wBAAwB,SAAS;AACnD,YAAU,YAAY;AAEtB,SAAO,EAAE,kBAAkB,WAAW,YAAY;AACpD;AAMO,SAAS,uBACd,eACA,QACqD;AACrD,MAAI,CAAC,UAAU,CAAC,OAAO,UAAU,OAAO,UAAU,GAAG;AACnD,WAAO,EAAE,cAAc,eAAe,cAAc,EAAE;AAAA,EACxD;AAEA,QAAM,cAAc,cAAc,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY,EAAE,UAAU,QAAQ;AAC7F,MAAI,YAAY,UAAU,OAAO,QAAQ;AACvC,WAAO,EAAE,cAAc,eAAe,cAAc,EAAE;AAAA,EACxD;AAGA,cAAY,KAAK,CAAC,GAAG,MAAM,wBAAwB,CAAC,IAAI,wBAAwB,CAAC,CAAC;AAElF,QAAM,cAAc,YAAY,SAAS,OAAO;AAChD,QAAM,WAAW,IAAI,IAAI,YAAY,MAAM,GAAG,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC3E,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,QAAM,eAAe,cAAc,IAAI,CAAC,MAAM;AAC5C,QAAI,SAAS,IAAI,EAAE,EAAE,GAAG;AACtB,YAAM,UAAU,EAAE,WAAW,CAAC;AAC9B,QAAE,QAAQ;AACV,QAAE,SAAS;AACX,QAAE,YAAY;AACd,QAAE,UAAU;AAAA,QACV,GAAG;AAAA,QACH;AAAA,UACE,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ,iCAAiC,OAAO,MAAM;AAAA,QACxD;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AAED,SAAO,EAAE,cAAc,cAAc,YAAY;AACnD;;;ADtLO,SAAS,iBAAiB,MAA8B;AAC7D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEO,SAAS,iBAAiB,OAA+B;AAC9D,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,SAAS,KAAM,QAAO;AAC1B,SAAO;AACT;AAEO,SAAS,WAAW,OAAuB;AAChD,SAAO,WAAW,QAAQ,EAAE,OAAO,MAAM,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC1F;AAEO,SAAS,kBAAkB,QAQlB;AACd,QAAM,aAAyB,OAAO,cAAc;AAAA,IAClD,MAAM;AAAA,IACN,MAAM,OAAO;AAAA,IACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,QAAM,iBAAiB,GAAG,OAAO,MAAM,IAAI,OAAO,KAAK,IAAI,WAAW,UAAU,WAAW,aAAa,KAAK,IAAI,CAAC;AAClH,QAAM,KAAK,OAAO,WAAW,cAAc,CAAC;AAE5C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,OAAO;AAAA,IACf,OAAO,OAAO,MAAM,KAAK;AAAA,IACzB;AAAA,IACA,YAAY,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,OAAO,cAAc,GAAG,CAAC;AAAA,IACjE,UAAU,MAAM,KAAK,IAAI,IAAI,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,IACvF,UAAU,MAAM,KAAK,IAAI,IAAI,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,IACvF,SAAS,OAAO;AAAA,IAChB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC;AACF;AAMO,SAAS,eACd,aACA,OAAgD,YACtC;AACV,QAAM,aAAa,WAAW,YAAY,MAAM;AAChD,QAAM,KAAK,OAAO,UAAU;AAE5B,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,YAAY;AAAA,IACpB;AAAA,IACA,gBAAgB,CAAC,YAAY,EAAE;AAAA,IAC/B;AAAA,IACA,OAAO,YAAY;AAAA,IACnB,YAAY,YAAY;AAAA,IACxB,QAAQ;AAAA,IACR,iBAAiB,YAAY;AAAA,IAC7B,gBAAgB,YAAY;AAAA,EAC9B;AACF;AAEO,SAAS,gBAAgB,QAmBlB;AACZ,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,iBACJ,OAAO,mBACN,OAAO,eAAe,SAAY,iBAAiB,OAAO,UAAU,IAAI;AAC3E,QAAM,aACJ,OAAO,eAAe,SAClB,OAAO,aACN,iBAAiB,iBAAiB,cAAc,IAAI;AAE3D,QAAM,YAAY,IAAI,IAAY,OAAO,cAAc,CAAC,CAAC;AACzD,MAAI,OAAO,UAAU;AACnB,eAAW,MAAM,OAAO,UAAU;AAChC,UAAI,GAAG,WAAW,OAAO,KAAK,GAAG,WAAW,OAAO,KAAK,GAAG,WAAW,OAAO,GAAG;AAC9E,kBAAU,IAAI,EAAE;AAAA,MAClB,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,OAAO,KAAK,GAAG,SAAS,OAAO,KAAK,GAAG,SAAS,MAAM,GAAG;AAClG,kBAAU,IAAI,QAAQ,EAAE,EAAE;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,SAAS,sBAAsB;AAAA,IACzD,MAAM,OAAO,QAAQ;AAAA,IACrB,UAAU,OAAO,YAAY,CAAC;AAAA,IAC9B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,OAAO,WAAW,iBAAiB,cAAc,cAAc;AAE9E,QAAM,UAAmC,OAAO,WAAW;AAAA,IACzD;AAAA,MACE,WAAW;AAAA,MACX,OAAO;AAAA,MACP;AAAA,MACA,QAAQ,+BAA+B,OAAO,QAAQ,QAAQ;AAAA,MAC9D,QAAQ,OAAO,WAAW,CAAC;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,gBAA2B;AAAA,IAC/B,IAAI,OAAO,GAAG,KAAK;AAAA,IACnB,MAAM,OAAO,QAAQ;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,IACP,WAAW,OAAO,UAAU,KAAK;AAAA,IACjC,UAAU,MAAM,KAAK,IAAI,IAAI,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,IACvF,UAAU,MAAM,KAAK,IAAI,IAAI,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,IACvF,WAAW,MAAM,KAAK,IAAI,IAAI,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,IAC3E,YAAY,MAAM,KAAK,SAAS;AAAA,IAChC,UAAU,OAAO,WAAW,MAAM,KAAK,IAAI,IAAI,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI;AAAA,IACxF,UAAU,OAAO,UAAU,KAAK;AAAA,IAChC,YAAY,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,UAAU,CAAC;AAAA,IACnD;AAAA,IACA,UAAU,MAAM,KAAK,IAAI,IAAI,OAAO,YAAY,CAAC,CAAC,CAAC;AAAA,IACnD,OAAO,OAAO,SAAS;AAAA,IACvB,MAAM,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,IAC/E,UAAU;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,IACA,SAAS;AAAA,MACP,aAAa;AAAA,MACb,eAAe;AAAA,MACf,qBAAqB;AAAA,MACrB,qBAAqB;AAAA,MACrB,iBAAiB;AAAA,IACnB;AAAA,IACA,iBAAiB,OAAO,mBAAmB;AAAA,MACzC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAEA,gBAAc,QAAQ,wBAAwB,aAAa;AAC3D,SAAO;AACT;AAKO,SAAS,6BAA6B,WAA8B;AACzE,QAAM,IAAI,UAAU;AACpB,QAAM,OAAO,UAAU;AAGvB,QAAM,WAAW,EAAE,gBAAgB,MAAM,EAAE,gBAAgB,IAAI,EAAE,sBAAsB;AAEvF,QAAM,gBAAgB,EAAE,sBAAsB,EAAE;AAChD,MAAI,WAAW;AACf,MAAI,WAAW;AACf,MAAI,YAAY;AAEhB,MAAI,kBAAkB,GAAG;AACvB,eAAW;AACX,gBAAY;AAAA,EACd,OAAO;AACL,gBAAY,EAAE,sBAAsB,MAAM,gBAAgB;AAAA,EAC5D;AAEA,QAAM,YAAY,QAAQ,WAAW,UAAU,YAAY;AAC3D,SAAO,KAAK,MAAM,KAAK,IAAI,GAAK,KAAK,IAAI,MAAM,SAAS,CAAC,IAAI,GAAG,IAAI;AACtE;AAEA,IAAM,sBAAsB,oBAAI,QAAgC;AAKhE,SAAS,SAAS,MAA2B;AAC3C,SAAO,IAAI;AAAA,IACT,KACG,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC/B;AACF;AAEA,SAAS,gBAAgB,GAA2B;AAClD,MAAI,SAAS,oBAAoB,IAAI,CAAC;AACtC,MAAI,CAAC,QAAQ;AACX,aAAS,SAAS,EAAE,SAAS;AAC7B,wBAAoB,IAAI,GAAG,MAAM;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAmB,MAA2B;AACvE,MAAI,KAAK,SAAS,KAAK,KAAK,SAAS,EAAG,QAAO;AAC/C,MAAI,eAAe;AACnB,aAAW,QAAQ,MAAM;AACvB,QAAI,KAAK,IAAI,IAAI,EAAG;AAAA,EACtB;AACA,QAAM,QAAQ,KAAK,OAAO,KAAK,OAAO;AACtC,SAAO,UAAU,IAAI,IAAI,eAAe;AAC1C;AAKA,IAAM,iBAA0C;AAAA,EAC9C,CAAC,WAAW,UAAU;AAAA,EACtB,CAAC,UAAU,SAAS;AAAA,EACpB,CAAC,UAAU,UAAU;AAAA,EACrB,CAAC,QAAQ,OAAO;AAAA,EAChB,CAAC,MAAM,KAAK;AAAA,EACZ,CAAC,OAAO,IAAI;AAAA,EACZ,CAAC,WAAW,YAAY;AAAA,EACxB,CAAC,WAAW,YAAY;AAAA,EACxB,CAAC,WAAW,WAAW;AAAA,EACvB,CAAC,UAAU,MAAM;AAAA,EACjB,CAAC,SAAS,QAAQ;AAAA,EAClB,CAAC,SAAS,UAAU;AAAA,EACpB,CAAC,UAAU,OAAO;AAAA,EAClB,CAAC,UAAU,YAAY;AAAA,EACvB,CAAC,QAAQ,UAAU;AAAA,EACnB,CAAC,YAAY,UAAU;AAAA,EACvB,CAAC,YAAY,WAAW;AAAA,EACxB,CAAC,SAAS,SAAS;AAAA,EACnB,CAAC,QAAQ,QAAQ;AAAA,EACjB,CAAC,QAAQ,OAAO;AAAA,EAChB,CAAC,eAAe,cAAc;AAAA,EAC9B,CAAC,UAAU,SAAS;AACtB;AAEA,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAOO,SAAS,yBACd,OACA,OAC4C;AAC5C,QAAM,SAAS,MAAM,YAAY;AACjC,QAAM,SAAS,MAAM,YAAY;AAGjC,aAAW,CAAC,KAAK,GAAG,KAAK,gBAAgB;AACvC,UAAM,UAAU,IAAI,OAAO,MAAM,GAAG,OAAO,GAAG,EAAE,KAAK,MAAM;AAC3D,UAAM,UAAU,IAAI,OAAO,MAAM,GAAG,OAAO,GAAG,EAAE,KAAK,MAAM;AAC3D,UAAM,UAAU,IAAI,OAAO,MAAM,GAAG,OAAO,GAAG,EAAE,KAAK,MAAM;AAC3D,UAAM,UAAU,IAAI,OAAO,MAAM,GAAG,OAAO,GAAG,EAAE,KAAK,MAAM;AAE3D,QAAK,WAAW,WAAa,WAAW,SAAU;AAChD,aAAO;AAAA,QACL,cAAc;AAAA,QACd,QAAQ,mCAAmC,GAAG,SAAS,GAAG;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe,kBAAkB,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AACjE,QAAM,eAAe,kBAAkB,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AAEjE,MAAI,iBAAiB,cAAc;AACjC,WAAO;AAAA,MACL,cAAc;AAAA,MACd,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO,EAAE,cAAc,MAAM;AAC/B;AAMO,SAAS,mBACd,WACA,cACsB;AACtB,QAAM,cAAc,UAAU,IAAI,KAAK;AACvC,QAAM,gBAAgB,UAAU,UAAU,KAAK;AAC/C,QAAM,kBAAkB,SAAS,aAAa;AAC9C,QAAM,eAAe,IAAI,KAAK,UAAU,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAG1F,MAAI,aAAa;AACf,UAAM,cAAc,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW;AACjE,QAAI,aAAa;AAEf,UAAI,YAAY,UAAU,KAAK,EAAE,YAAY,MAAM,cAAc,YAAY,GAAG;AAE9E,cAAM,kBAAkB,UAAU,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,SAAS,SAAS,CAAC,CAAC;AAC/F,YAAI,CAAC,gBAAgB;AACnB,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,UAAU,YAAY;AAAA,YACtB,WAAW;AAAA,YACX,QAAQ;AAAA,UACV;AAAA,QACF;AAEA,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU,YAAY;AAAA,UACtB,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,MACF;AAGA,YAAM,oBAAoB,UAAU,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,YAAY,SAAS,SAAS,CAAC,CAAC;AAChG,YAAM,oBAAoB,UAAU,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,YAAY,SAAS,SAAS,CAAC,CAAC;AAChG,YAAM,aAAa,yBAAyB,eAAe,YAAY,SAAS;AAEhF,UAAI,oBAAoB,oBAAoB,WAAW,cAAc;AAEnE,cAAM,eAAe,MAAM,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,SAAS,SAAS,CAAC,CAAC;AAC7F,cAAM,eAAe,wCAAwC,KAAK,aAAa;AAC/E,cAAM,eAAe,qBAAqB,KAAK,YAAY,SAAS;AACpE,cAAM,kBAAkB,wCAAwC,KAAK,YAAY,SAAS;AAC1F,cAAM,mBAAmB,qBAAqB,KAAK,aAAa;AAEhE,YAAI,aAAa,SAAS,KAAM,gBAAgB,gBAAkB,mBAAmB,kBAAmB;AACtG,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,UAAU,YAAY;AAAA,YACtB,WAAW;AAAA,YACX,QAAQ,8DAA8D,aAAa,KAAK,IAAI,CAAC,MAAM,WAAW,UAAU,mBAAmB;AAAA,UAC7I;AAAA,QACF;AAEA,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU,YAAY;AAAA,UACtB,WAAW;AAAA,UACX,QAAQ,mCAAmC,WAAW,UAAU,mBAAmB,aAAa,YAAY,EAAE;AAAA,QAChH;AAAA,MACF;AAEA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,UAAU,YAAY;AAAA,QACtB,WAAW;AAAA,QACX,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAA8B;AAClC,MAAI,UAAU;AACd,MAAI,iBAA6D,EAAE,cAAc,MAAM;AAEvF,aAAW,YAAY,cAAc;AACnC,UAAM,iBAAiB,gBAAgB,QAAQ;AAC/C,UAAM,MAAM,kBAAkB,iBAAiB,cAAc;AAG7D,UAAM,aAAa,yBAAyB,eAAe,SAAS,SAAS;AAC7E,QAAI,WAAW,cAAc;AAC3B,UAAI,cAAc;AAClB,iBAAW,KAAK,iBAAiB;AAC/B,YAAI,eAAe,IAAI,CAAC,EAAG;AAAA,MAC7B;AACA,YAAM,cAAc,UAAU,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,SAAS,SAAS,SAAS,CAAC,CAAC;AACzF,UAAI,eAAe,KAAM,WAAW,UAAU,KAAK,OAAO,QAAS,OAAO,KAAM;AAC9E,oBAAY;AACZ,kBAAU,KAAK,IAAI,KAAK,IAAI;AAC5B,yBAAiB;AACjB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,MAAM,SAAS;AACjB,gBAAU;AACV,kBAAY;AACZ,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,aAAa,WAAW,KAAM;AAEhC,UAAM,aAAa,eAAe,eAC9B,iBACA,yBAAyB,eAAe,UAAU,SAAS;AAC/D,UAAM,mBACH,UAAU,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,UAAW,SAAS,SAAS,CAAC,CAAC,MACrE,UAAU,YAAY,CAAC,GAAG,KAAK,CAAC,MAAM,UAAW,SAAS,SAAS,CAAC,CAAC;AAExE,QAAI,WAAW,gBAAgB,iBAAiB;AAE9C,YAAM,eAAe,MAAM,KAAK,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,UAAW,SAAS,SAAS,CAAC,CAAC;AAC5F,YAAM,eAAe,wCAAwC,KAAK,aAAa;AAC/E,YAAM,eAAe,qBAAqB,KAAK,UAAU,SAAS;AAClE,YAAM,kBAAkB,wCAAwC,KAAK,UAAU,SAAS;AACxF,YAAM,mBAAmB,qBAAqB,KAAK,aAAa;AAEhE,UAAI,aAAa,SAAS,KAAM,gBAAgB,gBAAkB,mBAAmB,kBAAmB;AACtG,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,UAAU,UAAU;AAAA,UACpB,WAAW;AAAA,UACX,QAAQ,4BAA4B,KAAK,MAAM,UAAU,GAAG,CAAC,8CAA8C,WAAW,UAAU,eAAe;AAAA,UAC/I,OAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,UAAU,UAAU;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ,4BAA4B,WAAW,UAAU,eAAe,sCAAsC,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,QACvI,OAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,WAAW,KAAM;AACnB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,UAAU,UAAU;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ,+BAA+B,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,QAChE,OAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU,UAAU;AAAA,MACpB,WAAW;AAAA,MACX,QAAQ,gCAAgC,KAAK,MAAM,UAAU,GAAG,CAAC;AAAA,MACjE,OAAO;AAAA,IACT;AAAA,EACF;AAGA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAKO,SAAS,oBACd,gBACA,WACA,cACA,SACkF;AAClF,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,UAAQ,eAAe,QAAQ;AAAA,IAC7B,KAAK,WAAW;AACd,YAAM,SAAS,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe,QAAQ;AACxE,aAAO,QAAQ;AACf,aAAO,QAAQ,YAAY;AAC3B,eAAS,kBAAkB;AAAA,QACzB,MAAM;AAAA,QACN,aAAa,OAAO;AAAA,QACpB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAGD,UAAI,UAAU,UAAU;AACtB,mBAAW,KAAK,UAAU,UAAU;AAClC,cAAI,CAAC,OAAO,SAAS,SAAS,CAAC,GAAG;AAChC,mBAAO,SAAS,KAAK,CAAC;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAGA,UAAI,UAAU,UAAU;AACtB,mBAAW,KAAK,UAAU,UAAU;AAClC,gBAAM,KAAK,EAAE,KAAK,EAAE,YAAY;AAChC,cAAI,CAAC,OAAO,SAAS,SAAS,EAAE,EAAG,QAAO,SAAS,KAAK,EAAE;AAAA,QAC5D;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,UAAU;AAAA,UACf;AAAA,YACE,WAAW,OAAO,aAAa;AAAA,YAC/B,OAAO,OAAO;AAAA,YACd,QAAQ,OAAO;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,OAAO,WAAW,CAAC;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAI,UAAU,YAAY,UAAU,UAAU;AAC5C,eAAO,QAAQ,UAAU;AACzB,YAAI,OAAO,UAAU,YAAY,OAAO,WAAW,aAAa;AAC9D,iBAAO,SAAS;AAAA,QAClB;AACA,eAAO,QAAQ,KAAK;AAAA,UAClB,WAAW;AAAA,UACX,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,QAAQ,UAAU,UAAU,eAAe,OAAO,KAAK;AAAA,UACvD,QAAQ,UAAU,WAAW,CAAC;AAAA,QAChC,CAAC;AAAA,MACH,OAAO;AACL,eAAO,QAAQ,KAAK;AAAA,UAClB,WAAW;AAAA,UACX,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,QAAQ,eAAe,UAAU;AAAA,UACjC,QAAQ,UAAU,WAAW,CAAC;AAAA,QAChC,CAAC;AAAA,MACH;AAEA,aAAO,aAAa,6BAA6B,MAAM;AACvD,aAAO,QAAQ,wBAAwB,MAAM;AAC7C,aAAO,YAAY;AACnB,aAAO,EAAE,kBAAkB,QAAQ,QAAQ,WAAW,WAAW,OAAO,GAAG;AAAA,IAC7E;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,SAAS,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe,QAAQ;AACxE,aAAO,QAAQ;AACf,aAAO,QAAQ,YAAY;AAC3B,eAAS,kBAAkB;AAAA,QACzB,MAAM;AAAA,QACN,aAAa,OAAO;AAAA,QACpB,UAAU,eAAe;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAED,UAAI,UAAU,UAAU;AACtB,mBAAW,KAAK,UAAU,UAAU;AAClC,cAAI,CAAC,OAAO,SAAS,SAAS,CAAC,EAAG,QAAO,SAAS,KAAK,CAAC;AAAA,QAC1D;AAAA,MACF;AAEA,UAAI,UAAU,UAAU;AACtB,mBAAW,KAAK,UAAU,UAAU;AAClC,gBAAM,KAAK,EAAE,KAAK,EAAE,YAAY;AAChC,cAAI,CAAC,OAAO,SAAS,SAAS,EAAE,EAAG,QAAO,SAAS,KAAK,EAAE;AAAA,QAC5D;AAAA,MACF;AAEA,UAAI,UAAU,UAAU;AACtB,mBAAW,KAAK,UAAU,UAAU;AAClC,gBAAM,KAAK,EAAE,KAAK,EAAE,YAAY;AAChC,cAAI,CAAC,OAAO,SAAS,SAAS,EAAE,EAAG,QAAO,SAAS,KAAK,EAAE;AAAA,QAC5D;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,UAAU;AAAA,UACf;AAAA,YACE,WAAW,OAAO,aAAa;AAAA,YAC/B,OAAO,OAAO;AAAA,YACd,QAAQ,OAAO;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,OAAO,WAAW,CAAC;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,kBAAkB,MAAM;AAC1C,UAAI,UAAU,YAAY,UAAU,UAAU;AAC5C,eAAO,QAAQ,UAAU;AACzB,YAAI,OAAO,UAAU,YAAY,OAAO,WAAW,aAAa;AAC9D,iBAAO,SAAS;AAAA,QAClB;AACA,eAAO,QAAQ,KAAK;AAAA,UAClB,WAAW;AAAA,UACX,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,QAAQ,UAAU,UAAU,eAAe,OAAO,KAAK;AAAA,UACvD,QAAQ,UAAU,WAAW,CAAC;AAAA,QAChC,CAAC;AAAA,MACH,OAAO;AACL,eAAO,QAAQ,KAAK;AAAA,UAClB,WAAW;AAAA,UACX,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,QAAQ,eAAe,UAAU;AAAA,UACjC,QAAQ,UAAU,WAAW,CAAC;AAAA,QAChC,CAAC;AAAA,MACH;AAEA,aAAO,aAAa,6BAA6B,MAAM;AACvD,aAAO,QAAQ,wBAAwB,MAAM;AAC7C,aAAO,YAAY;AACnB,aAAO,EAAE,kBAAkB,QAAQ,QAAQ,SAAS,WAAW,OAAO,GAAG;AAAA,IAC3E;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,SAAS,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe,QAAQ;AACxE,aAAO,YAAY,UAAU;AAC7B,UAAI,UAAU,KAAM,QAAO,OAAO,UAAU;AAC5C,UAAI,UAAU,UAAU;AACtB,eAAO,WAAW,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,OAAO,UAAU,GAAG,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAAA,MAC/G;AACA,UAAI,UAAU,UAAU;AACtB,eAAO,WAAW,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,OAAO,UAAU,GAAG,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAAA,MAC/G;AACA,UAAI,UAAU,UAAU;AACtB,eAAO,WAAW,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,OAAO,UAAU,GAAG,UAAU,QAAQ,CAAC,CAAC;AAAA,MACnF;AAEA,aAAO,WAAW;AAAA,QAChB,WAAW,OAAO,UAAU,YAAY,KAAK;AAAA,QAC7C,YAAY,EAAE,WAAW,IAAI;AAAA,MAC/B;AAEA,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,UAAU;AAAA,UACf;AAAA,YACE,WAAW,OAAO,aAAa;AAAA,YAC/B,OAAO,OAAO;AAAA,YACd,QAAQ,OAAO;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,OAAO,WAAW,CAAC;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,aAAO,QAAQ,KAAK;AAAA,QAClB,WAAW;AAAA,QACX,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,QAAQ,eAAe,UAAU;AAAA,QACjC,QAAQ,UAAU,WAAW,CAAC;AAAA,MAChC,CAAC;AAED,aAAO,YAAY;AACnB,aAAO,aAAa,6BAA6B,MAAM;AACvD,aAAO,QAAQ,wBAAwB,MAAM;AAC7C,eAAS,kBAAkB;AAAA,QACzB,MAAM;AAAA,QACN,aAAa,OAAO;AAAA,QACpB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AACD,aAAO,EAAE,kBAAkB,QAAQ,QAAQ,UAAU,WAAW,OAAO,GAAG;AAAA,IAC5E;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,SAAS,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe,QAAQ;AACxE,aAAO,QAAQ;AACf,UAAI,UAAU,UAAU;AACtB,mBAAW,KAAK,UAAU,UAAU;AAClC,cAAI,CAAC,OAAO,SAAS,SAAS,CAAC,EAAG,QAAO,SAAS,KAAK,CAAC;AAAA,QAC1D;AAAA,MACF;AAEA,UAAI,OAAO,QAAQ,sBAAsB,OAAO,QAAQ,eAAe;AACrE,eAAO,SAAS;AAAA,MAClB;AAEA,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO,UAAU;AAAA,UACf;AAAA,YACE,WAAW,OAAO,aAAa;AAAA,YAC/B,OAAO,OAAO;AAAA,YACd,QAAQ,OAAO;AAAA,YACf,QAAQ;AAAA,YACR,QAAQ,OAAO,WAAW,CAAC;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AACA,aAAO,QAAQ,KAAK;AAAA,QAClB,WAAW;AAAA,QACX,OAAO,OAAO;AAAA,QACd,QAAQ,OAAO;AAAA,QACf,QAAQ,eAAe,UAAU;AAAA,QACjC,QAAQ,UAAU,WAAW,CAAC;AAAA,MAChC,CAAC;AAED,aAAO,aAAa,6BAA6B,MAAM;AACvD,aAAO,QAAQ,wBAAwB,MAAM;AAC7C,aAAO,YAAY;AACnB,eAAS,kBAAkB;AAAA,QACzB,MAAM;AAAA,QACN,aAAa,OAAO;AAAA,QACpB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AACD,aAAO,EAAE,kBAAkB,QAAQ,QAAQ,cAAc,WAAW,OAAO,GAAG;AAAA,IAChF;AAAA,IAEA,KAAK,cAAc;AAEjB,YAAM,SAAS,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe,QAAQ;AACxE,YAAM,aAAa,UAAU,WAAW,CAAC,KAAK;AAC9C,YAAM,QACJ,UAAU,MAAM,UAAU,OAAO,QAAQ,KACrC,UAAU,KACV,GAAG,SAAS,OAAO,KAAK,WAAW,IAAI,UAAU;AAEvD,YAAM,UAAU,gBAAgB;AAAA,QAC9B,IAAI;AAAA,QACJ,MAAM,UAAU,QAAQ,QAAQ,QAAQ;AAAA,QACxC,WAAW,UAAU;AAAA,QACrB,UAAU,UAAU,YAAY,CAAC;AAAA,QACjC,UAAU,UAAU,YAAY,CAAC;AAAA,QACjC,WAAW,SAAS,CAAC,OAAO,IAAI,GAAI,UAAU,aAAa,CAAC,CAAE,IAAK,UAAU,aAAa,CAAC;AAAA,QAC3F,YAAY,UAAU,cAAc;AAAA,QACpC,UAAU,UAAU,YAAY,CAAC;AAAA,QACjC,OAAO,UAAU,SAAS,QAAQ,SAAS;AAAA,QAC3C,MAAM,UAAU,QAAQ,QAAQ,QAAQ,CAAC;AAAA,MAC3C,CAAC;AAED,UAAI,QAAQ;AACV,YAAI,CAAC,OAAO,UAAU,SAAS,KAAK,GAAG;AACrC,iBAAO,UAAU,KAAK,KAAK;AAAA,QAC7B;AACA,YAAI,CAAC,OAAO,SAAS;AACnB,iBAAO,UAAU;AAAA,YACf;AAAA,cACE,WAAW,OAAO,aAAa;AAAA,cAC/B,OAAO,OAAO;AAAA,cACd,QAAQ,OAAO;AAAA,cACf,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AACA,eAAO,QAAQ,KAAK;AAAA,UAClB,WAAW;AAAA,UACX,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,QAAQ,sCAAsC,KAAK;AAAA,QACrD,CAAC;AAAA,MACH;AAEA,eAAS,kBAAkB;AAAA,QACzB,MAAM;AAAA,QACN,aAAa,QAAQ;AAAA,QACrB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,EAAE,kBAAkB,SAAS,QAAQ,cAAc,WAAW,QAAQ,GAAG;AAAA,IAClF;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,SAAS,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe,QAAQ;AACxE,eAAS,kBAAkB;AAAA,QACzB,MAAM;AAAA,QACN,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AACD,aAAO,EAAE,kBAAkB,QAAQ,QAAQ,UAAU,WAAW,OAAO,GAAG;AAAA,IAC5E;AAAA,IAEA,KAAK;AAAA,IACL,SAAS;AACP,YAAM,QAAQ,UAAU,MAAM,MAAM,WAAW,UAAU,SAAS,CAAC;AACnE,YAAM,UAAU,gBAAgB;AAAA,QAC9B,IAAI;AAAA,QACJ,MAAM,UAAU;AAAA,QAChB,WAAW,UAAU;AAAA,QACrB,UAAU,UAAU;AAAA,QACpB,UAAU,UAAU;AAAA,QACpB,WAAW,UAAU;AAAA,QACrB,YAAY,UAAU;AAAA,QACtB,UAAU,UAAU;AAAA,QACpB,OAAO,UAAU;AAAA,QACjB,MAAM,UAAU;AAAA,MAClB,CAAC;AACD,eAAS,kBAAkB;AAAA,QACzB,MAAM;AAAA,QACN,aAAa,QAAQ;AAAA,QACrB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AACD,aAAO,EAAE,kBAAkB,SAAS,QAAQ,OAAO,WAAW,QAAQ,GAAG;AAAA,IAC3E;AAAA,EACF;AACF;;;AEl0BO,SAAS,cAAc,QAQZ;AAChB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,IAAI,OAAO,GAAG,KAAK;AAAA,IACnB,OAAO,OAAO,SAAS;AAAA,IACvB,QAAQ,OAAO,UAAU;AAAA,IACzB,WAAW,OAAO,WAAW,KAAK;AAAA,IAClC,SAAS,MAAM,KAAK,IAAI,IAAI,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,IACvE,MAAM,OAAO;AAAA,IACb,OAAO,OAAO,SAAS;AAAA,IACvB,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;AAMO,SAAS,oBACd,UACA,QACoE;AACpE,QAAM,mBAAmB,OAAO,KAAK,EAAE,YAAY;AAEnD,aAAW,UAAU,UAAU;AAC7B,QAAI,OAAO,GAAG,YAAY,MAAM,kBAAkB;AAChD,aAAO,EAAE,cAAc,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,IAC7D;AAEA,UAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,MAAM;AAC9C,YAAM,KAAK,EAAE,YAAY;AACzB,aAAO,OAAO,oBAAoB,iBAAiB,WAAW,GAAG,QAAQ,OAAO,EAAE,CAAC;AAAA,IACrF,CAAC;AAED,QAAI,cAAc;AAChB,aAAO,EAAE,cAAc,MAAM,QAAQ,QAAQ,OAAO,OAAO;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO,EAAE,cAAc,MAAM;AAC/B;AAKO,SAAS,cACd,QACA,SAOe;AACf,QAAM,UAAU,IAAI,IAAI,OAAO,OAAO;AACtC,MAAI,QAAQ,YAAY;AACtB,eAAW,KAAK,QAAQ,YAAY;AAClC,cAAQ,IAAI,EAAE,KAAK,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,QAAQ,SAAS,OAAO;AAAA,IAC/B,QAAQ,QAAQ,UAAU,OAAO;AAAA,IACjC,WAAW,QAAQ,cAAc,SAAY,QAAQ,YAAY,OAAO;AAAA,IACxE,SAAS,MAAM,KAAK,OAAO;AAAA,IAC3B,MAAM,QAAQ,SAAS,SAAY,QAAQ,OAAO,OAAO;AAAA,IACzD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;;;AChFO,SAAS,cAAc,QASZ;AAChB,QAAM,UAAU,GAAG,OAAO,eAAe,MAAM,IAAI,OAAO,MAAM,IAAI,KAAK,IAAI,CAAC;AAC9E,SAAO;AAAA,IACL,IAAI,OAAO,WAAW,OAAO,CAAC;AAAA,IAC9B,aAAa,OAAO;AAAA,IACpB,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;AAKO,SAAS,wBACd,WACA,SACW;AACX,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,YAAU,QAAQ;AAClB,YAAU,QAAQ,YAAY;AAE9B,MAAI,QAAQ,WAAW,WAAW;AAChC,cAAU,QAAQ;AAAA,EACpB,WAAW,QAAQ,WAAW,aAAa,QAAQ,WAAW,YAAY;AACxE,cAAU,QAAQ;AAAA,EACpB;AAGA,YAAU,aAAa,6BAA6B,SAAS;AAC7D,YAAU,YAAY;AACtB,SAAO;AACT;AAEO,IAAM,iBAAN,MAAqB;AAAA,EAClB,UAAyB;AAAA,IAC/B,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,iCAAiC;AAAA,IACjC,0BAA0B;AAAA,IAC1B,wBAAwB;AAAA,IACxB,wBAAwB;AAAA,IACxB,mBAAmB;AAAA,IACnB,qBAAqB;AAAA,EACvB;AAAA,EAEA,YAAY,SAAkC;AAC5C,QAAI,SAAS;AACX,WAAK,UAAU,EAAE,GAAG,KAAK,SAAS,GAAG,QAAQ;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,YAAkB;AAChB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,aAAmB;AACjB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,eAAqB;AACnB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,wBAA8B;AAC5B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,+BAAqC;AACnC,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,wBAA8B;AAC5B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,sBAA4B;AAC1B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,sBAA4B;AAC1B,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,iBAAuB;AACrB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,mBAAyB;AACvB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,aAA4B;AAC1B,WAAO,EAAE,GAAG,KAAK,QAAQ;AAAA,EAC3B;AAAA,EAEA,SAAwB;AACtB,WAAO,KAAK;AAAA,EACd;AACF;;;ACxHA,SAAS,cAAAA,mBAAkB;AAgDpB,SAAS,kBAAkB,YAAoD;AACpF,QAAM,SAAS,WAAW,UAAU,CAAC;AACrC,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,QAAM,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,SAAS,QAAQ;AACjF,QAAM,YAAY,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS;AAC3D,QAAM,cAAc,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,iBAAiB;AAGrE,MAAI,UAAU,WAAW,KAAK,YAAY,WAAW,KAAK,SAAS,WAAW,GAAG;AAC/E,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,OAAO,oBAAI,IAAY,CAAC,UAAU,YAAY,CAAC;AAGrD,aAAW,KAAK,UAAU;AACxB,oBAAgB,IAAI,EAAE,YAAY,YAAY,EAAE,QAAQ,gBAAgB,GAAG,CAAC;AAC5E,QAAI,EAAE,KAAM,iBAAgB,IAAI,EAAE,KAAK,YAAY,CAAC;AAAA,EACtD;AAGA,aAAW,KAAK,WAAW;AACzB,oBAAgB,IAAI,EAAE,YAAY,YAAY,EAAE,QAAQ,gBAAgB,GAAG,CAAC;AAC5E,QAAI,EAAE,KAAM,iBAAgB,IAAI,EAAE,KAAK,YAAY,CAAC;AAAA,EACtD;AAGA,aAAW,KAAK,aAAa;AAC3B,oBAAgB,IAAI,EAAE,YAAY,YAAY,EAAE,QAAQ,gBAAgB,GAAG,CAAC;AAC5E,SAAK,IAAI,iBAAiB;AAAA,EAC5B;AAGA,QAAM,aAAa,WAAW,KAC3B,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC7B,aAAW,KAAK,YAAY;AAC1B,oBAAgB,IAAI,CAAC;AAAA,EACvB;AAGA,MAAI,YAAY;AAChB,MAAI,YAAY;AAEhB,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,WAAW,YAAY,YAAY,SAAS,CAAC;AACnD,gBAAY,2BAA2B,WAAW,IAAI,MAAM,SAAS,WAAW;AAChF,gBAAY,wCAAwC,WAAW,MAAM;AAAA,EACvE,WAAW,UAAU,SAAS,GAAG;AAC/B,UAAM,cAAc,UAAU,UAAU,SAAS,CAAC;AAClD,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,eAAe,SAAS,CAAC;AAC/B,kBAAY,oBAAoB,WAAW,IAAI,aAAa,YAAY,WAAW,SAAS,aAAa,WAAW;AACpH,kBAAY,oBAAoB,aAAa,WAAW,kCAAkC,YAAY,WAAW;AAAA,IACnH,OAAO;AACL,kBAAY,0BAA0B,WAAW,IAAI,MAAM,YAAY,WAAW;AAClF,kBAAY,8BAA8B,WAAW,MAAM;AAAA,IAC7D;AAAA,EACF,WAAW,SAAS,SAAS,GAAG;AAC9B,UAAM,cAAc,SAAS,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI;AAChE,gBAAY,cAAc,WAAW,IAAI,kBAAkB,WAAW;AACtE,gBAAY,YAAY,SAAS,MAAM,4BAA4B,WAAW,MAAM;AAAA,EACtF;AAEA,QAAM,OAAOC,YAAW,QAAQ,EAC7B,OAAO,GAAG,WAAW,IAAI,IAAI,SAAS,EAAE,EACxC,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AACd,QAAM,KAAK,UAAU,WAAW,UAAU,IAAI;AAE9C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,MAAM,KAAK,eAAe,EAAE,MAAM,GAAG,CAAC;AAAA,IAChD,UAAU,MAAM,KAAK,eAAe,EAAE,MAAM,GAAG,CAAC;AAAA,IAChD,YAAY,YAAY,SAAS,IAAI,OAAO,UAAU,SAAS,IAAI,OAAO;AAAA,IAC1E,UAAU,CAAC,cAAc,WAAW,MAAM,EAAE;AAAA,IAC5C,MAAM,MAAM,KAAK,IAAI;AAAA,IACrB;AAAA,EACF;AACF;AASO,SAAS,oBACd,YACA,oBAAiC,CAAC,GAClC,UAA4F,CAAC,GACnE;AAC1B,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,UAAU,QAAQ;AACxB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,SAAS,WAAW,UAAU,QAAQ,KAAK,IAAI,CAAC;AACtD,QAAM,SAAS,WAAW,UAAU,CAAC;AAGrC,QAAM,eAA8B,CAAC;AACrC,SAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7B,QAAI,UAA8B;AAClC,QAAI,aAAa;AACjB,UAAM,WAAqB,CAAC,QAAQ,MAAM,IAAI;AAC9C,UAAM,WAAqB,CAAC;AAE5B,QAAI,MAAM,SAAS,mBAAmB;AACpC,gBAAU;AACV,mBAAa;AAAA,IACf,WAAW,MAAM,SAAS,aAAa,MAAM,SAAS,UAAU;AAC9D,gBAAU;AACV,mBAAa;AACb,eAAS,KAAK,MAAM,YAAY,YAAY,EAAE,QAAQ,gBAAgB,GAAG,CAAC;AAAA,IAC5E,WAAW,MAAM,SAAS,WAAW;AACnC,gBAAU;AACV,mBAAa;AACb,eAAS,KAAK,MAAM,YAAY,YAAY,EAAE,QAAQ,gBAAgB,GAAG,CAAC;AAAA,IAC5E,WAAW,MAAM,SAAS,cAAc;AACtC,mBAAa;AAAA,IACf;AAEA,QAAI,MAAM,KAAM,UAAS,KAAK,MAAM,KAAK,YAAY,CAAC;AAEtD,iBAAa;AAAA,MACX,kBAAkB;AAAA,QAChB,QAAQ,cAAc,MAAM,IAAI,MAAM,IAAI,IAAI,GAAG;AAAA,QACjD,OAAO,IAAI,MAAM,KAAK,YAAY,CAAC,KAAK,MAAM,WAAW;AAAA,QACzD,YAAY;AAAA,UACV,MAAM;AAAA,UACN,MAAM,MAAM;AAAA,UACZ,WAAW,MAAM,aAAa;AAAA,QAChC;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU,SAAS,SAAS,IAAI,WAAW;AAAA,QAC3C,SAAS,EAAE,QAAQ,YAAY,KAAK,WAAW,MAAM,MAAM,GAAI,MAAM,QAAQ,CAAC,EAAG;AAAA,MACnF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,QAAM,WAAuB,aAAa,IAAI,CAAC,QAAQ;AACrD,UAAM,YAAY,IAAI,MAAM,WAAW,WAAW,KAAK,IAAI,MAAM,WAAW,UAAU;AACtF,WAAO,eAAe,KAAK,YAAY,gBAAgB,UAAU;AAAA,EACnE,CAAC;AAGD,QAAM,YAAY,kBAAkB,UAAU;AAC9C,QAAM,mBAAsE,CAAC;AAE7E,MAAI,WAAW;AAEb,qBAAiB,KAAK;AAAA,MACpB,IAAI,UAAU;AAAA,MACd,MAAM;AAAA,MACN,WAAW,UAAU;AAAA,MACrB,UAAU,UAAU;AAAA,MACpB,UAAU,UAAU;AAAA,MACpB,YAAY,UAAU;AAAA,MACtB,UAAU,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM;AAAA,MACtC,MAAM,UAAU;AAAA,MAChB,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,kBAA+D,CAAC;AACtE,QAAM,uBAAuB,CAAC,GAAG,iBAAiB;AAElD,aAAW,aAAa,kBAAkB;AACxC,UAAM,YAAY,mBAAmB,WAAW,oBAAoB;AAEpE,QAAI,QAAQ;AACV,sBAAgB,KAAK;AAAA,QACnB;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ,UAAU;AAAA,MACpB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,EAAE,kBAAkB,OAAO,IAAI;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,sBAAgB,KAAK;AAAA,QACnB;AAAA,QACA,QAAQ;AAAA,QACR,kBAAkB;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,sBAAsB,QASpC;AACA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,OAAmB;AAAA,IACvB,MAAM;AAAA,IACN,WAAW;AAAA,IACX,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,EACnD;AAEA,QAAM,QAAQ,sBAAsB,OAAO,KAAK,KAAK,OAAO,WAAW,4BAA4B,OAAO,mBAAmB;AAE7H,QAAM,cAAc,kBAAkB;AAAA,IACpC,QAAQ,mBAAmB,OAAO,MAAM,YAAY,CAAC;AAAA,IACrD;AAAA,IACA,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,UAAU,CAAC,OAAO,MAAM,YAAY,GAAG,GAAI,OAAO,WAAW,CAAC,CAAE;AAAA,IAChE,UAAU,CAAC,OAAO,oBAAoB,YAAY,CAAC;AAAA,EACrD,CAAC;AAED,QAAM,WAAW,eAAe,aAAa,UAAU;AAEvD,QAAM,YAAY,gBAAgB;AAAA,IAChC,IAAI,cAAc,OAAO,MAAM,YAAY,EAAE,QAAQ,gBAAgB,GAAG,CAAC;AAAA,IACzE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,WAAW,OAAO;AAAA,IAClB,UAAU,CAAC,OAAO,MAAM,YAAY,GAAG,GAAI,OAAO,WAAW,CAAC,CAAE;AAAA,IAChE,UAAU,CAAC,OAAO,oBAAoB,YAAY,CAAC;AAAA,IACnD,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,UAAU,CAAC,SAAS,IAAI,YAAY,MAAM;AAAA,IAC1C,MAAM,CAAC,mBAAmB,OAAO,MAAM,YAAY,CAAC;AAAA,EACtD,CAAC;AAED,SAAO,EAAE,aAAa,UAAU;AAClC;;;AC5SO,SAAS,mBAAmB,QAAwB;AACzD,SAAO,OAAO,QAAQ,0BAA0B,EAAE,EAAE,KAAK,EAAE,YAAY;AACzE;AAKO,SAAS,qBAAqB,eAAmD;AACtF,QAAM,oBAAoB,oBAAI,IAAyB;AAEvD,aAAW,KAAK,eAAe;AAC7B,UAAM,kBAAkB,oBAAI,IAAY;AAGxC,QAAI,EAAE,YAAY;AAChB,iBAAW,KAAK,EAAE,YAAY;AAC5B,wBAAgB,IAAI,mBAAmB,CAAC,CAAC;AAAA,MAC3C;AAAA,IACF;AAGA,QAAI,EAAE,UAAU;AACd,iBAAW,MAAM,EAAE,UAAU;AAC3B,wBAAgB,IAAI,mBAAmB,EAAE,CAAC;AAAA,MAC5C;AAAA,IACF;AAEA,eAAW,OAAO,iBAAiB;AACjC,UAAI,CAAC,IAAK;AACV,UAAI,MAAM,kBAAkB,IAAI,GAAG;AACnC,UAAI,CAAC,KAAK;AACR,cAAM,oBAAI,IAAY;AACtB,0BAAkB,IAAI,KAAK,GAAG;AAAA,MAChC;AACA,UAAI,IAAI,EAAE,EAAE;AAAA,IACd;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB;AAC7B;AAeO,SAAS,wBACd,WACA,gBACsB;AACtB,QAAM,cAAc,IAAI,IAAI,eAAe,IAAI,kBAAkB,CAAC;AAClE,QAAM,UAAU;AAAA,IACd,IAAI,UAAU,cAAc,CAAC,GAAG,IAAI,kBAAkB;AAAA,IACtD,GAAG,UAAU,SAAS,IAAI,kBAAkB;AAAA,EAC9C;AAEA,QAAM,UAAoB,CAAC;AAC3B,QAAM,YAAsB,CAAC;AAE7B,aAAW,OAAO,SAAS;AACzB,QAAI,CAAC,IAAK;AAEV,UAAM,YAAY,YAAY,IAAI,GAAG,KAAK,MAAM,KAAK,WAAW,EAAE,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,CAAC;AAChH,QAAI,WAAW;AACb,cAAQ,KAAK,GAAG;AAAA,IAClB,OAAO;AACL,gBAAU,KAAK,GAAG;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,SAAS,kCAAkC,QAAQ,KAAK,IAAI,CAAC,yBAAyB,UAAU,KAAK,IAAI,KAAK,MAAM;AAC1H,WAAO;AAAA,MACL,aAAa,UAAU;AAAA,MACvB,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,gBAAgB;AAAA,MAChB,kBAAkB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,UAAU;AAAA,IACvB,UAAU;AAAA,IACV,QAAQ,UAAU;AAAA,IAClB,gBAAgB,CAAC;AAAA,IACjB,kBAAkB;AAAA,EACpB;AACF;AAMO,SAAS,mBACd,eACA,gBAC0D;AAC1D,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,MAAI,gBAAgB;AACpB,QAAM,mBAAgC,CAAC;AAEvC,aAAW,KAAK,eAAe;AAC7B,QAAI,EAAE,WAAW,gBAAgB,EAAE,WAAW,aAAa,EAAE,WAAW,eAAe;AACrF,uBAAiB,KAAK,CAAC;AACvB;AAAA,IACF;AAEA,UAAM,MAAM,wBAAwB,GAAG,cAAc;AACrD,QAAI,IAAI,UAAU;AAChB;AACA,YAAM,UAAU,EAAE,WAAW,CAAC;AAC9B,YAAM,UAAqB;AAAA,QACzB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,SAAS;AAAA,UACP,GAAG;AAAA,UACH;AAAA,YACE,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ,IAAI;AAAA,UACd;AAAA,QACF;AAAA,MACF;AACA,uBAAiB,KAAK,OAAO;AAAA,IAC/B,OAAO;AACL,uBAAiB,KAAK,CAAC;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,EAAE,kBAAkB,cAAc;AAC3C;AAKO,SAAS,4BACd,eACA,gBAKA;AACA,QAAM,EAAE,kBAAkB,cAAc,IAAI,mBAAmB,eAAe,cAAc;AAC5F,QAAM,oBAAoB,iBAAiB,OAAO,CAAC,MAAM,EAAE,WAAW,oBAAoB;AAC1F,SAAO,EAAE,mBAAmB,kBAAkB,cAAc;AAC9D;;;ACtJA,IAAM,sBAAsB,oBAAI,QAAgC;AAEhE,SAAS,cAAc,MAA4B;AACjD,MAAI,CAAC,KAAM,QAAO,oBAAI,IAAI;AAC1B,SAAO,IAAI;AAAA,IACT,KACG,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC/B;AACF;AAEA,SAAS,4BAA4B,GAA2B;AAC9D,MAAI,SAAS,oBAAoB,IAAI,CAAC;AACtC,MAAI,CAAC,QAAQ;AACX,aAAS,cAAc,EAAE,SAAS;AAClC,wBAAoB,IAAI,GAAG,MAAM;AAAA,EACnC;AACA,SAAO;AACT;AAKO,SAAS,YACd,WACA,SACW;AACX,QAAM,cAAc,cAAc,QAAQ,KAAK;AAC/C,QAAM,aAAa,IAAI,KAAK,QAAQ,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AACtF,QAAM,aAAa,IAAI,KAAK,QAAQ,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAEtF,QAAM,UAAU,IAAI,KAAK,UAAU,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AACrF,QAAM,UAAU,IAAI,KAAK,UAAU,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;AAGrF,QAAM,oBAA8B,CAAC;AAGrC,aAAW,KAAK,SAAS;AACvB,QAAI,WAAW,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,GAAG;AAC3C,wBAAkB,KAAK,sBAAsB,CAAC,iCAAiC;AAAA,IACjF;AAAA,EACF;AAGA,aAAW,KAAK,SAAS;AACvB,QAAI,WAAW,IAAI,CAAC,GAAG;AACrB,wBAAkB,KAAK,oBAAoB,CAAC,mCAAmC;AAAA,IACjF;AAAA,EACF;AAGA,QAAM,kBAA4B,CAAC;AAGnC,aAAW,KAAK,SAAS;AACvB,QAAI,WAAW,IAAI,CAAC,GAAG;AACrB,sBAAgB,KAAK,gBAAgB,CAAC,EAAE;AAAA,IAC1C,OAAO;AAEL,iBAAW,KAAK,aAAa;AAC3B,YAAI,MAAM,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG;AACjD,0BAAgB,KAAK,qBAAqB,CAAC,EAAE;AAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,4BAA4B,SAAS;AACxD,MAAI,oBAAoB;AACxB,aAAW,KAAK,aAAa;AAC3B,QAAI,UAAU;AACd,eAAW,MAAM,YAAY;AAC3B,UAAI,MAAM,MAAM,EAAE,WAAW,EAAE,KAAK,GAAG,WAAW,CAAC,GAAG;AACpD,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS;AACX;AACA,sBAAgB,KAAK,mBAAmB,CAAC,EAAE;AAAA,IAC7C;AAAA,EACF;AAGA,QAAM,YAAY,KAAK,IAAI,GAAG,QAAQ,IAAI;AAC1C,QAAM,mBAAmB,gBAAgB,OAAO,CAACC,OAAMA,GAAE,WAAW,aAAa,KAAKA,GAAE,WAAW,YAAY,CAAC,EAAE;AAClH,QAAM,gBAAgB,mBAAmB;AACzC,QAAM,oBAAoB,YAAY,OAAO,IAAI,oBAAoB,KAAK,IAAI,GAAG,YAAY,IAAI,IAAI;AACrG,QAAM,mBAAmB,OAAO,gBAAgB,OAAO;AAGvD,MAAI,kBAAkB;AACtB,QAAM,eAAe,QAAQ,SAAS,WAAW,YAAY;AAC7D,QAAM,aAAa,UAAU,SAAS,WAAW,YAAY;AAE7D,MAAI,gBAAgB,WAAW;AAC7B,sBAAkB;AAAA,EACpB,WAAW,cAAc,YAAY,YAAY,WAAW,SAAS,GAAG;AACtE,sBAAkB;AAAA,EACpB,WAAW,cAAc,aAAa,YAAY,WAAW,SAAS,GAAG;AACvE,sBAAkB;AAAA,EACpB,OAAO;AAEL,sBAAkB;AAAA,EACpB;AAGA,QAAM,IAAI,UAAU;AACpB,QAAM,WAAW,EAAE,gBAAgB,MAAM,EAAE,gBAAgB,IAAI,EAAE,sBAAsB;AACvF,QAAM,mBAAmB,UAAU,aAAa;AAGhD,MAAI,oBAAoB;AACxB,MAAI,EAAE,sBAAsB,GAAG;AAC7B,yBAAqB,KAAK,IAAI,KAAM,EAAE,sBAAsB,IAAI;AAAA,EAClE;AACA,MAAI,EAAE,kBAAkB,GAAG;AACzB,yBAAqB,KAAK,IAAI,KAAM,EAAE,kBAAkB,IAAI;AAAA,EAC9D;AAGA,MAAI,SAAS,mBAAmB,OAAO,mBAAmB,MAAO,qBAAqB;AAGtF,MAAI,UAAU,WAAW,SAAS;AAChC,aAAS;AAAA,EACX,WAAW,UAAU,WAAW,gBAAgB;AAC9C,aAAS;AAAA,EACX,WAAW,UAAU,WAAW,aAAa,UAAU,WAAW,cAAc;AAC9E,aAAS;AAAA,EACX;AAGA,MAAI,SAAyB;AAC7B,QAAM,UAAoB,CAAC;AAE3B,MAAI,kBAAkB,SAAS,GAAG;AAEhC,YAAQ,KAAK,IAAI,MAAM,QAAQ,GAAG;AAClC,aAAS;AACT,YAAQ,KAAK,mBAAmB,kBAAkB,MAAM,iCAAiC;AAAA,EAC3F,WAAW,SAAS,QAAQ,gBAAgB,SAAS,GAAG;AACtD,aAAS;AACT,YAAQ,KAAK,gCAAgC,gBAAgB,MAAM,oBAAoB;AAAA,EACzF,WAAW,SAAS,MAAM;AACxB,aAAS;AACT,YAAQ,KAAK,8CAA8C;AAAA,EAC7D,OAAO;AACL,aAAS;AACT,YAAQ,KAAK,wCAAwC,MAAM,QAAQ,CAAC,CAAC,WAAW;AAAA,EAClF;AAEA,QAAM,aAAa,KAAK,MAAM,KAAK,IAAI,GAAK,KAAK,IAAI,GAAK,KAAK,CAAC,IAAI,GAAG,IAAI;AAE3E,QAAM,cAA8B;AAAA,IAClC;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,YAAY,UAAU;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF;AACF;;;ACvLO,SAAS,iBACd,YACA,SACa;AACb,QAAM,UAAuB,CAAC;AAE9B,aAAW,aAAa,YAAY;AAClC,UAAM,MAAM,YAAY,WAAW,OAAO;AAC1C,YAAQ,KAAK,GAAG;AAAA,EAClB;AAGA,QAAM,iBAAyC;AAAA,IAC7C,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,UAAM,YAAY,eAAe,EAAE,MAAM,KAAK,MAAM,eAAe,EAAE,MAAM,KAAK;AAChF,QAAI,aAAa,EAAG,QAAO;AAC3B,UAAM,YAAY,EAAE,QAAQ,EAAE;AAC9B,QAAI,KAAK,IAAI,SAAS,IAAI,KAAO,QAAO;AACxC,WAAO,EAAE,UAAU,aAAa,EAAE,UAAU;AAAA,EAC9C,CAAC;AAED,SAAO;AACT;;;ACjCA,SAAS,QAAQ,QAAQ,QAAQ,cAA6B;AAOvD,IAAM,cAAN,MAAkB;AAAA,EACf,KAAsB;AAAA,EACtB,YAAY,oBAAI,IAAoB;AAAA,EAE5C,MAAM,OAAsB;AAC1B,SAAK,KAAK,MAAM,OAAO;AAAA,MACrB,QAAQ;AAAA,QACN,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AACD,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEA,MAAM,WAAW,eAA2C;AAC1D,UAAM,KAAK,KAAK;AAChB,eAAW,QAAQ,eAAe;AAChC,YAAM,KAAK,OAAO,IAAI;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAAgC;AAC3C,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,KAAK,KAAK;AAAA,IAClB;AAGA,UAAM,gBAAgB,KAAK,UAAU,IAAI,KAAK,EAAE;AAChD,QAAI,eAAe;AACjB,UAAI;AACF,cAAM,OAAO,KAAK,IAAK,aAAa;AAAA,MACtC,QAAQ;AAAA,MAER;AACA,WAAK,UAAU,OAAO,KAAK,EAAE;AAAA,IAC/B;AAEA,UAAM,QAAQ,MAAM,OAAO,KAAK,IAAK;AAAA,MACnC,IAAI,KAAK;AAAA,MACT,WAAW,KAAK;AAAA,MAChB,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,MAAM,KAAK,QAAQ,CAAC;AAAA,IACtB,CAAC;AAED,SAAK,UAAU,IAAI,KAAK,IAAI,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,OAAO,IAA2B;AACtC,QAAI,CAAC,KAAK,GAAI;AACd,UAAM,QAAQ,KAAK,UAAU,IAAI,EAAE;AACnC,QAAI,OAAO;AACT,UAAI;AACF,cAAM,OAAO,KAAK,IAAI,KAAK;AAAA,MAC7B,QAAQ;AAAA,MAER;AACA,WAAK,UAAU,OAAO,EAAE;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,MAAc,QAAQ,IAAuB;AAClE,QAAI,CAAC,KAAK,IAAI;AACZ,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,YAAY,KAAK,KAAK;AAC5B,QAAI,CAAC,WAAW;AACd,aAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK;AAAA,IACzD;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,OAAO,KAAK,IAAI;AAAA,QACpC,MAAM;AAAA,QACN;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAED,aAAO,QAAQ,KAAK,IAAI,CAAC,MAAO,EAAE,SAAiB,EAAY;AAAA,IACjE,QAAQ;AAEN,aAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,OAAe;AACb,WAAO,KAAK,UAAU;AAAA,EACxB;AACF;;;ACrFO,IAAM,YAAN,MAAgB;AAAA,EACrB,YACU,OACA,OACR;AAFQ;AACA;AAAA,EACP;AAAA,EAFO;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUV,MAAM,OAAO,UAAyB,CAAC,GAAyB;AAC9D,UAAM,QAAQ,QAAQ,SAAS;AAC/B,UAAM,QAAQ,QAAQ,OAAO,KAAK,KAAK;AACvC,UAAM,WAAW,QAAQ,YAAY,CAAC;AACtC,UAAM,WAAW,QAAQ,YAAY,CAAC;AACtC,UAAM,QAAQ,QAAQ,SAAS;AAE/B,UAAM,cAAwB,CAAC;AAC/B,QAAI,MAAO,aAAY,KAAK,KAAK;AACjC,QAAI,SAAS,SAAS,EAAG,aAAY,KAAK,GAAG,SAAS,MAAM,GAAG,CAAC,CAAC;AAEjE,UAAM,aAAa,YAAY,KAAK,GAAG,EAAE,KAAK;AAG9C,QAAI,eAAe,MAAM,KAAK,MAAM,iBAAiB,YAAY,EAAE;AAGnE,QAAI,aAA0B,CAAC;AAC/B,QAAI,aAAa,WAAW,GAAG;AAC7B,YAAM,MAAM,MAAM,KAAK,MAAM,gBAAgB;AAC7C,mBAAa,IAAI,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,WAAW,YAAY;AAAA,IACpF,OAAO;AACL,iBAAW,MAAM,cAAc;AAC7B,cAAM,OAAO,MAAM,KAAK,MAAM,aAAa,EAAE;AAC7C,YAAI,QAAQ,KAAK,WAAW,aAAa,KAAK,WAAW,cAAc;AACrE,qBAAW,KAAK,IAAI;AAAA,QACtB;AAAA,MACF;AAGA,UAAI,WAAW,SAAS,GAAG;AACzB,cAAM,MAAM,MAAM,KAAK,MAAM,gBAAgB;AAC7C,mBAAW,KAAK,KAAK;AACnB,cAAI,CAAC,aAAa,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,aAAa,EAAE,WAAW,cAAc;AACvF,uBAAW,KAAK,CAAC;AACjB,gBAAI,WAAW,UAAU,GAAI;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAA6B;AAAA,MACjC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,WAAW,iBAAiB,YAAY,YAAY;AAG1D,UAAM,WAAW,QAAQ,kBACrB,WACA,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAEhD,WAAO,SAAS,MAAM,GAAG,KAAK;AAAA,EAChC;AACF;;;ACrEO,IAAM,iBAA6C;AAAA,EACxD,eAAe;AAAA,EACf,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB,UAAU;AAAA;AAAA,EACV,MAAM;AACR;AAEA,SAASC,UAAS,MAAwB;AACxC,SAAO,KACJ,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/B;AAOA,eAAsB,sBACpB,SACA,SACA,WAC2B;AAC3B,QAAM,WAAW,QAAQ,SAAS,KAAK;AACvC,QAAM,YAAY,QAAQ,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;AAC3E,QAAM,YAAY,QAAQ,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;AAC3E,QAAM,QAAQ,QAAQ,SAAS;AAG/B,QAAM,cAAcA,UAAS,QAAQ;AACrC,QAAM,iBAAiB,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,WAAW,CAAC,CAAC;AAGxE,QAAM,eAAe,MAAM,QAAQ,gBAAgB;AACnD,MAAI;AAEJ,MAAI,qBAAqB,WAAW;AAClC,iBAAa,MAAM,UAAU,OAAO;AAAA,MAClC,OAAO;AAAA,MACP,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB;AAAA,MACA,OAAO,QAAQ,SAAS;AAAA,MACxB,iBAAiB;AAAA,IACnB,CAAC;AAAA,EACH,OAAO;AACL,QAAI,gBAA6B,CAAC;AAClC,QAAI,qBAAqB,aAAa;AACpC,YAAM,YAAY,YAAY,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAClD,YAAM,MAAM,MAAM,UAAU,iBAAiB,WAAW,EAAE;AAC1D,iBAAW,MAAM,KAAK;AACpB,cAAM,OAAO,MAAM,QAAQ,aAAa,EAAE;AAC1C,YAAI,KAAM,eAAc,KAAK,IAAI;AAAA,MACnC;AAAA,IACF;AACA,QAAI,cAAc,WAAW,GAAG;AAC9B,sBAAgB;AAAA,IAClB;AACA,eAAW,KAAK,cAAc;AAC5B,UAAI,CAAC,cAAc,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC,MAAM,eAAe,SAAS,CAAC,CAAC,GAAG;AACnG,sBAAc,KAAK,CAAC;AAAA,MACtB;AAAA,IACF;AACA,iBAAa,iBAAiB,eAAe;AAAA,MAC3C,UAAU,QAAQ;AAAA,MAClB,UAAU,QAAQ;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,gBAA6B,CAAC;AACpC,QAAM,gBAAuD,CAAC;AAE9D,aAAW,OAAO,YAAY;AAC5B,QAAI,YAAY;AAChB,QAAI,IAAI,YAAY,kBAAkB,SAAS,GAAG;AAChD,kBAAY;AAAA,IACd,WAAW,IAAI,YAAY,QAAQ,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,OAAO,CAAC,GAAG;AACjF,kBAAY;AAAA,IACd,WAAW,IAAI,UAAU,WAAW,WAAW,IAAI,UAAU,WAAW,sBAAsB;AAC5F,kBAAY;AAAA,IACd;AAEA,UAAM,QAAQ,kBAAkB;AAAA,MAC9B,MAAM;AAAA,MACN,aAAa,IAAI,UAAU;AAAA,MAC3B,QAAQ,IAAI;AAAA,MACZ,QAAQ;AAAA,MACR,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAED,QAAI,cAAc,iBAAiB;AACjC,YAAM,QAAQ,kBAAkB;AAAA,QAC9B,MAAM;AAAA,QACN,aAAa,IAAI,UAAU;AAAA,QAC3B,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,IACH;AAEA,QAAI,IAAI,WAAW,UAAU;AAC3B,YAAM,cAAc,IAAI,YAAY,kBAAkB,SAAS,IAC3D,GAAG,IAAI,YAAY,kBAAkB,KAAK,IAAI,CAAC,oCAC9C,IAAI,YAAY,QAAQ,CAAC,KAAK;AACnC,oBAAc,KAAK;AAAA,QACjB,IAAI,IAAI,UAAU;AAAA,QAClB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,WAAW,IAAI,WAAW,WAAW,IAAI,WAAW,YAAY;AAC9D,oBAAc,KAAK,IAAI,SAAS;AAAA,IAClC;AAAA,EACF;AAGA,QAAM,WAAW,MAAM,QAAQ,eAAe;AAC9C,QAAM,oBAAoB,oBAAI,IAAY;AAC1C,QAAM,4BAA4B,oBAAI,IAAoB;AAG1D,aAAW,KAAK,UAAU;AACxB,UAAM,WAAWA,UAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,YAAY,SAAS,CAAC,CAAC;AAC3E,QAAI,SAAS,UAAU,KAAM,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC,MAAM,eAAe,SAAS,CAAC,CAAC,GAAI;AAC9F,YAAM,QAAQ,kBAAkB;AAAA,QAC9B,MAAM;AAAA,QACN,iBAAiB,EAAE;AAAA,QACnB,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AACD,iBAAW,KAAK,EAAE,SAAS;AACzB,0BAAkB,IAAI,CAAC;AAAA,MACzB;AACA,iBAAW,OAAO,EAAE,UAAU;AAC5B,kCAA0B,IAAI,IAAI,QAAQ,IAAI,MAAM;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAGA,aAAW,KAAK,eAAe;AAC7B,eAAW,MAAM,EAAE,UAAU;AAC3B,wBAAkB,IAAI,GAAG,QAAQ,0BAA0B,EAAE,CAAC;AAAA,IAChE;AACA,QAAI,EAAE,YAAY;AAChB,iBAAW,OAAO,EAAE,YAAY;AAC9B,0BAAkB,IAAI,IAAI,QAAQ,0BAA0B,EAAE,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAAkB,cAAc,OAAO,CAAC,MAAM,EAAE,WAAW,wBAAwB,EAAE,WAAW,OAAO;AAC7G,QAAM,yBAAyB,cAAc,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc;AACtF,QAAM,mBAAmB,cAAc;AAAA,IACrC,CAAC,OACE,EAAE,WAAW,YAAY,EAAE,UAAU,YAAY,EAAE,UAAU,gBAC9D,EAAE,WAAW,wBACb,EAAE,WAAW,WACb,EAAE,WAAW,kBACb,EAAE,WAAW,aACb,EAAE,WAAW;AAAA,EACjB;AAGA,QAAM,oBAAoB,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU;AAC1E,MAAI;AAEJ,aAAW,MAAM,mBAAmB;AAClC,UAAM,cAAc,GAAG,SAAS,KAAK,CAAC,MAAM,eAAe,SAAS,CAAC,CAAC;AACtE,UAAM,YAAY,GAAG,SAAS,KAAK,CAAC,MAAM,SAAS,SAAS,CAAC,CAAC;AAC9D,QAAI,eAAe,CAAC,aAAa,GAAG,UAAU;AAC5C,6BAAuB;AAAA,QACrB,UAAU,GAAG;AAAA,QACb,aAAa,GAAG,WAAW,CAAC,KAAK;AAAA,QACjC,QAAQ,yBAAyB,GAAG,SAAS,KAAK,IAAI,CAAC;AAAA,MACzD;AACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,oBAAI,IAAY;AACtC,aAAW,KAAK,kBAAkB;AAChC,eAAW,KAAKA,UAAS,EAAE,SAAS,EAAG,eAAc,IAAI,CAAC;AAC1D,eAAW,KAAK,EAAE,SAAU,eAAc,IAAI,CAAC;AAAA,EACjD;AAEA,QAAM,iBAA2B,CAAC;AAClC,aAAW,MAAM,aAAa;AAC5B,QAAI,CAAC,CAAC,OAAO,QAAQ,OAAO,QAAQ,SAAS,OAAO,OAAO,OAAO,QAAQ,QAAQ,MAAM,EAAE,SAAS,EAAE,GAAG;AACtG,UAAI,CAAC,cAAc,IAAI,EAAE,GAAG;AAC1B,uBAAe,KAAK,EAAE;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAyB;AAC7B,MAAI;AAEJ,MAAI,iBAAiB,WAAW,KAAK,gBAAgB,SAAS,GAAG;AAC/D,YAAQ;AACR,aAAS;AAAA,EACX,WAAW,iBAAiB,WAAW,KAAK,uBAAuB,SAAS,GAAG;AAC7E,YAAQ;AACR,aAAS;AAAA,EACX,WAAW,iBAAiB,WAAW,GAAG;AACxC,YAAQ;AACR,aAAS,cAAc,SAAS,KAAK,cAAc,WAAW,IAAI,qBAAqB;AAAA,EACzF,WAAW,eAAe,WAAW,KAAK,iBAAiB,KAAK,CAAC,MAAM,EAAE,cAAc,IAAI,GAAG;AAC5F,YAAQ;AAAA,EACV,OAAO;AACL,YAAQ;AACR,aAAS;AAAA,EACX;AAGA,QAAM,eAAe,MAAM,KAAK,iBAAiB;AACjD,MAAI;AACJ,MAAI;AAEJ,MAAI,UAAU,SAAS;AACrB,iBAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ,iBAAiB,CAAC,EAAE;AAAA,MAC5B,QAAQ,mDAAmD,iBAAiB,CAAC,EAAE,EAAE;AAAA,MACjF,cAAc,eAAe;AAAA,MAC7B,kBAAkB;AAAA,IACpB;AAAA,EACF,WAAW,UAAU,cAAc;AACjC,iBAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,cAAc,eAAe;AAAA,MAC7B,kBAAkB;AAAA,IACpB;AACA,eAAW;AAAA,MACT,MAAM;AAAA,MACN,UAAU,sCAAsC,QAAQ;AAAA,IAC1D;AAAA,EACF,WAAW,UAAU,SAAS;AAC5B,UAAM,YAAY,gBAAgB,CAAC;AACnC,UAAM,eAAe,UAAU,aAAa,CAAC,KAAK,UAAU,SAAS,CAAC,KAAK;AAC3E,iBAAa;AAAA,MACX,MAAM;AAAA,MACN,QAAQ,aAAa,QAAQ,0BAA0B,EAAE;AAAA,MACzD,QAAQ,+BAA+B,UAAU,EAAE;AAAA,MACnD,cAAc,eAAe;AAAA,MAC7B,kBAAkB;AAAA,IACpB;AAAA,EACF,OAAO;AAKL,QAAI,sBAAsB;AACxB,mBAAa;AAAA,QACX,MAAM;AAAA,QACN,QAAQ,qBAAqB;AAAA,QAC7B,cAAc,eAAe;AAAA,QAC7B,kBAAkB;AAAA,MACpB;AACA,iBAAW;AAAA,QACT,MAAM;AAAA,QACN,UAAU,qBAAqB;AAAA,MACjC;AAAA,IACF,OAAO;AAEL,YAAM,iBAAiB;AAAA,QACrB,SAAS,YAAY,CAAC,KAAK,QAAQ;AAAA,QACnC,QAAQ,YAAY,CAAC,KAAK,QAAQ;AAAA,QAClC;AAAA,MACF;AAEA,YAAM,kBAAkB,eAAe;AAAA,QACrC,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC;AAAA,MACtE;AAEA,YAAM,iBAAiB;AAAA,QACrB,OAAO,YAAY,CAAC,KAAK,MAAM,IAAI,YAAY,CAAC,KAAK,OAAO;AAAA,QAC5D,OAAO,YAAY,CAAC,KAAK,OAAO;AAAA,MAClC;AAEA,YAAM,kBAAkB,eAAe;AAAA,QACrC,CAAC,MAAM,CAAC,kBAAkB,IAAI,CAAC,KAAK,CAAC,0BAA0B,IAAI,CAAC;AAAA,MACtE;AAEA,iBAAW,KAAK,gBAAgB;AAC9B,YAAI,kBAAkB,IAAI,CAAC,GAAG;AAC5B,gBAAM,QAAQ,kBAAkB;AAAA,YAC9B,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,WAAW,KAAK,IAAI;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,MACF;AACA,iBAAW,KAAK,gBAAgB;AAC9B,YAAI,kBAAkB,IAAI,CAAC,GAAG;AAC5B,gBAAM,QAAQ,kBAAkB;AAAA,YAC9B,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,WAAW,KAAK,IAAI;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,mBAAmB,eAAe,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO,KAAK,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,UAAU,CAAC,GAAG;AACtH,qBAAa;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ,oDAAoD,eAAe,KAAK,IAAI,CAAC;AAAA,UACrF,cAAc,eAAe;AAAA,UAC7B,kBAAkB;AAAA,QACpB;AAAA,MACF,WAAW,iBAAiB;AAC1B,qBAAa;AAAA,UACX,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,QAAQ,iDAAiD,eAAe,KAAK,IAAI,CAAC;AAAA,UAClF,cAAc,eAAe;AAAA,UAC7B,kBAAkB;AAAA,QACpB;AAAA,MACF,OAAO;AAEL,qBAAa;AAAA,UACX,MAAM;AAAA,UACN,QAAQ,eAAe,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK;AAAA,UAChD,QAAQ,2CAA2C,eAAe,KAAK,IAAI,CAAC;AAAA,UAC5E,cAAc,eAAe;AAAA,UAC7B,kBAAkB;AAAA,QACpB;AAAA,MACF;AAEA,iBAAW;AAAA,QACT,MAAM;AAAA,QACN,UAAU,sBAAsB,QAAQ,eAAe,eAAe,KAAK,IAAI,KAAK,WAAW;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AAGA,MAAI,UAAU,WAAY,cAAc,WAAW,SAAS,uBAAuB,WAAW,SAAS,QAAS;AAC9G,UAAM,QAAQ,kBAAkB;AAAA,MAC9B,MAAM;AAAA,MACN,cAAc,YAAY;AAAA,MAC1B,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,aAAW,KAAK,kBAAkB;AAChC,UAAM,QAAQ,kBAAkB;AAAA,MAC9B,MAAM;AAAA,MACN,aAAa,EAAE;AAAA,MACf,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,MAAI,wBAAwB,UAAU,SAAS,OAAO;AACpD,UAAM,QAAQ,kBAAkB;AAAA,MAC9B,MAAM;AAAA,MACN,UAAU,sBAAsB,YAAY,UAAU;AAAA,MACtD,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,kBAAkB;AAAA,IAC9B,MAAM;AAAA,IACN;AAAA,IACA,QAAQ,YAAY;AAAA,IACpB;AAAA,IACA,WAAW,KAAK,IAAI;AAAA,EACtB,CAAC;AAGD,QAAM,YAAY,WAAW,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC9F,QAAM,UAAgC;AAAA,IACpC,IAAI;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT,UAAU,iBAAiB,IAAI,CAAC,MAAM,EAAE,SAAS;AAAA,IACjD,UAAU,cAAc,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,QAAQ,EAAE,OAAO,EAAE;AAAA,IACvE,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ,UAAU,UAAU,aAAa;AAAA,IACzC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,QAAQ,YAAY,OAAO;AAEjC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,iBAAiB,IAAI,CAAC,OAAO;AAAA,MAClC,IAAI,EAAE;AAAA,MACN,WAAW,EAAE;AAAA,MACb,YAAY,EAAE,kBAAkB,EAAE;AAAA,MAClC,gBAAgB,EAAE;AAAA,MAClB,OAAO,EAAE;AAAA,IACX,EAAE;AAAA,IACF,YAAY,SAAS,SAAS,IAAI,WAAW,eAAe,MAAM,GAAG,CAAC;AAAA,IACtE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;","names":["createHash","createHash","m","tokenize"]}
@@ -0,0 +1,69 @@
1
+ import { o as Observation } from './types-Nxq5Gzay.js';
2
+
3
+ interface ScannedFileInfo {
4
+ path: string;
5
+ relativePath: string;
6
+ name: string;
7
+ ext: string;
8
+ size: number;
9
+ mtimeMs?: number;
10
+ isDirectory?: boolean;
11
+ }
12
+ interface WalkOptions {
13
+ maxDepth?: number;
14
+ maxFiles?: number;
15
+ ignoredDirs?: Set<string> | string[];
16
+ includeHidden?: boolean;
17
+ readGitignore?: boolean;
18
+ filter?: (entry: ScannedFileInfo) => boolean;
19
+ }
20
+ /**
21
+ * High-performance, depth-controlled recursive directory walker.
22
+ * Respects default ignores, .gitignore patterns, symlink circularity, and file limits.
23
+ */
24
+ declare function walkDirectory(dir: string, optionsOrRoot?: string | WalkOptions, legacyFileList?: ScannedFileInfo[]): Promise<ScannedFileInfo[]>;
25
+ /**
26
+ * Queryable project context providing cached text and JSON reads for detectors.
27
+ */
28
+ declare class ProjectContext {
29
+ readonly rootDir: string;
30
+ readonly files: ScannedFileInfo[];
31
+ private relPathSet;
32
+ private fileNameSet;
33
+ private textCache;
34
+ private jsonCache;
35
+ constructor(files: ScannedFileInfo[], rootDir: string);
36
+ hasFile(nameOrRelPath: string): boolean;
37
+ hasDirectory(dirNameOrRelPath: string): boolean;
38
+ findFiles(predicate: (file: ScannedFileInfo) => boolean): ScannedFileInfo[];
39
+ readText(relativePath: string, maxBytes?: number): Promise<string | null>;
40
+ readJson<T = any>(relativePath: string): Promise<T | null>;
41
+ }
42
+ type DetectorCategory = 'runtime' | 'language' | 'package-manager' | 'framework' | 'testing' | 'database' | 'tooling' | 'ci-cd' | 'monorepo' | 'documentation' | 'architecture';
43
+ interface ConventionDetector {
44
+ id: string;
45
+ name: string;
46
+ category: DetectorCategory;
47
+ description?: string;
48
+ detect(ctx: ProjectContext): Promise<Observation | Observation[] | null> | Observation | Observation[] | null;
49
+ }
50
+ declare class ConventionRegistry {
51
+ private detectors;
52
+ register(detector: ConventionDetector): this;
53
+ unregister(id: string): boolean;
54
+ get(id: string): ConventionDetector | undefined;
55
+ list(): ConventionDetector[];
56
+ run(ctx: ProjectContext): Promise<Observation[]>;
57
+ }
58
+ declare const BUILTIN_DETECTORS: ConventionDetector[];
59
+ declare const defaultRegistry: ConventionRegistry;
60
+ /**
61
+ * Convenience helper to register a new convention detector globally.
62
+ */
63
+ declare function registerConventionDetector(detector: ConventionDetector): void;
64
+ /**
65
+ * Analyzes project structure using extensible convention detectors.
66
+ */
67
+ declare function analyzeProjectStructure(files: ScannedFileInfo[], rootDir: string, registry?: ConventionRegistry): Promise<Observation[]>;
68
+
69
+ export { BUILTIN_DETECTORS as B, type ConventionDetector as C, type DetectorCategory as D, ProjectContext as P, type ScannedFileInfo as S, type WalkOptions as W, ConventionRegistry as a, analyzeProjectStructure as b, defaultRegistry as d, registerConventionDetector as r, walkDirectory as w };
@@ -0,0 +1,163 @@
1
+ import { S as Scope, J as JevResult, P as Provenance, K as Knowledge, O as OutcomeType, T as TaskTrajectory, R as ResolveOptions, a as ResolutionResult, U as UnknownRecord } from './types-Nxq5Gzay.js';
2
+ export { A as ActionType, B as BilmemConfig, b as BilmemMetrics, C as ConfidenceTier, E as EvaluatedRule, c as Evidence, d as EvidenceRelation, I as InvestigationReceipt, e as JevExplanation, f as JevMatchStatus, g as KnowledgeBudgetConfig, h as KnowledgeDiff, i as KnowledgeHistoryEntry, j as KnowledgeMetrics, k as KnowledgeOutcomesSummary, l as KnowledgeStage, m as KnowledgeStatus, n as KnowledgeType, N as NextEvidenceAction, o as Observation, p as OutcomeRecord, q as ReconciliationAction, r as ReconciliationResult, s as RelationType, t as ResolutionReason, u as ResolutionState, v as RevisionSnapshot, w as RuleCondition, x as RuleDefinition, y as RuleSet, z as TemporalMetadata, D as TrajectoryEvent, F as TrajectoryEventType, G as UnknownNextAction, H as UnknownReason, L as UnknownState } from './types-Nxq5Gzay.js';
3
+ import { createUnknown } from './core/index.js';
4
+ export { DistilledLesson, EvidenceGraph, MetricsTracker, RELATIVE_COSTS, SourceDependencyIndex, StalenessCheckResult, TrajectoryLearningResult, applyOutcomeToKnowledge, applyReconciliation, buildDependencyIndex, calculateEffectiveConfidence, calculateKnowledgeValue, checkKnowledgeListStaleness, checkKnowledgeStaleness, confidenceToTier, createEvidence, createKnowledge, createObservation, createOutcome, detectPolarContradiction, determineInitialStage, distillTrajectory, enforceKnowledgeBudget, evaluatePromotion, hasBeenInvestigated, hashString, learnFromTrajectory, markStaleKnowledge, normalizeSourceKey, processUserCorrection, reconcileKnowledge, recordOutcomeOnKnowledge, resolveEpistemicQuery, tierToConfidence, updateUnknown } from './core/index.js';
5
+ export { QueryContext, evaluateJev, formatJevExplanation, formatWhyExplanation, formatWhyHistory, rerankCandidates } from './jev/index.js';
6
+ import { LookupOptions, OramaIndex as SearchIndex, BilmemRetriever as Retriever } from './search/index.js';
7
+ export { KnowledgeStoreProvider } from './search/index.js';
8
+ import { CompactionReport, ImportReport } from './storage/index.js';
9
+ export { BatchOp, PortableDump, StorageDriver, compact, dumpToYaml, exportKnowledgeToYaml, importKnowledgeFromYaml, restoreFromYaml } from './storage/index.js';
10
+ import { S as Storage } from './canonical-CglQQ0xc.js';
11
+ export { E as EffectivenessRatio, J as JevRejectReason, K as KnowledgeHealthCategory, a as KnowledgeStatsReport, M as MetricEvent, b as StatsReport, d as desanitizeFileName, f as formatKnowledgeDiff, s as sanitizeFileName } from './canonical-CglQQ0xc.js';
12
+ export { B as BUILTIN_DETECTORS, C as ConventionDetector, a as ConventionRegistry, D as DetectorCategory, P as ProjectContext, S as ScannedFileInfo, W as WalkOptions, b as analyzeProjectStructure, d as defaultRegistry, r as registerConventionDetector, w as walkDirectory } from './filesystem-B3qAej0l.js';
13
+ import { ScanOptions, ScanReport } from './scanner/index.js';
14
+ export { BUILTIN_MARKDOWN_EXTRACTORS, GitCommit, GitScanResult, MarkdownAlert, MarkdownCodeBlock, MarkdownDocument, MarkdownEvidenceResult, MarkdownExtractor, MarkdownExtractorResult, MarkdownHeading, MarkdownLink, MarkdownRegistry, MarkdownSection, MarkdownTable, MarkdownTaskItem, SourceScanResult, analyzeSourceFile, defaultMarkdownRegistry, isGitRepository, isSourceFile, parseMarkdownDocument, parseMarkdownFile, registerMarkdownExtractor, scanGitHistory, scanRepository } from './scanner/index.js';
15
+ export { RuleValidationResult, evaluateRule, evaluateRuleSet, findRuleFiles, loadAllProjectRuleSets, loadRuleSetFile, parseRuleSetYaml, ruleToCandidateLesson, ruleToObservation, stringifyRuleSetYaml, validateRuleDefinition, validateRuleSet } from './rules/index.js';
16
+ export { CreateMcpAppOptions, createBilmemMcpApp } from './mcp/index.js';
17
+ export { AgentDoctorReport, AgentInstaller, BILMEM_END_MARKER, BILMEM_START_MARKER, BaseAgentAdapter, CURRENT_INTEGRATION_VERSION, ClaudeAdapter, CliDoctorOptions, CliInstallOptions, CliUninstallOptions, CodexAdapter, CoreDoctorReport, CursorAdapter, DetectedAgent, DetectionResult, DoctorFixResult, DoctorReport, GeminiAdapter, InstallContext, InstallOptions, InstallResult, InstallScope, InstallState, IntegrationRecord, IntegrationsMetadata, JsonReadResult, UninstallOptions, UninstallResult, VerifyResult, createInstallContext, detectAgents, extractInstructionVersion, formatDoctorFixResult, formatDoctorReport, formatInstallResult, formatUninstallResult, getAdapter, getAgentInstructionText, getAllAdapters, getIntegrationRecord, getIntegrationsFilePath, handleDoctorCommand, handleInstallCommand, handleUninstallCommand, hasBilmemInstruction, isExecutableInPath, loadIntegrationsMetadata, pathExists, recordIntegration, removeIntegration, removeMarkdownInstructionFile, removeMcpJsonConfig, runDoctor, runDoctorFix, safeReadJson, saveIntegrationsMetadata, updateMarkdownInstructionFile, updateMcpJsonConfig, writeAtomic } from './install/index.js';
18
+ export { RunStatsOptions, appendMetricEvent, classifyKnowledgeHealth, computeKnowledgeStats, computeStats, formatKnowledgeStatsReport, formatStatsReport, getEventsFilePath, readMetricEvents, resetMetricEvents, resolveSinceTimestamp, runStats } from './stats/index.js';
19
+ import 'mcponce';
20
+
21
+ interface BilmemOptions {
22
+ rootDir?: string;
23
+ projectName?: string;
24
+ defaultScope?: Scope;
25
+ }
26
+ interface ObserveOptions {
27
+ claim: string;
28
+ source: string;
29
+ confidence?: number;
30
+ positive?: string[];
31
+ negative?: string[];
32
+ details?: Record<string, unknown>;
33
+ provenance?: Partial<Provenance>;
34
+ }
35
+ interface LearnOptions {
36
+ goal: string;
37
+ taskId?: string;
38
+ outcome: OutcomeType;
39
+ events?: TaskTrajectory['events'];
40
+ userCorrection?: {
41
+ topic: string;
42
+ incorrectAssumption: string;
43
+ correctFact: string;
44
+ context?: string[];
45
+ };
46
+ dryRun?: boolean;
47
+ }
48
+ /**
49
+ * Unified runtime client for bilmem.
50
+ */
51
+ declare class Bilmem {
52
+ private rootDir;
53
+ private storage;
54
+ private index;
55
+ private retriever;
56
+ private initialized;
57
+ constructor(options?: BilmemOptions);
58
+ init(): Promise<this>;
59
+ private ensureInitialized;
60
+ /**
61
+ * Lookup relevant knowledge with JEV contextual reranking.
62
+ */
63
+ lookup(options?: LookupOptions): Promise<JevResult[]>;
64
+ /**
65
+ * Record a new observation with preserved provenance and reconcile into knowledge.
66
+ */
67
+ observe(options: ObserveOptions): Promise<{
68
+ observationId: string;
69
+ knowledge: Knowledge;
70
+ action: string;
71
+ }>;
72
+ /**
73
+ * Learn from a completed task trajectory or explicit user correction.
74
+ */
75
+ learn(options: LearnOptions): Promise<{
76
+ type: string;
77
+ knowledge?: Knowledge;
78
+ action?: string;
79
+ plannedActions?: string[];
80
+ }>;
81
+ /**
82
+ * Primary epistemic operation:
83
+ * Answers "Do I know enough to act, what do I know does not apply,
84
+ * what am I missing, and what is the cheapest next step to resolve the uncertainty?"
85
+ */
86
+ resolve(options: ResolveOptions): Promise<ResolutionResult>;
87
+ /**
88
+ * Check knowledge staleness based on changed source files.
89
+ */
90
+ checkDependencies(changedSources: string[]): Promise<{
91
+ affectedKnowledge: Knowledge[];
92
+ }>;
93
+ /**
94
+ * Explain why a knowledge ID exists and format evidence provenance,
95
+ * or show lifecycle history if history option is true.
96
+ */
97
+ explain(id: string, options?: {
98
+ history?: boolean;
99
+ }): Promise<string>;
100
+ /**
101
+ * Scan repository filesystem, markdown documentation, and git history.
102
+ */
103
+ scan(options?: ScanOptions): Promise<ScanReport>;
104
+ /**
105
+ * Retrieve all known items with optional filtering.
106
+ */
107
+ known(options?: {
108
+ scope?: string;
109
+ status?: string;
110
+ }): Promise<Knowledge[]>;
111
+ /**
112
+ * Retrieve first-class unknowns.
113
+ */
114
+ unknown(): Promise<UnknownRecord[]>;
115
+ /**
116
+ * Check if a path or subject has already been investigated.
117
+ */
118
+ isInvestigated(target: string): Promise<{
119
+ investigated: boolean;
120
+ record?: UnknownRecord;
121
+ reason?: string;
122
+ }>;
123
+ /**
124
+ * Record a new first-class unknown.
125
+ */
126
+ recordUnknown(params: Parameters<typeof createUnknown>[0]): Promise<UnknownRecord>;
127
+ /**
128
+ * Compact knowledge base.
129
+ */
130
+ compact(options?: {
131
+ dryRun?: boolean;
132
+ }): Promise<CompactionReport>;
133
+ /**
134
+ * Export knowledge to portable YAML.
135
+ */
136
+ export(options?: {
137
+ scope?: string;
138
+ }): Promise<string>;
139
+ /**
140
+ * Import knowledge from YAML with smart reconciliation.
141
+ */
142
+ import(yamlContent: string): Promise<ImportReport>;
143
+ /**
144
+ * Create complete portable snapshot dump.
145
+ */
146
+ dump(): Promise<string>;
147
+ /**
148
+ * Deterministically restore from snapshot dump.
149
+ */
150
+ restore(yamlContent: string): Promise<{
151
+ restoredKnowledgeCount: number;
152
+ restoredUnknownsCount: number;
153
+ }>;
154
+ getStorage(): Storage;
155
+ getIndex(): SearchIndex;
156
+ getRetriever(): Retriever;
157
+ }
158
+ /**
159
+ * Factory function to create a Bilmem instance.
160
+ */
161
+ declare function createBilmem(options?: BilmemOptions): Bilmem;
162
+
163
+ export { Bilmem, type BilmemOptions, Retriever as BilmemRetriever, Storage as CanonicalStorage, CompactionReport, ImportReport, JevResult, Knowledge, type LearnOptions, LookupOptions, type ObserveOptions, SearchIndex as OramaIndex, OutcomeType, Provenance, ResolutionResult, ResolveOptions, Retriever, ScanOptions, ScanReport, Scope, SearchIndex, Storage, TaskTrajectory, UnknownRecord, createBilmem, createUnknown };