footprint-explainable-ui 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +288 -0
- package/dist/flowchart.cjs +1512 -0
- package/dist/flowchart.cjs.map +1 -0
- package/dist/flowchart.d.cts +199 -0
- package/dist/flowchart.d.ts +199 -0
- package/dist/flowchart.js +1486 -0
- package/dist/flowchart.js.map +1 -0
- package/dist/index.cjs +1946 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +270 -0
- package/dist/index.d.ts +270 -0
- package/dist/index.js +1901 -0
- package/dist/index.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/ThemeProvider.tsx","../src/theme/tokens.ts","../src/theme/styles.ts","../src/theme/presets.ts","../src/components/MemoryInspector/MemoryInspector.tsx","../src/components/NarrativeLog/NarrativeLog.tsx","../src/components/NarrativeTrace/NarrativeTrace.tsx","../src/components/GanttTimeline/GanttTimeline.tsx","../src/components/SnapshotPanel/SnapshotPanel.tsx","../src/components/ScopeDiff/ScopeDiff.tsx","../src/components/ResultPanel/ResultPanel.tsx","../src/components/TimeTravelControls/TimeTravelControls.tsx","../src/components/ExplainableShell/ExplainableShell.tsx","../src/adapters/fromRuntimeSnapshot.ts"],"sourcesContent":["import { createContext, useContext } from \"react\";\nimport type { ThemeTokens } from \"./tokens\";\nimport { tokensToCSSVars } from \"./tokens\";\n\nconst ThemeContext = createContext<ThemeTokens>({});\n\nexport function useFootprintTheme(): ThemeTokens {\n return useContext(ThemeContext);\n}\n\ninterface FootprintThemeProps {\n tokens?: ThemeTokens;\n children: React.ReactNode;\n}\n\n/**\n * Optional theme provider — wraps children with CSS custom properties.\n * Consumers can also just set --fp-* CSS variables directly.\n */\nexport function FootprintTheme({ tokens = {}, children }: FootprintThemeProps) {\n const cssVars = tokensToCSSVars(tokens);\n\n return (\n <ThemeContext.Provider value={tokens}>\n <div style={cssVars as React.CSSProperties} className=\"fp-theme-root\">\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n","/** Default theme tokens — consumers override via CSS variables or ThemeProvider. */\nexport interface ThemeTokens {\n colors?: {\n primary?: string;\n success?: string;\n error?: string;\n warning?: string;\n bgPrimary?: string;\n bgSecondary?: string;\n bgTertiary?: string;\n textPrimary?: string;\n textSecondary?: string;\n textMuted?: string;\n border?: string;\n };\n radius?: string;\n fontFamily?: {\n sans?: string;\n mono?: string;\n };\n}\n\n/** Maps ThemeTokens to CSS custom property assignments. */\nexport function tokensToCSSVars(tokens: ThemeTokens): Record<string, string> {\n const vars: Record<string, string> = {};\n if (tokens.colors) {\n const c = tokens.colors;\n if (c.primary) vars[\"--fp-color-primary\"] = c.primary;\n if (c.success) vars[\"--fp-color-success\"] = c.success;\n if (c.error) vars[\"--fp-color-error\"] = c.error;\n if (c.warning) vars[\"--fp-color-warning\"] = c.warning;\n if (c.bgPrimary) vars[\"--fp-bg-primary\"] = c.bgPrimary;\n if (c.bgSecondary) vars[\"--fp-bg-secondary\"] = c.bgSecondary;\n if (c.bgTertiary) vars[\"--fp-bg-tertiary\"] = c.bgTertiary;\n if (c.textPrimary) vars[\"--fp-text-primary\"] = c.textPrimary;\n if (c.textSecondary) vars[\"--fp-text-secondary\"] = c.textSecondary;\n if (c.textMuted) vars[\"--fp-text-muted\"] = c.textMuted;\n if (c.border) vars[\"--fp-border\"] = c.border;\n }\n if (tokens.radius) vars[\"--fp-radius\"] = tokens.radius;\n if (tokens.fontFamily?.sans) vars[\"--fp-font-sans\"] = tokens.fontFamily.sans;\n if (tokens.fontFamily?.mono) vars[\"--fp-font-mono\"] = tokens.fontFamily.mono;\n return vars;\n}\n\n/** Default dark theme values (used as CSS variable fallbacks). */\nexport const defaultTokens: Required<{\n [K in keyof ThemeTokens]-?: Required<ThemeTokens[K]>;\n}> = {\n colors: {\n primary: \"#6366f1\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n bgPrimary: \"#0f172a\",\n bgSecondary: \"#1e293b\",\n bgTertiary: \"#334155\",\n textPrimary: \"#f8fafc\",\n textSecondary: \"#94a3b8\",\n textMuted: \"#64748b\",\n border: \"#334155\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n","import type { Size } from \"../types\";\n\n/**\n * Helper to resolve a CSS variable with a fallback.\n * Usage: v(\"--fp-color-primary\", \"#6366f1\")\n */\nexport function v(varName: string, fallback: string): string {\n return `var(${varName}, ${fallback})`;\n}\n\n/** Shorthand for common theme variables */\nexport const theme = {\n primary: v(\"--fp-color-primary\", \"#6366f1\"),\n success: v(\"--fp-color-success\", \"#22c55e\"),\n error: v(\"--fp-color-error\", \"#ef4444\"),\n warning: v(\"--fp-color-warning\", \"#f59e0b\"),\n bgPrimary: v(\"--fp-bg-primary\", \"#0f172a\"),\n bgSecondary: v(\"--fp-bg-secondary\", \"#1e293b\"),\n bgTertiary: v(\"--fp-bg-tertiary\", \"#334155\"),\n textPrimary: v(\"--fp-text-primary\", \"#f8fafc\"),\n textSecondary: v(\"--fp-text-secondary\", \"#94a3b8\"),\n textMuted: v(\"--fp-text-muted\", \"#64748b\"),\n border: v(\"--fp-border\", \"#334155\"),\n radius: v(\"--fp-radius\", \"8px\"),\n fontSans: v(\"--fp-font-sans\", \"Inter, system-ui, -apple-system, sans-serif\"),\n fontMono: v(\"--fp-font-mono\", \"'JetBrains Mono', 'Fira Code', monospace\"),\n} as const;\n\n/** Font sizes per size variant */\nexport const fontSize: Record<Size, { label: number; body: number; small: number }> = {\n compact: { label: 10, body: 11, small: 9 },\n default: { label: 11, body: 12, small: 10 },\n detailed: { label: 12, body: 13, small: 11 },\n};\n\n/** Padding per size variant */\nexport const padding: Record<Size, number> = {\n compact: 8,\n default: 12,\n detailed: 16,\n};\n","import type { ThemeTokens } from \"./tokens\";\n\n/** Cool dark theme (the library default) */\nexport const coolDark: ThemeTokens = {\n colors: {\n primary: \"#6366f1\",\n success: \"#22c55e\",\n error: \"#ef4444\",\n warning: \"#f59e0b\",\n bgPrimary: \"#0f172a\",\n bgSecondary: \"#1e293b\",\n bgTertiary: \"#334155\",\n textPrimary: \"#f8fafc\",\n textSecondary: \"#94a3b8\",\n textMuted: \"#64748b\",\n border: \"#334155\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** Warm dark theme — charcoal-purple palette */\nexport const warmDark: ThemeTokens = {\n colors: {\n primary: \"#7c6cf0\",\n success: \"#3dd68c\",\n error: \"#f06292\",\n warning: \"#ffb74d\",\n bgPrimary: \"#1e1a2e\",\n bgSecondary: \"#2a2540\",\n bgTertiary: \"#3a3455\",\n textPrimary: \"#f0e6d6\",\n textSecondary: \"#a89eb4\",\n textMuted: \"#6e6480\",\n border: \"#3a3455\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** Warm light theme — cream/peach palette */\nexport const warmLight: ThemeTokens = {\n colors: {\n primary: \"#7c6cf0\",\n success: \"#22a860\",\n error: \"#d94452\",\n warning: \"#e09030\",\n bgPrimary: \"#faf5ef\",\n bgSecondary: \"#f0e6d6\",\n bgTertiary: \"#e4d5c3\",\n textPrimary: \"#2e2938\",\n textSecondary: \"#5c5468\",\n textMuted: \"#8a7e96\",\n border: \"#d6c8b4\",\n },\n radius: \"8px\",\n fontFamily: {\n sans: \"Inter, system-ui, -apple-system, sans-serif\",\n mono: \"'JetBrains Mono', 'Fira Code', monospace\",\n },\n};\n\n/** All built-in theme presets */\nexport const themePresets = {\n coolDark,\n warmDark,\n warmLight,\n} as const;\n\nexport type ThemePresetName = keyof typeof themePresets;\n","import { useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface MemoryInspectorProps extends BaseComponentProps {\n /** Single memory object or snapshots (will accumulate up to selectedIndex) */\n data?: Record<string, unknown>;\n /** When using snapshots mode, pass these instead of data */\n snapshots?: StageSnapshot[];\n /** Index to accumulate up to (for time-travel) */\n selectedIndex?: number;\n /** Show data types alongside values */\n showTypes?: boolean;\n /** Highlight keys that are new at this step */\n highlightNew?: boolean;\n}\n\n/**\n * Displays pipeline memory state as formatted JSON.\n * Supports both static (data prop) and time-travel (snapshots + selectedIndex) modes.\n */\nexport function MemoryInspector({\n data,\n snapshots,\n selectedIndex = 0,\n showTypes = false,\n highlightNew = true,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: MemoryInspectorProps) {\n // Compute accumulated memory from snapshots\n const { memory, newKeys } = useMemo(() => {\n if (data) {\n return { memory: data, newKeys: new Set<string>() };\n }\n if (!snapshots || snapshots.length === 0) {\n return { memory: {}, newKeys: new Set<string>() };\n }\n\n const merged: Record<string, unknown> = {};\n for (let i = 0; i <= Math.min(selectedIndex, snapshots.length - 1); i++) {\n Object.assign(merged, snapshots[i]?.memory);\n }\n\n const nk = new Set<string>();\n if (highlightNew && selectedIndex > 0) {\n const prev: Record<string, unknown> = {};\n for (let i = 0; i < selectedIndex; i++) {\n Object.assign(prev, snapshots[i]?.memory);\n }\n const current = snapshots[selectedIndex]?.memory ?? {};\n for (const k of Object.keys(current)) {\n if (!(k in prev)) nk.add(k);\n }\n } else if (highlightNew && selectedIndex === 0 && snapshots[0]) {\n for (const k of Object.keys(snapshots[0].memory)) nk.add(k);\n }\n\n return { memory: merged, newKeys: nk };\n }, [data, snapshots, selectedIndex, highlightNew]);\n\n const entries = Object.entries(memory);\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"memory-inspector\">\n <div data-fp=\"memory-label\">Memory State</div>\n <pre data-fp=\"memory-json\">\n {JSON.stringify(memory, null, 2)}\n </pre>\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n padding: pad,\n fontFamily: theme.fontSans,\n ...style,\n }}\n data-fp=\"memory-inspector\"\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n Memory State\n </span>\n <div\n style={{\n marginTop: 8,\n background: theme.bgSecondary,\n border: `1px solid ${theme.border}`,\n borderRadius: theme.radius,\n padding: `${pad}px ${pad + 4}px`,\n fontFamily: theme.fontMono,\n fontSize: fs.body,\n lineHeight: 1.8,\n }}\n >\n <span style={{ color: theme.textMuted }}>{\"{\"}</span>\n {entries.length === 0 && (\n <div\n style={{\n paddingLeft: 16,\n color: theme.textMuted,\n fontStyle: \"italic\",\n }}\n >\n {\"// empty\"}\n </div>\n )}\n {entries.map(([key, value], i) => {\n const isNew = newKeys.has(key);\n const isLast = i === entries.length - 1;\n return (\n <div\n key={key}\n style={{\n paddingLeft: 16,\n background: isNew\n ? `color-mix(in srgb, ${theme.success} 10%, transparent)`\n : \"transparent\",\n borderRadius: 4,\n marginLeft: -4,\n marginRight: -4,\n paddingRight: 4,\n }}\n >\n <span style={{ color: theme.primary }}>"{key}"</span>\n <span style={{ color: theme.textMuted }}>: </span>\n <span style={{ color: theme.success }}>\n {formatValue(value)}\n </span>\n {showTypes && (\n <span\n style={{\n color: theme.textMuted,\n fontSize: fs.small,\n marginLeft: 8,\n opacity: 0.6,\n }}\n >\n ({typeof value})\n </span>\n )}\n {!isLast && <span style={{ color: theme.textMuted }}>,</span>}\n </div>\n );\n })}\n <span style={{ color: theme.textMuted }}>{\"}\"}</span>\n </div>\n </div>\n );\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${value}\"`;\n if (typeof value === \"object\" && value !== null) return JSON.stringify(value);\n return String(value);\n}\n","import { useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface NarrativeLogProps extends BaseComponentProps {\n /** Snapshots to display narratives from */\n snapshots: StageSnapshot[];\n /** Show narratives up to this index (for time-travel sync) */\n selectedIndex?: number;\n /** Show a single narrative string (simple mode) */\n narrative?: string;\n}\n\n/**\n * Timeline-style execution log showing what happened at each stage.\n * Supports both full snapshots mode and single-narrative mode.\n */\nexport function NarrativeLog({\n snapshots,\n selectedIndex,\n narrative,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: NarrativeLogProps) {\n const entries = useMemo(() => {\n if (narrative) {\n return [{ label: \"Output\", text: narrative, isCurrent: true }];\n }\n const idx = selectedIndex ?? snapshots.length - 1;\n return snapshots.slice(0, idx + 1).map((s, i) => ({\n label: s.stageLabel,\n text: s.narrative,\n isCurrent: i === idx,\n }));\n }, [snapshots, selectedIndex, narrative]);\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"narrative-log\">\n {entries.map((entry, i) => (\n <div key={i} data-fp=\"narrative-entry\" data-current={entry.isCurrent}>\n <strong>{entry.label}</strong>\n <p>{entry.text}</p>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontSans, ...style }}\n data-fp=\"narrative-log\"\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n Execution Log\n </span>\n <div style={{ marginTop: 8, display: \"flex\", flexDirection: \"column\" }}>\n {entries.map((entry, i) => (\n <div\n key={i}\n style={{\n display: \"flex\",\n gap: 10,\n padding: `${pad}px 0`,\n borderBottom:\n i < entries.length - 1 ? `1px solid ${theme.border}` : \"none\",\n }}\n >\n {/* Timeline dot + line */}\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n width: 12,\n flexShrink: 0,\n paddingTop: 5,\n }}\n >\n <div\n style={{\n width: 8,\n height: 8,\n borderRadius: \"50%\",\n background: entry.isCurrent ? theme.primary : theme.success,\n flexShrink: 0,\n }}\n />\n {i < entries.length - 1 && (\n <div\n style={{\n width: 1,\n flex: 1,\n background: theme.border,\n marginTop: 4,\n }}\n />\n )}\n </div>\n\n {/* Content */}\n <div style={{ flex: 1, minWidth: 0 }}>\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: entry.isCurrent ? theme.primary : theme.textMuted,\n }}\n >\n {entry.label}\n </span>\n <div\n style={{\n fontSize: fs.body,\n lineHeight: 1.5,\n color: entry.isCurrent ? theme.textPrimary : theme.textSecondary,\n marginTop: 2,\n }}\n >\n {entry.text}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useEffect, useRef } from \"react\";\nimport type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface NarrativeGroup {\n header: string;\n headerIdx: number;\n steps: { text: string; idx: number }[];\n}\n\nexport interface NarrativeTraceProps extends BaseComponentProps {\n /** All narrative lines (full trace) */\n narrative: string[];\n /** Number of lines currently revealed (for progressive reveal). Defaults to all. */\n revealedCount?: number;\n /** Start with all groups collapsed */\n defaultCollapsed?: boolean;\n /** Called when user clicks a stage header */\n onStageClick?: (headerIndex: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction parseGroups(lines: string[]): NarrativeGroup[] {\n const groups: NarrativeGroup[] = [];\n let current: NarrativeGroup | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trimStart();\n const isStep = trimmed.startsWith(\"Step \") || /^\\s/.test(line);\n\n if (!isStep || !current) {\n current = { header: line, headerIdx: i, steps: [] };\n groups.push(current);\n } else {\n current.steps.push({ text: trimmed, idx: i });\n }\n }\n\n return groups;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function NarrativeTrace({\n narrative,\n revealedCount,\n defaultCollapsed = false,\n onStageClick,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: NarrativeTraceProps) {\n const revealed = revealedCount != null ? narrative.slice(0, revealedCount) : narrative;\n const future = revealedCount != null ? narrative.slice(revealedCount) : [];\n\n const revealedGroups = useMemo(() => parseGroups(revealed), [revealed]);\n const futureGroups = useMemo(() => parseGroups(future), [future]);\n\n const [collapsedSet, setCollapsedSet] = useState<Set<number>>(() => {\n if (!defaultCollapsed) return new Set();\n return new Set(parseGroups(narrative).map((g) => g.headerIdx));\n });\n\n const latestRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n latestRef.current?.scrollIntoView({ behavior: \"smooth\", block: \"nearest\" });\n }, [revealedGroups.length]);\n\n const toggle = useCallback((idx: number) => {\n setCollapsedSet((prev) => {\n const next = new Set(prev);\n if (next.has(idx)) next.delete(idx);\n else next.add(idx);\n return next;\n });\n }, []);\n\n const lastIdx = revealedGroups.length - 1;\n const fs = fontSize[size];\n const pad = padding[size];\n\n // ── Unstyled mode ──\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"narrative-trace\">\n {revealedGroups.map((group, gi) => (\n <div key={group.headerIdx} data-fp=\"narrative-group\" data-latest={gi === lastIdx}>\n <div\n data-fp=\"narrative-header\"\n data-collapsible={group.steps.length > 0}\n data-collapsed={collapsedSet.has(group.headerIdx)}\n onClick={() => {\n if (group.steps.length > 0) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n >\n {group.header}\n </div>\n {!collapsedSet.has(group.headerIdx) &&\n group.steps.map((step) => (\n <div key={step.idx} data-fp=\"narrative-step\">\n {step.text}\n </div>\n ))}\n </div>\n ))}\n {futureGroups.map((group) => (\n <div key={`f-${group.headerIdx}`} data-fp=\"narrative-group\" data-future>\n <div data-fp=\"narrative-header\">{group.header}</div>\n {group.steps.map((step) => (\n <div key={`f-${step.idx}`} data-fp=\"narrative-step\">\n {step.text}\n </div>\n ))}\n </div>\n ))}\n </div>\n );\n }\n\n // ── Styled mode ──\n return (\n <div\n className={className}\n style={{\n flex: 1,\n overflow: \"auto\",\n padding: pad,\n fontFamily: theme.fontMono,\n ...style,\n }}\n data-fp=\"narrative-trace\"\n >\n {revealedGroups.map((group, gi) => {\n const isLatest = gi === lastIdx;\n const isCollapsed = collapsedSet.has(group.headerIdx);\n const hasSteps = group.steps.length > 0;\n\n return (\n <div\n key={group.headerIdx}\n ref={isLatest ? latestRef : undefined}\n style={{ marginBottom: 2 }}\n data-fp=\"narrative-group\"\n >\n {/* Stage header */}\n <div\n onClick={() => {\n if (hasSteps) toggle(group.headerIdx);\n onStageClick?.(group.headerIdx);\n }}\n style={{\n fontSize: fs.body,\n lineHeight: 1.7,\n color: isLatest ? theme.textPrimary : theme.textSecondary,\n padding: `4px ${pad - 4}px`,\n borderRadius: 4,\n background: isLatest ? theme.bgTertiary : \"transparent\",\n borderLeft: isLatest\n ? `3px solid ${theme.primary}`\n : `3px solid ${theme.success}`,\n cursor: hasSteps ? \"pointer\" : \"default\",\n fontWeight: 600,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n userSelect: \"none\",\n transition: \"all 0.15s ease\",\n }}\n >\n {hasSteps && (\n <span\n style={{\n fontSize: fs.small - 1,\n color: theme.textMuted,\n transition: \"transform 0.15s ease\",\n transform: isCollapsed ? \"rotate(-90deg)\" : \"rotate(0deg)\",\n display: \"inline-block\",\n width: 10,\n flexShrink: 0,\n }}\n >\n ▼\n </span>\n )}\n {!hasSteps && <span style={{ width: 10, flexShrink: 0 }} />}\n <span>{group.header}</span>\n </div>\n\n {/* Step lines */}\n {!isCollapsed &&\n group.steps.map((step) => (\n <div\n key={step.idx}\n style={{\n fontSize: fs.small,\n lineHeight: 1.6,\n color: isLatest ? theme.textSecondary : theme.textMuted,\n padding: `2px ${pad - 4}px 2px ${pad + 20}px`,\n opacity: isLatest ? 0.9 : 0.7,\n transition: \"all 0.15s ease\",\n }}\n data-fp=\"narrative-step\"\n >\n {step.text}\n </div>\n ))}\n </div>\n );\n })}\n\n {/* Dimmed future groups */}\n {futureGroups.length > 0 && (\n <div style={{ opacity: 0.2 }}>\n {futureGroups.map((group) => (\n <div key={`f-${group.headerIdx}`} style={{ marginBottom: 2 }}>\n <div\n style={{\n fontSize: fs.body,\n lineHeight: 1.7,\n color: theme.textMuted,\n padding: `4px ${pad - 4}px`,\n borderLeft: `3px solid ${theme.border}`,\n fontWeight: 600,\n paddingLeft: pad + 12,\n }}\n >\n {group.header}\n </div>\n {group.steps.map((step) => (\n <div\n key={`f-${step.idx}`}\n style={{\n fontSize: fs.small,\n lineHeight: 1.6,\n color: theme.textMuted,\n padding: `2px ${pad - 4}px 2px ${pad + 20}px`,\n }}\n >\n {step.text}\n </div>\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface GanttTimelineProps extends BaseComponentProps {\n /** Stage snapshots with timing info */\n snapshots: StageSnapshot[];\n /** Currently selected stage index */\n selectedIndex?: number;\n /** Callback when a stage bar is clicked */\n onSelect?: (index: number) => void;\n}\n\n/**\n * Horizontal Gantt-style timeline showing stage durations and overlap.\n * Great for performance analysis of pipeline execution.\n */\nexport function GanttTimeline({\n snapshots,\n selectedIndex = 0,\n onSelect,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: GanttTimelineProps) {\n const totalWallTime = useMemo(\n () => Math.max(...snapshots.map((s) => s.startMs + s.durationMs), 1),\n [snapshots]\n );\n\n const fs = fontSize[size];\n const pad = padding[size];\n const labelWidth = size === \"compact\" ? 50 : size === \"detailed\" ? 100 : 80;\n const msWidth = size === \"compact\" ? 28 : 36;\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"gantt-timeline\">\n {snapshots.map((snap, idx) => (\n <div\n key={snap.stageName}\n data-fp=\"gantt-bar\"\n data-selected={idx === selectedIndex}\n data-visible={idx <= selectedIndex}\n onClick={() => onSelect?.(idx)}\n >\n <span data-fp=\"gantt-label\">{snap.stageLabel}</span>\n <span data-fp=\"gantt-duration\">{snap.durationMs}ms</span>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontSans, ...style }}\n data-fp=\"gantt-timeline\"\n >\n <span\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n }}\n >\n {size === \"compact\" ? \"Timeline\" : \"Execution Timeline\"}\n </span>\n <div\n style={{\n marginTop: 8,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 4,\n }}\n >\n {snapshots.map((snap, idx) => {\n const leftPct = (snap.startMs / totalWallTime) * 100;\n const widthPct = Math.max((snap.durationMs / totalWallTime) * 100, 1);\n const isSelected = idx === selectedIndex;\n const isVisible = idx <= selectedIndex;\n\n return (\n <div\n key={snap.stageName}\n onClick={() => onSelect?.(idx)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: size === \"compact\" ? 4 : 8,\n cursor: onSelect ? \"pointer\" : \"default\",\n opacity: isVisible ? 1 : 0.3,\n transition: \"opacity 0.3s ease\",\n }}\n >\n <span\n style={{\n width: labelWidth,\n fontSize: fs.small,\n color: isSelected ? theme.primary : theme.textMuted,\n fontWeight: isSelected ? 600 : 400,\n textAlign: \"right\",\n flexShrink: 0,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {snap.stageLabel}\n </span>\n <div\n style={{\n flex: 1,\n height: size === \"compact\" ? 6 : 8,\n position: \"relative\",\n background: theme.bgTertiary,\n borderRadius: 3,\n }}\n >\n {isVisible && (\n <div\n style={{\n position: \"absolute\",\n left: `${leftPct}%`,\n top: 0,\n width: `${widthPct}%`,\n height: \"100%\",\n borderRadius: 3,\n background: isSelected ? theme.primary : theme.success,\n transition: \"width 0.3s ease\",\n }}\n />\n )}\n </div>\n <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n width: msWidth,\n flexShrink: 0,\n }}\n >\n {snap.durationMs}ms\n </span>\n </div>\n );\n })}\n </div>\n\n {/* Time axis */}\n <div\n style={{\n marginTop: 4,\n marginLeft: labelWidth + (size === \"compact\" ? 4 : 8),\n marginRight: msWidth + (size === \"compact\" ? 4 : 8),\n display: \"flex\",\n justifyContent: \"space-between\",\n fontSize: fs.small - 1,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n }}\n >\n <span>0ms</span>\n {size !== \"compact\" && (\n <span>{(totalWallTime / 2).toFixed(1)}ms</span>\n )}\n <span>{totalWallTime.toFixed(1)}ms</span>\n </div>\n </div>\n );\n}\n","import { useState } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\nimport { MemoryInspector } from \"../MemoryInspector\";\nimport { NarrativeLog } from \"../NarrativeLog\";\nimport { GanttTimeline } from \"../GanttTimeline\";\n\nexport interface SnapshotPanelProps extends BaseComponentProps {\n /** Stage snapshots from pipeline execution */\n snapshots: StageSnapshot[];\n /** Show the Gantt timeline */\n showGantt?: boolean;\n /** Show the time-travel scrubber */\n showScrubber?: boolean;\n /** Title override */\n title?: string;\n}\n\n/**\n * All-in-one panel: time-travel scrubber + memory inspector + narrative log + gantt.\n * Drop this into any page to make a pipeline run inspectable.\n */\nexport function SnapshotPanel({\n snapshots,\n showGantt = true,\n showScrubber = true,\n title = \"Pipeline Inspector\",\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: SnapshotPanelProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (snapshots.length === 0) {\n return (\n <div\n className={className}\n style={{\n padding: pad * 2,\n textAlign: \"center\",\n color: unstyled ? undefined : theme.textMuted,\n fontSize: fs.body,\n ...style,\n }}\n data-fp=\"snapshot-panel\"\n >\n No snapshots to display\n </div>\n );\n }\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"snapshot-panel\">\n <h3>{title}</h3>\n {showScrubber && (\n <input\n type=\"range\"\n min={0}\n max={snapshots.length - 1}\n value={selectedIndex}\n onChange={(e) => setSelectedIndex(parseInt(e.target.value))}\n />\n )}\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n unstyled\n />\n <NarrativeLog\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n unstyled\n />\n {showGantt && (\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n unstyled\n />\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: theme.bgPrimary,\n fontFamily: theme.fontSans,\n overflow: \"hidden\",\n ...style,\n }}\n data-fp=\"snapshot-panel\"\n >\n {/* Header with title + scrubber */}\n <div\n style={{\n padding: `${pad}px ${pad + 4}px`,\n borderBottom: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n marginBottom: showScrubber ? 8 : 0,\n }}\n >\n <span\n style={{\n fontSize: fs.body + 2,\n fontWeight: 600,\n color: theme.textPrimary,\n }}\n >\n {title}\n </span>\n <span\n style={{\n fontSize: fs.small,\n color: theme.textMuted,\n fontFamily: theme.fontMono,\n }}\n >\n {selectedIndex + 1}/{snapshots.length}\n </span>\n </div>\n\n {showScrubber && (\n <div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <ScrubButton\n label=\"\\u25C0\"\n disabled={selectedIndex === 0}\n onClick={() => setSelectedIndex((i) => Math.max(0, i - 1))}\n />\n <input\n type=\"range\"\n min={0}\n max={snapshots.length - 1}\n value={selectedIndex}\n onChange={(e) => setSelectedIndex(parseInt(e.target.value))}\n style={{\n flex: 1,\n height: 4,\n accentColor: theme.primary,\n cursor: \"pointer\",\n }}\n />\n <ScrubButton\n label=\"\\u25B6\"\n disabled={selectedIndex === snapshots.length - 1}\n onClick={() =>\n setSelectedIndex((i) => Math.min(snapshots.length - 1, i + 1))\n }\n />\n </div>\n )}\n </div>\n\n {/* Content */}\n <div style={{ flex: 1, overflow: \"auto\" }}>\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n size={size}\n />\n <div\n style={{\n height: 1,\n background: theme.border,\n margin: `0 ${pad}px`,\n }}\n />\n <NarrativeLog\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n size={size}\n />\n </div>\n\n {/* Gantt footer */}\n {showGantt && (\n <div\n style={{\n borderTop: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n size={size}\n />\n </div>\n )}\n </div>\n );\n}\n\nfunction ScrubButton({\n label,\n disabled,\n onClick,\n}: {\n label: string;\n disabled: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n style={{\n background: theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: disabled ? theme.textMuted : theme.textPrimary,\n borderRadius: 6,\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n fontSize: 12,\n flexShrink: 0,\n }}\n >\n {label}\n </button>\n );\n}\n","import { useMemo } from \"react\";\nimport type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface DiffEntry {\n key: string;\n type: \"added\" | \"removed\" | \"changed\" | \"unchanged\";\n oldValue?: unknown;\n newValue?: unknown;\n}\n\nexport interface ScopeDiffProps extends BaseComponentProps {\n /** Memory state before the current stage */\n previous: Record<string, unknown> | null;\n /** Memory state after the current stage */\n current: Record<string, unknown>;\n /** Hide unchanged keys (default: false) */\n hideUnchanged?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction computeDiff(\n prev: Record<string, unknown> | null,\n curr: Record<string, unknown>\n): DiffEntry[] {\n const entries: DiffEntry[] = [];\n const allKeys = new Set([...Object.keys(prev ?? {}), ...Object.keys(curr)]);\n\n for (const key of allKeys) {\n const inPrev = prev != null && key in prev;\n const inCurr = key in curr;\n const oldVal = prev?.[key];\n const newVal = curr[key];\n\n if (!inPrev && inCurr) {\n entries.push({ key, type: \"added\", newValue: newVal });\n } else if (inPrev && !inCurr) {\n entries.push({ key, type: \"removed\", oldValue: oldVal });\n } else if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n entries.push({ key, type: \"changed\", oldValue: oldVal, newValue: newVal });\n } else {\n entries.push({ key, type: \"unchanged\", newValue: newVal });\n }\n }\n\n const order = { added: 0, changed: 1, removed: 2, unchanged: 3 };\n entries.sort((a, b) => order[a.type] - order[b.type]);\n return entries;\n}\n\nfunction fmt(v: unknown): string {\n if (typeof v === \"string\") return `\"${v}\"`;\n if (typeof v === \"object\" && v !== null) return JSON.stringify(v, null, 2);\n return String(v);\n}\n\nconst diffColors: Record<DiffEntry[\"type\"], { bg: string; fg: string; icon: string }> = {\n added: { bg: \"rgba(34,197,94,0.10)\", fg: \"#22c55e\", icon: \"+\" },\n removed: { bg: \"rgba(239,68,68,0.10)\", fg: \"#ef4444\", icon: \"-\" },\n changed: { bg: \"rgba(245,158,11,0.10)\", fg: \"#f59e0b\", icon: \"~\" },\n unchanged: { bg: \"transparent\", fg: \"\", icon: \" \" },\n};\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ScopeDiff({\n previous,\n current,\n hideUnchanged = false,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ScopeDiffProps) {\n const entries = useMemo(() => computeDiff(previous, current), [previous, current]);\n const visible = hideUnchanged ? entries.filter((e) => e.type !== \"unchanged\") : entries;\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"scope-diff\">\n {visible.map((e) => (\n <div key={e.key} data-fp=\"diff-entry\" data-type={e.type}>\n <span data-fp=\"diff-key\">{e.key}</span>\n {e.type === \"changed\" && (\n <>\n <span data-fp=\"diff-old\">{fmt(e.oldValue)}</span>\n <span data-fp=\"diff-new\">{fmt(e.newValue)}</span>\n </>\n )}\n {(e.type === \"added\" || e.type === \"unchanged\") && (\n <span data-fp=\"diff-value\">{fmt(e.newValue)}</span>\n )}\n {e.type === \"removed\" && (\n <span data-fp=\"diff-value\">{fmt(e.oldValue)}</span>\n )}\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{ padding: pad, fontFamily: theme.fontMono, ...style }}\n data-fp=\"scope-diff\"\n >\n {visible.length === 0 && (\n <div style={{ fontSize: fs.body, color: theme.textMuted, fontStyle: \"italic\" }}>\n No changes\n </div>\n )}\n {visible.map((entry) => {\n const dc = diffColors[entry.type];\n return (\n <div\n key={entry.key}\n style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 8,\n padding: `4px ${pad - 4}px`,\n marginBottom: 2,\n borderRadius: 4,\n background: dc.bg,\n fontSize: fs.body,\n lineHeight: 1.5,\n }}\n data-fp=\"diff-entry\"\n >\n <span\n style={{\n width: 16,\n flexShrink: 0,\n fontWeight: 700,\n color: dc.fg || theme.textMuted,\n textAlign: \"center\",\n }}\n >\n {dc.icon}\n </span>\n <span style={{ color: theme.primary, fontWeight: 600, flexShrink: 0 }}>\n {entry.key}\n </span>\n <span style={{ color: theme.textMuted }}>=</span>\n {entry.type === \"changed\" ? (\n <span>\n <span\n style={{\n color: theme.error,\n textDecoration: \"line-through\",\n opacity: 0.7,\n }}\n >\n {fmt(entry.oldValue)}\n </span>\n <span style={{ color: theme.textMuted, margin: \"0 4px\" }}>→</span>\n <span style={{ color: theme.success }}>{fmt(entry.newValue)}</span>\n </span>\n ) : (\n <span\n style={{\n color:\n entry.type === \"added\"\n ? theme.success\n : entry.type === \"removed\"\n ? theme.error\n : theme.textPrimary,\n }}\n >\n {fmt(entry.type === \"removed\" ? entry.oldValue : entry.newValue)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n","import type { BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\n\nexport interface ResultPanelProps extends BaseComponentProps {\n /** Final pipeline output / shared state */\n data: Record<string, unknown> | null;\n /** Optional console log lines */\n logs?: string[];\n /** Hide console section (default: false) */\n hideConsole?: boolean;\n}\n\nexport function ResultPanel({\n data,\n logs = [],\n hideConsole = false,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ResultPanelProps) {\n const fs = fontSize[size];\n const pad = padding[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"result-panel\">\n <div data-fp=\"result-data\">\n <pre>{data ? JSON.stringify(data, null, 2) : \"No data\"}</pre>\n </div>\n {!hideConsole && (\n <div data-fp=\"result-console\">\n {logs.map((line, i) => (\n <div key={i} data-fp=\"console-line\" data-error={line.startsWith(\"ERROR\")}>\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div\n className={className}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n ...style,\n }}\n data-fp=\"result-panel\"\n >\n {data && (\n <div style={{ flex: 1, overflow: \"auto\", padding: pad }}>\n <div\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n marginBottom: 8,\n }}\n >\n {size === \"compact\" ? \"Result\" : \"Business Result (Scope)\"}\n </div>\n <pre\n style={{\n fontSize: fs.body,\n fontFamily: theme.fontMono,\n color: theme.textPrimary,\n background: theme.bgSecondary,\n padding: pad,\n borderRadius: theme.radius,\n overflow: \"auto\",\n margin: 0,\n }}\n >\n {JSON.stringify(data, null, 2)}\n </pre>\n </div>\n )}\n\n {!hideConsole && (\n <div\n style={{\n borderTop: `1px solid ${theme.border}`,\n padding: pad,\n overflow: \"auto\",\n maxHeight: \"40%\",\n flexShrink: 0,\n }}\n >\n <div\n style={{\n fontSize: fs.label,\n fontWeight: 600,\n color: theme.textMuted,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n marginBottom: 8,\n }}\n >\n Console\n </div>\n {logs.length === 0 && (\n <div style={{ fontSize: fs.body, color: theme.textMuted, fontStyle: \"italic\" }}>\n No console output\n </div>\n )}\n {logs.map((line, i) => (\n <div\n key={i}\n style={{\n fontSize: fs.body,\n fontFamily: theme.fontMono,\n color: line.startsWith(\"ERROR\") ? theme.error : theme.textPrimary,\n padding: \"2px 0\",\n borderBottom: `1px solid ${theme.bgSecondary}`,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n }}\n >\n {line}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize } from \"../../theme\";\n\nexport interface TimeTravelControlsProps extends BaseComponentProps {\n /** Stage snapshots */\n snapshots: StageSnapshot[];\n /** Currently selected stage index */\n selectedIndex: number;\n /** Callback when selected index changes */\n onIndexChange: (index: number) => void;\n /** Enable auto-play with Gantt-proportional timing */\n autoPlayable?: boolean;\n}\n\nexport function TimeTravelControls({\n snapshots,\n selectedIndex,\n onIndexChange,\n autoPlayable = true,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: TimeTravelControlsProps) {\n const [playing, setPlaying] = useState(false);\n const playRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const total = snapshots.length;\n const canPrev = selectedIndex > 0;\n const canNext = selectedIndex < total - 1;\n\n // Auto-advance with proportional timing\n useEffect(() => {\n if (!playing || !autoPlayable) return;\n if (selectedIndex >= total - 1) {\n setPlaying(false);\n return;\n }\n const stageDur = snapshots[selectedIndex]?.durationMs ?? 1;\n const totalDur = snapshots.reduce((s, snap) => s + snap.durationMs, 0) || 1;\n const fraction = stageDur / totalDur;\n const baseMs = 3000;\n const delay = Math.max(200, Math.min(fraction * baseMs, 2000));\n\n playRef.current = setTimeout(() => {\n onIndexChange(selectedIndex + 1);\n }, delay);\n\n return () => {\n if (playRef.current) clearTimeout(playRef.current);\n };\n }, [playing, selectedIndex, snapshots, total, onIndexChange, autoPlayable]);\n\n const togglePlay = useCallback(() => {\n if (playing) {\n setPlaying(false);\n } else {\n if (selectedIndex >= total - 1) onIndexChange(0);\n setPlaying(true);\n }\n }, [playing, selectedIndex, total, onIndexChange]);\n\n const fs = fontSize[size];\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"time-travel-controls\">\n <button\n data-fp=\"tt-prev\"\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n >\n Prev\n </button>\n {autoPlayable && (\n <button data-fp=\"tt-play\" onClick={togglePlay}>\n {playing ? \"Pause\" : \"Play\"}\n </button>\n )}\n <button\n data-fp=\"tt-next\"\n disabled={!canNext || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex + 1); }}\n >\n Next\n </button>\n <div data-fp=\"tt-ticks\">\n {snapshots.map((snap, i) => (\n <button\n key={i}\n data-fp=\"tt-tick\"\n data-active={i === selectedIndex}\n data-done={i < selectedIndex}\n onClick={() => { setPlaying(false); onIndexChange(i); }}\n title={snap.stageLabel}\n />\n ))}\n </div>\n </div>\n );\n }\n\n const btnStyle = (disabled: boolean): React.CSSProperties => ({\n background: theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: disabled ? theme.textMuted : theme.textPrimary,\n borderRadius: \"6px\",\n padding: \"4px 12px\",\n fontSize: fs.body,\n fontWeight: 600,\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.5 : 1,\n flexShrink: 0,\n });\n\n return (\n <div\n className={className}\n style={{\n padding: \"6px 12px\",\n background: theme.bgSecondary,\n borderBottom: `1px solid ${theme.border}`,\n display: \"flex\",\n alignItems: \"center\",\n gap: 6,\n flexShrink: 0,\n ...style,\n }}\n data-fp=\"time-travel-controls\"\n >\n <button\n style={btnStyle(!canPrev || playing)}\n disabled={!canPrev || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex - 1); }}\n >\n ◀\n </button>\n\n {autoPlayable && (\n <button\n onClick={togglePlay}\n style={{\n background: playing ? theme.primary : theme.bgTertiary,\n border: `1px solid ${theme.border}`,\n color: playing ? \"white\" : theme.textPrimary,\n borderRadius: \"6px\",\n width: 28,\n height: 28,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n fontSize: 14,\n flexShrink: 0,\n }}\n title={playing ? \"Pause\" : \"Play\"}\n >\n {playing ? \"\\u23F8\" : \"\\u25B6\"}\n </button>\n )}\n\n <button\n style={btnStyle(!canNext || playing)}\n disabled={!canNext || playing}\n onClick={() => { setPlaying(false); onIndexChange(selectedIndex + 1); }}\n >\n ▶\n </button>\n\n {/* Tick-mark timeline */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n gap: 2,\n padding: \"0 4px\",\n }}\n >\n {snapshots.map((snap, i) => {\n const isActive = i === selectedIndex;\n const isDone = i < selectedIndex;\n return (\n <button\n key={i}\n onClick={() => { setPlaying(false); onIndexChange(i); }}\n title={snap.stageLabel}\n style={{\n flex: 1,\n height: isActive ? 14 : 8,\n borderRadius: 3,\n border: \"none\",\n cursor: \"pointer\",\n background: isActive\n ? theme.primary\n : isDone\n ? theme.success\n : theme.bgTertiary,\n opacity: isDone || isActive ? 1 : 0.4,\n transition: \"all 0.15s ease\",\n }}\n />\n );\n })}\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport type { StageSnapshot, BaseComponentProps } from \"../../types\";\nimport { theme, fontSize, padding } from \"../../theme\";\nimport { ResultPanel } from \"../ResultPanel\";\nimport { GanttTimeline } from \"../GanttTimeline\";\nimport { MemoryInspector } from \"../MemoryInspector\";\nimport { NarrativeTrace } from \"../NarrativeTrace\";\nimport { ScopeDiff } from \"../ScopeDiff\";\nimport { TimeTravelControls } from \"../TimeTravelControls\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ShellTab = \"result\" | \"explainable\" | \"ai-compatible\";\n\nexport interface ExplainableShellProps extends BaseComponentProps {\n /** Stage snapshots for time-travel visualization */\n snapshots: StageSnapshot[];\n /** Final pipeline result data */\n resultData?: Record<string, unknown> | null;\n /** Console log lines */\n logs?: string[];\n /** Combined narrative lines */\n narrative?: string[];\n /** Which tabs to show (default: all three) */\n tabs?: ShellTab[];\n /** Initially active tab */\n defaultTab?: ShellTab;\n /** Hide console in result tab */\n hideConsole?: boolean;\n /** Custom content to render in each tab slot */\n renderFlowchart?: (props: {\n snapshots: StageSnapshot[];\n selectedIndex: number;\n onNodeClick?: (index: number) => void;\n }) => React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ExplainableShell({\n snapshots,\n resultData,\n logs = [],\n narrative = [],\n tabs = [\"result\", \"explainable\", \"ai-compatible\"],\n defaultTab,\n hideConsole = false,\n renderFlowchart,\n size = \"default\",\n unstyled = false,\n className,\n style,\n}: ExplainableShellProps) {\n const [activeTab, setActiveTab] = useState<ShellTab>(defaultTab ?? tabs[0]);\n const [snapshotIdx, setSnapshotIdx] = useState(0);\n\n const fs = fontSize[size];\n const pad = padding[size];\n\n const handleSnapshotChange = useCallback((idx: number) => {\n setSnapshotIdx(Math.max(0, Math.min(idx, snapshots.length - 1)));\n }, [snapshots.length]);\n\n // Progressive narrative reveal\n const revealedCount = useMemo(() => {\n if (snapshots.length === 0 || narrative.length === 0) return narrative.length;\n\n const boundaries: number[] = [];\n for (let i = 0; i < narrative.length; i++) {\n const trimmed = narrative[i].trimStart();\n if (\n (trimmed.startsWith(\"Stage \") && !trimmed.match(/^Stage\\s+\\d+:\\s*Step\\s/)) ||\n trimmed.startsWith(\"[\")\n ) {\n boundaries.push(i);\n }\n }\n\n if (boundaries.length === 0) {\n const ratio = (snapshotIdx + 1) / snapshots.length;\n return Math.max(1, Math.ceil(narrative.length * ratio));\n }\n\n const groupsToShow = Math.max(\n 1,\n Math.min(\n Math.floor(((snapshotIdx + 1) / snapshots.length) * boundaries.length) || 1,\n boundaries.length\n )\n );\n\n const endIdx =\n groupsToShow < boundaries.length ? boundaries[groupsToShow] : narrative.length;\n\n return Math.max(1, endIdx);\n }, [snapshots.length, snapshotIdx, narrative]);\n\n // Scope diff data\n const prevMemory = snapshotIdx > 0 ? snapshots[snapshotIdx - 1]?.memory : null;\n const currMemory = snapshots[snapshotIdx]?.memory ?? {};\n\n const tabLabels: Record<ShellTab, string> = {\n result: \"Result\",\n explainable: \"Explainable\",\n \"ai-compatible\": \"AI-Compatible\",\n };\n\n if (unstyled) {\n return (\n <div className={className} style={style} data-fp=\"explainable-shell\">\n <div data-fp=\"shell-tabs\">\n {tabs.map((tab) => (\n <button\n key={tab}\n data-fp=\"shell-tab\"\n data-active={tab === activeTab}\n onClick={() => setActiveTab(tab)}\n >\n {tabLabels[tab]}\n </button>\n ))}\n </div>\n <div data-fp=\"shell-content\" data-tab={activeTab}>\n {activeTab === \"result\" && (\n <ResultPanel\n data={resultData ?? null}\n logs={logs}\n hideConsole={hideConsole}\n unstyled\n />\n )}\n {activeTab === \"explainable\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n unstyled\n />\n {renderFlowchart?.({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n <MemoryInspector snapshots={snapshots} selectedIndex={snapshotIdx} unstyled />\n <ScopeDiff previous={prevMemory} current={currMemory} unstyled />\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onSelect={handleSnapshotChange}\n unstyled\n />\n </>\n )}\n {activeTab === \"ai-compatible\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n unstyled\n />\n {renderFlowchart?.({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n <NarrativeTrace\n narrative={narrative}\n revealedCount={revealedCount}\n unstyled\n />\n </>\n )}\n </div>\n </div>\n );\n }\n\n // ── Styled mode ──\n return (\n <div\n className={className}\n style={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n background: theme.bgPrimary,\n color: theme.textPrimary,\n fontFamily: theme.fontSans,\n ...style,\n }}\n data-fp=\"explainable-shell\"\n >\n {/* Tab bar */}\n <div\n style={{\n display: \"flex\",\n gap: 0,\n borderBottom: `1px solid ${theme.border}`,\n background: theme.bgSecondary,\n flexShrink: 0,\n }}\n >\n {tabs.map((tab) => {\n const active = tab === activeTab;\n return (\n <button\n key={tab}\n onClick={() => setActiveTab(tab)}\n style={{\n padding: `${pad - 4}px ${pad}px`,\n fontSize: fs.label,\n fontWeight: active ? 700 : 500,\n textTransform: \"uppercase\",\n letterSpacing: \"0.08em\",\n color: active ? theme.primary : theme.textMuted,\n background: \"transparent\",\n border: \"none\",\n borderBottom: active ? `2px solid ${theme.primary}` : \"2px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n }}\n >\n {tabLabels[tab]}\n </button>\n );\n })}\n </div>\n\n {/* Tab content */}\n <div style={{ flex: 1, overflow: \"hidden\", display: \"flex\", flexDirection: \"column\" }}>\n {activeTab === \"result\" && (\n <ResultPanel\n data={resultData ?? null}\n logs={logs}\n hideConsole={hideConsole}\n size={size}\n />\n )}\n\n {activeTab === \"explainable\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n size={size}\n />\n <div style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}>\n {renderFlowchart && (\n <div style={{ flex: 1, overflow: \"hidden\", borderRight: `1px solid ${theme.border}` }}>\n {renderFlowchart({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n </div>\n )}\n <div\n style={{\n width: renderFlowchart ? \"40%\" : \"100%\",\n minWidth: 280,\n overflow: \"auto\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <MemoryInspector\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n size={size}\n />\n <div style={{ borderTop: `1px solid ${theme.border}` }}>\n <ScopeDiff\n previous={prevMemory}\n current={currMemory}\n hideUnchanged\n size={size}\n />\n </div>\n </div>\n </div>\n <div style={{ borderTop: `1px solid ${theme.border}`, flexShrink: 0 }}>\n <GanttTimeline\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onSelect={handleSnapshotChange}\n size={size}\n />\n </div>\n </>\n )}\n\n {activeTab === \"ai-compatible\" && (\n <>\n <TimeTravelControls\n snapshots={snapshots}\n selectedIndex={snapshotIdx}\n onIndexChange={handleSnapshotChange}\n size={size}\n />\n <div style={{ flex: 1, display: \"flex\", overflow: \"hidden\" }}>\n {renderFlowchart && (\n <div style={{ flex: 1, overflow: \"hidden\", borderRight: `1px solid ${theme.border}` }}>\n {renderFlowchart({ snapshots, selectedIndex: snapshotIdx, onNodeClick: handleSnapshotChange })}\n </div>\n )}\n <NarrativeTrace\n narrative={narrative}\n revealedCount={revealedCount}\n size={size}\n style={{\n width: renderFlowchart ? \"40%\" : \"100%\",\n minWidth: 280,\n }}\n />\n </div>\n </>\n )}\n </div>\n </div>\n );\n}\n","import type { StageSnapshot } from \"../types\";\n\n/**\n * Shape of FootPrint's RuntimeSnapshot (from FlowChartExecutor.getSnapshot()).\n * We define it here instead of importing to avoid a hard dependency on footprintjs.\n */\ninterface RuntimeStageSnapshot {\n id: string;\n name?: string;\n isDecider?: boolean;\n isFork?: boolean;\n logs: Record<string, unknown>;\n errors: Record<string, unknown>;\n metrics: Record<string, unknown>;\n evals: Record<string, unknown>;\n flowMessages?: unknown[];\n next?: RuntimeStageSnapshot;\n children?: RuntimeStageSnapshot[];\n}\n\ninterface RuntimeSnapshot {\n sharedState: Record<string, unknown>;\n executionTree: RuntimeStageSnapshot;\n commitLog: unknown[];\n}\n\n/**\n * Converts a FootPrint RuntimeSnapshot into a flat array of StageSnapshots\n * suitable for visualization components.\n *\n * Usage:\n * ```ts\n * const executor = new FlowChartExecutor(chart);\n * await executor.run();\n * const snapshots = toVisualizationSnapshots(executor.getSnapshot());\n * ```\n */\nexport function toVisualizationSnapshots(\n runtime: RuntimeSnapshot\n): StageSnapshot[] {\n const snapshots: StageSnapshot[] = [];\n flattenTree(runtime.executionTree, snapshots, runtime.sharedState);\n return snapshots;\n}\n\nfunction flattenTree(\n node: RuntimeStageSnapshot,\n out: StageSnapshot[],\n sharedState: Record<string, unknown>,\n accumulatedMs: number = 0\n): number {\n // Estimate duration from metrics if available\n const durationMs =\n typeof node.metrics?.durationMs === \"number\"\n ? node.metrics.durationMs\n : 1;\n\n const startMs = accumulatedMs;\n\n // Build narrative from logs\n const narrative = buildNarrative(node);\n\n // Build memory from logs (key-value pairs written during this stage)\n const memory: Record<string, unknown> = {};\n if (node.logs) {\n Object.assign(memory, node.logs);\n }\n\n out.push({\n stageName: node.id,\n stageLabel: node.name || node.id,\n memory,\n narrative,\n startMs,\n durationMs,\n status: \"done\",\n });\n\n let nextMs = startMs + durationMs;\n\n // Handle parallel children (fork)\n if (node.children && node.children.length > 0) {\n let maxChildEnd = nextMs;\n for (const child of node.children) {\n const childEnd = flattenTree(child, out, sharedState, nextMs);\n maxChildEnd = Math.max(maxChildEnd, childEnd);\n }\n nextMs = maxChildEnd;\n }\n\n // Handle linear continuation\n if (node.next) {\n nextMs = flattenTree(node.next, out, sharedState, nextMs);\n }\n\n return nextMs;\n}\n\nfunction buildNarrative(node: RuntimeStageSnapshot): string {\n const parts: string[] = [];\n\n if (node.name) {\n parts.push(`Stage \"${node.name}\" executed.`);\n }\n\n if (node.logs && Object.keys(node.logs).length > 0) {\n const keys = Object.keys(node.logs);\n parts.push(`Wrote ${keys.length} key(s): ${keys.join(\", \")}.`);\n }\n\n if (node.errors && Object.keys(node.errors).length > 0) {\n parts.push(`Errors: ${JSON.stringify(node.errors)}`);\n }\n\n if (node.isFork) {\n parts.push(\n `Forked into ${node.children?.length ?? 0} parallel branch(es).`\n );\n }\n\n return parts.join(\" \") || `Stage ${node.id} completed.`;\n}\n\n/**\n * Creates StageSnapshots from simple arrays (when you don't have a RuntimeSnapshot).\n * Useful for testing or custom data sources.\n */\nexport function createSnapshots(\n stages: Array<{\n name: string;\n label?: string;\n memory?: Record<string, unknown>;\n narrative?: string;\n durationMs?: number;\n }>\n): StageSnapshot[] {\n let accMs = 0;\n return stages.map((s) => {\n const duration = s.durationMs ?? 1;\n const snap: StageSnapshot = {\n stageName: s.name,\n stageLabel: s.label ?? s.name,\n memory: s.memory ?? {},\n narrative: s.narrative ?? `${s.label ?? s.name} completed.`,\n startMs: accMs,\n durationMs: duration,\n status: \"done\",\n };\n accMs += duration;\n return snap;\n });\n}\n"],"mappings":";AAAA,SAAS,eAAe,kBAAkB;;;ACuBnC,SAAS,gBAAgB,QAA6C;AAC3E,QAAM,OAA+B,CAAC;AACtC,MAAI,OAAO,QAAQ;AACjB,UAAM,IAAI,OAAO;AACjB,QAAI,EAAE,QAAS,MAAK,oBAAoB,IAAI,EAAE;AAC9C,QAAI,EAAE,QAAS,MAAK,oBAAoB,IAAI,EAAE;AAC9C,QAAI,EAAE,MAAO,MAAK,kBAAkB,IAAI,EAAE;AAC1C,QAAI,EAAE,QAAS,MAAK,oBAAoB,IAAI,EAAE;AAC9C,QAAI,EAAE,UAAW,MAAK,iBAAiB,IAAI,EAAE;AAC7C,QAAI,EAAE,YAAa,MAAK,mBAAmB,IAAI,EAAE;AACjD,QAAI,EAAE,WAAY,MAAK,kBAAkB,IAAI,EAAE;AAC/C,QAAI,EAAE,YAAa,MAAK,mBAAmB,IAAI,EAAE;AACjD,QAAI,EAAE,cAAe,MAAK,qBAAqB,IAAI,EAAE;AACrD,QAAI,EAAE,UAAW,MAAK,iBAAiB,IAAI,EAAE;AAC7C,QAAI,EAAE,OAAQ,MAAK,aAAa,IAAI,EAAE;AAAA,EACxC;AACA,MAAI,OAAO,OAAQ,MAAK,aAAa,IAAI,OAAO;AAChD,MAAI,OAAO,YAAY,KAAM,MAAK,gBAAgB,IAAI,OAAO,WAAW;AACxE,MAAI,OAAO,YAAY,KAAM,MAAK,gBAAgB,IAAI,OAAO,WAAW;AACxE,SAAO;AACT;AAGO,IAAM,gBAER;AAAA,EACH,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;;;AD3CM;AApBN,IAAM,eAAe,cAA2B,CAAC,CAAC;AAE3C,SAAS,oBAAiC;AAC/C,SAAO,WAAW,YAAY;AAChC;AAWO,SAAS,eAAe,EAAE,SAAS,CAAC,GAAG,SAAS,GAAwB;AAC7E,QAAM,UAAU,gBAAgB,MAAM;AAEtC,SACE,oBAAC,aAAa,UAAb,EAAsB,OAAO,QAC5B,8BAAC,SAAI,OAAO,SAAgC,WAAU,iBACnD,UACH,GACF;AAEJ;;;AEvBO,SAAS,EAAE,SAAiB,UAA0B;AAC3D,SAAO,OAAO,OAAO,KAAK,QAAQ;AACpC;AAGO,IAAM,QAAQ;AAAA,EACnB,SAAS,EAAE,sBAAsB,SAAS;AAAA,EAC1C,SAAS,EAAE,sBAAsB,SAAS;AAAA,EAC1C,OAAO,EAAE,oBAAoB,SAAS;AAAA,EACtC,SAAS,EAAE,sBAAsB,SAAS;AAAA,EAC1C,WAAW,EAAE,mBAAmB,SAAS;AAAA,EACzC,aAAa,EAAE,qBAAqB,SAAS;AAAA,EAC7C,YAAY,EAAE,oBAAoB,SAAS;AAAA,EAC3C,aAAa,EAAE,qBAAqB,SAAS;AAAA,EAC7C,eAAe,EAAE,uBAAuB,SAAS;AAAA,EACjD,WAAW,EAAE,mBAAmB,SAAS;AAAA,EACzC,QAAQ,EAAE,eAAe,SAAS;AAAA,EAClC,QAAQ,EAAE,eAAe,KAAK;AAAA,EAC9B,UAAU,EAAE,kBAAkB,6CAA6C;AAAA,EAC3E,UAAU,EAAE,kBAAkB,0CAA0C;AAC1E;AAGO,IAAM,WAAyE;AAAA,EACpF,SAAS,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,EAAE;AAAA,EACzC,SAAS,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,GAAG;AAAA,EAC1C,UAAU,EAAE,OAAO,IAAI,MAAM,IAAI,OAAO,GAAG;AAC7C;AAGO,IAAM,UAAgC;AAAA,EAC3C,SAAS;AAAA,EACT,SAAS;AAAA,EACT,UAAU;AACZ;;;ACrCO,IAAM,WAAwB;AAAA,EACnC,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAGO,IAAM,WAAwB;AAAA,EACnC,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAGO,IAAM,YAAyB;AAAA,EACpC,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,IACT,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAGO,IAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF;;;ACzEA,SAAS,eAAe;AAqElB,SACE,OAAAA,MADF;AAhDC,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAyB;AAEvB,QAAM,EAAE,QAAQ,QAAQ,IAAI,QAAQ,MAAM;AACxC,QAAI,MAAM;AACR,aAAO,EAAE,QAAQ,MAAM,SAAS,oBAAI,IAAY,EAAE;AAAA,IACpD;AACA,QAAI,CAAC,aAAa,UAAU,WAAW,GAAG;AACxC,aAAO,EAAE,QAAQ,CAAC,GAAG,SAAS,oBAAI,IAAY,EAAE;AAAA,IAClD;AAEA,UAAM,SAAkC,CAAC;AACzC,aAAS,IAAI,GAAG,KAAK,KAAK,IAAI,eAAe,UAAU,SAAS,CAAC,GAAG,KAAK;AACvE,aAAO,OAAO,QAAQ,UAAU,CAAC,GAAG,MAAM;AAAA,IAC5C;AAEA,UAAM,KAAK,oBAAI,IAAY;AAC3B,QAAI,gBAAgB,gBAAgB,GAAG;AACrC,YAAM,OAAgC,CAAC;AACvC,eAAS,IAAI,GAAG,IAAI,eAAe,KAAK;AACtC,eAAO,OAAO,MAAM,UAAU,CAAC,GAAG,MAAM;AAAA,MAC1C;AACA,YAAM,UAAU,UAAU,aAAa,GAAG,UAAU,CAAC;AACrD,iBAAW,KAAK,OAAO,KAAK,OAAO,GAAG;AACpC,YAAI,EAAE,KAAK,MAAO,IAAG,IAAI,CAAC;AAAA,MAC5B;AAAA,IACF,WAAW,gBAAgB,kBAAkB,KAAK,UAAU,CAAC,GAAG;AAC9D,iBAAW,KAAK,OAAO,KAAK,UAAU,CAAC,EAAE,MAAM,EAAG,IAAG,IAAI,CAAC;AAAA,IAC5D;AAEA,WAAO,EAAE,QAAQ,QAAQ,SAAS,GAAG;AAAA,EACvC,GAAG,CAAC,MAAM,WAAW,eAAe,YAAY,CAAC;AAEjD,QAAM,UAAU,OAAO,QAAQ,MAAM;AACrC,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AAExB,MAAI,UAAU;AACZ,WACE,qBAAC,SAAI,WAAsB,OAAc,WAAQ,oBAC/C;AAAA,sBAAAA,KAAC,SAAI,WAAQ,gBAAe,0BAAY;AAAA,MACxC,gBAAAA,KAAC,SAAI,WAAQ,eACV,eAAK,UAAU,QAAQ,MAAM,CAAC,GACjC;AAAA,OACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY,MAAM;AAAA,QAClB,GAAG;AAAA,MACL;AAAA,MACA,WAAQ;AAAA,MAER;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU,GAAG;AAAA,cACb,YAAY;AAAA,cACZ,OAAO,MAAM;AAAA,cACb,eAAe;AAAA,cACf,eAAe;AAAA,YACjB;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,YAAY,MAAM;AAAA,cAClB,QAAQ,aAAa,MAAM,MAAM;AAAA,cACjC,cAAc,MAAM;AAAA,cACpB,SAAS,GAAG,GAAG,MAAM,MAAM,CAAC;AAAA,cAC5B,YAAY,MAAM;AAAA,cAClB,UAAU,GAAG;AAAA,cACb,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,UAAU,GAAI,eAAI;AAAA,cAC7C,QAAQ,WAAW,KAClB,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,aAAa;AAAA,oBACb,OAAO,MAAM;AAAA,oBACb,WAAW;AAAA,kBACb;AAAA,kBAEC;AAAA;AAAA,cACH;AAAA,cAED,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,GAAG,MAAM;AAChC,sBAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,sBAAM,SAAS,MAAM,QAAQ,SAAS;AACtC,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,OAAO;AAAA,sBACL,aAAa;AAAA,sBACb,YAAY,QACR,sBAAsB,MAAM,OAAO,uBACnC;AAAA,sBACJ,cAAc;AAAA,sBACd,YAAY;AAAA,sBACZ,aAAa;AAAA,sBACb,cAAc;AAAA,oBAChB;AAAA,oBAEA;AAAA,2CAAC,UAAK,OAAO,EAAE,OAAO,MAAM,QAAQ,GAAG;AAAA;AAAA,wBAAO;AAAA,wBAAI;AAAA,yBAAM;AAAA,sBACxD,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,UAAU,GAAG,gBAAE;AAAA,sBAC3C,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,QAAQ,GACjC,sBAAY,KAAK,GACpB;AAAA,sBACC,aACC;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,OAAO,MAAM;AAAA,4BACb,UAAU,GAAG;AAAA,4BACb,YAAY;AAAA,4BACZ,SAAS;AAAA,0BACX;AAAA,0BACD;AAAA;AAAA,4BACG,OAAO;AAAA,4BAAM;AAAA;AAAA;AAAA,sBACjB;AAAA,sBAED,CAAC,UAAU,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,UAAU,GAAG,eAAC;AAAA;AAAA;AAAA,kBA7BjD;AAAA,gBA8BP;AAAA,cAEJ,CAAC;AAAA,cACD,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,UAAU,GAAI,eAAI;AAAA;AAAA;AAAA,QAChD;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,YAAY,OAAwB;AAC3C,MAAI,OAAO,UAAU,SAAU,QAAO,IAAI,KAAK;AAC/C,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO,KAAK,UAAU,KAAK;AAC5E,SAAO,OAAO,KAAK;AACrB;;;AC3KA,SAAS,WAAAC,gBAAe;AA6Cd,SACE,OAAAC,MADF,QAAAC,aAAA;AA5BH,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,UAAUC,SAAQ,MAAM;AAC5B,QAAI,WAAW;AACb,aAAO,CAAC,EAAE,OAAO,UAAU,MAAM,WAAW,WAAW,KAAK,CAAC;AAAA,IAC/D;AACA,UAAM,MAAM,iBAAiB,UAAU,SAAS;AAChD,WAAO,UAAU,MAAM,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,OAAO;AAAA,MAChD,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,WAAW,MAAM;AAAA,IACnB,EAAE;AAAA,EACJ,GAAG,CAAC,WAAW,eAAe,SAAS,CAAC;AAExC,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AAExB,MAAI,UAAU;AACZ,WACE,gBAAAF,KAAC,SAAI,WAAsB,OAAc,WAAQ,iBAC9C,kBAAQ,IAAI,CAAC,OAAO,MACnB,gBAAAC,MAAC,SAAY,WAAQ,mBAAkB,gBAAc,MAAM,WACzD;AAAA,sBAAAD,KAAC,YAAQ,gBAAM,OAAM;AAAA,MACrB,gBAAAA,KAAC,OAAG,gBAAM,MAAK;AAAA,SAFP,CAGV,CACD,GACH;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,SAAS,KAAK,YAAY,MAAM,UAAU,GAAG,MAAM;AAAA,MAC5D,WAAQ;AAAA,MAER;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU,GAAG;AAAA,cACb,YAAY;AAAA,cACZ,OAAO,MAAM;AAAA,cACb,eAAe;AAAA,cACf,eAAe;AAAA,YACjB;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QACA,gBAAAA,KAAC,SAAI,OAAO,EAAE,WAAW,GAAG,SAAS,QAAQ,eAAe,SAAS,GAClE,kBAAQ,IAAI,CAAC,OAAO,MACnB,gBAAAC;AAAA,UAAC;AAAA;AAAA,YAEC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,KAAK;AAAA,cACL,SAAS,GAAG,GAAG;AAAA,cACf,cACE,IAAI,QAAQ,SAAS,IAAI,aAAa,MAAM,MAAM,KAAK;AAAA,YAC3D;AAAA,YAGA;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,eAAe;AAAA,oBACf,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,YAAY;AAAA,oBACZ,YAAY;AAAA,kBACd;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,QAAQ;AAAA,0BACR,cAAc;AAAA,0BACd,YAAY,MAAM,YAAY,MAAM,UAAU,MAAM;AAAA,0BACpD,YAAY;AAAA,wBACd;AAAA;AAAA,oBACF;AAAA,oBACC,IAAI,QAAQ,SAAS,KACpB,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,MAAM;AAAA,0BACN,YAAY,MAAM;AAAA,0BAClB,WAAW;AAAA,wBACb;AAAA;AAAA,oBACF;AAAA;AAAA;AAAA,cAEJ;AAAA,cAGA,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,GACjC;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,UAAU,GAAG;AAAA,sBACb,YAAY;AAAA,sBACZ,OAAO,MAAM,YAAY,MAAM,UAAU,MAAM;AAAA,oBACjD;AAAA,oBAEC,gBAAM;AAAA;AAAA,gBACT;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,UAAU,GAAG;AAAA,sBACb,YAAY;AAAA,sBACZ,OAAO,MAAM,YAAY,MAAM,cAAc,MAAM;AAAA,sBACnD,WAAW;AAAA,oBACb;AAAA,oBAEC,gBAAM;AAAA;AAAA,gBACT;AAAA,iBACF;AAAA;AAAA;AAAA,UA9DK;AAAA,QA+DP,CACD,GACH;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC9IA,SAAS,UAAU,aAAa,WAAAG,UAAS,WAAW,cAAc;AAkGxD,SACE,OAAAC,MADF,QAAAC,aAAA;AArEV,SAAS,YAAY,OAAmC;AACtD,QAAM,SAA2B,CAAC;AAClC,MAAI,UAAiC;AAErC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,UAAU,KAAK,UAAU;AAC/B,UAAM,SAAS,QAAQ,WAAW,OAAO,KAAK,MAAM,KAAK,IAAI;AAE7D,QAAI,CAAC,UAAU,CAAC,SAAS;AACvB,gBAAU,EAAE,QAAQ,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE;AAClD,aAAO,KAAK,OAAO;AAAA,IACrB,OAAO;AACL,cAAQ,MAAM,KAAK,EAAE,MAAM,SAAS,KAAK,EAAE,CAAC;AAAA,IAC9C;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,WAAW,iBAAiB,OAAO,UAAU,MAAM,GAAG,aAAa,IAAI;AAC7E,QAAM,SAAS,iBAAiB,OAAO,UAAU,MAAM,aAAa,IAAI,CAAC;AAEzE,QAAM,iBAAiBC,SAAQ,MAAM,YAAY,QAAQ,GAAG,CAAC,QAAQ,CAAC;AACtE,QAAM,eAAeA,SAAQ,MAAM,YAAY,MAAM,GAAG,CAAC,MAAM,CAAC;AAEhE,QAAM,CAAC,cAAc,eAAe,IAAI,SAAsB,MAAM;AAClE,QAAI,CAAC,iBAAkB,QAAO,oBAAI,IAAI;AACtC,WAAO,IAAI,IAAI,YAAY,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC/D,CAAC;AAED,QAAM,YAAY,OAAuB,IAAI;AAE7C,YAAU,MAAM;AACd,cAAU,SAAS,eAAe,EAAE,UAAU,UAAU,OAAO,UAAU,CAAC;AAAA,EAC5E,GAAG,CAAC,eAAe,MAAM,CAAC;AAE1B,QAAM,SAAS,YAAY,CAAC,QAAgB;AAC1C,oBAAgB,CAAC,SAAS;AACxB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,GAAG,EAAG,MAAK,OAAO,GAAG;AAAA,UAC7B,MAAK,IAAI,GAAG;AACjB,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,UAAU,eAAe,SAAS;AACxC,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AAGxB,MAAI,UAAU;AACZ,WACE,gBAAAD,MAAC,SAAI,WAAsB,OAAc,WAAQ,mBAC9C;AAAA,qBAAe,IAAI,CAAC,OAAO,OAC1B,gBAAAA,MAAC,SAA0B,WAAQ,mBAAkB,eAAa,OAAO,SACvE;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,WAAQ;AAAA,YACR,oBAAkB,MAAM,MAAM,SAAS;AAAA,YACvC,kBAAgB,aAAa,IAAI,MAAM,SAAS;AAAA,YAChD,SAAS,MAAM;AACb,kBAAI,MAAM,MAAM,SAAS,EAAG,QAAO,MAAM,SAAS;AAClD,6BAAe,MAAM,SAAS;AAAA,YAChC;AAAA,YAEC,gBAAM;AAAA;AAAA,QACT;AAAA,QACC,CAAC,aAAa,IAAI,MAAM,SAAS,KAChC,MAAM,MAAM,IAAI,CAAC,SACf,gBAAAA,KAAC,SAAmB,WAAQ,kBACzB,eAAK,QADE,KAAK,GAEf,CACD;AAAA,WAjBK,MAAM,SAkBhB,CACD;AAAA,MACA,aAAa,IAAI,CAAC,UACjB,gBAAAC,MAAC,SAAiC,WAAQ,mBAAkB,eAAW,MACrE;AAAA,wBAAAD,KAAC,SAAI,WAAQ,oBAAoB,gBAAM,QAAO;AAAA,QAC7C,MAAM,MAAM,IAAI,CAAC,SAChB,gBAAAA,KAAC,SAA0B,WAAQ,kBAChC,eAAK,QADE,KAAK,KAAK,GAAG,EAEvB,CACD;AAAA,WANO,KAAK,MAAM,SAAS,EAO9B,CACD;AAAA,OACH;AAAA,EAEJ;AAGA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY,MAAM;AAAA,QAClB,GAAG;AAAA,MACL;AAAA,MACA,WAAQ;AAAA,MAEP;AAAA,uBAAe,IAAI,CAAC,OAAO,OAAO;AACjC,gBAAM,WAAW,OAAO;AACxB,gBAAM,cAAc,aAAa,IAAI,MAAM,SAAS;AACpD,gBAAM,WAAW,MAAM,MAAM,SAAS;AAEtC,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,KAAK,WAAW,YAAY;AAAA,cAC5B,OAAO,EAAE,cAAc,EAAE;AAAA,cACzB,WAAQ;AAAA,cAGR;AAAA,gCAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,MAAM;AACb,0BAAI,SAAU,QAAO,MAAM,SAAS;AACpC,qCAAe,MAAM,SAAS;AAAA,oBAChC;AAAA,oBACA,OAAO;AAAA,sBACL,UAAU,GAAG;AAAA,sBACb,YAAY;AAAA,sBACZ,OAAO,WAAW,MAAM,cAAc,MAAM;AAAA,sBAC5C,SAAS,OAAO,MAAM,CAAC;AAAA,sBACvB,cAAc;AAAA,sBACd,YAAY,WAAW,MAAM,aAAa;AAAA,sBAC1C,YAAY,WACR,aAAa,MAAM,OAAO,KAC1B,aAAa,MAAM,OAAO;AAAA,sBAC9B,QAAQ,WAAW,YAAY;AAAA,sBAC/B,YAAY;AAAA,sBACZ,SAAS;AAAA,sBACT,YAAY;AAAA,sBACZ,KAAK;AAAA,sBACL,YAAY;AAAA,sBACZ,YAAY;AAAA,oBACd;AAAA,oBAEC;AAAA,kCACC,gBAAAD;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,UAAU,GAAG,QAAQ;AAAA,4BACrB,OAAO,MAAM;AAAA,4BACb,YAAY;AAAA,4BACZ,WAAW,cAAc,mBAAmB;AAAA,4BAC5C,SAAS;AAAA,4BACT,OAAO;AAAA,4BACP,YAAY;AAAA,0BACd;AAAA,0BACD;AAAA;AAAA,sBAED;AAAA,sBAED,CAAC,YAAY,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,GAAG;AAAA,sBACzD,gBAAAA,KAAC,UAAM,gBAAM,QAAO;AAAA;AAAA;AAAA,gBACtB;AAAA,gBAGC,CAAC,eACA,MAAM,MAAM,IAAI,CAAC,SACf,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBAEC,OAAO;AAAA,sBACL,UAAU,GAAG;AAAA,sBACb,YAAY;AAAA,sBACZ,OAAO,WAAW,MAAM,gBAAgB,MAAM;AAAA,sBAC9C,SAAS,OAAO,MAAM,CAAC,UAAU,MAAM,EAAE;AAAA,sBACzC,SAAS,WAAW,MAAM;AAAA,sBAC1B,YAAY;AAAA,oBACd;AAAA,oBACA,WAAQ;AAAA,oBAEP,eAAK;AAAA;AAAA,kBAXD,KAAK;AAAA,gBAYZ,CACD;AAAA;AAAA;AAAA,YAlEE,MAAM;AAAA,UAmEb;AAAA,QAEJ,CAAC;AAAA,QAGA,aAAa,SAAS,KACrB,gBAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,IAAI,GACxB,uBAAa,IAAI,CAAC,UACjB,gBAAAC,MAAC,SAAiC,OAAO,EAAE,cAAc,EAAE,GACzD;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU,GAAG;AAAA,gBACb,YAAY;AAAA,gBACZ,OAAO,MAAM;AAAA,gBACb,SAAS,OAAO,MAAM,CAAC;AAAA,gBACvB,YAAY,aAAa,MAAM,MAAM;AAAA,gBACrC,YAAY;AAAA,gBACZ,aAAa,MAAM;AAAA,cACrB;AAAA,cAEC,gBAAM;AAAA;AAAA,UACT;AAAA,UACC,MAAM,MAAM,IAAI,CAAC,SAChB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO;AAAA,gBACL,UAAU,GAAG;AAAA,gBACb,YAAY;AAAA,gBACZ,OAAO,MAAM;AAAA,gBACb,SAAS,OAAO,MAAM,CAAC,UAAU,MAAM,EAAE;AAAA,cAC3C;AAAA,cAEC,eAAK;AAAA;AAAA,YARD,KAAK,KAAK,GAAG;AAAA,UASpB,CACD;AAAA,aA1BO,KAAK,MAAM,SAAS,EA2B9B,CACD,GACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACpQA,SAAS,WAAAG,gBAAe;AA+CZ,gBAAAC,MACA,QAAAC,aADA;AA9BL,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,gBAAgBC;AAAA,IACpB,MAAM,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,CAAC;AAAA,IACnE,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,aAAa,SAAS,YAAY,KAAK,SAAS,aAAa,MAAM;AACzE,QAAM,UAAU,SAAS,YAAY,KAAK;AAE1C,MAAI,UAAU;AACZ,WACE,gBAAAF,KAAC,SAAI,WAAsB,OAAc,WAAQ,kBAC9C,oBAAU,IAAI,CAAC,MAAM,QACpB,gBAAAC;AAAA,MAAC;AAAA;AAAA,QAEC,WAAQ;AAAA,QACR,iBAAe,QAAQ;AAAA,QACvB,gBAAc,OAAO;AAAA,QACrB,SAAS,MAAM,WAAW,GAAG;AAAA,QAE7B;AAAA,0BAAAD,KAAC,UAAK,WAAQ,eAAe,eAAK,YAAW;AAAA,UAC7C,gBAAAC,MAAC,UAAK,WAAQ,kBAAkB;AAAA,iBAAK;AAAA,YAAW;AAAA,aAAE;AAAA;AAAA;AAAA,MAP7C,KAAK;AAAA,IAQZ,CACD,GACH;AAAA,EAEJ;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,SAAS,KAAK,YAAY,MAAM,UAAU,GAAG,MAAM;AAAA,MAC5D,WAAQ;AAAA,MAER;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,UAAU,GAAG;AAAA,cACb,YAAY;AAAA,cACZ,OAAO,MAAM;AAAA,cACb,eAAe;AAAA,cACf,eAAe;AAAA,YACjB;AAAA,YAEC,mBAAS,YAAY,aAAa;AAAA;AAAA,QACrC;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,SAAS;AAAA,cACT,eAAe;AAAA,cACf,KAAK;AAAA,YACP;AAAA,YAEC,oBAAU,IAAI,CAAC,MAAM,QAAQ;AAC5B,oBAAM,UAAW,KAAK,UAAU,gBAAiB;AACjD,oBAAM,WAAW,KAAK,IAAK,KAAK,aAAa,gBAAiB,KAAK,CAAC;AACpE,oBAAM,aAAa,QAAQ;AAC3B,oBAAM,YAAY,OAAO;AAEzB,qBACE,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBAEC,SAAS,MAAM,WAAW,GAAG;AAAA,kBAC7B,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK,SAAS,YAAY,IAAI;AAAA,oBAC9B,QAAQ,WAAW,YAAY;AAAA,oBAC/B,SAAS,YAAY,IAAI;AAAA,oBACzB,YAAY;AAAA,kBACd;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,OAAO;AAAA,0BACP,UAAU,GAAG;AAAA,0BACb,OAAO,aAAa,MAAM,UAAU,MAAM;AAAA,0BAC1C,YAAY,aAAa,MAAM;AAAA,0BAC/B,WAAW;AAAA,0BACX,YAAY;AAAA,0BACZ,UAAU;AAAA,0BACV,cAAc;AAAA,0BACd,YAAY;AAAA,wBACd;AAAA,wBAEC,eAAK;AAAA;AAAA,oBACR;AAAA,oBACA,gBAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,MAAM;AAAA,0BACN,QAAQ,SAAS,YAAY,IAAI;AAAA,0BACjC,UAAU;AAAA,0BACV,YAAY,MAAM;AAAA,0BAClB,cAAc;AAAA,wBAChB;AAAA,wBAEC,uBACC,gBAAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAO;AAAA,8BACL,UAAU;AAAA,8BACV,MAAM,GAAG,OAAO;AAAA,8BAChB,KAAK;AAAA,8BACL,OAAO,GAAG,QAAQ;AAAA,8BAClB,QAAQ;AAAA,8BACR,cAAc;AAAA,8BACd,YAAY,aAAa,MAAM,UAAU,MAAM;AAAA,8BAC/C,YAAY;AAAA,4BACd;AAAA;AAAA,wBACF;AAAA;AAAA,oBAEJ;AAAA,oBACA,gBAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU,GAAG;AAAA,0BACb,OAAO,MAAM;AAAA,0BACb,YAAY,MAAM;AAAA,0BAClB,OAAO;AAAA,0BACP,YAAY;AAAA,wBACd;AAAA,wBAEC;AAAA,+BAAK;AAAA,0BAAW;AAAA;AAAA;AAAA,oBACnB;AAAA;AAAA;AAAA,gBA5DK,KAAK;AAAA,cA6DZ;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA,QAGA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW;AAAA,cACX,YAAY,cAAc,SAAS,YAAY,IAAI;AAAA,cACnD,aAAa,WAAW,SAAS,YAAY,IAAI;AAAA,cACjD,SAAS;AAAA,cACT,gBAAgB;AAAA,cAChB,UAAU,GAAG,QAAQ;AAAA,cACrB,OAAO,MAAM;AAAA,cACb,YAAY,MAAM;AAAA,YACpB;AAAA,YAEA;AAAA,8BAAAD,KAAC,UAAK,iBAAG;AAAA,cACR,SAAS,aACR,gBAAAC,MAAC,UAAO;AAAA,iCAAgB,GAAG,QAAQ,CAAC;AAAA,gBAAE;AAAA,iBAAE;AAAA,cAE1C,gBAAAA,MAAC,UAAM;AAAA,8BAAc,QAAQ,CAAC;AAAA,gBAAE;AAAA,iBAAE;AAAA;AAAA;AAAA,QACpC;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC/KA,SAAS,YAAAE,iBAAgB;AAsCnB,gBAAAC,MAkBA,QAAAC,aAlBA;AAhBC,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,CAAC,eAAe,gBAAgB,IAAIC,UAAS,CAAC;AACpD,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AAExB,MAAI,UAAU,WAAW,GAAG;AAC1B,WACE,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,UACL,SAAS,MAAM;AAAA,UACf,WAAW;AAAA,UACX,OAAO,WAAW,SAAY,MAAM;AAAA,UACpC,UAAU,GAAG;AAAA,UACb,GAAG;AAAA,QACL;AAAA,QACA,WAAQ;AAAA,QACT;AAAA;AAAA,IAED;AAAA,EAEJ;AAEA,MAAI,UAAU;AACZ,WACE,gBAAAC,MAAC,SAAI,WAAsB,OAAc,WAAQ,kBAC/C;AAAA,sBAAAD,KAAC,QAAI,iBAAM;AAAA,MACV,gBACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK,UAAU,SAAS;AAAA,UACxB,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,iBAAiB,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA;AAAA,MAC5D;AAAA,MAEF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,UAAQ;AAAA;AAAA,MACV;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,UAAQ;AAAA;AAAA,MACV;AAAA,MACC,aACC,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,UAAQ;AAAA;AAAA,MACV;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,QAAQ;AAAA,QACR,YAAY,MAAM;AAAA,QAClB,YAAY,MAAM;AAAA,QAClB,UAAU;AAAA,QACV,GAAG;AAAA,MACL;AAAA,MACA,WAAQ;AAAA,MAGR;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS,GAAG,GAAG,MAAM,MAAM,CAAC;AAAA,cAC5B,cAAc,aAAa,MAAM,MAAM;AAAA,cACvC,YAAY,MAAM;AAAA,cAClB,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,KAAK;AAAA,oBACL,cAAc,eAAe,IAAI;AAAA,kBACnC;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU,GAAG,OAAO;AAAA,0BACpB,YAAY;AAAA,0BACZ,OAAO,MAAM;AAAA,wBACf;AAAA,wBAEC;AAAA;AAAA,oBACH;AAAA,oBACA,gBAAAC;AAAA,sBAAC;AAAA;AAAA,wBACC,OAAO;AAAA,0BACL,UAAU,GAAG;AAAA,0BACb,OAAO,MAAM;AAAA,0BACb,YAAY,MAAM;AAAA,wBACpB;AAAA,wBAEC;AAAA,0CAAgB;AAAA,0BAAE;AAAA,0BAAE,UAAU;AAAA;AAAA;AAAA,oBACjC;AAAA;AAAA;AAAA,cACF;AAAA,cAEC,gBACC,gBAAAA,MAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAC1D;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAM;AAAA,oBACN,UAAU,kBAAkB;AAAA,oBAC5B,SAAS,MAAM,iBAAiB,CAAC,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA;AAAA,gBAC3D;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAK;AAAA,oBACL,KAAK,UAAU,SAAS;AAAA,oBACxB,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,iBAAiB,SAAS,EAAE,OAAO,KAAK,CAAC;AAAA,oBAC1D,OAAO;AAAA,sBACL,MAAM;AAAA,sBACN,QAAQ;AAAA,sBACR,aAAa,MAAM;AAAA,sBACnB,QAAQ;AAAA,oBACV;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAM;AAAA,oBACN,UAAU,kBAAkB,UAAU,SAAS;AAAA,oBAC/C,SAAS,MACP,iBAAiB,CAAC,MAAM,KAAK,IAAI,UAAU,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA;AAAA,gBAEjE;AAAA,iBACF;AAAA;AAAA;AAAA,QAEJ;AAAA,QAGA,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,OAAO,GACtC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,YAAY,MAAM;AAAA,gBAClB,QAAQ,KAAK,GAAG;AAAA,cAClB;AAAA;AAAA,UACF;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,WACF;AAAA,QAGC,aACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW,aAAa,MAAM,MAAM;AAAA,cACpC,YAAY,MAAM;AAAA,cAClB,YAAY;AAAA,YACd;AAAA,YAEA,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA;AAAA,gBACA,UAAU;AAAA,gBACV;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,YAAY,MAAM;AAAA,QAClB,QAAQ,aAAa,MAAM,MAAM;AAAA,QACjC,OAAO,WAAW,MAAM,YAAY,MAAM;AAAA,QAC1C,cAAc;AAAA,QACd,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,QAAQ,WAAW,gBAAgB;AAAA,QACnC,SAAS,WAAW,MAAM;AAAA,QAC1B,UAAU;AAAA,QACV,YAAY;AAAA,MACd;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;;;ACrPA,SAAS,WAAAG,gBAAe;AA8FZ,SAEE,UAFF,OAAAC,MAEE,QAAAC,aAFF;AAlEZ,SAAS,YACP,MACA,MACa;AACb,QAAM,UAAuB,CAAC;AAC9B,QAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC;AAE1E,aAAW,OAAO,SAAS;AACzB,UAAM,SAAS,QAAQ,QAAQ,OAAO;AACtC,UAAM,SAAS,OAAO;AACtB,UAAM,SAAS,OAAO,GAAG;AACzB,UAAM,SAAS,KAAK,GAAG;AAEvB,QAAI,CAAC,UAAU,QAAQ;AACrB,cAAQ,KAAK,EAAE,KAAK,MAAM,SAAS,UAAU,OAAO,CAAC;AAAA,IACvD,WAAW,UAAU,CAAC,QAAQ;AAC5B,cAAQ,KAAK,EAAE,KAAK,MAAM,WAAW,UAAU,OAAO,CAAC;AAAA,IACzD,WAAW,KAAK,UAAU,MAAM,MAAM,KAAK,UAAU,MAAM,GAAG;AAC5D,cAAQ,KAAK,EAAE,KAAK,MAAM,WAAW,UAAU,QAAQ,UAAU,OAAO,CAAC;AAAA,IAC3E,OAAO;AACL,cAAQ,KAAK,EAAE,KAAK,MAAM,aAAa,UAAU,OAAO,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,QAAQ,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,EAAE;AAC/D,UAAQ,KAAK,CAAC,GAAG,MAAM,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,CAAC;AACpD,SAAO;AACT;AAEA,SAAS,IAAIC,IAAoB;AAC/B,MAAI,OAAOA,OAAM,SAAU,QAAO,IAAIA,EAAC;AACvC,MAAI,OAAOA,OAAM,YAAYA,OAAM,KAAM,QAAO,KAAK,UAAUA,IAAG,MAAM,CAAC;AACzE,SAAO,OAAOA,EAAC;AACjB;AAEA,IAAM,aAAkF;AAAA,EACtF,OAAO,EAAE,IAAI,wBAAwB,IAAI,WAAW,MAAM,IAAI;AAAA,EAC9D,SAAS,EAAE,IAAI,wBAAwB,IAAI,WAAW,MAAM,IAAI;AAAA,EAChE,SAAS,EAAE,IAAI,yBAAyB,IAAI,WAAW,MAAM,IAAI;AAAA,EACjE,WAAW,EAAE,IAAI,eAAe,IAAI,IAAI,MAAM,IAAI;AACpD;AAMO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,UAAUC,SAAQ,MAAM,YAAY,UAAU,OAAO,GAAG,CAAC,UAAU,OAAO,CAAC;AACjF,QAAM,UAAU,gBAAgB,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,IAAI;AAEhF,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AAExB,MAAI,UAAU;AACZ,WACE,gBAAAH,KAAC,SAAI,WAAsB,OAAc,WAAQ,cAC9C,kBAAQ,IAAI,CAAC,MACZ,gBAAAC,MAAC,SAAgB,WAAQ,cAAa,aAAW,EAAE,MACjD;AAAA,sBAAAD,KAAC,UAAK,WAAQ,YAAY,YAAE,KAAI;AAAA,MAC/B,EAAE,SAAS,aACV,gBAAAC,MAAA,YACE;AAAA,wBAAAD,KAAC,UAAK,WAAQ,YAAY,cAAI,EAAE,QAAQ,GAAE;AAAA,QAC1C,gBAAAA,KAAC,UAAK,WAAQ,YAAY,cAAI,EAAE,QAAQ,GAAE;AAAA,SAC5C;AAAA,OAEA,EAAE,SAAS,WAAW,EAAE,SAAS,gBACjC,gBAAAA,KAAC,UAAK,WAAQ,cAAc,cAAI,EAAE,QAAQ,GAAE;AAAA,MAE7C,EAAE,SAAS,aACV,gBAAAA,KAAC,UAAK,WAAQ,cAAc,cAAI,EAAE,QAAQ,GAAE;AAAA,SAZtC,EAAE,GAcZ,CACD,GACH;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,SAAS,KAAK,YAAY,MAAM,UAAU,GAAG,MAAM;AAAA,MAC5D,WAAQ;AAAA,MAEP;AAAA,gBAAQ,WAAW,KAClB,gBAAAD,KAAC,SAAI,OAAO,EAAE,UAAU,GAAG,MAAM,OAAO,MAAM,WAAW,WAAW,SAAS,GAAG,wBAEhF;AAAA,QAED,QAAQ,IAAI,CAAC,UAAU;AACtB,gBAAM,KAAK,WAAW,MAAM,IAAI;AAChC,iBACE,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAEC,OAAO;AAAA,gBACL,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,KAAK;AAAA,gBACL,SAAS,OAAO,MAAM,CAAC;AAAA,gBACvB,cAAc;AAAA,gBACd,cAAc;AAAA,gBACd,YAAY,GAAG;AAAA,gBACf,UAAU,GAAG;AAAA,gBACb,YAAY;AAAA,cACd;AAAA,cACA,WAAQ;AAAA,cAER;AAAA,gCAAAD;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OAAO;AAAA,sBACP,YAAY;AAAA,sBACZ,YAAY;AAAA,sBACZ,OAAO,GAAG,MAAM,MAAM;AAAA,sBACtB,WAAW;AAAA,oBACb;AAAA,oBAEC,aAAG;AAAA;AAAA,gBACN;AAAA,gBACA,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,SAAS,YAAY,KAAK,YAAY,EAAE,GACjE,gBAAM,KACT;AAAA,gBACA,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,UAAU,GAAG,eAAC;AAAA,gBACzC,MAAM,SAAS,YACd,gBAAAC,MAAC,UACC;AAAA,kCAAAD;AAAA,oBAAC;AAAA;AAAA,sBACC,OAAO;AAAA,wBACL,OAAO,MAAM;AAAA,wBACb,gBAAgB;AAAA,wBAChB,SAAS;AAAA,sBACX;AAAA,sBAEC,cAAI,MAAM,QAAQ;AAAA;AAAA,kBACrB;AAAA,kBACA,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,WAAW,QAAQ,QAAQ,GAAG,oBAAM;AAAA,kBAChE,gBAAAA,KAAC,UAAK,OAAO,EAAE,OAAO,MAAM,QAAQ,GAAI,cAAI,MAAM,QAAQ,GAAE;AAAA,mBAC9D,IAEA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,OAAO;AAAA,sBACL,OACE,MAAM,SAAS,UACX,MAAM,UACN,MAAM,SAAS,YACb,MAAM,QACN,MAAM;AAAA,oBAChB;AAAA,oBAEC,cAAI,MAAM,SAAS,YAAY,MAAM,WAAW,MAAM,QAAQ;AAAA;AAAA,gBACjE;AAAA;AAAA;AAAA,YAvDG,MAAM;AAAA,UAyDb;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,EACH;AAEJ;;;ACpKM,SAEI,OAAAI,MAFJ,QAAAC,aAAA;AAdC,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,OAAO,CAAC;AAAA,EACR,cAAc;AAAA,EACd,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AAExB,MAAI,UAAU;AACZ,WACE,gBAAAA,MAAC,SAAI,WAAsB,OAAc,WAAQ,gBAC/C;AAAA,sBAAAD,KAAC,SAAI,WAAQ,eACX,0BAAAA,KAAC,SAAK,iBAAO,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,WAAU,GACzD;AAAA,MACC,CAAC,eACA,gBAAAA,KAAC,SAAI,WAAQ,kBACV,eAAK,IAAI,CAAC,MAAM,MACf,gBAAAA,KAAC,SAAY,WAAQ,gBAAe,cAAY,KAAK,WAAW,OAAO,GACpE,kBADO,CAEV,CACD,GACH;AAAA,OAEJ;AAAA,EAEJ;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,UAAU;AAAA,QACV,GAAG;AAAA,MACL;AAAA,MACA,WAAQ;AAAA,MAEP;AAAA,gBACC,gBAAAA,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,QAAQ,SAAS,IAAI,GACpD;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU,GAAG;AAAA,gBACb,YAAY;AAAA,gBACZ,OAAO,MAAM;AAAA,gBACb,eAAe;AAAA,gBACf,eAAe;AAAA,gBACf,cAAc;AAAA,cAChB;AAAA,cAEC,mBAAS,YAAY,WAAW;AAAA;AAAA,UACnC;AAAA,UACA,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU,GAAG;AAAA,gBACb,YAAY,MAAM;AAAA,gBAClB,OAAO,MAAM;AAAA,gBACb,YAAY,MAAM;AAAA,gBAClB,SAAS;AAAA,gBACT,cAAc,MAAM;AAAA,gBACpB,UAAU;AAAA,gBACV,QAAQ;AAAA,cACV;AAAA,cAEC,eAAK,UAAU,MAAM,MAAM,CAAC;AAAA;AAAA,UAC/B;AAAA,WACF;AAAA,QAGD,CAAC,eACA,gBAAAC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,WAAW,aAAa,MAAM,MAAM;AAAA,cACpC,SAAS;AAAA,cACT,UAAU;AAAA,cACV,WAAW;AAAA,cACX,YAAY;AAAA,YACd;AAAA,YAEA;AAAA,8BAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,UAAU,GAAG;AAAA,oBACb,YAAY;AAAA,oBACZ,OAAO,MAAM;AAAA,oBACb,eAAe;AAAA,oBACf,eAAe;AAAA,oBACf,cAAc;AAAA,kBAChB;AAAA,kBACD;AAAA;AAAA,cAED;AAAA,cACC,KAAK,WAAW,KACf,gBAAAA,KAAC,SAAI,OAAO,EAAE,UAAU,GAAG,MAAM,OAAO,MAAM,WAAW,WAAW,SAAS,GAAG,+BAEhF;AAAA,cAED,KAAK,IAAI,CAAC,MAAM,MACf,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAO;AAAA,oBACL,UAAU,GAAG;AAAA,oBACb,YAAY,MAAM;AAAA,oBAClB,OAAO,KAAK,WAAW,OAAO,IAAI,MAAM,QAAQ,MAAM;AAAA,oBACtD,SAAS;AAAA,oBACT,cAAc,aAAa,MAAM,WAAW;AAAA,oBAC5C,YAAY;AAAA,oBACZ,WAAW;AAAA,kBACb;AAAA,kBAEC;AAAA;AAAA,gBAXI;AAAA,cAYP,CACD;AAAA;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACrIA,SAAS,YAAAE,WAAU,aAAAC,YAAW,UAAAC,SAAQ,eAAAC,oBAAmB;AAkEnD,SACE,OAAAC,MADF,QAAAC,aAAA;AAnDC,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAA4B;AAC1B,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,KAAK;AAC5C,QAAM,UAAUC,QAA6C,IAAI;AACjE,QAAM,QAAQ,UAAU;AACxB,QAAM,UAAU,gBAAgB;AAChC,QAAM,UAAU,gBAAgB,QAAQ;AAGxC,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,CAAC,aAAc;AAC/B,QAAI,iBAAiB,QAAQ,GAAG;AAC9B,iBAAW,KAAK;AAChB;AAAA,IACF;AACA,UAAM,WAAW,UAAU,aAAa,GAAG,cAAc;AACzD,UAAM,WAAW,UAAU,OAAO,CAAC,GAAG,SAAS,IAAI,KAAK,YAAY,CAAC,KAAK;AAC1E,UAAM,WAAW,WAAW;AAC5B,UAAM,SAAS;AACf,UAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,WAAW,QAAQ,GAAI,CAAC;AAE7D,YAAQ,UAAU,WAAW,MAAM;AACjC,oBAAc,gBAAgB,CAAC;AAAA,IACjC,GAAG,KAAK;AAER,WAAO,MAAM;AACX,UAAI,QAAQ,QAAS,cAAa,QAAQ,OAAO;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,SAAS,eAAe,WAAW,OAAO,eAAe,YAAY,CAAC;AAE1E,QAAM,aAAaC,aAAY,MAAM;AACnC,QAAI,SAAS;AACX,iBAAW,KAAK;AAAA,IAClB,OAAO;AACL,UAAI,iBAAiB,QAAQ,EAAG,eAAc,CAAC;AAC/C,iBAAW,IAAI;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,SAAS,eAAe,OAAO,aAAa,CAAC;AAEjD,QAAM,KAAK,SAAS,IAAI;AAExB,MAAI,UAAU;AACZ,WACE,gBAAAJ,MAAC,SAAI,WAAsB,OAAc,WAAQ,wBAC/C;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,WAAQ;AAAA,UACR,UAAU,CAAC,WAAW;AAAA,UACtB,SAAS,MAAM;AAAE,uBAAW,KAAK;AAAG,0BAAc,gBAAgB,CAAC;AAAA,UAAG;AAAA,UACvE;AAAA;AAAA,MAED;AAAA,MACC,gBACC,gBAAAA,KAAC,YAAO,WAAQ,WAAU,SAAS,YAChC,oBAAU,UAAU,QACvB;AAAA,MAEF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAQ;AAAA,UACR,UAAU,CAAC,WAAW;AAAA,UACtB,SAAS,MAAM;AAAE,uBAAW,KAAK;AAAG,0BAAc,gBAAgB,CAAC;AAAA,UAAG;AAAA,UACvE;AAAA;AAAA,MAED;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAQ,YACV,oBAAU,IAAI,CAAC,MAAM,MACpB,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,WAAQ;AAAA,UACR,eAAa,MAAM;AAAA,UACnB,aAAW,IAAI;AAAA,UACf,SAAS,MAAM;AAAE,uBAAW,KAAK;AAAG,0BAAc,CAAC;AAAA,UAAG;AAAA,UACtD,OAAO,KAAK;AAAA;AAAA,QALP;AAAA,MAMP,CACD,GACH;AAAA,OACF;AAAA,EAEJ;AAEA,QAAM,WAAW,CAAC,cAA4C;AAAA,IAC5D,YAAY,MAAM;AAAA,IAClB,QAAQ,aAAa,MAAM,MAAM;AAAA,IACjC,OAAO,WAAW,MAAM,YAAY,MAAM;AAAA,IAC1C,cAAc;AAAA,IACd,SAAS;AAAA,IACT,UAAU,GAAG;AAAA,IACb,YAAY;AAAA,IACZ,QAAQ,WAAW,gBAAgB;AAAA,IACnC,SAAS,WAAW,MAAM;AAAA,IAC1B,YAAY;AAAA,EACd;AAEA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY,MAAM;AAAA,QAClB,cAAc,aAAa,MAAM,MAAM;AAAA,QACvC,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,GAAG;AAAA,MACL;AAAA,MACA,WAAQ;AAAA,MAER;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,SAAS,CAAC,WAAW,OAAO;AAAA,YACnC,UAAU,CAAC,WAAW;AAAA,YACtB,SAAS,MAAM;AAAE,yBAAW,KAAK;AAAG,4BAAc,gBAAgB,CAAC;AAAA,YAAG;AAAA,YACvE;AAAA;AAAA,QAED;AAAA,QAEC,gBACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,OAAO;AAAA,cACL,YAAY,UAAU,MAAM,UAAU,MAAM;AAAA,cAC5C,QAAQ,aAAa,MAAM,MAAM;AAAA,cACjC,OAAO,UAAU,UAAU,MAAM;AAAA,cACjC,cAAc;AAAA,cACd,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,YAAY;AAAA,YACd;AAAA,YACA,OAAO,UAAU,UAAU;AAAA,YAE1B,oBAAU,WAAW;AAAA;AAAA,QACxB;AAAA,QAGF,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,SAAS,CAAC,WAAW,OAAO;AAAA,YACnC,UAAU,CAAC,WAAW;AAAA,YACtB,SAAS,MAAM;AAAE,yBAAW,KAAK;AAAG,4BAAc,gBAAgB,CAAC;AAAA,YAAG;AAAA,YACvE;AAAA;AAAA,QAED;AAAA,QAGA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,SAAS;AAAA,YACX;AAAA,YAEC,oBAAU,IAAI,CAAC,MAAM,MAAM;AAC1B,oBAAM,WAAW,MAAM;AACvB,oBAAM,SAAS,IAAI;AACnB,qBACE,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,SAAS,MAAM;AAAE,+BAAW,KAAK;AAAG,kCAAc,CAAC;AAAA,kBAAG;AAAA,kBACtD,OAAO,KAAK;AAAA,kBACZ,OAAO;AAAA,oBACL,MAAM;AAAA,oBACN,QAAQ,WAAW,KAAK;AAAA,oBACxB,cAAc;AAAA,oBACd,QAAQ;AAAA,oBACR,QAAQ;AAAA,oBACR,YAAY,WACR,MAAM,UACN,SACE,MAAM,UACN,MAAM;AAAA,oBACZ,SAAS,UAAU,WAAW,IAAI;AAAA,oBAClC,YAAY;AAAA,kBACd;AAAA;AAAA,gBAhBK;AAAA,cAiBP;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC/MA,SAAS,YAAAM,WAAU,eAAAC,cAAa,WAAAC,gBAAe;AAoHnC,SAoBA,YAAAC,WApBA,OAAAC,OAoBA,QAAAC,aApBA;AAzEL,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA,OAAO,CAAC;AAAA,EACR,YAAY,CAAC;AAAA,EACb,OAAO,CAAC,UAAU,eAAe,eAAe;AAAA,EAChD;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAA0B;AACxB,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAmB,cAAc,KAAK,CAAC,CAAC;AAC1E,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,CAAC;AAEhD,QAAM,KAAK,SAAS,IAAI;AACxB,QAAM,MAAM,QAAQ,IAAI;AAExB,QAAM,uBAAuBC,aAAY,CAAC,QAAgB;AACxD,mBAAe,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,UAAU,SAAS,CAAC,CAAC,CAAC;AAAA,EACjE,GAAG,CAAC,UAAU,MAAM,CAAC;AAGrB,QAAM,gBAAgBC,SAAQ,MAAM;AAClC,QAAI,UAAU,WAAW,KAAK,UAAU,WAAW,EAAG,QAAO,UAAU;AAEvE,UAAM,aAAuB,CAAC;AAC9B,aAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAM,UAAU,UAAU,CAAC,EAAE,UAAU;AACvC,UACG,QAAQ,WAAW,QAAQ,KAAK,CAAC,QAAQ,MAAM,wBAAwB,KACxE,QAAQ,WAAW,GAAG,GACtB;AACA,mBAAW,KAAK,CAAC;AAAA,MACnB;AAAA,IACF;AAEA,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,SAAS,cAAc,KAAK,UAAU;AAC5C,aAAO,KAAK,IAAI,GAAG,KAAK,KAAK,UAAU,SAAS,KAAK,CAAC;AAAA,IACxD;AAEA,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA,KAAK;AAAA,QACH,KAAK,OAAQ,cAAc,KAAK,UAAU,SAAU,WAAW,MAAM,KAAK;AAAA,QAC1E,WAAW;AAAA,MACb;AAAA,IACF;AAEA,UAAM,SACJ,eAAe,WAAW,SAAS,WAAW,YAAY,IAAI,UAAU;AAE1E,WAAO,KAAK,IAAI,GAAG,MAAM;AAAA,EAC3B,GAAG,CAAC,UAAU,QAAQ,aAAa,SAAS,CAAC;AAG7C,QAAM,aAAa,cAAc,IAAI,UAAU,cAAc,CAAC,GAAG,SAAS;AAC1E,QAAM,aAAa,UAAU,WAAW,GAAG,UAAU,CAAC;AAEtD,QAAM,YAAsC;AAAA,IAC1C,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAEA,MAAI,UAAU;AACZ,WACE,gBAAAH,MAAC,SAAI,WAAsB,OAAc,WAAQ,qBAC/C;AAAA,sBAAAD,MAAC,SAAI,WAAQ,cACV,eAAK,IAAI,CAAC,QACT,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAEC,WAAQ;AAAA,UACR,eAAa,QAAQ;AAAA,UACrB,SAAS,MAAM,aAAa,GAAG;AAAA,UAE9B,oBAAU,GAAG;AAAA;AAAA,QALT;AAAA,MAMP,CACD,GACH;AAAA,MACA,gBAAAC,MAAC,SAAI,WAAQ,iBAAgB,YAAU,WACpC;AAAA,sBAAc,YACb,gBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,cAAc;AAAA,YACpB;AAAA,YACA;AAAA,YACA,UAAQ;AAAA;AAAA,QACV;AAAA,QAED,cAAc,iBACb,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,eAAe;AAAA,cACf,eAAe;AAAA,cACf,UAAQ;AAAA;AAAA,UACV;AAAA,UACC,kBAAkB,EAAE,WAAW,eAAe,aAAa,aAAa,qBAAqB,CAAC;AAAA,UAC/F,gBAAAA,MAAC,mBAAgB,WAAsB,eAAe,aAAa,UAAQ,MAAC;AAAA,UAC5E,gBAAAA,MAAC,aAAU,UAAU,YAAY,SAAS,YAAY,UAAQ,MAAC;AAAA,UAC/D,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,eAAe;AAAA,cACf,UAAU;AAAA,cACV,UAAQ;AAAA;AAAA,UACV;AAAA,WACF;AAAA,QAED,cAAc,mBACb,gBAAAC,MAAAF,WAAA,EACE;AAAA,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,eAAe;AAAA,cACf,eAAe;AAAA,cACf,UAAQ;AAAA;AAAA,UACV;AAAA,UACC,kBAAkB,EAAE,WAAW,eAAe,aAAa,aAAa,qBAAqB,CAAC;AAAA,UAC/F,gBAAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,UAAQ;AAAA;AAAA,UACV;AAAA,WACF;AAAA,SAEJ;AAAA,OACF;AAAA,EAEJ;AAGA,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,UAAU;AAAA,QACV,YAAY,MAAM;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,YAAY,MAAM;AAAA,QAClB,GAAG;AAAA,MACL;AAAA,MACA,WAAQ;AAAA,MAGR;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,KAAK;AAAA,cACL,cAAc,aAAa,MAAM,MAAM;AAAA,cACvC,YAAY,MAAM;AAAA,cAClB,YAAY;AAAA,YACd;AAAA,YAEC,eAAK,IAAI,CAAC,QAAQ;AACjB,oBAAM,SAAS,QAAQ;AACvB,qBACE,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC,SAAS,MAAM,aAAa,GAAG;AAAA,kBAC/B,OAAO;AAAA,oBACL,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG;AAAA,oBAC5B,UAAU,GAAG;AAAA,oBACb,YAAY,SAAS,MAAM;AAAA,oBAC3B,eAAe;AAAA,oBACf,eAAe;AAAA,oBACf,OAAO,SAAS,MAAM,UAAU,MAAM;AAAA,oBACtC,YAAY;AAAA,oBACZ,QAAQ;AAAA,oBACR,cAAc,SAAS,aAAa,MAAM,OAAO,KAAK;AAAA,oBACtD,QAAQ;AAAA,oBACR,YAAY;AAAA,kBACd;AAAA,kBAEC,oBAAU,GAAG;AAAA;AAAA,gBAhBT;AAAA,cAiBP;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA,QAGA,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,UAAU,SAAS,QAAQ,eAAe,SAAS,GACjF;AAAA,wBAAc,YACb,gBAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,cAAc;AAAA,cACpB;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA,UAGD,cAAc,iBACb,gBAAAC,MAAAF,WAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,eAAe;AAAA,gBACf,eAAe;AAAA,gBACf;AAAA;AAAA,YACF;AAAA,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,SAAS,QAAQ,UAAU,SAAS,GACxD;AAAA,iCACC,gBAAAD,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,UAAU,aAAa,aAAa,MAAM,MAAM,GAAG,GACjF,0BAAgB,EAAE,WAAW,eAAe,aAAa,aAAa,qBAAqB,CAAC,GAC/F;AAAA,cAEF,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBACC,OAAO;AAAA,oBACL,OAAO,kBAAkB,QAAQ;AAAA,oBACjC,UAAU;AAAA,oBACV,UAAU;AAAA,oBACV,SAAS;AAAA,oBACT,eAAe;AAAA,kBACjB;AAAA,kBAEA;AAAA,oCAAAD;AAAA,sBAAC;AAAA;AAAA,wBACC;AAAA,wBACA,eAAe;AAAA,wBACf;AAAA;AAAA,oBACF;AAAA,oBACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,aAAa,MAAM,MAAM,GAAG,GACnD,0BAAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,UAAU;AAAA,wBACV,SAAS;AAAA,wBACT,eAAa;AAAA,wBACb;AAAA;AAAA,oBACF,GACF;AAAA;AAAA;AAAA,cACF;AAAA,eACF;AAAA,YACA,gBAAAA,MAAC,SAAI,OAAO,EAAE,WAAW,aAAa,MAAM,MAAM,IAAI,YAAY,EAAE,GAClE,0BAAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,eAAe;AAAA,gBACf,UAAU;AAAA,gBACV;AAAA;AAAA,YACF,GACF;AAAA,aACF;AAAA,UAGD,cAAc,mBACb,gBAAAC,MAAAF,WAAA,EACE;AAAA,4BAAAC;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,eAAe;AAAA,gBACf,eAAe;AAAA,gBACf;AAAA;AAAA,YACF;AAAA,YACA,gBAAAC,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,SAAS,QAAQ,UAAU,SAAS,GACxD;AAAA,iCACC,gBAAAD,MAAC,SAAI,OAAO,EAAE,MAAM,GAAG,UAAU,UAAU,aAAa,aAAa,MAAM,MAAM,GAAG,GACjF,0BAAgB,EAAE,WAAW,eAAe,aAAa,aAAa,qBAAqB,CAAC,GAC/F;AAAA,cAEF,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,OAAO;AAAA,oBACL,OAAO,kBAAkB,QAAQ;AAAA,oBACjC,UAAU;AAAA,kBACZ;AAAA;AAAA,cACF;AAAA,eACF;AAAA,aACF;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACvRO,SAAS,yBACd,SACiB;AACjB,QAAM,YAA6B,CAAC;AACpC,cAAY,QAAQ,eAAe,WAAW,QAAQ,WAAW;AACjE,SAAO;AACT;AAEA,SAAS,YACP,MACA,KACA,aACA,gBAAwB,GAChB;AAER,QAAM,aACJ,OAAO,KAAK,SAAS,eAAe,WAChC,KAAK,QAAQ,aACb;AAEN,QAAM,UAAU;AAGhB,QAAM,YAAY,eAAe,IAAI;AAGrC,QAAM,SAAkC,CAAC;AACzC,MAAI,KAAK,MAAM;AACb,WAAO,OAAO,QAAQ,KAAK,IAAI;AAAA,EACjC;AAEA,MAAI,KAAK;AAAA,IACP,WAAW,KAAK;AAAA,IAChB,YAAY,KAAK,QAAQ,KAAK;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAED,MAAI,SAAS,UAAU;AAGvB,MAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,QAAI,cAAc;AAClB,eAAW,SAAS,KAAK,UAAU;AACjC,YAAM,WAAW,YAAY,OAAO,KAAK,aAAa,MAAM;AAC5D,oBAAc,KAAK,IAAI,aAAa,QAAQ;AAAA,IAC9C;AACA,aAAS;AAAA,EACX;AAGA,MAAI,KAAK,MAAM;AACb,aAAS,YAAY,KAAK,MAAM,KAAK,aAAa,MAAM;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,MAAoC;AAC1D,QAAM,QAAkB,CAAC;AAEzB,MAAI,KAAK,MAAM;AACb,UAAM,KAAK,UAAU,KAAK,IAAI,aAAa;AAAA,EAC7C;AAEA,MAAI,KAAK,QAAQ,OAAO,KAAK,KAAK,IAAI,EAAE,SAAS,GAAG;AAClD,UAAM,OAAO,OAAO,KAAK,KAAK,IAAI;AAClC,UAAM,KAAK,SAAS,KAAK,MAAM,YAAY,KAAK,KAAK,IAAI,CAAC,GAAG;AAAA,EAC/D;AAEA,MAAI,KAAK,UAAU,OAAO,KAAK,KAAK,MAAM,EAAE,SAAS,GAAG;AACtD,UAAM,KAAK,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC,EAAE;AAAA,EACrD;AAEA,MAAI,KAAK,QAAQ;AACf,UAAM;AAAA,MACJ,eAAe,KAAK,UAAU,UAAU,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,GAAG,KAAK,SAAS,KAAK,EAAE;AAC5C;AAMO,SAAS,gBACd,QAOiB;AACjB,MAAI,QAAQ;AACZ,SAAO,OAAO,IAAI,CAAC,MAAM;AACvB,UAAM,WAAW,EAAE,cAAc;AACjC,UAAM,OAAsB;AAAA,MAC1B,WAAW,EAAE;AAAA,MACb,YAAY,EAAE,SAAS,EAAE;AAAA,MACzB,QAAQ,EAAE,UAAU,CAAC;AAAA,MACrB,WAAW,EAAE,aAAa,GAAG,EAAE,SAAS,EAAE,IAAI;AAAA,MAC9C,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,QAAQ;AAAA,IACV;AACA,aAAS;AACT,WAAO;AAAA,EACT,CAAC;AACH;","names":["jsx","useMemo","jsx","jsxs","useMemo","useMemo","jsx","jsxs","useMemo","useMemo","jsx","jsxs","useMemo","useState","jsx","jsxs","useState","useMemo","jsx","jsxs","v","useMemo","jsx","jsxs","useState","useEffect","useRef","useCallback","jsx","jsxs","useState","useRef","useEffect","useCallback","useState","useCallback","useMemo","Fragment","jsx","jsxs","useState","useCallback","useMemo"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "footprint-explainable-ui",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Themeable React components for visualizing FootPrint pipeline execution",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./flowchart": {
|
|
16
|
+
"types": "./dist/flowchart.d.ts",
|
|
17
|
+
"import": "./dist/flowchart.js",
|
|
18
|
+
"require": "./dist/flowchart.cjs"
|
|
19
|
+
},
|
|
20
|
+
"./styles.css": "./dist/styles.css"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"typecheck": "tsc --noEmit",
|
|
29
|
+
"clean": "rm -rf dist"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"react": ">=18.0.0",
|
|
33
|
+
"react-dom": ">=18.0.0"
|
|
34
|
+
},
|
|
35
|
+
"peerDependenciesMeta": {
|
|
36
|
+
"@xyflow/react": {
|
|
37
|
+
"optional": true
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/react": "^19.0.0",
|
|
42
|
+
"@types/react-dom": "^19.0.0",
|
|
43
|
+
"react": "^19.2.0",
|
|
44
|
+
"react-dom": "^19.2.0",
|
|
45
|
+
"@xyflow/react": "^12.10.1",
|
|
46
|
+
"tsup": "^8.4.0",
|
|
47
|
+
"typescript": "^5.4.0"
|
|
48
|
+
},
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"repository": {
|
|
51
|
+
"type": "git",
|
|
52
|
+
"url": "https://github.com/footprintjs/explainable-ui.git"
|
|
53
|
+
},
|
|
54
|
+
"keywords": [
|
|
55
|
+
"footprint",
|
|
56
|
+
"pipeline",
|
|
57
|
+
"visualization",
|
|
58
|
+
"debugging",
|
|
59
|
+
"react",
|
|
60
|
+
"time-travel",
|
|
61
|
+
"explainable-ai"
|
|
62
|
+
]
|
|
63
|
+
}
|