artbot 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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/interactive-app.tsx", "../../src/tui/helpers.ts", "../../src/tui/status-rail.ts", "../../src/tui/command-bar.ts", "../../src/tui/run-progress-view.ts", "../../src/tui/report-workspace.ts", "../../src/tui/side-detail-pane.ts", "../../src/tui/shell.ts", "../../src/tui/ink-renderer.tsx", "../../src/interactive.ts"],
4
+ "sourcesContent": ["import React, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { Box, Text, render, useApp, useInput } from \"ink\";\nimport TextInput from \"ink-text-input\";\nimport type { RunEntity } from \"@artbot/shared-types\";\nimport { ArtbotTuiShell, buildDefaultCommandHints, type TuiAppModel, type TuiRuntimeStatus } from \"./tui/index.js\";\nimport { RenderTuiNode } from \"./tui/ink-renderer.js\";\nimport { assessLocalSetup } from \"./setup/workflow.js\";\nimport type { SetupAssessment } from \"./setup/index.js\";\nimport type { PerPaintingStat, ReportRecord, ReportSummary, ReportValuation } from \"./ui/report.js\";\n\nexport interface InteractiveStartContext {\n apiBaseUrl: string;\n apiKey?: string;\n defaults: {\n analysisMode: \"comprehensive\" | \"balanced\" | \"fast\";\n priceNormalization: \"legacy\" | \"usd_dual\" | \"usd_nominal\" | \"usd_2026\";\n authProfileId?: string;\n allowLicensed: boolean;\n licensedIntegrations: string[];\n };\n}\n\ninterface PipelineDetails {\n run?: { id?: string; status?: string };\n summary?: ReportSummary;\n records?: ReportRecord[];\n duplicates?: ReportRecord[];\n valuation?: ReportValuation;\n per_painting_stats?: PerPaintingStat[];\n attempts?: Array<{\n source_url: string;\n source_access_status: string;\n blocker_reason?: string | null;\n extracted_fields?: Record<string, unknown>;\n }>;\n}\n\ninterface InteractiveAppProps {\n context: InteractiveStartContext;\n initialAssessment: SetupAssessment | null;\n onExit: (code: number) => void;\n}\n\ntype RunInteractiveTuiProps = Omit<InteractiveAppProps, \"onExit\">;\n\ntype DetailMode = \"help\" | \"status\" | \"setup\" | \"auth\" | \"runs\" | \"report\";\n\nfunction fmtCurrency(amount: number, currency: string): string {\n try {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency,\n maximumFractionDigits: 0\n }).format(amount);\n } catch {\n return `${amount.toLocaleString(\"en-US\")} ${currency}`;\n }\n}\n\nfunction asRuntimeStatus(\n label: string,\n ok: boolean,\n detail?: string,\n tone?: TuiRuntimeStatus[\"tone\"]\n): TuiRuntimeStatus {\n return {\n label,\n state: ok ? \"healthy\" : \"offline\",\n detail,\n tone: tone ?? (ok ? \"success\" : \"danger\")\n };\n}\n\nfunction blockerSummary(details: PipelineDetails | null): string | undefined {\n if (!details?.summary?.acceptance_reason_breakdown) return undefined;\n const entries = Object.entries(details.summary.acceptance_reason_breakdown)\n .filter(([, count]) => count > 0)\n .sort((a, b) => b[1] - a[1]);\n if (entries.length === 0) return undefined;\n return `Top issue: ${entries[0][0]} (${entries[0][1]})`;\n}\n\nfunction priceLabel(record: ReportRecord): string {\n if (typeof record.normalized_price_usd_nominal === \"number\") return fmtCurrency(record.normalized_price_usd_nominal, \"USD\");\n if (typeof record.normalized_price_usd === \"number\") return fmtCurrency(record.normalized_price_usd, \"USD\");\n if (typeof record.price_amount === \"number\") return fmtCurrency(record.price_amount, record.currency ?? \"TRY\");\n if (typeof record.estimate_low === \"number\" && typeof record.estimate_high === \"number\") {\n return `${fmtCurrency(record.estimate_low, record.currency ?? \"TRY\")}\u2013${fmtCurrency(record.estimate_high, record.currency ?? \"TRY\")}`;\n }\n if (record.price_type === \"inquiry_only\" || record.price_hidden) return \"Inquiry only\";\n return \"n/a\";\n}\n\nfunction rangeLabel(range?: { low: number; high: number } | null): string {\n if (!range) return \"n/a\";\n return `${fmtCurrency(range.low, \"TRY\")} \u2013 ${fmtCurrency(range.high, \"TRY\")}`;\n}\n\nfunction buildModel(params: {\n assessment: SetupAssessment | null;\n details: PipelineDetails | null;\n recentRuns: RunEntity[];\n activeArtist: string;\n input: string;\n history: string[];\n detailMode: DetailMode;\n busy: boolean;\n message: string;\n context: InteractiveStartContext;\n tick: number;\n runStartedAt: number | null;\n}): TuiAppModel {\n const { assessment, details, recentRuns, activeArtist, input, history, detailMode, busy, message, context, tick, runStartedAt } = params;\n const summary = details?.summary;\n const records = details?.records ?? [];\n const runId = details?.run?.id ?? \"n/a\";\n const valuation = details?.valuation;\n\n const issueLines = assessment?.issues.map((issue) => `${issue.severity}: ${issue.message}${issue.detail ? ` (${issue.detail})` : \"\"}`) ?? [];\n const recentRunLines = recentRuns.slice(0, 5).map((run) => `${run.id} \u00B7 ${run.status} \u00B7 ${run.query.artist}`);\n const authLines =\n assessment?.sessionStates.map((session) => `${session.profileId}: ${session.exists ? (session.expired ? \"expired\" : \"ready\") : \"missing\"}`) ?? [];\n\n const diagnosticsLines =\n detailMode === \"runs\"\n ? recentRunLines\n : detailMode === \"auth\"\n ? authLines\n : detailMode === \"setup\"\n ? issueLines\n : [message || \"No additional diagnostics.\"];\n\n return {\n title: \"ArtBot\",\n subtitle: \"Market operations console\",\n command: {\n mode: busy ? \"running\" : detailMode === \"setup\" ? \"setup\" : \"idle\",\n input,\n placeholder: \"Type /research <artist> or plain artist text. /help for commands.\",\n hints: buildDefaultCommandHints(),\n history\n },\n status: {\n llm: assessment\n ? asRuntimeStatus(\"LM Studio\", assessment.llmHealth.ok, assessment.llmHealth.modelId ?? assessment.llmHealth.reason)\n : asRuntimeStatus(\"LM Studio\", false, \"checking\"),\n api: assessment ? asRuntimeStatus(\"ArtBot API\", assessment.apiHealth.ok, assessment.apiHealth.reason ?? assessment.apiBaseUrl) : asRuntimeStatus(\"ArtBot API\", false, \"checking\"),\n worker:\n assessment && assessment.apiHealth.ok\n ? { label: \"Worker\", state: \"healthy\", detail: \"assumed with local backend\", tone: \"success\" }\n : { label: \"Worker\", state: \"unknown\", detail: \"verify with /doctor\", tone: \"muted\" },\n auth:\n assessment\n ? {\n label: \"Auth\",\n state: assessment.authProfilesError ? \"offline\" : assessment.sessionStates.some((session) => session.exists && !session.expired) ? \"healthy\" : \"degraded\",\n detail: assessment.authProfilesError?.message ?? `${assessment.profiles.length} profiles`,\n tone: assessment.authProfilesError ? \"danger\" : assessment.sessionStates.some((session) => session.exists && !session.expired) ? \"success\" : \"warning\"\n }\n : { label: \"Auth\", state: \"unknown\", detail: \"checking\", tone: \"muted\" },\n licensed: {\n label: \"Licensed\",\n state: context.defaults.allowLicensed ? \"healthy\" : \"degraded\",\n detail:\n context.defaults.licensedIntegrations.length > 0\n ? context.defaults.licensedIntegrations.join(\", \")\n : \"none\",\n tone: context.defaults.allowLicensed ? \"success\" : \"warning\"\n },\n model: assessment?.llmHealth.modelId,\n apiBaseUrl: context.apiBaseUrl,\n llmBaseUrl: assessment?.llmBaseUrl\n },\n progress: {\n runId,\n artistName: activeArtist || \"n/a\",\n status:\n details?.run?.status === \"completed\"\n ? \"completed\"\n : details?.run?.status === \"failed\"\n ? \"failed\"\n : details?.run?.status === \"running\"\n ? \"running\"\n : details?.run?.status === \"pending\"\n ? \"queued\"\n : \"idle\",\n stages: [\n {\n id: \"queue\",\n label: \"Queue\",\n state: details?.run?.status ? (details.run.status === \"pending\" ? \"running\" : \"done\") : \"pending\"\n },\n {\n id: \"scan\",\n label: \"Scan sources\",\n state: details?.run?.status === \"running\" ? \"running\" : summary ? \"done\" : \"pending\"\n },\n {\n id: \"analyze\",\n label: \"Analyze\",\n state: summary ? (details?.run?.status === \"completed\" ? \"done\" : \"running\") : \"pending\"\n },\n {\n id: \"report\",\n label: \"Report\",\n state: details?.run?.status === \"completed\" ? \"done\" : details?.run?.status === \"failed\" ? \"failed\" : \"pending\"\n }\n ],\n summaryLines: [\n summary ? `Accepted: ${summary.accepted_records}` : \"Accepted: n/a\",\n summary ? `Valuation eligible: ${summary.valuation_eligible_records ?? 0}` : \"Valuation eligible: n/a\",\n summary ? `Priced coverage: ${Math.round((summary.priced_crawled_source_coverage_ratio ?? summary.priced_source_coverage_ratio ?? 0) * 100)}%` : \"Priced coverage: n/a\"\n ],\n blockerSummary: blockerSummary(details),\n tick,\n elapsed: runStartedAt ? Math.floor((Date.now() - runStartedAt) / 1000) : undefined\n },\n report: {\n artistName: activeArtist || \"No active research\",\n runId,\n overview: [\n { label: \"Accepted\", value: String(summary?.accepted_records ?? 0), tone: \"success\" },\n { label: \"URLs Crawled\", value: String(summary?.total_attempts ?? 0), tone: \"muted\" },\n {\n label: \"Coverage\",\n value: `${Math.round((summary?.priced_crawled_source_coverage_ratio ?? summary?.priced_source_coverage_ratio ?? 0) * 100)}%`,\n tone: (summary?.priced_crawled_source_coverage_ratio ?? 0) >= 0.7 ? \"success\" : \"warning\"\n }\n ],\n sourceCoverage: [\n { label: \"Platforms\", value: String(Object.keys(summary?.source_candidate_breakdown ?? {}).length), tone: \"accent\" },\n { label: \"Public\", value: String(summary?.source_status_breakdown?.public_access ?? 0), tone: \"success\" },\n { label: \"Blocked\", value: String(summary?.source_status_breakdown?.blocked ?? 0), tone: \"danger\" }\n ],\n valuation: [\n { label: \"Blended\", value: rangeLabel(valuation?.blendedRange), tone: valuation?.generated ? \"success\" : \"warning\" },\n { label: \"Turkey\", value: rangeLabel(valuation?.turkeyRange), tone: \"accent\" },\n { label: \"Intl\", value: rangeLabel(valuation?.internationalRange), tone: \"muted\" }\n ],\n acceptedRecords: records.slice(0, 8).map((record) => ({\n price: priceLabel(record),\n priceType: record.price_type,\n workTitle: record.work_title ?? \"Untitled\",\n sourceName: record.source_name,\n detail: [record.sale_or_listing_date, record.dimensions_text, record.year].filter(Boolean).join(\" \u00B7 \")\n })),\n diagnostics: [\n {\n title: detailMode === \"help\" ? \"Commands\" : detailMode === \"setup\" ? \"Setup Issues\" : detailMode === \"auth\" ? \"Auth State\" : detailMode === \"runs\" ? \"Recent Runs\" : \"Run Notes\",\n tone: detailMode === \"setup\" ? \"warning\" : \"muted\",\n lines:\n detailMode === \"help\"\n ? [\n \"/research <artist>\",\n \"/work <artist> --title <title>\",\n \"/setup\",\n \"/auth\",\n \"/doctor\",\n \"/status\",\n \"/runs\",\n \"/help\",\n \"/exit\"\n ]\n : diagnosticsLines.length > 0\n ? diagnosticsLines\n : [\"No detail available.\"]\n }\n ]\n },\n detail: {\n title:\n detailMode === \"auth\"\n ? \"Auth\"\n : detailMode === \"runs\"\n ? \"Runs\"\n : detailMode === \"setup\"\n ? \"Setup\"\n : detailMode === \"help\"\n ? \"Help\"\n : \"Context\",\n subtitle: detailMode === \"setup\" ? \"Run `artbot setup` for the guided wizard and `artbot auth capture <profile>` for login capture.\" : message,\n status: [\n assessment\n ? asRuntimeStatus(\"LM Studio\", assessment.llmHealth.ok, assessment.llmHealth.modelId ?? assessment.llmHealth.reason)\n : asRuntimeStatus(\"LM Studio\", false, \"checking\"),\n assessment\n ? asRuntimeStatus(\"ArtBot API\", assessment.apiHealth.ok, assessment.apiHealth.reason ?? assessment.apiBaseUrl)\n : asRuntimeStatus(\"ArtBot API\", false, \"checking\")\n ],\n details:\n detailMode === \"auth\"\n ? (assessment?.sessionStates.map((session) => ({\n label: session.profileId,\n value: session.exists ? (session.expired ? \"expired\" : \"ready\") : \"missing\",\n tone: session.exists ? (session.expired ? \"warning\" : \"success\") : \"danger\",\n detail: session.storageStatePath\n })) ?? [])\n : detailMode === \"runs\"\n ? recentRuns.slice(0, 6).map((run) => ({\n label: run.id,\n value: run.status,\n tone: run.status === \"completed\" ? \"success\" : run.status === \"failed\" ? \"danger\" : \"accent\",\n detail: run.query.artist\n }))\n : [\n {\n label: \"Mode\",\n value: detailMode,\n tone: detailMode === \"setup\" ? \"warning\" : \"accent\"\n },\n {\n label: \"Artist\",\n value: activeArtist || \"n/a\",\n tone: \"neutral\"\n }\n ],\n blockers: detailMode === \"setup\" ? issueLines : [blockerSummary(details) ?? \"No blockers recorded.\"],\n evidence: details?.attempts?.slice(0, 4).map((attempt) => attempt.source_url) ?? []\n }\n };\n}\n\nfunction parseWorkCommand(value: string): { artist: string; title: string } | null {\n const match = value.match(/^\\/work\\s+(.+?)\\s+--title\\s+(.+)$/i);\n if (!match) return null;\n return {\n artist: match[1].trim(),\n title: match[2].trim()\n };\n}\n\nexport function runInteractiveTui(props: RunInteractiveTuiProps): Promise<number> {\n return new Promise((resolve) => {\n let settled = false;\n const instance = render(\n <InteractiveApp\n {...props}\n onExit={(code) => {\n if (settled) return;\n settled = true;\n instance.unmount();\n resolve(code);\n }}\n />\n );\n });\n}\n\nfunction InteractiveApp({ context, initialAssessment, onExit }: InteractiveAppProps) {\n const { exit } = useApp();\n const [assessment, setAssessment] = useState<SetupAssessment | null>(initialAssessment);\n const [details, setDetails] = useState<PipelineDetails | null>(null);\n const [recentRuns, setRecentRuns] = useState<RunEntity[]>([]);\n const [input, setInput] = useState(\"\");\n const [history, setHistory] = useState<string[]>([]);\n const [detailMode, setDetailMode] = useState<DetailMode>(initialAssessment?.issues.length ? \"setup\" : \"help\");\n const [busy, setBusy] = useState(false);\n const [activeArtist, setActiveArtist] = useState(\"\");\n const [message, setMessage] = useState(\"Slash command ready.\");\n const [tick, setTick] = useState(0);\n const [runStartedAt, setRunStartedAt] = useState<number | null>(null);\n const cancelPollingRef = useRef(false);\n\n useInput((_input, key) => {\n if (key.ctrl && _input === \"c\") {\n exit();\n onExit(0);\n }\n });\n\n // Spinner animation tick \u2014 only runs while pipeline is active\n useEffect(() => {\n if (!busy) return;\n const interval = setInterval(() => setTick((t) => t + 1), 150);\n return () => clearInterval(interval);\n }, [busy]);\n\n const refreshAssessment = useCallback(async () => {\n const next = await assessLocalSetup();\n setAssessment(next);\n return next;\n }, []);\n\n const fetchRecentRuns = useCallback(async () => {\n const headers: Record<string, string> = {};\n if (context.apiKey) headers[\"x-api-key\"] = context.apiKey;\n const response = await fetch(`${context.apiBaseUrl}/runs?limit=8`, { headers });\n if (!response.ok) {\n throw new Error(`Failed to load runs (${response.status})`);\n }\n const payload = (await response.json()) as { runs: RunEntity[] };\n setRecentRuns(payload.runs);\n }, [context.apiBaseUrl, context.apiKey]);\n\n useEffect(() => {\n void (async () => {\n try {\n await refreshAssessment();\n await fetchRecentRuns();\n } catch (error) {\n setMessage(error instanceof Error ? error.message : String(error));\n }\n })();\n }, [fetchRecentRuns, refreshAssessment]);\n\n const startResearch = useCallback(\n async (kind: \"artist\" | \"work\", artist: string, title?: string) => {\n setBusy(true);\n setDetailMode(\"report\");\n setActiveArtist(artist);\n setMessage(`Launching ${kind} research for ${artist}...`);\n setRunStartedAt(Date.now());\n cancelPollingRef.current = false;\n\n try {\n const nextAssessment = await refreshAssessment();\n if (!nextAssessment.apiHealth.ok) {\n setDetailMode(\"setup\");\n setMessage(`ArtBot API offline at ${nextAssessment.apiBaseUrl}. Run /setup or artbot setup.`);\n return;\n }\n\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\"\n };\n if (context.apiKey) headers[\"x-api-key\"] = context.apiKey;\n\n const response = await fetch(`${context.apiBaseUrl}/research/${kind}`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n query: {\n artist,\n title,\n scope: \"turkey_plus_international\",\n turkeyFirst: true,\n analysisMode: context.defaults.analysisMode,\n priceNormalization: context.defaults.priceNormalization,\n authProfileId: context.defaults.authProfileId,\n manualLoginCheckpoint: false,\n allowLicensed: context.defaults.allowLicensed,\n licensedIntegrations: context.defaults.licensedIntegrations\n }\n })\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Research request failed (${response.status}): ${text.slice(0, 200)}`);\n }\n\n const created = (await response.json()) as { runId: string; status: string };\n setDetails({\n run: {\n id: created.runId,\n status: created.status\n }\n });\n setMessage(`Run created: ${created.runId}`);\n\n while (!cancelPollingRef.current) {\n const detailResponse = await fetch(`${context.apiBaseUrl}/runs/${created.runId}`, {\n headers: context.apiKey ? { \"x-api-key\": context.apiKey } : undefined\n });\n if (!detailResponse.ok) {\n throw new Error(`Failed to poll run ${created.runId} (${detailResponse.status})`);\n }\n\n const nextDetails = (await detailResponse.json()) as PipelineDetails;\n setDetails(nextDetails);\n\n const status = nextDetails.run?.status;\n if (status === \"completed\" || status === \"failed\") {\n if (status === \"completed\") {\n const s = nextDetails.summary;\n const accepted = s?.accepted_records ?? 0;\n const coverage = Math.round((s?.priced_crawled_source_coverage_ratio ?? s?.priced_source_coverage_ratio ?? 0) * 100);\n setMessage(`\u2713 Run completed \u2014 ${accepted} accepted, ${coverage}% coverage`);\n } else {\n setMessage(`\u2717 Run failed: ${created.runId}`);\n }\n break;\n }\n\n await new Promise((resolve) => setTimeout(resolve, 2000));\n }\n\n await fetchRecentRuns();\n } finally {\n setBusy(false);\n }\n },\n [context.apiBaseUrl, context.apiKey, context.defaults, fetchRecentRuns, refreshAssessment]\n );\n\n const handleSubmit = useCallback(\n async (value: string) => {\n const trimmed = value.trim();\n if (!trimmed) return;\n\n setHistory((current) => [trimmed, ...current].slice(0, 8));\n setInput(\"\");\n\n try {\n if (!trimmed.startsWith(\"/\")) {\n await startResearch(\"artist\", trimmed);\n return;\n }\n\n if (trimmed === \"/exit\") {\n cancelPollingRef.current = true;\n exit();\n onExit(0);\n return;\n }\n\n if (trimmed === \"/help\") {\n setDetailMode(\"help\");\n setMessage(\"Command reference loaded.\");\n return;\n }\n\n if (trimmed === \"/status\" || trimmed === \"/doctor\") {\n setDetailMode(trimmed === \"/status\" ? \"status\" : \"setup\");\n await refreshAssessment();\n setMessage(\"Environment status refreshed.\");\n return;\n }\n\n if (trimmed === \"/setup\") {\n setDetailMode(\"setup\");\n await refreshAssessment();\n setMessage(\"Setup diagnostics loaded. Run `artbot setup` for the guided wizard.\");\n return;\n }\n\n if (trimmed === \"/auth\") {\n setDetailMode(\"auth\");\n await refreshAssessment();\n setMessage(\"Auth profile status loaded.\");\n return;\n }\n\n if (trimmed === \"/runs\") {\n setDetailMode(\"runs\");\n await fetchRecentRuns();\n setMessage(\"Recent runs loaded.\");\n return;\n }\n\n if (trimmed.startsWith(\"/research \")) {\n await startResearch(\"artist\", trimmed.slice(\"/research \".length).trim());\n return;\n }\n\n const workCommand = parseWorkCommand(trimmed);\n if (workCommand) {\n await startResearch(\"work\", workCommand.artist, workCommand.title);\n return;\n }\n\n setMessage(`Unknown command: ${trimmed}`);\n } catch (error) {\n setMessage(error instanceof Error ? error.message : String(error));\n }\n },\n [exit, fetchRecentRuns, onExit, refreshAssessment, startResearch]\n );\n\n const model = useMemo(\n () =>\n buildModel({\n assessment,\n details,\n recentRuns,\n activeArtist,\n input,\n history,\n detailMode,\n busy,\n message,\n context,\n tick,\n runStartedAt\n }),\n [activeArtist, assessment, busy, context, detailMode, details, history, input, message, recentRuns, tick, runStartedAt]\n );\n\n const messageColor = message.startsWith(\"\u2717\") || message.startsWith(\"Failed\") || message.includes(\"error\")\n ? \"red\"\n : message.startsWith(\"\u2713\")\n ? \"green\"\n : \"gray\";\n\n return (\n <Box flexDirection=\"column\">\n <RenderTuiNode node={ArtbotTuiShell({ model })} />\n\n {/* \u2500\u2500 Command input (Vercel-style) \u2500\u2500 */}\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1}>\n <Text color=\"cyan\" bold>\n \u276F\n </Text>\n <Box marginLeft={1} flexGrow={1}>\n <TextInput value={input} onChange={setInput} onSubmit={handleSubmit} placeholder=\"/research <artist>\" />\n </Box>\n </Box>\n\n {/* \u2500\u2500 Status message + keyboard shortcuts (k9s / lazygit style) \u2500\u2500 */}\n <Box justifyContent=\"space-between\">\n {message && message !== \"Slash command ready.\" ? (\n <Text color={messageColor} dimColor>\n {message}\n </Text>\n ) : (\n <Text>{\" \"}</Text>\n )}\n <Box gap={2}>\n <Text>\n <Text color=\"cyan\" bold>[/r]</Text>\n <Text color=\"gray\"> research</Text>\n </Text>\n <Text>\n <Text color=\"cyan\" bold>[/s]</Text>\n <Text color=\"gray\"> setup</Text>\n </Text>\n <Text>\n <Text color=\"cyan\" bold>[/h]</Text>\n <Text color=\"gray\"> help</Text>\n </Text>\n <Text>\n <Text color=\"cyan\" bold>[^c]</Text>\n <Text color=\"gray\"> quit</Text>\n </Text>\n </Box>\n </Box>\n </Box>\n );\n}\n", "import type {\n TuiCommandHint,\n TuiDividerNode,\n TuiKeyHintNode,\n TuiListItemNode,\n TuiListNode,\n TuiMetricNode,\n TuiNode,\n TuiPanelNode,\n TuiProgressBarNode,\n TuiSplitNode,\n TuiSpacerNode,\n TuiStackNode,\n TuiTableColumn,\n TuiTableNode,\n TuiTextNode,\n TuiTone\n} from \"./types.js\";\n\nexport function text(text: string, tone: TuiTone = \"neutral\", weight: TuiTextNode[\"weight\"] = \"normal\"): TuiTextNode {\n return { kind: \"text\", text, tone, weight };\n}\n\nexport function spacer(size = 1): TuiSpacerNode {\n return { kind: \"spacer\", size };\n}\n\nexport function divider(label?: string, tone: TuiTone = \"muted\"): TuiDividerNode {\n return { kind: \"divider\", label, tone };\n}\n\nexport function panel(title: string | undefined, children: TuiNode[], options: Partial<Pick<TuiPanelNode, \"subtitle\" | \"accent\" | \"width\">> = {}): TuiPanelNode {\n return {\n kind: \"panel\",\n title,\n subtitle: options.subtitle,\n accent: options.accent,\n width: options.width,\n children\n };\n}\n\nexport function split(direction: TuiSplitNode[\"direction\"], children: [TuiNode, TuiNode], ratios?: [number, number]): TuiSplitNode {\n return {\n kind: \"split\",\n direction,\n ratios,\n children\n };\n}\n\nexport function stack(direction: TuiStackNode[\"direction\"], children: TuiNode[], gap = 1): TuiStackNode {\n return {\n kind: \"stack\",\n direction,\n gap,\n children\n };\n}\n\nexport function metric(label: string, value: string, tone: TuiTone = \"neutral\", hint?: string): TuiMetricNode {\n return {\n kind: \"metric\",\n label,\n value,\n tone,\n hint\n };\n}\n\nexport function list(title: string | undefined, items: TuiListItemNode[]): TuiListNode {\n return {\n kind: \"list\",\n title,\n items\n };\n}\n\nexport function listItem(label: string, value?: string, tone: TuiTone = \"neutral\", detail?: string): TuiListItemNode {\n return {\n kind: \"list-item\",\n label,\n value,\n tone,\n detail\n };\n}\n\nexport function commandHint(command: string, description: string, tone: TuiTone = \"accent\"): TuiCommandHint {\n return { command, description, tone };\n}\n\nexport function clampRatio(value: number): number {\n return Math.min(1, Math.max(0, value));\n}\n\nexport function percent(value?: number | null): string {\n if (value == null || !Number.isFinite(value)) return \"n/a\";\n return `${Math.round(clampRatio(value) * 100)}%`;\n}\n\nexport function formatMaybeNumber(value?: number | null, suffix = \"\"): string {\n if (value == null || !Number.isFinite(value)) return \"n/a\";\n return `${value.toLocaleString(\"en-US\")}${suffix}`;\n}\n\nexport function table(columns: TuiTableColumn[], rows: TuiTableNode[\"rows\"]): TuiTableNode {\n return { kind: \"table\", columns, rows };\n}\n\nexport function progressBar(value: number, tone: TuiTone = \"accent\", label?: string, width?: number): TuiProgressBarNode {\n return { kind: \"progress-bar\", value: Math.min(1, Math.max(0, value)), tone, label, width };\n}\n\nexport function keyHint(keys: TuiKeyHintNode[\"keys\"]): TuiKeyHintNode {\n return { kind: \"key-hint\", keys };\n}\n\nexport function formatElapsed(seconds: number): string {\n if (seconds < 60) return `${seconds}s`;\n const m = Math.floor(seconds / 60);\n const s = seconds % 60;\n return s > 0 ? `${m}m ${s}s` : `${m}m`;\n}\n", "import { stack, text } from \"./helpers.js\";\nimport type { TuiComponent, TuiNode, TuiStatusRailModel, TuiTone } from \"./types.js\";\n\nfunction statusDot(state: \"healthy\" | \"degraded\" | \"offline\" | \"unknown\"): { symbol: string; tone: TuiTone } {\n switch (state) {\n case \"healthy\":\n return { symbol: \"\u25CF\", tone: \"success\" };\n case \"degraded\":\n return { symbol: \"\u25CF\", tone: \"warning\" };\n case \"offline\":\n return { symbol: \"\u25CF\", tone: \"danger\" };\n default:\n return { symbol: \"\u25CB\", tone: \"muted\" };\n }\n}\n\nfunction statusEntry(name: string, status: TuiStatusRailModel[\"llm\"]): TuiNode {\n const dot = statusDot(status.state);\n const detail = status.detail ? `: ${status.detail}` : \"\";\n return text(`${dot.symbol} ${name}${detail}`, dot.tone);\n}\n\nexport const StatusRail: TuiComponent<TuiStatusRailModel> = (props) =>\n stack(\"column\", [\n stack(\"row\", [statusEntry(\"LM Studio\", props.llm), statusEntry(\"API\", props.api), statusEntry(\"Worker\", props.worker)], 3),\n stack(\"row\", [statusEntry(\"Auth\", props.auth), statusEntry(\"Licensed\", props.licensed)], 3)\n ]);\n\nStatusRail.displayName = \"StatusRail\";\n", "import { commandHint, text } from \"./helpers.js\";\nimport type { TuiCommandState, TuiComponent } from \"./types.js\";\n\nexport interface CommandBarProps {\n command: TuiCommandState;\n}\n\nexport const CommandBar: TuiComponent<CommandBarProps> = ({ command }) =>\n text(\n command.mode === \"running\"\n ? \"Running pipeline...\"\n : command.mode === \"setup\"\n ? \"Setup mode \u2014 run /setup to configure\"\n : \"Type /research <artist> or artist name. /help for all commands.\",\n command.mode === \"running\" ? \"accent\" : \"muted\",\n \"dim\"\n );\n\nCommandBar.displayName = \"CommandBar\";\n\nexport function buildDefaultCommandHints(): ReturnType<typeof commandHint>[] {\n return [\n commandHint(\"/research <artist>\", \"Start artist price research\"),\n commandHint(\"/work <artist> --title <title>\", \"Start work-specific research\"),\n commandHint(\"/setup\", \"Verify LM Studio, API, worker, and auth\"),\n commandHint(\"/auth\", \"Inspect or capture browser session state\"),\n commandHint(\"/doctor\", \"Run a local environment health check\"),\n commandHint(\"/runs\", \"Inspect recent or active runs\")\n ];\n}\n", "import { formatElapsed, progressBar, spacer, stack, text } from \"./helpers.js\";\nimport type { TuiComponent, TuiNode, TuiRunProgressModel, TuiTone } from \"./types.js\";\n\nconst SPINNER = [\"\u280B\", \"\u2819\", \"\u2839\", \"\u2838\", \"\u283C\", \"\u2834\", \"\u2826\", \"\u2827\", \"\u2807\", \"\u280F\"];\n\nfunction stageIcon(state: string, tick: number): { symbol: string; tone: TuiTone } {\n switch (state) {\n case \"done\":\n return { symbol: \"\u2713\", tone: \"success\" };\n case \"running\":\n return { symbol: SPINNER[tick % SPINNER.length], tone: \"accent\" };\n case \"blocked\":\n return { symbol: \"!\", tone: \"warning\" };\n case \"failed\":\n return { symbol: \"\u2717\", tone: \"danger\" };\n default:\n return { symbol: \"\u25CB\", tone: \"muted\" };\n }\n}\n\nexport interface RunProgressViewProps {\n progress: TuiRunProgressModel;\n}\n\nexport const RunProgressView: TuiComponent<RunProgressViewProps> = ({ progress }) => {\n const tick = progress.tick ?? 0;\n\n if (progress.status === \"idle\") {\n return text(\" No active research. Type /research <artist> to begin.\", \"muted\", \"dim\");\n }\n\n const isActive = progress.status === \"running\" || progress.status === \"queued\";\n\n const stateTone: TuiTone =\n progress.status === \"running\"\n ? \"accent\"\n : progress.status === \"completed\"\n ? \"success\"\n : progress.status === \"failed\"\n ? \"danger\"\n : \"muted\";\n\n const statusIcon =\n progress.status === \"completed\"\n ? \"\u2713\"\n : progress.status === \"failed\"\n ? \"\u2717\"\n : isActive\n ? SPINNER[tick % SPINNER.length]\n : \"\u25B6\";\n\n // \u2500\u2500 Header line: icon + artist + status + elapsed \u2500\u2500\n const headerParts: TuiNode[] = [\n text(`${statusIcon} ${progress.artistName ?? \"n/a\"}`, stateTone, \"strong\"),\n text(progress.status.toUpperCase(), stateTone, \"strong\")\n ];\n if (progress.elapsed != null) {\n headerParts.push(text(formatElapsed(progress.elapsed), \"muted\", \"dim\"));\n }\n\n const lines: TuiNode[] = [\n stack(\"row\", headerParts, 2),\n text(` ${progress.runId ?? \"n/a\"}`, \"muted\", \"dim\")\n ];\n\n // \u2500\u2500 Progress bar (Turborepo-style) \u2500\u2500\n const doneCount = progress.stages.filter((s) => s.state === \"done\").length;\n const total = progress.stages.length;\n const ratio = total > 0 ? doneCount / total : 0;\n const barLabel = isActive && progress.elapsed != null ? formatElapsed(progress.elapsed) + \" elapsed\" : undefined;\n\n lines.push(spacer(1));\n lines.push(\n progressBar(\n progress.status === \"completed\" ? 1 : progress.status === \"failed\" ? ratio : ratio,\n progress.status === \"completed\" ? \"success\" : progress.status === \"failed\" ? \"danger\" : \"accent\",\n barLabel\n )\n );\n\n // \u2500\u2500 Stages \u2500\u2500\n lines.push(spacer(1));\n if (isActive) {\n // Vertical when running \u2014 shows which step is active\n for (const stage of progress.stages) {\n const icon = stageIcon(stage.state, tick);\n const stateLabel = stage.state === \"running\" ? \"running...\" : stage.state;\n lines.push(stack(\"row\", [text(` ${icon.symbol} ${stage.label}`, icon.tone), text(stateLabel, icon.tone, \"dim\")], 1));\n }\n } else {\n // Compact horizontal when completed/failed\n const stages: TuiNode[] = [];\n for (let i = 0; i < progress.stages.length; i++) {\n const stage = progress.stages[i];\n const icon = stageIcon(stage.state, tick);\n stages.push(text(`${icon.symbol} ${stage.label}`, icon.tone));\n if (i < progress.stages.length - 1) {\n stages.push(text(\"\u2192\", \"muted\", \"dim\"));\n }\n }\n lines.push(stack(\"row\", stages, 1));\n }\n\n // \u2500\u2500 Summary stats \u2500\u2500\n if (progress.summaryLines.length > 0) {\n lines.push(spacer(1));\n lines.push(text(` ${progress.summaryLines.join(\" \u00B7 \")}`, \"muted\"));\n }\n\n if (progress.blockerSummary) {\n lines.push(text(` \u26A0 ${progress.blockerSummary}`, \"warning\"));\n }\n\n return stack(\"column\", lines, 0);\n};\n\nRunProgressView.displayName = \"RunProgressView\";\n", "import { spacer, stack, table, text } from \"./helpers.js\";\nimport type { TuiComponent, TuiNode, TuiReportWorkspaceModel, TuiTone } from \"./types.js\";\n\nfunction recordTone(priceType: string): TuiTone {\n switch (priceType) {\n case \"hammer_price\":\n case \"realized_price\":\n case \"realized_with_buyers_premium\":\n return \"success\";\n case \"asking_price\":\n return \"accent\";\n case \"estimate\":\n return \"warning\";\n default:\n return \"muted\";\n }\n}\n\nexport interface ReportWorkspaceProps {\n report: TuiReportWorkspaceModel;\n}\n\nexport const ReportWorkspace: TuiComponent<ReportWorkspaceProps> = ({ report }) => {\n const lines: TuiNode[] = [];\n\n // \u2500\u2500 Inline metrics \u2500\u2500\n const coverageText = report.sourceCoverage.map((e) => `${e.label}: ${e.value}`).join(\" \u00B7 \");\n lines.push(text(` Sources ${coverageText}`, \"muted\"));\n\n const valuationText = report.valuation.map((e) => `${e.label}: ${e.value}`).join(\" \u00B7 \");\n lines.push(text(` Values ${valuationText}`, \"muted\"));\n\n // \u2500\u2500 Comparables table (gh-style) \u2500\u2500\n if (report.acceptedRecords.length > 0) {\n lines.push(spacer(1));\n\n const columns = [\n { key: \"price\", label: \"Price\", width: 14, tone: \"neutral\" as TuiTone },\n { key: \"title\", label: \"Title\", width: 34, tone: \"neutral\" as TuiTone },\n { key: \"source\", label: \"Source\", width: 22, tone: \"muted\" as TuiTone },\n { key: \"detail\", label: \"Date / Info\", width: 20, tone: \"muted\" as TuiTone }\n ];\n\n const rows = report.acceptedRecords.map((record) => ({\n price: { text: record.price, tone: recordTone(record.priceType) },\n title: { text: record.workTitle, tone: \"neutral\" as TuiTone },\n source: { text: record.sourceName, tone: \"muted\" as TuiTone },\n detail: { text: record.detail ?? \"\", tone: \"muted\" as TuiTone }\n }));\n\n lines.push(table(columns, rows));\n }\n\n if (lines.length === 0) {\n return text(\" No results yet.\", \"muted\", \"dim\");\n }\n\n return stack(\"column\", lines, 0);\n};\n\nReportWorkspace.displayName = \"ReportWorkspace\";\n", "import { stack, text } from \"./helpers.js\";\nimport type { TuiComponent, TuiNode, TuiSideDetailModel } from \"./types.js\";\n\nexport interface SideDetailPaneProps {\n detail: TuiSideDetailModel;\n}\n\nexport const SideDetailPane: TuiComponent<SideDetailPaneProps> = ({ detail }) => {\n const lines: TuiNode[] = [];\n\n for (const blocker of detail.blockers) {\n if (blocker && blocker !== \"No blockers recorded.\") {\n lines.push(text(`\u26A0 ${blocker}`, \"warning\"));\n }\n }\n\n for (const url of detail.evidence) {\n lines.push(text(url, \"muted\", \"dim\"));\n }\n\n if (lines.length === 0) {\n return text(\"No evidence collected yet.\", \"muted\", \"dim\");\n }\n\n return stack(\"column\", lines, 0);\n};\n\nSideDetailPane.displayName = \"SideDetailPane\";\n", "import { divider, panel, spacer, text } from \"./helpers.js\";\nimport { CommandBar } from \"./command-bar.js\";\nimport { ReportWorkspace } from \"./report-workspace.js\";\nimport { RunProgressView } from \"./run-progress-view.js\";\nimport { StatusRail } from \"./status-rail.js\";\nimport type { TuiAppModel, TuiComponent, TuiNode } from \"./types.js\";\n\nexport interface ArtbotTuiShellProps {\n model: TuiAppModel;\n}\n\nexport const ArtbotTuiShell: TuiComponent<ArtbotTuiShellProps> = ({ model }) => {\n const children: TuiNode[] = [];\n\n // \u2500\u2500 Status bar (always visible) \u2500\u2500\n children.push(StatusRail(model.status));\n\n // \u2500\u2500 Pipeline (always visible) \u2500\u2500\n children.push(divider(\"Pipeline\"));\n children.push(RunProgressView({ progress: model.progress }));\n\n // \u2500\u2500 Results (only when a run exists) \u2500\u2500\n const hasRun = model.progress.status !== \"idle\";\n if (hasRun) {\n children.push(divider(\"Results\"));\n children.push(ReportWorkspace({ report: model.report }));\n }\n\n // \u2500\u2500 Evidence URLs (only when there are any) \u2500\u2500\n if (model.detail.evidence.length > 0) {\n children.push(divider(\"Evidence\"));\n for (const url of model.detail.evidence) {\n children.push(text(` ${url}`, \"muted\", \"dim\"));\n }\n }\n\n // \u2500\u2500 Contextual notes (setup issues, run notes, etc.) \u2500\u2500\n // Rendered once here to avoid duplication across sub-components\n for (const section of model.report.diagnostics) {\n const skip = new Set([\"No detail available.\", \"No additional diagnostics.\", \"Slash command ready.\"]);\n const meaningful = section.lines.filter((l) => !skip.has(l));\n if (meaningful.length > 0) {\n children.push(divider(section.title));\n for (const line of meaningful) {\n const tone = section.tone === \"warning\" ? (\"warning\" as const) : (\"muted\" as const);\n children.push(text(` ${line}`, tone));\n }\n }\n }\n\n // \u2500\u2500 Command hint \u2500\u2500\n children.push(spacer(1));\n children.push(CommandBar({ command: model.command }));\n\n return panel(model.title, children, { accent: \"accent\", subtitle: model.subtitle });\n};\n\nArtbotTuiShell.displayName = \"ArtbotTuiShell\";\n", "import React, { Fragment } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { ReactNode } from \"react\";\nimport type {\n TuiDividerNode,\n TuiKeyHintNode,\n TuiListNode,\n TuiMetricNode,\n TuiNode,\n TuiPanelNode,\n TuiProgressBarNode,\n TuiSpacerNode,\n TuiStackNode,\n TuiTableNode,\n TuiTextNode,\n TuiTone\n} from \"./types.js\";\n\nfunction toneColor(tone: TuiTone | undefined): string {\n switch (tone) {\n case \"accent\":\n return \"cyan\";\n case \"success\":\n return \"green\";\n case \"warning\":\n return \"yellow\";\n case \"danger\":\n return \"red\";\n case \"muted\":\n return \"gray\";\n case \"inverse\":\n return \"black\";\n default:\n return \"white\";\n }\n}\n\nfunction renderText(node: TuiTextNode, key: string): ReactNode {\n return (\n <Text key={key} color={toneColor(node.tone)} dimColor={node.weight === \"dim\"} bold={node.weight === \"strong\"}>\n {node.text}\n </Text>\n );\n}\n\nfunction renderSpacer(node: TuiSpacerNode, key: string): ReactNode {\n return (\n <Text key={key}>\n {\"\\n\".repeat(Math.max(1, node.size))}\n </Text>\n );\n}\n\nfunction renderDivider(node: TuiDividerNode, key: string): ReactNode {\n return (\n <Text key={key} color={toneColor(node.tone)} dimColor>\n {node.label ? `\u2500\u2500 ${node.label} ${\"\u2500\".repeat(Math.max(8, 28 - node.label.length))}` : \"\u2500\".repeat(32)}\n </Text>\n );\n}\n\nfunction renderMetric(node: TuiMetricNode, key: string): ReactNode {\n return (\n <Box key={key} flexDirection=\"column\" borderStyle=\"round\" borderColor={toneColor(node.tone)} paddingX={1} marginRight={1}>\n <Text color=\"gray\">{node.label}</Text>\n <Text color={toneColor(node.tone)} bold>\n {node.value}\n </Text>\n {node.hint ? (\n <Text color=\"gray\" dimColor>\n {node.hint}\n </Text>\n ) : null}\n </Box>\n );\n}\n\nfunction renderList(node: TuiListNode, key: string): ReactNode {\n return (\n <Box key={key} flexDirection=\"column\" marginRight={1}>\n {node.title ? (\n <Text color=\"gray\" bold>\n {node.title}\n </Text>\n ) : null}\n {node.items.map((item, index) => (\n <Box key={`${key}-item-${index}`} flexDirection=\"column\" marginBottom={item.detail ? 1 : 0}>\n <Text color={toneColor(item.tone)}>\n {item.label}\n {item.value ? <Text color=\"white\">: {item.value}</Text> : null}\n </Text>\n {item.detail ? (\n <Text color=\"gray\" dimColor>\n {item.detail}\n </Text>\n ) : null}\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction renderStack(node: TuiStackNode, key: string): ReactNode {\n return (\n <Box key={key} flexDirection={node.direction}>\n {node.children.map((child, index) => (\n <Box\n key={`${key}-child-${index}`}\n marginRight={node.direction === \"row\" && index < node.children.length - 1 ? node.gap ?? 1 : 0}\n marginBottom={node.direction === \"column\" && index < node.children.length - 1 ? node.gap ?? 1 : 0}\n >\n <RenderTuiNode node={child} />\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction renderSplit(node: Extract<TuiNode, { kind: \"split\" }>, key: string): ReactNode {\n return (\n <Box key={key} flexDirection={node.direction}>\n {node.children.map((child, index) => (\n <Box key={`${key}-split-${index}`} flexGrow={node.ratios?.[index] ?? 1} marginRight={node.direction === \"row\" && index === 0 ? 1 : 0}>\n <RenderTuiNode node={child} />\n </Box>\n ))}\n </Box>\n );\n}\n\nfunction renderPanel(node: TuiPanelNode, key: string): ReactNode {\n return (\n <Box key={key} flexDirection=\"column\" borderStyle=\"round\" borderColor={toneColor(node.accent)} paddingX={1} paddingY={0} width={node.width}>\n {node.title ? (\n <Text color={toneColor(node.accent)} bold>\n {node.title}\n </Text>\n ) : null}\n {node.subtitle ? (\n <Text color=\"gray\" dimColor>\n {node.subtitle}\n </Text>\n ) : null}\n {node.children.map((child, index) => (\n <Fragment key={`${key}-panel-${index}`}>\n <RenderTuiNode node={child} />\n </Fragment>\n ))}\n </Box>\n );\n}\n\n/* \u2500\u2500 Table \u2500\u2500 (gh / npm audit style) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nfunction renderTable(node: TuiTableNode, key: string): ReactNode {\n if (node.rows.length === 0) return null;\n return (\n <Box key={key} flexDirection=\"column\">\n {/* Header row */}\n <Box>\n {node.columns.map((col, i) => (\n <Box key={`${key}-hdr-${i}`} width={col.width} marginRight={1}>\n <Text color=\"gray\" bold>\n {col.label}\n </Text>\n </Box>\n ))}\n </Box>\n {/* Separator */}\n <Box>\n {node.columns.map((col, i) => (\n <Box key={`${key}-sep-${i}`} width={col.width} marginRight={1}>\n <Text color=\"gray\" dimColor>\n {\"\u2500\".repeat(Math.min(col.width, col.label.length + 2))}\n </Text>\n </Box>\n ))}\n </Box>\n {/* Data rows */}\n {node.rows.map((row, ri) => (\n <Box key={`${key}-row-${ri}`}>\n {node.columns.map((col, ci) => {\n const cell = row[col.key];\n return (\n <Box key={`${key}-cell-${ri}-${ci}`} width={col.width} marginRight={1}>\n <Text color={toneColor(cell?.tone ?? col.tone)} wrap=\"truncate\">\n {cell?.text ?? \"\"}\n </Text>\n </Box>\n );\n })}\n </Box>\n ))}\n </Box>\n );\n}\n\n/* \u2500\u2500 Progress Bar \u2500\u2500 (Turborepo / Vercel style) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nfunction renderProgressBar(node: TuiProgressBarNode, key: string): ReactNode {\n const width = node.width ?? 24;\n const filled = Math.round(node.value * width);\n const empty = width - filled;\n const pct = Math.round(node.value * 100);\n\n return (\n <Box key={key}>\n <Text color={toneColor(node.tone)}>\n {\"\u2588\".repeat(filled)}\n </Text>\n <Text color=\"gray\" dimColor>\n {\"\u2591\".repeat(empty)}\n </Text>\n <Text color=\"gray\">\n {\" \"}\n {pct}%\n </Text>\n {node.label ? (\n <Text color=\"gray\" dimColor>\n {\" \"}\n {node.label}\n </Text>\n ) : null}\n </Box>\n );\n}\n\n/* \u2500\u2500 Key Hint strip \u2500\u2500 (k9s / lazygit style) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\nfunction renderKeyHint(node: TuiKeyHintNode, key: string): ReactNode {\n return (\n <Box key={key} flexDirection=\"row\" gap={2}>\n {node.keys.map((k, i) => (\n <Box key={`${key}-kh-${i}`}>\n <Text color={toneColor(k.tone ?? \"accent\")} bold>\n [{k.key}]\n </Text>\n <Text color=\"gray\">\n {\" \"}\n {k.label}\n </Text>\n </Box>\n ))}\n </Box>\n );\n}\n\nexport function RenderTuiNode({ node }: { node: TuiNode }): ReactNode {\n switch (node.kind) {\n case \"text\":\n return renderText(node, \"text\");\n case \"spacer\":\n return renderSpacer(node, \"spacer\");\n case \"divider\":\n return renderDivider(node, \"divider\");\n case \"metric\":\n return renderMetric(node, \"metric\");\n case \"list\":\n return renderList(node, \"list\");\n case \"stack\":\n return renderStack(node, \"stack\");\n case \"split\":\n return renderSplit(node, \"split\");\n case \"panel\":\n return renderPanel(node, \"panel\");\n case \"table\":\n return renderTable(node, \"table\");\n case \"progress-bar\":\n return renderProgressBar(node, \"progress-bar\");\n case \"key-hint\":\n return renderKeyHint(node, \"key-hint\");\n default:\n return null;\n }\n}\n", "import { pathExists } from \"./lib/file-system.js\";\nimport { runInteractiveTui } from \"./interactive-app.js\";\nimport { assessLocalSetup, runSetupWizard } from \"./setup/index.js\";\n\ninterface InteractiveContext {\n apiBaseUrl: string;\n apiKey?: string;\n}\n\ninterface PipelineEnvDefaults {\n analysisMode: \"comprehensive\" | \"balanced\" | \"fast\";\n priceNormalization: \"legacy\" | \"usd_dual\" | \"usd_nominal\" | \"usd_2026\";\n authProfileId?: string;\n allowLicensed: boolean;\n licensedIntegrations: string[];\n transportMaxAttempts: number;\n transportRequestTimeoutMs: number;\n transportCurlFallback: boolean;\n pipelineConcurrency: {\n healthy: number;\n degraded: number;\n suspected: number;\n };\n pipelineCandidateTimeoutMs: number;\n}\n\ninterface PipelineDetails {\n run?: { status?: string };\n summary?: unknown;\n records?: unknown[];\n duplicates?: unknown[];\n valuation?: unknown;\n per_painting_stats?: unknown[];\n attempts?: Array<{\n source_url: string;\n source_access_status: string;\n blocker_reason?: string | null;\n extracted_fields?: Record<string, unknown>;\n }>;\n}\n\ninterface BlockerSummary {\n category: string;\n count: number;\n hosts: string[];\n}\n\ntype PipelineAttempt = NonNullable<PipelineDetails[\"attempts\"]>[number];\n\nfunction resolveContext(): InteractiveContext {\n return {\n apiBaseUrl: process.env.API_BASE_URL ?? \"http://localhost:4000\",\n apiKey: process.env.ARTBOT_API_KEY\n };\n}\n\nfunction toPositiveInt(value: string | undefined, fallback: number): number {\n const parsed = Number(value ?? fallback);\n if (!Number.isFinite(parsed) || parsed <= 0) return fallback;\n return Math.floor(parsed);\n}\n\nfunction parseBoolean(value: string | undefined, fallback: boolean): boolean {\n if (value === undefined) return fallback;\n return value.trim().toLowerCase() === \"true\";\n}\n\nexport function resolvePipelineDefaultsFromEnv(): PipelineEnvDefaults {\n const rawLicensed = process.env.DEFAULT_LICENSED_INTEGRATIONS ?? \"\";\n const licensedIntegrations = rawLicensed\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean);\n\n return {\n analysisMode:\n (process.env.DEFAULT_ANALYSIS_MODE as PipelineEnvDefaults[\"analysisMode\"] | undefined) ?? \"comprehensive\",\n priceNormalization:\n (process.env.DEFAULT_PRICE_NORMALIZATION as PipelineEnvDefaults[\"priceNormalization\"] | undefined) ?? \"usd_dual\",\n authProfileId: process.env.DEFAULT_AUTH_PROFILE?.trim() || undefined,\n allowLicensed: parseBoolean(process.env.ENABLE_LICENSED_INTEGRATIONS, false),\n licensedIntegrations,\n transportMaxAttempts: toPositiveInt(process.env.TRANSPORT_MAX_ATTEMPTS, 3),\n transportRequestTimeoutMs: toPositiveInt(process.env.TRANSPORT_REQUEST_TIMEOUT_MS, 15_000),\n transportCurlFallback: parseBoolean(process.env.TRANSPORT_CURL_FALLBACK, true),\n pipelineConcurrency: {\n healthy: toPositiveInt(process.env.PIPELINE_MAX_CONCURRENCY, 6),\n degraded: toPositiveInt(process.env.PIPELINE_DEGRADED_CONCURRENCY, 3),\n suspected: toPositiveInt(process.env.PIPELINE_SUSPECTED_CONCURRENCY, 1)\n },\n pipelineCandidateTimeoutMs: toPositiveInt(process.env.PIPELINE_CANDIDATE_TIMEOUT_MS, 45_000)\n };\n}\n\nfunction hostFromUrl(url: string | undefined): string | null {\n if (!url) return null;\n try {\n return new URL(url).hostname.toLowerCase();\n } catch {\n return null;\n }\n}\n\nfunction classifyBlocker(attempt: PipelineAttempt): string {\n const blocker = (attempt.blocker_reason ?? \"\").toLowerCase();\n const transport = attempt.extracted_fields?.transport as { kind?: string; provider?: string } | undefined;\n const transportKind = transport?.kind?.toUpperCase();\n\n if (\n blocker.includes(\"target_unreachable\") ||\n blocker.includes(\"transport:dns_failed\") ||\n blocker.includes(\"transport:tcp_timeout\") ||\n blocker.includes(\"transport:tcp_refused\") ||\n blocker.includes(\"transport:tls_failed\") ||\n blocker.includes(\"transport:unknown_network\")\n ) {\n return \"transport_outage\";\n }\n\n if (transportKind === \"RATE_LIMITED\") return \"rate_limited\";\n if (transportKind === \"AUTH_INVALID\" || attempt.source_access_status === \"auth_required\") return \"auth_required\";\n if (transportKind === \"LEGAL_BLOCK\") return \"legal_block\";\n if (transportKind === \"WAF_BLOCK\") return \"waf_block\";\n if (attempt.source_access_status === \"price_hidden\") return \"price_hidden\";\n if (attempt.source_access_status === \"blocked\") return \"blocked\";\n return \"other\";\n}\n\nexport function summarizeAttemptBlockers(attempts: PipelineDetails[\"attempts\"]): BlockerSummary | null {\n if (!attempts || attempts.length === 0) return null;\n\n const counters = new Map<string, { count: number; hosts: Map<string, number> }>();\n for (const attempt of attempts) {\n const category = classifyBlocker(attempt);\n const host = hostFromUrl(attempt.source_url) ?? \"unknown-host\";\n const current = counters.get(category) ?? { count: 0, hosts: new Map<string, number>() };\n current.count += 1;\n current.hosts.set(host, (current.hosts.get(host) ?? 0) + 1);\n counters.set(category, current);\n }\n\n const top = [...counters.entries()].sort((a, b) => b[1].count - a[1].count)[0];\n if (!top) return null;\n\n const topHosts = [...top[1].hosts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 3)\n .map(([host]) => host);\n\n return {\n category: top[0],\n count: top[1].count,\n hosts: topHosts\n };\n}\n\nfunction shouldRunSetupWizard(assessment: Awaited<ReturnType<typeof assessLocalSetup>>): boolean {\n return !pathExists(assessment.envPath) || Boolean(assessment.authProfilesError);\n}\n\nexport async function startInteractive(): Promise<number> {\n let initialAssessment = await assessLocalSetup();\n\n if (shouldRunSetupWizard(initialAssessment)) {\n try {\n const setup = await runSetupWizard();\n initialAssessment = setup.assessment;\n } catch {\n return 0;\n }\n }\n\n const ctx = resolveContext();\n const pipelineDefaults = resolvePipelineDefaultsFromEnv();\n\n return runInteractiveTui({\n context: {\n apiBaseUrl: ctx.apiBaseUrl,\n apiKey: ctx.apiKey,\n defaults: {\n analysisMode: pipelineDefaults.analysisMode,\n priceNormalization: pipelineDefaults.priceNormalization,\n authProfileId: pipelineDefaults.authProfileId,\n allowLicensed: pipelineDefaults.allowLicensed,\n licensedIntegrations: pipelineDefaults.licensedIntegrations\n }\n },\n initialAssessment\n });\n}\n"],
5
+ "mappings": ";;;;;;;AAAA,SAAgB,aAAa,WAAW,SAAS,QAAQ,gBAAgB;AACzE,SAAS,OAAAA,MAAK,QAAAC,OAAM,QAAQ,QAAQ,gBAAgB;AACpD,OAAO,eAAe;;;ACiBf,SAAS,KAAKC,OAAc,OAAgB,WAAW,SAAgC,UAAuB;AACnH,SAAO,EAAE,MAAM,QAAQ,MAAAA,OAAM,MAAM,OAAO;AAC5C;AAEO,SAAS,OAAO,OAAO,GAAkB;AAC9C,SAAO,EAAE,MAAM,UAAU,KAAK;AAChC;AAEO,SAAS,QAAQ,OAAgB,OAAgB,SAAyB;AAC/E,SAAO,EAAE,MAAM,WAAW,OAAO,KAAK;AACxC;AAEO,SAAS,MAAM,OAA2B,UAAqB,UAAwE,CAAC,GAAiB;AAC9J,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,UAAU,QAAQ;AAAA,IAClB,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ;AAAA,IACf;AAAA,EACF;AACF;AAWO,SAAS,MAAM,WAAsC,UAAqB,MAAM,GAAiB;AACtG,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AA8BO,SAAS,YAAY,SAAiB,aAAqB,OAAgB,UAA0B;AAC1G,SAAO,EAAE,SAAS,aAAa,KAAK;AACtC;AAgBO,SAAS,MAAM,SAA2B,MAA0C;AACzF,SAAO,EAAE,MAAM,SAAS,SAAS,KAAK;AACxC;AAEO,SAAS,YAAY,OAAe,OAAgB,UAAU,OAAgB,OAAoC;AACvH,SAAO,EAAE,MAAM,gBAAgB,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG,MAAM,OAAO,MAAM;AAC5F;AAMO,SAAS,cAAc,SAAyB;AACrD,MAAI,UAAU,GAAI,QAAO,GAAG,OAAO;AACnC,QAAM,IAAI,KAAK,MAAM,UAAU,EAAE;AACjC,QAAM,IAAI,UAAU;AACpB,SAAO,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;AACrC;;;ACxHA,SAAS,UAAU,OAA0F;AAC3G,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,EAAE,QAAQ,UAAK,MAAM,UAAU;AAAA,IACxC,KAAK;AACH,aAAO,EAAE,QAAQ,UAAK,MAAM,UAAU;AAAA,IACxC,KAAK;AACH,aAAO,EAAE,QAAQ,UAAK,MAAM,SAAS;AAAA,IACvC;AACE,aAAO,EAAE,QAAQ,UAAK,MAAM,QAAQ;AAAA,EACxC;AACF;AAEA,SAAS,YAAY,MAAc,QAA4C;AAC7E,QAAM,MAAM,UAAU,OAAO,KAAK;AAClC,QAAM,SAAS,OAAO,SAAS,KAAK,OAAO,MAAM,KAAK;AACtD,SAAO,KAAK,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI;AACxD;AAEO,IAAM,aAA+C,CAAC,UAC3D,MAAM,UAAU;AAAA,EACd,MAAM,OAAO,CAAC,YAAY,aAAa,MAAM,GAAG,GAAG,YAAY,OAAO,MAAM,GAAG,GAAG,YAAY,UAAU,MAAM,MAAM,CAAC,GAAG,CAAC;AAAA,EACzH,MAAM,OAAO,CAAC,YAAY,QAAQ,MAAM,IAAI,GAAG,YAAY,YAAY,MAAM,QAAQ,CAAC,GAAG,CAAC;AAC5F,CAAC;AAEH,WAAW,cAAc;;;ACrBlB,IAAM,aAA4C,CAAC,EAAE,QAAQ,MAClE;AAAA,EACE,QAAQ,SAAS,YACb,wBACA,QAAQ,SAAS,UACf,8CACA;AAAA,EACN,QAAQ,SAAS,YAAY,WAAW;AAAA,EACxC;AACF;AAEF,WAAW,cAAc;AAElB,SAAS,2BAA6D;AAC3E,SAAO;AAAA,IACL,YAAY,sBAAsB,6BAA6B;AAAA,IAC/D,YAAY,kCAAkC,8BAA8B;AAAA,IAC5E,YAAY,UAAU,yCAAyC;AAAA,IAC/D,YAAY,SAAS,0CAA0C;AAAA,IAC/D,YAAY,WAAW,sCAAsC;AAAA,IAC7D,YAAY,SAAS,+BAA+B;AAAA,EACtD;AACF;;;AC1BA,IAAM,UAAU,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAEjE,SAAS,UAAU,OAAe,MAAiD;AACjF,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,EAAE,QAAQ,UAAK,MAAM,UAAU;AAAA,IACxC,KAAK;AACH,aAAO,EAAE,QAAQ,QAAQ,OAAO,QAAQ,MAAM,GAAG,MAAM,SAAS;AAAA,IAClE,KAAK;AACH,aAAO,EAAE,QAAQ,KAAK,MAAM,UAAU;AAAA,IACxC,KAAK;AACH,aAAO,EAAE,QAAQ,UAAK,MAAM,SAAS;AAAA,IACvC;AACE,aAAO,EAAE,QAAQ,UAAK,MAAM,QAAQ;AAAA,EACxC;AACF;AAMO,IAAM,kBAAsD,CAAC,EAAE,SAAS,MAAM;AACnF,QAAM,OAAO,SAAS,QAAQ;AAE9B,MAAI,SAAS,WAAW,QAAQ;AAC9B,WAAO,KAAK,2DAA2D,SAAS,KAAK;AAAA,EACvF;AAEA,QAAM,WAAW,SAAS,WAAW,aAAa,SAAS,WAAW;AAEtE,QAAM,YACJ,SAAS,WAAW,YAChB,WACA,SAAS,WAAW,cAClB,YACA,SAAS,WAAW,WAClB,WACA;AAEV,QAAM,aACJ,SAAS,WAAW,cAChB,WACA,SAAS,WAAW,WAClB,WACA,WACE,QAAQ,OAAO,QAAQ,MAAM,IAC7B;AAGV,QAAM,cAAyB;AAAA,IAC7B,KAAK,GAAG,UAAU,IAAI,SAAS,cAAc,KAAK,IAAI,WAAW,QAAQ;AAAA,IACzE,KAAK,SAAS,OAAO,YAAY,GAAG,WAAW,QAAQ;AAAA,EACzD;AACA,MAAI,SAAS,WAAW,MAAM;AAC5B,gBAAY,KAAK,KAAK,cAAc,SAAS,OAAO,GAAG,SAAS,KAAK,CAAC;AAAA,EACxE;AAEA,QAAM,QAAmB;AAAA,IACvB,MAAM,OAAO,aAAa,CAAC;AAAA,IAC3B,KAAK,KAAK,SAAS,SAAS,KAAK,IAAI,SAAS,KAAK;AAAA,EACrD;AAGA,QAAM,YAAY,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,UAAU,MAAM,EAAE;AACpE,QAAM,QAAQ,SAAS,OAAO;AAC9B,QAAM,QAAQ,QAAQ,IAAI,YAAY,QAAQ;AAC9C,QAAM,WAAW,YAAY,SAAS,WAAW,OAAO,cAAc,SAAS,OAAO,IAAI,aAAa;AAEvG,QAAM,KAAK,OAAO,CAAC,CAAC;AACpB,QAAM;AAAA,IACJ;AAAA,MACE,SAAS,WAAW,cAAc,IAAI,SAAS,WAAW,WAAW,QAAQ;AAAA,MAC7E,SAAS,WAAW,cAAc,YAAY,SAAS,WAAW,WAAW,WAAW;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,KAAK,OAAO,CAAC,CAAC;AACpB,MAAI,UAAU;AAEZ,eAAW,SAAS,SAAS,QAAQ;AACnC,YAAM,OAAO,UAAU,MAAM,OAAO,IAAI;AACxC,YAAM,aAAa,MAAM,UAAU,YAAY,eAAe,MAAM;AACpE,YAAM,KAAK,MAAM,OAAO,CAAC,KAAK,KAAK,KAAK,MAAM,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,YAAY,KAAK,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;AAAA,IACtH;AAAA,EACF,OAAO;AAEL,UAAM,SAAoB,CAAC;AAC3B,aAAS,IAAI,GAAG,IAAI,SAAS,OAAO,QAAQ,KAAK;AAC/C,YAAM,QAAQ,SAAS,OAAO,CAAC;AAC/B,YAAM,OAAO,UAAU,MAAM,OAAO,IAAI;AACxC,aAAO,KAAK,KAAK,GAAG,KAAK,MAAM,IAAI,MAAM,KAAK,IAAI,KAAK,IAAI,CAAC;AAC5D,UAAI,IAAI,SAAS,OAAO,SAAS,GAAG;AAClC,eAAO,KAAK,KAAK,UAAK,SAAS,KAAK,CAAC;AAAA,MACvC;AAAA,IACF;AACA,UAAM,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC;AAAA,EACpC;AAGA,MAAI,SAAS,aAAa,SAAS,GAAG;AACpC,UAAM,KAAK,OAAO,CAAC,CAAC;AACpB,UAAM,KAAK,KAAK,KAAK,SAAS,aAAa,KAAK,UAAO,CAAC,IAAI,OAAO,CAAC;AAAA,EACtE;AAEA,MAAI,SAAS,gBAAgB;AAC3B,UAAM,KAAK,KAAK,YAAO,SAAS,cAAc,IAAI,SAAS,CAAC;AAAA,EAC9D;AAEA,SAAO,MAAM,UAAU,OAAO,CAAC;AACjC;AAEA,gBAAgB,cAAc;;;ACjH9B,SAAS,WAAW,WAA4B;AAC9C,UAAQ,WAAW;AAAA,IACjB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAMO,IAAM,kBAAsD,CAAC,EAAE,OAAO,MAAM;AACjF,QAAM,QAAmB,CAAC;AAG1B,QAAM,eAAe,OAAO,eAAe,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,UAAO;AAC5F,QAAM,KAAK,KAAK,eAAe,YAAY,IAAI,OAAO,CAAC;AAEvD,QAAM,gBAAgB,OAAO,UAAU,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,UAAO;AACxF,QAAM,KAAK,KAAK,eAAe,aAAa,IAAI,OAAO,CAAC;AAGxD,MAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,UAAM,KAAK,OAAO,CAAC,CAAC;AAEpB,UAAM,UAAU;AAAA,MACd,EAAE,KAAK,SAAS,OAAO,SAAS,OAAO,IAAI,MAAM,UAAqB;AAAA,MACtE,EAAE,KAAK,SAAS,OAAO,SAAS,OAAO,IAAI,MAAM,UAAqB;AAAA,MACtE,EAAE,KAAK,UAAU,OAAO,UAAU,OAAO,IAAI,MAAM,QAAmB;AAAA,MACtE,EAAE,KAAK,UAAU,OAAO,eAAe,OAAO,IAAI,MAAM,QAAmB;AAAA,IAC7E;AAEA,UAAM,OAAO,OAAO,gBAAgB,IAAI,CAAC,YAAY;AAAA,MACnD,OAAO,EAAE,MAAM,OAAO,OAAO,MAAM,WAAW,OAAO,SAAS,EAAE;AAAA,MAChE,OAAO,EAAE,MAAM,OAAO,WAAW,MAAM,UAAqB;AAAA,MAC5D,QAAQ,EAAE,MAAM,OAAO,YAAY,MAAM,QAAmB;AAAA,MAC5D,QAAQ,EAAE,MAAM,OAAO,UAAU,IAAI,MAAM,QAAmB;AAAA,IAChE,EAAE;AAEF,UAAM,KAAK,MAAM,SAAS,IAAI,CAAC;AAAA,EACjC;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,KAAK,qBAAqB,SAAS,KAAK;AAAA,EACjD;AAEA,SAAO,MAAM,UAAU,OAAO,CAAC;AACjC;AAEA,gBAAgB,cAAc;;;ACrDvB,IAAM,iBAAoD,CAAC,EAAE,OAAO,MAAM;AAC/E,QAAM,QAAmB,CAAC;AAE1B,aAAW,WAAW,OAAO,UAAU;AACrC,QAAI,WAAW,YAAY,yBAAyB;AAClD,YAAM,KAAK,KAAK,UAAK,OAAO,IAAI,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,aAAW,OAAO,OAAO,UAAU;AACjC,UAAM,KAAK,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EACtC;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,KAAK,8BAA8B,SAAS,KAAK;AAAA,EAC1D;AAEA,SAAO,MAAM,UAAU,OAAO,CAAC;AACjC;AAEA,eAAe,cAAc;;;AChBtB,IAAM,iBAAoD,CAAC,EAAE,MAAM,MAAM;AAC9E,QAAM,WAAsB,CAAC;AAG7B,WAAS,KAAK,WAAW,MAAM,MAAM,CAAC;AAGtC,WAAS,KAAK,QAAQ,UAAU,CAAC;AACjC,WAAS,KAAK,gBAAgB,EAAE,UAAU,MAAM,SAAS,CAAC,CAAC;AAG3D,QAAM,SAAS,MAAM,SAAS,WAAW;AACzC,MAAI,QAAQ;AACV,aAAS,KAAK,QAAQ,SAAS,CAAC;AAChC,aAAS,KAAK,gBAAgB,EAAE,QAAQ,MAAM,OAAO,CAAC,CAAC;AAAA,EACzD;AAGA,MAAI,MAAM,OAAO,SAAS,SAAS,GAAG;AACpC,aAAS,KAAK,QAAQ,UAAU,CAAC;AACjC,eAAW,OAAO,MAAM,OAAO,UAAU;AACvC,eAAS,KAAK,KAAK,KAAK,GAAG,IAAI,SAAS,KAAK,CAAC;AAAA,IAChD;AAAA,EACF;AAIA,aAAW,WAAW,MAAM,OAAO,aAAa;AAC9C,UAAM,OAAO,oBAAI,IAAI,CAAC,wBAAwB,8BAA8B,sBAAsB,CAAC;AACnG,UAAM,aAAa,QAAQ,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;AAC3D,QAAI,WAAW,SAAS,GAAG;AACzB,eAAS,KAAK,QAAQ,QAAQ,KAAK,CAAC;AACpC,iBAAW,QAAQ,YAAY;AAC7B,cAAM,OAAO,QAAQ,SAAS,YAAa,YAAuB;AAClE,iBAAS,KAAK,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAGA,WAAS,KAAK,OAAO,CAAC,CAAC;AACvB,WAAS,KAAK,WAAW,EAAE,SAAS,MAAM,QAAQ,CAAC,CAAC;AAEpD,SAAO,MAAM,MAAM,OAAO,UAAU,EAAE,QAAQ,UAAU,UAAU,MAAM,SAAS,CAAC;AACpF;AAEA,eAAe,cAAc;;;ACzD7B,SAAgB,gBAAgB;AAChC,SAAS,KAAK,YAAY;AAsCtB,cAwBA,YAxBA;AArBJ,SAAS,UAAU,MAAmC;AACpD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,WAAW,MAAmB,KAAwB;AAC7D,SACE,oBAAC,QAAe,OAAO,UAAU,KAAK,IAAI,GAAG,UAAU,KAAK,WAAW,OAAO,MAAM,KAAK,WAAW,UACjG,eAAK,QADG,GAEX;AAEJ;AAEA,SAAS,aAAa,MAAqB,KAAwB;AACjE,SACE,oBAAC,QACE,eAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,KAD1B,GAEX;AAEJ;AAEA,SAAS,cAAc,MAAsB,KAAwB;AACnE,SACE,oBAAC,QAAe,OAAO,UAAU,KAAK,IAAI,GAAG,UAAQ,MAClD,eAAK,QAAQ,gBAAM,KAAK,KAAK,IAAI,SAAI,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,MAAM,MAAM,CAAC,CAAC,KAAK,SAAI,OAAO,EAAE,KAD1F,GAEX;AAEJ;AAEA,SAAS,aAAa,MAAqB,KAAwB;AACjE,SACE,qBAAC,OAAc,eAAc,UAAS,aAAY,SAAQ,aAAa,UAAU,KAAK,IAAI,GAAG,UAAU,GAAG,aAAa,GACrH;AAAA,wBAAC,QAAK,OAAM,QAAQ,eAAK,OAAM;AAAA,IAC/B,oBAAC,QAAK,OAAO,UAAU,KAAK,IAAI,GAAG,MAAI,MACpC,eAAK,OACR;AAAA,IACC,KAAK,OACJ,oBAAC,QAAK,OAAM,QAAO,UAAQ,MACxB,eAAK,MACR,IACE;AAAA,OATI,GAUV;AAEJ;AAEA,SAAS,WAAW,MAAmB,KAAwB;AAC7D,SACE,qBAAC,OAAc,eAAc,UAAS,aAAa,GAChD;AAAA,SAAK,QACJ,oBAAC,QAAK,OAAM,QAAO,MAAI,MACpB,eAAK,OACR,IACE;AAAA,IACH,KAAK,MAAM,IAAI,CAAC,MAAM,UACrB,qBAAC,OAAiC,eAAc,UAAS,cAAc,KAAK,SAAS,IAAI,GACvF;AAAA,2BAAC,QAAK,OAAO,UAAU,KAAK,IAAI,GAC7B;AAAA,aAAK;AAAA,QACL,KAAK,QAAQ,qBAAC,QAAK,OAAM,SAAQ;AAAA;AAAA,UAAG,KAAK;AAAA,WAAM,IAAU;AAAA,SAC5D;AAAA,MACC,KAAK,SACJ,oBAAC,QAAK,OAAM,QAAO,UAAQ,MACxB,eAAK,QACR,IACE;AAAA,SATI,GAAG,GAAG,SAAS,KAAK,EAU9B,CACD;AAAA,OAlBO,GAmBV;AAEJ;AAEA,SAAS,YAAY,MAAoB,KAAwB;AAC/D,SACE,oBAAC,OAAc,eAAe,KAAK,WAChC,eAAK,SAAS,IAAI,CAAC,OAAO,UACzB;AAAA,IAAC;AAAA;AAAA,MAEC,aAAa,KAAK,cAAc,SAAS,QAAQ,KAAK,SAAS,SAAS,IAAI,KAAK,OAAO,IAAI;AAAA,MAC5F,cAAc,KAAK,cAAc,YAAY,QAAQ,KAAK,SAAS,SAAS,IAAI,KAAK,OAAO,IAAI;AAAA,MAEhG,8BAAC,iBAAc,MAAM,OAAO;AAAA;AAAA,IAJvB,GAAG,GAAG,UAAU,KAAK;AAAA,EAK5B,CACD,KATO,GAUV;AAEJ;AAEA,SAAS,YAAY,MAA2C,KAAwB;AACtF,SACE,oBAAC,OAAc,eAAe,KAAK,WAChC,eAAK,SAAS,IAAI,CAAC,OAAO,UACzB,oBAAC,OAAkC,UAAU,KAAK,SAAS,KAAK,KAAK,GAAG,aAAa,KAAK,cAAc,SAAS,UAAU,IAAI,IAAI,GACjI,8BAAC,iBAAc,MAAM,OAAO,KADpB,GAAG,GAAG,UAAU,KAAK,EAE/B,CACD,KALO,GAMV;AAEJ;AAEA,SAAS,YAAY,MAAoB,KAAwB;AAC/D,SACE,qBAAC,OAAc,eAAc,UAAS,aAAY,SAAQ,aAAa,UAAU,KAAK,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,KAAK,OAClI;AAAA,SAAK,QACJ,oBAAC,QAAK,OAAO,UAAU,KAAK,MAAM,GAAG,MAAI,MACtC,eAAK,OACR,IACE;AAAA,IACH,KAAK,WACJ,oBAAC,QAAK,OAAM,QAAO,UAAQ,MACxB,eAAK,UACR,IACE;AAAA,IACH,KAAK,SAAS,IAAI,CAAC,OAAO,UACzB,oBAAC,YACC,8BAAC,iBAAc,MAAM,OAAO,KADf,GAAG,GAAG,UAAU,KAAK,EAEpC,CACD;AAAA,OAfO,GAgBV;AAEJ;AAGA,SAAS,YAAY,MAAoB,KAAwB;AAC/D,MAAI,KAAK,KAAK,WAAW,EAAG,QAAO;AACnC,SACE,qBAAC,OAAc,eAAc,UAE3B;AAAA,wBAAC,OACE,eAAK,QAAQ,IAAI,CAAC,KAAK,MACtB,oBAAC,OAA4B,OAAO,IAAI,OAAO,aAAa,GAC1D,8BAAC,QAAK,OAAM,QAAO,MAAI,MACpB,cAAI,OACP,KAHQ,GAAG,GAAG,QAAQ,CAAC,EAIzB,CACD,GACH;AAAA,IAEA,oBAAC,OACE,eAAK,QAAQ,IAAI,CAAC,KAAK,MACtB,oBAAC,OAA4B,OAAO,IAAI,OAAO,aAAa,GAC1D,8BAAC,QAAK,OAAM,QAAO,UAAQ,MACxB,mBAAI,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,MAAM,SAAS,CAAC,CAAC,GACvD,KAHQ,GAAG,GAAG,QAAQ,CAAC,EAIzB,CACD,GACH;AAAA,IAEC,KAAK,KAAK,IAAI,CAAC,KAAK,OACnB,oBAAC,OACE,eAAK,QAAQ,IAAI,CAAC,KAAK,OAAO;AAC7B,YAAM,OAAO,IAAI,IAAI,GAAG;AACxB,aACE,oBAAC,OAAoC,OAAO,IAAI,OAAO,aAAa,GAClE,8BAAC,QAAK,OAAO,UAAU,MAAM,QAAQ,IAAI,IAAI,GAAG,MAAK,YAClD,gBAAM,QAAQ,IACjB,KAHQ,GAAG,GAAG,SAAS,EAAE,IAAI,EAAE,EAIjC;AAAA,IAEJ,CAAC,KAVO,GAAG,GAAG,QAAQ,EAAE,EAW1B,CACD;AAAA,OAnCO,GAoCV;AAEJ;AAGA,SAAS,kBAAkB,MAA0B,KAAwB;AAC3E,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,SAAS,KAAK,MAAM,KAAK,QAAQ,KAAK;AAC5C,QAAM,QAAQ,QAAQ;AACtB,QAAM,MAAM,KAAK,MAAM,KAAK,QAAQ,GAAG;AAEvC,SACE,qBAAC,OACC;AAAA,wBAAC,QAAK,OAAO,UAAU,KAAK,IAAI,GAC7B,mBAAI,OAAO,MAAM,GACpB;AAAA,IACA,oBAAC,QAAK,OAAM,QAAO,UAAQ,MACxB,mBAAI,OAAO,KAAK,GACnB;AAAA,IACA,qBAAC,QAAK,OAAM,QACT;AAAA;AAAA,MACA;AAAA,MAAI;AAAA,OACP;AAAA,IACC,KAAK,QACJ,qBAAC,QAAK,OAAM,QAAO,UAAQ,MACxB;AAAA;AAAA,MACA,KAAK;AAAA,OACR,IACE;AAAA,OAhBI,GAiBV;AAEJ;AAGA,SAAS,cAAc,MAAsB,KAAwB;AACnE,SACE,oBAAC,OAAc,eAAc,OAAM,KAAK,GACrC,eAAK,KAAK,IAAI,CAAC,GAAG,MACjB,qBAAC,OACC;AAAA,yBAAC,QAAK,OAAO,UAAU,EAAE,QAAQ,QAAQ,GAAG,MAAI,MAAC;AAAA;AAAA,MAC7C,EAAE;AAAA,MAAI;AAAA,OACV;AAAA,IACA,qBAAC,QAAK,OAAM,QACT;AAAA;AAAA,MACA,EAAE;AAAA,OACL;AAAA,OAPQ,GAAG,GAAG,OAAO,CAAC,EAQxB,CACD,KAXO,GAYV;AAEJ;AAEO,SAAS,cAAc,EAAE,KAAK,GAAiC;AACpE,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,WAAW,MAAM,MAAM;AAAA,IAChC,KAAK;AACH,aAAO,aAAa,MAAM,QAAQ;AAAA,IACpC,KAAK;AACH,aAAO,cAAc,MAAM,SAAS;AAAA,IACtC,KAAK;AACH,aAAO,aAAa,MAAM,QAAQ;AAAA,IACpC,KAAK;AACH,aAAO,WAAW,MAAM,MAAM;AAAA,IAChC,KAAK;AACH,aAAO,YAAY,MAAM,OAAO;AAAA,IAClC,KAAK;AACH,aAAO,YAAY,MAAM,OAAO;AAAA,IAClC,KAAK;AACH,aAAO,YAAY,MAAM,OAAO;AAAA,IAClC,KAAK;AACH,aAAO,YAAY,MAAM,OAAO;AAAA,IAClC,KAAK;AACH,aAAO,kBAAkB,MAAM,cAAc;AAAA,IAC/C,KAAK;AACH,aAAO,cAAc,MAAM,UAAU;AAAA,IACvC;AACE,aAAO;AAAA,EACX;AACF;;;ARgEM,gBAAAC,MAwQA,QAAAC,aAxQA;AAhSN,SAAS,YAAY,QAAgB,UAA0B;AAC7D,MAAI;AACF,WAAO,IAAI,KAAK,aAAa,SAAS;AAAA,MACpC,OAAO;AAAA,MACP;AAAA,MACA,uBAAuB;AAAA,IACzB,CAAC,EAAE,OAAO,MAAM;AAAA,EAClB,QAAQ;AACN,WAAO,GAAG,OAAO,eAAe,OAAO,CAAC,IAAI,QAAQ;AAAA,EACtD;AACF;AAEA,SAAS,gBACP,OACA,IACA,QACA,MACkB;AAClB,SAAO;AAAA,IACL;AAAA,IACA,OAAO,KAAK,YAAY;AAAA,IACxB;AAAA,IACA,MAAM,SAAS,KAAK,YAAY;AAAA,EAClC;AACF;AAEA,SAAS,eAAe,SAAqD;AAC3E,MAAI,CAAC,SAAS,SAAS,4BAA6B,QAAO;AAC3D,QAAM,UAAU,OAAO,QAAQ,QAAQ,QAAQ,2BAA2B,EACvE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,CAAC,EAC/B,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7B,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,cAAc,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtD;AAEA,SAAS,WAAW,QAA8B;AAChD,MAAI,OAAO,OAAO,iCAAiC,SAAU,QAAO,YAAY,OAAO,8BAA8B,KAAK;AAC1H,MAAI,OAAO,OAAO,yBAAyB,SAAU,QAAO,YAAY,OAAO,sBAAsB,KAAK;AAC1G,MAAI,OAAO,OAAO,iBAAiB,SAAU,QAAO,YAAY,OAAO,cAAc,OAAO,YAAY,KAAK;AAC7G,MAAI,OAAO,OAAO,iBAAiB,YAAY,OAAO,OAAO,kBAAkB,UAAU;AACvF,WAAO,GAAG,YAAY,OAAO,cAAc,OAAO,YAAY,KAAK,CAAC,SAAI,YAAY,OAAO,eAAe,OAAO,YAAY,KAAK,CAAC;AAAA,EACrI;AACA,MAAI,OAAO,eAAe,kBAAkB,OAAO,aAAc,QAAO;AACxE,SAAO;AACT;AAEA,SAAS,WAAW,OAAsD;AACxE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,GAAG,YAAY,MAAM,KAAK,KAAK,CAAC,WAAM,YAAY,MAAM,MAAM,KAAK,CAAC;AAC7E;AAEA,SAAS,WAAW,QAaJ;AACd,QAAM,EAAE,YAAY,SAAS,YAAY,cAAc,OAAO,SAAS,YAAY,MAAM,SAAS,SAAS,MAAM,aAAa,IAAI;AAClI,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,SAAS,WAAW,CAAC;AACrC,QAAM,QAAQ,SAAS,KAAK,MAAM;AAClC,QAAM,YAAY,SAAS;AAE3B,QAAM,aAAa,YAAY,OAAO,IAAI,CAAC,UAAU,GAAG,MAAM,QAAQ,KAAK,MAAM,OAAO,GAAG,MAAM,SAAS,KAAK,MAAM,MAAM,MAAM,EAAE,EAAE,KAAK,CAAC;AAC3I,QAAM,iBAAiB,WAAW,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,SAAM,IAAI,MAAM,SAAM,IAAI,MAAM,MAAM,EAAE;AAC5G,QAAM,YACJ,YAAY,cAAc,IAAI,CAAC,YAAY,GAAG,QAAQ,SAAS,KAAK,QAAQ,SAAU,QAAQ,UAAU,YAAY,UAAW,SAAS,EAAE,KAAK,CAAC;AAElJ,QAAM,mBACJ,eAAe,SACX,iBACA,eAAe,SACb,YACA,eAAe,UACb,aACA,CAAC,WAAW,4BAA4B;AAElD,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,SAAS;AAAA,MACP,MAAM,OAAO,YAAY,eAAe,UAAU,UAAU;AAAA,MAC5D;AAAA,MACA,aAAa;AAAA,MACb,OAAO,yBAAyB;AAAA,MAChC;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,KAAK,aACD,gBAAgB,aAAa,WAAW,UAAU,IAAI,WAAW,UAAU,WAAW,WAAW,UAAU,MAAM,IACjH,gBAAgB,aAAa,OAAO,UAAU;AAAA,MAClD,KAAK,aAAa,gBAAgB,cAAc,WAAW,UAAU,IAAI,WAAW,UAAU,UAAU,WAAW,UAAU,IAAI,gBAAgB,cAAc,OAAO,UAAU;AAAA,MAChL,QACE,cAAc,WAAW,UAAU,KAC/B,EAAE,OAAO,UAAU,OAAO,WAAW,QAAQ,8BAA8B,MAAM,UAAU,IAC3F,EAAE,OAAO,UAAU,OAAO,WAAW,QAAQ,uBAAuB,MAAM,QAAQ;AAAA,MACxF,MACE,aACI;AAAA,QACE,OAAO;AAAA,QACP,OAAO,WAAW,oBAAoB,YAAY,WAAW,cAAc,KAAK,CAAC,YAAY,QAAQ,UAAU,CAAC,QAAQ,OAAO,IAAI,YAAY;AAAA,QAC/I,QAAQ,WAAW,mBAAmB,WAAW,GAAG,WAAW,SAAS,MAAM;AAAA,QAC9E,MAAM,WAAW,oBAAoB,WAAW,WAAW,cAAc,KAAK,CAAC,YAAY,QAAQ,UAAU,CAAC,QAAQ,OAAO,IAAI,YAAY;AAAA,MAC/I,IACA,EAAE,OAAO,QAAQ,OAAO,WAAW,QAAQ,YAAY,MAAM,QAAQ;AAAA,MAC3E,UAAU;AAAA,QACR,OAAO;AAAA,QACP,OAAO,QAAQ,SAAS,gBAAgB,YAAY;AAAA,QACpD,QACE,QAAQ,SAAS,qBAAqB,SAAS,IAC3C,QAAQ,SAAS,qBAAqB,KAAK,IAAI,IAC/C;AAAA,QACN,MAAM,QAAQ,SAAS,gBAAgB,YAAY;AAAA,MACrD;AAAA,MACA,OAAO,YAAY,UAAU;AAAA,MAC7B,YAAY,QAAQ;AAAA,MACpB,YAAY,YAAY;AAAA,IAC1B;AAAA,IACA,UAAU;AAAA,MACR;AAAA,MACA,YAAY,gBAAgB;AAAA,MAC5B,QACE,SAAS,KAAK,WAAW,cACrB,cACA,SAAS,KAAK,WAAW,WACvB,WACA,SAAS,KAAK,WAAW,YACvB,YACA,SAAS,KAAK,WAAW,YACvB,WACA;AAAA,MACZ,QAAQ;AAAA,QACN;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO,SAAS,KAAK,SAAU,QAAQ,IAAI,WAAW,YAAY,YAAY,SAAU;AAAA,QAC1F;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO,SAAS,KAAK,WAAW,YAAY,YAAY,UAAU,SAAS;AAAA,QAC7E;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO,UAAW,SAAS,KAAK,WAAW,cAAc,SAAS,YAAa;AAAA,QACjF;AAAA,QACA;AAAA,UACE,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,OAAO,SAAS,KAAK,WAAW,cAAc,SAAS,SAAS,KAAK,WAAW,WAAW,WAAW;AAAA,QACxG;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,UAAU,aAAa,QAAQ,gBAAgB,KAAK;AAAA,QACpD,UAAU,uBAAuB,QAAQ,8BAA8B,CAAC,KAAK;AAAA,QAC7E,UAAU,oBAAoB,KAAK,OAAO,QAAQ,wCAAwC,QAAQ,gCAAgC,KAAK,GAAG,CAAC,MAAM;AAAA,MACnJ;AAAA,MACA,gBAAgB,eAAe,OAAO;AAAA,MACtC;AAAA,MACA,SAAS,eAAe,KAAK,OAAO,KAAK,IAAI,IAAI,gBAAgB,GAAI,IAAI;AAAA,IAC3E;AAAA,IACA,QAAQ;AAAA,MACN,YAAY,gBAAgB;AAAA,MAC5B;AAAA,MACA,UAAU;AAAA,QACR,EAAE,OAAO,YAAY,OAAO,OAAO,SAAS,oBAAoB,CAAC,GAAG,MAAM,UAAU;AAAA,QACpF,EAAE,OAAO,gBAAgB,OAAO,OAAO,SAAS,kBAAkB,CAAC,GAAG,MAAM,QAAQ;AAAA,QACpF;AAAA,UACE,OAAO;AAAA,UACP,OAAO,GAAG,KAAK,OAAO,SAAS,wCAAwC,SAAS,gCAAgC,KAAK,GAAG,CAAC;AAAA,UACzH,OAAO,SAAS,wCAAwC,MAAM,MAAM,YAAY;AAAA,QAClF;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd,EAAE,OAAO,aAAa,OAAO,OAAO,OAAO,KAAK,SAAS,8BAA8B,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,SAAS;AAAA,QACnH,EAAE,OAAO,UAAU,OAAO,OAAO,SAAS,yBAAyB,iBAAiB,CAAC,GAAG,MAAM,UAAU;AAAA,QACxG,EAAE,OAAO,WAAW,OAAO,OAAO,SAAS,yBAAyB,WAAW,CAAC,GAAG,MAAM,SAAS;AAAA,MACpG;AAAA,MACA,WAAW;AAAA,QACT,EAAE,OAAO,WAAW,OAAO,WAAW,WAAW,YAAY,GAAG,MAAM,WAAW,YAAY,YAAY,UAAU;AAAA,QACnH,EAAE,OAAO,UAAU,OAAO,WAAW,WAAW,WAAW,GAAG,MAAM,SAAS;AAAA,QAC7E,EAAE,OAAO,QAAQ,OAAO,WAAW,WAAW,kBAAkB,GAAG,MAAM,QAAQ;AAAA,MACnF;AAAA,MACA,iBAAiB,QAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY;AAAA,QACpD,OAAO,WAAW,MAAM;AAAA,QACxB,WAAW,OAAO;AAAA,QAClB,WAAW,OAAO,cAAc;AAAA,QAChC,YAAY,OAAO;AAAA,QACnB,QAAQ,CAAC,OAAO,sBAAsB,OAAO,iBAAiB,OAAO,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAAA,MACvG,EAAE;AAAA,MACF,aAAa;AAAA,QACX;AAAA,UACE,OAAO,eAAe,SAAS,aAAa,eAAe,UAAU,iBAAiB,eAAe,SAAS,eAAe,eAAe,SAAS,gBAAgB;AAAA,UACrK,MAAM,eAAe,UAAU,YAAY;AAAA,UAC3C,OACE,eAAe,SACX;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,IACA,iBAAiB,SAAS,IACxB,mBACA,CAAC,sBAAsB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,OACE,eAAe,SACX,SACA,eAAe,SACb,SACA,eAAe,UACb,UACA,eAAe,SACb,SACA;AAAA,MACZ,UAAU,eAAe,UAAU,oGAAoG;AAAA,MACvI,QAAQ;AAAA,QACN,aACI,gBAAgB,aAAa,WAAW,UAAU,IAAI,WAAW,UAAU,WAAW,WAAW,UAAU,MAAM,IACjH,gBAAgB,aAAa,OAAO,UAAU;AAAA,QAClD,aACI,gBAAgB,cAAc,WAAW,UAAU,IAAI,WAAW,UAAU,UAAU,WAAW,UAAU,IAC3G,gBAAgB,cAAc,OAAO,UAAU;AAAA,MACrD;AAAA,MACA,SACE,eAAe,SACV,YAAY,cAAc,IAAI,CAAC,aAAa;AAAA,QAC3C,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ,SAAU,QAAQ,UAAU,YAAY,UAAW;AAAA,QAClE,MAAM,QAAQ,SAAU,QAAQ,UAAU,YAAY,YAAa;AAAA,QACnE,QAAQ,QAAQ;AAAA,MAClB,EAAE,KAAK,CAAC,IACR,eAAe,SACb,WAAW,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS;AAAA,QACnC,OAAO,IAAI;AAAA,QACX,OAAO,IAAI;AAAA,QACX,MAAM,IAAI,WAAW,cAAc,YAAY,IAAI,WAAW,WAAW,WAAW;AAAA,QACpF,QAAQ,IAAI,MAAM;AAAA,MACpB,EAAE,IACF;AAAA,QACE;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,eAAe,UAAU,YAAY;AAAA,QAC7C;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,OAAO,gBAAgB;AAAA,UACvB,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACR,UAAU,eAAe,UAAU,aAAa,CAAC,eAAe,OAAO,KAAK,uBAAuB;AAAA,MACnG,UAAU,SAAS,UAAU,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,QAAQ,UAAU,KAAK,CAAC;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAyD;AACjF,QAAM,QAAQ,MAAM,MAAM,oCAAoC;AAC9D,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AAAA,IACL,QAAQ,MAAM,CAAC,EAAE,KAAK;AAAA,IACtB,OAAO,MAAM,CAAC,EAAE,KAAK;AAAA,EACvB;AACF;AAEO,SAAS,kBAAkB,OAAgD;AAChF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,UAAU;AACd,UAAM,WAAW;AAAA,MACf,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ,QAAQ,CAAC,SAAS;AAChB,gBAAI,QAAS;AACb,sBAAU;AACV,qBAAS,QAAQ;AACjB,oBAAQ,IAAI;AAAA,UACd;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,EAAE,SAAS,mBAAmB,OAAO,GAAwB;AACnF,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAiC,iBAAiB;AACtF,QAAM,CAAC,SAAS,UAAU,IAAI,SAAiC,IAAI;AACnE,QAAM,CAAC,YAAY,aAAa,IAAI,SAAsB,CAAC,CAAC;AAC5D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAI,SAAmB,CAAC,CAAC;AACnD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAqB,mBAAmB,OAAO,SAAS,UAAU,MAAM;AAC5G,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,EAAE;AACnD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,sBAAsB;AAC7D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,CAAC,cAAc,eAAe,IAAI,SAAwB,IAAI;AACpE,QAAM,mBAAmB,OAAO,KAAK;AAErC,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAQ,WAAW,KAAK;AAC9B,WAAK;AACL,aAAO,CAAC;AAAA,IACV;AAAA,EACF,CAAC;AAGD,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,YAAY,MAAM,QAAQ,CAAC,MAAM,IAAI,CAAC,GAAG,GAAG;AAC7D,WAAO,MAAM,cAAc,QAAQ;AAAA,EACrC,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,oBAAoB,YAAY,YAAY;AAChD,UAAM,OAAO,MAAM,iBAAiB;AACpC,kBAAc,IAAI;AAClB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkB,YAAY,YAAY;AAC9C,UAAM,UAAkC,CAAC;AACzC,QAAI,QAAQ,OAAQ,SAAQ,WAAW,IAAI,QAAQ;AACnD,UAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,UAAU,iBAAiB,EAAE,QAAQ,CAAC;AAC9E,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,wBAAwB,SAAS,MAAM,GAAG;AAAA,IAC5D;AACA,UAAM,UAAW,MAAM,SAAS,KAAK;AACrC,kBAAc,QAAQ,IAAI;AAAA,EAC5B,GAAG,CAAC,QAAQ,YAAY,QAAQ,MAAM,CAAC;AAEvC,YAAU,MAAM;AACd,UAAM,YAAY;AAChB,UAAI;AACF,cAAM,kBAAkB;AACxB,cAAM,gBAAgB;AAAA,MACxB,SAAS,OAAO;AACd,mBAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACnE;AAAA,IACF,GAAG;AAAA,EACL,GAAG,CAAC,iBAAiB,iBAAiB,CAAC;AAEvC,QAAM,gBAAgB;AAAA,IACpB,OAAO,MAAyB,QAAgB,UAAmB;AACjE,cAAQ,IAAI;AACZ,oBAAc,QAAQ;AACtB,sBAAgB,MAAM;AACtB,iBAAW,aAAa,IAAI,iBAAiB,MAAM,KAAK;AACxD,sBAAgB,KAAK,IAAI,CAAC;AAC1B,uBAAiB,UAAU;AAE3B,UAAI;AACF,cAAM,iBAAiB,MAAM,kBAAkB;AAC/C,YAAI,CAAC,eAAe,UAAU,IAAI;AAChC,wBAAc,OAAO;AACrB,qBAAW,yBAAyB,eAAe,UAAU,+BAA+B;AAC5F;AAAA,QACF;AAEA,cAAM,UAAkC;AAAA,UACtC,gBAAgB;AAAA,QAClB;AACA,YAAI,QAAQ,OAAQ,SAAQ,WAAW,IAAI,QAAQ;AAEnD,cAAM,WAAW,MAAM,MAAM,GAAG,QAAQ,UAAU,aAAa,IAAI,IAAI;AAAA,UACrE,QAAQ;AAAA,UACR;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB,OAAO;AAAA,cACL;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,aAAa;AAAA,cACb,cAAc,QAAQ,SAAS;AAAA,cAC/B,oBAAoB,QAAQ,SAAS;AAAA,cACrC,eAAe,QAAQ,SAAS;AAAA,cAChC,uBAAuB;AAAA,cACvB,eAAe,QAAQ,SAAS;AAAA,cAChC,sBAAsB,QAAQ,SAAS;AAAA,YACzC;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAME,QAAO,MAAM,SAAS,KAAK;AACjC,gBAAM,IAAI,MAAM,4BAA4B,SAAS,MAAM,MAAMA,MAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,QACvF;AAEA,cAAM,UAAW,MAAM,SAAS,KAAK;AACrC,mBAAW;AAAA,UACT,KAAK;AAAA,YACH,IAAI,QAAQ;AAAA,YACZ,QAAQ,QAAQ;AAAA,UAClB;AAAA,QACF,CAAC;AACD,mBAAW,gBAAgB,QAAQ,KAAK,EAAE;AAE1C,eAAO,CAAC,iBAAiB,SAAS;AAChC,gBAAM,iBAAiB,MAAM,MAAM,GAAG,QAAQ,UAAU,SAAS,QAAQ,KAAK,IAAI;AAAA,YAChF,SAAS,QAAQ,SAAS,EAAE,aAAa,QAAQ,OAAO,IAAI;AAAA,UAC9D,CAAC;AACD,cAAI,CAAC,eAAe,IAAI;AACtB,kBAAM,IAAI,MAAM,sBAAsB,QAAQ,KAAK,KAAK,eAAe,MAAM,GAAG;AAAA,UAClF;AAEA,gBAAM,cAAe,MAAM,eAAe,KAAK;AAC/C,qBAAW,WAAW;AAEtB,gBAAM,SAAS,YAAY,KAAK;AAChC,cAAI,WAAW,eAAe,WAAW,UAAU;AACjD,gBAAI,WAAW,aAAa;AAC1B,oBAAM,IAAI,YAAY;AACtB,oBAAM,WAAW,GAAG,oBAAoB;AACxC,oBAAM,WAAW,KAAK,OAAO,GAAG,wCAAwC,GAAG,gCAAgC,KAAK,GAAG;AACnH,yBAAW,+BAAqB,QAAQ,cAAc,QAAQ,YAAY;AAAA,YAC5E,OAAO;AACL,yBAAW,sBAAiB,QAAQ,KAAK,EAAE;AAAA,YAC7C;AACA;AAAA,UACF;AAEA,gBAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAI,CAAC;AAAA,QAC1D;AAEA,cAAM,gBAAgB;AAAA,MACxB,UAAE;AACA,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,UAAU,iBAAiB,iBAAiB;AAAA,EAC3F;AAEA,QAAM,eAAe;AAAA,IACnB,OAAO,UAAkB;AACvB,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,CAAC,QAAS;AAEd,iBAAW,CAAC,YAAY,CAAC,SAAS,GAAG,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC;AACzD,eAAS,EAAE;AAEX,UAAI;AACF,YAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B,gBAAM,cAAc,UAAU,OAAO;AACrC;AAAA,QACF;AAEA,YAAI,YAAY,SAAS;AACvB,2BAAiB,UAAU;AAC3B,eAAK;AACL,iBAAO,CAAC;AACR;AAAA,QACF;AAEA,YAAI,YAAY,SAAS;AACvB,wBAAc,MAAM;AACpB,qBAAW,2BAA2B;AACtC;AAAA,QACF;AAEA,YAAI,YAAY,aAAa,YAAY,WAAW;AAClD,wBAAc,YAAY,YAAY,WAAW,OAAO;AACxD,gBAAM,kBAAkB;AACxB,qBAAW,+BAA+B;AAC1C;AAAA,QACF;AAEA,YAAI,YAAY,UAAU;AACxB,wBAAc,OAAO;AACrB,gBAAM,kBAAkB;AACxB,qBAAW,qEAAqE;AAChF;AAAA,QACF;AAEA,YAAI,YAAY,SAAS;AACvB,wBAAc,MAAM;AACpB,gBAAM,kBAAkB;AACxB,qBAAW,6BAA6B;AACxC;AAAA,QACF;AAEA,YAAI,YAAY,SAAS;AACvB,wBAAc,MAAM;AACpB,gBAAM,gBAAgB;AACtB,qBAAW,qBAAqB;AAChC;AAAA,QACF;AAEA,YAAI,QAAQ,WAAW,YAAY,GAAG;AACpC,gBAAM,cAAc,UAAU,QAAQ,MAAM,aAAa,MAAM,EAAE,KAAK,CAAC;AACvE;AAAA,QACF;AAEA,cAAM,cAAc,iBAAiB,OAAO;AAC5C,YAAI,aAAa;AACf,gBAAM,cAAc,QAAQ,YAAY,QAAQ,YAAY,KAAK;AACjE;AAAA,QACF;AAEA,mBAAW,oBAAoB,OAAO,EAAE;AAAA,MAC1C,SAAS,OAAO;AACd,mBAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MACnE;AAAA,IACF;AAAA,IACA,CAAC,MAAM,iBAAiB,QAAQ,mBAAmB,aAAa;AAAA,EAClE;AAEA,QAAM,QAAQ;AAAA,IACZ,MACE,WAAW;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,CAAC,cAAc,YAAY,MAAM,SAAS,YAAY,SAAS,SAAS,OAAO,SAAS,YAAY,MAAM,YAAY;AAAA,EACxH;AAEA,QAAM,eAAe,QAAQ,WAAW,QAAG,KAAK,QAAQ,WAAW,QAAQ,KAAK,QAAQ,SAAS,OAAO,IACpG,QACA,QAAQ,WAAW,QAAG,IACpB,UACA;AAEN,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAH,KAAC,iBAAc,MAAM,eAAe,EAAE,MAAM,CAAC,GAAG;AAAA,IAGhD,gBAAAC,MAACE,MAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,UAAU,GACpD;AAAA,sBAAAH,KAACI,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,oBAExB;AAAA,MACA,gBAAAJ,KAACG,MAAA,EAAI,YAAY,GAAG,UAAU,GAC5B,0BAAAH,KAAC,aAAU,OAAO,OAAO,UAAU,UAAU,UAAU,cAAc,aAAY,sBAAqB,GACxG;AAAA,OACF;AAAA,IAGA,gBAAAC,MAACE,MAAA,EAAI,gBAAe,iBACjB;AAAA,iBAAW,YAAY,yBACtB,gBAAAH,KAACI,OAAA,EAAK,OAAO,cAAc,UAAQ,MAChC,mBACH,IAEA,gBAAAJ,KAACI,OAAA,EAAM,eAAI;AAAA,MAEb,gBAAAH,MAACE,MAAA,EAAI,KAAK,GACR;AAAA,wBAAAF,MAACG,OAAA,EACC;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,kBAAI;AAAA,UAC5B,gBAAAJ,KAACI,OAAA,EAAK,OAAM,QAAO,uBAAS;AAAA,WAC9B;AAAA,QACA,gBAAAH,MAACG,OAAA,EACC;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,kBAAI;AAAA,UAC5B,gBAAAJ,KAACI,OAAA,EAAK,OAAM,QAAO,oBAAM;AAAA,WAC3B;AAAA,QACA,gBAAAH,MAACG,OAAA,EACC;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,kBAAI;AAAA,UAC5B,gBAAAJ,KAACI,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,WAC1B;AAAA,QACA,gBAAAH,MAACG,OAAA,EACC;AAAA,0BAAAJ,KAACI,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,kBAAI;AAAA,UAC5B,gBAAAJ,KAACI,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,WAC1B;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAEJ;;;AS7kBA,SAAS,iBAAqC;AAC5C,SAAO;AAAA,IACL,YAAY,QAAQ,IAAI,gBAAgB;AAAA,IACxC,QAAQ,QAAQ,IAAI;AAAA,EACtB;AACF;AAEA,SAAS,cAAc,OAA2B,UAA0B;AAC1E,QAAM,SAAS,OAAO,SAAS,QAAQ;AACvC,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,EAAG,QAAO;AACpD,SAAO,KAAK,MAAM,MAAM;AAC1B;AAEA,SAAS,aAAa,OAA2B,UAA4B;AAC3E,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,MAAM,KAAK,EAAE,YAAY,MAAM;AACxC;AAEO,SAAS,iCAAsD;AACpE,QAAM,cAAc,QAAQ,IAAI,iCAAiC;AACjE,QAAM,uBAAuB,YAC1B,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO;AAEjB,SAAO;AAAA,IACL,cACG,QAAQ,IAAI,yBAA6E;AAAA,IAC5F,oBACG,QAAQ,IAAI,+BAAyF;AAAA,IACxG,eAAe,QAAQ,IAAI,sBAAsB,KAAK,KAAK;AAAA,IAC3D,eAAe,aAAa,QAAQ,IAAI,8BAA8B,KAAK;AAAA,IAC3E;AAAA,IACA,sBAAsB,cAAc,QAAQ,IAAI,wBAAwB,CAAC;AAAA,IACzE,2BAA2B,cAAc,QAAQ,IAAI,8BAA8B,IAAM;AAAA,IACzF,uBAAuB,aAAa,QAAQ,IAAI,yBAAyB,IAAI;AAAA,IAC7E,qBAAqB;AAAA,MACnB,SAAS,cAAc,QAAQ,IAAI,0BAA0B,CAAC;AAAA,MAC9D,UAAU,cAAc,QAAQ,IAAI,+BAA+B,CAAC;AAAA,MACpE,WAAW,cAAc,QAAQ,IAAI,gCAAgC,CAAC;AAAA,IACxE;AAAA,IACA,4BAA4B,cAAc,QAAQ,IAAI,+BAA+B,IAAM;AAAA,EAC7F;AACF;AAEA,SAAS,YAAY,KAAwC;AAC3D,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,WAAO,IAAI,IAAI,GAAG,EAAE,SAAS,YAAY;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,SAAkC;AACzD,QAAM,WAAW,QAAQ,kBAAkB,IAAI,YAAY;AAC3D,QAAM,YAAY,QAAQ,kBAAkB;AAC5C,QAAM,gBAAgB,WAAW,MAAM,YAAY;AAEnD,MACE,QAAQ,SAAS,oBAAoB,KACrC,QAAQ,SAAS,sBAAsB,KACvC,QAAQ,SAAS,uBAAuB,KACxC,QAAQ,SAAS,uBAAuB,KACxC,QAAQ,SAAS,sBAAsB,KACvC,QAAQ,SAAS,2BAA2B,GAC5C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,eAAgB,QAAO;AAC7C,MAAI,kBAAkB,kBAAkB,QAAQ,yBAAyB,gBAAiB,QAAO;AACjG,MAAI,kBAAkB,cAAe,QAAO;AAC5C,MAAI,kBAAkB,YAAa,QAAO;AAC1C,MAAI,QAAQ,yBAAyB,eAAgB,QAAO;AAC5D,MAAI,QAAQ,yBAAyB,UAAW,QAAO;AACvD,SAAO;AACT;AAEO,SAAS,yBAAyB,UAA8D;AACrG,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO;AAE/C,QAAM,WAAW,oBAAI,IAA2D;AAChF,aAAW,WAAW,UAAU;AAC9B,UAAM,WAAW,gBAAgB,OAAO;AACxC,UAAM,OAAO,YAAY,QAAQ,UAAU,KAAK;AAChD,UAAM,UAAU,SAAS,IAAI,QAAQ,KAAK,EAAE,OAAO,GAAG,OAAO,oBAAI,IAAoB,EAAE;AACvF,YAAQ,SAAS;AACjB,YAAQ,MAAM,IAAI,OAAO,QAAQ,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC;AAC1D,aAAS,IAAI,UAAU,OAAO;AAAA,EAChC;AAEA,QAAM,MAAM,CAAC,GAAG,SAAS,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AAC7E,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,WAAW,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,QAAQ,CAAC,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAEvB,SAAO;AAAA,IACL,UAAU,IAAI,CAAC;AAAA,IACf,OAAO,IAAI,CAAC,EAAE;AAAA,IACd,OAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,YAAmE;AAC/F,SAAO,CAAC,WAAW,WAAW,OAAO,KAAK,QAAQ,WAAW,iBAAiB;AAChF;AAEA,eAAsB,mBAAoC;AACxD,MAAI,oBAAoB,MAAM,iBAAiB;AAE/C,MAAI,qBAAqB,iBAAiB,GAAG;AAC3C,QAAI;AACF,YAAM,QAAQ,MAAM,eAAe;AACnC,0BAAoB,MAAM;AAAA,IAC5B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,MAAM,eAAe;AAC3B,QAAM,mBAAmB,+BAA+B;AAExD,SAAO,kBAAkB;AAAA,IACvB,SAAS;AAAA,MACP,YAAY,IAAI;AAAA,MAChB,QAAQ,IAAI;AAAA,MACZ,UAAU;AAAA,QACR,cAAc,iBAAiB;AAAA,QAC/B,oBAAoB,iBAAiB;AAAA,QACrC,eAAe,iBAAiB;AAAA,QAChC,eAAe,iBAAiB;AAAA,QAChC,sBAAsB,iBAAiB;AAAA,MACzC;AAAA,IACF;AAAA,IACA;AAAA,EACF,CAAC;AACH;",
6
+ "names": ["Box", "Text", "text", "jsx", "jsxs", "text", "Box", "Text"]
7
+ }