@useclickly/react 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +7 -2
- package/dist/index.cjs +5237 -1455
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -7
- package/dist/index.d.ts +93 -12
- package/dist/index.js +5181 -1390
- package/dist/index.js.map +1 -1
- package/package.json +13 -12
- package/dist/Clickly.d.ts +0 -25
- package/dist/Clickly.d.ts.map +0 -1
- package/dist/hooks/useDraggable.d.ts +0 -28
- package/dist/hooks/useDraggable.d.ts.map +0 -1
- package/dist/hooks/usePersistedState.d.ts +0 -6
- package/dist/hooks/usePersistedState.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/internal/AnnotationList.d.ts +0 -11
- package/dist/internal/AnnotationList.d.ts.map +0 -1
- package/dist/internal/AnnotationPins.d.ts +0 -2
- package/dist/internal/AnnotationPins.d.ts.map +0 -1
- package/dist/internal/AnnotationPopup.d.ts +0 -5
- package/dist/internal/AnnotationPopup.d.ts.map +0 -1
- package/dist/internal/ClicklyRoot.d.ts +0 -15
- package/dist/internal/ClicklyRoot.d.ts.map +0 -1
- package/dist/internal/CollapsedFAB.d.ts +0 -10
- package/dist/internal/CollapsedFAB.d.ts.map +0 -1
- package/dist/internal/SettingsPopover.d.ts +0 -11
- package/dist/internal/SettingsPopover.d.ts.map +0 -1
- package/dist/internal/Toolbar.d.ts +0 -8
- package/dist/internal/Toolbar.d.ts.map +0 -1
- package/dist/internal/globalStyles.d.ts +0 -13
- package/dist/internal/globalStyles.d.ts.map +0 -1
- package/dist/internal/icons.d.ts +0 -14
- package/dist/internal/icons.d.ts.map +0 -1
- package/dist/internal/styles.d.ts +0 -7
- package/dist/internal/styles.d.ts.map +0 -1
- package/dist/output/markdown.d.ts +0 -5
- package/dist/output/markdown.d.ts.map +0 -1
- package/dist/output/markdown.test.d.ts +0 -2
- package/dist/output/markdown.test.d.ts.map +0 -1
- package/dist/state/annotations.d.ts +0 -21
- package/dist/state/annotations.d.ts.map +0 -1
- package/dist/state/annotations.test.d.ts +0 -2
- package/dist/state/annotations.test.d.ts.map +0 -1
- package/dist/state/settings.d.ts +0 -14
- package/dist/state/settings.d.ts.map +0 -1
- package/dist/state/settings.test.d.ts +0 -2
- package/dist/state/settings.test.d.ts.map +0 -1
- package/dist/state/useEngineState.d.ts +0 -7
- package/dist/state/useEngineState.d.ts.map +0 -1
- package/dist/test/setup.d.ts +0 -7
- package/dist/test/setup.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useDraggable.ts","../src/state/useEngineState.ts","../src/state/annotations.ts","../src/state/settings.ts","../src/output/markdown.ts","../src/internal/icons.tsx","../src/internal/SettingsPopover.tsx","../src/internal/AnnotationList.tsx","../src/internal/Toolbar.tsx","../src/internal/CollapsedFAB.tsx","../src/internal/AnnotationPopup.tsx","../src/internal/AnnotationPins.tsx","../src/internal/ClicklyRoot.tsx","../src/internal/styles.ts","../src/internal/globalStyles.ts","../src/Clickly.tsx"],"names":["create","useRef","useEffect","jsxs","jsx","useState","Fragment"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACMrB,IAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"index.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface Position {\n x: number;\n y: number;\n}\n\ninterface DraggableApi {\n position: Position;\n setPosition: (p: Position) => void;\n /** Spread onto the drag handle. */\n handleProps: {\n onPointerDown: (e: React.PointerEvent) => void;\n style: React.CSSProperties;\n };\n isDragging: boolean;\n}\n\n/**\n * In-session drag positioning. Position resets to `defaultPos` whenever\n * the consumer remounts (e.g. toolbar collapse → expand cycle).\n *\n * We deliberately do NOT persist across reloads — users expect the\n * toolbar to come back at its default anchor, not where they last left\n * it three sessions ago. Drag is for \"get out of my way right now\".\n */\nexport function useDraggable(\n defaultPos: Position,\n size: { width: number; height: number },\n): DraggableApi {\n const [position, setPosition] = useState<Position>(defaultPos);\n const [isDragging, setDragging] = useState(false);\n const startRef = useRef<{ pointer: Position; pos: Position } | null>(null);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as Element).setPointerCapture?.(e.pointerId);\n startRef.current = {\n pointer: { x: e.clientX, y: e.clientY },\n pos: position,\n };\n setDragging(true);\n },\n [position],\n );\n\n useEffect(() => {\n if (!isDragging) return;\n const onMove = (e: PointerEvent) => {\n const s = startRef.current;\n if (!s) return;\n const dx = e.clientX - s.pointer.x;\n const dy = e.clientY - s.pointer.y;\n const maxX = window.innerWidth - size.width - 8;\n const maxY = window.innerHeight - size.height - 8;\n setPosition({\n x: clamp(s.pos.x + dx, 8, Math.max(8, maxX)),\n y: clamp(s.pos.y + dy, 8, Math.max(8, maxY)),\n });\n };\n const onUp = () => {\n setDragging(false);\n startRef.current = null;\n };\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n }, [isDragging, size.height, size.width]);\n\n return {\n position,\n setPosition,\n handleProps: {\n onPointerDown,\n style: { cursor: isDragging ? \"grabbing\" : \"grab\", touchAction: \"none\" },\n },\n isDragging,\n };\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, n));\n}\n","import { useSyncExternalStore } from \"react\";\nimport type { EngineState, SelectionEngine } from \"@useclickly/core\";\n\n/**\n * React-friendly accessor for the SelectionEngine's external store.\n * Engine is already a `Subscribable<EngineState>` — zero adapter code.\n */\nexport function useEngineState(engine: SelectionEngine | null): EngineState {\n return useSyncExternalStore(\n (cb) => (engine ? engine.subscribe(cb) : () => {}),\n () => (engine ? engine.getSnapshot() : IDLE),\n () => IDLE,\n );\n}\n\nconst IDLE: EngineState = { kind: \"idle\" };\n","import type { Annotation } from \"@useclickly/core\";\nimport { create } from \"zustand\";\nimport { useShallow } from \"zustand/react/shallow\";\n\nexport interface AnnotationsStore {\n byId: Record<string, Annotation>;\n order: string[];\n\n add: (a: Annotation) => void;\n remove: (id: string) => void;\n update: (id: string, patch: Partial<Annotation>) => void;\n clear: () => void;\n\n /** Imperative read. Hooks should use `useAnnotationsList()` instead. */\n list: () => Annotation[];\n}\n\nexport const useAnnotations = create<AnnotationsStore>((set, get) => ({\n byId: {},\n order: [],\n\n add: (a) =>\n set((s) => ({\n byId: { ...s.byId, [a.id]: a },\n order: s.order.includes(a.id) ? s.order : [...s.order, a.id],\n })),\n\n remove: (id) =>\n set((s) => {\n if (!(id in s.byId)) return s;\n const next = { ...s.byId };\n delete next[id];\n return { byId: next, order: s.order.filter((x) => x !== id) };\n }),\n\n update: (id, patch) =>\n set((s) => {\n const cur = s.byId[id];\n if (!cur) return s;\n return { byId: { ...s.byId, [id]: { ...cur, ...patch } } };\n }),\n\n clear: () => set({ byId: {}, order: [] }),\n\n list: () => {\n const { byId, order } = get();\n return order.map((id) => byId[id]).filter(Boolean) as Annotation[];\n },\n}));\n\n/**\n * Subscribe to the annotation list with shallow equality — re-renders\n * only when items add/remove/reorder/update. Always use this from\n * component code; never call `useAnnotations(s => s.list())`, which\n * returns a new array reference on every store change and infinite-loops\n * `useSyncExternalStore`.\n */\nexport function useAnnotationsList(): Annotation[] {\n return useAnnotations(\n useShallow((s) => s.order.map((id) => s.byId[id]).filter(Boolean) as Annotation[]),\n );\n}\n","import { create } from \"zustand\";\n\nexport type OutputDetail = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n\nexport interface Settings {\n outputDetail: OutputDetail;\n copyOnAdd: boolean;\n showReactComponents: boolean;\n markerColor: string;\n}\n\nexport interface SettingsStore extends Settings {\n set: (patch: Partial<Settings>) => void;\n reset: () => void;\n}\n\nexport const DEFAULTS: Settings = {\n outputDetail: \"standard\",\n copyOnAdd: true,\n showReactComponents: true,\n markerColor: \"#06b6d4\",\n};\n\nconst STORAGE_KEY = \"clickly:settings\";\n\nfunction load(): Settings {\n if (typeof localStorage === \"undefined\") return DEFAULTS;\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return DEFAULTS;\n const parsed = JSON.parse(raw) as Partial<Settings>;\n return { ...DEFAULTS, ...parsed };\n } catch {\n return DEFAULTS;\n }\n}\n\nfunction persist(s: Settings) {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(s));\n } catch {\n /* quota / privacy mode */\n }\n}\n\nexport const useSettings = create<SettingsStore>((set) => ({\n ...load(),\n set: (patch) =>\n set((cur) => {\n const next = { ...cur, ...patch };\n persist(next);\n return next;\n }),\n reset: () => {\n persist(DEFAULTS);\n set(DEFAULTS);\n },\n}));\n","import type { Annotation } from \"@useclickly/core\";\nimport type { OutputDetail } from \"../state/settings\";\n\n/**\n * Phase 5 placeholder formatter — Phase 9 adds the React + Source lines\n * when those fields are populated. Phase 8 replaces the whole thing with\n * a full AFS-compliant implementation.\n */\nexport function annotationsToMarkdown(\n annotations: Annotation[],\n detail: OutputDetail = \"standard\",\n): string {\n if (!annotations.length) return \"(no annotations)\";\n return annotations.map((a, i) => formatOne(a, i + 1, detail)).join(\"\\n\\n\");\n}\n\nfunction formatOne(a: Annotation, index: number, detail: OutputDetail): string {\n const lines: string[] = [];\n lines.push(`## Annotation #${index}`);\n lines.push(\n `**Element:** \\`${a.element}${a.cssClasses ? \".\" + a.cssClasses.split(\" \").join(\".\") : \"\"}\\``,\n );\n lines.push(`**Path:** \\`${a.elementPath}\\``);\n if (detail !== \"compact\" && a.boundingBox) {\n const b = a.boundingBox;\n lines.push(\n `**Position:** ${Math.round(b.x)}px, ${Math.round(b.y)}px (${Math.round(b.width)}×${Math.round(b.height)}px)`,\n );\n }\n // Phase 9: React component tree + source file/line\n if (detail !== \"compact\" && a.sourceFile) {\n lines.push(`**Source:** \\`${a.sourceFile}:${a.sourceLine ?? \"?\"}\\``);\n }\n if (detail === \"detailed\" || detail === \"forensic\") {\n if (a.reactComponents) lines.push(`**React:** ${a.reactComponents}`);\n if (a.nearbyText) lines.push(`**Nearby text:** ${truncate(a.nearbyText, 120)}`);\n }\n if (detail === \"forensic\" && a.computedStyles) {\n lines.push(\"**Computed styles:**\\n```\\n\" + a.computedStyles + \"\\n```\");\n }\n lines.push(`**Feedback:** ${a.comment}`);\n if (a.severity) lines.push(`**Severity:** ${a.severity}`);\n return lines.join(\"\\n\");\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + \"…\";\n}\n","// Inline SVG icons — no icon-library dep. 16x16 stroked, currentColor.\n\nfunction Icon({\n children,\n size = 16,\n}: {\n children: React.ReactNode;\n size?: number;\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nexport const IconCursor = () => (\n <Icon>\n <path d=\"M4 4l6 16 2-7 7-2z\" />\n </Icon>\n);\n\nexport const IconLayers = () => (\n <Icon>\n <path d=\"M12 2l9 5-9 5-9-5 9-5z\" />\n <path d=\"M3 12l9 5 9-5\" />\n <path d=\"M3 17l9 5 9-5\" />\n </Icon>\n);\n\nexport const IconSquare = () => (\n <Icon>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" strokeDasharray=\"3 3\" />\n </Icon>\n);\n\nexport const IconCopy = () => (\n <Icon>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15V5a2 2 0 0 1 2-2h10\" />\n </Icon>\n);\n\nexport const IconTrash = () => (\n <Icon>\n <path d=\"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m3 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6h14z\" />\n </Icon>\n);\n\nexport const IconSettings = () => (\n <Icon>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.7 1.7 0 0 0 .34 1.87l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.7 1.7 0 0 0-1.87-.34 1.7 1.7 0 0 0-1.03 1.55V21a2 2 0 1 1-4 0v-.09a1.7 1.7 0 0 0-1.11-1.55 1.7 1.7 0 0 0-1.87.34l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.7 1.7 0 0 0 4.6 15 1.7 1.7 0 0 0 3.04 14H3a2 2 0 1 1 0-4h.09A1.7 1.7 0 0 0 4.64 8.9a1.7 1.7 0 0 0-.34-1.87l-.06-.06A2 2 0 1 1 7.07 4.14l.06.06A1.7 1.7 0 0 0 9 4.54 1.7 1.7 0 0 0 10 3.03V3a2 2 0 1 1 4 0v.09a1.7 1.7 0 0 0 1 1.51 1.7 1.7 0 0 0 1.87-.34l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.7 1.7 0 0 0 19.4 9a1.7 1.7 0 0 0 1.55 1H21a2 2 0 1 1 0 4h-.09a1.7 1.7 0 0 0-1.5 1z\" />\n </Icon>\n);\n\nexport const IconGrip = () => (\n <Icon>\n <circle cx=\"9\" cy=\"6\" r=\"1\" />\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"18\" r=\"1\" />\n <circle cx=\"15\" cy=\"6\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"18\" r=\"1\" />\n </Icon>\n);\n\nexport const IconClose = () => (\n <Icon>\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </Icon>\n);\n\nexport const IconCheck = () => (\n <Icon>\n <path d=\"M5 12l5 5L20 7\" />\n </Icon>\n);\n\nexport const IconList = () => (\n <Icon>\n <path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />\n </Icon>\n);\n\nexport const IconPower = () => (\n <Icon>\n <path d=\"M12 2v10M18.36 5.64a9 9 0 1 1-12.73 0\" />\n </Icon>\n);\n","import { useEffect, useRef } from \"react\";\nimport { useSettings, type OutputDetail } from \"../state/settings\";\n\ninterface Props {\n anchor: { x: number; y: number };\n width: number;\n onClose: () => void;\n}\n\nexport function SettingsPopover({ anchor, width, onClose }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n const s = useSettings();\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [onClose]);\n\n // Position above the toolbar.\n const top = Math.max(8, anchor.y - 200);\n const left = Math.min(window.innerWidth - 268, anchor.x + width - 260);\n\n return (\n <div ref={ref} className=\"clickly-popover\" style={{ left, top }}>\n <h4>Settings</h4>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-detail\">Output detail</label>\n <select\n id=\"clickly-detail\"\n value={s.outputDetail}\n onChange={(e) => s.set({ outputDetail: e.target.value as OutputDetail })}\n >\n <option value=\"compact\">Compact</option>\n <option value=\"standard\">Standard</option>\n <option value=\"detailed\">Detailed</option>\n <option value=\"forensic\">Forensic</option>\n </select>\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-copy\">Copy on add</label>\n <input\n id=\"clickly-copy\"\n type=\"checkbox\"\n checked={s.copyOnAdd}\n onChange={(e) => s.set({ copyOnAdd: e.target.checked })}\n />\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-react\">React components</label>\n <input\n id=\"clickly-react\"\n type=\"checkbox\"\n checked={s.showReactComponents}\n onChange={(e) => s.set({ showReactComponents: e.target.checked })}\n />\n </div>\n\n <div className=\"field\">\n <label htmlFor=\"clickly-color\">Marker color</label>\n <input\n id=\"clickly-color\"\n type=\"color\"\n value={s.markerColor}\n onChange={(e) => s.set({ markerColor: e.target.value })}\n />\n </div>\n </div>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { IconClose } from \"./icons\";\n\ninterface Props {\n anchor: { x: number; y: number };\n width: number;\n onClose: () => void;\n}\n\nexport function AnnotationList({ anchor, width, onClose }: Props) {\n const items = useAnnotationsList();\n const remove = useAnnotations((s) => s.remove);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [onClose]);\n\n const top = Math.max(8, anchor.y - 8 - Math.min(window.innerHeight * 0.5, items.length * 60 + 40));\n const left = Math.min(window.innerWidth - 328, anchor.x);\n\n return (\n <div ref={ref} className=\"clickly-list\" style={{ left, top }}>\n {items.length === 0 ? (\n <div className=\"empty\">No annotations yet.</div>\n ) : (\n items.map((a, i) => (\n <div key={a.id} className=\"row\">\n <span className=\"num\">#{i + 1}</span>\n <div className=\"body\">\n <div className=\"selector\">{a.elementPath}</div>\n <p>{a.comment}</p>\n </div>\n <button className=\"remove\" onClick={() => remove(a.id)} title=\"Remove\">\n <IconClose />\n </button>\n </div>\n ))\n )}\n </div>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { SelectionEngine, SelectionMode } from \"@useclickly/core\";\nimport { useDraggable } from \"../hooks/useDraggable\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { useSettings } from \"../state/settings\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport {\n IconCheck,\n IconClose,\n IconCopy,\n IconCursor,\n IconGrip,\n IconLayers,\n IconList,\n IconSettings,\n IconSquare,\n IconTrash,\n} from \"./icons\";\nimport { SettingsPopover } from \"./SettingsPopover\";\nimport { AnnotationList } from \"./AnnotationList\";\n\nconst TOOLBAR_SIZE = { width: 360, height: 40 };\n\ninterface Props {\n engine: SelectionEngine;\n onCollapse: () => void;\n}\n\nexport function Toolbar({ engine, onCollapse }: Props) {\n const state = useEngineState(engine);\n const annotations = useAnnotationsList();\n const clearAnnotations = useAnnotations((s) => s.clear);\n const outputDetail = useSettings((s) => s.outputDetail);\n\n const [showSettings, setShowSettings] = useState(false);\n const [showList, setShowList] = useState(false);\n const anchorRef = useRef<HTMLDivElement>(null);\n\n const { position, handleProps } = useDraggable(\n {\n x: Math.max(8, window.innerWidth - TOOLBAR_SIZE.width - 16),\n y: Math.max(8, window.innerHeight - TOOLBAR_SIZE.height - 16),\n },\n TOOLBAR_SIZE,\n );\n\n const isActive = state.kind !== \"idle\";\n const currentMode: SelectionMode | null =\n state.kind === \"inspect\" || state.kind === \"pressed\" || state.kind === \"dragging\"\n ? state.mode\n : null;\n const pinnedCount =\n state.kind === \"inspect\" || state.kind === \"pressed\" || state.kind === \"dragging\"\n ? state.pinned.length\n : 0;\n\n const setMode = (m: SelectionMode) => {\n if (!isActive) engine.activate(m);\n else engine.setMode(m);\n };\n\n const onCopy = async () => {\n const md = annotationsToMarkdown(annotations, outputDetail);\n try {\n await navigator.clipboard.writeText(md);\n } catch {\n /* ignore */\n }\n };\n\n const onClear = () => {\n if (annotations.length === 0) return;\n if (confirm(`Clear ${annotations.length} annotation(s)?`)) clearAnnotations();\n };\n\n return (\n <div\n ref={anchorRef}\n className=\"clickly-toolbar\"\n style={{ left: position.x, top: position.y, width: TOOLBAR_SIZE.width }}\n aria-label=\"Clickly toolbar\"\n >\n <div\n className=\"grip\"\n {...handleProps}\n title=\"Drag to move\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n >\n <IconGrip />\n </div>\n\n <button\n className={`clickly-btn icon-only${currentMode === \"single\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"single\")}\n title=\"Single (1)\"\n aria-label=\"Single-element selection mode\"\n aria-pressed={currentMode === \"single\"}\n >\n <IconCursor />\n </button>\n <button\n className={`clickly-btn icon-only${currentMode === \"multi\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"multi\")}\n title=\"Multi-select (2 / shift-click)\"\n aria-label=\"Multi-element selection mode\"\n aria-pressed={currentMode === \"multi\"}\n >\n <IconLayers />\n </button>\n <button\n className={`clickly-btn icon-only${currentMode === \"area\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"area\")}\n title=\"Area drag (3)\"\n aria-label=\"Area drag-selection mode\"\n aria-pressed={currentMode === \"area\"}\n >\n <IconSquare />\n </button>\n\n <div className=\"divider\" />\n\n {pinnedCount > 0 && (\n <>\n <button\n className=\"clickly-btn primary-pinned\"\n onClick={() => engine.annotatePinned()}\n title={`Annotate the ${pinnedCount} pinned element(s) (Enter)`}\n >\n <IconCheck />\n Annotate ({pinnedCount})\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => engine.clearPinned()}\n title=\"Clear pinned (Esc)\"\n >\n <IconClose />\n </button>\n <div className=\"divider\" />\n </>\n )}\n\n <button\n className=\"clickly-btn\"\n onClick={() => setShowList((v) => !v)}\n title=\"Annotations (L)\"\n >\n <IconList />\n {annotations.length > 0 && (\n <span className=\"clickly-counter\">{annotations.length}</span>\n )}\n </button>\n\n <button\n className=\"clickly-btn icon-only\"\n onClick={onCopy}\n title=\"Copy markdown (C)\"\n aria-label=\"Copy all annotations as markdown\"\n disabled={annotations.length === 0}\n >\n <IconCopy />\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={onClear}\n title=\"Clear (X)\"\n aria-label=\"Clear all annotations\"\n disabled={annotations.length === 0}\n >\n <IconTrash />\n </button>\n\n <div className=\"divider\" />\n\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => setShowSettings((v) => !v)}\n title=\"Settings\"\n aria-label=\"Open settings\"\n aria-expanded={showSettings}\n >\n <IconSettings />\n </button>\n <button\n className=\"clickly-btn icon-only\"\n onClick={onCollapse}\n title=\"Collapse (Esc)\"\n aria-label=\"Collapse Clickly toolbar\"\n >\n <IconClose />\n </button>\n\n {showSettings && (\n <SettingsPopover\n anchor={{ x: position.x, y: position.y }}\n width={TOOLBAR_SIZE.width}\n onClose={() => setShowSettings(false)}\n />\n )}\n\n {showList && (\n <AnnotationList\n anchor={{ x: position.x, y: position.y }}\n width={TOOLBAR_SIZE.width}\n onClose={() => setShowList(false)}\n />\n )}\n </div>\n );\n}\n","import { useAnnotationsList } from \"../state/annotations\";\nimport { IconCursor } from \"./icons\";\n\ninterface Props {\n onExpand: () => void;\n}\n\n/**\n * Default state — a small round button anchored bottom-right.\n * Click to expand the full toolbar.\n */\nexport function CollapsedFAB({ onExpand }: Props) {\n const annotations = useAnnotationsList();\n return (\n <button\n className=\"clickly-fab\"\n onClick={onExpand}\n title=\"Open Clickly (⌘/Ctrl+Shift+F)\"\n aria-label=\"Open Clickly toolbar\"\n >\n <IconCursor />\n {annotations.length > 0 && (\n <span className=\"clickly-fab-badge\">{annotations.length}</span>\n )}\n </button>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { nanoid } from \"nanoid\";\nimport {\n collectMetadata,\n type Annotation,\n type SelectionEngine,\n} from \"@useclickly/core\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotations } from \"../state/annotations\";\nimport { useSettings } from \"../state/settings\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\n\nconst POPUP_W = 320;\nconst POPUP_H_EST = 200;\n\nexport function AnnotationPopup({ engine }: { engine: SelectionEngine }) {\n const state = useEngineState(engine);\n const addAnnotation = useAnnotations((s) => s.add);\n const copyOnAdd = useSettings((s) => s.copyOnAdd);\n const outputDetail = useSettings((s) => s.outputDetail);\n\n const [comment, setComment] = useState(\"\");\n const taRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n if (state.kind === \"annotating\") {\n setComment(\"\");\n requestAnimationFrame(() => taRef.current?.focus());\n }\n }, [state.kind]);\n\n const onKey = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n submit();\n }\n };\n\n const cancel = () => engine.commit();\n\n const submit = () => {\n if (state.kind !== \"annotating\") return;\n const sel = engine.resolveSelection();\n if (!sel) return;\n\n const elements: Element[] =\n sel.kind === \"single\" ? [sel.element] : sel.elements;\n if (elements.length === 0) return;\n\n // For multi / area selections, create one annotation per element — they\n // all share the same comment but each pins its own element on the page.\n const sharedComment = comment.trim() || \"(no comment)\";\n const isMulti = sel.kind !== \"single\";\n const showReact = useSettings.getState().showReactComponents;\n for (const el of elements) {\n const md = collectMetadata(el, { detail: outputDetail, includeReact: showReact });\n const annotation: Annotation = {\n id: \"ann_\" + nanoid(8),\n comment: sharedComment,\n element: md.element,\n elementPath: md.elementPath,\n fullPath: md.fullPath,\n timestamp: Date.now(),\n x: md.boundingBox.x + md.boundingBox.width / 2,\n y: md.boundingBox.y + window.scrollY,\n url: location.href,\n boundingBox: md.boundingBox,\n cssClasses: md.cssClasses || undefined,\n computedStyles: stringifyStyles(md.computedStyles),\n accessibility: md.accessibility || undefined,\n nearbyText: md.nearbyText || undefined,\n selectedText: md.selectedText || undefined,\n isFixed: md.isFixed || undefined,\n reactComponents: md.reactComponents || undefined,\n sourceFile: md.sourceFile || undefined,\n sourceLine: md.sourceLine || undefined,\n sourceColumn: md.sourceColumn || undefined,\n isMultiSelect: isMulti,\n kind: \"feedback\",\n status: \"pending\",\n };\n addAnnotation(annotation);\n }\n\n if (copyOnAdd) {\n const all = useAnnotations.getState().list();\n navigator.clipboard\n ?.writeText(annotationsToMarkdown(all, outputDetail))\n .catch(() => undefined);\n }\n\n engine.commit();\n };\n\n const placement = useMemo(() => {\n if (state.kind !== \"annotating\") return null;\n const sel = engine.resolveSelection();\n if (!sel) return null;\n const rect = anchorRect(sel);\n if (!rect) return null;\n let top = rect.bottom + 8;\n let left = rect.left;\n if (top + POPUP_H_EST > window.innerHeight) {\n top = Math.max(8, rect.top - POPUP_H_EST - 8);\n }\n if (left + POPUP_W > window.innerWidth) {\n left = Math.max(8, window.innerWidth - POPUP_W - 8);\n }\n return { top, left, label: describeSelection(sel) };\n }, [state, engine]);\n\n if (state.kind !== \"annotating\" || !placement) return null;\n\n return (\n <div className=\"clickly-popup\" style={{ top: placement.top, left: placement.left }}>\n <div className=\"target-info\">\n <span>{placement.label}</span>\n <span>{state.selection.kind}</span>\n </div>\n <textarea\n ref={taRef}\n value={comment}\n placeholder=\"Describe the issue or change… (⌘/Ctrl + Enter to submit)\"\n aria-label=\"Annotation comment\"\n onChange={(e) => setComment(e.target.value)}\n onKeyDown={onKey}\n />\n <div className=\"row\">\n <button className=\"ghost\" onClick={cancel}>\n Cancel\n </button>\n <button className=\"primary\" onClick={submit}>\n Add\n </button>\n </div>\n </div>\n );\n}\n\n/* ─── small helpers ────────────────────────────────────────────── */\n\nfunction stringifyStyles(styles: Record<string, string>): string | undefined {\n const entries = Object.entries(styles);\n if (entries.length === 0) return undefined;\n return entries.map(([k, v]) => `${k}: ${v}`).join(\"; \");\n}\n\nfunction anchorRect(\n sel: ReturnType<SelectionEngine[\"resolveSelection\"]>,\n): DOMRect | null {\n if (!sel) return null;\n if (sel.kind === \"single\") return sel.element.getBoundingClientRect();\n if (sel.kind === \"area\") {\n return new DOMRect(sel.rect.x, sel.rect.y, sel.rect.width, sel.rect.height);\n }\n if (sel.elements.length === 0) return null;\n return sel.elements[0]!.getBoundingClientRect();\n}\n\nfunction describeSelection(\n sel: NonNullable<ReturnType<SelectionEngine[\"resolveSelection\"]>>,\n): string {\n if (sel.kind === \"single\") {\n const m = collectMetadata(sel.element, { detail: \"compact\" });\n return m.elementPath;\n }\n if (sel.kind === \"area\") return `area · ${sel.elements.length} element(s)`;\n return `${sel.elements.length} element(s)`;\n}\n","import { useEffect, useState } from \"react\";\nimport type { Annotation } from \"@useclickly/core\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\n\n/**\n * Persistent numbered markers anchored to annotated elements. Updates\n * on scroll/resize (RAF-coalesced) and re-resolves the live element by\n * its stored `elementPath` selector on each render — so pins follow\n * the actual element when layout changes, falling back to the stored\n * bounding box if the selector no longer matches.\n */\nexport function AnnotationPins() {\n const annotations = useAnnotationsList();\n // Bump on scroll/resize to recompute positions. RAF-coalesced.\n const [, setVersion] = useState(0);\n useEffect(() => {\n let raf: number | null = null;\n const update = () => {\n if (raf !== null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n setVersion((v) => v + 1);\n });\n };\n window.addEventListener(\"scroll\", update, { capture: true, passive: true });\n window.addEventListener(\"resize\", update, { passive: true });\n return () => {\n if (raf !== null) cancelAnimationFrame(raf);\n window.removeEventListener(\"scroll\", update, { capture: true } as EventListenerOptions);\n window.removeEventListener(\"resize\", update);\n };\n }, []);\n\n return (\n <>\n {annotations.map((a, i) => (\n <Pin key={a.id} number={i + 1} annotation={a} />\n ))}\n </>\n );\n}\n\nfunction Pin({ number, annotation }: { number: number; annotation: Annotation }) {\n const remove = useAnnotations((s) => s.remove);\n const [hovered, setHovered] = useState(false);\n\n const pos = resolvePosition(annotation);\n if (!pos) return null;\n\n return (\n <div\n className=\"clickly-pin\"\n style={{ left: pos.x, top: pos.y }}\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n role=\"button\"\n tabIndex={0}\n title={annotation.comment}\n >\n <span className=\"clickly-pin-num\">{number}</span>\n {hovered && (\n <div className=\"clickly-pin-bubble\">\n <div className=\"clickly-pin-comment\">{annotation.comment}</div>\n <div className=\"clickly-pin-meta\">{annotation.elementPath}</div>\n <button\n className=\"clickly-pin-remove\"\n onClick={(e) => {\n e.stopPropagation();\n remove(annotation.id);\n }}\n >\n Remove\n </button>\n </div>\n )}\n </div>\n );\n}\n\nfunction resolvePosition(a: Annotation): { x: number; y: number } | null {\n // Prefer the live element via its short selector.\n if (a.elementPath) {\n try {\n const el = document.querySelector(a.elementPath);\n if (el) {\n const r = el.getBoundingClientRect();\n if (r.width || r.height) return { x: r.right - 11, y: r.top - 11 };\n }\n } catch {\n /* invalid selector — fall through to bbox */\n }\n }\n // Fallback: stored bounding box (won't follow layout changes, but lets\n // the pin still appear if the element was removed from the DOM).\n if (a.boundingBox) {\n return {\n x: a.boundingBox.x + a.boundingBox.width - 11,\n y: a.boundingBox.y - 11,\n };\n }\n return null;\n}\n","import { useEffect, useState } from \"react\";\nimport type { SelectionEngine } from \"@useclickly/core\";\nimport { Toolbar } from \"./Toolbar\";\nimport { CollapsedFAB } from \"./CollapsedFAB\";\nimport { AnnotationPopup } from \"./AnnotationPopup\";\nimport { AnnotationPins } from \"./AnnotationPins\";\nimport { useAnnotations } from \"../state/annotations\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport { useSettings } from \"../state/settings\";\nimport { useEngineState } from \"../state/useEngineState\";\n\n/**\n * Top-level React subtree rendered (via createPortal) inside the\n * shadow root. Owns:\n *\n * - the expanded ↔ collapsed UI state\n * - all keyboard shortcuts (delegating engine actions to the engine)\n * - the body `data-clickly-active` attribute used to flip the page\n * cursor to crosshair while inspecting\n */\nexport function ClicklyRoot({\n engine,\n host,\n}: {\n engine: SelectionEngine;\n host: HTMLElement;\n}) {\n const [expanded, setExpanded] = useState(false);\n const clearAnnotations = useAnnotations((s) => s.clear);\n const outputDetail = useSettings((s) => s.outputDetail);\n const markerColor = useSettings((s) => s.markerColor);\n const engineState = useEngineState(engine);\n\n // Apply user-chosen marker color → updates the shadow root's CSS vars.\n useEffect(() => {\n host.style.setProperty(\"--clickly-hover\", markerColor);\n }, [host, markerColor]);\n\n // Activate engine while expanded; deactivate when collapsed.\n useEffect(() => {\n if (expanded) {\n if (engine.getSnapshot().kind === \"idle\") engine.activate(\"single\");\n } else {\n if (engine.getSnapshot().kind !== \"idle\") engine.deactivate();\n }\n }, [expanded, engine]);\n\n // Body attributes — host page can target our active state + mode in\n // CSS. We use these to disable text selection + swap the cursor while\n // inspecting (see internal/globalStyles.ts).\n useEffect(() => {\n const active = engineState.kind !== \"idle\";\n if (active) document.body.setAttribute(\"data-clickly-active\", \"\");\n else document.body.removeAttribute(\"data-clickly-active\");\n\n const mode =\n engineState.kind === \"inspect\" ||\n engineState.kind === \"pressed\" ||\n engineState.kind === \"dragging\"\n ? engineState.mode\n : null;\n if (mode) document.body.setAttribute(\"data-clickly-mode\", mode);\n else document.body.removeAttribute(\"data-clickly-mode\");\n\n // Suppress the crosshair while the popup is open — typing in the\n // comment textarea should not feel like an inspection.\n if (engineState.kind === \"annotating\") {\n document.body.setAttribute(\"data-clickly-annotating\", \"\");\n } else {\n document.body.removeAttribute(\"data-clickly-annotating\");\n }\n\n return () => {\n document.body.removeAttribute(\"data-clickly-active\");\n document.body.removeAttribute(\"data-clickly-mode\");\n document.body.removeAttribute(\"data-clickly-annotating\");\n };\n }, [engineState]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement | null)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\") return;\n if ((e.target as HTMLElement | null)?.isContentEditable) return;\n const active = document.activeElement;\n if (active && (active.tagName === \"TEXTAREA\" || active.tagName === \"INPUT\")) return;\n\n // Toggle FAB ↔ toolbar\n if (e.key.toLowerCase() === \"f\" && e.shiftKey && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n setExpanded((v) => !v);\n return;\n }\n\n // Escape:\n // - if popup open (annotating) → engine handles cancel\n // - else collapse the toolbar\n if (e.key === \"Escape\") {\n if (engine.getSnapshot().kind === \"annotating\") return;\n if (expanded) setExpanded(false);\n return;\n }\n\n if (!expanded) return;\n\n if (e.key === \"1\") engine.setMode(\"single\");\n if (e.key === \"2\") engine.setMode(\"multi\");\n if (e.key === \"3\") engine.setMode(\"area\");\n\n // Enter: commit pinned selection → open popup\n if (e.key === \"Enter\") {\n const s = engine.getSnapshot();\n if (s.kind === \"inspect\" && s.pinned.length > 0) {\n e.preventDefault();\n engine.annotatePinned();\n }\n }\n\n if (e.key === \"c\" || e.key === \"C\") {\n const list = useAnnotations.getState().list();\n if (list.length === 0) return;\n e.preventDefault();\n navigator.clipboard?.writeText(annotationsToMarkdown(list, outputDetail));\n }\n if (e.key === \"x\" || e.key === \"X\") {\n if (useAnnotations.getState().list().length === 0) return;\n e.preventDefault();\n clearAnnotations();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [clearAnnotations, outputDetail, expanded, engine]);\n\n return (\n <div className=\"clickly-ui\">\n {/* Pins persist regardless of expanded state, so users always see\n which elements they've annotated. */}\n <AnnotationPins />\n {expanded ? (\n <>\n <Toolbar engine={engine} onCollapse={() => setExpanded(false)} />\n <AnnotationPopup engine={engine} />\n </>\n ) : (\n <CollapsedFAB onExpand={() => setExpanded(true)} />\n )}\n </div>\n );\n}\n","/**\n * CSS injected into the shadow root by the React layer. Separate from\n * the overlay-marker CSS in `@useclickly/core/styles` so each package owns\n * its surface.\n */\nexport const REACT_UI_CSS = `\n.clickly-ui, .clickly-ui * { box-sizing: border-box; }\n\n/* ─── Floating action button (collapsed state) ──────────────────── */\n\n.clickly-fab {\n position: fixed;\n right: 16px;\n bottom: 16px;\n width: 48px;\n height: 48px;\n border: none;\n border-radius: 999px;\n background: #0f172a;\n color: #f8fafc;\n display: grid;\n place-items: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow:\n 0 8px 24px rgba(0,0,0,0.30),\n 0 0 0 1px rgba(255,255,255,0.06) inset;\n transition: transform 140ms ease, box-shadow 140ms ease;\n z-index: 1;\n}\n.clickly-fab:hover {\n transform: scale(1.06);\n box-shadow:\n 0 10px 28px rgba(0,0,0,0.36),\n 0 0 0 1px rgba(255,255,255,0.10) inset;\n}\n.clickly-fab:active { transform: scale(0.96); }\n.clickly-fab svg { width: 18px; height: 18px; color: #f8fafc; }\n\n.clickly-fab-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 9px;\n display: grid;\n place-items: center;\n pointer-events: none;\n}\n\n/* ─── Toolbar (expanded state) ──────────────────────────────────── */\n\n.clickly-toolbar {\n position: fixed;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px;\n background: rgba(15, 23, 42, 0.94);\n color: #f8fafc;\n border-radius: 12px;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n box-shadow: 0 8px 24px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.06) inset;\n pointer-events: auto;\n user-select: none;\n z-index: 1;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n@keyframes clickly-fade-in {\n from { opacity: 0; transform: translateY(4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.clickly-toolbar .grip {\n display: grid;\n place-items: center;\n width: 24px;\n height: 28px;\n color: #94a3b8;\n touch-action: none;\n}\n\n.clickly-toolbar .divider {\n width: 1px;\n height: 18px;\n background: rgba(255,255,255,0.12);\n margin: 0 2px;\n}\n\n.clickly-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n height: 28px;\n padding: 0 8px;\n background: transparent;\n border: none;\n border-radius: 8px;\n color: #cbd5e1;\n cursor: pointer;\n font: inherit;\n}\n.clickly-btn:hover { background: rgba(255,255,255,0.08); color: #fff; }\n.clickly-btn:active { background: rgba(255,255,255,0.14); }\n.clickly-btn.is-active { background: #0ea5e9; color: #fff; }\n.clickly-btn[disabled] { opacity: 0.4; cursor: not-allowed; }\n\n.clickly-btn.icon-only {\n width: 28px;\n padding: 0;\n justify-content: center;\n}\n\n.clickly-btn.primary-pinned {\n background: #10b981;\n color: #fff;\n font-weight: 500;\n}\n.clickly-btn.primary-pinned:hover {\n background: #059669;\n color: #fff;\n}\n\n/* ─── Popup & popovers ──────────────────────────────────────────── */\n\n.clickly-popup, .clickly-popover {\n position: fixed;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n.clickly-popup { width: 320px; padding: 12px; }\n\n.clickly-popup .target-info {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n margin-bottom: 8px;\n color: #475569;\n font-size: 11px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n}\n\n.clickly-popup textarea {\n width: 100%;\n min-height: 64px;\n max-height: 160px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n}\n.clickly-popup textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n.clickly-popup .row {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 10px;\n}\n\n.clickly-popup .row .ghost {\n background: transparent;\n color: #475569;\n border: 1px solid #e2e8f0;\n}\n.clickly-popup .row .ghost:hover { background: #f8fafc; }\n\n.clickly-popup .row .primary {\n background: #0ea5e9;\n color: #fff;\n border: none;\n}\n.clickly-popup .row .primary:hover { background: #0284c7; }\n.clickly-popup .row button {\n height: 28px;\n padding: 0 12px;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n}\n\n.clickly-popover { width: 260px; padding: 12px; }\n.clickly-popover h4 { margin: 0 0 8px; font-size: 12px; color: #475569; text-transform: uppercase; letter-spacing: 0.05em; }\n.clickly-popover .field { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 0; font-size: 13px; }\n.clickly-popover select { font: inherit; padding: 4px 6px; border-radius: 4px; border: 1px solid #e2e8f0; }\n.clickly-popover input[type=\"color\"] { width: 28px; height: 24px; padding: 0; border: 1px solid #e2e8f0; border-radius: 4px; background: none; }\n\n.clickly-counter {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n border-radius: 9px;\n background: #f59e0b;\n color: #1f2937;\n font-size: 11px;\n font-weight: 600;\n margin-left: 4px;\n}\n\n/* ─── Annotation pins (persistent numbered markers) ─────────────── */\n\n.clickly-pin {\n position: fixed;\n width: 22px;\n height: 22px;\n border-radius: 999px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 12px/22px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow: 0 2px 6px rgba(0,0,0,0.25), 0 0 0 2px #fff;\n z-index: 1;\n transition: transform 100ms ease;\n}\n.clickly-pin:hover { transform: scale(1.12); }\n.clickly-pin-num { display: block; }\n\n.clickly-pin-bubble {\n position: absolute;\n top: 28px;\n left: 0;\n width: 240px;\n padding: 8px 10px;\n background: #fff;\n color: #0f172a;\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n z-index: 3;\n animation: clickly-fade-in 100ms ease-out;\n}\n.clickly-pin-comment { word-break: break-word; }\n.clickly-pin-meta {\n margin-top: 6px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 11px;\n color: #475569;\n word-break: break-all;\n}\n.clickly-pin-remove {\n margin-top: 8px;\n padding: 4px 8px;\n border: 1px solid #fecaca;\n background: #fff;\n color: #b91c1c;\n border-radius: 4px;\n font: 11px inherit;\n cursor: pointer;\n}\n.clickly-pin-remove:hover { background: #fef2f2; }\n\n/* ─── Annotation list ───────────────────────────────────────────── */\n\n.clickly-list {\n position: fixed;\n max-height: 50vh;\n width: 320px;\n overflow-y: auto;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n color: #0f172a;\n font: 12px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n.clickly-list .row { display: flex; gap: 8px; padding: 8px 10px; border-bottom: 1px solid #f1f5f9; }\n.clickly-list .row:last-child { border-bottom: none; }\n.clickly-list .num { color: #94a3b8; min-width: 18px; }\n.clickly-list .selector { color: #475569; font-family: ui-monospace, \"SF Mono\", Menlo, monospace; font-size: 11px; word-break: break-all; }\n.clickly-list .body { flex: 1; min-width: 0; }\n.clickly-list .body p { margin: 2px 0 0; word-break: break-word; }\n.clickly-list button.remove {\n background: transparent;\n border: none;\n color: #94a3b8;\n cursor: pointer;\n padding: 2px;\n display: grid;\n place-items: center;\n}\n.clickly-list button.remove svg { width: 12px; height: 12px; }\n.clickly-list button.remove:hover { color: #ef4444; }\n.clickly-list .empty { padding: 20px; text-align: center; color: #94a3b8; }\n`;\n","/**\n * CSS injected into `document.head` (NOT the shadow root). Targets the\n * host page body to:\n *\n * - disable text selection while we're inspecting/pressed/dragging\n * (otherwise the browser tries to select text mid-drag and the\n * marquee never starts)\n * - swap the cursor to crosshair in area mode for a clear UX cue\n *\n * Mounted by `Clickly.tsx`, torn down on unmount.\n */\nexport const GLOBAL_PAGE_CSS = `\nbody[data-clickly-active] {\n -webkit-user-select: none !important;\n user-select: none !important;\n}\nbody[data-clickly-active],\nbody[data-clickly-active] *:not(input):not(textarea):not(select) {\n cursor: crosshair !important;\n}\nbody[data-clickly-mode=\"multi\"],\nbody[data-clickly-mode=\"multi\"] *:not(input):not(textarea):not(select) {\n cursor: copy !important;\n}\n/* Restore normal cursor while the annotation popup is open so the user\n can comfortably type in the textarea + click the buttons. */\nbody[data-clickly-annotating] {\n cursor: default !important;\n}\n`;\n","import { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n Overlay,\n SelectionEngine,\n createShadowHost,\n type ShadowHost,\n} from \"@useclickly/core\";\nimport { ClicklyRoot } from \"./internal/ClicklyRoot\";\nimport { REACT_UI_CSS } from \"./internal/styles\";\nimport { GLOBAL_PAGE_CSS } from \"./internal/globalStyles\";\n\nexport interface ClicklyProps {\n /** Custom class on the host element (for z-index / positioning overrides). */\n className?: string;\n /** Optional MCP server endpoint, e.g. \"http://localhost:4747\". */\n endpoint?: string;\n /** Join an existing MCP session by ID. */\n sessionId?: string;\n\n /* Lifecycle callbacks (Phase 6+ will wire these to annotation events) */\n onAnnotationAdd?: (id: string) => void;\n onAnnotationDelete?: (id: string) => void;\n onAnnotationsClear?: () => void;\n onCopy?: (markdown: string) => void;\n onSessionCreated?: (sessionId: string) => void;\n}\n\ninterface Mount {\n shadow: ShadowHost;\n engine: SelectionEngine;\n overlay: Overlay;\n portal: HTMLDivElement;\n}\n\n/**\n * Mount once near the root of your React app. Dev-only by convention:\n *\n * ```tsx\n * {process.env.NODE_ENV === \"development\" && <Clickly />}\n * ```\n *\n * Renders a small floating button (FAB) in the bottom-right corner.\n * Click it (or press `⌘/Ctrl+Shift+F`) to open the full toolbar.\n */\nexport function Clickly({ className }: ClicklyProps = {}) {\n const [mount, setMount] = useState<Mount | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n let shadow: ShadowHost | null = null;\n let engine: SelectionEngine | null = null;\n let overlay: Overlay | null = null;\n let portal: HTMLDivElement | null = null;\n\n try {\n shadow = createShadowHost({ document });\n\n portal = document.createElement(\"div\");\n portal.setAttribute(\"data-clickly-react-root\", \"\");\n shadow.root.appendChild(portal);\n\n if (!shadow.root.querySelector(\"style[data-clickly-react]\")) {\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-clickly-react\", \"\");\n style.textContent = REACT_UI_CSS;\n shadow.root.appendChild(style);\n }\n\n // Document-level styles (cursor + text-select inhibitor) — these\n // can't live inside the shadow root because they target body.\n if (!document.head.querySelector(\"style[data-clickly-globals]\")) {\n const gstyle = document.createElement(\"style\");\n gstyle.setAttribute(\"data-clickly-globals\", \"\");\n gstyle.textContent = GLOBAL_PAGE_CSS;\n document.head.appendChild(gstyle);\n }\n\n engine = new SelectionEngine({ document, host: shadow.host });\n overlay = new Overlay({\n engine,\n root: shadow.root,\n document,\n excludeHost: shadow.host,\n });\n\n setMount({ shadow, engine, overlay, portal });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] failed to mount\", err);\n overlay?.destroy();\n engine?.destroy();\n portal?.remove();\n shadow?.destroy();\n }\n\n return () => {\n setMount(null);\n overlay?.destroy();\n engine?.destroy();\n portal?.remove();\n shadow?.destroy();\n document.head.querySelector(\"style[data-clickly-globals]\")?.remove();\n document.body.removeAttribute(\"data-clickly-active\");\n document.body.removeAttribute(\"data-clickly-mode\");\n };\n }, []);\n\n useEffect(() => {\n if (!mount || !className) return;\n mount.shadow.host.className = className;\n return () => {\n if (mount.shadow.host.isConnected) mount.shadow.host.className = \"\";\n };\n }, [mount, className]);\n\n if (!mount) return null;\n return createPortal(\n <ClicklyRoot engine={mount.engine} host={mount.shadow.host} />,\n mount.portal,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useDraggable.ts","../src/state/useEngineState.ts","../src/internal/strokeDB.ts","../src/state/annotations.ts","../src/state/settings.ts","../src/output/markdown.ts","../src/internal/icons.tsx","../src/state/mcpClient.ts","../src/internal/SettingsPopover.tsx","../src/internal/freezeAnimations.ts","../src/internal/screenshot.ts","../src/internal/compositeScreenshot.ts","../src/internal/copyImage.ts","../src/internal/saveFile.ts","../src/internal/AnnotationList.tsx","../src/internal/Toolbar.tsx","../src/internal/CollapsedFAB.tsx","../src/internal/AnnotationPopup.tsx","../src/internal/AnnotationPins.tsx","../src/internal/DrawCanvas.tsx","../src/internal/layout/palette.ts","../src/internal/layout/LayoutPalette.tsx","../src/internal/layout/previews.tsx","../src/internal/layout/LayoutGhost.tsx","../src/internal/layout/DropCommentBubble.tsx","../src/internal/layout/sectionDetect.ts","../src/internal/layout/RearrangeOverlay.tsx","../src/internal/layout/buildAnnotation.ts","../src/internal/layout/LayoutMode.tsx","../src/internal/ClicklyRoot.tsx","../src/internal/styles.ts","../src/internal/globalStyles.ts","../src/Clickly.tsx"],"names":["create","useRef","useEffect","jsxs","jsx","loadImage","ok","useState","useCallback","Fragment","TAG_LABELS","_","truncate","collectMetadata","nanoid","clamp01","isPlacementAnnotation","onMove"],"mappings":";;;;;;;;;AA0BO,SAAS,YAAA,CACd,YACA,IAAA,EACc;AACd,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAmB,UAAU,CAAA;AAC7D,EAAA,MAAM,CAAC,UAAA,EAAY,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,OAAoD,IAAI,CAAA;AAEzE,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CAAC,CAAA,KAA0B;AACzB,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAC,CAAA,CAAE,MAAA,CAAmB,iBAAA,GAAoB,CAAA,CAAE,SAAS,CAAA;AACrD,MAAA,QAAA,CAAS,OAAA,GAAU;AAAA,QACjB,SAAS,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAAA,QACtC,GAAA,EAAK;AAAA,OACP;AACA,MAAA,WAAA,CAAY,IAAI,CAAA;AAAA,IAClB,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACX;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,MAAM,IAAI,QAAA,CAAS,OAAA;AACnB,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,CAAA;AACjC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,KAAA,GAAQ,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,GAAc,IAAA,CAAK,MAAA,GAAS,CAAA;AAChD,MAAA,WAAA,CAAY;AAAA,QACV,CAAA,EAAG,KAAA,CAAM,CAAA,CAAE,GAAA,CAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,QAC3C,CAAA,EAAG,KAAA,CAAM,CAAA,CAAE,GAAA,CAAI,CAAA,GAAI,EAAA,EAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC;AAAA,OAC5C,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC7C,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAa,IAAI,CAAA;AACzC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,KAAK,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAC,CAAA;AAExC,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA,EAAa;AAAA,MACX,aAAA;AAAA,MACA,OAAO,EAAE,MAAA,EAAQ,aAAa,UAAA,GAAa,MAAA,EAAQ,aAAa,MAAA;AAAO,KACzE;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,KAAA,CAAM,CAAA,EAAW,EAAA,EAAY,EAAA,EAAoB;AACxD,EAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,EAAA,EAAI,CAAC,CAAC,CAAA;AACrC;AC/EO,SAAS,eAAe,MAAA,EAA6C;AAC1E,EAAA,OAAO,oBAAA;AAAA,IACL,CAAC,EAAA,KAAQ,MAAA,GAAS,OAAO,SAAA,CAAU,EAAE,IAAI,MAAM;AAAA,IAAC,CAAA;AAAA,IAChD,MAAO,MAAA,GAAS,MAAA,CAAO,WAAA,EAAY,GAAI,IAAA;AAAA,IACvC,MAAM;AAAA,GACR;AACF;AAEA,IAAM,IAAA,GAAoB,EAAE,IAAA,EAAM,MAAA,EAAO;;;ACCzC,IAAM,OAAA,GAAU,SAAA;AAChB,IAAM,UAAA,GAAa,CAAA;AACnB,IAAM,aAAA,GAAgB,SAAA;AACtB,IAAM,aAAA,GAAgB,SAAA;AAItB,IAAI,SAAA,GAAqC,IAAA;AAEzC,SAAS,IAAA,GAAyB;AAChC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACjE,EAAA,IAAI,WAAW,OAAO,SAAA;AACtB,EAAA,SAAA,GAAY,IAAI,OAAA,CAAiB,CAAC,OAAA,KAAY;AAC5C,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AAC9C,IAAA,GAAA,CAAI,kBAAkB,MAAM;AAC1B,MAAA,MAAM,KAAK,GAAA,CAAI,MAAA;AACf,MAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,aAAa,CAAA,EAAG;AAChD,QAAA,EAAA,CAAG,kBAAkB,aAAa,CAAA;AAAA,MACpC;AACA,MAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,aAAa,CAAA,EAAG;AAChD,QAAA,EAAA,CAAG,kBAAkB,aAAa,CAAA;AAAA,MACpC;AAAA,IACF,CAAA;AACA,IAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AACxC,IAAA,GAAA,CAAI,UAAU,MAAM;AAElB,MAAA,OAAA,CAAQ,IAAA,CAAK,kCAAA,EAAoC,GAAA,CAAI,KAAK,CAAA;AAC1D,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,EAAA,CAAM,SAAA,EAAmB,IAAA,EAA0B,GAAA,EAA8D;AACxH,EAAA,OAAO,IAAA,EAAK,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO;AACzB,IAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,IAAA,OAAO,IAAI,OAAA,CAAkB,CAAC,OAAA,KAAY;AACxC,MAAA,MAAM,CAAA,GAAI,EAAA,CAAG,WAAA,CAAY,SAAA,EAAW,IAAI,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,SAAS,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,IAAI,KAAK,CAAA;AACrB,MAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAS,GAAA,CAAI,UAAgB,IAAI,CAAA;AACvD,MAAA,GAAA,CAAI,UAAU,MAAM;AAElB,QAAA,OAAA,CAAQ,IAAA,CAAK,gCAAA,EAAkC,GAAA,CAAI,KAAK,CAAA;AACxD,QAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,MACd,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAIA,eAAsB,WAAA,CAAY,IAAY,OAAA,EAA4C;AACxF,EAAA,MAAM,EAAA,CAAG,eAAe,WAAA,EAAa,CAAC,MAAM,CAAA,CAAE,GAAA,CAAI,OAAA,EAAS,EAAE,CAAC,CAAA;AAChE;AAMA,eAAsB,cAAc,EAAA,EAA2B;AAC7D,EAAA,MAAM,EAAA,CAAG,eAAe,WAAA,EAAa,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1D;AAEA,eAAsB,cAAA,GAA8D;AAClF,EAAA,MAAM,EAAA,GAAK,MAAM,IAAA,EAAK;AACtB,EAAA,IAAI,CAAC,EAAA,EAAI,OAAO,EAAC;AACjB,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,MAA0C,EAAC;AACjD,IAAA,MAAM,CAAA,GAAI,EAAA,CAAG,WAAA,CAAY,aAAA,EAAe,UAAU,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,WAAA,CAAY,aAAa,CAAA;AACzC,IAAA,MAAM,SAAA,GAAY,MAAM,UAAA,EAAW;AACnC,IAAA,SAAA,CAAU,YAAY,MAAM;AAC1B,MAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,OAAA,CAAQ,GAAG,CAAA;AAC/B,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,IAAI,MAAA,CAAO,KAAA;AACjC,MAAA,MAAA,CAAO,QAAA,EAAS;AAAA,IAClB,CAAA;AACA,IAAA,SAAA,CAAU,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAG,CAAA;AAAA,EACvC,CAAC,CAAA;AACH;AAIA,IAAM,UAAA,GAAa,YAAA;AAMnB,eAAsB,aAAA,GAA2D;AAC/E,EAAA,OAAO,EAAA,CAA8B,eAAe,UAAA,EAAY,CAAC,MAAM,CAAA,CAAE,GAAA,CAAI,UAAU,CAAC,CAAA;AAC1F;;;ACtFO,IAAM,cAAA,GAAiB,MAAA,CAAyB,CAAC,GAAA,EAAK,GAAA,MAAS;AAAA,EACpE,MAAM,EAAC;AAAA,EACP,OAAO,EAAC;AAAA,EAER,GAAA,EAAK,CAAC,CAAA,KAAM;AAGV,IAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,KAAK,WAAA,CAAY,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,OAAO,CAAA;AACvE,IAAA,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACV,IAAA,EAAM,EAAE,GAAG,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,EAAE,GAAG,CAAA,EAAE;AAAA,MAC7B,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,QAAA,CAAS,EAAE,EAAE,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAC,GAAG,CAAA,CAAE,KAAA,EAAO,EAAE,EAAE;AAAA,KAC7D,CAAE,CAAA;AAAA,EACJ,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAA,KAAO;AACd,IAAA,KAAK,cAAc,EAAE,CAAA;AACrB,IAAA,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,MAAA,IAAI,EAAE,EAAA,IAAM,CAAA,CAAE,IAAA,CAAA,EAAO,OAAO,CAAA;AAC5B,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,CAAA,CAAE,IAAA,EAAK;AACzB,MAAA,OAAO,KAAK,EAAE,CAAA;AACd,MAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAA,EAAE;AAAA,IAC9D,CAAC,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,MAAA,EAAQ,CAAC,EAAA,EAAI,KAAA,KAAU;AACrB,IAAA,IAAI,MAAM,OAAA,EAAS,KAAK,WAAA,CAAY,EAAA,EAAI,MAAM,OAAO,CAAA;AACrD,IAAA,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACrB,MAAA,IAAI,CAAC,KAAK,OAAO,CAAA;AACjB,MAAA,OAAO,EAAE,IAAA,EAAM,EAAE,GAAG,EAAE,IAAA,EAAM,CAAC,EAAE,GAAG,EAAE,GAAG,GAAA,EAAK,GAAG,KAAA,IAAQ,EAAE;AAAA,IAC3D,CAAC,CAAA;AAAA,EACH,CAAA;AAAA,EAEA,OAAO,MAAM;AAIX,IAAA,GAAA,CAAI,EAAE,IAAA,EAAM,IAAI,KAAA,EAAO,IAAI,CAAA;AAAA,EAC7B,CAAA;AAAA,EAEA,MAAM,MAAM;AACV,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,GAAA,EAAI;AAC5B,IAAA,OAAO,KAAA,CAAM,IAAI,CAAC,EAAA,KAAO,KAAK,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAAA,EACnD,CAAA;AAAA,EAEA,cAAA,EAAgB,CAAC,WAAA,KACf,GAAA,CAAI,CAAC,CAAA,KAAM;AACT,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,CAAA,CAAE,IAAA,EAAK;AACzB,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACvD,MAAA,MAAM,GAAA,GAAM,KAAK,EAAE,CAAA;AACnB,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,IAAA,CAAK,EAAE,CAAA,GAAI,EAAE,GAAG,KAAK,OAAA,EAAQ;AAC7B,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AACA,IAAA,OAAO,OAAA,GAAU,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,CAAA;AAAA,EACpC,CAAC;AACL,CAAA,CAAE;AASK,SAAS,kBAAA,GAAmC;AACjD,EAAA,OAAO,cAAA;AAAA,IACL,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,GAAA,CAAI,CAAC,EAAA,KAAO,CAAA,CAAE,KAAK,EAAE,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAiB;AAAA,GACnF;AACF;ACzDO,IAAM,QAAA,GAAqB;AAAA,EAChC,YAAA,EAAc,UAAA;AAAA,EACd,SAAA,EAAW,IAAA;AAAA,EACX,mBAAA,EAAqB,IAAA;AAAA,EACrB,WAAA,EAAa,SAAA;AAAA,EACb,KAAA,EAAO,QAAA;AAAA,EACP,UAAA,EAAY,KAAA;AAAA,EACZ,WAAA,EAAa,uBAAA;AAAA,EACb,YAAA,EAAc;AAChB;AAEA,IAAM,WAAA,GAAc,kBAAA;AAEpB,SAAS,IAAA,GAAiB;AACxB,EAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,OAAO,QAAA;AAChD,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAO,QAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,EAAE,GAAG,QAAA,EAAU,GAAG,MAAA,EAAO;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,CAAA,EAAa;AAC5B,EAAA,IAAI,OAAO,iBAAiB,WAAA,EAAa;AACzC,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,OAAA,CAAQ,WAAA,EAAa,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EACrD,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEO,IAAM,WAAA,GAAcA,MAAAA,CAAsB,CAAC,GAAA,MAAS;AAAA,EACzD,GAAG,IAAA,EAAK;AAAA,EACR,GAAA,EAAK,CAAC,KAAA,KACJ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACX,IAAA,MAAM,IAAA,GAAO,EAAE,GAAG,GAAA,EAAK,GAAG,KAAA,EAAM;AAChC,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AAAA,EACH,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,QAAQ,CAAA;AAChB,IAAA,GAAA,CAAI,QAAQ,CAAA;AAAA,EACd;AACF,CAAA,CAAE;AAQK,SAAS,aAAa,KAAA,EAAgC;AAC3D,EAAA,IAAI,KAAA,KAAU,OAAA,IAAW,KAAA,KAAU,MAAA,EAAQ,OAAO,KAAA;AAClD,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,MAAA,CAAO,eAAe,UAAA,EAAY;AAC5E,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,UAAU,MAAA,GAAS,OAAA;AAC9E;AC3FO,SAAS,qBAAA,CACd,WAAA,EACA,MAAA,GAAuB,UAAA,EACf;AACR,EAAA,IAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,OAAO,kBAAA;AAChC,EAAA,OAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,MAAM,CAAC,CAAA,CAAE,KAAK,MAAM,CAAA;AAC3E;AAEO,SAAS,SAAA,CAAU,CAAA,EAAe,KAAA,EAAe,MAAA,EAA8B;AAIpF,EAAA,IAAI,sBAAsB,CAAC,CAAA,SAAU,eAAA,CAAgB,CAAA,EAAG,OAAO,MAAM,CAAA;AACrE,EAAA,IAAI,sBAAsB,CAAC,CAAA,SAAU,eAAA,CAAgB,CAAA,EAAG,OAAO,MAAM,CAAA;AAErE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE,CAAA;AACpC,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,eAAA,EAAkB,CAAA,CAAE,OAAO,CAAA,EAAG,EAAE,UAAA,GAAa,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,MAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,IAAI,EAAE,CAAA,EAAA;AAAA,GAC3F;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,CAAA,CAAE,WAAW,CAAA,EAAA,CAAI,CAAA;AAE3C,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,WAAA,EAAa;AACzC,IAAA,MAAM,IAAI,CAAA,CAAE,WAAA;AACZ,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,cAAA,EAAiB,KAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAC,OAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAM,CAAC,CAAA,GAAA;AAAA,KAC1G;AAAA,EACF;AACA,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,UAAA,EAAY;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,CAAE,UAAU,IAAI,CAAA,CAAE,UAAA,IAAc,GAAG,CAAA,EAAA,CAAI,CAAA;AAAA,EACrE;AAIA,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,YAAA,EAAc;AAC1C,IAAA,KAAA,CAAM,KAAK,CAAA,oBAAA,EAAuB,QAAA,CAAS,EAAE,YAAA,EAAc,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACpE;AACA,EAAA,IAAI,MAAA,KAAW,UAAA,IAAc,MAAA,KAAW,UAAA,EAAY;AAClD,IAAA,IAAI,EAAE,eAAA,EAAiB,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,CAAA,CAAE,eAAe,CAAA,CAAE,CAAA;AACnE,IAAA,IAAI,CAAA,CAAE,UAAA,EAAY,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAE,UAAA,EAAY,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,MAAA,KAAW,UAAA,IAAc,CAAA,CAAE,cAAA,EAAgB;AAC7C,IAAA,KAAA,CAAM,IAAA,CAAK,gCAAA,GAAmC,CAAA,CAAE,cAAA,GAAiB,OAAO,CAAA;AAAA,EAC1E;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAGvC,EAAA,IAAI,EAAE,YAAA,EAAc;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,8BAAA,GAAiC,CAAA,CAAE,YAAA,GAAe,OAAO,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,EAAE,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AACxD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,QAAA,CAAS,GAAW,CAAA,EAAmB;AAC9C,EAAA,OAAO,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA;AACjD;AAcA,SAAS,eAAA,CACP,CAAA,EACA,KAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,IAAI,CAAA,CAAE,SAAA;AACZ,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAK,CAAA,iBAAA,CAAc,CAAA;AAChD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,CAAA,CAAE,aAAa,CAAA,EAAA,CAAI,CAAA;AAElD,EAAA,IAAI,CAAA,CAAE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,SAAS,CAAA,CAAE,IAAA,EAAM,GAAG,CAAC,CAAA,CAAA,CAAG,CAAA;AAK9D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAC,CAAA;AAC1B,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,IAAI,CAAA,aAAA,EAAgB,GAAG,CAAA,WAAA,CAAa,CAAA;AAAA,EAClE,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,cAAA,EAAiB,IAAI,CAAA,aAAA,EAAgB,GAAG,qBAC7B,IAAA,CAAK,KAAA,CAAM,EAAE,KAAK,CAAC,OAAI,IAAA,CAAK,KAAA,CAAM,EAAE,MAAM,CAAC,aAAa,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,OAAO,CAAC,CAAA,CAAA;AAAA,KAC1F;AAAA,EACF;AAKA,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,UAAA,EAAY;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,sBAAsB,CAAA,CAAE,UAAU,IAAI,CAAA,CAAE,UAAA,IAAc,GAAG,CAAA,EAAA,CAAI,CAAA;AAAA,EAC1E;AACA,EAAA,IAAA,CAAK,MAAA,KAAW,UAAA,IAAc,MAAA,KAAW,UAAA,KAAe,EAAE,eAAA,EAAiB;AACzE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,CAAA,CAAE,eAAe,CAAA,CAAE,CAAA;AAAA,EACnD;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACvC,EAAA,IAAI,EAAE,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AACxD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAeA,SAAS,eAAA,CACP,CAAA,EACA,KAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,IAAI,CAAA,CAAE,SAAA;AACZ,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAK,CAAA,iBAAA,CAAc,CAAA;AAChD,EAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,CAAA,CAAE,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,QAAQ,CAAA,GAAA,CAAK,CAAA;AACxD,EAAA,IAAI,WAAW,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,CAAA,CAAE,WAAW,CAAA,EAAA,CAAI,CAAA;AAErE,EAAA,MAAM,QAAQ,CAAA,CAAE,YAAA;AAChB,EAAA,MAAM,MAAM,CAAA,CAAE,WAAA;AACd,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,gBAAA,EAAmB,KAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,IAAA,EAC1D,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,KAAK,CAAC,OAAI,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA,GAAA;AAAA,GAC3D;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,CAAA,cAAA,EAAiB,KAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,IAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,CAAA,IAAA,EACpD,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,KAAK,CAAC,OAAI,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAC,CAAA,GAAA;AAAA,GACvD;AAEA,EAAA,IAAI,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,UAAA,EAAY;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,CAAE,UAAU,IAAI,CAAA,CAAE,UAAA,IAAc,GAAG,CAAA,EAAA,CAAI,CAAA;AAAA,EACrE;AACA,EAAA,IAAA,CAAK,MAAA,KAAW,UAAA,IAAc,MAAA,KAAW,UAAA,KAAe,EAAE,eAAA,EAAiB;AACzE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,CAAA,CAAE,eAAe,CAAA,CAAE,CAAA;AAAA,EAC9C;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACvC,EAAA,IAAI,EAAE,QAAA,EAAU,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,CAAA,CAAE,QAAQ,CAAA,CAAE,CAAA;AACxD,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AChKA,SAAS,IAAA,CAAK;AAAA,EACZ,QAAA;AAAA,EACA,IAAA,GAAO;AACT,CAAA,EAGG;AACD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,aAAA,EAAY,MAAA;AAAA,MAEX;AAAA;AAAA,GACH;AAEJ;AAEO,IAAM,UAAA,GAAa,sBACxB,IAAA,CAAC,IAAA,EAAA,EAAK,MAAM,EAAA,EAEV,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA;AAAA,kBACrC,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kBACrC,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kBACpC,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kBACpC,GAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAK,cAAA,EAAe,MAAA,EAAO,MAAA,EAAO;AAAA,CAAA,EAClE,CAAA;AAGK,IAAM,QAAA,GAAW,sBACtB,IAAA,CAAC,IAAA,EAAA,EAAK,MAAM,EAAA,EACV,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,kBAC/B,GAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,WAAA,EAAY,KAAA,EAAM,CAAA;AAAA,kBACtD,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,CAAA,EACxC,CAAA;AAGK,IAAM,UAAA,GAAa,sBACxB,GAAA,CAAC,IAAA,EAAA,EACC,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAqB,CAAA,EAC/B,CAAA;AAGK,IAAM,UAAA,GAAa,sBACxB,IAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,wBAAA,EAAyB,CAAA;AAAA,kBACjC,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB,CAAA;AAAA,kBACxB,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAA,EAAgB;AAAA,CAAA,EAC1B,CAAA;AAGK,IAAM,UAAA,GAAa;AAAA;AAAA;AAAA,uBAGvB,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/C,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAC/C,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,KAAA,EAAM,GAAA,EAAI,MAAA,EAAO,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EAClD;AAAA,CAAA;AASK,IAAM,QAAA,GAAW,sBACtB,IAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,kBAChD,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0BAAA,EAA2B;AAAA,CAAA,EACrC,CAAA;AAGK,IAAM,SAAA,GAAY,sBACvB,GAAA,CAAC,IAAA,EAAA,EACC,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4FAA2F,CAAA,EACrG,CAAA;AAGK,IAAM,YAAA,GAAe,sBAC1B,IAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,kBAC9B,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,ilBAAA,EAAklB;AAAA,CAAA,EAC5lB,CAAA;AAGK,IAAM,QAAA,GAAW,sBACtB,IAAA,CAAC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,YAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,sBAC3B,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,sBAC5B,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,sBAC5B,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI,CAAA;AAAA,sBAC5B,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,sBAC7B,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI;AAAA,CAAA,EAChC,CAAA;AAGK,IAAM,SAAA,GAAY,sBACvB,GAAA,CAAC,IAAA,EAAA,EACC,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,wBAAuB,CAAA,EACjC,CAAA;AAGK,IAAM,SAAA,GAAY,sBACvB,GAAA,CAAC,IAAA,EAAA,EACC,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kBAAiB,CAAA,EAC3B,CAAA;AAGK,IAAM,QAAA,GAAW,sBACtB,GAAA,CAAC,IAAA,EAAA,EACC,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qDAAoD,CAAA,EAC9D,CAAA;AASK,IAAM,OAAA,GAAU,sBACrB,IAAA,CAAC,IAAA,EAAA,EAEC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,4DAAA,EAA6D,CAAA;AAAA,kBACrE,GAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAA0D;AAAA,CAAA,EACpE,CAAA;AAGK,IAAM,UAAA,GAAa,sBACxB,IAAA,CAAC,IAAA,EAAA,EAEC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,mFAAA,EAAoF,CAAA;AAAA,sBAC3F,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI;AAAA,CAAA,EAChC,CAAA;AAGK,IAAM,YAAA,GAAe,sBAC1B,IAAA,CAAC,IAAA,EAAA,EAEC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,GAAE,2CAAA,EAA4C,CAAA;AAAA,kBACpD,GAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB,CAAA;AAAA,kBACpC,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI;AAAA,CAAA,EACvC,CAAA;AAGK,IAAM,OAAA,GAAU,sBACrB,IAAA,CAAC,IAAA,EAAA,EAEC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,YAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,kBAC9B,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,kBACpC,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kBACtC,GAAA,CAAC,UAAK,EAAA,EAAG,MAAA,EAAO,IAAG,MAAA,EAAO,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,MAAA,EAAO,CAAA;AAAA,kBAC9C,GAAA,CAAC,UAAK,EAAA,EAAG,OAAA,EAAQ,IAAG,OAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,CAAA;AAAA,kBAClD,GAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kBACpC,GAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kBACtC,GAAA,CAAC,UAAK,EAAA,EAAG,MAAA,EAAO,IAAG,OAAA,EAAQ,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,OAAA,EAAQ,CAAA;AAAA,kBAChD,GAAA,CAAC,UAAK,EAAA,EAAG,OAAA,EAAQ,IAAG,MAAA,EAAO,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,MAAA,EAAO;AAAA,CAAA,EAClD,CAAA;AAGK,IAAM,QAAA,GAAW,sBACtB,GAAA,CAAC,IAAA,EAAA,EAEC,8BAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mDAAkD,CAAA,EAC5D,CAAA;ACtIK,IAAM,YAAA,GAAeA,MAAAA,CAAuB,CAAC,GAAA,MAAS;AAAA,EAC3D,MAAA,EAAQ,UAAA;AAAA,EACR,SAAA,EAAW,IAAA;AAAA,EACX,aAAA,EAAe,IAAA;AAAA,EACf,UAAA,EAAY,IAAA;AAAA,EACZ,SAAA,EAAW,CAAC,MAAA,EAAQ,KAAA,KAClB,GAAA,CAAI,EAAE,MAAA,EAAQ,SAAA,EAAW,MAAA,KAAW,OAAA,GAAU,KAAA,IAAS,IAAA,GAAO,MAAM,CAAA;AAAA,EACtE,kBAAkB,CAAC,aAAA,KAAkB,GAAA,CAAI,EAAE,eAAe,CAAA;AAAA,EAC1D,kBAAA,EAAoB,MAAM,GAAA,CAAI,EAAE,YAAY,IAAA,CAAK,GAAA,IAAO;AAC1D,CAAA,CAAE,CAAA;AAKK,SAAS,kBAAkB,QAAA,EAA0B;AAC1D,EAAA,OAAO,QAAA,CAAS,IAAA,EAAK,CAAE,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC3C;AAOA,eAAsB,WAAW,QAAA,EAA0C;AACzE,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,iBAAA,CAAkB,QAAQ,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MAC/D,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB;AAAA;AAAA;AAAA,MAGtC,MAAA,EAAQ,cAAc,GAAK;AAAA,KAC5B,CAAA;AACD,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,OAAO,IAAA;AACpB,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,IAAA,OAAO,IAAA,CAAK,EAAA,IAAM,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,GAAU,IAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,eAAsB,aAAA,CAAc,UAAkB,GAAA,EAA8B;AAClF,EAAA,MAAM,MAAM,MAAM,KAAA,CAAM,GAAG,iBAAA,CAAkB,QAAQ,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,IACjE,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,IAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAK,CAAA;AAAA,IAC5B,MAAA,EAAQ,cAAc,GAAK;AAAA,GAC5B,CAAA;AACD,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,GAAG,CAAA;AACnC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,EAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,MAAM,IAAI,MAAM,mCAAmC,CAAA;AACxE,EAAA,OAAO,IAAA,CAAK,SAAA;AACd;AAQA,eAAsB,cAAA,CACpB,QAAA,EACA,SAAA,EACA,UAAA,EACe;AACf,EAAA,MAAM,MAAM,MAAM,KAAA;AAAA,IAChB,GAAG,iBAAA,CAAkB,QAAQ,CAAC,CAAA,UAAA,EAAa,kBAAA,CAAmB,SAAS,CAAC,CAAA,YAAA,CAAA;AAAA,IACxE;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AAAA,MAC/B,MAAA,EAAQ,cAAc,GAAK;AAAA;AAC7B,GACF;AACA,EAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,IAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,GAAG,CAAA;AACnC,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EACjE;AACF;AAIA,SAAS,cAAc,EAAA,EAAqC;AAC1D,EAAA,IAAI,OAAO,eAAA,KAAoB,WAAA,EAAa,OAAO,MAAA;AACnD,EAAA,MAAM,CAAA,GAAI,IAAI,eAAA,EAAgB;AAC9B,EAAA,UAAA,CAAW,MAAM,CAAA,CAAE,KAAA,EAAM,EAAG,EAAE,CAAA;AAC9B,EAAA,OAAO,CAAA,CAAE,MAAA;AACX;AAEA,eAAe,aAAa,GAAA,EAAgC;AAC1D,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AClIO,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAQ,EAAU;AACjE,EAAA,MAAM,GAAA,GAAMC,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,IAAI,WAAA,EAAY;AAEtB,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAGlC,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,CAAE,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC3D,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,QAAQ,IAAI,CAAA;AAAA,EACrE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAA,MAAM,OAAA,GAAU,GAAA;AAChB,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,CAAA,GAAI,UAAU,EAAE,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,UAAA,GAAa,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAA,GAAI,KAAA,GAAQ,GAAG,CAAC,CAAA;AAElF,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAU,oBAAmB,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,EAAI,EAE7D,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBACzCA,GAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,gBAAA,EAAiB,OAAA,EAAS,OAAA,EAAS,YAAA,EAAW,gBAAA,EAC9D,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EACb;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gBAAA,EAAiB,SAAQ,gBAAA,EAAiB,QAAA,EAAA;AAAA,QAAA,eAAA;AAAA,wBAEzDC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,+BAAA,EAA6B;AAAA,OAAA,EAC/D,CAAA;AAAA,sBACAD,IAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,EAAA,EAAG,gBAAA;AAAA,UACH,SAAA,EAAU,iBAAA;AAAA,UACV,OAAO,CAAA,CAAE,YAAA;AAAA,UACT,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,YAAA,EAAc,CAAA,CAAE,MAAA,CAAO,KAAA,EAAuB,CAAA;AAAA,UAEvE,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,SAAA,EAAU,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,4BAC/BA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,YAAW,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BACjCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,YAAW,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,4BACjCA,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAA,EAAM,YAAW,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA;AACnC,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,oBAGlCD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,UAAA,aAAA;AAAA,0BAElCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,oCAAA,EAAkC;AAAA,SAAA,EACpE,CAAA;AAAA,wBACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gBAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,SAAS,CAAA,CAAE,SAAA;AAAA,cACX,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WACxD;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe;AAAA,SAAA,EACjC;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,UAAA,kBAAA;AAAA,0BAElCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,kCAAA,EAAgC;AAAA,SAAA,EAClE,CAAA;AAAA,wBACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gBAAA,EACf,QAAA,EAAA;AAAA,0BAAAC,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,SAAS,CAAA,CAAE,mBAAA;AAAA,cACX,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,mBAAA,EAAqB,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WAClE;AAAA,0BACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe;AAAA,SAAA,EACjC;AAAA,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,oBAGlCA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBACb,QAAA,kBAAAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,QAAA,cAAA;AAAA,wBAElCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,gCAAA,EAA8B;AAAA,OAAA,EAChE,CAAA;AAAA,sBACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EAAsB,cAAW,cAAA,EAChD,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,UAAK,SAAA,EAAU,cAAA,EAAe,OAAO,EAAE,UAAA,EAAY,CAAA,CAAE,WAAA,EAAY,EAAG,CAAA;AAAA,wBACrEA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,OAAO,CAAA,CAAE,WAAA;AAAA,YACT,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO;AAAA;AAAA;AACxD,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,oBAIlCA,IAAC,UAAA,EAAA,EAAW;AAAA,GAAA,EACd,CAAA;AAEJ;AAIA,SAAS,UAAA,GAAa;AACpB,EAAA,MAAM,IAAI,WAAA,EAAY;AACtB,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AACzD,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAInD,EAAA,MAAM,UAAA,GAAyE;AAAA,IAC7E,QAAA,EAAU,EAAE,KAAA,EAAO,KAAA,EAAO,UAAU,QAAA,EAAS;AAAA,IAC7C,UAAA,EAAY,EAAE,KAAA,EAAO,kBAAA,EAAe,UAAU,eAAA,EAAgB;AAAA,IAC9D,SAAA,EAAW,EAAE,KAAA,EAAO,WAAA,EAAa,UAAU,cAAA,EAAe;AAAA,IAC1D,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,UAAU,UAAA;AAAW,GAChD;AACA,EAAA,MAAM,IAAA,GAAO,WAAW,MAAM,CAAA;AAE9B,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,wBAElCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAgB,QAAA,EAAA,uEAAA,EAEhC;AAAA,OAAA,EACF,CAAA;AAAA,sBACAD,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,gBAAA,EACf,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,SAAS,CAAA,CAAE,UAAA;AAAA,YACX,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,SACzD;AAAA,wBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAe;AAAA,OAAA,EACjC;AAAA,KAAA,EACF,CAAA;AAAA,oBAKAD,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAe,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,EAAE,EAClD,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAqB,KAAA,EAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,EAAA,EAAG,EAAG,QAAA,EAAA,UAAA,EAE/E,CAAA;AAAA,sBACAA,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,MAAA;AAAA,UACL,SAAA,EAAU,gBAAA;AAAA,UACV,OAAO,CAAA,CAAE,WAAA;AAAA,UACT,QAAA,EAAU,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,EAAE,WAAA,EAAa,CAAA,CAAE,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,UACtD,WAAA,EAAY,uBAAA;AAAA,UACZ,QAAA,EAAU,CAAC,CAAA,CAAE,UAAA;AAAA,UACb,UAAA,EAAY;AAAA;AAAA;AACd,KAAA,EACF,CAAA;AAAA,oBAKAD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAW,CAAA,oBAAA,EAAuB,IAAA,CAAK,QAAQ,CAAA,CAAA,EAClD,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,eAAW,IAAA,EAAC,CAAA;AAAA,sBACtCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,eAAK,KAAA,EAAM,CAAA;AAAA,MAC9C,WAAW,WAAA,oBACVD,IAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,mBAAA,EACb,QAAA,EAAA;AAAA,QAAA,aAAA,GAAgB,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,GAAK,EAAA;AAAA,QACtC,UAAA,GACG,gBAAa,cAAA,CAAe,IAAA,CAAK,KAAI,GAAI,UAAU,CAAC,CAAA,IAAA,CAAA,GACpD;AAAA,OAAA,EACN,CAAA;AAAA,MAED,MAAA,KAAW,WAAW,SAAA,mBACrBC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,SAAA,EAAU,CAAA,GAC9D;AAAA,KAAA,EACN,CAAA;AAAA,IAIC,MAAA,KAAW,eAAe,CAAA,CAAE,YAAA,mBAC3BD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,UAAK,SAAA,EAAU,kBAAA,EAAmB,OAAO,EAAE,OAAA,EAAS,GAAA,EAAI,EAAG,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,sBACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,YAAE,YAAA,EAAa,CAAA;AAAA,sBACjDA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,mBAAA;AAAA,UACV,SAAS,MAAM,CAAA,CAAE,IAAI,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,UAC3C,KAAA,EAAM,wCAAA;AAAA,UACP,QAAA,EAAA;AAAA;AAAA;AAED,KAAA,EACF,CAAA,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,eAAe,EAAA,EAAoB;AAC1C,EAAA,IAAI,EAAA,GAAK,MAAM,OAAO,UAAA;AACtB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AAC9B,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AACvB,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC3B,EAAA,IAAI,CAAA,GAAI,EAAA,EAAI,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,CAAA;AACvB,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAC,CAAA,CAAA,CAAA;AAC9B;;;AC1MA,IAAM,aAAA,GAAgB,CAAC,mBAAA,EAAqB,sBAAsB,CAAA;AAElE,IAAM,aAAA,GAAgB,aAAA,CACnB,OAAA,CAAQ,CAAC,MAAM,CAAC,CAAA,MAAA,EAAS,CAAC,CAAA,EAAA,CAAA,EAAM,SAAS,CAAC,CAAA,IAAA,CAAM,CAAC,CAAA,CACjD,KAAK,EAAE,CAAA;AAEV,IAAM,QAAA,GAAW,2BAAA;AACjB,IAAM,SAAA,GAAY,kBAAA;AAelB,SAAS,QAAA,GAAwB;AAE/B,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,IAAA;AAAA,IACX,cAAA,GAAiB,IAAI,EAAA,KAAkB,CAAA,CAAA;AAAA,IACvC,eAAA,GAAkB,IAAI,EAAA,KAAkB,CAAA,CAAA;AAAA,IACxC,OAAA,GAAU,CAAC,GAAA,KAA8B,CAAA,CAAA;AAAA,IACzC,kBAAkB,EAAC;AAAA,IACnB,oBAAoB,EAAC;AAAA,IACrB,gBAAgB;AAAC,GACnB;AACF;AAEA,SAAS,QAAA,GAAwB;AAC/B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,QAAA,EAAS;AACnD,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,IAAI,CAAC,CAAA,CAAE,SAAS,CAAA,EAAG;AACjB,IAAA,CAAA,CAAE,SAAS,CAAA,GAAI;AAAA,MACb,MAAA,EAAQ,KAAA;AAAA,MACR,SAAA,EAAW,KAAA;AAAA;AAAA,MAEX,cAAA,EAAgB,MAAA;AAAA,MAChB,eAAA,EAAiB,MAAA;AAAA,MACjB,OAAA,EAAS,MAAA;AAAA,MACT,kBAAkB,EAAC;AAAA,MACnB,oBAAoB,EAAC;AAAA,MACrB,gBAAgB;AAAC,KACnB;AAAA,EACF;AACA,EAAA,OAAO,EAAE,SAAS,CAAA;AACpB;AAEA,IAAM,KAAK,QAAA,EAAS;AAIpB,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,GAAG,SAAA,EAAW;AAClD,EAAA,EAAA,CAAG,cAAA,GAAiB,MAAA,CAAO,UAAA,CAAW,IAAA,CAAK,MAAM,CAAA;AACjD,EAAA,EAAA,CAAG,eAAA,GAAkB,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,MAAM,CAAA;AACnD,EAAA,EAAA,CAAG,OAAA,GAAU,MAAA,CAAO,qBAAA,CAAsB,IAAA,CAAK,MAAM,CAAA;AAGrD,EAAC,MAAA,CAA+D,UAAA,IAC7D,CAAC,OAAA,EAAuB,YAAqB,IAAA,KAAoB;AAChE,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAG/B,MAAA,OAAO,EAAA,CAAG,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,EAAA,CAAG,cAAA;AAAA,MACR,IAAI,CAAA,KAAiB;AACnB,QAAA,IAAI,GAAG,MAAA,EAAQ;AACb,UAAA,EAAA,CAAG,mBAAmB,IAAA,CAAK,MAAO,OAAA,CAAsC,GAAG,CAAC,CAAC,CAAA;AAAA,QAC/E,CAAA,MAAO;AACL,UAAC,OAAA,CAAsC,GAAG,CAAC,CAAA;AAAA,QAC7C;AAAA,MACF,CAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAG;AAAA,KACL;AAAA,EACF,CAAA,CAAA;AAIF,EAAC,MAAA,CAAiE,WAAA,IAC/D,CAAC,OAAA,EAAuB,YAAqB,IAAA,KAAoB;AAChE,IAAA,IAAI,OAAO,OAAA,KAAY,QAAA,SAAiB,EAAA,CAAG,eAAA,CAAgB,SAAS,OAAO,CAAA;AAC3E,IAAA,OAAO,EAAA,CAAG,eAAA;AAAA,MACR,IAAI,CAAA,KAAiB;AACnB,QAAA,IAAI,CAAC,EAAA,CAAG,MAAA,EAAS,OAAA,CAAsC,GAAG,CAAC,CAAA;AAAA,MAC7D,CAAA;AAAA,MACA,OAAA;AAAA,MACA,GAAG;AAAA,KACL;AAAA,EACF,CAAA,CAAA;AAKF,EAAC,OAAqF,qBAAA,IACnF,CAAC,aACA,EAAA,CAAG,OAAA,CAAQ,CAAC,SAAA,KAAsB;AAChC,IAAA,IAAI,GAAG,MAAA,EAAQ;AACb,MAAA,EAAA,CAAG,cAAA,CAAe,KAAK,QAAQ,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IACpB;AAAA,EACF,CAAC,CAAA,CAAA;AAEL,EAAA,EAAA,CAAG,SAAA,GAAY,IAAA;AACjB;AAIO,IAAM,qBAAqB,EAAA,CAAG,cAAA;AACF,EAAA,CAAG;AAC/B,IAAM,gCAAgC,EAAA,CAAG,OAAA;AAIhD,SAAS,iBAAiB,EAAA,EAA6B;AACrD,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,SAAS,OAAO,KAAA;AAC/B,EAAA,OAAO,aAAA,CAAc,IAAA,CAAK,CAAC,IAAA,KAAS,EAAA,CAAG,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA,KAAM,IAAI,CAAA;AACtE;AAMA,SAAS,OAAA,GAA2B;AAClC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,MAAM,CAAA,GAAI,MAAA;AACV,EAAA,OAAO,EAAE,IAAA,IAAQ,IAAA;AACnB;AAMO,SAAS,MAAA,GAAe;AAC7B,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,GAAG,MAAA,EAAQ;AACf,EAAA,EAAA,CAAG,MAAA,GAAS,IAAA;AACZ,EAAA,EAAA,CAAG,qBAAqB,EAAC;AACzB,EAAA,EAAA,CAAG,iBAAiB,EAAC;AAIrB,EAAA,IAAI,KAAA,GAAQ,QAAA,CAAS,cAAA,CAAe,QAAQ,CAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,KAAA,GAAQ,QAAA,CAAS,cAAc,OAAO,CAAA;AACtC,IAAA,KAAA,CAAM,EAAA,GAAK,QAAA;AACX,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,EACjC;AACA,EAAA,KAAA,CAAM,WAAA,GAAc;AAAA,KAAA,EACf,aAAa,CAAA;AAAA,KAAA,EACb,aAAa,CAAA;AAAA,KAAA,EACb,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AASlB,EAAA,EAAA,CAAG,mBAAmB,EAAC;AACvB,EAAA,IAAI;AACF,IAAA,QAAA,CAAS,aAAA,EAAc,CAAE,OAAA,CAAQ,CAAC,IAAA,KAAS;AACzC,MAAA,IAAI,IAAA,CAAK,cAAc,SAAA,EAAW;AAClC,MAAA,MAAM,MAAA,GAAU,KAAK,MAAA,EAAkC,MAAA;AACvD,MAAA,IAAI,CAAC,gBAAA,CAAiB,MAAM,CAAA,EAAG;AAC7B,QAAA,IAAA,CAAK,KAAA,EAAM;AACX,QAAA,EAAA,CAAG,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAAA,MAC/B;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AAKA,EAAA,OAAA,EAAQ,EAAG,gBAAgB,KAAA,EAAM;AAGjC,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AACpD,IAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,MAAA,KAAA,CAAM,QAAQ,gBAAA,GAAmB,OAAA;AACjC,MAAA,KAAA,CAAM,KAAA,EAAM;AAAA,IACd;AAAA,EACF,CAAC,CAAA;AACH;AAEO,SAAS,QAAA,GAAiB;AAC/B,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,CAAC,GAAG,MAAA,EAAQ;AAChB,EAAA,EAAA,CAAG,MAAA,GAAS,KAAA;AAMZ,EAAA,MAAM,eAAe,EAAA,CAAG,kBAAA;AACxB,EAAA,EAAA,CAAG,qBAAqB,EAAC;AACzB,EAAA,KAAA,MAAW,MAAM,YAAA,EAAc;AAC7B,IAAA,EAAA,CAAG,eAAe,MAAM;AACtB,MAAA,IAAI,GAAG,MAAA,EAAQ;AACb,QAAA,EAAA,CAAG,kBAAA,CAAmB,KAAK,EAAE,CAAA;AAC7B,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AAAE,QAAA,EAAA,EAAG;AAAA,MAAG,SAAS,CAAA,EAAG;AAEtB,QAAA,OAAA,CAAQ,IAAA,CAAK,6CAA6C,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF,GAAG,CAAC,CAAA;AAAA,EACN;AAGA,EAAA,MAAM,WAAW,EAAA,CAAG,cAAA;AACpB,EAAA,EAAA,CAAG,iBAAiB,EAAC;AACrB,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,EAAA,CAAG,OAAA,CAAQ,CAAC,EAAA,KAAe;AACzB,MAAA,IAAI,GAAG,MAAA,EAAQ;AACb,QAAA,EAAA,CAAG,cAAA,CAAe,KAAK,EAAE,CAAA;AACzB,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AAAE,QAAA,EAAA,CAAG,EAAE,CAAA;AAAA,MAAG,SAAS,CAAA,EAAG;AAExB,QAAA,OAAA,CAAQ,IAAA,CAAK,yCAAyC,CAAC,CAAA;AAAA,MACzD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAIA,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAG,gBAAA,EAAkB;AACtC,IAAA,IAAI;AAAE,MAAA,IAAA,CAAK,IAAA,EAAK;AAAA,IAAG,SAAS,CAAA,EAAG;AAE7B,MAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,CAAC,CAAA;AAAA,IACvD;AAAA,EACF;AACA,EAAA,EAAA,CAAG,mBAAmB,EAAC;AAGvB,EAAA,OAAA,EAAQ,EAAG,gBAAgB,MAAA,EAAO;AAGlC,EAAA,QAAA,CAAS,cAAA,CAAe,QAAQ,CAAA,EAAG,MAAA,EAAO;AAG1C,EAAA,QAAA,CAAS,gBAAA,CAAiB,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,KAAA,KAAU;AACpD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,gBAAA,KAAqB,OAAA,EAAS;AAC9C,MAAA,KAAK,KAAA,CAAM,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAChC,MAAA,OAAO,MAAM,OAAA,CAAQ,gBAAA;AAAA,IACvB;AAAA,EACF,CAAC,CAAA;AACH;;;AClQA,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,eAAA,GAAkB,IAAA;AACxB,IAAM,YAAA,GAAe,IAAA;AAUrB,eAAsB,wBACpB,MAAA,EACA,OAAA,GAA8B,EAAC,EAC/B,IAAA,GAA8C,EAAC,EACvB;AACxB,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,eAAA;AAChC,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,IAAU,eAAA;AAE9B,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,OAAO,CAAA;AACzC,EAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,IAAI,OAAO,CAAA;AACzC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,KAAA,GAAQ,OAAA,GAAU,CAAA;AACpC,EAAA,MAAM,EAAA,GAAK,MAAA,CAAO,MAAA,GAAS,OAAA,GAAU,CAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAC,CAAA;AACnD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAK,CAAA;AAClC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,KAAK,CAAA;AAClC,EAAA,IAAI,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG,OAAO,IAAA;AAEjC,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,qBAAqB,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,UAAA;AAC5B,EAAA,IAAI,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,QAAA;AAElC,EAAA,IAAI;AACF,IAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,IAAA,IAAI;AAKF,MAAA,MAAM,MAAO,MAAM;AAAA;AAAA,QAA0B;AAAA,OAAmB;AAGhE,MAAA,WAAA,GAAc,MAAM,GAAA,CAAI,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM;AAAA,QAC/C,OAAA,EAAS,YAAA;AAAA,QACT,eAAA,EAAiB;AAAA,OAClB,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AAEV,MAAA,OAAA,CAAQ,IAAA,CAAK,4EAA4E,CAAC,CAAA;AAAA,IAC5F;AAEA,IAAA,OAAO,MAAM,cAAA,CAAe;AAAA,MAC1B,WAAA;AAAA,MACA,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI,EAAA;AAAA,MAAI,IAAA;AAAA,MAAM,IAAA;AAAA,MAAM,KAAA;AAAA,MAAO;AAAA,KACpC,CAAA;AAAA,EACH,CAAA,SAAE;AACA,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,OAAA,IAAW,EAAA;AAAA,EAC/C;AACF;AAEA,eAAe,eAAe,IAAA,EAUH;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,OAAA,EAAQ,GAAI,IAAA;AACpE,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAChB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAIjB,EAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,EAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,IAAI,CAAA;AAE7B,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,WAAW,CAAA;AAGvC,MAAA,GAAA,CAAI,IAAA,EAAK;AAGT,MAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,qBAAA,EAAsB;AACrD,MAAA,MAAM,UAAU,GAAA,CAAI,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,KAAK,CAAA;AACtD,MAAA,MAAM,UAAU,GAAA,CAAI,MAAA,GAAS,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,MAAM,CAAA;AACxD,MAAA,GAAA,CAAI,SAAA;AAAA,QACF,GAAA;AAAA,QACA,EAAA,GAAK,OAAA;AAAA,QAAS,EAAA,GAAK,OAAA;AAAA,QAAS,EAAA,GAAK,OAAA;AAAA,QAAS,EAAA,GAAK,OAAA;AAAA,QAC/C,CAAA;AAAA,QAAG,CAAA;AAAA,QAAG,IAAA;AAAA,QAAM;AAAA,OACd;AACA,MAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,IACd,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAIA,EAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,EAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAChC,IAAA,GAAA,CAAI,cAAc,MAAA,CAAO,KAAA;AACzB,IAAA,GAAA,CAAI,SAAA,GAAY,OAAO,SAAA,GAAY,KAAA;AACnC,IAAA,GAAA,CAAI,SAAA,EAAU;AACd,IAAA,GAAA,CAAI,MAAA,CAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,EAAG,CAAA,GAAI,EAAA,IAAM,KAAA,EAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,GAAI,MAAM,KAAK,CAAA;AACjF,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,GAAA,CAAI,MAAA,CAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,EAAG,CAAA,GAAI,EAAA,IAAM,KAAA,EAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,GAAI,MAAM,KAAK,CAAA;AAAA,IACnF;AACA,IAAA,GAAA,CAAI,MAAA,EAAO;AAAA,EACb;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,SAAA,CAAU,YAAA,EAAc,YAAY,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,UAAU,GAAA,EAAwC;AACzD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,GAAA,CAAI,OAAA,GAAU,MAAA;AACd,IAAA,GAAA,CAAI,GAAA,GAAM,GAAA;AAAA,EACZ,CAAC,CAAA;AACH;;;ACxJA,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,mBAAA,GAAsB,SAAA;AAC5B,IAAM,aAAA,GAAgB,qBAAA;AACtB,IAAM,UAAA,GAAa,mEAAA;AASnB,eAAsB,+BACpB,OAAA,EACwB;AACxB,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAGjC,EAAA,MAAM,SAAwE,EAAC;AAC/E,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAK,KAAA,CAAM,gBAAA;AAAA,QACX,GAAA,EAAK,MAAMC,UAAAA,CAAU,KAAA,CAAM,OAAO,CAAA;AAAA,QAClC,OAAO,KAAA,CAAM;AAAA,OACd,CAAA;AAAA,IACH,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,GAAA,CAAI,KAAK,CAAC,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,WAAW,eAAA,GAAkB,CAAA;AAC3C,EAAA,IAAI,MAAA,GAAS,eAAA;AACb,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAA,IAAU,UAAA,GAAa,CAAA,GAAI,MAAA,CAAO,CAAC,EAAG,GAAA,CAAI,MAAA;AAC1C,IAAA,IAAI,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,MAAA,IAAU,WAAA;AAAA,EACvC;AACA,EAAA,MAAA,IAAU,eAAA;AAEV,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AACf,EAAA,MAAA,CAAO,MAAA,GAAS,MAAA;AAChB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,EAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAEhC,EAAA,IAAI,CAAA,GAAI,eAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,KAAA,EAAM,GAAI,OAAO,CAAC,CAAA;AACpC,IAAA,IAAI,IAAI,CAAA,EAAG;AACT,MAAA,GAAA,CAAI,SAAA,GAAY,aAAA;AAChB,MAAA,GAAA,CAAI,SAAS,eAAA,EAAiB,CAAA,GAAI,WAAA,GAAc,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,IAChE;AACA,IAAA,SAAA,CAAU,GAAA,EAAK,eAAA,EAAiB,CAAA,EAAG,GAAA,EAAK,KAAK,CAAA;AAC7C,IAAA,CAAA,IAAK,UAAA,GAAa,CAAA;AAGlB,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,GAAA,CAAI,WAAA,GAAc,qBAAA;AAClB,IAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,UAAA,EAAY;AACvC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,SAAA,CAAU,eAAA,GAAkB,GAAA,EAAK,CAAA,GAAI,GAAA,EAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,CAAC,CAAA;AAC9E,MAAA,GAAA,CAAI,MAAA,EAAO;AAAA,IACb,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,UAAA,CAAW,eAAA,GAAkB,GAAA,EAAK,CAAA,GAAI,GAAA,EAAK,IAAI,KAAA,GAAQ,CAAA,EAAG,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAAA,IAC9E;AACA,IAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,IAAA,GAAA,CAAI,IAAA,EAAK;AACT,IAAA,IAAI,OAAO,GAAA,CAAI,SAAA,KAAc,UAAA,EAAY;AACvC,MAAA,GAAA,CAAI,SAAA,EAAU;AACd,MAAA,GAAA,CAAI,UAAU,eAAA,EAAiB,CAAA,EAAG,IAAI,KAAA,EAAO,GAAA,CAAI,QAAQ,CAAC,CAAA;AAC1D,MAAA,GAAA,CAAI,IAAA,EAAK;AAAA,IACX;AACA,IAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,eAAA,EAAiB,CAAC,CAAA;AACrC,IAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,IAAA,CAAA,IAAK,IAAI,MAAA,GAAS,WAAA;AAAA,EACpB;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,SAAA,CACP,GAAA,EACA,CAAA,EACA,CAAA,EACA,KACA,KAAA,EACM;AACN,EAAA,MAAM,EAAA,GAAK,IAAI,UAAA,GAAa,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,IAAI,UAAA,GAAa,CAAA;AAC5B,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,WAAA,GAAc,qBAAA;AAClB,EAAA,GAAA,CAAI,UAAA,GAAa,CAAA;AACjB,EAAA,GAAA,CAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,GAAA,CAAI,YAAY,KAAA,IAAS,mBAAA;AACzB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,IAAI,EAAA,EAAI,EAAA,EAAI,cAAc,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AAC5C,EAAA,GAAA,CAAI,IAAA,EAAK;AACT,EAAA,GAAA,CAAI,OAAA,EAAQ;AAEZ,EAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,EAAA,GAAA,CAAI,IAAA,GAAO,YAAY,UAAU,CAAA,CAAA;AACjC,EAAA,GAAA,CAAI,SAAA,GAAY,QAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,QAAA;AACnB,EAAA,GAAA,CAAI,SAAS,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,EAAA,EAAI,KAAK,CAAC,CAAA;AAEjC,EAAA,GAAA,CAAI,SAAA,GAAY,OAAA;AAChB,EAAA,GAAA,CAAI,YAAA,GAAe,YAAA;AACrB;AAEA,SAASA,WAAU,OAAA,EAA4C;AAC7D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,IAAA,GAAA,CAAI,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,GAAA,CAAI,OAAA,GAAU,MAAA;AACd,IAAA,GAAA,CAAI,GAAA,GAAM,OAAA;AAAA,EACZ,CAAC,CAAA;AACH;;;ACrIA,eAAsB,qBAAqB,OAAA,EAAmC;AAC5E,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,SAAA,CAAU,SAAA,EAAW,OAAO,OAAO,KAAA;AAC5E,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,eAAe,OAAO,KAAA;AAEnE,EAAA,IAAI;AAEF,IAAA,MAAM,aAAa,MAAA,CAAO,MAAM,KAAA,CAAM,OAAO,GAAG,IAAA,EAAK;AACrD,IAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,UAAU,CAAA;AAGjD,IAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,IAAA,MAAM,SAAA,CAAU,UAAU,KAAA,CAAM;AAAA,MAC9B,IAAI,aAAA,CAAc,EAAE,WAAA,EAAa,SAAS;AAAA,KAC3C,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,CAAA,EAAG;AAKV,IAAA,OAAA,CAAQ,IAAA,CAAK,6CAA6C,CAAC,CAAA;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAe,YAAY,MAAA,EAA2C;AAEpE,EAAA,IAAI,OAAO,oBAAoB,WAAA,EAAa;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,IAAI,eAAA,CAAgB,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAC1D,MAAA,MAAM,GAAA,GAAM,EAAA,CAAG,UAAA,CAAW,IAAI,CAAA;AAC9B,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,MAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAC1B,MAAA,OAAO,MAAM,EAAA,CAAG,aAAA,CAAc,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AACzC,IAAA,CAAA,CAAE,QAAQ,MAAA,CAAO,KAAA;AACjB,IAAA,CAAA,CAAE,SAAS,MAAA,CAAO,MAAA;AAClB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA;AAC7B,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,OAAA,CAAQ,IAAI,CAAA;AAC7B,IAAA,GAAA,CAAI,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAC1B,IAAA,CAAA,CAAE,OAAO,CAAC,IAAA,KAAS,OAAA,CAAQ,IAAI,GAAG,WAAW,CAAA;AAAA,EAC/C,CAAC,CAAA;AACH;;;AC/BO,SAAS,2BAAA,GAAuC;AACrD,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,qBAAA,IAAyB,MAAA;AACnE;AAIA,IAAI,aAAA,GAAkD,IAAA;AAkCtD,eAAe,gBAAA,GAA8D;AAC3E,EAAA,MAAM,SAAA,GAAY,aAAA,IAAkB,MAAM,aAAA,EAAc;AACxD,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AACvB,EAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,SAAS,CAAA;AAC5C,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,aAAA,GAAgB,SAAA;AAChB,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,gBAAgB,MAAA,EAAwE;AAErG,EAAA,MAAM,CAAA,GAAI,MAAA;AAIV,EAAA,IAAI;AACF,IAAA,IAAI,EAAE,eAAA,EAAiB;AACrB,MAAA,MAAM,IAAI,MAAM,CAAA,CAAE,gBAAgB,EAAE,IAAA,EAAM,aAAa,CAAA;AACvD,MAAA,IAAI,CAAA,KAAM,WAAW,OAAO,SAAA;AAAA,IAC9B;AACA,IAAA,IAAI,EAAE,iBAAA,EAAmB;AACvB,MAAA,MAAM,IAAI,MAAM,CAAA,CAAE,kBAAkB,EAAE,IAAA,EAAM,aAAa,CAAA;AACzD,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,QAAA;AACT;AAIA,eAAsB,WAAA,CACpB,SACA,QAAA,EACqB;AAErB,EAAA,IAAI,6BAA4B,EAAG;AACjC,IAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,EAAiB;AACtC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAMC,GAAAA,GAAK,MAAM,gBAAA,CAAiB,MAAA,EAAQ,SAAS,QAAQ,CAAA;AAC3D,MAAA,IAAIA,GAAAA,EAAI;AACN,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,YAAA,EAAc,IAAA,EAAK;AAAA,MAC/E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,OAAA,EAAS,QAAQ,CAAA;AAC9C,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAA;AAAA,IACP,IAAA,EAAM,EAAA,GAAK,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAA,GAAK,IAAA;AAAA,IACvC,YAAA,EAAc;AAAA,GAChB;AACF;AAEA,eAAe,gBAAA,CACb,GAAA,EACA,OAAA,EACA,QAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,MAAM,GAAA,CAAI,aAAA,CAAc,UAAU,EAAE,MAAA,EAAQ,MAAM,CAAA;AAGrE,IAAA,MAAM,QAAA,GAAW,MAAO,UAAA,CAErB,cAAA,EAAe;AAClB,IAAA,MAAM,OAAO,MAAA,CAAO,MAAM,KAAA,CAAM,OAAO,GAAG,IAAA,EAAK;AAC/C,IAAA,MAAM,QAAA,CAAS,MAAM,IAAI,CAAA;AACzB,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,CAAA,EAAG;AAEV,IAAA,OAAA,CAAQ,IAAA,CAAK,+BAA+B,CAAC,CAAA;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAA,CAAkB,SAAiB,QAAA,EAA2B;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,OAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,QAAA;AACb,IAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAGlB,IAAA,CAAA,CAAE,YAAA,CAAa,wBAAwB,EAAE,CAAA;AACzC,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AClJO,SAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,SAAQ,EAAU;AAChE,EAAA,MAAM,QAAQ,kBAAA,EAAmB;AACjC,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC7C,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACtD,EAAA,MAAM,GAAA,GAAML,OAAuB,IAAI,CAAA;AAEvC,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,IAAI,GAAA,CAAI,WAAW,CAAA,CAAE,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG;AAC3D,MAAA,OAAA,EAAQ;AAAA,IACV,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,QAAQ,IAAI,CAAA;AAAA,EACrE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,MAAA,CAAO,cAAc,IAAA,EAAM,KAAA,CAAM,MAAA,GAAS,EAAA,GAAK,EAAE,CAAA;AAClF,EAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,CAAA,GAAI,kBAAkB,EAAE,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,UAAA,GAAa,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAEpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIK,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAO7C,EAAA,MAAM,kBAAkB,YAAY;AAClC,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,UAA4B,KAAA,CAC/B,GAAA;AAAA,QAAI,CAAC,CAAA,EAAG,CAAA,KACP,CAAA,CAAE,UAAA,GACE,EAAE,gBAAA,EAAkB,CAAA,GAAI,CAAA,EAAG,OAAA,EAAS,CAAA,CAAE,UAAA,CAAW,SAAQ,GACzD;AAAA,OACN,CACC,MAAA,CAAO,CAAC,CAAA,KAA2B,MAAM,IAAI,CAAA;AAChD,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAGxB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,MAAM,8BAAA,CAA+B,OAAO,CAAA;AAC9D,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,MAAM,KAAA,GAAA,qBAAY,IAAA,EAAK,EAAE,aAAY,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA;AAG3D,MAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,QAChB,qBAAqB,SAAS,CAAA;AAAA,QAC9B,WAAA,CAAY,SAAA,EAAW,CAAA,oBAAA,EAAuB,KAAK,CAAA,IAAA,CAAM;AAAA,OAC1D,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAU,gBAAe,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,EAAI,EACzD,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,sBACxCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAc,gBAAM,MAAA,EAAO,CAAA;AAAA,MAC1C,KAAA,CAAM,MAAA,GAAS,CAAA,oBACdA,GAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,iBAAA;AAAA,UACV,OAAA,EAAS,eAAA;AAAA,UACT,KAAA,EAAM,kDAAA;AAAA,UACN,QAAA,EAAU,SAAA;AAAA,UACV,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO;AAAA,UAE5B,QAAA,kBAAAA,IAAC,YAAA,EAAA,EAAa;AAAA;AAAA;AAChB,KAAA,EAEJ,CAAA;AAAA,IAEC,KAAA,CAAM,WAAW,CAAA,mBAChBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAa,QAAA,EAAA,qBAAA,EAAmB,CAAA,mBAE/CA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACZ,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,CAAA,EAAG,sBACbA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QAEC,UAAA,EAAY,CAAA;AAAA,QACZ,OAAO,CAAA,GAAI,CAAA;AAAA,QACX,YAAA;AAAA,QACA,QAAA,EAAU,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,QAC3B,UAAA,EAAY,CAAC,IAAA,KACX,MAAA,CAAO,EAAE,EAAA,EAAI;AAAA,UACX,UAAA,EAAY,EAAE,QAAA,EAAU,YAAA,EAAc,SAAS,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAE,SAC1E;AAAA,OAAA;AAAA,MARE,CAAA,CAAE;AAAA,KAWV,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAIA,SAAS,cAAA,CAAe;AAAA,EACtB,UAAA,EAAY,CAAA;AAAA,EACZ,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIG,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,CAAA,EAAG,KAAA,EAAO,YAAmB,CAAA;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,EAAE,CAAA;AACtC,MAAA,SAAA,CAAU,IAAI,CAAA;AAGd,MAAA,kBAAA,CAAmB,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,IAAI,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AAAA,IAAe;AAAA,EACzB,CAAA;AAMA,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,CAAA,CAAE,WAAA;AACd,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,OAAO,MAAM,uBAAA,CAAwB,KAAK,CAAA,CAAE,OAAA,IAAW,EAAE,CAAA;AAC/D,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,MAAM,KAAA,GAAA,qBAAY,IAAA,EAAK,EAAE,aAAY,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC3D,MAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,QAChB,qBAAqB,IAAI,CAAA;AAAA,QACzB,YAAY,IAAA,EAAM,CAAA,QAAA,EAAW,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,IAAA,CAAM;AAAA,OAClD,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEJ,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAgB,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE;AAAA,OAAA,EAAM,CAAA;AAAA,sBACxCC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,YAAE,WAAA,EAAY,CAAA;AAAA,sBAChDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,iBAAA;AAAA,YACV,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAM,uCAAA;AAAA,YACN,QAAA,EAAU,SAAA;AAAA,YAEV,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA,SACd;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,eAAA,EAAkB,MAAA,GAAS,SAAA,GAAY,EAAE,CAAA,CAAA;AAAA,YACpD,OAAA,EAAS,OAAA;AAAA,YACT,KAAA,EAAO,CAAA,iBAAA,EAAoB,KAAK,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA,CAAA;AAAA,YAEhD,QAAA,EAAA,MAAA,mBACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EACvI,QAAA,kBAAAA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAgB,CAAA,EACnC,CAAA,mBAEAA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA,SAEd;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,oCAAA;AAAA,YACV,OAAA,EAAS,QAAA;AAAA,YACT,KAAA,EAAM,mBAAA;AAAA,YAEN,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA;AACb,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBAGAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAA,EAAqB,YAAE,OAAA,EAAQ,CAAA;AAAA,IAG3C,EAAE,YAAA,oBACDD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,sBACjDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAsB,YAAE,YAAA,EAAa;AAAA,KAAA,EACtD;AAAA,GAAA,EAEJ,CAAA;AAEJ;AClLA,IAAM,YAAA,GAAe,EAAE,KAAA,EAAO,GAAA,EAAK,QAAQ,EAAA,EAAG;AAE9C,IAAM,SAAA,GAAY;AAAA,EAChB,EAAE,MAAM,CAAC,QAAA,EAAK,UAAK,GAAG,CAAA,EAAG,OAAO,gBAAA,EAAiB;AAAA,EACjD,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,OAAO,oBAAA,EAAqB;AAAA,EAC3C,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,OAAO,mBAAA,EAAoB;AAAA,EAC1C,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,OAAO,gBAAA,EAAiB;AAAA,EACvC,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,OAAO,eAAA,EAAgB;AAAA,EACtC,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,OAAO,mCAAA,EAAoC;AAAA,EAC1D,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,OAAO,8BAAA,EAA+B;AAAA,EACrD,EAAE,IAAA,EAAM,CAAC,QAAG,CAAA,EAAG,OAAO,0BAAA,EAA2B;AAAA,EACjD,EAAE,IAAA,EAAM,CAAC,KAAK,CAAA,EAAG,OAAO,wBAAA,EAAyB;AAAA,EACjD,EAAE,IAAA,EAAM,CAAC,UAAK,QAAG,CAAA,EAAG,OAAO,mBAAA,EAAoB;AAAA,EAC/C,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,OAAO,sBAAA,EAAuB;AAAA,EAC7C,EAAE,IAAA,EAAM,CAAC,GAAG,CAAA,EAAG,OAAO,uBAAA;AACxB,CAAA;AAGA,SAAS,cAAA,GAAiB;AACxB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,SAAS,KAAK,CAAA;AAC5C,EAAA,uBACEJ,IAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,+BAAA;AAAA,MACV,YAAA,EAAc,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,MACnC,YAAA,EAAc,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,MAEpC,QAAA,EAAA;AAAA,wBAAAC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,uBAAA;AAAA,YACV,YAAA,EAAW,yBAAA;AAAA,YAEX,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA,SACZ;AAAA,QACC,2BACCD,IAAAA,CAAC,SAAI,SAAA,EAAU,iBAAA,EAAkB,MAAK,SAAA,EACpC,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,UAClD,SAAA,CAAU,IAAI,CAAC,CAAA,qBACdD,IAAAA,CAAC,KAAA,EAAA,EAAkB,WAAU,eAAA,EAC3B,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,YAAE,KAAA,EAAM,CAAA;AAAA,4BAC3CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EACb,YAAE,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,qBAAMA,GAAAA,CAAC,KAAA,EAAA,EAAa,QAAA,EAAA,CAAA,EAAA,EAAJ,CAAM,CAAM,CAAA,EAC3C;AAAA,WAAA,EAAA,EAJQ,CAAA,CAAE,KAKZ,CACD;AAAA,SAAA,EACH;AAAA;AAAA;AAAA,GAEJ;AAEJ;AAYA,SAAS,GAAA,CAAI;AAAA,EACX,KAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAIG;AACD,EAAA,uBACED,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,oBACDA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAa,eAAY,MAAA,EACtC,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MACA,QAAA,oBAAYC,GAAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAA,QAAA,EAAS;AAAA,KAAA,EAC9B;AAAA,GAAA,EACF,CAAA;AAEJ;AAEO,SAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,UAAA,EAAY,WAAW,UAAA,EAAY,MAAA,EAAQ,gBAAe,EAAU;AACpG,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,EAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,aAAa,KAAK,CAAA;AACxC,EAAA,MAAM,cAAc,MAAM;AAIxB,IAAA,WAAA,CAAY,EAAE,KAAA,EAAO,aAAA,KAAkB,MAAA,GAAS,OAAA,GAAU,QAAQ,CAAA;AAAA,EACpE,CAAA;AAEA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIG,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAYN,OAAuB,IAAI,CAAA;AAE7C,EAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAY,GAAI,YAAA;AAAA,IAChC;AAAA,MACE,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,UAAA,GAAa,YAAA,CAAa,QAAQ,EAAE,CAAA;AAAA,MAC1D,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,WAAA,GAAc,YAAA,CAAa,SAAS,EAAE;AAAA,KAC9D;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,KAAS,MAAA;AAChC,EAAA,MAAM,WAAA,GACJ,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,UAAA,GACnE,KAAA,CAAM,IAAA,GACN,IAAA;AAKN,EAAA,MAAM,YAAA,GACJ,MAAM,IAAA,KAAS,YAAA,IACf,MAAM,IAAA,KAAS,eAAA,IACf,MAAM,IAAA,KAAS,mBAAA;AACjB,EAAA,MAAM,WAAA,GACJ,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,KAAA,CAAM,IAAA,KAAS,UAAA,GACnE,KAAA,CAAM,MAAA,CAAO,MAAA,GACb,CAAA;AAEN,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAqB;AACpC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AAAA,SAC3B,MAAA,CAAO,QAAQ,CAAC,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,SAAS,YAAY;AACzB,IAAA,MAAM,EAAA,GAAK,qBAAA,CAAsB,WAAA,EAAa,YAAY,CAAA;AAC1D,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,EAAE,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAOEE,KAAA,QAAA,EAAA,EACA,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,SAAA;AAAA,UACL,SAAA,EAAW,CAAA,eAAA,EAAkB,SAAA,GAAY,aAAA,GAAgB,EAAE,CAAA,CAAA;AAAA,UAC3D,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,CAAS,CAAA,EAAG,KAAK,QAAA,CAAS,CAAA,EAAG,KAAA,EAAO,YAAA,CAAa,KAAA,EAAM;AAAA,UACtE,cAAA,EAAgB,YAAY,UAAA,GAAa,MAAA;AAAA,UACzC,YAAA,EAAW,iBAAA;AAAA,UACX,sBAAA,EAAqB,EAAA;AAAA,UAGrB,QAAA,EAAA;AAAA,4BAAAC,GAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EACT,QAAA,kBAAAA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,MAAA;AAAA,gBACT,GAAG,WAAA;AAAA,gBACJ,IAAA,EAAK,WAAA;AAAA,gBACL,kBAAA,EAAiB,UAAA;AAAA,gBAEjB,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA,aACZ,EACF,CAAA;AAAA,4BAGAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,QAAA,EAAS,QAAA,EAAS,KAC3B,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,WAAA,KAAgB,QAAA,GAAW,eAAe,EAAE,CAAA,CAAA;AAAA,gBAC/E,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,gBAC/B,YAAA,EAAW,+BAAA;AAAA,gBACX,gBAAc,WAAA,KAAgB,QAAA;AAAA,gBAE9B,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA,aACd,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,cAAA,EAAe,QAAA,EAAS,KACjC,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,WAAA,KAAgB,OAAA,GAAU,eAAe,EAAE,CAAA,CAAA;AAAA,gBAC9E,OAAA,EAAS,MAAM,OAAA,CAAQ,OAAO,CAAA;AAAA,gBAC9B,YAAA,EAAW,8BAAA;AAAA,gBACX,gBAAc,WAAA,KAAgB,OAAA;AAAA,gBAE9B,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA,aACd,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,MAAA,EAAO,QAAA,EAAS,KACzB,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,WAAA,KAAgB,MAAA,GAAS,eAAe,EAAE,CAAA,CAAA;AAAA,gBAC7E,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAM,CAAA;AAAA,gBAC7B,YAAA,EAAW,oBAAA;AAAA,gBACX,gBAAc,WAAA,KAAgB,MAAA;AAAA,gBAE9B,QAAA,kBAAAA,IAAC,OAAA,EAAA,EAAQ;AAAA;AAAA,aACX,EACF,CAAA;AAAA,4BACAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,QAAA,EAAS,QAAA,EAAS,KAC3B,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,YAAA,GAAe,YAAA,GAAe,EAAE,CAAA,CAAA;AAAA,gBACnE,OAAA,EAAS,MAAM,OAAA,CAAQ,YAAA,GAAe,WAAW,QAAQ,CAAA;AAAA,gBACzD,YAAA,EAAW,wCAAA;AAAA,gBACX,cAAA,EAAc,YAAA;AAAA,gBAEd,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA,aACd,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,YAGxB,WAAA,GAAc,CAAA,oBACbD,IAAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAAC,GAAAA,CAAC,OAAI,KAAA,EAAO,CAAA,SAAA,EAAY,WAAW,CAAA,WAAA,CAAA,EAAe,QAAA,EAAS,UACzD,QAAA,kBAAAD,IAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,4BAAA;AAAA,kBACV,OAAA,EAAS,MAAM,MAAA,CAAO,cAAA,EAAe;AAAA,kBAErC,QAAA,EAAA;AAAA,oCAAAC,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,oCACXA,GAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA;AAAA,eACrB,EACF,CAAA;AAAA,8BACAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,iBAAA,EAAkB,QAAA,EAAS,OACpC,QAAA,kBAAAA,GAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,uBAAA;AAAA,kBACV,OAAA,EAAS,MAAM,MAAA,CAAO,WAAA,EAAY;AAAA,kBAElC,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA,eACb,EACF,CAAA;AAAA,8BACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU;AAAA,aAAA,EAC3B,CAAA;AAAA,4BAIFA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAO,MAAA,GAAS,qBAAA,GAAwB,qBAC3C,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,MAAA,GAAS,YAAA,GAAe,EAAE,CAAA,CAAA;AAAA,gBAC7D,OAAA,EAAS,cAAA;AAAA,gBACT,YAAA,EAAY,SAAS,0BAAA,GAA6B,wBAAA;AAAA,gBAClD,cAAA,EAAc,MAAA;AAAA,gBAEd,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA,aACd,EACF,CAAA;AAAA,4BAGAA,GAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAM,eACT,QAAA,kBAAAD,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uBAAA;AAAA,gBACV,SAAS,MAAM,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,gBACpC,YAAA,EAAW,sBAAA;AAAA,gBAEX,QAAA,EAAA;AAAA,kCAAAC,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,kBACT,WAAA,CAAY,SAAS,CAAA,oBACpBA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,WAAA,CAAY,MAAA,EAAO;AAAA;AAAA;AAAA,aAE1D,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,eAAA,EAAgB,QAAA,EAAS,KAClC,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uBAAA;AAAA,gBACV,OAAA,EAAS,MAAA;AAAA,gBACT,YAAA,EAAW,kCAAA;AAAA,gBACX,QAAA,EAAU,YAAY,MAAA,KAAW,CAAA;AAAA,gBAEjC,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA,aACZ,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,WAAA,EAAY,QAAA,EAAS,KAC9B,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uBAAA;AAAA,gBACV,OAAA,EAAS,MAAM,gBAAA,EAAiB;AAAA,gBAChC,YAAA,EAAW,uBAAA;AAAA,gBACX,QAAA,EAAU,YAAY,MAAA,KAAW,CAAA;AAAA,gBAEjC,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA,aACb,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,4BAEzBA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,4BAEhBA,IAAC,GAAA,EAAA,EAAI,KAAA,EAAO,kBAAkB,MAAA,GAAS,YAAA,GAAe,aACpD,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uBAAA;AAAA,gBACV,OAAA,EAAS,WAAA;AAAA,gBACT,YAAA,EACE,aAAA,KAAkB,MAAA,GAAS,sBAAA,GAAyB,qBAAA;AAAA,gBAMrD,QAAA,EAAA,aAAA,KAAkB,yBAASA,GAAAA,CAAC,WAAQ,CAAA,mBAAKA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA,aACtD,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,GAAA,EAAA,EAAI,KAAA,EAAM,YACT,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA,qBAAA,EAAwB,YAAA,GAAe,YAAA,GAAe,EAAE,CAAA,CAAA;AAAA,gBACnE,SAAS,MAAM,eAAA,CAAgB,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,gBACxC,YAAA,EAAW,eAAA;AAAA,gBACX,eAAA,EAAe,YAAA;AAAA,gBAEf,QAAA,kBAAAA,IAAC,YAAA,EAAA,EAAa;AAAA;AAAA,aAChB,EACF,CAAA;AAAA,4BAEAA,GAAAA,CAAC,GAAA,EAAA,EAAI,OAAM,OAAA,EAAQ,QAAA,EAAS,OAC1B,QAAA,kBAAAA,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,uBAAA;AAAA,gBACV,OAAA,EAAS,UAAA;AAAA,gBACT,YAAA,EAAW,0BAAA;AAAA,gBAEX,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA,aACb,EACF;AAAA;AAAA;AAAA,OAEF;AAAA,MAIC,gCACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,sBAAA,EAAqB,IACxB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,QAAQ,EAAE,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,UACvC,OAAO,YAAA,CAAa,KAAA;AAAA,UACpB,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK;AAAA;AAAA,OACtC,EACF,CAAA;AAAA,MAGD,4BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,sBAAA,EAAqB,IACxB,QAAA,kBAAAA,GAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,QAAQ,EAAE,CAAA,EAAG,SAAS,CAAA,EAAG,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,UACvC,OAAO,YAAA,CAAa,KAAA;AAAA,UACpB,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK;AAAA;AAAA,OAClC,EACF;AAAA,KAAA,EAEF;AAAA;AAEJ;ACzXO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAU;AAChD,EAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,EAAA,uBACED,IAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,aAAA;AAAA,MACV,OAAA,EAAS,QAAA;AAAA,MACT,KAAA,EAAM,oCAAA;AAAA,MACN,YAAA,EAAW,sBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAC,IAAC,UAAA,EAAA,EAAW,CAAA;AAAA,QACX,WAAA,CAAY,SAAS,CAAA,oBACpBA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,WAAA,CAAY,MAAA,EAAO;AAAA;AAAA;AAAA,GAE5D;AAEJ;ACZA,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,WAAA,GAAc,GAAA;AAEb,SAAS,eAAA,CAAgB,EAAE,MAAA,EAAO,EAAgC;AACvE,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AACjD,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAEtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIG,SAAS,EAAE,CAAA;AACzC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,QAAAA,CAAiC,EAAE,CAAA;AAE/D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,QAAAA,CAAiC,EAAE,CAAA;AAE3E,EAAA,MAAM,WAAA,GAAcN,OAA2B,IAAI,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQA,OAA4B,IAAI,CAAA;AAC9C,EAAA,MAAM,QAAA,GAAWA,OAAuB,IAAI,CAAA;AAE5C,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,WAAA,CAAY,KAAK,CAAA;AACjB,MAAA,eAAA,CAAgB,EAAE,CAAA;AAElB,MAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,EAAiB;AACpC,MAAA,MAAM,EAAA,GACJ,GAAA,EAAK,IAAA,KAAS,QAAA,GACV,IAAI,OAAA,GACJ,GAAA,EAAK,IAAA,KAAS,OAAA,IAAW,KAAK,IAAA,KAAS,MAAA,GACvC,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GACd,IAAA;AAEN,MAAA,WAAA,CAAY,OAAA,GAAU,EAAA,YAAc,WAAA,GAAc,EAAA,GAAK,IAAA;AAEvD,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,SAAA,CAAU,qBAAA,CAAsB,EAAA,EAAI,UAAU,CAAC,CAAA;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,EAAE,CAAA;AAAA,MACd;AAGA,MAAA,6BAAA,CAA8B,MAAM,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,IAC5D;AAAA,EAIF,CAAA,EAAG,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAGvB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AACjC,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAElC,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,CAAE,YAAA,GAAe,QAAA,CAAS,QAAA,CAAS,OAAO,CAAA,EAAG;AAErE,MAAA,MAAA,CAAO,MAAA,EAAO;AAAA,IAChB,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,QAAQ,IAAI,CAAA;AAAA,EACrE,CAAA,EAAG,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,CAAC,CAAA;AAIvB,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,EAAc,KAAA,KAAkB;AACrD,IAAA,eAAA,CAAgB,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,KAAA,EAAM,CAAE,CAAA;AACtD,IAAA,WAAA,CAAY,OAAA,EAAS,KAAA,CAAM,WAAA,CAAY,IAAA,EAAM,KAAK,CAAA;AAAA,EACpD,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAiB;AACnC,IAAA,WAAA,CAAY,OAAA,EAAS,KAAA,CAAM,cAAA,CAAe,IAAI,CAAA;AAC9C,IAAA,eAAA,CAAgB,CAAC,IAAA,KAAS;AACxB,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AACvB,MAAA,OAAO,KAAK,IAAI,CAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAIA,EAAA,MAAM,SAAS,MAAM;AAEnB,IAAA,SAAA,CAAU,WAAA,CAAY,SAAS,YAAY,CAAA;AAC3C,IAAA,eAAA,CAAgB,EAAE,CAAA;AAClB,IAAA,MAAA,CAAO,MAAA,EAAO;AAAA,EAChB,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAgD;AAC7D,IAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,MAAA,EAAO;AAAA,IAAG;AACxD,IAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,KAAY,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,CAAA,EAAU;AAAE,MAAA,CAAA,CAAE,cAAA,EAAe;AAAG,MAAA,MAAA,EAAO;AAAA,IAAG;AAAA,EACrF,CAAA;AAEA,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AACjC,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,EAAiB;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAKV,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,GAAA,CAAI,SAAS,WAAA,EAAa;AAE1D,IAAA,MAAM,QAAA,GACJ,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,CAAC,GAAA,CAAI,OAAO,CAAA,GACpC,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,KACxB,GAAA,CAAI,QAAA;AAEN,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,GAAA,CAAI,SAAS,QAAA,EAAU;AAGpD,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,MAAA,EAAQ,YAAY,CAAA;AACjD,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,IAAA,EAAK,IAAK,cAAA;AAGxC,IAAA,SAAA,CAAU,WAAA,CAAY,SAAS,YAAY,CAAA;AAC3C,IAAA,eAAA,CAAgB,EAAE,CAAA;AAElB,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,IAAA,KAAS,QAAA,IAAY,IAAI,IAAA,KAAS,QAAA;AACtD,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,QAAA,EAAS,CAAE,mBAAA;AAKzC,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,MAAA,MAAM,KAAK,MAAA,CAAO,OAAA;AAClB,MAAA,MAAM,YAAY,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,CAAA,EAAG,CAAA,CAAE,IAAI,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,IAAG,CAAE,CAAA;AAC7E,MAAA,IAAI,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAG,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,IAAA,GAAO,SAAA,CAAU,CAAC,CAAA,CAAG,CAAA,EAAG,IAAA,GAAO,IAAA;AACxE,MAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,QAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,QAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,QAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,QAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,MAC3B;AACA,MAAA,MAAM,UAAA,GAAyB;AAAA,QAC7B,EAAA,EAAI,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA;AAAA,QACrB,OAAA,EAAS,aAAA;AAAA,QACT,OAAA,EAAS,QAAA;AAAA,QACT,WAAA,EAAa,YAAA;AAAA,QACb,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,CAAA,EAAA,CAAI,OAAO,IAAA,IAAQ,CAAA;AAAA,QACnB,CAAA,EAAA,CAAI,OAAO,IAAA,IAAQ,CAAA;AAAA,QACnB,KAAK,QAAA,CAAS,IAAA;AAAA,QACd,WAAA,EAAa,EAAE,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,GAAO,IAAA,EAAK;AAAA,QACzE,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,SAAA;AAAA,QACR,SAAS,CAAC;AAAA,UACR,MAAA,EAAQ,SAAA;AAAA,UACR,KAAA,EAAO,IAAI,MAAA,CAAO,KAAA;AAAA,UAClB,SAAA,EAAW,IAAI,MAAA,CAAO;AAAA,SACvB;AAAA,OACH;AACA,MAAA,aAAA,CAAc,UAAU,CAAA;AACxB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,GAAA,GAAM,cAAA,CAAe,QAAA,EAAS,CAAE,IAAA,EAAK;AAC3C,QAAA,SAAA,CAAU,SAAA,EAAW,UAAU,qBAAA,CAAsB,GAAA,EAAK,YAAY,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,MAChG;AACA,MAAA,MAAA,CAAO,MAAA,EAAO;AACd,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,MAAM,EAAA,GAAK,gBAAgB,EAAA,EAAI,EAAE,QAAQ,YAAA,EAAc,YAAA,EAAc,WAAW,CAAA;AAChF,MAAA,MAAM,UAAA,GAAyB;AAAA,QAC7B,EAAA,EAAI,MAAA,GAAS,MAAA,CAAO,CAAC,CAAA;AAAA,QACrB,OAAA,EAAS,aAAA;AAAA,QACT,SAAS,EAAA,CAAG,OAAA;AAAA,QACZ,aAAa,EAAA,CAAG,WAAA;AAAA,QAChB,UAAU,EAAA,CAAG,QAAA;AAAA,QACb,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,GAAG,EAAA,CAAG,WAAA,CAAY,CAAA,GAAI,EAAA,CAAG,YAAY,KAAA,GAAQ,CAAA;AAAA,QAC7C,CAAA,EAAG,EAAA,CAAG,WAAA,CAAY,CAAA,GAAI,MAAA,CAAO,OAAA;AAAA,QAC7B,KAAK,QAAA,CAAS,IAAA;AAAA,QACd,aAAa,EAAA,CAAG,WAAA;AAAA,QAChB,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,QAC7B,cAAA,EAAgB,eAAA,CAAgB,EAAA,CAAG,cAAc,CAAA;AAAA,QACjD,aAAA,EAAe,GAAG,aAAA,IAAiB,MAAA;AAAA,QACnC,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,QAC7B,YAAA,EAAc,GAAG,YAAA,IAAgB,MAAA;AAAA,QACjC,OAAA,EAAS,GAAG,OAAA,IAAW,MAAA;AAAA,QACvB,eAAA,EAAiB,GAAG,eAAA,IAAmB,MAAA;AAAA,QACvC,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,QAC7B,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,QAC7B,YAAA,EAAc,GAAG,YAAA,IAAgB,MAAA;AAAA,QACjC,aAAA,EAAe,OAAA;AAAA,QACf,IAAA,EAAM,UAAA;AAAA,QACN,MAAA,EAAQ,SAAA;AAAA,QACR,cAAc,OAAA,IAAW;AAAA,OAC3B;AACA,MAAA,aAAA,CAAc,UAAU,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,QAAA,EAAS,CAAE,IAAA,EAAK;AAC3C,MAAA,SAAA,CAAU,SAAA,EAAW,UAAU,qBAAA,CAAsB,GAAA,EAAK,YAAY,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAChG;AAEA,IAAA,MAAA,CAAO,MAAA,EAAO;AAAA,EAChB,CAAA;AAKA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIK,SAA2B,IAAI,CAAA;AAEjE,EAAA,MAAM,aAAA,GAAgBC,YAAY,MAAM;AACtC,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAAE,MAAA,YAAA,CAAa,IAAI,CAAA;AAAG,MAAA;AAAA,IAAQ;AAC/D,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,EAAiB;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAAE,MAAA,YAAA,CAAa,IAAI,CAAA;AAAG,MAAA;AAAA,IAAQ;AACxC,IAAA,MAAM,IAAA,GAAO,WAAW,GAAG,CAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AAAE,MAAA,YAAA,CAAa,IAAI,CAAA;AAAG,MAAA;AAAA,IAAQ;AAEzC,IAAA,MAAM,KAAK,MAAA,CAAO,UAAA;AAClB,IAAA,MAAM,KAAK,MAAA,CAAO,WAAA;AAClB,IAAA,MAAM,KAAA,GAAQ,kBAAkB,GAAG,CAAA;AAEnC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,MAAA;AACtC,IAAA,IAAI,WAAA,GAAc,EAAA,GAAK,EAAA,GAAK,GAAA,EAAK;AAC/B,MAAA,YAAA,CAAa;AAAA,QACX,GAAA,EAAK,IAAA,CAAK,KAAA,CAAA,CAAO,EAAA,GAAK,eAAe,CAAC,CAAA;AAAA,QACtC,IAAA,EAAM,IAAA,CAAK,KAAA,CAAA,CAAO,EAAA,GAAK,WAAW,CAAC,CAAA;AAAA,QACnC;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,GAAA,GAAM,KAAK,MAAA,GAAS,CAAA;AACxB,IAAA,IAAI,OAAO,IAAA,CAAK,IAAA;AAChB,IAAA,IAAI,GAAA,GAAM,WAAA,GAAc,EAAA,EAAI,GAAA,GAAM,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,GAAM,WAAA,GAAc,CAAC,CAAA;AACxE,IAAA,IAAI,IAAA,GAAO,UAAU,EAAA,EAAI,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,EAAA,GAAK,OAAA,GAAU,CAAC,CAAA;AAC5D,IAAA,YAAA,CAAa,EAAE,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAGlB,EAAAN,UAAU,MAAM;AACd,IAAA,aAAA,EAAc;AAAA,EAChB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,aAAA,EAAc;AACrC,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,QAAA,EAAU,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC5E,IAAA,OAAO,MAAM,OAAO,mBAAA,CAAoB,QAAA,EAAU,UAAU,EAAE,OAAA,EAAS,MAA8B,CAAA;AAAA,EACvG,CAAA,EAAG,CAAC,KAAA,CAAM,IAAA,EAAM,aAAa,CAAC,CAAA;AAE9B,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,CAAC,WAAW,OAAO,IAAA;AAEtD,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,YAAY,EAAE,MAAA,GAAS,CAAA;AAEpD,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,UAAU,SAAA,EAAU,eAAA,EAAgB,KAAA,EAAO,EAAE,KAAK,SAAA,CAAU,GAAA,EAAK,IAAA,EAAM,SAAA,CAAU,MAAK,EAE9F,QAAA,EAAA;AAAA,oBAAAA,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,cAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAe,UAAA;AAAA,QACf,SAAS,MAAM,aAAA,CAAc,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAEtC,QAAA,EAAA;AAAA,0BAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,UAAA,GAAa,WAAM,QAAA,EAAI,CAAA;AAAA,0BACxDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,oBAAU,KAAA,EAAM,CAAA;AAAA,UAE9C,8BACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAW,CAAA,iBAAA,EAAoB,QAAA,GAAW,aAAA,GAAgB,EAAE,CAAA,CAAA;AAAA,cAC5D,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,gBAAA,WAAA,CAAY,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,cAAG,CAAA;AAAA,cAC/D,KAAA,EAAO,WAAW,cAAA,GAAiB,eAAA;AAAA,cACnC,YAAA,EAAY,WAAW,oBAAA,GAAuB,sBAAA;AAAA,cAE7C,QAAA,EAAA,QAAA;AAAA;AAAA,gCAECA,GAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,0BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAgB,CAAA,EAAE;AAAA;AAAA;AAAA,gCAGpLD,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,4DAAA,EAA4D,CAAA;AAAA,kCAAEA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,yDAAA,EAAyD;AAAA,iBAAA,EAAE;AAAA;AAAA;AAAA;AAE5R;AAAA;AAAA,KAEJ;AAAA,IAGC,UAAA,IAAc,aAAa,MAAA,GAAS,CAAA,oBACnCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACZ,QAAA,EAAA;AAAA,MAAA,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,OAAO,CAAA,KAAM;AACrC,QAAA,MAAM,UAAA,GAAa,YAAA,CAAa,IAAI,CAAA,IAAK,OAAA;AACzC,QAAA,MAAM,UAAU,YAAA,CAAa,IAAI,MAAM,MAAA,IAAa,YAAA,CAAa,IAAI,CAAA,KAAM,OAAA;AAC3E,QAAA,uBACEA,KAAC,KAAA,EAAA,EAAe,SAAA,EAAW,YAAY,OAAA,GAAU,qBAAA,GAAwB,EAAE,CAAA,CAAA,EACzE,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,UACjC,2BACCA,GAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,iBAAA;AAAA,cACV,KAAA,EAAO,UAAA;AAAA,cACP,UAAU,CAAC,CAAA,KAAM,cAAc,IAAA,EAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACnD,UAAA,EAAY,KAAA;AAAA,cACZ,YAAA,EAAY;AAAA;AAAA,8BAGdA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAa,QAAA,EAAA,UAAA,EAAW,CAAA;AAAA,UAEzC,2BACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,kBAAA;AAAA,cACV,OAAA,EAAS,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,cAC9B,KAAA,EAAM,oBAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EAAA,EApBM,IAsBV,CAAA;AAAA,MAEJ,CAAC,CAAA;AAAA,MACA,4BACCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAa,QAAA,EAAA,gDAAA,EAE5B;AAAA,KAAA,EAEJ,CAAA;AAAA,oBAGFA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,KAAA;AAAA,QACL,KAAA,EAAO,OAAA;AAAA,QACP,WAAA,EAAY,qEAAA;AAAA,QACZ,YAAA,EAAW,oBAAA;AAAA,QACX,UAAU,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAC1C,SAAA,EAAW;AAAA;AAAA,KACb;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,IAAC,QAAA,EAAA,EAAO,SAAA,EAAU,OAAA,EAAQ,OAAA,EAAS,QAAQ,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,sBACjDA,GAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,SAAA,EAAU,OAAA,EAAS,QAAQ,QAAA,EAAA,KAAA,EAAG;AAAA,KAAA,EAClD;AAAA,GAAA,EACF,CAAA;AAEJ;AAIA,SAAS,SAAA,CAAU,IAAwB,KAAA,EAA+B;AACxE,EAAA,IAAI,CAAC,EAAA,EAAI;AACT,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG;AACrC,IAAA,EAAA,CAAG,KAAA,CAAM,eAAe,IAAI,CAAA;AAAA,EAC9B;AACF;AAEA,SAAS,YAAA,CACP,UACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAChD,IAAA,IAAI,GAAA,KAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AAC1B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,GAAG,cAAc,QAAA,CAAS,IAAI,CAAA,IAAK,OAAO,CAAA,GAAA,CAAK,CAAA;AAAA,IAC1E;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,OAAO,CAAA;AAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,CAAA;AAC/B;AAEA,SAAS,gBAAgB,CAAA,EAA+C;AACtE,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA;AAChC,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACjC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AACxD;AAEA,SAAS,WAAW,GAAA,EAAsE;AACxF,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,GAAA,CAAI,QAAQ,qBAAA,EAAsB;AACpE,EAAA,IAAI,IAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,IAAI,QAAQ,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,EAAG,GAAA,CAAI,KAAK,KAAA,EAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AAInG,EAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,IAAA,OAAO,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,GAAA,CAAI,OAAA,CAAQ,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,IAAA,MAAM,IAAI,GAAA,CAAI,WAAA;AACd,IAAA,OAAO,IAAI,QAAQ,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,MAAM,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AAEzB,IAAA,MAAM,GAAA,GAAM,IAAI,MAAA,CAAO,MAAA;AACvB,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC7B,IAAA,IAAI,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA,CAAG,CAAA,EAAG,IAAA,GAAO,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA,CAAG,CAAA,EAAG,IAAA,GAAO,IAAA;AAC5D,IAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AACzB,MAAA,IAAI,CAAA,CAAE,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,CAAA,CAAE,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAM,IAAA,GAAO,IAAA,EAAM,OAAO,IAAI,CAAA;AAAA,EACzD;AACA,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,OAAO,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,CAAG,qBAAA,EAAsB;AAChD;AAEA,IAAM,UAAA,GAAqC;AAAA,EACzC,CAAA,EAAG,WAAA;AAAA,EAAa,EAAA,EAAI,SAAA;AAAA,EAAW,EAAA,EAAI,SAAA;AAAA,EAAW,EAAA,EAAI,SAAA;AAAA,EAClD,EAAA,EAAI,SAAA;AAAA,EAAW,EAAA,EAAI,SAAA;AAAA,EAAW,EAAA,EAAI,SAAA;AAAA,EAClC,CAAA,EAAG,MAAA;AAAA,EAAQ,MAAA,EAAQ,QAAA;AAAA,EAAU,KAAA,EAAO,OAAA;AAAA,EAAS,QAAA,EAAU,UAAA;AAAA,EACvD,MAAA,EAAQ,QAAA;AAAA,EAAU,GAAA,EAAK,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EACvD,IAAA,EAAM,MAAA;AAAA,EAAQ,GAAA,EAAK,KAAA;AAAA,EAAO,MAAA,EAAQ,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EACpD,IAAA,EAAM,MAAA;AAAA,EAAQ,OAAA,EAAS,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,KAAA,EAAO,OAAA;AAAA,EAC7D,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,WAAA;AAAA,EAAa,KAAA,EAAO,OAAA;AAAA,EAChD,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,aAAA;AAAA,EAAe,IAAA,EAAM,MAAA;AAAA,EAAQ,GAAA,EAAK,KAAA;AAAA,EAClD,KAAA,EAAO,OAAA;AAAA,EAAS,IAAA,EAAM,MAAA;AAAA,EAAQ,GAAA,EAAK,YAAA;AAAA,EAAc,UAAA,EAAY,OAAA;AAAA,EAC7D,MAAA,EAAQ,MAAA;AAAA,EAAQ,EAAA,EAAI,QAAA;AAAA,EAAU,GAAA,EAAK,KAAA;AAAA,EAAO,GAAA,EAAK,KAAA;AAAA,EAAO,MAAA,EAAQ;AAChE,CAAA;AAEA,SAAS,gBAAgB,EAAA,EAAqB;AAC5C,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAG,CAAA,IAAK,GAAA;AAChC,EAAA,MAAM,IAAA,GAAA,CAAQ,GAAG,WAAA,IAAe,EAAA,EAAI,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC9D,EAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,IAAA,MAAM,OAAA,GAAU,KAAK,MAAA,GAAS,EAAA,GAAK,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,QAAA,GAAM,IAAA;AAC7D,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,GAAA,EAAM,OAAO,CAAA,CAAA,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,GAAG,EAAA,EAAI,OAAO,GAAG,IAAI,CAAA,GAAA,EAAM,GAAG,EAAE,CAAA,CAAA;AACpC,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,SAAA,CAAU,CAAC,CAAA;AAC1B,EAAA,IAAI,GAAA,EAAK,OAAO,CAAA,EAAG,IAAI,MAAM,GAAG,CAAA,CAAA;AAChC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kBAAkB,GAAA,EAA2E;AACpG,EAAA,IAAI,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,eAAA,CAAgB,IAAI,OAAO,CAAA;AAC7D,EAAA,IAAI,IAAI,IAAA,KAAS,MAAA,SAAe,CAAA,UAAA,EAAU,GAAA,CAAI,SAAS,MAAM,CAAA,WAAA,CAAA;AAC7D,EAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU,OAAO,iBAAc,GAAA,CAAI,MAAA,CAAO,OAAO,MAAM,CAAA,IAAA,CAAA;AAGxE,EAAA,IAAI,IAAI,IAAA,KAAS,WAAA,SAAoB,CAAA,MAAA,EAAS,GAAA,CAAI,KAAK,aAAa,CAAA,CAAA;AACpE,EAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa,OAAO,QAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,CAAA,CAAA;AAE7E,EAAA,IAAI,GAAA,CAAI,SAAS,MAAA,KAAW,CAAA,SAAU,eAAA,CAAgB,GAAA,CAAI,QAAA,CAAS,CAAC,CAAE,CAAA;AACtE,EAAA,OAAO,CAAA,EAAG,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,WAAA,CAAA;AAC/B;AC/bO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,EAAA,MAAM,GAAG,UAAU,CAAA,GAAIG,SAAS,CAAC,CAAA;AAEjC,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,GAAA,GAAqB,IAAA;AACzB,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,IAAI,QAAQ,IAAA,EAAM;AAGlB,MAAA,GAAA,GAAM,8BAA8B,MAAM;AAAE,QAAA,GAAA,GAAM,IAAA;AAAM,QAAA,UAAA,CAAW,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,MAAG,CAAC,CAAA;AAAA,IACrF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAA,EAAQ,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAC1E,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAC3D,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,oBAAA,CAAqB,GAAG,CAAA;AAC1C,MAAA,MAAA,CAAO,oBAAoB,QAAA,EAAU,MAAA,EAAQ,EAAE,OAAA,EAAS,MAA8B,CAAA;AACtF,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAAA,IAC7C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEE,IAAAK,QAAAA,EAAA,EACG,sBAAY,GAAA,CAAI,CAAC,GAAG,CAAA,qBACnBL,IAAC,GAAA,EAAA,EAAe,MAAA,EAAQ,IAAI,CAAA,EAAG,UAAA,EAAY,KAAjC,CAAA,CAAE,EAAkC,CAC/C,CAAA,EACH,CAAA;AAEJ;AAIA,IAAMM,WAAAA,GAAqC;AAAA,EACzC,CAAA,EAAG,WAAA;AAAA,EAAa,EAAA,EAAI,SAAA;AAAA,EAAW,EAAA,EAAI,SAAA;AAAA,EAAW,EAAA,EAAI,SAAA;AAAA,EAClD,EAAA,EAAI,SAAA;AAAA,EAAW,EAAA,EAAI,SAAA;AAAA,EAAW,EAAA,EAAI,SAAA;AAAA,EAClC,CAAA,EAAG,MAAA;AAAA,EAAQ,MAAA,EAAQ,QAAA;AAAA,EAAU,KAAA,EAAO,OAAA;AAAA,EAAS,QAAA,EAAU,UAAA;AAAA,EACvD,MAAA,EAAQ,QAAA;AAAA,EAAU,GAAA,EAAK,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EAAS,KAAA,EAAO,OAAA;AAAA,EACvD,IAAA,EAAM,MAAA;AAAA,EAAQ,GAAA,EAAK,KAAA;AAAA,EAAO,MAAA,EAAQ,QAAA;AAAA,EAAU,MAAA,EAAQ,QAAA;AAAA,EACpD,IAAA,EAAM,MAAA;AAAA,EAAQ,OAAA,EAAS,SAAA;AAAA,EAAW,OAAA,EAAS,SAAA;AAAA,EAAW,KAAA,EAAO,OAAA;AAAA,EAC7D,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,WAAA;AAAA,EAAa,KAAA,EAAO,OAAA;AAAA,EAChD,EAAA,EAAI,MAAA;AAAA,EAAQ,EAAA,EAAI,aAAA;AAAA,EAAe,IAAA,EAAM,MAAA;AAAA,EAAQ,GAAA,EAAK,KAAA;AAAA,EAClD,KAAA,EAAO,OAAA;AAAA,EAAS,IAAA,EAAM,MAAA;AAAA,EAAQ,GAAA,EAAK,YAAA;AAAA,EAAc,UAAA,EAAY;AAC/D,CAAA;AAEA,SAAS,SAAS,UAAA,EAAgC;AAChD,EAAA,MAAM,GAAA,GAAA,CAAO,UAAA,CAAW,OAAA,IAAW,EAAA,EAAI,WAAA,EAAY;AACnD,EAAA,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AACtC,EAAA,OAAA,CAAQA,WAAAA,CAAW,GAAG,CAAA,IAAK,GAAA,KAAQ,SAAA;AACrC;AAGA,SAAS,YAAY,GAAA,EAA6C;AAChE,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,OAAO,IAAI,KAAA,CAAM,GAAG,CAAA,CACjB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,EACnB,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,KAAA,KAAU,IAAI,OAAO,IAAA;AACzB,IAAA,OAAO,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,IAAA,EAAK,EAAG,CAAA,CAAE,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,EAC7D,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AACnB;AAIA,SAAS,GAAA,CAAI,EAAE,MAAA,EAAQ,UAAA,EAAW,EAA+C;AAC/E,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAE7C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIH,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,QAAAA,CAAS,WAAW,OAAO,CAAA;AACrD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQN,OAA4B,IAAI,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAUA,OAAuB,IAAI,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,UAAA,CAAW,cAAc,CAAA;AAC1D,EAAA,MAAM,KAAA,GAAQ,SAAS,UAAU,CAAA;AACjC,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,aAAA,GAC3B,CAAA,EAAG,KAAK,oBACR,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,UAAA,CAAW,WAAW,CAAA,CAAA,CAAA;AAExC,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,QAAA,CAAS,WAAW,OAAO,CAAA;AAC3B,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,6BAAA,CAA8B,MAAM,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,YAAY,MAAM;AAAE,IAAA,UAAA,CAAW,KAAK,CAAA;AAAG,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EAAG,CAAA;AAEnE,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,IAAA,IAAI,SAAS,MAAA,CAAO,UAAA,CAAW,IAAI,EAAE,OAAA,EAAS,SAAS,CAAA;AACvD,IAAA,SAAA,EAAU;AAAA,EACZ,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAA2B;AAC5C,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,SAAA,EAAU;AAClC,IAAA,IAAI,EAAE,GAAA,KAAQ,OAAA,KAAY,EAAE,OAAA,IAAW,CAAA,CAAE,UAAU,IAAA,EAAK;AAAA,EAC1D,CAAA;AAGA,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,CAAE,YAAA,GAAe,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAG;AACnE,MAAA,SAAA,EAAU;AAAA,IACZ,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AACnD,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,QAAQ,IAAI,CAAA;AAAA,EACrE,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,EAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,MAAA,IAAI;AAAE,QAAA,EAAA,GAAK,QAAA,CAAS,aAAA,CAA2B,UAAA,CAAW,WAAW,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAgB;AAAA,IAClG;AACA,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,WAAA,GAAc,GAAG,KAAA,CAAM,OAAA;AAC7B,IAAA,MAAM,UAAA,GAAa,GAAG,KAAA,CAAM,aAAA;AAC5B,IAAA,EAAA,CAAG,MAAM,OAAA,GAAU,mBAAA;AACnB,IAAA,EAAA,CAAG,MAAM,aAAA,GAAgB,KAAA;AACzB,IAAA,OAAO,MAAM;AAAE,MAAA,EAAA,CAAI,MAAM,OAAA,GAAU,WAAA;AAAa,MAAA,EAAA,CAAI,MAAM,aAAA,GAAgB,UAAA;AAAA,IAAY,CAAA;AAAA,EACxF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,CAAW,WAAW,CAAC,CAAA;AAEpC,EAAA,MAAM,GAAA,GAAM,gBAAgB,UAAU,CAAA;AACtC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,aAAA;AAAA,MACV,OAAO,EAAE,IAAA,EAAM,IAAI,CAAA,EAAG,GAAA,EAAK,IAAI,CAAA,EAAE;AAAA,MACjC,cAAc,MAAM;AAAE,QAAA,IAAI,CAAC,OAAA,EAAS,UAAA,CAAW,IAAI,CAAA;AAAA,MAAG,CAAA;AAAA,MACtD,YAAA,EAAc,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,MACpC,OAAA,EAAS,QAAA;AAAA,MACT,IAAA,EAAK,QAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,YAAA,EAAY,CAAA,WAAA,EAAc,MAAM,CAAA,EAAA,EAAK,WAAW,OAAO,CAAA,CAAA;AAAA,MAEvD,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,QAGzC,WAAW,CAAC,OAAA,oBACXD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YAAM,IAAA;AAAA,YAAG,UAAA,CAAW;AAAA,WAAA,EAAY,CAAA;AAAA,0BACnEC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,qBAAW,OAAA,EAAQ;AAAA,SAAA,EAC3D,CAAA;AAAA,QAID,2BACCD,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,OAAA;AAAA,YACL,SAAA,EAAU,UAAA;AAAA,YACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,YAGlC,QAAA,EAAA;AAAA,8BAAAA,IAAAA;AAAA,gBAAC,KAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,EAAU,cAAA;AAAA,kBACV,IAAA,EAAK,QAAA;AAAA,kBACL,eAAA,EAAe,UAAA;AAAA,kBACf,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,oBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,oBAAA,aAAA,CAAc,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,kBAAG,CAAA;AAAA,kBAEjE,QAAA,EAAA;AAAA,oCAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,UAAA,GAAa,WAAM,QAAA,EAAI,CAAA;AAAA,oCACxDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,eAAe,QAAA,EAAA,WAAA,EAAY;AAAA;AAAA;AAAA,eAC7C;AAAA,cAGC,UAAA,IAAc,aAAa,MAAA,GAAS,CAAA,oBACnCD,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACZ,QAAA,EAAA;AAAA,gBAAA,YAAA,CAAa,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,sBACtBA,IAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,WAAA,EACrB,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,CAAA,EAAE,CAAA;AAAA,kCAC/BA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAa,QAAA,EAAA,CAAA,EAAE;AAAA,iBAAA,EAAA,EAFvB,CAGV,CACD,CAAA;AAAA,gBACA,UAAA,CAAW,YAAA,oBACVD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAa,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,cAAA,EAAgB,wBAAuB,EAC5F,QAAA,EAAA;AAAA,kCAAAC,GAAAA,CAAC,YAAO,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,kCAASA,IAAC,IAAA,EAAA,EAAG,CAAA;AAAA,kBACtC,UAAA,CAAW;AAAA,iBAAA,EACd;AAAA,eAAA,EAEJ,CAAA;AAAA,8BAIFA,GAAAA;AAAA,gBAAC,UAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,KAAA;AAAA,kBACL,KAAA,EAAO,KAAA;AAAA,kBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACxC,SAAA;AAAA,kBACA,WAAA,EAAY,yDAAA;AAAA,kBACZ,YAAA,EAAW;AAAA;AAAA,eACb;AAAA,8BAGAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,gCAAAC,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAU,iBAAA;AAAA,oBACV,OAAA,EAAS,MAAM,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AAAA,oBACnC,YAAA,EAAW,mBAAA;AAAA,oBAEX,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA,iBACb;AAAA,gCACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,cAAA,EAAgB,YAAW,EAC3E,QAAA,EAAA;AAAA,kCAAAC,IAAC,QAAA,EAAA,EAAO,SAAA,EAAU,OAAA,EAAQ,OAAA,EAAS,WAAW,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,kCACpDA,GAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,SAAA,EAAU,OAAA,EAAS,MAAM,QAAA,EAAA,MAAA,EAAI;AAAA,iBAAA,EACjD;AAAA,eAAA,EACF;AAAA;AAAA;AAAA;AACF;AAAA;AAAA,GAEJ;AAEJ;AAIA,SAAS,gBAAgB,CAAA,EAAgD;AACvE,EAAA,IAAI,EAAE,WAAA,EAAa;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,WAAW,CAAA;AAC/C,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,QAAA,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,MAAA,EAAQ,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,KAAA,GAAQ,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,MAAM,EAAA,EAAG;AAAA,MACnE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAAyB;AAAA,EACnC;AACA,EAAA,IAAI,EAAE,WAAA,EAAa;AACjB,IAAA,OAAO,EAAE,CAAA,EAAG,CAAA,CAAE,WAAA,CAAY,CAAA,GAAI,CAAA,CAAE,WAAA,CAAY,KAAA,GAAQ,EAAA,EAAI,CAAA,EAAG,CAAA,CAAE,WAAA,CAAY,IAAI,EAAA,EAAG;AAAA,EAClF;AACA,EAAA,OAAO,IAAA;AACT;AC1NO,SAAS,UAAA,CAAW,EAAE,MAAA,EAAO,EAAgC;AAClE,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,EAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,EAAA,MAAM,GAAA,GAAMH,OAA0B,IAAI,CAAA;AAG1C,EAAA,MAAM,YAAYA,MAAAA,CAAO,EAAE,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACvC,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,SAAA,CAAU,UAAU,EAAE,CAAA,EAAG,OAAO,OAAA,EAAS,CAAA,EAAG,OAAO,OAAA,EAAQ;AAC3D,IAAA,MAAM,iBAAiB,MAAM;AAC3B,MAAA,SAAA,CAAU,UAAU,EAAE,CAAA,EAAG,OAAO,OAAA,EAAS,CAAA,EAAG,OAAO,OAAA,EAAQ;AAC3D,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,cAAA,EAAgB,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAClF,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,cAAA,EAAgB,EAAE,OAAA,EAAS,MAAM,CAAA;AACnE,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,oBAAoB,QAAA,EAAU,cAAA,EAAgB,EAAE,OAAA,EAAS,MAA8B,CAAA;AAC9F,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,cAAc,CAAA;AAAA,IACrD,CAAA;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,UAAU,MAAM;AACd,IAAA,KAAA,EAAM;AAAA,EAER,CAAA,EAAG,CAAC,WAAA,EAAa,KAAK,CAAC,CAAA;AAGvB,EAAAA,UAAU,MAAM;AACd,IAAA,UAAA,EAAW;AACX,IAAA,KAAA,EAAM;AAAA,EAER,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,SAAS,UAAA,GAAa;AACpB,IAAA,MAAM,IAAI,GAAA,CAAI,OAAA;AACd,IAAA,IAAI,CAAC,CAAA,IAAK,OAAO,MAAA,KAAW,WAAA,EAAa;AACzC,IAAA,MAAM,GAAA,GAAM,OAAO,gBAAA,IAAoB,CAAA;AACvC,IAAA,MAAM,IAAI,MAAA,CAAO,UAAA;AACjB,IAAA,MAAM,IAAI,MAAA,CAAO,WAAA;AACjB,IAAA,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAC5B,IAAA,CAAA,CAAE,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,CAAA;AAC7B,IAAA,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,GAAI,IAAA;AACpB,IAAA,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,GAAI,IAAA;AACrB,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA;AAC7B,IAAA,IAAI,GAAA,MAAS,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA,EAAG,GAAA,EAAK,GAAG,CAAC,CAAA;AAAA,EAChD;AAEA,EAAA,SAAS,KAAA,GAAQ;AACf,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,6BAAA,CAA8B,MAAM;AAClC,MAAA,MAAM,IAAI,GAAA,CAAI,OAAA;AACd,MAAA,IAAI,CAAC,CAAA,EAAG;AACR,MAAA,UAAA,EAAW;AACX,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,UAAA,EAAY,OAAO,WAAW,CAAA;AACzD,MAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,MAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,MAAA,MAAM,EAAA,GAAK,UAAU,OAAA,CAAQ,CAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,UAAU,OAAA,CAAQ,CAAA;AAI7B,MAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,QAAA,IAAI,CAAC,EAAE,OAAA,EAAS;AAChB,QAAA,KAAA,MAAW,MAAA,IAAU,EAAE,OAAA,EAAS;AAC9B,UAAA,UAAA,CAAW,GAAA,EAAK,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,KAAA,EAAO,OAAO,SAAA,EAAW,CAAC,EAAA,EAAI,CAAC,EAAE,CAAA;AAAA,QACzE;AAAA,MACF;AAIA,MAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,QAAA,MAAM,IAAI,KAAA,CAAM,MAAA;AAChB,QAAA,UAAA,CAAW,GAAA,EAAK,EAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAA,CAAE,SAAA,EAAW,GAAG,CAAC,CAAA;AAAA,MACtD;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,uBACEE,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,sBAAA,EAAqB,EAAA;AAAA,MACrB,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,GAAA,EAAK,CAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA;AAAA,QAEN,MAAA,EAAQ,CAAA;AAAA,QACR,aAAA,EAAe;AAAA,OACjB;AAAA,MACA,aAAA,EAAY;AAAA;AAAA,GACd;AAEJ;AAEA,SAAS,WACP,GAAA,EACA,MAAA,EACA,KAAA,EACA,SAAA,EACA,IACA,EAAA,EACA;AACA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACzB,EAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,EAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAChB,EAAA,GAAA,CAAI,SAAA,EAAU;AACd,EAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,GAAI,IAAI,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,GAAI,EAAE,CAAA;AAC/C,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEvB,IAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,GAAI,EAAA,GAAK,IAAA,EAAM,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA;AAAA,EAC/D,CAAA,MAAO;AACL,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,GAAI,IAAI,MAAA,CAAO,CAAC,CAAA,CAAG,CAAA,GAAI,EAAE,CAAA;AAAA,IACjD;AAAA,EACF;AACA,EAAA,GAAA,CAAI,MAAA,EAAO;AACb;;;AC5GO,IAAM,eAAA,GAAmD;AAAA,EAC9D,SAAA,EAAW,WAAA;AAAA,EACX,SAAA,EAAW,WAAA;AAAA,EACX,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAMO,IAAM,OAAA,GAAmC;AAAA;AAAA,EAE9C,EAAE,aAAA,EAAe,YAAA,EAAgB,KAAA,EAAO,KAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAG;AAAA,EAClH,EAAE,aAAA,EAAe,QAAA,EAAgB,KAAA,EAAO,QAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,QAAA,EAAgB,KAAA,EAAO,QAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,SAAA,EAAgB,KAAA,EAAO,SAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,WAAA,EAAgB,KAAA,EAAO,WAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA;AAAA,EAGnH,EAAE,aAAA,EAAe,MAAA,EAAgB,KAAA,EAAO,MAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,aAAA,EAAgB,KAAA,EAAO,UAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,cAAA,EAAgB,KAAA,EAAO,SAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,aAAA,EAAgB,KAAA,EAAO,aAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,OAAA,EAAgB,KAAA,EAAO,UAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,EAAA,EAAG;AAAA,EAClH,EAAE,aAAA,EAAe,KAAA,EAAgB,KAAA,EAAO,UAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,KAAA,EAAgB,KAAA,EAAO,KAAA,EAAe,QAAA,EAAU,WAAA,EAAa,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA;AAAA,EAGnH,EAAE,aAAA,EAAe,WAAA,EAAgB,KAAA,EAAO,WAAA,EAAe,QAAA,EAAU,KAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,UAAA,EAAgB,KAAA,EAAO,MAAA,EAAe,QAAA,EAAU,KAAA,EAAa,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,OAAA,EAAgB,KAAA,EAAO,OAAA,EAAe,QAAA,EAAU,KAAA,EAAa,KAAA,EAAO,WAAA,EAAM,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACpH,EAAE,aAAA,EAAe,OAAA,EAAgB,KAAA,EAAO,OAAA,EAAe,QAAA,EAAU,KAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,MAAA,EAAgB,KAAA,EAAO,MAAA,EAAe,QAAA,EAAU,KAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA;AAAA,EAGnH,EAAE,aAAA,EAAe,MAAA,EAAgB,KAAA,EAAO,MAAA,EAAe,QAAA,EAAU,SAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,WAAA,EAAgB,KAAA,EAAO,YAAA,EAAe,QAAA,EAAU,SAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,QAAA,EAAgB,KAAA,EAAO,QAAA,EAAe,QAAA,EAAU,SAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,EAAA,EAAM,MAAA,EAAQ,EAAA,EAAG;AAAA,EAClH,EAAE,aAAA,EAAe,OAAA,EAAgB,KAAA,EAAO,OAAA,EAAe,QAAA,EAAU,SAAA,EAAa,KAAA,EAAO,WAAA,EAAM,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACpH,EAAE,aAAA,EAAe,OAAA,EAAgB,KAAA,EAAO,OAAA,EAAe,QAAA,EAAU,SAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA;AAAA,EAGnH,EAAE,aAAA,EAAe,MAAA,EAAgB,KAAA,EAAO,MAAA,EAAe,QAAA,EAAU,OAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,OAAA,EAAgB,KAAA,EAAO,OAAA,EAAe,QAAA,EAAU,OAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,EAAA,EAAG;AAAA,EAClH,EAAE,aAAA,EAAe,QAAA,EAAgB,KAAA,EAAO,QAAA,EAAe,QAAA,EAAU,OAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,EAAA,EAAG;AAAA,EAClH,EAAE,aAAA,EAAe,QAAA,EAAgB,KAAA,EAAO,QAAA,EAAe,QAAA,EAAU,OAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,EAAA,EAAM,MAAA,EAAQ,EAAA,EAAG;AAAA,EAClH,EAAE,aAAA,EAAe,QAAA,EAAgB,KAAA,EAAO,QAAA,EAAe,QAAA,EAAU,OAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,EAAA,EAAG;AAAA;AAAA,EAGlH,EAAE,aAAA,EAAe,OAAA,EAAgB,KAAA,EAAO,OAAA,EAAe,QAAA,EAAU,UAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,GAAA,EAAI;AAAA,EACnH,EAAE,aAAA,EAAe,OAAA,EAAgB,KAAA,EAAO,OAAA,EAAe,QAAA,EAAU,UAAA,EAAa,KAAA,EAAO,WAAA,EAAM,KAAA,EAAO,GAAA,EAAM,MAAA,EAAQ,EAAA,EAAG;AAAA,EACnH,EAAE,aAAA,EAAe,QAAA,EAAgB,KAAA,EAAO,QAAA,EAAe,QAAA,EAAU,UAAA,EAAa,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,EAAA;AACjH,CAAA;AAGO,IAAM,sBAAkD,MAAM;AACnE,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAqB;AACtC,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,QAAQ,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,QAAQ,CAAA;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,IAC1B;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT,CAAA,GAAG;AAWI,SAAS,cAAc,KAAA,EAAkC;AAC9D,EAAA,OAAO;AAAA,IACL,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,QAAQ,KAAA,CAAM;AAAA,GAChB;AACF;AClFO,SAAS,aAAA,CAAc;AAAA,EAC5B,MAAA;AAAA,EACA,WAAA,GAAc,KAAA;AAAA,EACd;AACF,CAAA,EAAuB;AAIrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,IAAIG,QAAAA,iBAA+B,IAAI,KAAK,CAAA;AAE1E,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAyB;AACvC,IAAA,YAAA,CAAa,CAAC,IAAA,KAAS;AACrB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,KAAK,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,WAC7B,IAAA,CAAK,IAAI,GAAG,CAAA;AACjB,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,CAAC,KAAA,KAAwB,CAAC,CAAA,KAA0B;AAIhF,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAA,GAAS,aAAA,CAAc,KAAK,CAAA,EAAG,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA;AAAA,EAC/D,CAAA;AAEA,EAAA,uBACEJ,IAAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,iBAAA;AAAA,MACV,IAAA,EAAK,SAAA;AAAA,MACL,YAAA,EAAW,gBAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,wBAAA,EAChB,QAAA,EAAA;AAAA,0BAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAwB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,UAC7C,oCACCA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAW,CAAA,6BAAA,EAAgC,WAAA,GAAc,QAAA,GAAW,EAAE,CAAA,CAAA;AAAA,cACtE,OAAA,EAAS,iBAAA;AAAA,cACT,cAAA,EAAc,WAAA;AAAA,cACd,KAAA,EAAO,cAAc,qBAAA,GAAwB,sBAAA;AAAA,cAE5C,wBAAc,aAAA,GAAW;AAAA;AAAA,WAC5B,GACE;AAAA,SAAA,EACN,CAAA;AAAA,wBAEAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,kBAAA,CAAmB,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC/B,UAAA,MAAM,WAAA,GAAc,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AACrC,UAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,GAAG,CAAA;AACtD,UAAA,uBACED,IAAAA,CAAC,SAAA,EAAA,EAAkB,SAAA,EAAU,yBAAA,EAC3B,QAAA,EAAA;AAAA,4BAAAA,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,gCAAA;AAAA,gBACV,OAAA,EAAS,MAAM,MAAA,CAAO,GAAG,CAAA;AAAA,gBACzB,iBAAe,CAAC,WAAA;AAAA,gBAEhB,QAAA,EAAA;AAAA,kCAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA,WAAA,GAAc,WAAM,QAAA,EACvB,CAAA;AAAA,kBACC,gBAAgB,GAAG,CAAA;AAAA,kCACpBA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,gBAAM,MAAA,EAAO;AAAA;AAAA;AAAA,aACxD;AAAA,YACC,CAAC,WAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,KAAA,qBACVD,IAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,sBAAA;AAAA,gBACV,aAAA,EAAe,sBAAsB,KAAK,CAAA;AAAA,gBAC1C,KAAA,EAAO,GAAG,KAAA,CAAM,KAAK,SAAM,KAAA,CAAM,KAAK,CAAA,IAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,gBACtD,uBAAqB,KAAA,CAAM,aAAA;AAAA,gBAE3B,QAAA,EAAA;AAAA,kCAAAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA6B,aAAA,EAAW,IAAA,EACrD,gBAAM,KAAA,EACT,CAAA;AAAA,kCACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EACb,gBAAM,KAAA,EACT;AAAA;AAAA,eAAA;AAAA,cAZK,KAAA,CAAM;AAAA,aAcd,CAAA,EACH;AAAA,WAAA,EAAA,EAhCU,GAkCd,CAAA;AAAA,QAEJ,CAAC,CAAA,EACH;AAAA;AAAA;AAAA,GACF;AAEJ;AC5GO,SAAS,cAAc,aAAA,EAAoC;AAChE,EAAA,QAAQ,aAAA;AAAe;AAAA,IAErB,KAAK,YAAA;AACH,MAAA,OAAO,YAAA,CAAa,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA;AAAA,IACzD,KAAK,QAAA;AACH,MAAA,OAAO,YAAA,CAAa,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,GAAG,GAAA,EAAK,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA;AAAA,IAGvE,KAAK,QAAA;AACH,MAAA,OAAO,WAAW,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,MAAM,CAAA;AAAA,IAC9C,KAAK,QAAA;AACH,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB,KAAK,MAAA;AACH,MAAA,OAAO,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,MAAM,GAAA,EAAK,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAA;AAAA,IACzE,KAAK,KAAA;AACH,MAAA,OAAO,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,MAAM,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,IAC3E,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,EAAW;AAAA;AAAA,IAGpB,KAAK,aAAA;AACH,MAAA,OAAO,QAAA,CAAS,EAAE,IAAA,EAAM,CAAA,EAAG,MAAM,CAAkB,CAAC,CAAA;AAAA,IACtD,KAAK,cAAA;AACH,MAAA,OAAO,YAAA,EAAa;AAAA,IACtB,KAAK,OAAA;AACH,MAAA,OAAO,OAAA,EAAQ;AAAA,IACjB,KAAK,WAAA;AACH,MAAA,OAAO,cAAA,EAAe;AAAA,IACxB,KAAK,KAAA;AACH,MAAA,OAAO,QAAA,EAAS;AAAA;AAAA,IAGlB,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,CAAW,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACrC,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,CAAW,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACrC,KAAK,WAAA;AACH,MAAA,OAAO,SAAA,CAAU,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,IACtC,KAAK,MAAA;AACH,MAAA,OAAO,SAAA,CAAU,EAAE,SAAA,EAAW,KAAA,EAAO,CAAA;AAAA,IACvC,KAAK,WAAA;AACH,MAAA,OAAO,cAAA,EAAe;AAAA,IACxB,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,EAAW;AAAA;AAAA,IAGpB,KAAK,SAAA;AACH,MAAA,OAAO,QAAA,CAAS,EAAE,OAAA,EAAS,IAAA,EAAM,MAAM,CAAA,EAAG,KAAA,EAAO,OAAO,CAAA;AAAA,IAC1D,KAAK,MAAA;AACH,MAAA,OAAO,QAAA,CAAS,EAAE,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA,EAAG,KAAA,EAAO,OAAO,CAAA;AAAA,IAC3D,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,EAAW;AAAA;AAAA,IAGpB,KAAK,UAAA;AACH,MAAA,OAAO,aAAA,EAAc;AAAA,IACvB,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB,KAAK,aAAA;AACH,MAAA,OAAO,gBAAA,EAAiB;AAAA,IAC1B,KAAK,QAAA;AACH,MAAA,OAAO,WAAA,EAAY;AAAA;AAAA,IAGrB,KAAK,MAAA;AACH,MAAA,OAAO,SAAA,EAAU;AAAA,IACnB,KAAK,OAAA;AACH,MAAA,OAAO,UAAA,EAAW;AAAA,IACpB,KAAK,QAAA;AACH,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB,KAAK,QAAA;AACH,MAAA,OAAO,WAAA,EAAY;AAAA,IACrB,KAAK,QAAA;AACH,MAAA,OAAO,WAAA,EAAY;AAAA,IAErB;AACE,MAAA,OAAO,aAAa,aAAa,CAAA;AAAA;AAEvC;AAKA,SAAS,aAAa,IAAA,EAKN;AACd,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,4BAA4B,IAAA,CAAK,KAAA,GAAQ,WAAA,GAAc,EAAE,CAAA,CAAA,EACtE,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,uBAAOC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,CAAA,GAAK,IAAA;AAAA,oBAC3CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACZ,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,KAAA,EAAO,EAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAC1CA,GAAAA,CAAC,SAAY,SAAA,EAAU,aAAA,EAAA,EAAb,CAA2B,CACtC,CAAA,EACH,CAAA;AAAA,IACC,KAAK,GAAA,mBAAMA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAS,CAAA,GAAK;AAAA,GAAA,EAC3C,CAAA;AAEJ;AAEA,SAAS,WAAW,IAAA,EAMJ;AACd,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,0BAAA,EAA6B,IAAA,CAAK,QAAA,GAAW,cAAA,GAAiB,EAAE,CAAA,EAAG,IAAA,CAAK,KAAA,GAAQ,WAAA,GAAc,EAAE,CAAA,CAAA;AAAA,MAE1G,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,wBAAQC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAQ,CAAA,GAAK,IAAA;AAAA,QACzC,IAAA,CAAK,GAAA,mBACJD,IAAAA,CAAAM,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAL,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,0BACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,SAAA,EACpD,CAAA,GACE,IAAA;AAAA,QACH,KAAK,GAAA,mBAAMA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAS,CAAA,GAAK;AAAA;AAAA;AAAA,GAC3C;AAEJ;AAEA,SAAS,UAAA,GAA0B;AACjC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACjCD,IAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,eAAA,EACrB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBACzBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,KAAA,EAAA,EAJ1C,CAKV,CACD,CAAA,EACH,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,oBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,GAAA,EACpD,CAAA;AAEJ;AAEA,SAAS,UAAA,GAA0B;AACjC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBACxBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAG,CAAA;AAAA,oBAC7CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAO;AAAA,GAAA,EACxB,CAAA;AAEJ;AAEA,SAAS,SAAS,IAAA,EAAuE;AACvF,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,4BAAA;AAAA,MACV,KAAA,EAAO,EAAE,mBAAA,EAAqB,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,MAAA,CAAA,EAAU,gBAAA,EAAkB,CAAA,OAAA,EAAU,IAAA,CAAK,IAAI,CAAA,MAAA,CAAA,EAAS;AAAA,MAExG,gBAAM,IAAA,CAAK,EAAE,QAAQ,IAAA,CAAK,IAAA,GAAO,KAAK,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACrDD,IAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,cAAA,EACpB,QAAA,EAAA;AAAA,QAAgB,gBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAS,CAAA,CAAK;AAAA,wBAC9CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,wBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,wBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,OAAA,EAAA,EAJ1C,CAKV,CACD;AAAA;AAAA,GACH;AAEJ;AAEA,SAAS,YAAA,GAA4B;AACnC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACZ,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,CAAA,qBACjCD,IAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAW,CAAA,cAAA,EAAiB,CAAA,KAAM,CAAA,GAAI,cAAA,GAAiB,EAAE,CAAA,CAAA,EACpE,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,oBAC1BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,oBACzBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,oBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG,CAAA;AAAA,oBAClDA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS;AAAA,GAAA,EAAA,EANhB,CAOV,CACD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,OAAA,GAAuB;AAC9B,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,EAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACjCA,GAAAA,CAAC,SAAY,SAAA,EAAU,cAAA,EAAA,EAAb,CAA4B,CACvC,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,cAAA,GAA8B;AACrC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACxBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG,CAAA;AAAA,sBAClDA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAS,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,EAAO,EAAG;AAAA,KAAA,EACzD,CAAA;AAAA,oBACAA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACjCD,IAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,SAAA,EACrB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACxBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,KAAA,EAAA,EAFxC,CAGV,CACD,CAAA,EACH,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBACjCA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAU,QAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAO,CAAA,GAAI,EAAA,GAAM,EAAG,CAAA,CAAA,CAAA;AAAI,OAAA;AAAA,MAFvC;AAAA,KAIR,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,QAAA,GAAwB;AAC/B,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BACZ,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACjCD,IAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,YAAA,EACrB,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,SAAA,EAAU,OAAO,EAAE,IAAA,EAAM,GAAE,EAAG,CAAA;AAAA,oBAC7CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU;AAAA,GAAA,EAAA,EAFjB,CAGV,CACD,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,WAAW,IAAA,EAAgD;AAClE,EAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAW,kCAAkC,IAAA,CAAK,IAAI,CAAA,CAAA,EACxD,QAAA,EAAA,IAAA,CAAK,IAAA,KAAS,OAAA,mBAAUA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EAAc,CAAA,mBAAKA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA,EACtF,CAAA;AAEJ;AAEA,SAAS,UAAU,IAAA,EAA2C;AAC5D,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,4BAAYC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAgB,CAAA,GAAK,IAAA;AAAA,oBACtDD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,KAAA,EACpD;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,cAAA,GAA8B;AACrC,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAAkC,CAAA;AAC1D;AAEA,SAAS,UAAA,GAA0B;AACjC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EAAO;AAAA,KAAA,EACxB,CAAA;AAAA,oBACAD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBACzBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,KAAA,EACpD,CAAA;AAAA,oBACAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA,EAC1B;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,SAAS,IAAA,EAAuE;AACvF,EAAA,uBACED,KAAC,KAAA,EAAA,EAAI,SAAA,EAAW,6BAA6B,IAAA,CAAK,KAAA,GAAQ,WAAA,GAAc,EAAE,CAAA,CAAA,EACvE,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,0BAAUC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAS,CAAA,GAAK,IAAA;AAAA,IAC5C,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAE,GAAA,CAAI,CAAC,GAAG,CAAA,qBACzCD,IAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,aAAA,EACrB,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBACxBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAG;AAAA,KAAA,EAAA,EAFrC,CAGV,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,SAAS,UAAA,GAA0B;AACjC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EACZ,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,IAAI,CAAC,CAAA,EAAG,sBACjCA,GAAAA,CAAC,SAAY,SAAA,EAAU,QAAA,EAAA,EAAb,CAAsB,CACjC,CAAA,EACH,CAAA;AAAA,IACC,MAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBACjCA,GAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,gBACpB,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAG,CAAA,CAAE,GAAA,CAAI,CAACO,IAAG,CAAA,qBACjCP,GAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,SAAA,EAAA,EAAb,CAAuB,CAClC,CAAA,EAAA,EAHO,CAIV,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,SAAS,aAAA,GAA6B;AACpC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,OAAA,EAAQ,CAAA;AAAA,oBACvBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,GAAA,EACpD,CAAA;AAEJ;AAEA,SAAS,UAAA,GAA0B;AACjC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBACjCA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,SAAA,EAAU,QAAA;AAAA,MACV,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAO,CAAA,GAAI,EAAA,GAAM,EAAG,CAAA,CAAA,CAAA;AAAI,KAAA;AAAA,IAFvC;AAAA,GAIR,CAAA,EACH,CAAA;AAEJ;AAEA,SAAS,gBAAA,GAAgC;AACvC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,CAAA;AAAA,oBAC3BD,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBACzBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,sBACzBA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EAAG;AAAA,KAAA,EACpD;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAA,GAA2B;AAClC,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EAA+B,CAAA;AACvD;AAEA,SAAS,SAAA,GAAyB;AAChC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,oBAC1BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,oBAC1BA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,oBACxBA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EAAyB,CAAA;AAAA,oBACxCA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS;AAAA,GAAA,EAC1B,CAAA;AAEJ;AAEA,SAAS,UAAA,GAA0B;AACjC,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAmC,CAAA;AAC3D;AAEA,SAAS,WAAA,GAA2B;AAClC,EAAA,uBACED,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,SAAI,SAAA,EAAU,SAAA,EAAU,OAAO,EAAE,IAAA,EAAM,GAAE,EAAG,CAAA;AAAA,oBAC7CA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU;AAAA,GAAA,EAC3B,CAAA;AAEJ;AAEA,SAAS,WAAA,GAA2B;AAClC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCACb,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAU,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,IAAS,CAAA,EACpD,CAAA;AAEJ;AAEA,SAAS,WAAA,GAA2B;AAClC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACb,0BAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAiB,CAAA,EAClC,CAAA;AAEJ;AAEA,SAAS,aAAa,KAAA,EAA4B;AAChD,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,kBAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,KAAA,EAAM,CAAA,EAC5C,CAAA;AAEJ;AC3ZA,IAAM,iBAAA,GAAoB,GAAA;AAEnB,SAAS,YAAY,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,GAAU,MAAK,EAAqB;AAC/E,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAKrB,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,UAAA,GAAa,IAAA;AAC/D,EAAA,MAAM,EAAA,GAAK,OAAO,MAAA,KAAW,WAAA,GAAc,OAAO,WAAA,GAAc,GAAA;AAChE,EAAA,MAAM,OAAO,EAAA,GAAK,iBAAA;AAClB,EAAA,MAAM,OAAO,EAAA,GAAK,iBAAA;AAClB,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,IACjB,CAAA;AAAA,IACA,IAAA,CAAK,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,KAAK,KAAA,GAAQ,CAAA;AAAA,IACxC,IAAA,CAAK,MAAA,GAAS,IAAA,GAAO,IAAA,GAAO,KAAK,MAAA,GAAS;AAAA,GAC5C;AACA,EAAA,MAAM,CAAA,GAAI,KAAK,KAAA,GAAQ,KAAA;AACvB,EAAA,MAAM,CAAA,GAAI,KAAK,MAAA,GAAS,KAAA;AAExB,EAAA,uBACED,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,eAAA;AAAA,MACV,aAAA,EAAW,IAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,QAC1B,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,QACzB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAAA,QACnB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AAAA,QACpB,aAAA,EAAe;AAAA,OACjB;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EACb,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,aAAA;AAAA,UACL,KAAA,GAAQ,IAAI,CAAA,MAAA,EAAM,IAAA,CAAK,MAAM,KAAA,GAAQ,GAAG,CAAC,CAAA,CAAA,CAAA,GAAM;AAAA,SAAA,EAClD,CAAA;AAAA,wBAGAC,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAyB,QAAA,EAAA,aAAA,CAAc,IAAA,CAAK,aAAa,CAAA,EAAE,CAAA;AAAA,wBAG1ED,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,UAAE,MAAA;AAAA,UAAE,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM;AAAA,SAAA,EAClD;AAAA;AAAA;AAAA,GACF;AAEJ;ACzCA,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,eAAA,GAAkB,EAAA;AAEjB,SAAS,iBAAA,CAAkB;AAAA,EAChC,OAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA,GAAc,+BAAA;AAAA,EACd,QAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAII,SAAS,EAAE,CAAA;AACnC,EAAA,MAAM,QAAA,GAAWN,OAAgC,IAAI,CAAA;AAKrD,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,SAAS,OAAA,EAAS,KAAA,IAAS,CAAC,CAAA;AACvD,IAAA,OAAO,MAAM,aAAa,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,eAAe,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,eAAe,CAAA;AAElD,EAAA,uBACEC,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qBAAA;AAAA,MACV,KAAA,EAAO,EAAE,QAAA,EAAU,OAAA,EAAS,MAAM,GAAA,EAAI;AAAA,MACtC,IAAA,EAAK,QAAA;AAAA,MACL,YAAA,EAAY,sBAAsB,SAAS,CAAA,CAAA;AAAA,MAE3C,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,wBACtDA,GAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,QAAA;AAAA,YACL,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,2BAAA;AAAA,YACV,KAAA,EAAO,IAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACvC,WAAA;AAAA,YACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAC7B,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,QAAA,EAAS;AAAA,cACX;AAAA,YACF;AAAA;AAAA,SACF;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,4BAAA;AAAA,YACV,OAAA,EAAS,QAAA;AAAA,YACT,YAAA,EAAW,QAAA;AAAA,YACX,KAAA,EAAM,cAAA;AAAA,YACP,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBACAA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,4BAAA;AAAA,YACV,OAAA,EAAS,MAAM,QAAA,CAAS,IAAI,CAAA;AAAA,YAC5B,YAAA,EAAW,MAAA;AAAA,YACX,KAAA,EAAM,cAAA;AAAA,YACP,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;;;ACzFA,IAAM,kBAAA,uBAAyB,GAAA,CAAI;AAAA,EACjC,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,WAAA,GAAc,4BAAA;AACpB,IAAM,iBAAA,GAAoB,mBAAA;AAG1B,IAAM,SAAA,GAAY,CAAA;AAmBX,SAAS,yBAAA,CACd,OAAA,GAAyB,EAAC,EACF;AACxB,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,IAAO,QAAA;AAC3B,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,KAAQ,GAAA,CAAI,WAAA,IAAe,MAAA,CAAA;AAC/C,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,EAAA,IAAI,CAAC,MAAM,OAAO,GAAA;AAKlB,EAAA,MAAM,QAAmD,CAAC,EAAE,IAAI,IAAA,EAAM,KAAA,EAAO,GAAG,CAAA;AAChF,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAiB;AAElC,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAM,GAAI,MAAM,KAAA,EAAM;AAClC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAGX,IAAA,IAAI,EAAA,CAAG,OAAA,CAAQ,CAAA,CAAA,EAAI,iBAAiB,GAAG,CAAA,EAAG;AAE1C,IAAA,IAAI,KAAA,GAAQ,CAAA,IAAK,eAAA,CAAgB,EAAE,CAAA,EAAG;AACpC,MAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AAEnC,MAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AACjC,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,OAAA,EAAS,EAAA;AAAA,QACT,IAAA,EAAM;AAAA,UACJ,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,OAAA;AAAA,UACb,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,QAAQ,CAAA,CAAE;AAAA,SACZ;AAAA,QACA,KAAA,EAAO,gBAAgB,EAAE,CAAA;AAAA,QACzB,QAAA,EAAU,oBAAoB,EAAE;AAAA,OACjC,CAAA;AAGD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,QAAQ,CAAA,EAAG;AAC3C,QAAA,KAAA,CAAM,KAAK,EAAE,EAAA,EAAI,OAAsB,KAAA,EAAO,KAAA,GAAQ,GAAG,CAAA;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,gBAAgB,EAAA,EAA0B;AACjD,EAAA,IAAI,EAAA,CAAG,YAAA,CAAa,WAAW,CAAA,EAAG,OAAO,IAAA;AACzC,EAAA,OAAO,kBAAA,CAAmB,GAAA,CAAI,EAAA,CAAG,OAAO,CAAA;AAC1C;AAMA,SAAS,gBAAgB,EAAA,EAAyB;AAChD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AAEnC,EAAA,MAAM,IAAA,GAAO,EAAA,CAAG,YAAA,CAAa,YAAY,CAAA;AACzC,EAAA,IAAI,MAAM,OAAO,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAU,EAAA,CAAG,aAAA,CAAc,0CAA0C,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAO,OAAA,EAAS,WAAA,EAAa,IAAA,EAAK;AACxC,EAAA,IAAI,IAAA,SAAa,CAAA,EAAG,GAAG,KAAKQ,SAAAA,CAAS,IAAA,EAAM,EAAE,CAAC,CAAA,CAAA,CAAA;AAE9C,EAAA,IAAI,GAAG,EAAA,EAAI,OAAO,GAAG,GAAG,CAAA,EAAA,EAAK,GAAG,EAAE,CAAA,CAAA;AAClC,EAAA,OAAO,GAAA;AACT;AAQA,SAAS,oBAAoB,EAAA,EAAyB;AACpD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,EAAA,IAAI,GAAG,EAAA,EAAI,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,SAAA,CAAU,CAAC,CAAA;AAC5B,EAAA,IAAI,KAAA,EAAO,OAAO,CAAA,EAAG,GAAG,IAAI,KAAK,CAAA,CAAA;AACjC,EAAA,OAAO,GAAA;AACT;AAEA,SAASA,SAAAA,CAAS,GAAW,CAAA,EAAmB;AAC9C,EAAA,OAAO,CAAA,CAAE,UAAU,CAAA,GAAI,CAAA,GAAI,EAAE,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,GAAI,QAAA;AACjD;AAQO,SAAS,cAAA,CACd,QAAA,EACA,SAAA,EACA,SAAA,EACA,MAAc,MAAA,EACe;AAC7B,EAAA,MAAM,IAAA,GAAO,YAAY,GAAA,CAAI,OAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,YAAY,GAAA,CAAI,OAAA;AAC7B,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,MAAM,IAAI,CAAA,CAAE,IAAA;AACZ,IAAA,IACE,IAAA,IAAQ,CAAA,CAAE,CAAA,IACV,IAAA,GAAO,EAAE,CAAA,GAAI,CAAA,CAAE,KAAA,IACf,IAAA,IAAQ,EAAE,CAAA,IACV,IAAA,GAAO,CAAA,CAAE,CAAA,GAAI,EAAE,MAAA,EACf;AACA,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;ACrIO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAO,EAA0B;AAClE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIL,QAAAA,CAAiC,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAiB,EAAE,CAAA;AAGjD,EAAAL,UAAU,MAAM;AACd,IAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,yBAAA,EAA2B,CAAA;AAC/D,IAAA,SAAA,EAAU;AAEV,IAAA,MAAM,cAAA,GAAiB,MAAM,SAAA,EAAU;AACvC,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,cAAA,EAAgB,EAAE,OAAA,EAAS,MAAM,CAAA;AACnE,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,cAAc,CAAA;AAKhD,IAAA,MAAM,EAAA,GAAK,IAAI,gBAAA,CAAiB,MAAM,WAAW,CAAA;AACjD,IAAA,EAAA,CAAG,OAAA,CAAQ,SAAS,IAAA,EAAM;AAAA,MACxB,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,eAAA,EAAiB,CAAC,OAAA,EAAS,IAAA,EAAM,4BAA4B;AAAA,KAC9D,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,cAAc,CAAA;AACnD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,cAAc,CAAA;AACnD,MAAA,EAAA,CAAG,UAAA,EAAW;AAAA,IAChB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAOL,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AAEpB,MAAA,MAAM,IAAA,GAAO,EAAE,YAAA,EAAa;AAC5B,MAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,QAAA,IAAI,IAAA,YAAgB,WAAA,IAAe,IAAA,CAAK,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AACtE,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,MAAM,cAAA,CAAe,QAAA,EAAU,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AACzD,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,CAAA,CAAE,cAAA,EAAe;AACjB,MAAA,MAAA;AAAA,QACE,GAAA,CAAI,OAAA;AAAA,QACJ,GAAA,CAAI,IAAA;AAAA,QACJ,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA;AAAQ,OAC/B;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,aAAA,EAAe,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAChE,IAAA,OAAO,MAAM,OAAO,mBAAA,CAAoB,aAAA,EAAe,QAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EAClF,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAIrB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,MAAM,MAAM,cAAA,CAAe,QAAA,EAAU,CAAA,CAAE,OAAA,EAAS,EAAE,OAAO,CAAA;AACzD,MAAA,MAAM,EAAA,GAAK,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,GAAI,EAAA;AACzC,MAAA,UAAA,CAAW,CAAC,IAAA,KAAU,IAAA,KAAS,EAAA,GAAK,OAAO,EAAG,CAAA;AAAA,IAChD,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,aAAA,EAAe,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAChE,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,aAAA,EAAe,MAAM,CAAA;AAAA,EAC/D,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACEE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EAA0B,aAAA,EAAW,IAAA,EACjD,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAItB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,OAAA;AAC/B,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,OAAA;AAC9B,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QAEC,SAAA,EAAW,CAAA,yBAAA,EAA4B,OAAA,KAAY,CAAA,GAAI,cAAc,EAAE,CAAA,CAAA;AAAA,QACvE,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,IAAA;AAAA,UACA,GAAA;AAAA,UACA,KAAA,EAAO,EAAE,IAAA,CAAK,KAAA;AAAA,UACd,MAAA,EAAQ,EAAE,IAAA,CAAK,MAAA;AAAA,UACf,aAAA,EAAe;AAAA,SACjB;AAAA,QACA,8BAA4B,CAAA,CAAE,KAAA;AAAA,QAE9B,0BAAAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,YAAE,KAAA,EAAM;AAAA,OAAA;AAAA,MAZ9C,CAAA,EAAG,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,KAazB;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;ACzFO,SAAS,yBAAyB,KAAA,EAAwC;AAC/E,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,QAAA;AACzB,EAAA,MAAM,GAAA,GAAM,IAAI,WAAA,IAAe,MAAA;AAE/B,EAAA,MAAM,IAAA,GACJ,IAAI,UAAA,GAAa,CAAA,GACZ,MAAM,OAAA,CAAQ,CAAA,GAAI,GAAA,CAAI,UAAA,GAAc,GAAA,GACrC,CAAA;AACN,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,CAAA,GAAI,KAAA,CAAM,OAAA;AAMrC,EAAA,IAAI,QAAA,GAAW,UAAA;AACf,EAAA,IAAI,OAAA,GAAU,MAAA;AACd,EAAA,IAAI,eAAA;AACJ,EAAA,IAAI,QAAA,GAAsD,IAAA;AAE1D,EAAA,IAAI,KAAA,CAAM,yBAAyB,KAAA,EAAO;AACxC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,IAAI,gBAAA,CAAiB,KAAA,CAAM,QAAQ,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAC,CAAA;AACjE,MAAA,MAAM,YACJ,GAAA,IAAO,CAAC,IAAI,OAAA,CAAQ,qBAAqB,IACpC,GAAA,GACD,IAAA;AACN,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,QAAA,GAAW,uBAAuB,SAAS,CAAA;AAC3C,QAAA,OAAA,GAAU,SAAA,CAAU,QAAQ,WAAA,EAAY;AAGxC,QAAA,eAAA,GAAkB,gBAAgB,SAAS,CAAA;AAC3C,QAAA,QAAA,GAAWS,gBAAgB,SAAA,EAAW;AAAA,UACpC,MAAA,EAAQ,MAAM,MAAA,IAAU,UAAA;AAAA,UACxB,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA,GAASC,MAAAA,CAAO,CAAC,CAAA;AAAA,IACrB,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAA,MAAU,CAAA,QAAA,EAAW,KAAA,CAAM,KAAK,aAAa,CAAA,eAAA,CAAA;AAAA,IACpE,WAAA,EAAa,QAAA;AAAA,IACb,OAAA,EAAS,OAAA;AAAA,IACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA;AAAA,IAEpB,CAAA,EAAG,QAAQ,IAAI,CAAA;AAAA,IACf,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,IAC/B,GAAA,EAAK,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,IAAA,GAAO,MAAA;AAAA,IACvD,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,WAAA,EAAa,eAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,aAAA,EAAe,MAAM,IAAA,CAAK,aAAA;AAAA,MAC1B,KAAA,EAAO,MAAM,IAAA,CAAK,KAAA;AAAA,MAClB,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA;AAAA,MACnB,SAAS,KAAA,CAAM;AAAA,KACjB;AAAA;AAAA;AAAA,IAGA,UAAA,EAAY,UAAU,UAAA,IAAc,MAAA;AAAA,IACpC,eAAA,EAAiB,UAAU,eAAA,IAAmB,MAAA;AAAA,IAC9C,UAAA,EAAY,UAAU,UAAA,IAAc,MAAA;AAAA,IACpC,UAAA,EAAY,UAAU,UAAA,IAAc,MAAA;AAAA,IACpC,YAAA,EAAc,UAAU,YAAA,IAAgB,MAAA;AAAA,IACxC,UAAA,EAAY,UAAU,UAAA,IAAc,MAAA;AAAA,IACpC,WAAA,EAAa,UAAU,WAAA,IAAe;AAAA,GACxC;AACF;AAEA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,CAAA;AAChC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACrC;AAmBO,SAAS,yBAAyB,KAAA,EAAwC;AAC/E,EAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,QAAA;AACzB,EAAA,MAAM,GAAA,GAAM,IAAI,WAAA,IAAe,MAAA;AAI/B,EAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,KAAA,CAAM,MAAM,CAAA;AACvD,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAY;AAC7C,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAA;AAChD,EAAA,MAAM,EAAA,GAAKD,eAAAA,CAAgB,KAAA,CAAM,MAAA,EAAQ;AAAA,IACvC,MAAA,EAAQ,MAAM,MAAA,IAAU,UAAA;AAAA,IACxB,YAAA,EAAc;AAAA,GACf,CAAA;AAKD,EAAA,MAAM,IAAA,GACJ,GAAA,CAAI,UAAA,GAAa,CAAA,GAAA,CACX,KAAA,CAAM,WAAA,CAAY,CAAA,GAAI,KAAA,CAAM,WAAA,CAAY,KAAA,GAAQ,CAAA,IAAK,GAAA,CAAI,aAAc,GAAA,GACzE,CAAA;AACN,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,YAAY,CAAC,CAAA;AAK3C,EAAA,MAAM,QAAA,GACJ,mBAAA,CAAoB,KAAA,CAAM,MAAM,CAAA,IAAK,GAAA;AAEvC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA,GAASC,MAAAA,CAAO,CAAC,CAAA;AAAA,IACrB,SAAS,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAK,IAAK,aAAa,GAAG,CAAA,CAAA;AAAA,IACjD,WAAA;AAAA,IACA,OAAA,EAAS,GAAA;AAAA,IACT,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,CAAA,EAAG,QAAQ,IAAI,CAAA;AAAA,IACf,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA;AAAA,IACnB,GAAA,EAAK,OAAO,QAAA,KAAa,WAAA,GAAc,SAAS,IAAA,GAAO,MAAA;AAAA,IACvD,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,WAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,QAAA;AAAA,MACA,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAY;AAAA,MAC1C,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,aAAa,KAAA,CAAM;AAAA,KACrB;AAAA,IACA,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,IAC7B,eAAA,EAAiB,GAAG,eAAA,IAAmB,MAAA;AAAA,IACvC,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,IAC7B,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,IAC7B,YAAA,EAAc,GAAG,YAAA,IAAgB,MAAA;AAAA,IACjC,UAAA,EAAY,GAAG,UAAA,IAAc,MAAA;AAAA,IAC7B,WAAA,EAAa,GAAG,WAAA,IAAe;AAAA,GACjC;AACF;AAGA,SAAS,oBAAoB,EAAA,EAAyB;AACpD,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAY;AACnC,EAAA,IAAI,GAAG,EAAA,EAAI,OAAO,GAAG,GAAG,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,SAAA,CAAU,CAAC,CAAA;AAC1B,EAAA,IAAI,GAAA,EAAK,OAAO,CAAA,EAAG,GAAG,IAAI,GAAG,CAAA,CAAA;AAC7B,EAAA,OAAO,GAAA;AACT;ACxJA,IAAM,yBAAA,GAA4B,EAAA;AAE3B,SAAS,UAAA,CAAW,EAAE,MAAA,EAAQ,KAAA,EAAM,EAAoB;AAC7D,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAMtD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIP,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,yBAAyB,CAAA;AAClF,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAS,EAAE,CAAA;AAC3D,EAAA,MAAM,kBAAkB,MAAM,cAAA,CAAe,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,aAAA,GAAgB,MAAM,cAAA,CAAe,KAAK,CAAA;AAGhD,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAA4B;AAC/C,IAAA,IAAI,CAAC,aAAa,OAAO,OAAA;AACzB,IAAA,MAAM,OAAA,GAAU,iBAAiB,IAAA,EAAK;AACtC,IAAA,IAAI,CAAC,SAAS,OAAO,OAAA;AACrB,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,EAAK;AAC1B,IAAA,OAAO,CAAA,oBAAA,EAAuB,OAAO,CAAA,EAAA,EAAK,IAAA,IAAQ,cAAc,CAAA,CAAA;AAAA,EAClE,CAAA;AAGA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAA8C,OAAA,KAAsC;AACtG,IAAA,MAAA,CAAO,eAAA,CAAgB,MAAM,OAAO,CAAA;AAAA,EACtC,CAAA;AAGA,EAAA,MAAM,iBAAA,GAAoB,CACxB,MAAA,EACA,YAAA,EACA,OAAA,KACG;AACH,IAAA,MAAA,CAAO,WAAA,CAAY,MAAA,EAAQ,YAAA,EAAc,OAAO,CAAA;AAAA,EAClD,CAAA;AAGA,EAAA,MAAM,UAAA,GACJ,KAAA,CAAM,IAAA,KAAS,eAAA,IAAmB,MAAM,IAAA,KAAS,mBAAA;AAEnD,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA;AAAA,IAClD,CAAA;AACA,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAoB;AAChC,MAAA,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,CAAE,SAAS,CAAA;AAAA,IAClD,CAAA;AAGA,IAAA,MAAA,CAAO,iBAAiB,aAAA,EAAe,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAChE,IAAA,MAAA,CAAO,iBAAiB,WAAA,EAAa,IAAA,EAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AAC5D,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,UAAU,CAAC,CAAA;AAGvB,EAAA,MAAM,qBAAA,GAAwB,CAAC,OAAA,KAAoB;AACjD,IAAA,IAAI,MAAM,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,SAAA,CAAU,SAAS,WAAA,EAAa;AACzE,IAAA,MAAM,aAAa,wBAAA,CAAyB;AAAA,MAC1C,IAAA,EAAM,MAAM,SAAA,CAAU,IAAA;AAAA,MACtB,OAAA,EAAS,MAAM,SAAA,CAAU,OAAA;AAAA,MACzB,OAAA,EAAS,MAAM,SAAA,CAAU,OAAA;AAAA,MACzB,OAAA,EAAS,YAAY,OAAO,CAAA;AAAA,MAC5B,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,aAAA,CAAc,UAAU,CAAA;AACxB,IAAA,MAAA,CAAO,MAAA,EAAO;AAAA,EAChB,CAAA;AACA,EAAA,MAAM,qBAAA,GAAwB,CAAC,OAAA,KAAoB;AACjD,IAAA,IAAI,MAAM,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,SAAA,CAAU,SAAS,WAAA,EAAa;AACzE,IAAA,MAAM,MAAM,KAAA,CAAM,SAAA;AAIlB,IAAA,MAAM,aAAa,wBAAA,CAAyB;AAAA,MAC1C,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,aAAa,GAAA,CAAI,WAAA;AAAA,MACjB,OAAA,EAAS,YAAY,OAAO,CAAA;AAAA,MAC5B,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,aAAA,CAAc,UAAU,CAAA;AACxB,IAAA,MAAA,CAAO,MAAA,EAAO;AAAA,EAChB,CAAA;AACA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAEjC,IAAA,MAAA,CAAO,MAAA,EAAO;AAAA,EAChB,CAAA;AAEA,EAAA,uBACEC,IAAAA,CAAAM,QAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,WAAA,mBACCL,GAAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,gBAAA;AAAA,QACT,eAAA,EAAiB,mBAAA;AAAA,QACjB,OAAA,EAAS,gBAAA;AAAA,QACT,eAAA,EAAiB,mBAAA;AAAA,QACjB,MAAA,EAAQ;AAAA;AAAA,KACV,GACE,IAAA;AAAA,oBAKJA,IAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,oBAClBA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,UAAA;AAAA,QACR,WAAA;AAAA,QACA,iBAAA,EAAmB;AAAA;AAAA,KACrB;AAAA,IAKC,KAAA,CAAM,IAAA,KAAS,YAAA,IAAgB,CAAC,WAAA,mBAC/BA,GAAAA,CAAC,gBAAA,EAAA,EAAiB,MAAA,EAAQ,iBAAA,EAAmB,CAAA,GAC3C,IAAA;AAAA,IACH,KAAA,CAAM,IAAA,KAAS,eAAA,mBACdA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,CAAA,GACrD,IAAA;AAAA,IACH,MAAM,IAAA,KAAS,mBAAA;AAAA;AAAA;AAAA,sBAGdA,GAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM;AAAA,YACJ,aAAA,EAAe,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAY;AAAA,YAChD,KAAA,EAAO,MAAM,YAAA,CAAa,KAAA;AAAA,YAC1B,MAAA,EAAQ,MAAM,YAAA,CAAa;AAAA,WAC7B;AAAA,UACA,SAAS,KAAA,CAAM;AAAA;AAAA;AACjB,QACE,IAAA;AAAA,IACH,MAAM,IAAA,KAAS,YAAA,IAAgB,MAAM,SAAA,CAAU,IAAA,KAAS,8BACvDA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,MAAM,SAAA,CAAU,OAAA;AAAA,QACzB,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,aAAA;AAAA,QAChC,WAAA,EAAY,+BAAA;AAAA,QACZ,QAAA,EAAU,qBAAA;AAAA,QACV,QAAA,EAAU;AAAA;AAAA,KACZ,GACE,IAAA;AAAA,IACH,MAAM,IAAA,KAAS,YAAA,IAAgB,MAAM,SAAA,CAAU,IAAA,KAAS,8BACvDA,GAAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QAGC,OAAA,EAAS;AAAA,UACP,CAAA,EAAG,KAAA,CAAM,SAAA,CAAU,WAAA,CAAY,IAAI,MAAA,CAAO,OAAA;AAAA,UAC1C,CAAA,EAAG,KAAA,CAAM,SAAA,CAAU,WAAA,CAAY,IAAI,MAAA,CAAO;AAAA,SAC5C;AAAA,QACA,WAAW,CAAA,KAAA,EAAQ,KAAA,CAAM,UAAU,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,CAAA;AAAA,QAC/D,WAAA,EAAY,mBAAA;AAAA,QACZ,QAAA,EAAU,qBAAA;AAAA,QACV,QAAA,EAAU;AAAA;AAAA,KACZ,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AA6BO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,OAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,SAAA,GAAYW,QAAAA,CAAQ,OAAA,GAAU,GAAG,CAAA;AAEvC,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqC;AAC1D,IAAA,eAAA,CAAgB,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,EACxC,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAwC;AAC7D,IAAA,eAAA,CAAgB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,EAChC,CAAA;AAEA,EAAA,uBACEZ,IAAAA,CAAAM,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAL,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,wBAAA;AAAA,QACV,aAAA,EAAW,IAAA;AAAA,QACX,KAAA,EAAO;AAAA,UACL,QAAA,EAAU,OAAA;AAAA,UACV,KAAA,EAAO,CAAA;AAAA,UACP,UAAA,EAAY,SAAA;AAAA,UACZ,OAAA,EAAS,SAAA;AAAA,UACT,aAAA,EAAe,MAAA;AAAA;AAAA;AAAA,UAGf,MAAA,EAAQ;AAAA;AACV;AAAA,KACF;AAAA,oBACAD,IAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,4BAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,oBAAA;AAAA,QAEX,QAAA,EAAA;AAAA,0BAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,IAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA;AAAA,cAAA,MAAA;AAAA,8BAEzCC,GAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,GAAA,EAAK,CAAA;AAAA,kBACL,GAAA,EAAK,GAAA;AAAA,kBACL,IAAA,EAAM,CAAA;AAAA,kBACN,KAAA,EAAO,OAAA;AAAA,kBACP,QAAA,EAAU,aAAA;AAAA,kBACV,SAAA,EAAU,0BAAA;AAAA,kBACV,YAAA,EAAW;AAAA;AAAA,eACb;AAAA,8BACAD,IAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,gBAAE;AAAA,eAAA,EAAC;AAAA,aAAA,EAClE,CAAA;AAAA,4BACAC,GAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAA,EAAU,wBAAA;AAAA,gBACV,OAAA,EAAS,MAAA;AAAA,gBACT,KAAA,EAAM,qBAAA;AAAA,gBACN,YAAA,EAAW,qBAAA;AAAA,gBACZ,QAAA,EAAA;AAAA;AAAA;AAED,WAAA,EACF,CAAA;AAAA,0BACAA,GAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,2BAAA;AAAA,cACV,KAAA,EAAO,OAAA;AAAA,cACP,QAAA,EAAU,aAAA;AAAA,cACV,WAAA,EAAY,sEAAA;AAAA,cACZ,IAAA,EAAM,CAAA;AAAA,cACN,YAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AAEA,SAASW,SAAQ,CAAA,EAAmB;AAClC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,CAAA;AAChC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAA;AACnC;AAcA,SAAS,gBAAA,GAAmB;AAC1B,EAAA,MAAM,cAAc,kBAAA,EAAmB;AACvC,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC7C,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,CAAOC,qBAAqB,CAAA;AAE3D,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIT,SAAwB,IAAI,CAAA;AAKhE,EAAA,MAAM,GAAG,aAAa,CAAA,GAAIA,SAAS,CAAC,CAAA;AACpC,EAAAL,UAAU,MAAM;AACd,IAAA,MAAM,WAAW,MAAM,aAAA,CAAc,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AACjD,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAC7C,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,UAAA,EAAY;AACpC,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,uBACEE,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,aAAA,EAAa,KAAA,EAChD,QAAA,EAAA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,qBACfA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MAEC,UAAA,EAAY,CAAA;AAAA,MACZ,QAAA,EAAU,EAAE,EAAA,KAAO,UAAA;AAAA,MACnB,QAAA,EAAU,MAAM,aAAA,CAAc,CAAA,CAAE,EAAE,CAAA;AAAA,MAClC,UAAA,EAAY,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,MACpC,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AAChB,QAAA,MAAA,CAAO,CAAA,CAAE,EAAA,EAAI,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA,MACvB,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,QAAA,MAAA,CAAO,EAAE,EAAA,EAAI;AAAA,UACX,CAAA,EAAG,KAAA,CAAM,CAAA,IAAK,CAAA,CAAE,CAAA;AAAA,UAChB,CAAA,EAAG,KAAA,CAAM,CAAA,IAAK,CAAA,CAAE,CAAA;AAAA,UAChB,WAAW,EAAE,GAAG,EAAE,SAAA,EAAY,GAAG,MAAM,SAAA;AAAU,SAClD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,MAAA,CAAO,EAAE,EAAE,CAAA;AACX,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,KAAA;AAAA,IAlBK,CAAA,CAAE;AAAA,GAoBV,CAAA,EACH,CAAA;AAEJ;AA4BA,IAAM,qBAAA,GAAwB,CAAA;AAc9B,SAAS,SAAA,CAAU;AAAA,EACjB,UAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,IAAI,UAAA,CAAW,SAAA;AACrB,EAAA,MAAM,KAAK,MAAA,CAAO,UAAA;AAIlB,EAAA,MAAM,OAAA,GAAW,UAAA,CAAW,CAAA,GAAI,GAAA,GAAO,EAAA;AACvC,EAAA,MAAM,SAAS,UAAA,CAAW,CAAA;AAC1B,EAAA,MAAM,QAAA,GAAW,UAAU,MAAA,CAAO,OAAA;AAClC,EAAA,MAAM,OAAA,GAAU,SAAS,MAAA,CAAO,OAAA;AAIhC,EAAA,MAAM,qBAAA,GAAwB,CAAC,CAAA,KAAyC;AAGtE,IAAA,IAAI,CAAA,CAAE,WAAW,CAAA,EAAG;AACpB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,IAAA,MAAM,eAAe,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAClD,IAAA,MAAM,YAAA,GAAe,OAAA;AACrB,IAAA,MAAM,WAAA,GAAc,MAAA;AACpB,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB;AACzC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,YAAA,CAAa,CAAA;AACpC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,YAAA,CAAa,CAAA;AACpC,MAAA,IAAI,CAAC,QAAA,IAAY,IAAA,CAAK,GAAA,CAAI,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,qBAAA,EAAuB;AAGtE,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,IAAI,CAAC,UAAU,QAAA,EAAS;AAAA,MAC1B;AACA,MAAA,MAAM,cAAc,YAAA,GAAe,EAAA;AACnC,MAAA,MAAM,aAAa,WAAA,GAAc,EAAA;AACjC,MAAA,MAAA;AAAA,QACE,KAAK,CAAA,GAAI,WAAA,CAAa,WAAA,GAAc,EAAA,GAAM,GAAG,CAAA,GAAI,CAAA;AAAA,QACjD,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC;AAAA,OACpC;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACvD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,WAAW,CAAA;AAGnD,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU,QAAA,EAAS;AAAA,IACvC,CAAA;AAEA,IAAA,MAAA,CAAO,iBAAiB,aAAA,EAAe,aAAA,EAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AACvE,IAAA,MAAA,CAAO,iBAAiB,WAAA,EAAa,WAAA,EAAa,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EACrE,CAAA;AAIA,EAAA,MAAM,iBAAA,GACJ,CAAC,MAAA,KAAyB,CAAC,CAAA,KAAyC;AAClE,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,MAAM,eAAe,EAAE,CAAA,EAAG,EAAE,OAAA,EAAS,CAAA,EAAG,EAAE,OAAA,EAAQ;AAClD,IAAA,MAAM,SAAS,CAAA,CAAE,KAAA;AACjB,IAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,IAAA,MAAM,YAAA,GAAe,OAAA;AACrB,IAAA,MAAM,WAAA,GAAc,MAAA;AAEpB,IAAA,MAAMa,OAAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,YAAA,CAAa,CAAA;AACpC,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,YAAA,CAAa,CAAA;AACpC,MAAA,IAAI,KAAA,GAAQ,MAAA;AACZ,MAAA,IAAI,KAAA,GAAQ,MAAA;AACZ,MAAA,IAAI,WAAA,GAAc,YAAA;AAClB,MAAA,IAAI,UAAA,GAAa,WAAA;AAEjB,MAAA,IAAI,MAAA,KAAW,QAAQ,MAAA,KAAW,IAAA,UAAc,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAA,GAAS,EAAE,CAAA;AACxE,MAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,IAAA,EAAM;AACtC,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAA,GAAS,EAAE,CAAA;AAChC,QAAA,WAAA,GAAc,gBAAgB,MAAA,GAAS,KAAA,CAAA;AAAA,MACzC;AACA,MAAA,IAAI,MAAA,KAAW,QAAQ,MAAA,KAAW,IAAA,UAAc,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAA,GAAS,EAAE,CAAA;AACxE,MAAA,IAAI,MAAA,KAAW,IAAA,IAAQ,MAAA,KAAW,IAAA,EAAM;AACtC,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,MAAA,GAAS,EAAE,CAAA;AAChC,QAAA,UAAA,GAAa,eAAe,MAAA,GAAS,KAAA,CAAA;AAAA,MACvC;AAEA,MAAA,QAAA,CAAS;AAAA,QACP,GAAG,EAAA,GAAK,CAAA,GAAI,YAAa,WAAA,GAAc,EAAA,GAAM,GAAG,CAAA,GAAI,CAAA;AAAA,QACpD,GAAG,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA;AAAA,QACrC,SAAA,EAAW;AAAA,UACT,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,UACvB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,KAAK;AAAA;AAC1B,OACD,CAAA;AAAA,IACH,CAAA;AACA,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAeA,OAAM,CAAA;AAChD,MAAA,MAAA,CAAO,mBAAA,CAAoB,aAAa,IAAI,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,aAAA,EAAeA,OAAAA,EAAQ,EAAE,OAAA,EAAS,MAAM,CAAA;AAChE,IAAA,MAAA,CAAO,iBAAiB,WAAA,EAAa,IAAA,EAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EAC9D,CAAA;AAOF,EAAA,uBACEd,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,cAAA,EAAiB,QAAA,GAAW,cAAA,GAAiB,EAAE,CAAA,CAAA;AAAA,MAC1D,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,OAAA;AAAA,QACV,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,QACzB,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAAA,QACvB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAAA,QACzB,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAM;AAAA,OAC7B;AAAA,MACA,aAAA,EAAe,qBAAA;AAAA,MACf,uBAAqB,CAAA,CAAE,aAAA;AAAA,MAEvB,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAA,EAAsB,YAAE,aAAA,EAAc,CAAA;AAAA,wBACtDA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAA0B,QAAA,EAAA,aAAA,CAAc,CAAA,CAAE,aAAa,CAAA,EAAE,CAAA;AAAA,QAEvE,QAAA,mBACCD,IAAAA,CAAAM,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAL,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA8B,aAAA,EAAe,iBAAA,CAAkB,IAAI,CAAA,EAAG,CAAA;AAAA,0BACrFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA8B,aAAA,EAAe,iBAAA,CAAkB,IAAI,CAAA,EAAG,CAAA;AAAA,0BACrFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA8B,aAAA,EAAe,iBAAA,CAAkB,IAAI,CAAA,EAAG,CAAA;AAAA,0BACrFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAA8B,aAAA,EAAe,iBAAA,CAAkB,IAAI,CAAA,EAAG,CAAA;AAAA,0BACrFA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,uBAAA;AAAA,cACV,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,cACxC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,QAAA,EAAS;AAAA,cACX,CAAA;AAAA,cACA,YAAA,EAAY,CAAA,OAAA,EAAU,CAAA,CAAE,aAAa,CAAA,UAAA,CAAA;AAAA,cACrC,KAAA,EAAM,kBAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA,WAED;AAAA,0BAIAA,GAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,SAAA,EAAU,yBAAA;AAAA,cACV,aAAA,EAAe,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,cACxC,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,UAAA,EAAW;AAAA,cACb,CAAA;AAAA,cACA,YAAA,EAAW,UAAA;AAAA,cACX,KAAA,EAAM,cAAA;AAAA,cACP,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EACF,CAAA,GACE;AAAA;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,CAAA;AAChC,EAAA,OAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACrC;AC3kBO,SAAS,WAAA,CAAY;AAAA,EAC1B,MAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIG,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,SAAS,KAAK,CAAA;AAG1C,EAAA,MAAM,WAAW,MAAM;AACrB,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA;AACA,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,IAAA,WAAA,CAAY,KAAK,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,cAAA,CAAe,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACtD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACpD,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACxC,EAAA,MAAM,WAAA,GAAc,eAAe,MAAM,CAAA;AAKzC,EAAA,MAAM,GAAG,aAAa,CAAA,GAAIA,SAAS,CAAC,CAAA;AACpC,EAAAL,UAAU,MAAM;AACd,IAAA,IAAI,UAAU,QAAA,IAAY,OAAO,WAAW,WAAA,IAAe,CAAC,OAAO,UAAA,EAAY;AAC7E,MAAA;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AAC3D,IAAA,MAAM,WAAW,MAAM,aAAA,CAAc,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA;AACjD,IAAA,EAAA,CAAG,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AACtC,IAAA,OAAO,MAAM,EAAA,CAAG,mBAAA,CAAoB,QAAA,EAAU,QAAQ,CAAA;AAAA,EACxD,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,MAAM,aAAA,GAAgB,aAAa,KAAK,CAAA;AAGxC,EAAAA,UAAU,MAAM;AACd,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,iBAAA,EAAmB,WAAW,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,IAAA,EAAM,WAAW,CAAC,CAAA;AAItB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAA,CAAK,YAAA,CAAa,sBAAsB,aAAa,CAAA;AAAA,EACvD,CAAA,EAAG,CAAC,IAAA,EAAM,aAAa,CAAC,CAAA;AAKxB,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,KAAK,cAAA,EAAe,CAAE,IAAA,CAAK,CAAC,GAAA,KAAQ;AAClC,MAAA,IAAI,aAAa,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,CAAE,WAAW,CAAA,EAAG;AAChD,MAAA,cAAA,CAAe,QAAA,EAAS,CAAE,cAAA,CAAe,GAAG,CAAA;AAAA,IAC9C,CAAC,CAAA;AACD,IAAA,OAAO,MAAM;AAAE,MAAA,SAAA,GAAY,IAAA;AAAA,IAAM,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAOL,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,QAAQ,MAAA,EAAO;AAAA,SACd,QAAA,EAAS;AACd,IAAA,OAAO,MAAM;AAGX,MAAA,QAAA,EAAS;AAAA,IACX,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAcX,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,UAAU,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACtD,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,KAAM,EAAE,GAAG,CAAA;AAO5C,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACpD,EAAA,MAAM,mBAAA,GAAsB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AAClE,EAAA,MAAM,kBAAA,GAAqB,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,kBAAkB,CAAA;AAEnE,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,YAAA,CAAa,QAAA,EAAS,CAAE,SAAA,CAAU,UAAU,CAAA;AAC5C,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,cAAA,GAAwD,IAAA;AAC5D,IAAA,IAAI,eAAA,GAAkB,YAAA;AAEtB,IAAA,MAAM,UAAU,YAAY;AAC1B,MAAA,YAAA,CAAa,YAAY,CAAA;AAEzB,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,WAAW,CAAA;AAC5C,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,YAAA;AAAA,UACE,OAAA;AAAA,UACA,eAAe,WAAW,CAAA,kCAAA;AAAA,SAC5B;AACA,QAAA;AAAA,MACF;AACA,MAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,MAAA,kBAAA,EAAmB;AAGnB,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA,IAAI;AACF,UAAA,eAAA,GAAkB,MAAM,aAAA,CAAc,WAAA,EAAa,QAAA,CAAS,IAAI,CAAA;AAChE,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,WAAA,CAAY,EAAE,YAAA,EAAc,eAAA,EAAiB,CAAA;AAAA,QAC/C,SAAS,GAAA,EAAK;AACZ,UAAA,IAAI,SAAA,EAAW;AACf,UAAA,YAAA;AAAA,YACE,OAAA;AAAA,YACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,WACvC;AACA,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,YAAA,CAAa,WAAW,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,KAAK,OAAA,EAAQ;AAIb,IAAA,cAAA,GAAiB,YAAY,YAAY;AACvC,MAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,WAAW,CAAA;AAC5C,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,QAAA,kBAAA,EAAmB;AAEnB,QAAA,IAAI,YAAA,CAAa,QAAA,EAAS,CAAE,MAAA,KAAW,OAAA,EAAS;AAC9C,UAAA,YAAA,CAAa,WAAW,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,OAAA,EAAS,CAAA,mBAAA,EAAsB,WAAW,CAAA,CAAE,CAAA;AAAA,MAC3D;AAAA,IACF,GAAG,GAAM,CAAA;AAET,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,IAAI,cAAA,gBAA8B,cAAc,CAAA;AAChD,MAAA,YAAA,CAAa,QAAA,EAAS,CAAE,SAAA,CAAU,UAAU,CAAA;AAAA,IAC9C,CAAA;AAAA,EAKF,CAAA,EAAG,CAAC,UAAA,EAAY,WAAA,EAAa,YAAY,CAAC,CAAA;AAM1C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,YAAA,EAAc;AAClC,IAAA,IAAI,UAAU,IAAI,GAAA,CAAI,cAAA,CAAe,QAAA,GAAW,KAAK,CAAA;AAErD,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,SAAA,CAAU,CAAC,CAAA,KAAM;AAC5C,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA;AAClC,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,KAAA,MAAW,EAAA,IAAM,EAAE,KAAA,EAAO;AACxB,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,MACtC;AACA,MAAA,OAAA,GAAU,UAAA;AAEV,MAAA,IAAI,OAAO,MAAA,KAAW,CAAA,IAAK,aAAa,QAAA,EAAS,CAAE,WAAW,WAAA,EAAa;AACzE,QAAA;AAAA,MACF;AACA,MAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,QAAA,MAAM,UAAA,GAAa,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AAC5B,QAAA,IAAI,CAAC,UAAA,EAAY;AAGjB,QAAA,cAAA,CAAe,aAAa,YAAA,EAAc,UAAU,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACnE,UAAA,YAAA,CACG,UAAS,CACT,SAAA;AAAA,YACC,OAAA;AAAA,YACA,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU;AAAA,WACvC;AAAA,QACJ,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,UAAA,EAAY,WAAA,EAAa,YAAY,CAAC,CAAA;AAG1C,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI,OAAO,WAAA,EAAY,CAAE,SAAS,MAAA,EAAQ,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,IACpE,CAAA,MAAO;AACL,MAAA,IAAI,OAAO,WAAA,EAAY,CAAE,IAAA,KAAS,MAAA,SAAe,UAAA,EAAW;AAAA,IAC9D;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,MAAM,CAAC,CAAA;AAKrB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,YAAY,IAAA,KAAS,MAAA;AACpC,IAAA,IAAI,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,uBAAuB,EAAE,CAAA;AAAA,SAC3D,QAAA,CAAS,IAAA,CAAK,eAAA,CAAgB,qBAAqB,CAAA;AAExD,IAAA,MAAM,IAAA,GACJ,WAAA,CAAY,IAAA,KAAS,SAAA,IACrB,WAAA,CAAY,IAAA,KAAS,SAAA,IACrB,WAAA,CAAY,IAAA,KAAS,UAAA,GACjB,WAAA,CAAY,IAAA,GACZ,IAAA;AACN,IAAA,IAAI,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,qBAAqB,IAAI,CAAA;AAAA,SACzD,QAAA,CAAS,IAAA,CAAK,eAAA,CAAgB,mBAAmB,CAAA;AAEtD,IAAA,IAAI,WAAA,CAAY,SAAS,YAAA,EAAc;AACrC,MAAA,QAAA,CAAS,IAAA,CAAK,YAAA,CAAa,yBAAA,EAA2B,EAAE,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,yBAAyB,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,qBAAqB,CAAA;AACnD,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,mBAAmB,CAAA;AACjD,MAAA,QAAA,CAAS,IAAA,CAAK,gBAAgB,yBAAyB,CAAA;AAAA,IACzD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,MAAM,GAAA,GAAO,EAAE,MAAA,EAA+B,OAAA;AAC9C,MAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,GAAA,KAAQ,UAAA,EAAY;AAC3C,MAAA,IAAK,CAAA,CAAE,QAA+B,iBAAA,EAAmB;AACzD,MAAA,MAAM,SAAS,QAAA,CAAS,aAAA;AACxB,MAAA,IAAI,WAAW,MAAA,CAAO,OAAA,KAAY,UAAA,IAAc,MAAA,CAAO,YAAY,OAAA,CAAA,EAAU;AAG7E,MAAA,IAAI,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,IAAO,EAAE,QAAA,KAAa,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAA,EAAU;AACzE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,UAAU,QAAA,EAAS;AAAA,yBAAoB,IAAI,CAAA;AAC/C,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AACtB,QAAA,IAAI,MAAA,CAAO,WAAA,EAAY,CAAE,IAAA,KAAS,YAAA,EAAc;AAChD,QAAA,IAAI,UAAU,QAAA,EAAS;AACvB,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AAEf,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,MAAA,CAAO,QAAQ,OAAO,CAAA;AACzC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,MAAA,CAAO,QAAQ,MAAM,CAAA;AACxC,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,EAAK,MAAA,CAAO,QAAQ,MAAM,CAAA;AAKxC,MAAA,IAAA,CAAK,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,KAAQ,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,EAAE,MAAA,EAAQ;AAC7E,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,CAAA,GAAI,OAAO,WAAA,EAAY;AAC7B,QAAA,MAAM,QAAA,GACJ,EAAE,IAAA,KAAS,YAAA,IACX,EAAE,IAAA,KAAS,eAAA,IACX,EAAE,IAAA,KAAS,mBAAA;AACb,QAAA,MAAA,CAAO,OAAA,CAAQ,QAAA,GAAW,QAAA,GAAW,QAAQ,CAAA;AAAA,MAC/C;AAKA,MAAA,IAAA,CAAK,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,KAAQ,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,EAAE,MAAA,EAAQ;AAC7E,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,MACrB;AAEA,MAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,QAAA,MAAM,CAAA,GAAI,OAAO,WAAA,EAAY;AAC7B,QAAA,IAAI,EAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/C,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,MAAA,CAAO,cAAA,EAAe;AAAA,QACxB;AAAA,MACF;AAEA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AAClC,QAAA,MAAM,IAAA,GAAO,cAAA,CAAe,QAAA,EAAS,CAAE,IAAA,EAAK;AAC5C,QAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACvB,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,SAAA,CAAU,SAAA,EAAW,SAAA,CAAU,qBAAA,CAAsB,IAAA,EAAM,YAAY,CAAC,CAAA;AAAA,MAC1E;AACA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AAClC,QAAA,IAAI,eAAe,QAAA,EAAS,CAAE,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACnD,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,gBAAA,EAAiB;AAAA,MACnB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,GAAG,CAAC,gBAAA,EAAkB,YAAA,EAAc,QAAA,EAAU,MAAM,CAAC,CAAA;AAErD,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAIb,QAAA,EAAA;AAAA,oBAAAC,GAAAA,CAAC,cAAW,MAAA,EAAgB,CAAA;AAAA,oBAC5BA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,IACd,QAAA,IAAY,cAAA,mBACZD,IAAAA,CAAAM,UAAA,EACE,QAAA,EAAA;AAAA,sBAAAL,GAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,UAAA,EAAY,QAAA;AAAA,UACZ,SAAA,EAAW,cAAA;AAAA,UACX,UAAA,EAAY,iBAAA;AAAA,UACZ,MAAA;AAAA,UACA,gBAAgB,MAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAC,CAAC;AAAA;AAAA,OAC3C;AAAA,MAKC,CAAC,cAAA,IACA,EACE,WAAA,CAAY,IAAA,KAAS,iBACpB,WAAA,CAAY,SAAA,CAAU,IAAA,KAAS,WAAA,IAC9B,YAAY,SAAA,CAAU,IAAA,KAAS,iCAC9BA,GAAAA,CAAC,mBAAgB,MAAA,EAAgB,CAAA;AAAA,MAAA,CAKtC,WAAA,CAAY,IAAA,KAAS,YAAA,IACrB,WAAA,CAAY,IAAA,KAAS,mBACrB,WAAA,CAAY,IAAA,KAAS,mBAAA,IACpB,WAAA,CAAY,IAAA,KAAS,YAAA,KACnB,YAAY,SAAA,CAAU,IAAA,KAAS,WAAA,IAC9B,WAAA,CAAY,SAAA,CAAU,IAAA,KAAS,WAAA,CAAA,qBACnCA,GAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,KAAA,EAAO,WAAA,EAAa;AAAA,KAAA,EAEpD,CAAA,mBAEAA,GAAAA,CAAC,YAAA,EAAA,EAAa,UAAU,MAAM,WAAA,CAAY,IAAI,CAAA,EAAG;AAAA,GAAA,EAErD,CAAA;AAEJ;;;AChZO,IAAM,YAAA,GAAe;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","file":"index.js","sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport interface Position {\n x: number;\n y: number;\n}\n\ninterface DraggableApi {\n position: Position;\n setPosition: (p: Position) => void;\n /** Spread onto the drag handle. */\n handleProps: {\n onPointerDown: (e: React.PointerEvent) => void;\n style: React.CSSProperties;\n };\n isDragging: boolean;\n}\n\n/**\n * In-session drag positioning. Position resets to `defaultPos` whenever\n * the consumer remounts (e.g. toolbar collapse → expand cycle).\n *\n * We deliberately do NOT persist across reloads — users expect the\n * toolbar to come back at its default anchor, not where they last left\n * it three sessions ago. Drag is for \"get out of my way right now\".\n */\nexport function useDraggable(\n defaultPos: Position,\n size: { width: number; height: number },\n): DraggableApi {\n const [position, setPosition] = useState<Position>(defaultPos);\n const [isDragging, setDragging] = useState(false);\n const startRef = useRef<{ pointer: Position; pos: Position } | null>(null);\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n (e.target as Element).setPointerCapture?.(e.pointerId);\n startRef.current = {\n pointer: { x: e.clientX, y: e.clientY },\n pos: position,\n };\n setDragging(true);\n },\n [position],\n );\n\n useEffect(() => {\n if (!isDragging) return;\n const onMove = (e: PointerEvent) => {\n const s = startRef.current;\n if (!s) return;\n const dx = e.clientX - s.pointer.x;\n const dy = e.clientY - s.pointer.y;\n const maxX = window.innerWidth - size.width - 8;\n const maxY = window.innerHeight - size.height - 8;\n setPosition({\n x: clamp(s.pos.x + dx, 8, Math.max(8, maxX)),\n y: clamp(s.pos.y + dy, 8, Math.max(8, maxY)),\n });\n };\n const onUp = () => {\n setDragging(false);\n startRef.current = null;\n };\n window.addEventListener(\"pointermove\", onMove);\n window.addEventListener(\"pointerup\", onUp);\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n }, [isDragging, size.height, size.width]);\n\n return {\n position,\n setPosition,\n handleProps: {\n onPointerDown,\n style: { cursor: isDragging ? \"grabbing\" : \"grab\", touchAction: \"none\" },\n },\n isDragging,\n };\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(hi, n));\n}\n","import { useSyncExternalStore } from \"react\";\nimport type { EngineState, SelectionEngine } from \"@useclickly/core\";\n\n/**\n * React-friendly accessor for the SelectionEngine's external store.\n * Engine is already a `Subscribable<EngineState>` — zero adapter code.\n */\nexport function useEngineState(engine: SelectionEngine | null): EngineState {\n return useSyncExternalStore(\n (cb) => (engine ? engine.subscribe(cb) : () => {}),\n () => (engine ? engine.getSnapshot() : IDLE),\n () => IDLE,\n );\n}\n\nconst IDLE: EngineState = { kind: \"idle\" };\n","/**\n * IndexedDB-backed persistence for annotation strokes.\n *\n * Why a separate store from the annotations themselves: strokes can be\n * many KB each, and we don't want them inflating the in-memory Zustand\n * annotations record (or the markdown output) when they're not being\n * actively displayed. They're loaded on Clickly mount, written on every\n * stroke change, removed when the parent annotation is deleted.\n *\n * Resilient: every API call returns a Promise that resolves even on\n * error. We never throw out of here — losing a stroke is bad, but\n * crashing the toolbar would be worse.\n */\n\nimport type { AnnotationStroke } from \"@useclickly/core\";\n\nconst DB_NAME = \"clickly\";\nconst DB_VERSION = 1;\nconst STROKES_STORE = \"strokes\";\nconst HANDLES_STORE = \"handles\";\n\ntype DBReady = IDBDatabase | null;\n\nlet dbPromise: Promise<DBReady> | null = null;\n\nfunction open(): Promise<DBReady> {\n if (typeof indexedDB === \"undefined\") return Promise.resolve(null);\n if (dbPromise) return dbPromise;\n dbPromise = new Promise<DBReady>((resolve) => {\n const req = indexedDB.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STROKES_STORE)) {\n db.createObjectStore(STROKES_STORE);\n }\n if (!db.objectStoreNames.contains(HANDLES_STORE)) {\n db.createObjectStore(HANDLES_STORE);\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] IndexedDB open failed:\", req.error);\n resolve(null);\n };\n });\n return dbPromise;\n}\n\nfunction tx<T>(storeName: string, mode: IDBTransactionMode, run: (s: IDBObjectStore) => IDBRequest<T>): Promise<T | null> {\n return open().then((db) => {\n if (!db) return null;\n return new Promise<T | null>((resolve) => {\n const t = db.transaction(storeName, mode);\n const store = t.objectStore(storeName);\n const req = run(store);\n req.onsuccess = () => resolve((req.result as T) ?? null);\n req.onerror = () => {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] IndexedDB tx failed:\", req.error);\n resolve(null);\n };\n });\n });\n}\n\n/* ─── Strokes ──────────────────────────────────────────────────────── */\n\nexport async function saveStrokes(id: string, strokes: AnnotationStroke[]): Promise<void> {\n await tx(STROKES_STORE, \"readwrite\", (s) => s.put(strokes, id));\n}\n\nexport async function loadStrokes(id: string): Promise<AnnotationStroke[] | null> {\n return tx<AnnotationStroke[]>(STROKES_STORE, \"readonly\", (s) => s.get(id));\n}\n\nexport async function deleteStrokes(id: string): Promise<void> {\n await tx(STROKES_STORE, \"readwrite\", (s) => s.delete(id));\n}\n\nexport async function loadAllStrokes(): Promise<Record<string, AnnotationStroke[]>> {\n const db = await open();\n if (!db) return {};\n return new Promise((resolve) => {\n const out: Record<string, AnnotationStroke[]> = {};\n const t = db.transaction(STROKES_STORE, \"readonly\");\n const store = t.objectStore(STROKES_STORE);\n const cursorReq = store.openCursor();\n cursorReq.onsuccess = () => {\n const cursor = cursorReq.result;\n if (!cursor) return resolve(out);\n out[String(cursor.key)] = cursor.value as AnnotationStroke[];\n cursor.continue();\n };\n cursorReq.onerror = () => resolve(out);\n });\n}\n\n/* ─── FileSystemDirectoryHandle (Phase 6c save destination) ───────── */\n\nconst HANDLE_KEY = \"saveFolder\";\n\nexport async function saveDirHandle(handle: FileSystemDirectoryHandle): Promise<void> {\n await tx(HANDLES_STORE, \"readwrite\", (s) => s.put(handle, HANDLE_KEY));\n}\n\nexport async function loadDirHandle(): Promise<FileSystemDirectoryHandle | null> {\n return tx<FileSystemDirectoryHandle>(HANDLES_STORE, \"readonly\", (s) => s.get(HANDLE_KEY));\n}\n\nexport async function clearDirHandle(): Promise<void> {\n await tx(HANDLES_STORE, \"readwrite\", (s) => s.delete(HANDLE_KEY));\n}\n","import type { Annotation } from \"@useclickly/core\";\nimport { create } from \"zustand\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { deleteStrokes, saveStrokes } from \"../internal/strokeDB\";\n\nexport interface AnnotationsStore {\n byId: Record<string, Annotation>;\n order: string[];\n\n add: (a: Annotation) => void;\n remove: (id: string) => void;\n update: (id: string, patch: Partial<Annotation>) => void;\n clear: () => void;\n\n /** Imperative read. Hooks should use `useAnnotationsList()` instead. */\n list: () => Annotation[];\n\n /** Bulk-merge strokes loaded from IndexedDB on mount. Does NOT trigger\n * a save back — these annotations already exist on disk. */\n hydrateStrokes: (strokesById: Record<string, NonNullable<Annotation[\"strokes\"]>>) => void;\n}\n\nexport const useAnnotations = create<AnnotationsStore>((set, get) => ({\n byId: {},\n order: [],\n\n add: (a) => {\n // Persist strokes side-effecting; deliberately fire-and-forget so the\n // UI doesn't wait on IndexedDB. Failure is logged inside strokeDB.\n if (a.strokes && a.strokes.length > 0) void saveStrokes(a.id, a.strokes);\n set((s) => ({\n byId: { ...s.byId, [a.id]: a },\n order: s.order.includes(a.id) ? s.order : [...s.order, a.id],\n }));\n },\n\n remove: (id) => {\n void deleteStrokes(id);\n set((s) => {\n if (!(id in s.byId)) return s;\n const next = { ...s.byId };\n delete next[id];\n return { byId: next, order: s.order.filter((x) => x !== id) };\n });\n },\n\n update: (id, patch) => {\n if (patch.strokes) void saveStrokes(id, patch.strokes);\n set((s) => {\n const cur = s.byId[id];\n if (!cur) return s;\n return { byId: { ...s.byId, [id]: { ...cur, ...patch } } };\n });\n },\n\n clear: () => {\n // Caller is responsible for clearing IndexedDB strokes if desired —\n // we don't blow away every key here in case multiple Clickly mounts\n // share the database (different apps in the same origin).\n set({ byId: {}, order: [] });\n },\n\n list: () => {\n const { byId, order } = get();\n return order.map((id) => byId[id]).filter(Boolean) as Annotation[];\n },\n\n hydrateStrokes: (strokesById) =>\n set((s) => {\n let touched = false;\n const next = { ...s.byId };\n for (const [id, strokes] of Object.entries(strokesById)) {\n const cur = next[id];\n if (!cur) continue;\n next[id] = { ...cur, strokes };\n touched = true;\n }\n return touched ? { byId: next } : s;\n }),\n}));\n\n/**\n * Subscribe to the annotation list with shallow equality — re-renders\n * only when items add/remove/reorder/update. Always use this from\n * component code; never call `useAnnotations(s => s.list())`, which\n * returns a new array reference on every store change and infinite-loops\n * `useSyncExternalStore`.\n */\nexport function useAnnotationsList(): Annotation[] {\n return useAnnotations(\n useShallow((s) => s.order.map((id) => s.byId[id]).filter(Boolean) as Annotation[]),\n );\n}\n","import { create } from \"zustand\";\n\nexport type OutputDetail = \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n\n/**\n * Theme: `\"system\"` follows the OS preference via `prefers-color-scheme`;\n * `\"light\"` and `\"dark\"` lock the choice. ClicklyRoot resolves \"system\"\n * to a concrete value at render time and sets `data-clickly-theme` on\n * the shadow-root wrapper so the CSS in styles.ts can target it.\n */\nexport type Theme = \"system\" | \"light\" | \"dark\";\n\nexport interface Settings {\n outputDetail: OutputDetail;\n copyOnAdd: boolean;\n showReactComponents: boolean;\n markerColor: string;\n theme: Theme;\n /** MCP sync — push new annotations to a running mcp-server's HTTP bridge. */\n mcpEnabled: boolean;\n /** HTTP-bridge URL the React side connects to (default localhost:4747). */\n mcpEndpoint: string;\n /**\n * Session ID returned by POST /sessions. Persisted so a reload re-attaches\n * to the same session and the agent keeps seeing one continuous stream\n * of annotations from this page.\n */\n mcpSessionId: string | null;\n}\n\nexport interface SettingsStore extends Settings {\n set: (patch: Partial<Settings>) => void;\n reset: () => void;\n}\n\nexport const DEFAULTS: Settings = {\n outputDetail: \"standard\",\n copyOnAdd: true,\n showReactComponents: true,\n markerColor: \"#06b6d4\",\n theme: \"system\",\n mcpEnabled: false,\n mcpEndpoint: \"http://localhost:4747\",\n mcpSessionId: null,\n};\n\nconst STORAGE_KEY = \"clickly:settings\";\n\nfunction load(): Settings {\n if (typeof localStorage === \"undefined\") return DEFAULTS;\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (!raw) return DEFAULTS;\n const parsed = JSON.parse(raw) as Partial<Settings>;\n return { ...DEFAULTS, ...parsed };\n } catch {\n return DEFAULTS;\n }\n}\n\nfunction persist(s: Settings) {\n if (typeof localStorage === \"undefined\") return;\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(s));\n } catch {\n /* quota / privacy mode */\n }\n}\n\nexport const useSettings = create<SettingsStore>((set) => ({\n ...load(),\n set: (patch) =>\n set((cur) => {\n const next = { ...cur, ...patch };\n persist(next);\n return next;\n }),\n reset: () => {\n persist(DEFAULTS);\n set(DEFAULTS);\n },\n}));\n\n/**\n * Resolve `Settings.theme` to a concrete `\"light\" | \"dark\"` for rendering.\n * `\"system\"` reads `prefers-color-scheme` once at call time. ClicklyRoot\n * additionally subscribes to the media-query change event so the UI\n * flips when the user toggles their OS theme.\n */\nexport function resolveTheme(theme: Theme): \"light\" | \"dark\" {\n if (theme === \"light\" || theme === \"dark\") return theme;\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return \"light\";\n }\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"dark\" : \"light\";\n}\n","import type { Annotation } from \"@useclickly/core\";\nimport { isPlacementAnnotation, isRearrangeAnnotation } from \"@useclickly/core\";\nimport type { OutputDetail } from \"../state/settings\";\n\nexport function annotationsToMarkdown(\n annotations: Annotation[],\n detail: OutputDetail = \"standard\",\n): string {\n if (!annotations.length) return \"(no annotations)\";\n return annotations.map((a, i) => formatOne(a, i + 1, detail)).join(\"\\n\\n\");\n}\n\nexport function formatOne(a: Annotation, index: number, detail: OutputDetail): string {\n // Layout Mode annotations get their own formatters so agents see at a\n // glance that the user is asking for a structural change, not reporting\n // a bug. The header gets a `— Placement` / `— Rearrange` suffix.\n if (isPlacementAnnotation(a)) return formatPlacement(a, index, detail);\n if (isRearrangeAnnotation(a)) return formatRearrange(a, index, detail);\n\n const lines: string[] = [];\n lines.push(`## Annotation #${index}`);\n lines.push(\n `**Element:** \\`${a.element}${a.cssClasses ? \".\" + a.cssClasses.split(\" \").join(\".\") : \"\"}\\``,\n );\n lines.push(`**Path:** \\`${a.elementPath}\\``);\n\n if (detail !== \"compact\" && a.boundingBox) {\n const b = a.boundingBox;\n lines.push(\n `**Position:** ${Math.round(b.x)}px, ${Math.round(b.y)}px (${Math.round(b.width)}×${Math.round(b.height)}px)`,\n );\n }\n if (detail !== \"compact\" && a.sourceFile) {\n lines.push(`**Source:** \\`${a.sourceFile}:${a.sourceLine ?? \"?\"}\\``);\n }\n // Selected text — included at every non-compact level. This is what the\n // user actually highlighted before clicking; agents need it to grep the\n // exact string in source (typos, copy fixes, content edits).\n if (detail !== \"compact\" && a.selectedText) {\n lines.push(`**Selected text:** \"${truncate(a.selectedText, 200)}\"`);\n }\n if (detail === \"detailed\" || detail === \"forensic\") {\n if (a.reactComponents) lines.push(`**React:** ${a.reactComponents}`);\n if (a.nearbyText) lines.push(`**Nearby text:** ${truncate(a.nearbyText, 120)}`);\n }\n if (detail === \"forensic\" && a.computedStyles) {\n lines.push(\"**Computed styles:**\\n```css\\n\" + a.computedStyles + \"\\n```\");\n }\n\n lines.push(`**Feedback:** ${a.comment}`);\n\n // Suggested CSS changes — always included in every detail level.\n if (a.suggestedCss) {\n lines.push(\"**Suggested CSS:**\\n```css\\n\" + a.suggestedCss + \"\\n```\");\n }\n\n if (a.severity) lines.push(`**Severity:** ${a.severity}`);\n return lines.join(\"\\n\");\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + \"…\";\n}\n\n/* ─── Layout Mode formatters ────────────────────────────────────────── */\n\n/**\n * Placement = new component the user wants added. Header includes the\n * componentType so the agent can grep its design system for matching\n * components without parsing the body.\n *\n * ## Annotation #3 — Placement\n * **Component:** `Hero`\n * **Position:** 45% from left, 280px from top (size 1200×480, scrollY 0)\n * **Feedback:** Big hero with headline + subhead + CTA\n */\nfunction formatPlacement(\n a: import(\"@useclickly/core\").PlacementAnnotation,\n index: number,\n detail: OutputDetail,\n): string {\n const lines: string[] = [];\n const p = a.placement;\n lines.push(`## Annotation #${index} — Placement`);\n lines.push(`**Component:** \\`${p.componentType}\\``);\n\n if (p.text) lines.push(`**Label:** \"${truncate(p.text, 100)}\"`);\n\n // Position phrasing matches AFS 1.1: x is % of viewport width, y is\n // document-px from top. We round both so the agent doesn't latch onto\n // a meaningless `45.23456%`.\n const xPct = Math.round(a.x);\n const yPx = Math.round(a.y);\n if (detail === \"compact\") {\n lines.push(`**Position:** ${xPct}% from left, ${yPx}px from top`);\n } else {\n lines.push(\n `**Position:** ${xPct}% from left, ${yPx}px from top ` +\n `(size ${Math.round(p.width)}×${Math.round(p.height)}, scrollY ${Math.round(p.scrollY)})`,\n );\n }\n\n // Source/React are only meaningful for placements when the user dropped\n // INSIDE a known component. The capture pipeline sets these against the\n // closest existing element; agents use them for \"place near here\".\n if (detail !== \"compact\" && a.sourceFile) {\n lines.push(`**Near source:** \\`${a.sourceFile}:${a.sourceLine ?? \"?\"}\\``);\n }\n if ((detail === \"detailed\" || detail === \"forensic\") && a.reactComponents) {\n lines.push(`**Near React:** ${a.reactComponents}`);\n }\n\n lines.push(`**Feedback:** ${a.comment}`);\n if (a.severity) lines.push(`**Severity:** ${a.severity}`);\n return lines.join(\"\\n\");\n}\n\n/**\n * Rearrange = existing on-page section the user moved. We always emit\n * BOTH original and current rects (in document coords) — those are the\n * whole point of the annotation, so they shouldn't be gated on detail\n * level. React / source still gated as usual.\n *\n * ## Annotation #4 — Rearrange\n * **Section:** `section \"Pricing\"` (`section.pricing-tier`)\n * **Path:** `body > main > section.pricing-tier`\n * **Moved from:** 240px, 600px (760×480px)\n * **Moved to:** 240px, 120px (760×480px)\n * **Feedback:** Move pricing above the testimonials\n */\nfunction formatRearrange(\n a: import(\"@useclickly/core\").RearrangeAnnotation,\n index: number,\n detail: OutputDetail,\n): string {\n const lines: string[] = [];\n const r = a.rearrange;\n lines.push(`## Annotation #${index} — Rearrange`);\n lines.push(`**Section:** ${r.label} (\\`${r.selector}\\`)`);\n if (detail !== \"compact\") lines.push(`**Path:** \\`${a.elementPath}\\``);\n\n const fromR = r.originalRect;\n const toR = r.currentRect;\n lines.push(\n `**Moved from:** ${Math.round(fromR.x)}px, ${Math.round(fromR.y)}px ` +\n `(${Math.round(fromR.width)}×${Math.round(fromR.height)}px)`,\n );\n lines.push(\n `**Moved to:** ${Math.round(toR.x)}px, ${Math.round(toR.y)}px ` +\n `(${Math.round(toR.width)}×${Math.round(toR.height)}px)`,\n );\n\n if (detail !== \"compact\" && a.sourceFile) {\n lines.push(`**Source:** \\`${a.sourceFile}:${a.sourceLine ?? \"?\"}\\``);\n }\n if ((detail === \"detailed\" || detail === \"forensic\") && a.reactComponents) {\n lines.push(`**React:** ${a.reactComponents}`);\n }\n\n lines.push(`**Feedback:** ${a.comment}`);\n if (a.severity) lines.push(`**Severity:** ${a.severity}`);\n return lines.join(\"\\n\");\n}\n","// Inline SVG icons — no icon-library dep. 16x16 stroked, currentColor.\n\nfunction Icon({\n children,\n size = 16,\n}: {\n children: React.ReactNode;\n size?: number;\n}) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {children}\n </svg>\n );\n}\n\nexport const IconFreeze = () => (\n <Icon size={15}>\n {/* snowflake / pause-animations icon */}\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"22\" />\n <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" />\n <line x1=\"19\" y1=\"5\" x2=\"5\" y2=\"19\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n </Icon>\n);\n\nexport const IconInfo = () => (\n <Icon size={14}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"8\" strokeWidth=\"2.5\" />\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"16\" />\n </Icon>\n);\n\nexport const IconCursor = () => (\n <Icon>\n <path d=\"M4 4l6 16 2-7 7-2z\" />\n </Icon>\n);\n\nexport const IconLayers = () => (\n <Icon>\n <path d=\"M12 2l9 5-9 5-9-5 9-5z\" />\n <path d=\"M3 12l9 5 9-5\" />\n <path d=\"M3 17l9 5 9-5\" />\n </Icon>\n);\n\nexport const IconLayout = () => (\n // Stacked-rectangles glyph: header + 2-column body. Reads as\n // \"page structure\" at 16px, distinct from IconLayers (3D stack).\n <Icon>\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"4\" rx=\"1\" />\n <rect x=\"3\" y=\"11\" width=\"8\" height=\"9\" rx=\"1\" />\n <rect x=\"13\" y=\"11\" width=\"8\" height=\"9\" rx=\"1\" />\n </Icon>\n);\n\nexport const IconSquare = () => (\n <Icon>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" strokeDasharray=\"3 3\" />\n </Icon>\n);\n\nexport const IconCopy = () => (\n <Icon>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" />\n <path d=\"M5 15V5a2 2 0 0 1 2-2h10\" />\n </Icon>\n);\n\nexport const IconTrash = () => (\n <Icon>\n <path d=\"M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2m3 0v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6h14z\" />\n </Icon>\n);\n\nexport const IconSettings = () => (\n <Icon>\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n <path d=\"M19.4 15a1.7 1.7 0 0 0 .34 1.87l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.7 1.7 0 0 0-1.87-.34 1.7 1.7 0 0 0-1.03 1.55V21a2 2 0 1 1-4 0v-.09a1.7 1.7 0 0 0-1.11-1.55 1.7 1.7 0 0 0-1.87.34l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.7 1.7 0 0 0 4.6 15 1.7 1.7 0 0 0 3.04 14H3a2 2 0 1 1 0-4h.09A1.7 1.7 0 0 0 4.64 8.9a1.7 1.7 0 0 0-.34-1.87l-.06-.06A2 2 0 1 1 7.07 4.14l.06.06A1.7 1.7 0 0 0 9 4.54 1.7 1.7 0 0 0 10 3.03V3a2 2 0 1 1 4 0v.09a1.7 1.7 0 0 0 1 1.51 1.7 1.7 0 0 0 1.87-.34l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.7 1.7 0 0 0 19.4 9a1.7 1.7 0 0 0 1.55 1H21a2 2 0 1 1 0 4h-.09a1.7 1.7 0 0 0-1.5 1z\" />\n </Icon>\n);\n\nexport const IconGrip = () => (\n <Icon>\n <circle cx=\"9\" cy=\"6\" r=\"1\" />\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"18\" r=\"1\" />\n <circle cx=\"15\" cy=\"6\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"18\" r=\"1\" />\n </Icon>\n);\n\nexport const IconClose = () => (\n <Icon>\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </Icon>\n);\n\nexport const IconCheck = () => (\n <Icon>\n <path d=\"M5 12l5 5L20 7\" />\n </Icon>\n);\n\nexport const IconList = () => (\n <Icon>\n <path d=\"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01\" />\n </Icon>\n);\n\nexport const IconPower = () => (\n <Icon>\n <path d=\"M12 2v10M18.36 5.64a9 9 0 1 1-12.73 0\" />\n </Icon>\n);\n\nexport const IconPen = () => (\n <Icon>\n {/* Pencil — used for the draw mode toolbar button. */}\n <path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\" />\n <path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\" />\n </Icon>\n);\n\nexport const IconCamera = () => (\n <Icon>\n {/* Camera — screenshot capture button on annotation cards. */}\n <path d=\"M23 19a2 2 0 0 1-2 2H3a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h4l2-3h6l2 3h4a2 2 0 0 1 2 2z\" />\n <circle cx=\"12\" cy=\"13\" r=\"4\" />\n </Icon>\n);\n\nexport const IconDownload = () => (\n <Icon>\n {/* Download — composite-export button. */}\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </Icon>\n);\n\nexport const IconSun = () => (\n <Icon>\n {/* Sun — used for the \"switch to light mode\" toolbar toggle. */}\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <line x1=\"12\" y1=\"2\" x2=\"12\" y2=\"4\" />\n <line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"22\" />\n <line x1=\"4.93\" y1=\"4.93\" x2=\"6.34\" y2=\"6.34\" />\n <line x1=\"17.66\" y1=\"17.66\" x2=\"19.07\" y2=\"19.07\" />\n <line x1=\"2\" y1=\"12\" x2=\"4\" y2=\"12\" />\n <line x1=\"20\" y1=\"12\" x2=\"22\" y2=\"12\" />\n <line x1=\"4.93\" y1=\"19.07\" x2=\"6.34\" y2=\"17.66\" />\n <line x1=\"17.66\" y1=\"6.34\" x2=\"19.07\" y2=\"4.93\" />\n </Icon>\n);\n\nexport const IconMoon = () => (\n <Icon>\n {/* Moon — used for the \"switch to dark mode\" toolbar toggle. */}\n <path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" />\n </Icon>\n);\n","/**\n * MCP HTTP-bridge client + runtime connection-status store.\n *\n * The mcp-server exposes the routes documented in\n * `packages/mcp-server/src/http-bridge.ts`. This module is a thin fetch\n * wrapper around those routes plus a zustand store for the live status\n * (which can't live in `settings.ts` — that file is persisted and the\n * status is transient).\n *\n * Current scope (v1):\n * - GET /health — ping for readiness\n * - POST /sessions — open a session for this page URL\n * - POST /sessions/:id/annotations — push a freshly-created annotation\n *\n * Out of scope for v1: PATCH/DELETE for annotations (the bridge doesn't\n * expose those routes yet — see http-bridge.ts comment block). The\n * agent currently sees an annotation when it lands; later edits stay\n * client-side until the bridge grows update/delete endpoints.\n */\n\nimport type { Annotation } from \"@useclickly/core\";\nimport { create } from \"zustand\";\n\n/** Live connection state — not persisted. */\nexport type McpStatus = \"disabled\" | \"connecting\" | \"connected\" | \"error\";\n\nexport interface McpStatusStore {\n status: McpStatus;\n /** Last error message, if any. Cleared on successful reconnect. */\n lastError: string | null;\n /** Server version returned by /health, when known. */\n serverVersion: string | null;\n /** Timestamp of the last successful health response, for \"X seconds ago\". */\n lastPingAt: number | null;\n\n setStatus: (status: McpStatus, error?: string) => void;\n setServerVersion: (version: string | null) => void;\n noteSuccessfulPing: () => void;\n}\n\nexport const useMcpStatus = create<McpStatusStore>((set) => ({\n status: \"disabled\",\n lastError: null,\n serverVersion: null,\n lastPingAt: null,\n setStatus: (status, error) =>\n set({ status, lastError: status === \"error\" ? error ?? null : null }),\n setServerVersion: (serverVersion) => set({ serverVersion }),\n noteSuccessfulPing: () => set({ lastPingAt: Date.now() }),\n}));\n\n/* ─── HTTP helpers ───────────────────────────────────────────────────── */\n\n/** Normalize a user-supplied endpoint (trim trailing slash). */\nexport function normalizeEndpoint(endpoint: string): string {\n return endpoint.trim().replace(/\\/+$/, \"\");\n}\n\n/**\n * Hit GET /health. Returns the server version on success, null on any\n * failure. We deliberately avoid throwing — callers branch on null and\n * update the status store accordingly.\n */\nexport async function pingServer(endpoint: string): Promise<string | null> {\n try {\n const res = await fetch(`${normalizeEndpoint(endpoint)}/health`, {\n method: \"GET\",\n headers: { Accept: \"application/json\" },\n // Short timeout via AbortController so a slow/missing server doesn't\n // stall the UI for the default fetch timeout (~30s in browsers).\n signal: timeoutSignal(3_000),\n });\n if (!res.ok) return null;\n const body = (await res.json()) as { ok?: boolean; version?: string };\n return body.ok && body.version ? body.version : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Open a new session for the current page URL. Throws on network/HTTP\n * failure so the caller can surface a real error message.\n */\nexport async function createSession(endpoint: string, url: string): Promise<string> {\n const res = await fetch(`${normalizeEndpoint(endpoint)}/sessions`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ url }),\n signal: timeoutSignal(5_000),\n });\n if (!res.ok) {\n const text = await safeReadText(res);\n throw new Error(`POST /sessions failed: ${res.status} ${text}`);\n }\n const body = (await res.json()) as { sessionId?: string };\n if (!body.sessionId) throw new Error(\"Server response missing sessionId\");\n return body.sessionId;\n}\n\n/**\n * Push one annotation to the server. Best-effort — caller decides\n * what to do on failure (we recommend updating status to \"error\" but\n * keeping the annotation in the local store, since the user's source\n * of truth is the browser).\n */\nexport async function pushAnnotation(\n endpoint: string,\n sessionId: string,\n annotation: Annotation,\n): Promise<void> {\n const res = await fetch(\n `${normalizeEndpoint(endpoint)}/sessions/${encodeURIComponent(sessionId)}/annotations`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(annotation),\n signal: timeoutSignal(5_000),\n },\n );\n if (!res.ok) {\n const text = await safeReadText(res);\n throw new Error(`POST annotation failed: ${res.status} ${text}`);\n }\n}\n\n/* ─── Internals ──────────────────────────────────────────────────────── */\n\nfunction timeoutSignal(ms: number): AbortSignal | undefined {\n if (typeof AbortController === \"undefined\") return undefined;\n const c = new AbortController();\n setTimeout(() => c.abort(), ms);\n return c.signal;\n}\n\nasync function safeReadText(res: Response): Promise<string> {\n try {\n return await res.text();\n } catch {\n return \"\";\n }\n}\n","import { useEffect, useRef } from \"react\";\nimport { useSettings, type OutputDetail } from \"../state/settings\";\nimport { useMcpStatus } from \"../state/mcpClient\";\nimport { IconClose } from \"./icons\";\n\ninterface Props {\n anchor: { x: number; y: number };\n width: number;\n onClose: () => void;\n}\n\nexport function SettingsPopover({ anchor, width, onClose }: Props) {\n const ref = useRef<HTMLDivElement>(null);\n const s = useSettings();\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n // e.target is retargeted to the shadow host inside shadow DOM,\n // so contains() always fails. composedPath() pierces the boundary.\n if (ref.current && e.composedPath().includes(ref.current)) return;\n onClose();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [onClose]);\n\n // Settings panel is ~320px tall — position it above the toolbar\n const PANEL_H = 330;\n const top = Math.max(8, anchor.y - PANEL_H - 12);\n const left = Math.min(window.innerWidth - 300, Math.max(8, anchor.x + width - 284));\n\n return (\n <div ref={ref} className=\"clickly-settings\" style={{ left, top }}>\n {/* Header */}\n <div className=\"settings-header\">\n <span className=\"settings-title\">Settings</span>\n <button className=\"settings-close\" onClick={onClose} aria-label=\"Close settings\">\n <IconClose />\n </button>\n </div>\n\n {/* Output detail */}\n <div className=\"settings-section\">\n <label className=\"settings-label\" htmlFor=\"clickly-detail\">\n Output detail\n <span className=\"settings-hint\">How much metadata is captured</span>\n </label>\n <select\n id=\"clickly-detail\"\n className=\"settings-select\"\n value={s.outputDetail}\n onChange={(e) => s.set({ outputDetail: e.target.value as OutputDetail })}\n >\n <option value=\"compact\">Compact</option>\n <option value=\"standard\">Standard</option>\n <option value=\"detailed\">Detailed</option>\n <option value=\"forensic\">Forensic</option>\n </select>\n </div>\n\n <div className=\"settings-divider\" />\n\n {/* Toggles */}\n <div className=\"settings-section\">\n <div className=\"settings-row\">\n <div className=\"settings-row-label\">\n Copy on add\n <span className=\"settings-hint\">Auto-copy markdown when annotating</span>\n </div>\n <label className=\"clickly-toggle\">\n <input\n type=\"checkbox\"\n checked={s.copyOnAdd}\n onChange={(e) => s.set({ copyOnAdd: e.target.checked })}\n />\n <span className=\"toggle-track\" />\n </label>\n </div>\n\n <div className=\"settings-row\">\n <div className=\"settings-row-label\">\n React components\n <span className=\"settings-hint\">Include component tree in output</span>\n </div>\n <label className=\"clickly-toggle\">\n <input\n type=\"checkbox\"\n checked={s.showReactComponents}\n onChange={(e) => s.set({ showReactComponents: e.target.checked })}\n />\n <span className=\"toggle-track\" />\n </label>\n </div>\n </div>\n\n <div className=\"settings-divider\" />\n\n {/* Marker color */}\n <div className=\"settings-section\">\n <div className=\"settings-row\">\n <div className=\"settings-row-label\">\n Marker color\n <span className=\"settings-hint\">Color used for annotation pins</span>\n </div>\n <label className=\"settings-color-wrap\" aria-label=\"Marker color\">\n <span className=\"color-swatch\" style={{ background: s.markerColor }} />\n <input\n type=\"color\"\n value={s.markerColor}\n onChange={(e) => s.set({ markerColor: e.target.value })}\n />\n </label>\n </div>\n </div>\n\n <div className=\"settings-divider\" />\n\n {/* MCP sync — connects to the local mcp-server HTTP bridge so the\n agent reads annotations live instead of via copy-paste. */}\n <McpSection />\n </div>\n );\n}\n\n/* ─── MCP section ─────────────────────────────────────────────────────── */\n\nfunction McpSection() {\n const s = useSettings();\n const status = useMcpStatus((m) => m.status);\n const lastError = useMcpStatus((m) => m.lastError);\n const serverVersion = useMcpStatus((m) => m.serverVersion);\n const lastPingAt = useMcpStatus((m) => m.lastPingAt);\n\n // Status colors mirror the dot — colocated here so the chip and the\n // header dot stay in sync if either side changes copy.\n const statusMeta: Record<typeof status, { label: string; modifier: string }> = {\n disabled: { label: \"Off\", modifier: \"is-off\" },\n connecting: { label: \"Connecting…\", modifier: \"is-connecting\" },\n connected: { label: \"Connected\", modifier: \"is-connected\" },\n error: { label: \"Error\", modifier: \"is-error\" },\n };\n const meta = statusMeta[status];\n\n return (\n <div className=\"settings-section\">\n <div className=\"settings-row\">\n <div className=\"settings-row-label\">\n MCP sync\n <span className=\"settings-hint\">\n Push annotations to a running mcp-server so the agent reads them live\n </span>\n </div>\n <label className=\"clickly-toggle\">\n <input\n type=\"checkbox\"\n checked={s.mcpEnabled}\n onChange={(e) => s.set({ mcpEnabled: e.target.checked })}\n />\n <span className=\"toggle-track\" />\n </label>\n </div>\n\n {/* Endpoint URL — disabled while sync is off so the value can't\n be edited mid-flight (the ClicklyRoot effect would tear and\n rebuild the session for every keystroke otherwise). */}\n <div className=\"settings-row\" style={{ marginTop: 8 }}>\n <div className=\"settings-row-label\" style={{ flex: \"0 0 auto\", minWidth: 72 }}>\n Endpoint\n </div>\n <input\n type=\"text\"\n className=\"settings-input\"\n value={s.mcpEndpoint}\n onChange={(e) => s.set({ mcpEndpoint: e.target.value })}\n placeholder=\"http://localhost:4747\"\n disabled={!s.mcpEnabled}\n spellCheck={false}\n />\n </div>\n\n {/* Live status — dot + label + small detail line. Only meaningful\n when sync is on; rendered greyed-out otherwise so users see the\n shape of the panel even when it's idle. */}\n <div className={`settings-mcp-status ${meta.modifier}`}>\n <span className=\"mcp-dot\" aria-hidden />\n <span className=\"mcp-status-label\">{meta.label}</span>\n {status === \"connected\" && (\n <span className=\"mcp-status-detail\">\n {serverVersion ? `v${serverVersion}` : \"\"}\n {lastPingAt\n ? ` · pinged ${formatRelative(Date.now() - lastPingAt)} ago`\n : \"\"}\n </span>\n )}\n {status === \"error\" && lastError ? (\n <span className=\"mcp-status-detail mcp-status-error\">{lastError}</span>\n ) : null}\n </div>\n\n {/* Session ID readout (truncated) — useful for cross-referencing\n with the agent's logs. Only shown when actually connected. */}\n {status === \"connected\" && s.mcpSessionId ? (\n <div className=\"settings-mcp-session\">\n <span className=\"mcp-status-label\" style={{ opacity: 0.7 }}>Session</span>\n <code className=\"mcp-session-id\">{s.mcpSessionId}</code>\n <button\n type=\"button\"\n className=\"mcp-session-reset\"\n onClick={() => s.set({ mcpSessionId: null })}\n title=\"Start a fresh session on the next ping\"\n >\n Reset\n </button>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction formatRelative(ms: number): string {\n if (ms < 1500) return \"just now\";\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.round(s / 60);\n if (m < 60) return `${m}m`;\n return `${Math.round(m / 60)}h`;\n}\n","/**\n * Freeze Animations — Clickly port of Agentation's implementation.\n *\n * Monkey-patches `window.setTimeout`, `window.setInterval`, and\n * `window.requestAnimationFrame` so callbacks are queued (or silently\n * skipped, for intervals) while frozen. Also:\n * - injects CSS to pause CSS animations and kill transitions on the page\n * - pauses WAAPI animations via `document.getAnimations()`\n * - pauses GSAP's global timeline if present (preserved from Clickly's\n * original freeze logic — GSAP defaults to its own ticker, not WAAPI)\n * - pauses `<video>` elements\n *\n * Clickly UI surfaces (`[data-clickly-root]`, `[data-clickly-toolbar]`)\n * are excluded from every pause path, so the toolbar keeps animating while\n * the page is frozen. Toolbar/popup code that relies on `setTimeout` or\n * `requestAnimationFrame` MUST import the `original*` exports from this\n * module — using the global wrappers would freeze toolbar interactions\n * along with the page.\n *\n * Patches install as a side-effect of importing this module. State lives\n * on `window` under `__clickly_freeze` so HMR module re-execution doesn't\n * double-patch or lose the queue.\n */\n\nconst EXCLUDE_ATTRS = [\"data-clickly-root\", \"data-clickly-toolbar\"] as const;\n\nconst NOT_SELECTORS = EXCLUDE_ATTRS\n .flatMap((a) => [`:not([${a}])`, `:not([${a}] *)`])\n .join(\"\");\n\nconst STYLE_ID = \"clickly-freeze-animations\";\nconst STATE_KEY = \"__clickly_freeze\";\n\ninterface FreezeState {\n frozen: boolean;\n installed: boolean;\n origSetTimeout: typeof window.setTimeout;\n origSetInterval: typeof window.setInterval;\n origRAF: typeof window.requestAnimationFrame;\n pausedAnimations: Animation[];\n frozenTimeoutQueue: Array<() => void>;\n frozenRAFQueue: FrameRequestCallback[];\n}\n\ntype GlobalWithState = typeof globalThis & { [STATE_KEY]?: FreezeState };\n\nfunction makeStub(): FreezeState {\n // SSR / no-window fallback. `installed: true` short-circuits the patcher.\n return {\n frozen: false,\n installed: true,\n origSetTimeout: ((..._a: unknown[]) => 0) as unknown as typeof window.setTimeout,\n origSetInterval: ((..._a: unknown[]) => 0) as unknown as typeof window.setInterval,\n origRAF: ((_cb: FrameRequestCallback) => 0) as unknown as typeof window.requestAnimationFrame,\n pausedAnimations: [],\n frozenTimeoutQueue: [],\n frozenRAFQueue: [],\n };\n}\n\nfunction getState(): FreezeState {\n if (typeof window === \"undefined\") return makeStub();\n const w = window as unknown as GlobalWithState;\n if (!w[STATE_KEY]) {\n w[STATE_KEY] = {\n frozen: false,\n installed: false,\n // Real origs filled in by the installer below.\n origSetTimeout: undefined as unknown as typeof window.setTimeout,\n origSetInterval: undefined as unknown as typeof window.setInterval,\n origRAF: undefined as unknown as typeof window.requestAnimationFrame,\n pausedAnimations: [],\n frozenTimeoutQueue: [],\n frozenRAFQueue: [],\n };\n }\n return w[STATE_KEY]!;\n}\n\nconst _s = getState();\n\n/* ─── Install patches (once per window, survives HMR) ─────────────────── */\n\nif (typeof window !== \"undefined\" && !_s.installed) {\n _s.origSetTimeout = window.setTimeout.bind(window) as typeof window.setTimeout;\n _s.origSetInterval = window.setInterval.bind(window) as typeof window.setInterval;\n _s.origRAF = window.requestAnimationFrame.bind(window);\n\n // setTimeout — queue when frozen, replay on unfreeze.\n (window as unknown as { setTimeout: typeof window.setTimeout }).setTimeout =\n ((handler: TimerHandler, timeout?: number, ...args: unknown[]) => {\n if (typeof handler === \"string\") {\n // String handlers are eval'd by the browser — defer to original\n // unchanged. We can't queue arbitrary strings.\n return _s.origSetTimeout(handler, timeout);\n }\n return _s.origSetTimeout(\n (...a: unknown[]) => {\n if (_s.frozen) {\n _s.frozenTimeoutQueue.push(() => (handler as (...x: unknown[]) => void)(...a));\n } else {\n (handler as (...x: unknown[]) => void)(...a);\n }\n },\n timeout,\n ...args,\n );\n }) as typeof window.setTimeout;\n\n // setInterval — silently skip ticks while frozen. We deliberately don't\n // queue intervals (replaying them all on unfreeze would flood the page).\n (window as unknown as { setInterval: typeof window.setInterval }).setInterval =\n ((handler: TimerHandler, timeout?: number, ...args: unknown[]) => {\n if (typeof handler === \"string\") return _s.origSetInterval(handler, timeout);\n return _s.origSetInterval(\n (...a: unknown[]) => {\n if (!_s.frozen) (handler as (...x: unknown[]) => void)(...a);\n },\n timeout,\n ...args,\n );\n }) as typeof window.setInterval;\n\n // requestAnimationFrame — queue callback when frozen so we don't spin the\n // CPU. The wrapper still fires on the next frame; if still frozen the\n // callback is pushed to the queue and replayed on unfreeze.\n (window as unknown as { requestAnimationFrame: typeof window.requestAnimationFrame }).requestAnimationFrame =\n ((callback: FrameRequestCallback) =>\n _s.origRAF((timestamp: number) => {\n if (_s.frozen) {\n _s.frozenRAFQueue.push(callback);\n } else {\n callback(timestamp);\n }\n })) as typeof window.requestAnimationFrame;\n\n _s.installed = true;\n}\n\n/* ─── Public: originals (use these inside Clickly UI) ─────────────────── */\n\nexport const originalSetTimeout = _s.origSetTimeout;\nexport const originalSetInterval = _s.origSetInterval;\nexport const originalRequestAnimationFrame = _s.origRAF;\n\n/* ─── Public: freeze / unfreeze / isFrozen ────────────────────────────── */\n\nfunction isClicklyElement(el: Element | null): boolean {\n if (!el || !el.closest) return false;\n return EXCLUDE_ATTRS.some((attr) => el.closest(`[${attr}]`) !== null);\n}\n\ninterface GsapLike {\n globalTimeline?: { pause(): void; resume(): void };\n}\n\nfunction getGsap(): GsapLike | null {\n if (typeof window === \"undefined\") return null;\n const w = window as unknown as { gsap?: GsapLike };\n return w.gsap ?? null;\n}\n\nexport function isFrozen(): boolean {\n return _s.frozen;\n}\n\nexport function freeze(): void {\n if (typeof document === \"undefined\") return;\n if (_s.frozen) return;\n _s.frozen = true;\n _s.frozenTimeoutQueue = [];\n _s.frozenRAFQueue = [];\n\n // CSS — pause CSS animations and kill transitions on the page, except\n // inside Clickly UI surfaces.\n let style = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement(\"style\");\n style.id = STYLE_ID;\n document.head.appendChild(style);\n }\n style.textContent = `\n *${NOT_SELECTORS},\n *${NOT_SELECTORS}::before,\n *${NOT_SELECTORS}::after {\n animation-play-state: paused !important;\n transition: none !important;\n }\n `;\n\n // WAAPI — pause only RUNNING non-Clickly animations and remember which\n // we paused (so unfreeze touches the exact same set; pausing a finished\n // animation would restart it on play()).\n _s.pausedAnimations = [];\n try {\n document.getAnimations().forEach((anim) => {\n if (anim.playState !== \"running\") return;\n const target = (anim.effect as KeyframeEffect | null)?.target as Element | null;\n if (!isClicklyElement(target)) {\n anim.pause();\n _s.pausedAnimations.push(anim);\n }\n });\n } catch {\n // document.getAnimations may not exist (older browsers / jsdom).\n }\n\n // GSAP — preserved from Clickly's original freeze logic. Modern GSAP can\n // use WAAPI (caught above), but defaults to its own ticker, so pause the\n // global timeline as a belt-and-suspenders.\n getGsap()?.globalTimeline?.pause();\n\n // Videos — remember which were playing so we only resume those.\n document.querySelectorAll(\"video\").forEach((video) => {\n if (!video.paused) {\n video.dataset.clicklyWasPaused = \"false\";\n video.pause();\n }\n });\n}\n\nexport function unfreeze(): void {\n if (typeof document === \"undefined\") return;\n if (!_s.frozen) return;\n _s.frozen = false;\n\n // Replay queued setTimeout callbacks on microtask-ish boundaries. Using\n // origSetTimeout(cb, 0) avoids blocking the main thread if the queue is\n // large. Re-check `_s.frozen` before executing each — if freeze() was\n // called again between scheduling and firing, re-queue instead.\n const timeoutQueue = _s.frozenTimeoutQueue;\n _s.frozenTimeoutQueue = [];\n for (const cb of timeoutQueue) {\n _s.origSetTimeout(() => {\n if (_s.frozen) {\n _s.frozenTimeoutQueue.push(cb);\n return;\n }\n try { cb(); } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] error replaying queued timeout:\", e);\n }\n }, 0);\n }\n\n // Replay queued rAF callbacks on the next frame.\n const rafQueue = _s.frozenRAFQueue;\n _s.frozenRAFQueue = [];\n for (const cb of rafQueue) {\n _s.origRAF((ts: number) => {\n if (_s.frozen) {\n _s.frozenRAFQueue.push(cb);\n return;\n }\n try { cb(ts); } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] error replaying queued rAF:\", e);\n }\n });\n }\n\n // WAAPI — resume the exact animations we paused BEFORE removing CSS.\n // Removing CSS first can cause the browser to replace animation objects.\n for (const anim of _s.pausedAnimations) {\n try { anim.play(); } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] error resuming animation:\", e);\n }\n }\n _s.pausedAnimations = [];\n\n // GSAP — resume.\n getGsap()?.globalTimeline?.resume();\n\n // CSS — remove the freeze stylesheet so normal animations resume.\n document.getElementById(STYLE_ID)?.remove();\n\n // Videos — only resume those we paused.\n document.querySelectorAll(\"video\").forEach((video) => {\n if (video.dataset.clicklyWasPaused === \"false\") {\n void video.play().catch(() => {});\n delete video.dataset.clicklyWasPaused;\n }\n });\n}\n","/**\n * Screenshot capture for annotations.\n *\n * Uses `modern-screenshot` to render the page DOM to a JPEG and composites\n * any drawn strokes on top in stroke color. Strokes are stored in document\n * coords, so we translate by the capture region's origin.\n *\n * If modern-screenshot fails to load (network, CSP), we fall back to a\n * stroke-only capture against a white background so the user still gets\n * something usable. We never throw — caller gets `null` and decides.\n *\n * Ported from Agentation's draw-wip `utils/screenshot.ts`. The 400+ line\n * zero-dependency DOM walker in the original is replaced with the\n * modern-screenshot dependency, per the Phase 6 dependency decision.\n */\n\nimport type { AnnotationStroke } from \"@useclickly/core\";\n\n/** A box in document coords (clientX + scrollX, clientY + scrollY). */\nexport interface CaptureRegion {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nconst DEFAULT_PADDING = 24;\nconst DEFAULT_MAX_DIM = 1024;\nconst JPEG_QUALITY = 0.85;\n\n/**\n * Capture the page region containing `region` (in document coords) as a JPEG.\n * Strokes are painted on top in their stored color/thickness.\n * Returns a data URL or null on failure.\n *\n * The capture intentionally hides Clickly UI (toolbar/popup/canvas) by\n * temporarily setting visibility on `[data-clickly-root]`.\n */\nexport async function captureAnnotationRegion(\n region: CaptureRegion,\n strokes: AnnotationStroke[] = [],\n opts: { padding?: number; maxDim?: number } = {},\n): Promise<string | null> {\n if (typeof document === \"undefined\") return null;\n const padding = opts.padding ?? DEFAULT_PADDING;\n const maxDim = opts.maxDim ?? DEFAULT_MAX_DIM;\n\n const cx = Math.max(0, region.x - padding);\n const cy = Math.max(0, region.y - padding);\n const cw = region.width + padding * 2;\n const ch = region.height + padding * 2;\n const scale = Math.min(1, maxDim / Math.max(cw, ch));\n const outW = Math.round(cw * scale);\n const outH = Math.round(ch * scale);\n if (outW < 4 || outH < 4) return null;\n\n const host = document.querySelector(\"[data-clickly-root]\") as HTMLElement | null;\n const prevVis = host?.style.visibility;\n if (host) host.style.visibility = \"hidden\";\n\n try {\n let pageDataUrl: string | null = null;\n try {\n // Lazy import so consumers that never call capture don't pay the\n // bundle cost. modern-screenshot is browser-only. Cast through\n // unknown because the user may not have installed it yet at\n // typecheck time (it's a runtime dep, declared in package.json).\n const mod = (await import(/* @vite-ignore */ \"modern-screenshot\")) as unknown as {\n domToJpeg: (node: Element, opts?: { quality?: number; backgroundColor?: string }) => Promise<string>;\n };\n pageDataUrl = await mod.domToJpeg(document.body, {\n quality: JPEG_QUALITY,\n backgroundColor: \"#ffffff\",\n });\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] modern-screenshot failed; falling back to strokes-only capture\", e);\n }\n\n return await composeCapture({\n pageDataUrl,\n cx, cy, cw, ch, outW, outH, scale, strokes,\n });\n } finally {\n if (host) host.style.visibility = prevVis ?? \"\";\n }\n}\n\nasync function composeCapture(args: {\n pageDataUrl: string | null;\n cx: number;\n cy: number;\n cw: number;\n ch: number;\n outW: number;\n outH: number;\n scale: number;\n strokes: AnnotationStroke[];\n}): Promise<string | null> {\n const { pageDataUrl, cx, cy, cw, ch, outW, outH, scale, strokes } = args;\n const canvas = document.createElement(\"canvas\");\n canvas.width = outW;\n canvas.height = outH;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n\n // White background — visible if the page capture is missing or if the\n // captured region has transparency.\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, outW, outH);\n\n if (pageDataUrl) {\n try {\n const img = await loadImage(pageDataUrl);\n // The captured image is the whole body; draw with negative offset so\n // our region is at (0, 0) of the output canvas.\n ctx.save();\n // modern-screenshot returns at devicePixelRatio. Compute the source\n // scale from img dimensions vs. document.body's rendered size.\n const bodyRect = document.body.getBoundingClientRect();\n const sxScale = img.width / Math.max(1, bodyRect.width);\n const syScale = img.height / Math.max(1, bodyRect.height);\n ctx.drawImage(\n img,\n cx * sxScale, cy * syScale, cw * sxScale, ch * syScale,\n 0, 0, outW, outH,\n );\n ctx.restore();\n } catch {\n // Fall through — keep white bg.\n }\n }\n\n // Composite strokes on top. Stroke points are in document coords; map\n // to canvas coords via (p - cx) * scale.\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n for (const stroke of strokes) {\n if (stroke.points.length === 0) continue;\n ctx.strokeStyle = stroke.color;\n ctx.lineWidth = stroke.thickness * scale;\n ctx.beginPath();\n ctx.moveTo((stroke.points[0]!.x - cx) * scale, (stroke.points[0]!.y - cy) * scale);\n for (let i = 1; i < stroke.points.length; i++) {\n ctx.lineTo((stroke.points[i]!.x - cx) * scale, (stroke.points[i]!.y - cy) * scale);\n }\n ctx.stroke();\n }\n\n try {\n return canvas.toDataURL(\"image/jpeg\", JPEG_QUALITY);\n } catch {\n return null;\n }\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = src;\n });\n}\n","/**\n * Composite multiple annotation screenshots into one numbered strip image.\n *\n * Ported from Agentation's `composite-screenshot.ts`. Visual style follows\n * Clickly's marker color (driven by settings.markerColor) so the strip\n * matches what the user sees on-page. Per-annotation `color` overrides the\n * default badge color.\n *\n * Returns a PNG data URL or null if nothing usable.\n */\n\nconst BADGE_SIZE = 24;\nconst BADGE_RADIUS = 12;\nconst SECTION_GAP = 20;\nconst CONTENT_PADDING = 16;\nconst DEFAULT_BADGE_COLOR = \"#3c82f7\";\nconst DIVIDER_COLOR = \"rgba(0, 0, 0, 0.06)\";\nconst FONT_STACK = \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\";\n\nexport interface CompositeEntry {\n annotationNumber: number;\n dataUrl: string;\n /** Optional per-annotation color override (defaults to DEFAULT_BADGE_COLOR). */\n color?: string;\n}\n\nexport async function compositeAnnotationScreenshots(\n entries: CompositeEntry[],\n): Promise<string | null> {\n if (entries.length === 0) return null;\n\n // Load all images, skip any that fail.\n const loaded: Array<{ num: number; img: HTMLImageElement; color?: string }> = [];\n for (const entry of entries) {\n try {\n loaded.push({\n num: entry.annotationNumber,\n img: await loadImage(entry.dataUrl),\n color: entry.color,\n });\n } catch {\n // Skip — never throw out of composite.\n }\n }\n if (loaded.length === 0) return null;\n\n const imgWidth = Math.max(...loaded.map((e) => e.img.width));\n const width = imgWidth + CONTENT_PADDING * 2;\n let height = CONTENT_PADDING;\n for (let i = 0; i < loaded.length; i++) {\n height += BADGE_SIZE + 8 + loaded[i]!.img.height;\n if (i < loaded.length - 1) height += SECTION_GAP;\n }\n height += CONTENT_PADDING;\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n\n ctx.fillStyle = \"#ffffff\";\n ctx.fillRect(0, 0, width, height);\n\n let y = CONTENT_PADDING;\n for (let i = 0; i < loaded.length; i++) {\n const { num, img, color } = loaded[i]!;\n if (i > 0) {\n ctx.fillStyle = DIVIDER_COLOR;\n ctx.fillRect(CONTENT_PADDING, y - SECTION_GAP / 2, imgWidth, 1);\n }\n drawBadge(ctx, CONTENT_PADDING, y, num, color);\n y += BADGE_SIZE + 8;\n\n // Subtle border around screenshot.\n ctx.save();\n ctx.strokeStyle = \"rgba(0, 0, 0, 0.08)\";\n ctx.lineWidth = 1;\n if (typeof ctx.roundRect === \"function\") {\n ctx.beginPath();\n ctx.roundRect(CONTENT_PADDING - 0.5, y - 0.5, img.width + 1, img.height + 1, 4);\n ctx.stroke();\n } else {\n ctx.strokeRect(CONTENT_PADDING - 0.5, y - 0.5, img.width + 1, img.height + 1);\n }\n ctx.restore();\n\n ctx.save();\n if (typeof ctx.roundRect === \"function\") {\n ctx.beginPath();\n ctx.roundRect(CONTENT_PADDING, y, img.width, img.height, 4);\n ctx.clip();\n }\n ctx.drawImage(img, CONTENT_PADDING, y);\n ctx.restore();\n\n y += img.height + SECTION_GAP;\n }\n\n try {\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n}\n\nfunction drawBadge(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n num: number,\n color?: string,\n): void {\n const cx = x + BADGE_SIZE / 2;\n const cy = y + BADGE_SIZE / 2;\n ctx.save();\n ctx.shadowColor = \"rgba(0, 0, 0, 0.15)\";\n ctx.shadowBlur = 4;\n ctx.shadowOffsetY = 1;\n ctx.fillStyle = color || DEFAULT_BADGE_COLOR;\n ctx.beginPath();\n ctx.arc(cx, cy, BADGE_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n ctx.fillStyle = \"#ffffff\";\n ctx.font = `600 12px ${FONT_STACK}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(`${num}`, cx, cy + 1);\n\n ctx.textAlign = \"start\";\n ctx.textBaseline = \"alphabetic\";\n}\n\nfunction loadImage(dataUrl: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = reject;\n img.src = dataUrl;\n });\n}\n","/**\n * Copy an image data URL to the OS clipboard as PNG.\n *\n * The Clipboard API only accepts PNG for image writes in every shipping\n * browser, so a JPEG capture is re-encoded through a canvas before write.\n * Requires a secure context (https:// or localhost) and a focused tab.\n * Returns true on success; never throws — the save path that callers run\n * in parallel must not be blocked by a clipboard failure.\n */\nexport async function copyImageToClipboard(dataUrl: string): Promise<boolean> {\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.write) return false;\n if (typeof window === \"undefined\" || !window.ClipboardItem) return false;\n\n try {\n // Decode source bitmap.\n const sourceBlob = await (await fetch(dataUrl)).blob();\n const bitmap = await createImageBitmap(sourceBlob);\n\n // Re-encode to PNG via OffscreenCanvas (or plain canvas as fallback).\n const pngBlob = await encodeToPng(bitmap);\n if (!pngBlob) return false;\n\n await navigator.clipboard.write([\n new ClipboardItem({ \"image/png\": pngBlob }),\n ]);\n return true;\n } catch (e) {\n // Clipboard writes routinely fail when the tab isn't focused, on\n // insecure origins, or when the user denied permission. Logging at\n // warn level only — never throw, so the save path is unaffected.\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] copy image to clipboard failed:\", e);\n return false;\n }\n}\n\nasync function encodeToPng(bitmap: ImageBitmap): Promise<Blob | null> {\n // Prefer OffscreenCanvas — no DOM thrash, no layout work.\n if (typeof OffscreenCanvas !== \"undefined\") {\n try {\n const oc = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = oc.getContext(\"2d\");\n if (!ctx) return null;\n ctx.drawImage(bitmap, 0, 0);\n return await oc.convertToBlob({ type: \"image/png\" });\n } catch {\n /* fall through to DOM canvas */\n }\n }\n return new Promise((resolve) => {\n const c = document.createElement(\"canvas\");\n c.width = bitmap.width;\n c.height = bitmap.height;\n const ctx = c.getContext(\"2d\");\n if (!ctx) return resolve(null);\n ctx.drawImage(bitmap, 0, 0);\n c.toBlob((blob) => resolve(blob), \"image/png\");\n });\n}\n","/**\n * File System Access save with IndexedDB-persisted directory handle.\n *\n * First save: prompts the user for a directory. Subsequent saves go to\n * that directory silently. If the user revokes access or the API isn't\n * supported, we fall back to a hidden `<a download>` anchor click.\n *\n * The dir handle is stored in the same IndexedDB used for strokes —\n * `handles` object store (see strokeDB.ts). Ported from Agentation's\n * `utils/download.ts`. Marker attribute on the anchor element is\n * data-clickly-toolbar so the engine doesn't suppress the synthetic\n * click that `a.click()` emits.\n */\n\nimport {\n loadDirHandle,\n saveDirHandle,\n clearDirHandle,\n} from \"./strokeDB\";\n\nexport interface SaveResult {\n saved: boolean;\n /** Path string to reference from generated markdown / UI. */\n path: string | null;\n usedFSAccess: boolean;\n}\n\nexport function isFileSystemAccessSupported(): boolean {\n return typeof window !== \"undefined\" && \"showDirectoryPicker\" in window;\n}\n\n/* ─── Directory handle management ────────────────────────────────── */\n\nlet _cachedHandle: FileSystemDirectoryHandle | null = null;\n\n/**\n * Prompt the user to pick a directory. Persists the handle in IndexedDB\n * so we can reuse it across reloads.\n */\nexport async function pickSaveDirectory(): Promise<string | null> {\n if (!isFileSystemAccessSupported()) return null;\n try {\n // showDirectoryPicker isn't typed in older lib.dom.d.ts; the cast\n // is the standard workaround.\n const handle = await (window as unknown as {\n showDirectoryPicker: (opts: { id?: string; mode?: string; startIn?: string }) => Promise<FileSystemDirectoryHandle>;\n }).showDirectoryPicker({ id: \"clickly\", mode: \"readwrite\", startIn: \"desktop\" });\n _cachedHandle = handle;\n await saveDirHandle(handle);\n return handle.name;\n } catch {\n return null; // user cancelled\n }\n}\n\n/** Has the user picked a directory whose permission is still valid? */\nexport async function hasSaveDirectory(): Promise<boolean> {\n if (!isFileSystemAccessSupported()) return false;\n return (await getGrantedHandle()) !== null;\n}\n\n/** Forget the previously chosen save folder (next save will re-prompt). */\nexport async function forgetSaveDirectory(): Promise<void> {\n _cachedHandle = null;\n await clearDirHandle();\n}\n\nasync function getGrantedHandle(): Promise<FileSystemDirectoryHandle | null> {\n const candidate = _cachedHandle ?? (await loadDirHandle());\n if (!candidate) return null;\n const perm = await checkPermission(candidate);\n if (perm === \"granted\") {\n _cachedHandle = candidate;\n return candidate;\n }\n return null;\n}\n\nasync function checkPermission(handle: FileSystemDirectoryHandle): Promise<PermissionState | \"prompt\"> {\n // queryPermission / requestPermission aren't in standard TS lib yet.\n const h = handle as unknown as {\n queryPermission?: (opts: { mode: string }) => Promise<PermissionState>;\n requestPermission?: (opts: { mode: string }) => Promise<PermissionState>;\n };\n try {\n if (h.queryPermission) {\n const q = await h.queryPermission({ mode: \"readwrite\" });\n if (q === \"granted\") return \"granted\";\n }\n if (h.requestPermission) {\n const r = await h.requestPermission({ mode: \"readwrite\" });\n return r;\n }\n } catch {\n /* stale handle */\n }\n return \"denied\";\n}\n\n/* ─── Save ────────────────────────────────────────────────────────── */\n\nexport async function saveDataUrl(\n dataUrl: string,\n filename: string,\n): Promise<SaveResult> {\n // Preferred path: File System Access API to the pre-granted directory.\n if (isFileSystemAccessSupported()) {\n const handle = await getGrantedHandle();\n if (handle) {\n const ok = await writeToDirectory(handle, dataUrl, filename);\n if (ok) {\n return { saved: true, path: `${handle.name}/${filename}`, usedFSAccess: true };\n }\n }\n }\n\n // Fallback: download via anchor click.\n const ok = downloadViaAnchor(dataUrl, filename);\n return {\n saved: ok,\n path: ok ? `~/Downloads/${filename}` : null,\n usedFSAccess: false,\n };\n}\n\nasync function writeToDirectory(\n dir: FileSystemDirectoryHandle,\n dataUrl: string,\n filename: string,\n): Promise<boolean> {\n try {\n const fileHandle = await dir.getFileHandle(filename, { create: true });\n // createWritable is on FileSystemFileHandle; cast to keep TS happy on\n // older lib.dom versions.\n const writable = await (fileHandle as unknown as {\n createWritable: () => Promise<{ write: (b: Blob) => Promise<void>; close: () => Promise<void> }>;\n }).createWritable();\n const blob = await (await fetch(dataUrl)).blob();\n await writable.write(blob);\n await writable.close();\n return true;\n } catch (e) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] FSA write failed:\", e);\n return false;\n }\n}\n\nfunction downloadViaAnchor(dataUrl: string, filename: string): boolean {\n try {\n const a = document.createElement(\"a\");\n a.href = dataUrl;\n a.download = filename;\n a.style.display = \"none\";\n // Mark as Clickly UI so the engine's click suppressor ignores the\n // synthetic click that a.click() dispatches.\n a.setAttribute(\"data-clickly-toolbar\", \"\");\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n return true;\n } catch {\n return false;\n }\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Annotation } from \"@useclickly/core\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { useSettings } from \"../state/settings\";\nimport { formatOne } from \"../output/markdown\";\nimport { originalSetTimeout } from \"./freezeAnimations\";\nimport { captureAnnotationRegion } from \"./screenshot\";\nimport { compositeAnnotationScreenshots, type CompositeEntry } from \"./compositeScreenshot\";\nimport { copyImageToClipboard } from \"./copyImage\";\nimport { saveDataUrl } from \"./saveFile\";\nimport { IconCamera, IconClose, IconCopy, IconDownload } from \"./icons\";\n\ninterface Props {\n anchor: { x: number; y: number };\n width: number;\n onClose: () => void;\n}\n\nexport function AnnotationList({ anchor, width, onClose }: Props) {\n const items = useAnnotationsList();\n const remove = useAnnotations((s) => s.remove);\n const outputDetail = useSettings((s) => s.outputDetail);\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (ref.current && e.composedPath().includes(ref.current)) return;\n onClose();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [onClose]);\n\n const estimatedHeight = Math.min(window.innerHeight * 0.55, items.length * 88 + 48);\n const top = Math.max(8, anchor.y - estimatedHeight - 12);\n const left = Math.min(window.innerWidth - 336, Math.max(8, anchor.x));\n\n const [exporting, setExporting] = useState(false);\n const update = useAnnotations((s) => s.update);\n\n /**\n * Build a numbered strip from every annotation that has a screenshot.\n * Saves via FSA (preferred) or download anchor. Annotations without a\n * screenshot are silently skipped — they can be captured per-card first.\n */\n const exportComposite = async () => {\n if (exporting) return;\n setExporting(true);\n try {\n const entries: CompositeEntry[] = items\n .map((a, i) =>\n a.screenshot\n ? { annotationNumber: i + 1, dataUrl: a.screenshot.dataUrl }\n : null,\n )\n .filter((e): e is CompositeEntry => e !== null);\n if (entries.length === 0) {\n // Nothing to composite — give visible feedback by surfacing on\n // the button title for a beat.\n return;\n }\n const composite = await compositeAnnotationScreenshots(entries);\n if (!composite) return;\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n // Run clipboard + save in parallel. Clipboard returns false on\n // failure (no throw); save proceeds regardless.\n await Promise.all([\n copyImageToClipboard(composite),\n saveDataUrl(composite, `clickly-annotations-${stamp}.png`),\n ]);\n } finally {\n setExporting(false);\n }\n };\n\n return (\n <div ref={ref} className=\"clickly-list\" style={{ left, top }}>\n <div className=\"list-header\">\n <span className=\"list-title\">Annotations</span>\n <span className=\"list-count\">{items.length}</span>\n {items.length > 0 && (\n <button\n className=\"list-action-btn\"\n onClick={exportComposite}\n title=\"Export all screenshots as a numbered image strip\"\n disabled={exporting}\n style={{ marginLeft: \"auto\" }}\n >\n <IconDownload />\n </button>\n )}\n </div>\n\n {items.length === 0 ? (\n <div className=\"list-empty\">No annotations yet.</div>\n ) : (\n <div className=\"list-items\">\n {items.map((a, i) => (\n <AnnotationCard\n key={a.id}\n annotation={a}\n index={i + 1}\n outputDetail={outputDetail}\n onRemove={() => remove(a.id)}\n onCaptured={(data) =>\n update(a.id, {\n screenshot: { mimeType: \"image/jpeg\", dataUrl: data, width: 0, height: 0 },\n })\n }\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/* ─── Individual card ─────────────────────────────────────────── */\n\nfunction AnnotationCard({\n annotation: a,\n index,\n outputDetail,\n onRemove,\n onCaptured,\n}: {\n annotation: Annotation;\n index: number;\n outputDetail: string;\n onRemove: () => void;\n onCaptured: (dataUrl: string) => void;\n}) {\n const [copied, setCopied] = useState(false);\n const [capturing, setCapturing] = useState(false);\n\n const copyOne = async () => {\n const md = formatOne(a, index, outputDetail as any);\n try {\n await navigator.clipboard.writeText(md);\n setCopied(true);\n // originalSetTimeout: the patched setTimeout would queue this until\n // unfreeze, leaving \"Copied!\" stuck on screen indefinitely.\n originalSetTimeout(() => setCopied(false), 1500);\n } catch { /* ignore */ }\n };\n\n /** Capture this annotation's region, copy to clipboard, save to\n * chosen folder, persist data URL on the annotation so composite\n * export can include it. Clipboard + save run in parallel and a\n * clipboard failure never blocks the save. */\n const capture = async () => {\n if (capturing) return;\n setCapturing(true);\n try {\n const box = a.boundingBox;\n if (!box) return;\n const data = await captureAnnotationRegion(box, a.strokes ?? []);\n if (!data) return;\n onCaptured(data);\n const stamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n await Promise.all([\n copyImageToClipboard(data),\n saveDataUrl(data, `clickly-${index}-${stamp}.jpg`),\n ]);\n } finally {\n setCapturing(false);\n }\n };\n\n return (\n <div className=\"list-card\">\n {/* Card header: number + element path + actions */}\n <div className=\"list-card-header\">\n <span className=\"list-card-num\">#{index}</span>\n <span className=\"list-card-path\">{a.elementPath}</span>\n <div className=\"list-card-actions\">\n <button\n className=\"list-action-btn\"\n onClick={capture}\n title=\"Capture screenshot of this annotation\"\n disabled={capturing}\n >\n <IconCamera />\n </button>\n <button\n className={`list-action-btn${copied ? \" copied\" : \"\"}`}\n onClick={copyOne}\n title={`Copy annotation #${index} (${outputDetail})`}\n >\n {copied ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n ) : (\n <IconCopy />\n )}\n </button>\n <button\n className=\"list-action-btn list-action-delete\"\n onClick={onRemove}\n title=\"Remove annotation\"\n >\n <IconClose />\n </button>\n </div>\n </div>\n\n {/* Comment */}\n <p className=\"list-card-comment\">{a.comment}</p>\n\n {/* Suggested CSS badge — shown if present */}\n {a.suggestedCss && (\n <div className=\"list-card-css\">\n <span className=\"list-card-css-label\">CSS changes</span>\n <pre className=\"list-card-css-code\">{a.suggestedCss}</pre>\n </div>\n )}\n </div>\n );\n}\n","import { useRef, useState } from \"react\";\nimport type { SelectionEngine, SelectionMode } from \"@useclickly/core\";\nimport { useDraggable } from \"../hooks/useDraggable\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { resolveTheme, useSettings } from \"../state/settings\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport {\n IconCheck,\n IconClose,\n IconCopy,\n IconCursor,\n IconFreeze,\n IconGrip,\n IconInfo,\n IconLayers,\n IconLayout,\n IconList,\n IconMoon,\n IconPen,\n IconSettings,\n IconSun,\n IconTrash,\n} from \"./icons\";\nimport { SettingsPopover } from \"./SettingsPopover\";\nimport { AnnotationList } from \"./AnnotationList\";\n\n// Toolbar dimensions — must fit every button at the sizes set in\n// styles.ts. Width applied inline on the toolbar div so useDraggable\n// can position it without re-measuring the DOM.\n//\n// Actual count of children in flex order:\n// 1 grip (20px) + 4 mode buttons + 1 divider\n// + 1 freeze + 3 action buttons (annotations / copy / clear)\n// + 1 divider + 1 info + 1 gear + 1 close\n// = 14 children → 13 flex gaps.\n//\n// Math: now 12 icon buttons (added theme toggle in front of Settings)\n// × 34 + 20 grip + 2×(1+10) divider + 14×3 gap + 16 padding ≈ 508px.\n// Rounded to 520 to leave headroom for the optional Annotate pinned-flow\n// button that briefly appears when pins exist.\nconst TOOLBAR_SIZE = { width: 520, height: 46 };\n\nconst SHORTCUTS = [\n { keys: [\"⌘\", \"⇧\", \"F\"], label: \"Toggle toolbar\" },\n { keys: [\"1\"], label: \"Single select mode\" },\n { keys: [\"2\"], label: \"Multi select mode\" },\n { keys: [\"3\"], label: \"Area drag mode\" },\n { keys: [\"4\"], label: \"Draw freehand\" },\n { keys: [\"L\"], label: \"Layout mode (palette + rearrange)\" },\n { keys: [\"P\"], label: \"Freeze / unfreeze animations\" },\n { keys: [\"↵\"], label: \"Annotate pinned elements\" },\n { keys: [\"Esc\"], label: \"Cancel / clear / close\" },\n { keys: [\"⌘\", \"↵\"], label: \"Submit annotation\" },\n { keys: [\"C\"], label: \"Copy all annotations\" },\n { keys: [\"X\"], label: \"Clear all annotations\" },\n];\n\n/** Hover-to-reveal shortcuts panel */\nfunction ShortcutsPanel() {\n const [visible, setVisible] = useState(false);\n return (\n <span\n className=\"clickly-tip shortcuts-trigger\"\n onMouseEnter={() => setVisible(true)}\n onMouseLeave={() => setVisible(false)}\n >\n <button\n className=\"clickly-btn icon-only\"\n aria-label=\"Show keyboard shortcuts\"\n >\n <IconInfo />\n </button>\n {visible && (\n <div className=\"shortcuts-panel\" role=\"tooltip\">\n <div className=\"shortcuts-title\">Keyboard shortcuts</div>\n {SHORTCUTS.map((s) => (\n <div key={s.label} className=\"shortcuts-row\">\n <span className=\"shortcuts-label\">{s.label}</span>\n <span className=\"shortcuts-keys\">\n {s.keys.map((k) => <kbd key={k}>{k}</kbd>)}\n </span>\n </div>\n ))}\n </div>\n )}\n </span>\n );\n}\n\ninterface Props {\n engine: SelectionEngine;\n onCollapse: () => void;\n isClosing?: boolean;\n onCloseEnd?: () => void;\n frozen: boolean;\n onFreezeToggle: () => void;\n}\n\n/** Tooltip wrapper — shows label + optional keyboard shortcut on hover */\nfunction Tip({\n label,\n shortcut,\n children,\n}: {\n label: string;\n shortcut?: string;\n children: React.ReactNode;\n}) {\n return (\n <span className=\"clickly-tip\">\n {children}\n <span className=\"tip-bubble\" aria-hidden=\"true\">\n {label}\n {shortcut && <kbd>{shortcut}</kbd>}\n </span>\n </span>\n );\n}\n\nexport function Toolbar({ engine, onCollapse, isClosing, onCloseEnd, frozen, onFreezeToggle }: Props) {\n const state = useEngineState(engine);\n const annotations = useAnnotationsList();\n const clearAnnotations = useAnnotations((s) => s.clear);\n const outputDetail = useSettings((s) => s.outputDetail);\n const theme = useSettings((s) => s.theme);\n const setSettings = useSettings((s) => s.set);\n const resolvedTheme = resolveTheme(theme);\n const toggleTheme = () => {\n // Flip to the opposite of what's currently resolved. This locks the\n // choice (no more \"system\") so subsequent OS changes don't unflip\n // the user's explicit toggle.\n setSettings({ theme: resolvedTheme === \"dark\" ? \"light\" : \"dark\" });\n };\n\n const [showSettings, setShowSettings] = useState(false);\n const [showList, setShowList] = useState(false);\n const anchorRef = useRef<HTMLDivElement>(null);\n\n const { position, handleProps } = useDraggable(\n {\n x: Math.max(8, window.innerWidth - TOOLBAR_SIZE.width - 16),\n y: Math.max(8, window.innerHeight - TOOLBAR_SIZE.height - 16),\n },\n TOOLBAR_SIZE,\n );\n\n const isActive = state.kind !== \"idle\";\n const currentMode: SelectionMode | null =\n state.kind === \"inspect\" || state.kind === \"pressed\" || state.kind === \"dragging\"\n ? state.mode\n : null;\n // Layout mode lives in its own state branch (layoutIdle / layoutPlacing\n // / layoutRearranging). Track it separately so the toolbar button can\n // show the active treatment regardless of whether the user is currently\n // dragging a placement.\n const isLayoutMode =\n state.kind === \"layoutIdle\" ||\n state.kind === \"layoutPlacing\" ||\n state.kind === \"layoutRearranging\";\n const pinnedCount =\n state.kind === \"inspect\" || state.kind === \"pressed\" || state.kind === \"dragging\"\n ? state.pinned.length\n : 0;\n\n const setMode = (m: SelectionMode) => {\n if (!isActive) engine.activate(m);\n else engine.setMode(m);\n };\n\n const onCopy = async () => {\n const md = annotationsToMarkdown(annotations, outputDetail);\n try {\n await navigator.clipboard.writeText(md);\n } catch {\n /* ignore */\n }\n };\n\n return (\n // Fragment so the popovers render as SIBLINGS of the toolbar div, not\n // children. The toolbar's open/close animation leaves a transform on\n // .clickly-toolbar, which makes it the containing block for any\n // position: fixed descendant — putting the panels at toolbar.x + panel.x\n // (off-screen right). Hoisting them out keeps position: fixed\n // resolving against the viewport as intended.\n <>\n <div\n ref={anchorRef}\n className={`clickly-toolbar${isClosing ? \" is-closing\" : \"\"}`}\n style={{ left: position.x, top: position.y, width: TOOLBAR_SIZE.width }}\n onAnimationEnd={isClosing ? onCloseEnd : undefined}\n aria-label=\"Clickly toolbar\"\n data-clickly-toolbar=\"\"\n >\n {/* Drag handle */}\n <Tip label=\"Move\">\n <div\n className=\"grip\"\n {...handleProps}\n role=\"separator\"\n aria-orientation=\"vertical\"\n >\n <IconGrip />\n </div>\n </Tip>\n\n {/* Mode buttons */}\n <Tip label=\"Select\" shortcut=\"1\">\n <button\n className={`clickly-btn icon-only${currentMode === \"single\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"single\")}\n aria-label=\"Single-element selection mode\"\n aria-pressed={currentMode === \"single\"}\n >\n <IconCursor />\n </button>\n </Tip>\n <Tip label=\"Multi-select\" shortcut=\"2\">\n <button\n className={`clickly-btn icon-only${currentMode === \"multi\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"multi\")}\n aria-label=\"Multi-element selection mode\"\n aria-pressed={currentMode === \"multi\"}\n >\n <IconLayers />\n </button>\n </Tip>\n <Tip label=\"Draw\" shortcut=\"4\">\n <button\n className={`clickly-btn icon-only${currentMode === \"draw\" ? \" is-active\" : \"\"}`}\n onClick={() => setMode(\"draw\")}\n aria-label=\"Freehand draw mode\"\n aria-pressed={currentMode === \"draw\"}\n >\n <IconPen />\n </button>\n </Tip>\n <Tip label=\"Layout\" shortcut=\"L\">\n <button\n className={`clickly-btn icon-only${isLayoutMode ? \" is-active\" : \"\"}`}\n onClick={() => setMode(isLayoutMode ? \"single\" : \"layout\")}\n aria-label=\"Layout mode — palette + rearrange\"\n aria-pressed={isLayoutMode}\n >\n <IconLayout />\n </button>\n </Tip>\n\n <div className=\"divider\" />\n\n {/* Pinned annotate flow */}\n {pinnedCount > 0 && (\n <>\n <Tip label={`Annotate ${pinnedCount} element(s)`} shortcut=\"↵\">\n <button\n className=\"clickly-btn primary-pinned\"\n onClick={() => engine.annotatePinned()}\n >\n <IconCheck />\n <span>{pinnedCount}</span>\n </button>\n </Tip>\n <Tip label=\"Clear selection\" shortcut=\"Esc\">\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => engine.clearPinned()}\n >\n <IconClose />\n </button>\n </Tip>\n <div className=\"divider\" />\n </>\n )}\n\n {/* Freeze animations */}\n <Tip label={frozen ? \"Unfreeze animations\" : \"Freeze animations\"}>\n <button\n className={`clickly-btn icon-only${frozen ? \" is-freeze\" : \"\"}`}\n onClick={onFreezeToggle}\n aria-label={frozen ? \"Unfreeze page animations\" : \"Freeze page animations\"}\n aria-pressed={frozen}\n >\n <IconFreeze />\n </button>\n </Tip>\n\n {/* Actions */}\n <Tip label=\"Annotations\">\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => setShowList((v) => !v)}\n aria-label=\"Show annotation list\"\n >\n <IconList />\n {annotations.length > 0 && (\n <span className=\"clickly-counter\">{annotations.length}</span>\n )}\n </button>\n </Tip>\n\n <Tip label=\"Copy feedback\" shortcut=\"C\">\n <button\n className=\"clickly-btn icon-only\"\n onClick={onCopy}\n aria-label=\"Copy all annotations as markdown\"\n disabled={annotations.length === 0}\n >\n <IconCopy />\n </button>\n </Tip>\n\n <Tip label=\"Clear all\" shortcut=\"X\">\n <button\n className=\"clickly-btn icon-only\"\n onClick={() => clearAnnotations()}\n aria-label=\"Clear all annotations\"\n disabled={annotations.length === 0}\n >\n <IconTrash />\n </button>\n </Tip>\n\n <div className=\"divider\" />\n\n <ShortcutsPanel />\n\n <Tip label={resolvedTheme === \"dark\" ? \"Light mode\" : \"Dark mode\"}>\n <button\n className=\"clickly-btn icon-only\"\n onClick={toggleTheme}\n aria-label={\n resolvedTheme === \"dark\" ? \"Switch to light mode\" : \"Switch to dark mode\"\n }\n >\n {/* Show the icon for the mode the user would SWITCH TO — Figma\n + most editors follow this convention. Dark now → show Sun\n (click → light); light now → show Moon (click → dark). */}\n {resolvedTheme === \"dark\" ? <IconSun /> : <IconMoon />}\n </button>\n </Tip>\n\n <Tip label=\"Settings\">\n <button\n className={`clickly-btn icon-only${showSettings ? \" is-active\" : \"\"}`}\n onClick={() => setShowSettings((v) => !v)}\n aria-label=\"Open settings\"\n aria-expanded={showSettings}\n >\n <IconSettings />\n </button>\n </Tip>\n\n <Tip label=\"Close\" shortcut=\"Esc\">\n <button\n className=\"clickly-btn icon-only\"\n onClick={onCollapse}\n aria-label=\"Collapse Clickly toolbar\"\n >\n <IconClose />\n </button>\n </Tip>\n\n </div>\n\n {/* Hoisted siblings — see fragment comment above. data-clickly-toolbar\n keeps them part of the engine's UI-surface exclusion zone. */}\n {showSettings && (\n <div data-clickly-toolbar=\"\">\n <SettingsPopover\n anchor={{ x: position.x, y: position.y }}\n width={TOOLBAR_SIZE.width}\n onClose={() => setShowSettings(false)}\n />\n </div>\n )}\n\n {showList && (\n <div data-clickly-toolbar=\"\">\n <AnnotationList\n anchor={{ x: position.x, y: position.y }}\n width={TOOLBAR_SIZE.width}\n onClose={() => setShowList(false)}\n />\n </div>\n )}\n </>\n );\n}\n","import { useAnnotationsList } from \"../state/annotations\";\nimport { IconCursor } from \"./icons\";\n\ninterface Props {\n onExpand: () => void;\n}\n\n/**\n * Default state — a small round button anchored bottom-right.\n * Click to expand the full toolbar.\n */\nexport function CollapsedFAB({ onExpand }: Props) {\n const annotations = useAnnotationsList();\n return (\n <button\n className=\"clickly-fab\"\n onClick={onExpand}\n title=\"Open Clickly (⌘/Ctrl+Shift+F)\"\n aria-label=\"Open Clickly toolbar\"\n >\n <IconCursor />\n {annotations.length > 0 && (\n <span className=\"clickly-fab-badge\">{annotations.length}</span>\n )}\n </button>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { nanoid } from \"nanoid\";\nimport {\n collectMetadata,\n collectComputedStyles,\n type Annotation,\n type SelectionEngine,\n} from \"@useclickly/core\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotations } from \"../state/annotations\";\nimport { useSettings } from \"../state/settings\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport { originalRequestAnimationFrame } from \"./freezeAnimations\";\n\nconst POPUP_W = 320;\nconst POPUP_H_EST = 240;\n\nexport function AnnotationPopup({ engine }: { engine: SelectionEngine }) {\n const state = useEngineState(engine);\n const addAnnotation = useAnnotations((s) => s.add);\n const copyOnAdd = useSettings((s) => s.copyOnAdd);\n const outputDetail = useSettings((s) => s.outputDetail);\n\n const [comment, setComment] = useState(\"\");\n const [showStyles, setShowStyles] = useState(false);\n /** When true, CSS rows become editable inputs for live preview. */\n const [editMode, setEditMode] = useState(false);\n /** Original computed styles (read-only baseline). */\n const [styles, setStyles] = useState<Record<string, string>>({});\n /** User's edits — only contains properties that have been changed. */\n const [editedStyles, setEditedStyles] = useState<Record<string, string>>({});\n /** Reference to the primary element so we can apply/revert live styles. */\n const targetElRef = useRef<HTMLElement | null>(null);\n const taRef = useRef<HTMLTextAreaElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (state.kind === \"annotating\") {\n setComment(\"\");\n setShowStyles(false);\n setEditMode(false);\n setEditedStyles({});\n\n const sel = engine.resolveSelection();\n const el =\n sel?.kind === \"single\"\n ? sel.element\n : sel?.kind === \"multi\" || sel?.kind === \"area\"\n ? sel.elements[0]\n : null;\n\n targetElRef.current = el instanceof HTMLElement ? el : null;\n\n if (el) {\n setStyles(collectComputedStyles(el, \"standard\"));\n } else {\n setStyles({});\n }\n // originalRequestAnimationFrame: focusing the textarea must happen\n // even when the page is frozen.\n originalRequestAnimationFrame(() => taRef.current?.focus());\n }\n // NOTE: We do NOT revert live CSS styles when the popup closes naturally\n // (outside click). CSS stays on the element as a preview so the user can\n // see the change. It is only reverted when they explicitly click Cancel.\n }, [state.kind, engine]);\n\n /* ─── Outside-click closes popup WITHOUT reverting CSS ─────── */\n useEffect(() => {\n if (state.kind !== \"annotating\") return;\n const onDown = (e: PointerEvent) => {\n // composedPath() pierces the shadow DOM boundary correctly.\n if (popupRef.current && e.composedPath().includes(popupRef.current)) return;\n // Clicked outside — dismiss without touching live CSS on the element.\n engine.commit();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [state.kind, engine]);\n\n /* ─── Live CSS application ─────────────────────────────────── */\n\n const onStyleChange = (prop: string, value: string) => {\n setEditedStyles((prev) => ({ ...prev, [prop]: value }));\n targetElRef.current?.style.setProperty(prop, value);\n };\n\n const revertProp = (prop: string) => {\n targetElRef.current?.style.removeProperty(prop);\n setEditedStyles((prev) => {\n const next = { ...prev };\n delete next[prop];\n return next;\n });\n };\n\n /* ─── Actions ──────────────────────────────────────────────── */\n\n const cancel = () => {\n // Only Cancel explicitly reverts the live CSS preview on the element.\n revertAll(targetElRef.current, editedStyles);\n setEditedStyles({});\n engine.commit();\n };\n\n const onKey = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\") { e.preventDefault(); cancel(); }\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) { e.preventDefault(); submit(); }\n };\n\n const submit = () => {\n if (state.kind !== \"annotating\") return;\n const sel = engine.resolveSelection();\n if (!sel) return;\n\n // Layout Mode selections (placement, rearrange) are handled by their\n // own popup flow — the feedback popup should never see them. Bail\n // out defensively so the narrowing below stays simple.\n if (sel.kind === \"placement\" || sel.kind === \"rearrange\") return;\n\n const elements: Element[] =\n sel.kind === \"single\" ? [sel.element] :\n sel.kind === \"stroke\" ? [] :\n sel.elements;\n // Strokes have no underlying elements but still produce an annotation.\n if (elements.length === 0 && sel.kind !== \"stroke\") return;\n\n // Build the CSS diff for the AI agent — stored separately from comment.\n const cssDiff = buildCssDiff(styles, editedStyles);\n const sharedComment = comment.trim() || \"(no comment)\";\n\n // Revert live styles — the AI agent will make the real code change.\n revertAll(targetElRef.current, editedStyles);\n setEditedStyles({});\n\n const isMulti = sel.kind !== \"single\" && sel.kind !== \"stroke\";\n const showReact = useSettings.getState().showReactComponents;\n\n // Stroke-only path: no DOM element, just the stroke geometry.\n // Stored in document coords (clientX + scrollX) so the canvas keeps\n // painting at the right page position after the user scrolls.\n if (sel.kind === \"stroke\") {\n const sx = window.scrollX;\n const sy = window.scrollY;\n const docPoints = sel.stroke.points.map((p) => ({ x: p.x + sx, y: p.y + sy }));\n let xMin = docPoints[0]!.x, xMax = xMin, yMin = docPoints[0]!.y, yMax = yMin;\n for (const p of docPoints) {\n if (p.x < xMin) xMin = p.x;\n if (p.x > xMax) xMax = p.x;\n if (p.y < yMin) yMin = p.y;\n if (p.y > yMax) yMax = p.y;\n }\n const annotation: Annotation = {\n id: \"ann_\" + nanoid(8),\n comment: sharedComment,\n element: \"stroke\",\n elementPath: \"(freehand)\",\n timestamp: Date.now(),\n x: (xMin + xMax) / 2,\n y: (yMin + yMax) / 2,\n url: location.href,\n boundingBox: { x: xMin, y: yMin, width: xMax - xMin, height: yMax - yMin },\n kind: \"feedback\",\n status: \"pending\",\n strokes: [{\n points: docPoints,\n color: sel.stroke.color,\n thickness: sel.stroke.thickness,\n }],\n };\n addAnnotation(annotation);\n if (copyOnAdd) {\n const all = useAnnotations.getState().list();\n navigator.clipboard?.writeText(annotationsToMarkdown(all, outputDetail)).catch(() => undefined);\n }\n engine.commit();\n return;\n }\n\n for (const el of elements) {\n const md = collectMetadata(el, { detail: outputDetail, includeReact: showReact });\n const annotation: Annotation = {\n id: \"ann_\" + nanoid(8),\n comment: sharedComment,\n element: md.element,\n elementPath: md.elementPath,\n fullPath: md.fullPath,\n timestamp: Date.now(),\n x: md.boundingBox.x + md.boundingBox.width / 2,\n y: md.boundingBox.y + window.scrollY,\n url: location.href,\n boundingBox: md.boundingBox,\n cssClasses: md.cssClasses || undefined,\n computedStyles: stringifyStyles(md.computedStyles),\n accessibility: md.accessibility || undefined,\n nearbyText: md.nearbyText || undefined,\n selectedText: md.selectedText || undefined,\n isFixed: md.isFixed || undefined,\n reactComponents: md.reactComponents || undefined,\n sourceFile: md.sourceFile || undefined,\n sourceLine: md.sourceLine || undefined,\n sourceColumn: md.sourceColumn || undefined,\n isMultiSelect: isMulti,\n kind: \"feedback\",\n status: \"pending\",\n suggestedCss: cssDiff || undefined,\n };\n addAnnotation(annotation);\n }\n\n if (copyOnAdd) {\n const all = useAnnotations.getState().list();\n navigator.clipboard?.writeText(annotationsToMarkdown(all, outputDetail)).catch(() => undefined);\n }\n\n engine.commit();\n };\n\n /* ─── Placement — recalculated on scroll so popup follows element ── */\n\n type Placement = { top: number; left: number; label: string };\n const [placement, setPlacement] = useState<Placement | null>(null);\n\n const calcPlacement = useCallback(() => {\n if (state.kind !== \"annotating\") { setPlacement(null); return; }\n const sel = engine.resolveSelection();\n if (!sel) { setPlacement(null); return; }\n const rect = anchorRect(sel);\n if (!rect) { setPlacement(null); return; }\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const label = describeSelection(sel);\n\n const elementArea = rect.width * rect.height;\n if (elementArea > vw * vh * 0.7) {\n setPlacement({\n top: Math.round((vh - POPUP_H_EST) / 2),\n left: Math.round((vw - POPUP_W) / 2),\n label,\n });\n return;\n }\n\n let top = rect.bottom + 8;\n let left = rect.left;\n if (top + POPUP_H_EST > vh) top = Math.max(8, rect.top - POPUP_H_EST - 8);\n if (left + POPUP_W > vw) left = Math.max(8, vw - POPUP_W - 8);\n setPlacement({ top, left, label });\n }, [state, engine]);\n\n // Recalculate on mount + whenever state changes.\n useEffect(() => {\n calcPlacement();\n }, [calcPlacement]);\n\n // Recalculate on scroll so the popup tracks the element as the page scrolls.\n useEffect(() => {\n if (state.kind !== \"annotating\") return;\n const onScroll = () => calcPlacement();\n window.addEventListener(\"scroll\", onScroll, { capture: true, passive: true });\n return () => window.removeEventListener(\"scroll\", onScroll, { capture: true } as EventListenerOptions);\n }, [state.kind, calcPlacement]);\n\n if (state.kind !== \"annotating\" || !placement) return null;\n\n const styleEntries = Object.entries(styles);\n const hasEdits = Object.keys(editedStyles).length > 0;\n\n return (\n <div ref={popupRef} className=\"clickly-popup\" style={{ top: placement.top, left: placement.left }}>\n {/* Header — click to toggle CSS panel */}\n <div\n className=\"popup-header\"\n role=\"button\"\n aria-expanded={showStyles}\n onClick={() => setShowStyles((v) => !v)}\n >\n <span className=\"popup-chevron\">{showStyles ? \"▾\" : \"›\"}</span>\n <span className=\"popup-label\">{placement.label}</span>\n {/* Edit-mode toggle — only shown when CSS panel is open */}\n {showStyles && (\n <button\n className={`popup-edit-toggle${editMode ? \" is-editing\" : \"\"}`}\n onClick={(e) => { e.stopPropagation(); setEditMode((v) => !v); }}\n title={editMode ? \"Done editing\" : \"Edit CSS live\"}\n aria-label={editMode ? \"Exit CSS edit mode\" : \"Edit CSS values live\"}\n >\n {editMode ? (\n // checkmark when in edit mode\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>\n ) : (\n // pencil icon\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"/><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"/></svg>\n )}\n </button>\n )}\n </div>\n\n {/* Collapsible CSS panel — read-only by default, editable in editMode */}\n {showStyles && styleEntries.length > 0 && (\n <div className=\"popup-styles\">\n {styleEntries.map(([prop, origVal]) => {\n const currentVal = editedStyles[prop] ?? origVal;\n const changed = editedStyles[prop] !== undefined && editedStyles[prop] !== origVal;\n return (\n <div key={prop} className={`style-row${changed ? \" style-row--changed\" : \"\"}`}>\n <span className=\"style-key\">{prop}</span>\n {editMode ? (\n <input\n className=\"style-val-input\"\n value={currentVal}\n onChange={(e) => onStyleChange(prop, e.target.value)}\n spellCheck={false}\n aria-label={prop}\n />\n ) : (\n <span className=\"style-val\">{currentVal}</span>\n )}\n {changed && (\n <button\n className=\"style-revert-btn\"\n onClick={() => revertProp(prop)}\n title=\"Revert to original\"\n >\n ↩\n </button>\n )}\n </div>\n );\n })}\n {hasEdits && (\n <div className=\"style-hint\">\n Changes are live on page. Cancel reverts them.\n </div>\n )}\n </div>\n )}\n\n <textarea\n ref={taRef}\n value={comment}\n placeholder=\"Describe the issue or change… (⌘/Ctrl + Enter to submit)\"\n aria-label=\"Annotation comment\"\n onChange={(e) => setComment(e.target.value)}\n onKeyDown={onKey}\n />\n <div className=\"row\">\n <button className=\"ghost\" onClick={cancel}>Cancel</button>\n <button className=\"primary\" onClick={submit}>Add</button>\n </div>\n </div>\n );\n}\n\n/* ─── Helpers ──────────────────────────────────────────────────── */\n\nfunction revertAll(el: HTMLElement | null, edits: Record<string, string>) {\n if (!el) return;\n for (const prop of Object.keys(edits)) {\n el.style.removeProperty(prop);\n }\n}\n\nfunction buildCssDiff(\n original: Record<string, string>,\n edited: Record<string, string>,\n): string {\n const lines: string[] = [];\n for (const [prop, val] of Object.entries(edited)) {\n if (val !== original[prop]) {\n lines.push(` ${prop}: ${val}; /* was: ${original[prop] ?? \"unset\"} */`);\n }\n }\n if (lines.length === 0) return \"\";\n return `{\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction stringifyStyles(s: Record<string, string>): string | undefined {\n const entries = Object.entries(s);\n if (entries.length === 0) return undefined;\n return entries.map(([k, v]) => `${k}: ${v}`).join(\"; \");\n}\n\nfunction anchorRect(sel: ReturnType<SelectionEngine[\"resolveSelection\"]>): DOMRect | null {\n if (!sel) return null;\n if (sel.kind === \"single\") return sel.element.getBoundingClientRect();\n if (sel.kind === \"area\") return new DOMRect(sel.rect.x, sel.rect.y, sel.rect.width, sel.rect.height);\n // Layout selections anchor off pointer/rect data, not a single element.\n // The feedback popup never opens for these (submit() bails), but keep\n // the narrowing exhaustive for TypeScript.\n if (sel.kind === \"placement\") {\n return new DOMRect(sel.pointer.x, sel.pointer.y, sel.item.width, sel.item.height);\n }\n if (sel.kind === \"rearrange\") {\n const r = sel.currentRect;\n return new DOMRect(r.x, r.y, r.width, r.height);\n }\n if (sel.kind === \"stroke\") {\n // Bounding box of the stroke points (viewport coords).\n const pts = sel.stroke.points;\n if (pts.length === 0) return null;\n let xMin = pts[0]!.x, xMax = xMin, yMin = pts[0]!.y, yMax = yMin;\n for (const p of pts) {\n if (p.x < xMin) xMin = p.x;\n if (p.x > xMax) xMax = p.x;\n if (p.y < yMin) yMin = p.y;\n if (p.y > yMax) yMax = p.y;\n }\n return new DOMRect(xMin, yMin, xMax - xMin, yMax - yMin);\n }\n if (sel.elements.length === 0) return null;\n return sel.elements[0]!.getBoundingClientRect();\n}\n\nconst TAG_LABELS: Record<string, string> = {\n p: \"paragraph\", h1: \"heading\", h2: \"heading\", h3: \"heading\",\n h4: \"heading\", h5: \"heading\", h6: \"heading\",\n a: \"link\", button: \"button\", input: \"input\", textarea: \"textarea\",\n select: \"select\", img: \"image\", video: \"video\", audio: \"audio\",\n form: \"form\", nav: \"nav\", header: \"header\", footer: \"footer\",\n main: \"main\", section: \"section\", article: \"article\", aside: \"aside\",\n ul: \"list\", ol: \"list\", li: \"list item\", table: \"table\",\n td: \"cell\", th: \"header cell\", span: \"span\", div: \"div\",\n label: \"label\", code: \"code\", pre: \"code block\", blockquote: \"quote\",\n strong: \"bold\", em: \"italic\", kbd: \"key\", svg: \"svg\", canvas: \"canvas\",\n};\n\nfunction describeElement(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const type = TAG_LABELS[tag] ?? tag;\n const text = (el.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n if (text.length > 0) {\n const preview = text.length > 48 ? text.slice(0, 48) + \"…\" : text;\n return `${type}: \"${preview}\"`;\n }\n if (el.id) return `${type}: #${el.id}`;\n const cls = el.classList[0];\n if (cls) return `${type}: .${cls}`;\n return type;\n}\n\nfunction describeSelection(sel: NonNullable<ReturnType<SelectionEngine[\"resolveSelection\"]>>): string {\n if (sel.kind === \"single\") return describeElement(sel.element);\n if (sel.kind === \"area\") return `area · ${sel.elements.length} element(s)`;\n if (sel.kind === \"stroke\") return `freehand · ${sel.stroke.points.length} pts`;\n // Layout Mode descriptors — used if a placeholder feedback popup ever\n // appears for these; in normal flow they have their own popup.\n if (sel.kind === \"placement\") return `place ${sel.item.componentType}`;\n if (sel.kind === \"rearrange\") return `move ${sel.target.tagName.toLowerCase()}`;\n // multi\n if (sel.elements.length === 1) return describeElement(sel.elements[0]!);\n return `${sel.elements.length} element(s)`;\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Annotation } from \"@useclickly/core\";\nimport { useAnnotations, useAnnotationsList } from \"../state/annotations\";\nimport { originalRequestAnimationFrame } from \"./freezeAnimations\";\nimport { IconTrash } from \"./icons\";\n\nexport function AnnotationPins() {\n const annotations = useAnnotationsList();\n const [, setVersion] = useState(0);\n\n useEffect(() => {\n let raf: number | null = null;\n const update = () => {\n if (raf !== null) return;\n // originalRequestAnimationFrame: pin repositioning must keep running\n // while the page is frozen so pins follow scroll/resize.\n raf = originalRequestAnimationFrame(() => { raf = null; setVersion((v) => v + 1); });\n };\n window.addEventListener(\"scroll\", update, { capture: true, passive: true });\n window.addEventListener(\"resize\", update, { passive: true });\n return () => {\n if (raf !== null) cancelAnimationFrame(raf);\n window.removeEventListener(\"scroll\", update, { capture: true } as EventListenerOptions);\n window.removeEventListener(\"resize\", update);\n };\n }, []);\n\n return (\n <>\n {annotations.map((a, i) => (\n <Pin key={a.id} number={i + 1} annotation={a} />\n ))}\n </>\n );\n}\n\n/* ─── Human-readable element type labels ───────────────────────── */\n\nconst TAG_LABELS: Record<string, string> = {\n p: \"paragraph\", h1: \"heading\", h2: \"heading\", h3: \"heading\",\n h4: \"heading\", h5: \"heading\", h6: \"heading\",\n a: \"link\", button: \"button\", input: \"input\", textarea: \"textarea\",\n select: \"select\", img: \"image\", video: \"video\", audio: \"audio\",\n form: \"form\", nav: \"nav\", header: \"header\", footer: \"footer\",\n main: \"main\", section: \"section\", article: \"article\", aside: \"aside\",\n ul: \"list\", ol: \"list\", li: \"list item\", table: \"table\",\n td: \"cell\", th: \"header cell\", span: \"span\", div: \"div\",\n label: \"label\", code: \"code\", pre: \"code block\", blockquote: \"quote\",\n};\n\nfunction pinLabel(annotation: Annotation): string {\n const raw = (annotation.element ?? \"\").toLowerCase();\n const tag = raw.split(/[.#\\s]/)[0] ?? \"\";\n return (TAG_LABELS[tag] ?? tag) || \"element\";\n}\n\n/** Parse \"prop: val; prop2: val2\" string back into entries for display. */\nfunction parseStyles(raw: string | undefined): [string, string][] {\n if (!raw) return [];\n return raw.split(\";\")\n .map((s) => s.trim())\n .filter(Boolean)\n .map((s) => {\n const colon = s.indexOf(\":\");\n if (colon === -1) return null;\n return [s.slice(0, colon).trim(), s.slice(colon + 1).trim()] as [string, string];\n })\n .filter(Boolean) as [string, string][];\n}\n\n/* ─── Individual pin ─────────────────────────────────────────── */\n\nfunction Pin({ number, annotation }: { number: number; annotation: Annotation }) {\n const remove = useAnnotations((s) => s.remove);\n const update = useAnnotations((s) => s.update);\n\n const [hovered, setHovered] = useState(false);\n const [editing, setEditing] = useState(false);\n const [draft, setDraft] = useState(annotation.comment);\n const [showStyles, setShowStyles] = useState(false);\n const taRef = useRef<HTMLTextAreaElement>(null);\n const editRef = useRef<HTMLDivElement>(null);\n\n const styleEntries = parseStyles(annotation.computedStyles);\n const label = pinLabel(annotation);\n const headerLabel = annotation.isMultiSelect\n ? `${label} (multi-select)`\n : `${label}: \"${annotation.elementPath}\"`;\n\n const openEdit = () => {\n setDraft(annotation.comment);\n setEditing(true);\n setHovered(false);\n originalRequestAnimationFrame(() => taRef.current?.focus());\n };\n\n const closeEdit = () => { setEditing(false); setShowStyles(false); };\n\n const save = () => {\n const trimmed = draft.trim();\n if (trimmed) update(annotation.id, { comment: trimmed });\n closeEdit();\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") closeEdit();\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) save();\n };\n\n // Close on outside click\n useEffect(() => {\n if (!editing) return;\n const onDown = (e: PointerEvent) => {\n if (editRef.current && e.composedPath().includes(editRef.current)) return;\n closeEdit();\n };\n window.addEventListener(\"pointerdown\", onDown, true);\n return () => window.removeEventListener(\"pointerdown\", onDown, true);\n }, [editing]);\n\n // Green outline on annotated element while editing\n useEffect(() => {\n if (!editing) return;\n let el: HTMLElement | null = null;\n if (annotation.elementPath) {\n try { el = document.querySelector<HTMLElement>(annotation.elementPath); } catch { /* invalid */ }\n }\n if (!el) return;\n const prevOutline = el.style.outline;\n const prevOffset = el.style.outlineOffset;\n el.style.outline = \"2px solid #10b981\";\n el.style.outlineOffset = \"3px\";\n return () => { el!.style.outline = prevOutline; el!.style.outlineOffset = prevOffset; };\n }, [editing, annotation.elementPath]);\n\n const pos = resolvePosition(annotation);\n if (!pos) return null;\n\n return (\n <div\n className=\"clickly-pin\"\n style={{ left: pos.x, top: pos.y }}\n onMouseEnter={() => { if (!editing) setHovered(true); }}\n onMouseLeave={() => setHovered(false)}\n onClick={openEdit}\n role=\"button\"\n tabIndex={0}\n aria-label={`Annotation ${number}: ${annotation.comment}`}\n >\n <span className=\"clickly-pin-num\">{number}</span>\n\n {/* Hover preview */}\n {hovered && !editing && (\n <div className=\"pin-preview\">\n <div className=\"pin-preview-meta\">{label}: {annotation.elementPath}</div>\n <div className=\"pin-preview-comment\">{annotation.comment}</div>\n </div>\n )}\n\n {/* Edit popup — same white style as the annotation creation popup */}\n {editing && (\n <div\n ref={editRef}\n className=\"pin-edit\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header: click to toggle CSS panel — same as .popup-header */}\n <div\n className=\"popup-header\"\n role=\"button\"\n aria-expanded={showStyles}\n onClick={(e) => { e.stopPropagation(); setShowStyles((v) => !v); }}\n >\n <span className=\"popup-chevron\">{showStyles ? \"▾\" : \"›\"}</span>\n <span className=\"popup-label\">{headerLabel}</span>\n </div>\n\n {/* Stored computed styles — read-only, same as creation popup */}\n {showStyles && styleEntries.length > 0 && (\n <div className=\"popup-styles\">\n {styleEntries.map(([k, v]) => (\n <div key={k} className=\"style-row\">\n <span className=\"style-key\">{k}</span>\n <span className=\"style-val\">{v}</span>\n </div>\n ))}\n {annotation.suggestedCss && (\n <div className=\"style-hint\" style={{ color: \"#7c3aed\", borderTopColor: \"rgba(124,58,237,0.2)\" }}>\n <strong>Suggested changes:</strong><br />\n {annotation.suggestedCss}\n </div>\n )}\n </div>\n )}\n\n {/* Comment textarea */}\n <textarea\n ref={taRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={onKeyDown}\n placeholder=\"Describe the issue… (⌘/Ctrl + Enter to save)\"\n aria-label=\"Annotation comment\"\n />\n\n {/* Actions row — same as .clickly-popup .row but with delete */}\n <div className=\"pin-edit-actions\">\n <button\n className=\"pin-edit-delete\"\n onClick={() => remove(annotation.id)}\n aria-label=\"Delete annotation\"\n >\n <IconTrash />\n </button>\n <div className=\"row\" style={{ margin: 0, flex: 1, justifyContent: \"flex-end\" }}>\n <button className=\"ghost\" onClick={closeEdit}>Cancel</button>\n <button className=\"primary\" onClick={save}>Save</button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n/* ─── Position helper ────────────────────────────────────────── */\n\nfunction resolvePosition(a: Annotation): { x: number; y: number } | null {\n if (a.elementPath) {\n try {\n const el = document.querySelector(a.elementPath);\n if (el) {\n const r = el.getBoundingClientRect();\n if (r.width || r.height) return { x: r.right - 11, y: r.top - 11 };\n }\n } catch { /* invalid selector */ }\n }\n if (a.boundingBox) {\n return { x: a.boundingBox.x + a.boundingBox.width - 11, y: a.boundingBox.y - 11 };\n }\n return null;\n}\n","import { useEffect, useRef } from \"react\";\nimport type { SelectionEngine } from \"@useclickly/core\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { useAnnotationsList } from \"../state/annotations\";\nimport { originalRequestAnimationFrame } from \"./freezeAnimations\";\n\n/**\n * Full-viewport canvas that paints all freehand strokes.\n *\n * Two layers of strokes:\n * 1. Finalized strokes from each annotation in the store (document coords).\n * 2. The in-progress stroke from the engine when state.kind === \"drawing\"\n * (viewport coords; converted to doc by adding scroll).\n *\n * Rendering uses originalRequestAnimationFrame so strokes keep repainting\n * while the freeze module has the page paused. Position is `fixed` and the\n * canvas itself sits inside the shadow root so the engine's UI-surface\n * discriminator (data-clickly-toolbar) skips it.\n *\n * Pointer events pass through — pointer-events: none. The engine listens\n * at document level and captures strokes via the existing pointermove/\n * pointerdown/pointerup pipeline.\n */\nexport function DrawCanvas({ engine }: { engine: SelectionEngine }) {\n const state = useEngineState(engine);\n const annotations = useAnnotationsList();\n const ref = useRef<HTMLCanvasElement>(null);\n\n // Track scroll & viewport size; trigger a repaint by ticking version.\n const scrollRef = useRef({ x: 0, y: 0 });\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n scrollRef.current = { x: window.scrollX, y: window.scrollY };\n const onScrollResize = () => {\n scrollRef.current = { x: window.scrollX, y: window.scrollY };\n paint();\n };\n window.addEventListener(\"scroll\", onScrollResize, { capture: true, passive: true });\n window.addEventListener(\"resize\", onScrollResize, { passive: true });\n return () => {\n window.removeEventListener(\"scroll\", onScrollResize, { capture: true } as EventListenerOptions);\n window.removeEventListener(\"resize\", onScrollResize);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Repaint whenever annotations change or engine state changes.\n useEffect(() => {\n paint();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [annotations, state]);\n\n // Resize canvas to viewport on mount and whenever needed.\n useEffect(() => {\n sizeCanvas();\n paint();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n /**\n * Match the canvas's backing-store size to the viewport at the current\n * DPR. Keeps strokes crisp on retina without growing the CSS box.\n */\n function sizeCanvas() {\n const c = ref.current;\n if (!c || typeof window === \"undefined\") return;\n const dpr = window.devicePixelRatio || 1;\n const w = window.innerWidth;\n const h = window.innerHeight;\n c.width = Math.floor(w * dpr);\n c.height = Math.floor(h * dpr);\n c.style.width = w + \"px\";\n c.style.height = h + \"px\";\n const ctx = c.getContext(\"2d\");\n if (ctx) ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n }\n\n function paint() {\n if (typeof window === \"undefined\") return;\n originalRequestAnimationFrame(() => {\n const c = ref.current;\n if (!c) return;\n sizeCanvas();\n const ctx = c.getContext(\"2d\");\n if (!ctx) return;\n ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n const sx = scrollRef.current.x;\n const sy = scrollRef.current.y;\n\n // Layer 1 — finalized strokes per annotation. Points stored in DOC\n // coords (see annotations.add path), so subtract scroll for viewport.\n for (const a of annotations) {\n if (!a.strokes) continue;\n for (const stroke of a.strokes) {\n drawStroke(ctx, stroke.points, stroke.color, stroke.thickness, -sx, -sy);\n }\n }\n\n // Layer 2 — in-progress stroke from the engine. Engine dispatches\n // points in viewport coords; no scroll translation needed here.\n if (state.kind === \"drawing\") {\n const s = state.stroke;\n drawStroke(ctx, s.points, s.color, s.thickness, 0, 0);\n }\n });\n }\n\n return (\n <canvas\n ref={ref}\n data-clickly-toolbar=\"\"\n style={{\n position: \"fixed\",\n top: 0,\n left: 0,\n // Slightly below the toolbar (z-index: 1) so toolbar floats over it.\n zIndex: 0,\n pointerEvents: \"none\",\n }}\n aria-hidden=\"true\"\n />\n );\n}\n\nfunction drawStroke(\n ctx: CanvasRenderingContext2D,\n points: Array<{ x: number; y: number }>,\n color: string,\n thickness: number,\n dx: number,\n dy: number,\n) {\n if (points.length === 0) return;\n ctx.strokeStyle = color;\n ctx.lineWidth = thickness;\n ctx.beginPath();\n ctx.moveTo(points[0]!.x + dx, points[0]!.y + dy);\n if (points.length === 1) {\n // Single-point \"tap\" — render as a dot.\n ctx.lineTo(points[0]!.x + dx + 0.01, points[0]!.y + dy + 0.01);\n } else {\n for (let i = 1; i < points.length; i++) {\n ctx.lineTo(points[i]!.x + dx, points[i]!.y + dy);\n }\n }\n ctx.stroke();\n}\n","/**\n * Layout Mode palette catalogue.\n *\n * Each entry is a `PaletteItem` (re-exported from core) plus presentation\n * fields used only by the palette dock (`label`, `category`, `glyph`).\n *\n * `componentType` strings match Agentation's AFS 1.1 vocabulary where they\n * overlap — same string in, same string out, so agents don't need to learn\n * two dialects. The list intentionally stops around 30 for v1; Agentation\n * ships 65+ and we'll grow into the rest based on dogfood feedback.\n *\n * Default sizes are spatial hints, not pixel specs. The agent reads them\n * as \"the user wants something roughly this big\" and the codebase's\n * actual design tokens take over.\n */\n\nimport type { PaletteItem } from \"@useclickly/core\";\n\nexport type PaletteCategory =\n | \"structure\"\n | \"marketing\"\n | \"app\"\n | \"content\"\n | \"forms\"\n | \"feedback\";\n\nexport interface PaletteEntry extends PaletteItem {\n /** Display label for the tile, kept short (≤ 12 chars). */\n label: string;\n /** Section the tile appears under in the dock. */\n category: PaletteCategory;\n /**\n * Single-character glyph rendered inside the tile when no SVG icon is\n * available. ASCII-art-ish blocks (▭, ▬, ☰) read well at 24×24 and\n * avoid pulling in an icon library for v1.\n */\n glyph: string;\n}\n\n/** Heading shown above each category in the dock. */\nexport const CATEGORY_LABELS: Record<PaletteCategory, string> = {\n structure: \"Structure\",\n marketing: \"Marketing\",\n app: \"App\",\n content: \"Content\",\n forms: \"Forms\",\n feedback: \"Feedback\",\n};\n\n/**\n * The catalogue. Order matters — tiles render in declaration order\n * within each category.\n */\nexport const PALETTE: readonly PaletteEntry[] = [\n // ─── Structure ──────────────────────────────────────────────────\n { componentType: \"Navigation\", label: \"Nav\", category: \"structure\", glyph: \"☰\", width: 1200, height: 64 },\n { componentType: \"Header\", label: \"Header\", category: \"structure\", glyph: \"▬\", width: 1200, height: 120 },\n { componentType: \"Footer\", label: \"Footer\", category: \"structure\", glyph: \"▬\", width: 1200, height: 160 },\n { componentType: \"Sidebar\", label: \"Sidebar\", category: \"structure\", glyph: \"▍\", width: 240, height: 600 },\n { componentType: \"Container\", label: \"Container\", category: \"structure\", glyph: \"▢\", width: 1200, height: 400 },\n\n // ─── Marketing ──────────────────────────────────────────────────\n { componentType: \"Hero\", label: \"Hero\", category: \"marketing\", glyph: \"★\", width: 1200, height: 480 },\n { componentType: \"FeatureGrid\", label: \"Features\", category: \"marketing\", glyph: \"⊞\", width: 1200, height: 360 },\n { componentType: \"PricingTable\", label: \"Pricing\", category: \"marketing\", glyph: \"$\", width: 1200, height: 480 },\n { componentType: \"Testimonial\", label: \"Testimonial\", category: \"marketing\", glyph: \"❝\", width: 800, height: 240 },\n { componentType: \"Logos\", label: \"Logo row\", category: \"marketing\", glyph: \"◉\", width: 1200, height: 80 },\n { componentType: \"CTA\", label: \"CTA band\", category: \"marketing\", glyph: \"→\", width: 1200, height: 200 },\n { componentType: \"FAQ\", label: \"FAQ\", category: \"marketing\", glyph: \"?\", width: 800, height: 480 },\n\n // ─── App ────────────────────────────────────────────────────────\n { componentType: \"Dashboard\", label: \"Dashboard\", category: \"app\", glyph: \"▦\", width: 1200, height: 600 },\n { componentType: \"StatCard\", label: \"Stat\", category: \"app\", glyph: \"#\", width: 280, height: 120 },\n { componentType: \"Chart\", label: \"Chart\", category: \"app\", glyph: \"📈\", width: 600, height: 320 },\n { componentType: \"Table\", label: \"Table\", category: \"app\", glyph: \"▤\", width: 1000, height: 480 },\n { componentType: \"List\", label: \"List\", category: \"app\", glyph: \"≡\", width: 400, height: 480 },\n\n // ─── Content ────────────────────────────────────────────────────\n { componentType: \"Card\", label: \"Card\", category: \"content\", glyph: \"▢\", width: 320, height: 240 },\n { componentType: \"MediaCard\", label: \"Media card\", category: \"content\", glyph: \"▣\", width: 400, height: 360 },\n { componentType: \"Avatar\", label: \"Avatar\", category: \"content\", glyph: \"●\", width: 48, height: 48 },\n { componentType: \"Image\", label: \"Image\", category: \"content\", glyph: \"🖼\", width: 480, height: 320 },\n { componentType: \"Video\", label: \"Video\", category: \"content\", glyph: \"▶\", width: 640, height: 360 },\n\n // ─── Forms ──────────────────────────────────────────────────────\n { componentType: \"Form\", label: \"Form\", category: \"forms\", glyph: \"▤\", width: 480, height: 480 },\n { componentType: \"Input\", label: \"Input\", category: \"forms\", glyph: \"▭\", width: 320, height: 40 },\n { componentType: \"Button\", label: \"Button\", category: \"forms\", glyph: \"▢\", width: 140, height: 40 },\n { componentType: \"Toggle\", label: \"Toggle\", category: \"forms\", glyph: \"◐\", width: 56, height: 28 },\n { componentType: \"Select\", label: \"Select\", category: \"forms\", glyph: \"▾\", width: 240, height: 40 },\n\n // ─── Feedback ───────────────────────────────────────────────────\n { componentType: \"Modal\", label: \"Modal\", category: \"feedback\", glyph: \"▣\", width: 480, height: 320 },\n { componentType: \"Toast\", label: \"Toast\", category: \"feedback\", glyph: \"🔔\", width: 320, height: 64 },\n { componentType: \"Banner\", label: \"Banner\", category: \"feedback\", glyph: \"▬\", width: 1200, height: 56 },\n] as const;\n\n/** All categories present in the catalogue, in their first-seen order. */\nexport const PALETTE_CATEGORIES: readonly PaletteCategory[] = (() => {\n const seen = new Set<PaletteCategory>();\n const order: PaletteCategory[] = [];\n for (const item of PALETTE) {\n if (!seen.has(item.category)) {\n seen.add(item.category);\n order.push(item.category);\n }\n }\n return order;\n})();\n\n/** Lookup by `componentType`. O(n) — called rarely. */\nexport function findPaletteEntry(componentType: string): PaletteEntry | null {\n return PALETTE.find((e) => e.componentType === componentType) ?? null;\n}\n\n/**\n * Strip presentation fields so we can hand a clean `PaletteItem` to the\n * engine (which only cares about wire data).\n */\nexport function toPaletteItem(entry: PaletteEntry): PaletteItem {\n return {\n componentType: entry.componentType,\n width: entry.width,\n height: entry.height,\n };\n}\n","/**\n * LayoutPalette — left-rail dock of draggable component tiles.\n *\n * Visual only at this point. The wiring (pointer grab → engine\n * `grabFromPalette` → ghost preview → drop annotation) lands in M5. To\n * keep this component reusable for that milestone we expose an `onGrab`\n * prop that fires with the catalogue entry + pointer at press time.\n *\n * Rendered as a sibling of the toolbar inside the shadow root, attached\n * to the top-left of the viewport so it never overlaps the bottom-right\n * floating action button. The category sections are scrollable as a\n * group when the viewport is short.\n *\n * Why a left rail (and not a floating dock)?\n * - Matches Agentation, which most users will recognize.\n * - Vertical layout fits all ~30 tiles without horizontal scrolling\n * on common viewport widths.\n * - Keeps the placement target area (the right ~85% of the page) clear.\n */\n\nimport { useState } from \"react\";\nimport type { PaletteItem } from \"@useclickly/core\";\nimport {\n CATEGORY_LABELS,\n PALETTE,\n PALETTE_CATEGORIES,\n type PaletteCategory,\n type PaletteEntry,\n toPaletteItem,\n} from \"./palette\";\n\nexport interface LayoutPaletteProps {\n /**\n * Fired when the user presses a tile. The second arg is the pointer\n * position in viewport coords at press time, so the M5 drag layer can\n * mount its ghost at the right spot without a synthetic pointermove.\n */\n onGrab?: (item: PaletteItem, pointer: { x: number; y: number }) => void;\n /** Optional wireframe sub-mode toggle hook (M7). */\n wireframeOn?: boolean;\n onWireframeToggle?: () => void;\n}\n\nexport function LayoutPalette({\n onGrab,\n wireframeOn = false,\n onWireframeToggle,\n}: LayoutPaletteProps) {\n // Track collapsed sections so the dock fits on shorter viewports.\n // Defaults to all open; user-collapsed state lives only in memory\n // (per-session) — small enough that we don't bother persisting.\n const [collapsed, setCollapsed] = useState<Set<PaletteCategory>>(new Set());\n\n const toggle = (cat: PaletteCategory) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(cat)) next.delete(cat);\n else next.add(cat);\n return next;\n });\n };\n\n const handleTilePointerDown = (entry: PaletteEntry) => (e: React.PointerEvent) => {\n // Only respond to primary button. Right-click etc. should fall\n // through to the default browser behavior (no context menu for\n // tiles is fine — they're not real targets).\n if (e.button !== 0) return;\n e.preventDefault();\n onGrab?.(toPaletteItem(entry), { x: e.clientX, y: e.clientY });\n };\n\n return (\n <aside\n className=\"clickly-palette\"\n role=\"toolbar\"\n aria-label=\"Layout palette\"\n >\n <header className=\"clickly-palette-header\">\n <span className=\"clickly-palette-title\">Layout</span>\n {onWireframeToggle ? (\n <button\n type=\"button\"\n className={`clickly-palette-wireframe-btn${wireframeOn ? \" is-on\" : \"\"}`}\n onClick={onWireframeToggle}\n aria-pressed={wireframeOn}\n title={wireframeOn ? \"Exit wireframe mode\" : \"Enter wireframe mode\"}\n >\n {wireframeOn ? \"Wire ●\" : \"Wire ○\"}\n </button>\n ) : null}\n </header>\n\n <div className=\"clickly-palette-scroll\">\n {PALETTE_CATEGORIES.map((cat) => {\n const isCollapsed = collapsed.has(cat);\n const tiles = PALETTE.filter((e) => e.category === cat);\n return (\n <section key={cat} className=\"clickly-palette-section\">\n <button\n type=\"button\"\n className=\"clickly-palette-section-header\"\n onClick={() => toggle(cat)}\n aria-expanded={!isCollapsed}\n >\n <span className=\"clickly-palette-chevron\">\n {isCollapsed ? \"▸\" : \"▾\"}\n </span>\n {CATEGORY_LABELS[cat]}\n <span className=\"clickly-palette-count\">{tiles.length}</span>\n </button>\n {!isCollapsed && (\n <div className=\"clickly-palette-grid\">\n {tiles.map((entry) => (\n <button\n key={entry.componentType}\n type=\"button\"\n className=\"clickly-palette-tile\"\n onPointerDown={handleTilePointerDown(entry)}\n title={`${entry.label} · ${entry.width}×${entry.height}`}\n data-component-type={entry.componentType}\n >\n <span className=\"clickly-palette-tile-glyph\" aria-hidden>\n {entry.glyph}\n </span>\n <span className=\"clickly-palette-tile-label\">\n {entry.label}\n </span>\n </button>\n ))}\n </div>\n )}\n </section>\n );\n })}\n </div>\n </aside>\n );\n}\n","/**\n * Structured component previews for Layout Mode.\n *\n * Each palette `componentType` renders as a tiny Figma-style sketch\n * showing the typical structure (e.g. Navigation = logo + nav items +\n * CTA). Used in two places:\n *\n * 1. `LayoutGhost` — the translucent box that follows the pointer\n * during a palette drag.\n * 2. `PlacedComponents` — the persistent boxes placed annotations\n * render as on the page after drop.\n *\n * Implementation:\n * - Pure HTML divs (no SVG). Each preview fills its container with\n * `position: absolute` children sized in % so the sketch stretches\n * gracefully from a tiny ghost (140×40) to a full hero (1200×480).\n * - Templates collapse into ~6 reusable shape patterns covering all\n * 30 catalogue types — keeps the LOC down and ensures consistent\n * visual language across the palette.\n * - Class names live in `internal/styles.ts` under the `clickly-pv-*`\n * namespace.\n *\n * Adding a new componentType: append a case to `renderPreview()` or,\n * if it looks like an existing shape, route to one of the helpers.\n */\n\nimport type { JSX } from \"react\";\n\n/** Single source of truth for which preview every catalogue type uses. */\nexport function renderPreview(componentType: string): JSX.Element {\n switch (componentType) {\n // ─── Bar-with-items ──────────────────────────────────────────\n case \"Navigation\":\n return barWithItems({ logo: true, items: 4, cta: true });\n case \"Banner\":\n return barWithItems({ logo: false, items: 1, cta: true, dense: true });\n\n // ─── Headed area (heading + subtext + optional CTA) ──────────\n case \"Header\":\n return headedArea({ title: true, sub: true });\n case \"Footer\":\n return footerArea();\n case \"Hero\":\n return headedArea({ title: true, sub: true, cta: true, centered: true });\n case \"CTA\":\n return headedArea({ title: true, cta: true, centered: true, dense: true });\n case \"Toast\":\n return toastShape();\n\n // ─── Card grids ──────────────────────────────────────────────\n case \"FeatureGrid\":\n return cardGrid({ cols: 3, rows: 1, withIcon: true });\n case \"PricingTable\":\n return pricingShape();\n case \"Logos\":\n return logoRow();\n case \"Dashboard\":\n return dashboardShape();\n case \"FAQ\":\n return faqShape();\n\n // ─── Media blocks ────────────────────────────────────────────\n case \"Image\":\n return mediaBlock({ kind: \"image\" });\n case \"Video\":\n return mediaBlock({ kind: \"video\" });\n case \"MediaCard\":\n return cardShape({ withMedia: true });\n case \"Card\":\n return cardShape({ withMedia: false });\n case \"Container\":\n return containerShape();\n case \"Modal\":\n return modalShape();\n\n // ─── List rows / sidebars / tables ───────────────────────────\n case \"Sidebar\":\n return listRows({ heading: true, rows: 5, dense: false });\n case \"List\":\n return listRows({ heading: false, rows: 5, dense: false });\n case \"Table\":\n return tableShape();\n\n // ─── App / atoms ─────────────────────────────────────────────\n case \"StatCard\":\n return statCardShape();\n case \"Chart\":\n return chartShape();\n case \"Testimonial\":\n return testimonialShape();\n case \"Avatar\":\n return avatarShape();\n\n // ─── Forms ───────────────────────────────────────────────────\n case \"Form\":\n return formShape();\n case \"Input\":\n return inputShape();\n case \"Select\":\n return selectShape();\n case \"Button\":\n return buttonShape();\n case \"Toggle\":\n return toggleShape();\n\n default:\n return genericShape(componentType);\n }\n}\n\n/* ─── Shape primitives ──────────────────────────────────────────────── */\n\n/** Top bar with optional logo + N nav items + optional CTA on the right. */\nfunction barWithItems(opts: {\n logo?: boolean;\n items: number;\n cta?: boolean;\n dense?: boolean;\n}): JSX.Element {\n return (\n <div className={`clickly-pv clickly-pv-bar${opts.dense ? \" is-dense\" : \"\"}`}>\n {opts.logo ? <div className=\"pv-logo\" /> : null}\n <div className=\"pv-bar-items\">\n {Array.from({ length: opts.items }).map((_, i) => (\n <div key={i} className=\"pv-bar-item\" />\n ))}\n </div>\n {opts.cta ? <div className=\"pv-cta\" /> : null}\n </div>\n );\n}\n\nfunction headedArea(opts: {\n title?: boolean;\n sub?: boolean;\n cta?: boolean;\n centered?: boolean;\n dense?: boolean;\n}): JSX.Element {\n return (\n <div\n className={`clickly-pv clickly-pv-head${opts.centered ? \" is-centered\" : \"\"}${opts.dense ? \" is-dense\" : \"\"}`}\n >\n {opts.title ? <div className=\"pv-h1\" /> : null}\n {opts.sub ? (\n <>\n <div className=\"pv-line\" />\n <div className=\"pv-line\" style={{ width: \"60%\" }} />\n </>\n ) : null}\n {opts.cta ? <div className=\"pv-cta\" /> : null}\n </div>\n );\n}\n\nfunction footerArea(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-footer\">\n <div className=\"pv-footer-cols\">\n {Array.from({ length: 3 }).map((_, c) => (\n <div key={c} className=\"pv-footer-col\">\n <div className=\"pv-cap\" />\n <div className=\"pv-line\" />\n <div className=\"pv-line\" />\n <div className=\"pv-line\" style={{ width: \"70%\" }} />\n </div>\n ))}\n </div>\n <div className=\"pv-rule\" />\n <div className=\"pv-line\" style={{ width: \"32%\" }} />\n </div>\n );\n}\n\nfunction toastShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-toast\">\n <div className=\"pv-dot\" />\n <div className=\"pv-line\" style={{ flex: 1 }} />\n <div className=\"pv-x\" />\n </div>\n );\n}\n\nfunction cardGrid(opts: { cols: number; rows: number; withIcon?: boolean }): JSX.Element {\n return (\n <div\n className=\"clickly-pv clickly-pv-grid\"\n style={{ gridTemplateColumns: `repeat(${opts.cols}, 1fr)`, gridTemplateRows: `repeat(${opts.rows}, 1fr)` }}\n >\n {Array.from({ length: opts.cols * opts.rows }).map((_, i) => (\n <div key={i} className=\"pv-grid-card\">\n {opts.withIcon ? <div className=\"pv-dot\" /> : null}\n <div className=\"pv-cap\" />\n <div className=\"pv-line\" />\n <div className=\"pv-line\" style={{ width: \"60%\" }} />\n </div>\n ))}\n </div>\n );\n}\n\nfunction pricingShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-pricing\">\n {Array.from({ length: 3 }).map((_, c) => (\n <div key={c} className={`pv-pricing-col${c === 1 ? \" is-featured\" : \"\"}`}>\n <div className=\"pv-cap\" />\n <div className=\"pv-price\" />\n <div className=\"pv-line\" />\n <div className=\"pv-line\" />\n <div className=\"pv-line\" style={{ width: \"70%\" }} />\n <div className=\"pv-cta\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction logoRow(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-logos\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"pv-logo-tile\" />\n ))}\n </div>\n );\n}\n\nfunction dashboardShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-dashboard\">\n <div className=\"pv-dash-top\">\n <div className=\"pv-dot\" />\n <div className=\"pv-line\" style={{ width: \"30%\" }} />\n <div className=\"pv-cta\" style={{ marginLeft: \"auto\" }} />\n </div>\n <div className=\"pv-dash-stats\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"pv-stat\">\n <div className=\"pv-cap\" />\n <div className=\"pv-h1\" style={{ width: \"40%\" }} />\n </div>\n ))}\n </div>\n <div className=\"pv-dash-chart\">\n {Array.from({ length: 7 }).map((_, i) => (\n <div\n key={i}\n className=\"pv-bar\"\n style={{ height: `${30 + ((i * 13) % 60)}%` }}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction faqShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-faq\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"pv-faq-row\">\n <div className=\"pv-line\" style={{ flex: 1 }} />\n <div className=\"pv-chev\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction mediaBlock(opts: { kind: \"image\" | \"video\" }): JSX.Element {\n return (\n <div className={`clickly-pv clickly-pv-media is-${opts.kind}`}>\n {opts.kind === \"image\" ? <div className=\"pv-mountain\" /> : <div className=\"pv-play\" />}\n </div>\n );\n}\n\nfunction cardShape(opts: { withMedia: boolean }): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-card\">\n {opts.withMedia ? <div className=\"pv-card-media\" /> : null}\n <div className=\"pv-card-body\">\n <div className=\"pv-cap\" />\n <div className=\"pv-line\" />\n <div className=\"pv-line\" style={{ width: \"70%\" }} />\n </div>\n </div>\n );\n}\n\nfunction containerShape(): JSX.Element {\n return <div className=\"clickly-pv clickly-pv-container\" />;\n}\n\nfunction modalShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-modal\">\n <div className=\"pv-modal-head\">\n <div className=\"pv-cap\" />\n <div className=\"pv-x\" />\n </div>\n <div className=\"pv-modal-body\">\n <div className=\"pv-line\" />\n <div className=\"pv-line\" />\n <div className=\"pv-line\" style={{ width: \"60%\" }} />\n </div>\n <div className=\"pv-modal-foot\">\n <div className=\"pv-cta\" />\n </div>\n </div>\n );\n}\n\nfunction listRows(opts: { heading: boolean; rows: number; dense: boolean }): JSX.Element {\n return (\n <div className={`clickly-pv clickly-pv-list${opts.dense ? \" is-dense\" : \"\"}`}>\n {opts.heading ? <div className=\"pv-cap\" /> : null}\n {Array.from({ length: opts.rows }).map((_, i) => (\n <div key={i} className=\"pv-list-row\">\n <div className=\"pv-dot\" />\n <div className=\"pv-line\" style={{ flex: 1 }} />\n </div>\n ))}\n </div>\n );\n}\n\nfunction tableShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-table\">\n <div className=\"pv-table-head\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"pv-cap\" />\n ))}\n </div>\n {Array.from({ length: 5 }).map((_, r) => (\n <div key={r} className=\"pv-table-row\">\n {Array.from({ length: 4 }).map((_, c) => (\n <div key={c} className=\"pv-line\" />\n ))}\n </div>\n ))}\n </div>\n );\n}\n\nfunction statCardShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-stat\">\n <div className=\"pv-cap\" />\n <div className=\"pv-h1\" />\n <div className=\"pv-line\" style={{ width: \"50%\" }} />\n </div>\n );\n}\n\nfunction chartShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-chart\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div\n key={i}\n className=\"pv-bar\"\n style={{ height: `${25 + ((i * 17) % 65)}%` }}\n />\n ))}\n </div>\n );\n}\n\nfunction testimonialShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-testimonial\">\n <div className=\"pv-avatar\" />\n <div className=\"pv-quote\">\n <div className=\"pv-line\" />\n <div className=\"pv-line\" />\n <div className=\"pv-line\" style={{ width: \"55%\" }} />\n </div>\n </div>\n );\n}\n\nfunction avatarShape(): JSX.Element {\n return <div className=\"clickly-pv clickly-pv-avatar\" />;\n}\n\nfunction formShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-form\">\n <div className=\"pv-cap\" />\n <div className=\"pv-input\" />\n <div className=\"pv-cap\" />\n <div className=\"pv-input\" />\n <div className=\"pv-cap\" />\n <div className=\"pv-input pv-input-tall\" />\n <div className=\"pv-cta\" />\n </div>\n );\n}\n\nfunction inputShape(): JSX.Element {\n return <div className=\"clickly-pv clickly-pv-input-only\" />;\n}\n\nfunction selectShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-select\">\n <div className=\"pv-line\" style={{ flex: 1 }} />\n <div className=\"pv-chev\" />\n </div>\n );\n}\n\nfunction buttonShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-button\">\n <div className=\"pv-line\" style={{ width: \"60%\" }} />\n </div>\n );\n}\n\nfunction toggleShape(): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-toggle\">\n <div className=\"pv-toggle-knob\" />\n </div>\n );\n}\n\nfunction genericShape(label: string): JSX.Element {\n return (\n <div className=\"clickly-pv clickly-pv-generic\">\n <span className=\"pv-generic-label\">{label}</span>\n </div>\n );\n}\n","/**\n * LayoutGhost — translucent preview that follows the pointer during a\n * palette-grab drag.\n *\n * Rendered fixed-position in viewport coords (pointer is viewport-\n * relative; we don't need to add scrollY here). The box is anchored at\n * the pointer's top-left, scaled down if `item.width / item.height`\n * would overflow the visible area. We never enlarge — small components\n * stay at their natural size so the user can see what they're dropping.\n *\n * pointer-events: none is critical — the ghost sits above the page but\n * must not eat the pointermove/pointerup events the window-level\n * listener in LayoutMode is reading.\n */\n\nimport type { PaletteItem, Point } from \"@useclickly/core\";\nimport { renderPreview } from \"./previews\";\n\nexport interface LayoutGhostProps {\n item: PaletteItem;\n /** Pointer in viewport coords (from engine state). */\n pointer: Point;\n /** Toggle visibility without unmounting (avoids a render flash). */\n visible?: boolean;\n}\n\n/** Max footprint we'll let a ghost claim on screen, as a fraction of viewport. */\nconst MAX_VIEWPORT_FRAC = 0.6;\n\nexport function LayoutGhost({ item, pointer, visible = true }: LayoutGhostProps) {\n if (!visible) return null;\n\n // Scale-down rule: if either dimension exceeds MAX_VIEWPORT_FRAC of the\n // viewport, shrink uniformly until it fits. We don't upscale — a tiny\n // button-sized ghost stays tiny.\n const vw = typeof window !== \"undefined\" ? window.innerWidth : 1024;\n const vh = typeof window !== \"undefined\" ? window.innerHeight : 768;\n const maxW = vw * MAX_VIEWPORT_FRAC;\n const maxH = vh * MAX_VIEWPORT_FRAC;\n const scale = Math.min(\n 1,\n item.width > maxW ? maxW / item.width : 1,\n item.height > maxH ? maxH / item.height : 1,\n );\n const w = item.width * scale;\n const h = item.height * scale;\n\n return (\n <div\n className=\"clickly-ghost\"\n aria-hidden\n style={{\n position: \"fixed\",\n left: Math.round(pointer.x),\n top: Math.round(pointer.y),\n width: Math.round(w),\n height: Math.round(h),\n pointerEvents: \"none\",\n }}\n >\n {/* Floating label above the box — Figma-style \"this is a Navigation\". */}\n <span className=\"clickly-ghost-tag\">\n {item.componentType}\n {scale < 1 ? ` · ${Math.round(scale * 100)}%` : \"\"}\n </span>\n {/* Structured preview fills the box. Stretches to whatever size\n the ghost has computed above. */}\n <div className=\"clickly-ghost-preview\">{renderPreview(item.componentType)}</div>\n {/* Bottom-right size readout — small enough not to dominate the\n preview itself. */}\n <span className=\"clickly-ghost-size\">\n {Math.round(item.width)}×{Math.round(item.height)}\n </span>\n </div>\n );\n}\n","/**\n * DropCommentBubble — tiny inline input that appears at the drop point\n * after a placement drag completes. User types a comment and presses\n * Enter to commit (or Esc to cancel).\n *\n * Deliberately not the full AnnotationPopup — placements don't have a\n * computed-styles editor, source-jump preview, or React-tree readout to\n * show. A single-line input plus a placeholder hint is enough.\n *\n * Positioning: fixed-position in viewport coords, anchored near the\n * pointer but biased upward/right when there's room so the input\n * doesn't overlap the implied component footprint.\n */\n\nimport { useEffect, useRef, useState } from \"react\";\nimport type { Point } from \"@useclickly/core\";\n\nexport interface DropCommentBubbleProps {\n pointer: Point;\n /**\n * Short label shown in the chip — varies by interaction:\n * - Placement: the componentType, e.g. \"Hero\"\n * - Rearrange: the moved tag/label, e.g. \"section\"\n */\n chipLabel: string;\n /**\n * Placeholder text in the input. Different copy for placement vs\n * rearrange keeps the UX self-explaining.\n */\n placeholder?: string;\n onCommit: (comment: string) => void;\n onCancel: () => void;\n}\n\nconst BUBBLE_OFFSET_X = 12;\nconst BUBBLE_OFFSET_Y = -8;\n\nexport function DropCommentBubble({\n pointer,\n chipLabel,\n placeholder = \"Describe what goes here…\",\n onCommit,\n onCancel,\n}: DropCommentBubbleProps) {\n const [text, setText] = useState(\"\");\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n // Auto-focus on mount so the user can type immediately. The\n // setTimeout(0) skirts a React focus-loss when the bubble mounts in\n // the same tick as the drop's pointerup handler.\n useEffect(() => {\n const t = setTimeout(() => inputRef.current?.focus(), 0);\n return () => clearTimeout(t);\n }, []);\n\n // Bubble is fixed-position; pointer is in viewport coords already.\n // Bias upward so the bubble appears just above and right of the\n // drop point — sits on top of the ghost's top edge by default.\n const left = Math.round(pointer.x + BUBBLE_OFFSET_X);\n const top = Math.round(pointer.y + BUBBLE_OFFSET_Y);\n\n return (\n <div\n className=\"clickly-drop-bubble\"\n style={{ position: \"fixed\", left, top }}\n role=\"dialog\"\n aria-label={`Layout comment for ${chipLabel}`}\n >\n <span className=\"clickly-drop-bubble-chip\">{chipLabel}</span>\n <input\n ref={inputRef}\n type=\"text\"\n className=\"clickly-drop-bubble-input\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={placeholder}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n onCommit(text);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n }\n }}\n />\n <button\n type=\"button\"\n className=\"clickly-drop-bubble-cancel\"\n onClick={onCancel}\n aria-label=\"Cancel\"\n title=\"Cancel (Esc)\"\n >\n ✕\n </button>\n <button\n type=\"button\"\n className=\"clickly-drop-bubble-commit\"\n onClick={() => onCommit(text)}\n aria-label=\"Save\"\n title=\"Save (Enter)\"\n >\n Add\n </button>\n </div>\n );\n}\n","/**\n * Detect \"rearrangeable\" sections — top-level semantic regions the user\n * can grab and reposition in Layout Mode.\n *\n * v1 rule (kept deliberately conservative):\n * - The element's tag is one of: section, header, footer, nav, aside, main\n * - Its depth from `<body>` is ≤ 2 (so we don't pick up nested\n * `<section>` tags inside, say, a card).\n * - OR the element has an explicit `[data-clickly-rearrangeable]`\n * attribute (an app opt-in for finer-grained control).\n * - The element is NOT inside any `[data-clickly-root]` surface.\n *\n * Returning empty rects is fine — the overlay just won't draw anything\n * and the user sees an empty page in layout mode (which is a clear\n * signal they need to add the attribute or restructure).\n */\n\nconst REARRANGEABLE_TAGS = new Set([\n \"SECTION\",\n \"HEADER\",\n \"FOOTER\",\n \"NAV\",\n \"ASIDE\",\n \"MAIN\",\n]);\n\nconst OPT_IN_ATTR = \"data-clickly-rearrangeable\";\nconst CLICKLY_ROOT_ATTR = \"data-clickly-root\";\n\n/** Max depth from `<body>` we consider \"top-level\". */\nconst MAX_DEPTH = 2;\n\nexport interface RearrangeableSection {\n element: HTMLElement;\n /** Document-coord rect (clientRect + scroll). */\n rect: { x: number; y: number; width: number; height: number };\n /** Human-readable label for the section, e.g. `section \"Pricing\"`. */\n label: string;\n /** CSS selector string the agent can use to grep source. */\n selector: string;\n}\n\nexport interface DetectOptions {\n /** Defaults to `document`. */\n doc?: Document;\n /** Defaults to `window`. */\n win?: Window;\n}\n\nexport function findRearrangeableSections(\n options: DetectOptions = {},\n): RearrangeableSection[] {\n const doc = options.doc ?? document;\n const win = options.win ?? (doc.defaultView ?? window);\n const out: RearrangeableSection[] = [];\n const body = doc.body;\n if (!body) return out;\n\n // Walk down up to MAX_DEPTH from body. Iterative — we don't need the\n // full subtree, just the first few layers; cheaper than querySelectorAll\n // + post-filtering on depth.\n const queue: Array<{ el: HTMLElement; depth: number }> = [{ el: body, depth: 0 }];\n const seen = new Set<HTMLElement>();\n\n while (queue.length > 0) {\n const { el, depth } = queue.shift()!;\n if (seen.has(el)) continue;\n seen.add(el);\n\n // Skip into Clickly UI — never let the user grab our own surfaces.\n if (el.closest(`[${CLICKLY_ROOT_ATTR}]`)) continue;\n\n if (depth > 0 && isRearrangeable(el)) {\n const r = el.getBoundingClientRect();\n // Skip zero-size elements (display:none, conditional renders, etc.).\n if (r.width < 4 || r.height < 4) continue;\n out.push({\n element: el,\n rect: {\n x: r.x + win.scrollX,\n y: r.y + win.scrollY,\n width: r.width,\n height: r.height,\n },\n label: describeSection(el),\n selector: buildSimpleSelector(el),\n });\n // Found one — don't recurse into it. Sections inside other\n // sections are explicitly NOT included by v1 rules.\n continue;\n }\n\n if (depth < MAX_DEPTH) {\n for (const child of Array.from(el.children)) {\n queue.push({ el: child as HTMLElement, depth: depth + 1 });\n }\n }\n }\n\n return out;\n}\n\nfunction isRearrangeable(el: HTMLElement): boolean {\n if (el.hasAttribute(OPT_IN_ATTR)) return true;\n return REARRANGEABLE_TAGS.has(el.tagName);\n}\n\n/**\n * `section \"Pricing\"` / `nav \"Main\"` style label. We look for the first\n * heading inside the section to derive a name; falls back to the tag.\n */\nfunction describeSection(el: HTMLElement): string {\n const tag = el.tagName.toLowerCase();\n // ARIA label takes priority — most explicit signal of intent.\n const aria = el.getAttribute(\"aria-label\");\n if (aria) return `${tag} \"${aria.trim()}\"`;\n // First heading inside the section\n const heading = el.querySelector(\"h1, h2, h3, h4, h5, h6, [role='heading']\");\n const text = heading?.textContent?.trim();\n if (text) return `${tag} \"${truncate(text, 40)}\"`;\n // ID fallback (`#hero`)\n if (el.id) return `${tag} #${el.id}`;\n return tag;\n}\n\n/**\n * Single-segment selector for the section: `section.cta` or `section#hero`.\n * Not unique across the whole document — Layout Mode rects already\n * disambiguate visually, and the markdown output carries the full\n * `elementPath` for the agent to use as the canonical reference.\n */\nfunction buildSimpleSelector(el: HTMLElement): string {\n const tag = el.tagName.toLowerCase();\n if (el.id) return `${tag}#${el.id}`;\n const first = el.classList[0];\n if (first) return `${tag}.${first}`;\n return tag;\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : s.slice(0, n - 1) + \"…\";\n}\n\n/**\n * For a viewport pointer, return the rearrangeable section it's inside\n * (if any). Used by RearrangeOverlay to decide whether to start a grab.\n *\n * O(n) over the sections list — that's at most a few dozen, so fine.\n */\nexport function sectionAtPoint(\n sections: RearrangeableSection[],\n viewportX: number,\n viewportY: number,\n win: Window = window,\n): RearrangeableSection | null {\n const docX = viewportX + win.scrollX;\n const docY = viewportY + win.scrollY;\n for (const s of sections) {\n const r = s.rect;\n if (\n docX >= r.x &&\n docX < r.x + r.width &&\n docY >= r.y &&\n docY < r.y + r.height\n ) {\n return s;\n }\n }\n return null;\n}\n","/**\n * RearrangeOverlay — outlines every rearrangeable section while in\n * `layoutIdle` so the user knows what they can grab. Outlines are\n * non-blocking (`pointer-events: none`); the host page still receives\n * pointer events. We only grab when the user actually presses on a\n * detected section, via a window-level pointerdown listener.\n *\n * Sections are recomputed on:\n * - mount\n * - window scroll / resize (rects move)\n * - DOM mutations under <body> (sections added/removed by the app)\n *\n * For the v1 we don't recompute on every animation frame — that would\n * be wasted work for a feature the user enters briefly. The mutation\n * observer + scroll/resize handlers catch the common cases.\n */\n\nimport { useEffect, useState } from \"react\";\nimport {\n findRearrangeableSections,\n sectionAtPoint,\n type RearrangeableSection,\n} from \"./sectionDetect\";\n\nexport interface RearrangeOverlayProps {\n /**\n * Fires when the user presses on a rearrangeable section. The handler\n * is expected to call `engine.grabSection(target, originalRect, pointer)`.\n */\n onGrab: (\n target: HTMLElement,\n originalRect: { x: number; y: number; width: number; height: number },\n pointer: { x: number; y: number },\n ) => void;\n}\n\nexport function RearrangeOverlay({ onGrab }: RearrangeOverlayProps) {\n const [sections, setSections] = useState<RearrangeableSection[]>([]);\n const [hoverId, setHoverId] = useState<number>(-1);\n\n // Recompute sections on mount + when the page geometry changes.\n useEffect(() => {\n const recompute = () => setSections(findRearrangeableSections());\n recompute();\n\n const onScrollResize = () => recompute();\n window.addEventListener(\"scroll\", onScrollResize, { passive: true });\n window.addEventListener(\"resize\", onScrollResize);\n\n // Watch for DOM mutations that could add/remove sections. We only\n // observe attributes + childList — text-content changes don't move\n // sections around.\n const mo = new MutationObserver(() => recompute());\n mo.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"class\", \"id\", \"data-clickly-rearrangeable\"],\n });\n\n return () => {\n window.removeEventListener(\"scroll\", onScrollResize);\n window.removeEventListener(\"resize\", onScrollResize);\n mo.disconnect();\n };\n }, []);\n\n // Window-level pointerdown listener — translates a page press into a\n // section grab if the pointer is over one. Capture phase so we beat\n // the engine's own pointerdown handler. We don't preventDefault: the\n // engine will still fire its dispatch, but the reducer ignores\n // POINTER_DOWN in layoutIdle so it's a no-op.\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n if (e.button !== 0) return;\n // Skip if the press is inside Clickly UI (palette tile, etc).\n const path = e.composedPath();\n for (const node of path) {\n if (node instanceof HTMLElement && node.closest(\"[data-clickly-root]\")) {\n return;\n }\n }\n const hit = sectionAtPoint(sections, e.clientX, e.clientY);\n if (!hit) return;\n e.preventDefault();\n onGrab(\n hit.element,\n hit.rect,\n { x: e.clientX, y: e.clientY },\n );\n };\n window.addEventListener(\"pointerdown\", onDown, { capture: true });\n return () => window.removeEventListener(\"pointerdown\", onDown, { capture: true });\n }, [sections, onGrab]);\n\n // Hover tracking (visual only). Cheap — we recompute on pointermove\n // but only update state when the hovered section changes.\n useEffect(() => {\n const onMove = (e: PointerEvent) => {\n const hit = sectionAtPoint(sections, e.clientX, e.clientY);\n const id = hit ? sections.indexOf(hit) : -1;\n setHoverId((prev) => (prev === id ? prev : id));\n };\n window.addEventListener(\"pointermove\", onMove, { passive: true });\n return () => window.removeEventListener(\"pointermove\", onMove);\n }, [sections]);\n\n return (\n <div className=\"clickly-rearrange-layer\" aria-hidden>\n {sections.map((s, i) => {\n // Render in viewport coords: rect is document-coord, subtract\n // window.scroll* to get back. Recomputed on every render — cheap\n // for ≤ a few dozen sections, avoids a stale-rect class.\n const left = s.rect.x - window.scrollX;\n const top = s.rect.y - window.scrollY;\n return (\n <div\n key={`${s.selector}-${i}`}\n className={`clickly-rearrange-outline${hoverId === i ? \" is-hover\" : \"\"}`}\n style={{\n position: \"fixed\",\n left,\n top,\n width: s.rect.width,\n height: s.rect.height,\n pointerEvents: \"none\",\n }}\n data-clickly-section-label={s.label}\n >\n <span className=\"clickly-rearrange-label\">{s.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n","/**\n * Layout Mode → AFS Annotation builders.\n *\n * Pure helpers. They produce wire-format objects from engine state\n * + a user-typed comment; the caller pushes the result into the\n * annotation store and calls `engine.commit()`.\n *\n * AFS 1.1 coordinate conventions (Layout Mode):\n * `x` — % of viewport width (0..100), derived from `pointer.x`\n * `y` — px from document top, derived from `pointer.y + scrollY`\n * Both placement and rearrange annotations follow this convention so\n * the agent can blend them with feedback annotations on a single page.\n */\n\nimport { nanoid } from \"nanoid\";\nimport {\n collectMetadata,\n getReadableElementPath,\n identifyElement,\n type Annotation,\n type BoundingBox,\n type PaletteItem,\n type Point,\n} from \"@useclickly/core\";\n\nexport interface BuildPlacementInput {\n item: PaletteItem;\n pointer: Point; // viewport coords at drop time\n scrollY: number; // captured from window.scrollY when the engine dispatched LAYOUT_POINTER_UP\n comment: string;\n /**\n * The host document. Defaults to `globalThis.document`. Injected for\n * tests and for the rare case where Clickly runs inside an iframe.\n */\n doc?: Document;\n /**\n * Optional: rich metadata around the drop point. If true (default), we\n * pick `document.elementFromPoint(pointer)` and run identification on\n * it so the agent learns where the placement was anchored\n * (\"place a Hero near `body > main > section.hero`\").\n */\n enrichWithDropTarget?: boolean;\n /** Output detail; controls how much metadata is collected. */\n detail?: \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n}\n\nexport function buildPlacementAnnotation(input: BuildPlacementInput): Annotation {\n const doc = input.doc ?? document;\n const win = doc.defaultView ?? window;\n\n const xPct =\n win.innerWidth > 0\n ? (input.pointer.x / win.innerWidth) * 100\n : 0;\n const yDoc = input.pointer.y + input.scrollY;\n\n // Element under the drop point (skipping the Clickly UI shadow host).\n // If elementFromPoint hits a Clickly surface (palette / ghost\n // overlapping), bail to the body defaults — anchor enrichment is\n // best-effort, not required.\n let dropPath = \"(layout)\";\n let dropTag = \"body\";\n let dropDisplayName: string | undefined;\n let metadata: ReturnType<typeof collectMetadata> | null = null;\n\n if (input.enrichWithDropTarget !== false) {\n try {\n const raw = doc.elementFromPoint(input.pointer.x, input.pointer.y);\n const candidate =\n raw && !raw.closest(\"[data-clickly-root]\")\n ? (raw as HTMLElement)\n : null;\n if (candidate) {\n dropPath = getReadableElementPath(candidate);\n dropTag = candidate.tagName.toLowerCase();\n // `identifyElement` returns a human-readable label like\n // `button \"Save\"`. We use it for AFS displayName.\n dropDisplayName = identifyElement(candidate);\n metadata = collectMetadata(candidate, {\n detail: input.detail ?? \"standard\",\n includeReact: true,\n });\n }\n } catch {\n /* jsdom / cross-origin — fall through to the body defaults */\n }\n }\n\n return {\n id: \"ann_\" + nanoid(8),\n comment: input.comment.trim() || `Place a ${input.item.componentType} component here`,\n elementPath: dropPath,\n element: dropTag,\n timestamp: Date.now(),\n // AFS layout-mode coordinate spec:\n x: clamp01(xPct),\n y: Math.max(0, Math.round(yDoc)),\n url: typeof location !== \"undefined\" ? location.href : undefined,\n kind: \"placement\",\n status: \"pending\",\n displayName: dropDisplayName,\n placement: {\n componentType: input.item.componentType,\n width: input.item.width,\n height: input.item.height,\n scrollY: input.scrollY,\n },\n // Enrichment from the drop target — same fields the feedback path\n // collects, so the agent can grep / source-jump to the anchor.\n cssClasses: metadata?.cssClasses || undefined,\n reactComponents: metadata?.reactComponents || undefined,\n sourceFile: metadata?.sourceFile || undefined,\n sourceLine: metadata?.sourceLine || undefined,\n sourceColumn: metadata?.sourceColumn || undefined,\n nearbyText: metadata?.nearbyText || undefined,\n boundingBox: metadata?.boundingBox || undefined,\n };\n}\n\nfunction clamp01(n: number): number {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.min(100, n));\n}\n\n/* ─── Rearrange ─────────────────────────────────────────────────────── */\n\nexport interface BuildRearrangeInput {\n /** The on-page element being moved. Used for selector + metadata. */\n target: HTMLElement;\n /** Where it was before the drag started (document coords). */\n originalRect: BoundingBox;\n /** Where the user dropped it (document coords). */\n currentRect: BoundingBox;\n /** User-typed feedback. */\n comment: string;\n /** Output detail; controls how much metadata is collected. */\n detail?: \"compact\" | \"standard\" | \"detailed\" | \"forensic\";\n /** Defaults to `globalThis.document`. Injected for tests. */\n doc?: Document;\n}\n\nexport function buildRearrangeAnnotation(input: BuildRearrangeInput): Annotation {\n const doc = input.doc ?? document;\n const win = doc.defaultView ?? window;\n\n // Identification of the moved section — same pipeline as the feedback\n // path. Agents use `elementPath` to grep and `sourceFile` to jump.\n const elementPath = getReadableElementPath(input.target);\n const tag = input.target.tagName.toLowerCase();\n const displayName = identifyElement(input.target);\n const md = collectMetadata(input.target, {\n detail: input.detail ?? \"standard\",\n includeReact: true,\n });\n\n // AFS coordinate convention (Layout Mode): x is % of viewport width,\n // y is document px. We use the *destination* rect's centre for these\n // — that's where the agent should focus the visual diff.\n const xPct =\n win.innerWidth > 0\n ? ((input.currentRect.x + input.currentRect.width / 2) / win.innerWidth) * 100\n : 0;\n const yDoc = Math.round(input.currentRect.y);\n\n // Selector — prefer the metadata pipeline's CSS selector (deduped,\n // anchor-stable) over the simple section selector from sectionDetect.\n // Falls back to a tag+id form if metadata doesn't return one.\n const selector =\n buildSelectorString(input.target) || tag;\n\n return {\n id: \"ann_\" + nanoid(8),\n comment: input.comment.trim() || `Move this ${tag}`,\n elementPath,\n element: tag,\n timestamp: Date.now(),\n x: clamp01(xPct),\n y: Math.max(0, yDoc),\n url: typeof location !== \"undefined\" ? location.href : undefined,\n kind: \"rearrange\",\n status: \"pending\",\n displayName,\n rearrange: {\n selector,\n label: displayName,\n tagName: input.target.tagName.toUpperCase(),\n originalRect: input.originalRect,\n currentRect: input.currentRect,\n },\n cssClasses: md.cssClasses || undefined,\n reactComponents: md.reactComponents || undefined,\n sourceFile: md.sourceFile || undefined,\n sourceLine: md.sourceLine || undefined,\n sourceColumn: md.sourceColumn || undefined,\n nearbyText: md.nearbyText || undefined,\n boundingBox: md.boundingBox || undefined,\n };\n}\n\n/** Tag + first id/class — single-segment selector for the rearrange payload. */\nfunction buildSelectorString(el: HTMLElement): string {\n const tag = el.tagName.toLowerCase();\n if (el.id) return `${tag}#${el.id}`;\n const cls = el.classList[0];\n if (cls) return `${tag}.${cls}`;\n return tag;\n}\n","/**\n * LayoutMode — top-level orchestrator for the Layout palette flow.\n *\n * Mounts:\n * - `LayoutPalette` (always while layout-mode is active)\n * - `LayoutGhost` (while a palette tile is being dragged)\n * - `RearrangeOverlay` (section outlines, in `layoutIdle`)\n * - `DropCommentBubble` (inline comment input at the drop point)\n * - `WireframeSurface` (defined inline below — fades the host page\n * and exposes a purpose textarea while wireframe sub-mode is on)\n *\n * Bridges engine ⇄ DOM:\n * - Palette tile pointerdown → engine.grabFromPalette(item, pointer)\n * - Section pointerdown → engine.grabSection(target, rect, pointer)\n * - Window pointermove → engine.layoutMove(pointer)\n * - Window pointerup → engine.layoutDrop(pointer)\n *\n * Window listeners are only attached while a drag is in progress —\n * keeps the per-frame work down when the user is just browsing the\n * palette.\n *\n * Wireframe sub-mode (M7):\n * - Toggle owned here; passed to `LayoutPalette` for the header button.\n * - When on, the page fades behind a white layer (opacity 0..1 via\n * the slider) and a purpose textarea floats top-centre.\n * - At commit time, the purpose string (if any) is prepended to the\n * user's comment as `\"[wireframe purpose: <text>] <comment>\"` so\n * the agent gets cross-placement context on a single line.\n */\n\nimport type { ChangeEvent, PointerEvent as ReactPointerEvent } from \"react\";\nimport { useEffect, useState } from \"react\";\nimport type { Annotation, SelectionEngine } from \"@useclickly/core\";\nimport { isPlacementAnnotation } from \"@useclickly/core\";\nimport { useAnnotations, useAnnotationsList } from \"../../state/annotations\";\nimport { useSettings } from \"../../state/settings\";\nimport { LayoutPalette } from \"./LayoutPalette\";\nimport { LayoutGhost } from \"./LayoutGhost\";\nimport { DropCommentBubble } from \"./DropCommentBubble\";\nimport { RearrangeOverlay } from \"./RearrangeOverlay\";\nimport {\n buildPlacementAnnotation,\n buildRearrangeAnnotation,\n} from \"./buildAnnotation\";\nimport { renderPreview } from \"./previews\";\n\nexport interface LayoutModeProps {\n engine: SelectionEngine;\n /** Current engine state — passed in to avoid a second subscription. */\n state: ReturnType<SelectionEngine[\"getSnapshot\"]>;\n}\n\n/** Default fade strength on enter (60% white). Picked by feel — page\n * still readable, sketch ideas dominant. User can re-tune. */\nconst DEFAULT_WIREFRAME_OPACITY = 60;\n\nexport function LayoutMode({ engine, state }: LayoutModeProps) {\n const addAnnotation = useAnnotations((s) => s.add);\n const outputDetail = useSettings((s) => s.outputDetail);\n\n // ── Wireframe sub-mode (M7) ──────────────────────────────────────\n // Local state — purely UI; never crosses into the engine since the\n // engine doesn't care about visual fade. Re-mounts on layout-mode\n // exit, which is intentional: the user is starting fresh anyway.\n const [wireframeOn, setWireframeOn] = useState(false);\n const [wireframeOpacity, setWireframeOpacity] = useState(DEFAULT_WIREFRAME_OPACITY);\n const [wireframePurpose, setWireframePurpose] = useState(\"\");\n const toggleWireframe = () => setWireframeOn((v) => !v);\n const exitWireframe = () => setWireframeOn(false);\n\n /** Apply the wireframe purpose prefix if active and non-empty. */\n const withPurpose = (comment: string): string => {\n if (!wireframeOn) return comment;\n const trimmed = wireframePurpose.trim();\n if (!trimmed) return comment;\n const base = comment.trim();\n return `[wireframe purpose: ${trimmed}] ${base || \"(no comment)\"}`;\n };\n\n // ── Palette tile pressed → start a placement drag ────────────────\n const handleGrab = (item: import(\"@useclickly/core\").PaletteItem, pointer: { x: number; y: number }) => {\n engine.grabFromPalette(item, pointer);\n };\n\n // ── Existing section pressed → start a rearrange drag ────────────\n const handleSectionGrab = (\n target: HTMLElement,\n originalRect: { x: number; y: number; width: number; height: number },\n pointer: { x: number; y: number },\n ) => {\n engine.grabSection(target, originalRect, pointer);\n };\n\n // ── Window-level pointermove/pointerup while dragging ────────────\n const isDragging =\n state.kind === \"layoutPlacing\" || state.kind === \"layoutRearranging\";\n\n useEffect(() => {\n if (!isDragging) return;\n const onMove = (e: PointerEvent) => {\n engine.layoutMove({ x: e.clientX, y: e.clientY });\n };\n const onUp = (e: PointerEvent) => {\n engine.layoutDrop({ x: e.clientX, y: e.clientY });\n };\n // Capture phase so the page can't preventDefault us; passive=false\n // would be needed only if we ever called preventDefault here (we don't).\n window.addEventListener(\"pointermove\", onMove, { passive: true });\n window.addEventListener(\"pointerup\", onUp, { passive: true });\n return () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n }, [engine, isDragging]);\n\n // ── Drop bubble: commit annotation, then advance the engine ──────\n const handleCommitPlacement = (comment: string) => {\n if (state.kind !== \"annotating\" || state.selection.kind !== \"placement\") return;\n const annotation = buildPlacementAnnotation({\n item: state.selection.item,\n pointer: state.selection.pointer,\n scrollY: state.selection.scrollY,\n comment: withPurpose(comment),\n detail: outputDetail,\n });\n addAnnotation(annotation);\n engine.commit(); // → layoutIdle (per state-machine COMMIT branch)\n };\n const handleCommitRearrange = (comment: string) => {\n if (state.kind !== \"annotating\" || state.selection.kind !== \"rearrange\") return;\n const sel = state.selection;\n // `target` from the engine is `Element`; downstream we need\n // `HTMLElement` for metadata + selectors. Cast is safe — sections\n // detected by sectionDetect.ts are always HTMLElements.\n const annotation = buildRearrangeAnnotation({\n target: sel.target as HTMLElement,\n originalRect: sel.originalRect,\n currentRect: sel.currentRect,\n comment: withPurpose(comment),\n detail: outputDetail,\n });\n addAnnotation(annotation);\n engine.commit();\n };\n const handleCancel = () => {\n if (state.kind !== \"annotating\") return;\n // COMMIT without adding an annotation — engine clears the selection.\n engine.commit();\n };\n\n return (\n <>\n {wireframeOn ? (\n <WireframeSurface\n opacity={wireframeOpacity}\n onOpacityChange={setWireframeOpacity}\n purpose={wireframePurpose}\n onPurposeChange={setWireframePurpose}\n onExit={exitWireframe}\n />\n ) : null}\n {/* Persistent placement boxes — every placement annotation\n renders as a visible, selectable, resizable block. Always\n mounted while layout mode is active so the user can revisit\n / edit prior placements. */}\n <PlacedComponents />\n <LayoutPalette\n onGrab={handleGrab}\n wireframeOn={wireframeOn}\n onWireframeToggle={toggleWireframe}\n />\n {/* Rearrange outlines only show in layoutIdle — once the user\n starts dragging anything, hide them to keep the visual clean.\n We also hide them in wireframe mode because the fade renders\n the underlying sections nearly invisible anyway. */}\n {state.kind === \"layoutIdle\" && !wireframeOn ? (\n <RearrangeOverlay onGrab={handleSectionGrab} />\n ) : null}\n {state.kind === \"layoutPlacing\" ? (\n <LayoutGhost item={state.item} pointer={state.pointer} />\n ) : null}\n {state.kind === \"layoutRearranging\" ? (\n // Reuse the placement ghost for rearranges by passing a synthetic\n // item: same translucent-box visual at the section's size.\n <LayoutGhost\n item={{\n componentType: state.target.tagName.toLowerCase(),\n width: state.originalRect.width,\n height: state.originalRect.height,\n }}\n pointer={state.pointer}\n />\n ) : null}\n {state.kind === \"annotating\" && state.selection.kind === \"placement\" ? (\n <DropCommentBubble\n pointer={state.selection.pointer}\n chipLabel={state.selection.item.componentType}\n placeholder=\"Describe what goes here…\"\n onCommit={handleCommitPlacement}\n onCancel={handleCancel}\n />\n ) : null}\n {state.kind === \"annotating\" && state.selection.kind === \"rearrange\" ? (\n <DropCommentBubble\n // Bubble appears in viewport coords; currentRect is doc coords.\n // Convert at render time so the bubble lands at the drop point.\n pointer={{\n x: state.selection.currentRect.x - window.scrollX,\n y: state.selection.currentRect.y - window.scrollY,\n }}\n chipLabel={`Move ${state.selection.target.tagName.toLowerCase()}`}\n placeholder=\"Why move it here?\"\n onCommit={handleCommitRearrange}\n onCancel={handleCancel}\n />\n ) : null}\n </>\n );\n}\n\n/* ─── Wireframe surface (M7) ────────────────────────────────────────── */\n\ninterface WireframeSurfaceProps {\n /** 0..100 (% fade). 0 = page fully visible, 100 = page fully obscured. */\n opacity: number;\n onOpacityChange: (next: number) => void;\n /** Free-form context prepended to every comment while wireframe is on. */\n purpose: string;\n onPurposeChange: (next: string) => void;\n onExit: () => void;\n}\n\n/**\n * Two surfaces:\n *\n * 1. A fixed-position white fade layer. `pointer-events: none` so\n * palette tiles and section outlines underneath stay reachable,\n * AND the host page still receives pointers under the dim (placement\n * drops land on the real elements, not on the overlay).\n *\n * 2. A control bar pinned to the top-centre with the opacity slider,\n * the purpose textarea, and an exit button. Pointer-events back\n * on so the controls are usable.\n *\n * State is owned by LayoutMode so `withPurpose()` can read the textarea\n * value at commit time without refs.\n */\nexport function WireframeSurface({\n opacity,\n onOpacityChange,\n purpose,\n onPurposeChange,\n onExit,\n}: WireframeSurfaceProps) {\n const fadeAlpha = clamp01(opacity / 100);\n\n const handleOpacity = (e: ChangeEvent<HTMLInputElement>) => {\n onOpacityChange(Number(e.target.value));\n };\n const handlePurpose = (e: ChangeEvent<HTMLTextAreaElement>) => {\n onPurposeChange(e.target.value);\n };\n\n return (\n <>\n <div\n className=\"clickly-wireframe-fade\"\n aria-hidden\n style={{\n position: \"fixed\",\n inset: 0,\n background: \"#ffffff\",\n opacity: fadeAlpha,\n pointerEvents: \"none\",\n // Sits beneath palette (z:2) / ghost (z:3) / bubble (z:4),\n // but above all page content so the dim reads consistently.\n zIndex: 1,\n }}\n />\n <div\n className=\"clickly-wireframe-controls\"\n role=\"region\"\n aria-label=\"Wireframe controls\"\n >\n <div className=\"clickly-wireframe-row\">\n <label className=\"clickly-wireframe-label\">\n Fade\n <input\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={opacity}\n onChange={handleOpacity}\n className=\"clickly-wireframe-slider\"\n aria-label=\"Wireframe fade opacity\"\n />\n <span className=\"clickly-wireframe-value\">{Math.round(opacity)}%</span>\n </label>\n <button\n type=\"button\"\n className=\"clickly-wireframe-exit\"\n onClick={onExit}\n title=\"Exit wireframe mode\"\n aria-label=\"Exit wireframe mode\"\n >\n Exit\n </button>\n </div>\n <textarea\n className=\"clickly-wireframe-purpose\"\n value={purpose}\n onChange={handlePurpose}\n placeholder=\"What page are you sketching? (e.g. New pricing landing for SMB plan)\"\n rows={2}\n aria-label=\"Wireframe purpose\"\n />\n </div>\n </>\n );\n}\n\nfunction clamp01(n: number): number {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.min(1, n));\n}\n\n/* ─── Placed components layer (M12–M13) ─────────────────────────────── */\n\n/**\n * Renders every placement annotation as a persistent, visible block on\n * the page — not just an annotation pin. Subscribes to the annotation\n * store and re-renders on scroll so positions stay tied to document\n * coordinates.\n *\n * Selection model: at most one placed box is selected at a time. The\n * selected box shows corner resize handles + a delete X. Clicking\n * empty space or pressing Esc clears selection.\n */\nfunction PlacedComponents() {\n const annotations = useAnnotationsList();\n const update = useAnnotations((s) => s.update);\n const remove = useAnnotations((s) => s.remove);\n const placements = annotations.filter(isPlacementAnnotation);\n\n const [selectedId, setSelectedId] = useState<string | null>(null);\n\n // Force re-render on scroll so the fixed-position boxes track the\n // page. Cheap — single state bump per scroll event (rAF-coalesced by\n // the browser).\n const [, setScrollTick] = useState(0);\n useEffect(() => {\n const onScroll = () => setScrollTick((n) => n + 1);\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n window.addEventListener(\"resize\", onScroll);\n return () => {\n window.removeEventListener(\"scroll\", onScroll);\n window.removeEventListener(\"resize\", onScroll);\n };\n }, []);\n\n // Esc deselects.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && selectedId) {\n setSelectedId(null);\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [selectedId]);\n\n if (placements.length === 0) return null;\n\n return (\n <div className=\"clickly-placed-layer\" aria-hidden={false}>\n {placements.map((p) => (\n <PlacedBox\n key={p.id}\n annotation={p}\n selected={p.id === selectedId}\n onSelect={() => setSelectedId(p.id)}\n onDeselect={() => setSelectedId(null)}\n onMove={(x, y) => {\n update(p.id, { x, y });\n }}\n onResize={(patch) => {\n update(p.id, {\n x: patch.x ?? p.x,\n y: patch.y ?? p.y,\n placement: { ...p.placement!, ...patch.placement },\n });\n }}\n onDelete={() => {\n remove(p.id);\n setSelectedId(null);\n }}\n />\n ))}\n </div>\n );\n}\n\ntype PlacedAnnotation = Annotation & {\n kind: \"placement\";\n placement: NonNullable<Annotation[\"placement\"]>;\n};\n\ninterface PlacedBoxProps {\n annotation: PlacedAnnotation;\n selected: boolean;\n onSelect: () => void;\n onDeselect: () => void;\n /** Body drag — only updates position (x, y), keeps size unchanged. */\n onMove: (x: number, y: number) => void;\n onResize: (patch: {\n x?: number;\n y?: number;\n placement: Partial<NonNullable<Annotation[\"placement\"]>>;\n }) => void;\n onDelete: () => void;\n}\n\n/** Which corner is being dragged during a resize. */\ntype ResizeAnchor = \"nw\" | \"ne\" | \"sw\" | \"se\";\n\n/** Pixels the pointer must move before a pointerdown becomes a drag\n * (vs being treated as a plain click for select). Matches the engine's\n * DRAG_THRESHOLD_PX so layout-mode interactions feel consistent. */\nconst PLACED_DRAG_THRESHOLD = 4;\n\n/**\n * One placement, rendered at its document-coord position (placement.x is\n * stored as % of viewport width; placement.y is document px from top;\n * width/height in CSS px). Converted to viewport coords at render time.\n *\n * Interaction model (matches Figma / common design-tool conventions):\n * - Pointerdown on body → start a potential drag.\n * - Move < threshold → plain click; selects if not selected.\n * - Move ≥ threshold → drag the box to a new position, updating x/y.\n * - Pointerdown on a corner handle → resize (handled separately).\n * - Click X → delete. Click ✓ → deselect.\n */\nfunction PlacedBox({\n annotation,\n selected,\n onSelect,\n onDeselect,\n onMove,\n onResize,\n onDelete,\n}: PlacedBoxProps) {\n const p = annotation.placement;\n const vw = window.innerWidth;\n\n // AFS spec: x is % of viewport width, y is document px from top.\n // Convert to viewport coords for our `position: fixed` rendering.\n const docLeft = (annotation.x / 100) * vw;\n const docTop = annotation.y;\n const viewLeft = docLeft - window.scrollX;\n const viewTop = docTop - window.scrollY;\n\n // Body pointerdown — could be a click (select) or a drag (move).\n // Decided by whether the pointer crosses the threshold before release.\n const handleBodyPointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n // Skip if the press originated on a child that already handled it\n // (handles + buttons all stopPropagation), so we don't double-react.\n if (e.button !== 0) return;\n e.stopPropagation();\n\n const startPointer = { x: e.clientX, y: e.clientY };\n const startDocLeft = docLeft;\n const startDocTop = docTop;\n let dragging = false;\n\n const onPointerMove = (m: PointerEvent) => {\n const dx = m.clientX - startPointer.x;\n const dy = m.clientY - startPointer.y;\n if (!dragging && Math.abs(dx) + Math.abs(dy) < PLACED_DRAG_THRESHOLD) return;\n // Cross the threshold → commit to a drag. Select on first move so\n // handles appear immediately, then begin position updates.\n if (!dragging) {\n dragging = true;\n if (!selected) onSelect();\n }\n const nextDocLeft = startDocLeft + dx;\n const nextDocTop = startDocTop + dy;\n onMove(\n vw > 0 ? clamp0to100((nextDocLeft / vw) * 100) : 0,\n Math.max(0, Math.round(nextDocTop)),\n );\n };\n\n const onPointerUp = () => {\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n // Plain click → select. (If we dragged, selection already happened\n // on the first qualifying move.)\n if (!dragging && !selected) onSelect();\n };\n\n window.addEventListener(\"pointermove\", onPointerMove, { passive: true });\n window.addEventListener(\"pointerup\", onPointerUp, { passive: true });\n };\n\n // Resize drag handler. Mutates the annotation's width/height (and\n // for NW/N/W anchors, the x/y origin too) as the pointer moves.\n const handleResizeStart =\n (anchor: ResizeAnchor) => (e: ReactPointerEvent<HTMLDivElement>) => {\n e.stopPropagation();\n e.preventDefault();\n const startPointer = { x: e.clientX, y: e.clientY };\n const startW = p.width;\n const startH = p.height;\n const startDocLeft = docLeft;\n const startDocTop = docTop;\n\n const onMove = (m: PointerEvent) => {\n const dx = m.clientX - startPointer.x;\n const dy = m.clientY - startPointer.y;\n let nextW = startW;\n let nextH = startH;\n let nextDocLeft = startDocLeft;\n let nextDocTop = startDocTop;\n\n if (anchor === \"ne\" || anchor === \"se\") nextW = Math.max(24, startW + dx);\n if (anchor === \"nw\" || anchor === \"sw\") {\n nextW = Math.max(24, startW - dx);\n nextDocLeft = startDocLeft + (startW - nextW);\n }\n if (anchor === \"sw\" || anchor === \"se\") nextH = Math.max(16, startH + dy);\n if (anchor === \"nw\" || anchor === \"ne\") {\n nextH = Math.max(16, startH - dy);\n nextDocTop = startDocTop + (startH - nextH);\n }\n\n onResize({\n x: vw > 0 ? clamp0to100((nextDocLeft / vw) * 100) : 0,\n y: Math.max(0, Math.round(nextDocTop)),\n placement: {\n width: Math.round(nextW),\n height: Math.round(nextH),\n },\n });\n };\n const onUp = () => {\n window.removeEventListener(\"pointermove\", onMove);\n window.removeEventListener(\"pointerup\", onUp);\n };\n window.addEventListener(\"pointermove\", onMove, { passive: true });\n window.addEventListener(\"pointerup\", onUp, { passive: true });\n };\n\n // Clicking off the box (anywhere on the layer not inside this box)\n // deselects. Handled via the layer's backdrop in PlacedComponents\n // when we add it — for now Esc handles deselect, and clicking\n // another box transfers selection.\n\n return (\n <div\n className={`clickly-placed${selected ? \" is-selected\" : \"\"}`}\n style={{\n position: \"fixed\",\n left: Math.round(viewLeft),\n top: Math.round(viewTop),\n width: Math.round(p.width),\n height: Math.round(p.height),\n }}\n onPointerDown={handleBodyPointerDown}\n data-component-type={p.componentType}\n >\n <span className=\"clickly-placed-tag\">{p.componentType}</span>\n <div className=\"clickly-placed-preview\">{renderPreview(p.componentType)}</div>\n\n {selected ? (\n <>\n <div className=\"clickly-placed-handle is-nw\" onPointerDown={handleResizeStart(\"nw\")} />\n <div className=\"clickly-placed-handle is-ne\" onPointerDown={handleResizeStart(\"ne\")} />\n <div className=\"clickly-placed-handle is-sw\" onPointerDown={handleResizeStart(\"sw\")} />\n <div className=\"clickly-placed-handle is-se\" onPointerDown={handleResizeStart(\"se\")} />\n <button\n type=\"button\"\n className=\"clickly-placed-delete\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation();\n onDelete();\n }}\n aria-label={`Delete ${p.componentType} placement`}\n title=\"Delete placement\"\n >\n ✕\n </button>\n {/* Bottom-centre dismiss handle — clicking outside the box\n isn't reachable while the placed-layer's pointer-events\n are scoped to children. Click here to clear selection. */}\n <button\n type=\"button\"\n className=\"clickly-placed-deselect\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation();\n onDeselect();\n }}\n aria-label=\"Deselect\"\n title=\"Done editing\"\n >\n ✓\n </button>\n </>\n ) : null}\n </div>\n );\n}\n\nfunction clamp0to100(n: number): number {\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.min(100, n));\n}\n","import { useEffect, useState } from \"react\";\nimport type { SelectionEngine } from \"@useclickly/core\";\nimport { Toolbar } from \"./Toolbar\";\nimport { CollapsedFAB } from \"./CollapsedFAB\";\nimport { AnnotationPopup } from \"./AnnotationPopup\";\nimport { AnnotationPins } from \"./AnnotationPins\";\nimport { DrawCanvas } from \"./DrawCanvas\";\nimport { LayoutMode } from \"./layout/LayoutMode\";\nimport { freeze, unfreeze } from \"./freezeAnimations\";\nimport { useAnnotations } from \"../state/annotations\";\nimport { annotationsToMarkdown } from \"../output/markdown\";\nimport { resolveTheme, useSettings } from \"../state/settings\";\nimport {\n createSession,\n pingServer,\n pushAnnotation,\n useMcpStatus,\n} from \"../state/mcpClient\";\nimport { useEngineState } from \"../state/useEngineState\";\nimport { loadAllStrokes } from \"./strokeDB\";\n\n/**\n * Top-level React subtree rendered (via createPortal) inside the\n * shadow root. Owns:\n *\n * - the expanded ↔ collapsed UI state\n * - all keyboard shortcuts (delegating engine actions to the engine)\n * - the body `data-clickly-active` attribute used to flip the page\n * cursor to crosshair while inspecting\n * - freeze-animations state (lives here so it survives toolbar collapse)\n */\nexport function ClicklyRoot({\n engine,\n host,\n}: {\n engine: SelectionEngine;\n host: HTMLElement;\n}) {\n const [expanded, setExpanded] = useState(false);\n const [toolbarClosing, setToolbarClosing] = useState(false);\n const [frozen, setFrozen] = useState(false);\n\n // Trigger close animation, then actually unmount the toolbar\n const collapse = () => {\n setToolbarClosing(true);\n };\n const onToolbarCloseEnd = () => {\n setToolbarClosing(false);\n setExpanded(false);\n };\n\n const clearAnnotations = useAnnotations((s) => s.clear);\n const outputDetail = useSettings((s) => s.outputDetail);\n const markerColor = useSettings((s) => s.markerColor);\n const theme = useSettings((s) => s.theme);\n const engineState = useEngineState(engine);\n\n // Resolve theme + react to OS preference changes while in \"system\" mode.\n // Bumping `systemTick` forces a re-render so resolveTheme() reads the\n // updated media-query value.\n const [, setSystemTick] = useState(0);\n useEffect(() => {\n if (theme !== \"system\" || typeof window === \"undefined\" || !window.matchMedia) {\n return;\n }\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n const onChange = () => setSystemTick((n) => n + 1);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n }, [theme]);\n const resolvedTheme = resolveTheme(theme);\n\n // Apply user-chosen marker color → updates the shadow root's CSS vars.\n useEffect(() => {\n host.style.setProperty(\"--clickly-hover\", markerColor);\n }, [host, markerColor]);\n\n // Apply theme via data attribute on the shadow host so CSS selectors\n // in styles.ts (`[data-clickly-theme=\"dark\"] …`) take effect.\n useEffect(() => {\n host.setAttribute(\"data-clickly-theme\", resolvedTheme);\n }, [host, resolvedTheme]);\n\n // Hydrate strokes from IndexedDB on first mount. Annotations themselves\n // are persisted elsewhere (zustand persist or app-side); strokes live\n // in their own object store because they're large and rarely read.\n useEffect(() => {\n let cancelled = false;\n void loadAllStrokes().then((map) => {\n if (cancelled || Object.keys(map).length === 0) return;\n useAnnotations.getState().hydrateStrokes(map);\n });\n return () => { cancelled = true; };\n }, []);\n\n // ── Freeze animations ─────────────────────────────────────────────\n // Lives here (not in Toolbar) so collapsing the toolbar doesn't\n // un-freeze the page mid-inspection. The freeze module patches\n // setTimeout/setInterval/rAF globally and pauses CSS/WAAPI/GSAP/video;\n // Clickly UI surfaces are excluded by [data-clickly-root/-toolbar].\n useEffect(() => {\n if (frozen) freeze();\n else unfreeze();\n return () => {\n // If Clickly itself unmounts while frozen, make sure the page\n // doesn't stay paused forever.\n unfreeze();\n };\n }, [frozen]);\n\n // ── MCP sync ─────────────────────────────────────────────────────\n // When mcpEnabled flips on, ping the server, create (or reuse) a\n // session, and start listening to the annotation store. Every new\n // annotation gets POSTed to /sessions/:id/annotations.\n //\n // Status flow:\n // disabled → connecting → connected (on success)\n // ↓\n // error (with lastError message)\n //\n // Re-pings every 20s while enabled so the badge stays accurate when\n // the server goes down mid-session.\n const mcpEnabled = useSettings((s) => s.mcpEnabled);\n const mcpEndpoint = useSettings((s) => s.mcpEndpoint);\n const mcpSessionId = useSettings((s) => s.mcpSessionId);\n const setSettings = useSettings((s) => s.set);\n // IMPORTANT: select each zustand action with its own selector so the\n // hook returns a stable function reference. A combined selector that\n // builds an object literal (`(s) => ({ a: s.a, b: s.b })`) returns a\n // new object every render → useSyncExternalStore triggers an infinite\n // loop (\"getSnapshot should be cached\"). The single-field form is the\n // recommended pattern in zustand's docs.\n const setMcpStatus = useMcpStatus((s) => s.setStatus);\n const setMcpServerVersion = useMcpStatus((s) => s.setServerVersion);\n const noteSuccessfulPing = useMcpStatus((s) => s.noteSuccessfulPing);\n\n useEffect(() => {\n if (!mcpEnabled) {\n useMcpStatus.getState().setStatus(\"disabled\");\n return;\n }\n\n let cancelled = false;\n let heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n let activeSessionId = mcpSessionId;\n\n const connect = async () => {\n setMcpStatus(\"connecting\");\n\n const version = await pingServer(mcpEndpoint);\n if (cancelled) return;\n if (!version) {\n setMcpStatus(\n \"error\",\n `Can't reach ${mcpEndpoint} — is the MCP server running?`,\n );\n return;\n }\n setMcpServerVersion(version);\n noteSuccessfulPing();\n\n // Open (or reuse) a session for this page URL.\n if (!activeSessionId) {\n try {\n activeSessionId = await createSession(mcpEndpoint, location.href);\n if (cancelled) return;\n setSettings({ mcpSessionId: activeSessionId });\n } catch (err) {\n if (cancelled) return;\n setMcpStatus(\n \"error\",\n err instanceof Error ? err.message : \"Failed to create session\",\n );\n return;\n }\n }\n\n setMcpStatus(\"connected\");\n };\n\n void connect();\n\n // Heartbeat — re-ping every 20s while enabled. If the server goes\n // down the status flips to \"error\" within a half-period.\n heartbeatTimer = setInterval(async () => {\n const version = await pingServer(mcpEndpoint);\n if (cancelled) return;\n if (version) {\n setMcpServerVersion(version);\n noteSuccessfulPing();\n // Recover from a prior error state without bouncing the user.\n if (useMcpStatus.getState().status === \"error\") {\n setMcpStatus(\"connected\");\n }\n } else {\n setMcpStatus(\"error\", `Lost connection to ${mcpEndpoint}`);\n }\n }, 20_000);\n\n return () => {\n cancelled = true;\n if (heartbeatTimer) clearInterval(heartbeatTimer);\n useMcpStatus.getState().setStatus(\"disabled\");\n };\n // Re-run if the user changes the endpoint, toggles enabled, or the\n // persisted session id clears. zustand action refs are stable so\n // omitting them from deps is intentional.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [mcpEnabled, mcpEndpoint, mcpSessionId]);\n\n // Push new annotations to the server. Subscribes to the store; the\n // simplest correct policy is \"diff the order array against last\n // snapshot and POST anything new.\" Updates/deletes aren't pushed in\n // v1 (HTTP bridge doesn't expose those routes — see mcpClient.ts).\n useEffect(() => {\n if (!mcpEnabled || !mcpSessionId) return;\n let lastIds = new Set(useAnnotations.getState().order);\n\n const unsub = useAnnotations.subscribe((s) => {\n const currentIds = new Set(s.order);\n const newIds: string[] = [];\n for (const id of s.order) {\n if (!lastIds.has(id)) newIds.push(id);\n }\n lastIds = currentIds;\n\n if (newIds.length === 0 || useMcpStatus.getState().status !== \"connected\") {\n return;\n }\n for (const id of newIds) {\n const annotation = s.byId[id];\n if (!annotation) continue;\n // Fire-and-forget — failure flips status to error but doesn't\n // block the local annotation flow.\n pushAnnotation(mcpEndpoint, mcpSessionId, annotation).catch((err) => {\n useMcpStatus\n .getState()\n .setStatus(\n \"error\",\n err instanceof Error ? err.message : \"Failed to push annotation\",\n );\n });\n }\n });\n return unsub;\n }, [mcpEnabled, mcpEndpoint, mcpSessionId]);\n\n // Activate engine while expanded; deactivate when collapsed.\n useEffect(() => {\n if (expanded) {\n if (engine.getSnapshot().kind === \"idle\") engine.activate(\"single\");\n } else {\n if (engine.getSnapshot().kind !== \"idle\") engine.deactivate();\n }\n }, [expanded, engine]);\n\n // Body attributes — host page can target our active state + mode in\n // CSS. We use these to disable text selection + swap the cursor while\n // inspecting (see internal/globalStyles.ts).\n useEffect(() => {\n const active = engineState.kind !== \"idle\";\n if (active) document.body.setAttribute(\"data-clickly-active\", \"\");\n else document.body.removeAttribute(\"data-clickly-active\");\n\n const mode =\n engineState.kind === \"inspect\" ||\n engineState.kind === \"pressed\" ||\n engineState.kind === \"dragging\"\n ? engineState.mode\n : null;\n if (mode) document.body.setAttribute(\"data-clickly-mode\", mode);\n else document.body.removeAttribute(\"data-clickly-mode\");\n\n if (engineState.kind === \"annotating\") {\n document.body.setAttribute(\"data-clickly-annotating\", \"\");\n } else {\n document.body.removeAttribute(\"data-clickly-annotating\");\n }\n\n return () => {\n document.body.removeAttribute(\"data-clickly-active\");\n document.body.removeAttribute(\"data-clickly-mode\");\n document.body.removeAttribute(\"data-clickly-annotating\");\n };\n }, [engineState]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement | null)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\") return;\n if ((e.target as HTMLElement | null)?.isContentEditable) return;\n const active = document.activeElement;\n if (active && (active.tagName === \"TEXTAREA\" || active.tagName === \"INPUT\")) return;\n\n // Toggle FAB ↔ toolbar\n if (e.key.toLowerCase() === \"f\" && e.shiftKey && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n if (expanded) collapse(); else setExpanded(true);\n return;\n }\n\n // Escape: if popup open → engine handles cancel; else collapse toolbar\n if (e.key === \"Escape\") {\n if (engine.getSnapshot().kind === \"annotating\") return;\n if (expanded) collapse();\n return;\n }\n\n if (!expanded) return;\n\n if (e.key === \"1\") engine.setMode(\"single\");\n if (e.key === \"2\") engine.setMode(\"multi\");\n if (e.key === \"3\") engine.setMode(\"area\");\n if (e.key === \"4\") engine.setMode(\"draw\");\n\n // Layout Mode toggle (matches Agentation's `L`). When already in\n // layout mode, dropping back to single is the inverse — picking a\n // sensible default since we don't track the prior mode.\n if ((e.key === \"l\" || e.key === \"L\") && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault();\n const s = engine.getSnapshot();\n const inLayout =\n s.kind === \"layoutIdle\" ||\n s.kind === \"layoutPlacing\" ||\n s.kind === \"layoutRearranging\";\n engine.setMode(inLayout ? \"single\" : \"layout\");\n }\n\n // Toggle freeze animations (matches Agentation's `P` shortcut).\n // Modifier-free so it doesn't clash with browser shortcuts; the\n // input/textarea guard above already protects typing flows.\n if ((e.key === \"p\" || e.key === \"P\") && !e.metaKey && !e.ctrlKey && !e.altKey) {\n e.preventDefault();\n setFrozen((v) => !v);\n }\n\n if (e.key === \"Enter\") {\n const s = engine.getSnapshot();\n if (s.kind === \"inspect\" && s.pinned.length > 0) {\n e.preventDefault();\n engine.annotatePinned();\n }\n }\n\n if (e.key === \"c\" || e.key === \"C\") {\n const list = useAnnotations.getState().list();\n if (list.length === 0) return;\n e.preventDefault();\n navigator.clipboard?.writeText(annotationsToMarkdown(list, outputDetail));\n }\n if (e.key === \"x\" || e.key === \"X\") {\n if (useAnnotations.getState().list().length === 0) return;\n e.preventDefault();\n clearAnnotations();\n }\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [clearAnnotations, outputDetail, expanded, engine]);\n\n return (\n <div className=\"clickly-ui\">\n {/* Stroke canvas paints whenever there are saved strokes or an\n in-progress draw. Lives at the top of the tree so it sits beneath\n the toolbar + popups in the natural stacking order. */}\n <DrawCanvas engine={engine} />\n <AnnotationPins />\n {(expanded || toolbarClosing) ? (\n <>\n <Toolbar\n engine={engine}\n onCollapse={collapse}\n isClosing={toolbarClosing}\n onCloseEnd={onToolbarCloseEnd}\n frozen={frozen}\n onFreezeToggle={() => setFrozen((v) => !v)}\n />\n {/* AnnotationPopup is the BIG feedback popup (styles editor +\n comment + source jump). It must NOT render for layout-mode\n selections — those have their own minimal DropCommentBubble\n inside LayoutMode. Without this guard both popups stack. */}\n {!toolbarClosing &&\n !(\n engineState.kind === \"annotating\" &&\n (engineState.selection.kind === \"placement\" ||\n engineState.selection.kind === \"rearrange\")\n ) && <AnnotationPopup engine={engine} />}\n {/* Layout Mode mounts its own palette + ghost + drop bubble.\n Lives only while the engine is in a layout* state; the\n annotating-with-placement branch is also handled by it\n (LayoutMode renders DropCommentBubble in that case). */}\n {(engineState.kind === \"layoutIdle\" ||\n engineState.kind === \"layoutPlacing\" ||\n engineState.kind === \"layoutRearranging\" ||\n (engineState.kind === \"annotating\" &&\n (engineState.selection.kind === \"placement\" ||\n engineState.selection.kind === \"rearrange\"))) && (\n <LayoutMode engine={engine} state={engineState} />\n )}\n </>\n ) : (\n <CollapsedFAB onExpand={() => setExpanded(true)} />\n )}\n </div>\n );\n}\n","/**\n * CSS injected into the shadow root by the React layer. Separate from\n * the overlay-marker CSS in `@useclickly/core/styles` so each package owns\n * its surface.\n */\nexport const REACT_UI_CSS = `\n.clickly-ui, .clickly-ui * { box-sizing: border-box; }\n\n/* ─── Floating action button (collapsed state) ──────────────────── */\n\n.clickly-fab {\n position: fixed;\n right: 16px;\n bottom: 16px;\n width: 48px;\n height: 48px;\n border: none;\n border-radius: 999px;\n background: #0f172a;\n color: #f8fafc;\n display: grid;\n place-items: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow:\n 0 8px 24px rgba(0,0,0,0.30),\n 0 0 0 1px rgba(255,255,255,0.06) inset;\n transition: transform 140ms ease, box-shadow 140ms ease;\n z-index: 1;\n animation: clickly-fab-open 280ms cubic-bezier(0.34, 1.56, 0.64, 1) both;\n}\n@keyframes clickly-fab-open {\n from { opacity: 0; transform: scale(0.5); }\n to { opacity: 1; transform: scale(1); }\n}\n.clickly-fab:hover {\n transform: scale(1.06);\n box-shadow:\n 0 10px 28px rgba(0,0,0,0.36),\n 0 0 0 1px rgba(255,255,255,0.10) inset;\n}\n.clickly-fab:active { transform: scale(0.96); }\n.clickly-fab svg { width: 18px; height: 18px; color: #f8fafc; }\n\n.clickly-fab-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n min-width: 18px;\n height: 18px;\n padding: 0 5px;\n background: #f59e0b;\n color: #0f172a;\n font: 600 11px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 9px;\n display: grid;\n place-items: center;\n pointer-events: none;\n}\n\n/* ─── Toolbar (expanded state) ──────────────────────────────────── */\n\n.clickly-toolbar {\n position: fixed;\n display: flex;\n align-items: center;\n gap: 3px;\n padding: 6px 8px;\n height: 46px;\n /* Subtle vertical gradient (slightly lighter at top) gives the bar a\n glassy feel without going full glass-blur, which can read fuzzy on\n low-contrast pages. */\n background:\n linear-gradient(180deg, rgba(20, 26, 44, 0.98), rgba(9, 14, 28, 0.98));\n color: #f8fafc;\n border-radius: 18px;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n /* Layered shadow: ground shadow + ambient glow + 1px hairline + top\n highlight. The top highlight is what sells the glass effect. */\n box-shadow:\n 0 24px 48px -12px rgba(0,0,0,0.55),\n 0 8px 24px -8px rgba(0,0,0,0.40),\n 0 0 0 1px rgba(255,255,255,0.08) inset,\n 0 1px 0 rgba(255,255,255,0.10) inset;\n pointer-events: auto;\n user-select: none;\n z-index: 1;\n transform-origin: bottom right;\n animation: clickly-toolbar-open 240ms cubic-bezier(0.16, 1, 0.3, 1) both;\n}\n.clickly-toolbar.is-closing {\n animation: clickly-toolbar-close 200ms cubic-bezier(0.4, 0, 1, 1) both;\n pointer-events: none;\n}\n\n@keyframes clickly-toolbar-open {\n from { opacity: 0; transform: scale(0.82) translateY(10px); }\n to { opacity: 1; transform: scale(1) translateY(0); }\n}\n@keyframes clickly-toolbar-close {\n from { opacity: 1; transform: scale(1) translateY(0); }\n to { opacity: 0; transform: scale(0.82) translateY(10px); }\n}\n\n.clickly-toolbar .grip {\n display: grid;\n place-items: center;\n width: 20px;\n height: 32px;\n color: #64748b;\n touch-action: none;\n cursor: grab;\n border-radius: 6px;\n transition: color 120ms ease, background 120ms ease;\n}\n.clickly-toolbar .grip:hover { color: #cbd5e1; background: rgba(255,255,255,0.05); }\n.clickly-toolbar .grip:active { cursor: grabbing; color: #f8fafc; }\n\n.clickly-toolbar .divider {\n width: 1px;\n height: 22px;\n /* Hairline divider with a soft fade top/bottom — reads as intentional\n grouping rather than a hard cut. */\n background: linear-gradient(\n 180deg,\n transparent,\n rgba(255,255,255,0.14) 25%,\n rgba(255,255,255,0.14) 75%,\n transparent\n );\n margin: 0 5px;\n flex-shrink: 0;\n}\n\n.clickly-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n height: 34px;\n padding: 0 9px;\n background: transparent;\n border: none;\n border-radius: 10px;\n color: #cbd5e1;\n cursor: pointer;\n font: inherit;\n transition:\n background 120ms ease,\n color 120ms ease,\n transform 80ms ease,\n box-shadow 120ms ease;\n position: relative;\n}\n.clickly-btn:hover {\n background: rgba(255,255,255,0.08);\n color: #ffffff;\n /* Tiny lift on hover — small enough to feel responsive without\n visibly shifting nearby buttons. */\n box-shadow:\n 0 1px 0 rgba(255,255,255,0.08) inset,\n 0 2px 8px rgba(0,0,0,0.25);\n}\n.clickly-btn:active {\n background: rgba(255,255,255,0.14);\n color: #fff;\n transform: scale(0.94);\n box-shadow: 0 1px 2px rgba(0,0,0,0.25) inset;\n}\n.clickly-btn.is-active {\n /* Active mode: cyan gradient (slightly brighter top) + soft outer\n glow + crisp inset highlight on top edge. Reads as \"lit up\" rather\n than \"flat painted.\" */\n background: linear-gradient(180deg, #38bdf8, #0ea5e9);\n color: #ffffff;\n box-shadow:\n 0 1px 0 rgba(255,255,255,0.30) inset,\n 0 0 0 1px rgba(14,165,233,0.55),\n 0 4px 12px rgba(14,165,233,0.35),\n 0 1px 3px rgba(14,165,233,0.20);\n}\n.clickly-btn.is-active:hover {\n background: linear-gradient(180deg, #7dd3fc, #0ea5e9);\n box-shadow:\n 0 1px 0 rgba(255,255,255,0.40) inset,\n 0 0 0 1px rgba(14,165,233,0.65),\n 0 6px 16px rgba(14,165,233,0.45);\n}\n.clickly-btn[disabled] { opacity: 0.28; cursor: not-allowed; pointer-events: none; }\n\n/* Freeze-animations active state — icy blue, same treatment */\n.clickly-btn.is-freeze {\n background: linear-gradient(180deg, rgba(125,211,252,0.28), rgba(99,179,237,0.22));\n color: #bae6fd;\n box-shadow:\n 0 1px 0 rgba(255,255,255,0.18) inset,\n 0 0 0 1px rgba(125,211,252,0.40),\n 0 2px 10px rgba(99,179,237,0.25);\n}\n.clickly-btn.is-freeze:hover {\n background: linear-gradient(180deg, rgba(125,211,252,0.36), rgba(99,179,237,0.30));\n color: #e0f2fe;\n}\n\n.clickly-btn.icon-only {\n width: 34px;\n padding: 0;\n}\n\n.clickly-btn.primary-pinned {\n background: #10b981;\n color: #fff;\n font-weight: 600;\n font-size: 12px;\n padding: 0 10px;\n gap: 5px;\n box-shadow: 0 0 0 1px rgba(16,185,129,0.4), 0 2px 8px rgba(16,185,129,0.25);\n}\n.clickly-btn.primary-pinned:hover { background: #059669; }\n\n/* ─── Tooltip ────────────────────────────────────────────────────── */\n\n.clickly-tip {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n /* Ensures the absolute-positioned counter badge clips correctly */\n isolation: isolate;\n}\n\n.clickly-tip .tip-bubble {\n position: absolute;\n bottom: calc(100% + 10px);\n left: 50%;\n transform: translateX(-50%);\n background: rgba(15, 23, 42, 0.98);\n color: #f1f5f9;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n padding: 5px 10px;\n border-radius: 8px;\n pointer-events: none;\n opacity: 0;\n transition: opacity 80ms ease;\n transition-delay: 200ms;\n box-shadow: 0 4px 16px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.07) inset;\n display: flex;\n align-items: center;\n gap: 6px;\n z-index: 10;\n}\n\n/* Arrow */\n.clickly-tip .tip-bubble::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-top-color: rgba(15, 23, 42, 0.98);\n}\n\n.clickly-tip:hover .tip-bubble { opacity: 1; }\n\n.clickly-tip .tip-bubble kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 18px;\n height: 18px;\n padding: 0 4px;\n background: rgba(255,255,255,0.12);\n border: 1px solid rgba(255,255,255,0.10);\n border-radius: 4px;\n font: 11px/1 ui-monospace, \"SF Mono\", Menlo, monospace;\n color: #94a3b8;\n}\n\n/* ─── Shortcuts panel ───────────────────────────────────────────── */\n\n.shortcuts-trigger {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.shortcuts-panel {\n position: absolute;\n bottom: calc(100% + 12px);\n left: 50%;\n transform: translateX(-50%);\n width: 260px;\n background: rgba(9, 14, 28, 0.97);\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 12px;\n box-shadow: 0 16px 40px rgba(0,0,0,0.45);\n padding: 10px;\n z-index: 10;\n animation: clickly-fade-in 100ms ease-out;\n pointer-events: none;\n}\n\n/* Arrow pointing down */\n.shortcuts-panel::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n border: 6px solid transparent;\n border-top-color: rgba(9, 14, 28, 0.97);\n}\n\n.shortcuts-title {\n font: 600 11px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n padding: 2px 4px 8px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n margin-bottom: 6px;\n}\n\n.shortcuts-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 4px 4px;\n border-radius: 6px;\n gap: 8px;\n}\n.shortcuts-row:hover { background: rgba(255,255,255,0.04); }\n\n.shortcuts-label {\n font: 12px/1.4 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n color: #94a3b8;\n flex: 1;\n min-width: 0;\n}\n\n.shortcuts-keys {\n display: flex;\n gap: 3px;\n align-items: center;\n flex-shrink: 0;\n}\n\n.shortcuts-keys kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 20px;\n height: 20px;\n padding: 0 5px;\n background: rgba(255,255,255,0.08);\n border: 1px solid rgba(255,255,255,0.10);\n border-bottom-width: 2px;\n border-radius: 5px;\n font: 11px/1 ui-monospace, \"SF Mono\", Menlo, monospace;\n color: #e2e8f0;\n}\n\n/* ─── Popup & popovers ──────────────────────────────────────────── */\n\n.clickly-popup, .clickly-popover {\n position: fixed;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 120ms ease-out;\n}\n\n.clickly-popup {\n width: 320px;\n padding: 12px;\n max-height: calc(100vh - 80px);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* ─── Shared inner styles — apply to both popup and pin-edit ─── */\n\n.clickly-popup .popup-header,\n.pin-edit .popup-header {\n display: flex;\n align-items: center;\n gap: 5px;\n margin-bottom: 8px;\n padding: 4px 2px;\n border-radius: 4px;\n cursor: pointer;\n user-select: none;\n color: #475569;\n font-size: 11px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n transition: background 80ms ease;\n}\n.clickly-popup .popup-header:hover,\n.pin-edit .popup-header:hover { background: #f1f5f9; }\n\n.clickly-popup .popup-chevron,\n.pin-edit .popup-chevron {\n font-size: 12px;\n color: #94a3b8;\n flex-shrink: 0;\n width: 12px;\n text-align: center;\n}\n\n.clickly-popup .popup-label,\n.pin-edit .popup-label {\n flex: 1;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n/* Edit-mode toggle button — top-right of CSS panel header */\n.clickly-popup .popup-edit-toggle {\n flex-shrink: 0;\n display: grid;\n place-items: center;\n width: 20px;\n height: 20px;\n background: transparent;\n border: 1px solid #e2e8f0;\n border-radius: 5px;\n color: #94a3b8;\n cursor: pointer;\n padding: 0;\n margin-left: auto;\n transition: background 100ms ease, color 100ms ease, border-color 100ms ease;\n}\n.clickly-popup .popup-edit-toggle:hover {\n background: #f1f5f9;\n color: #475569;\n border-color: #cbd5e1;\n}\n.clickly-popup .popup-edit-toggle.is-editing {\n background: #0ea5e9;\n color: #fff;\n border-color: #0ea5e9;\n}\n.clickly-popup .popup-edit-toggle.is-editing:hover {\n background: #0284c7;\n}\n\n/* Computed-styles panel */\n.clickly-popup .popup-styles,\n.pin-edit .popup-styles {\n margin-bottom: 8px;\n padding: 8px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 11px;\n max-height: 160px;\n overflow-y: auto;\n overscroll-behavior: contain;\n}\n\n.clickly-popup .style-row,\n.pin-edit .style-row {\n display: flex;\n align-items: center;\n gap: 6px;\n line-height: 1.7;\n border-radius: 4px;\n padding: 0 2px;\n transition: background 80ms ease;\n}\n\n.clickly-popup .style-row--changed,\n.pin-edit .style-row--changed {\n background: rgba(245, 158, 11, 0.10);\n}\n\n.clickly-popup .style-key,\n.pin-edit .style-key {\n color: #7c3aed;\n flex-shrink: 0;\n min-width: 90px;\n font-size: 11px;\n}\n\n.clickly-popup .style-val,\n.pin-edit .style-val {\n color: #0f172a;\n font-size: 11px;\n word-break: break-all;\n flex: 1;\n}\n\n/* Editable value input — live CSS preview */\n.clickly-popup .style-val-input {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: none;\n border-bottom: 1px solid transparent;\n color: #0f172a;\n font: 11px/1.7 ui-monospace, \"SF Mono\", Menlo, monospace;\n padding: 0;\n outline: none;\n transition: border-color 100ms ease;\n word-break: break-all;\n}\n.clickly-popup .style-val-input:focus {\n border-bottom-color: #0ea5e9;\n background: rgba(14, 165, 233, 0.05);\n border-radius: 2px 2px 0 0;\n}\n\n/* Revert button shown only on changed rows */\n.clickly-popup .style-revert-btn {\n flex-shrink: 0;\n background: transparent;\n border: none;\n color: #94a3b8;\n font-size: 13px;\n cursor: pointer;\n padding: 0 2px;\n line-height: 1;\n border-radius: 3px;\n transition: color 80ms ease, background 80ms ease;\n}\n.clickly-popup .style-revert-btn:hover {\n color: #f59e0b;\n background: rgba(245,158,11,0.12);\n}\n\n/* Hint text at bottom of CSS panel */\n.clickly-popup .style-hint,\n.pin-edit .style-hint {\n margin-top: 6px;\n padding-top: 6px;\n border-top: 1px solid #e2e8f0;\n font-size: 10.5px;\n color: #94a3b8;\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n line-height: 1.4;\n}\n\n.clickly-popup textarea,\n.pin-edit textarea {\n width: 100%;\n min-height: 64px;\n max-height: 160px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n}\n.clickly-popup textarea:focus,\n.pin-edit textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n.clickly-popup .row,\n.pin-edit .row {\n display: flex;\n justify-content: flex-end;\n gap: 6px;\n margin-top: 10px;\n}\n\n.clickly-popup .row .ghost,\n.pin-edit .row .ghost {\n background: transparent;\n color: #475569;\n border: 1px solid #e2e8f0;\n}\n.clickly-popup .row .ghost:hover,\n.pin-edit .row .ghost:hover { background: #f8fafc; }\n\n.clickly-popup .row .primary,\n.pin-edit .row .primary {\n background: #0ea5e9;\n color: #fff;\n border: none;\n}\n.clickly-popup .row .primary:hover,\n.pin-edit .row .primary:hover { background: #0284c7; }\n.clickly-popup .row button,\n.pin-edit .row button {\n height: 28px;\n padding: 0 12px;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n}\n\n/* Old popover kept for any legacy use */\n.clickly-popover { width: 260px; padding: 12px; }\n\n/* ─── Settings panel (redesigned) ───────────────────────────────── */\n\n.clickly-settings {\n position: fixed;\n width: 284px;\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 16px 48px rgba(2,6,23,0.20), 0 0 0 1px rgba(15,23,42,0.07);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n color: #0f172a;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1);\n overflow: hidden;\n}\n\n.settings-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 14px 12px;\n border-bottom: 1px solid #f1f5f9;\n}\n\n.settings-title {\n font-size: 13px;\n font-weight: 600;\n color: #0f172a;\n letter-spacing: -0.01em;\n}\n\n.settings-close {\n display: grid;\n place-items: center;\n width: 24px;\n height: 24px;\n background: #f1f5f9;\n border: none;\n border-radius: 6px;\n color: #64748b;\n cursor: pointer;\n padding: 0;\n transition: background 100ms, color 100ms;\n}\n.settings-close:hover { background: #e2e8f0; color: #0f172a; }\n.settings-close svg { width: 13px; height: 13px; }\n\n.settings-section { padding: 10px 14px; }\n\n.settings-divider {\n height: 1px;\n background: #f1f5f9;\n margin: 0;\n}\n\n.settings-label {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 13px;\n font-weight: 500;\n color: #1e293b;\n margin-bottom: 8px;\n}\n\n.settings-hint {\n font-size: 11.5px;\n font-weight: 400;\n color: #94a3b8;\n}\n\n.settings-select {\n width: 100%;\n padding: 7px 10px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n font: inherit;\n font-size: 13px;\n color: #1e293b;\n cursor: pointer;\n appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 32px;\n transition: border-color 120ms, box-shadow 120ms;\n}\n.settings-select:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.15);\n background-color: #fff;\n}\n\n.settings-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 6px 0;\n}\n.settings-row + .settings-row {\n border-top: 1px solid #f8fafc;\n}\n\n.settings-row-label {\n display: flex;\n flex-direction: column;\n gap: 2px;\n font-size: 13px;\n font-weight: 500;\n color: #1e293b;\n min-width: 0;\n}\n\n/* Toggle switch */\n.clickly-toggle {\n position: relative;\n flex-shrink: 0;\n width: 38px;\n height: 22px;\n cursor: pointer;\n}\n.clickly-toggle input {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n.toggle-track {\n position: absolute;\n inset: 0;\n background: #e2e8f0;\n border-radius: 11px;\n transition: background 180ms ease;\n}\n.toggle-track::after {\n content: \"\";\n position: absolute;\n top: 3px;\n left: 3px;\n width: 16px;\n height: 16px;\n background: #fff;\n border-radius: 50%;\n box-shadow: 0 1px 4px rgba(0,0,0,0.2);\n transition: transform 180ms cubic-bezier(0.34, 1.56, 0.64, 1);\n}\n.clickly-toggle input:checked + .toggle-track {\n background: #0ea5e9;\n}\n.clickly-toggle input:checked + .toggle-track::after {\n transform: translateX(16px);\n}\n\n/* Color picker */\n.settings-color-wrap {\n display: flex;\n align-items: center;\n gap: 0;\n cursor: pointer;\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid #e2e8f0;\n flex-shrink: 0;\n}\n.settings-color-wrap input[type=\"color\"] {\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n pointer-events: none;\n}\n.color-swatch {\n display: block;\n width: 32px;\n height: 24px;\n border-radius: 7px;\n border: 1px solid rgba(0,0,0,0.08);\n transition: transform 100ms ease;\n}\n.settings-color-wrap:hover .color-swatch { transform: scale(1.08); }\n\n.clickly-counter {\n /* Float as a badge — positioned absolutely so it doesn't widen the button */\n position: absolute;\n top: -5px;\n right: -5px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: 8px;\n background: #f59e0b;\n color: #0f172a;\n font-size: 10px;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n border: 1.5px solid rgba(9, 14, 28, 0.97);\n}\n\n/* ─── Annotation pins (persistent numbered markers) ─────────────── */\n\n.clickly-pin {\n position: fixed;\n width: 24px;\n height: 24px;\n border-radius: 999px;\n background: #10b981;\n color: #fff;\n font: 700 11px/24px -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: center;\n cursor: pointer;\n pointer-events: auto;\n user-select: none;\n box-shadow: 0 2px 8px rgba(16,185,129,0.4), 0 0 0 2px #fff;\n z-index: 10;\n transition: transform 120ms cubic-bezier(0.34,1.56,0.64,1), box-shadow 120ms ease;\n}\n.clickly-pin:hover {\n transform: scale(1.18);\n box-shadow: 0 4px 16px rgba(16,185,129,0.5), 0 0 0 2px #fff;\n}\n.clickly-pin-num { display: block; }\n\n/* ─── Pin hover preview (dark tooltip) ───────────────────────── */\n\n.pin-preview {\n position: absolute;\n right: calc(100% + 10px);\n top: 50%;\n transform: translateY(-50%);\n width: 220px;\n padding: 8px 10px;\n background: rgba(9, 14, 28, 0.96);\n color: #f1f5f9;\n border-radius: 10px;\n box-shadow: 0 8px 24px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.07) inset;\n font: 12px/1.45 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n pointer-events: none;\n z-index: 11;\n animation: clickly-fade-in 100ms ease-out;\n white-space: normal;\n}\n\n.pin-preview-meta {\n font-size: 10.5px;\n color: #64748b;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n margin-bottom: 4px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.pin-preview-comment {\n font-size: 12px;\n color: #e2e8f0;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* ─── Pin edit popup — same white card as .clickly-popup ────── */\n\n.pin-edit {\n /* Positioning: floats to the LEFT of the pin */\n position: absolute;\n right: calc(100% + 12px);\n top: 50%;\n transform: translateY(-50%);\n /* Appearance: identical to .clickly-popup */\n width: 300px;\n padding: 12px;\n background: #fff;\n color: #0f172a;\n border-radius: 10px;\n box-shadow: 0 12px 32px rgba(2,6,23,0.18), 0 0 0 1px rgba(15,23,42,0.06);\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n text-align: left;\n cursor: default;\n z-index: 11;\n animation: clickly-fade-in 120ms cubic-bezier(0.16,1,0.3,1);\n /* Allow inner popup-styles to scroll */\n max-height: 80vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n/* Reuse .clickly-popup textarea inside pin-edit */\n.pin-edit textarea {\n width: 100%;\n min-height: 64px;\n max-height: 120px;\n padding: 8px;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n resize: vertical;\n font: inherit;\n color: inherit;\n background: #fff;\n box-sizing: border-box;\n}\n.pin-edit textarea:focus {\n outline: none;\n border-color: #0ea5e9;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n\n/* Actions row */\n.pin-edit-actions {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 10px;\n}\n\n.pin-edit-delete {\n display: grid;\n place-items: center;\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n background: transparent;\n border: 1px solid #fee2e2;\n border-radius: 6px;\n color: #ef4444;\n cursor: pointer;\n padding: 0;\n transition: background 100ms, border-color 100ms;\n}\n.pin-edit-delete:hover { background: #fef2f2; border-color: #fca5a5; }\n.pin-edit-delete svg { width: 13px; height: 13px; }\n\n/* ─── Annotation list ───────────────────────────────────────────── */\n\n.clickly-list {\n position: fixed;\n width: 320px;\n max-height: 55vh;\n background: #fff;\n border-radius: 14px;\n box-shadow: 0 16px 48px rgba(2,6,23,0.20), 0 0 0 1px rgba(15,23,42,0.07);\n color: #0f172a;\n font: 13px/1.5 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n pointer-events: auto;\n z-index: 2;\n animation: clickly-fade-in 150ms cubic-bezier(0.16, 1, 0.3, 1);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.list-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px 10px;\n border-bottom: 1px solid #f1f5f9;\n flex-shrink: 0;\n}\n\n.list-title {\n font-size: 13px;\n font-weight: 600;\n color: #0f172a;\n letter-spacing: -0.01em;\n flex: 1;\n}\n\n.list-count {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n background: #f1f5f9;\n color: #475569;\n font-size: 11px;\n font-weight: 600;\n border-radius: 10px;\n display: grid;\n place-items: center;\n}\n\n.list-items {\n overflow-y: auto;\n overscroll-behavior: contain;\n flex: 1;\n}\n\n.list-empty {\n padding: 24px;\n text-align: center;\n color: #94a3b8;\n font-size: 12px;\n}\n\n/* ─── Annotation card ──────────────────────────────────────── */\n\n.list-card {\n padding: 10px 12px;\n border-bottom: 1px solid #f8fafc;\n transition: background 80ms ease;\n}\n.list-card:last-child { border-bottom: none; }\n.list-card:hover { background: #fafafa; }\n\n.list-card-header {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 4px;\n}\n\n.list-card-num {\n font-size: 11px;\n font-weight: 700;\n color: #94a3b8;\n flex-shrink: 0;\n min-width: 20px;\n}\n\n.list-card-path {\n flex: 1;\n min-width: 0;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 10.5px;\n color: #475569;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.list-card-actions {\n display: flex;\n gap: 3px;\n flex-shrink: 0;\n}\n\n.list-action-btn {\n display: grid;\n place-items: center;\n width: 24px;\n height: 24px;\n background: transparent;\n border: none;\n border-radius: 6px;\n color: #94a3b8;\n cursor: pointer;\n padding: 0;\n transition: background 80ms ease, color 80ms ease;\n}\n.list-action-btn svg { width: 12px; height: 12px; }\n.list-action-btn:hover { background: #f1f5f9; color: #475569; }\n.list-action-btn.copied { color: #10b981; }\n.list-action-btn.list-action-delete:hover { background: #fef2f2; color: #ef4444; }\n\n.list-card-comment {\n font-size: 12px;\n color: #1e293b;\n line-height: 1.45;\n margin: 0 0 6px;\n word-break: break-word;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* CSS changes badge */\n.list-card-css {\n background: rgba(124, 58, 237, 0.05);\n border: 1px solid rgba(124, 58, 237, 0.12);\n border-radius: 6px;\n padding: 5px 8px;\n margin-top: 4px;\n}\n\n.list-card-css-label {\n display: block;\n font-size: 10px;\n font-weight: 600;\n color: #7c3aed;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n margin-bottom: 3px;\n}\n\n.list-card-css-code {\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n font-size: 10px;\n color: #475569;\n line-height: 1.5;\n margin: 0;\n white-space: pre-wrap;\n word-break: break-all;\n max-height: 60px;\n overflow: hidden;\n}\n\n/* ─── MCP settings section ──────────────────────────────────────────── */\n\n.settings-input {\n flex: 1;\n min-width: 0;\n padding: 6px 9px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n font: inherit;\n font-size: 12px;\n font-family: ui-monospace, \"SF Mono\", Menlo, monospace;\n color: #1e293b;\n outline: none;\n transition: border-color 100ms ease;\n}\n.settings-input:focus { border-color: #0ea5e9; }\n.settings-input:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.settings-mcp-status {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 10px;\n padding: 8px 10px;\n background: #f8fafc;\n border: 1px solid #e2e8f0;\n border-radius: 6px;\n font-size: 12px;\n color: #475569;\n flex-wrap: wrap;\n}\n.mcp-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #94a3b8;\n flex-shrink: 0;\n box-shadow: 0 0 0 3px rgba(148, 163, 184, 0.18);\n}\n.settings-mcp-status.is-off .mcp-dot {\n background: #94a3b8;\n box-shadow: 0 0 0 3px rgba(148, 163, 184, 0.15);\n}\n.settings-mcp-status.is-connecting .mcp-dot {\n background: #f59e0b;\n box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.20);\n animation: mcp-dot-pulse 1.2s ease-in-out infinite;\n}\n.settings-mcp-status.is-connected .mcp-dot {\n background: #10b981;\n box-shadow: 0 0 0 3px rgba(16, 185, 129, 0.25);\n}\n.settings-mcp-status.is-error .mcp-dot {\n background: #ef4444;\n box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.22);\n}\n@keyframes mcp-dot-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.45; }\n}\n.mcp-status-label {\n font-weight: 600;\n color: #1e293b;\n}\n.mcp-status-detail {\n color: #64748b;\n font-size: 11.5px;\n flex: 1 1 100%;\n margin-left: 16px;\n word-break: break-word;\n}\n.mcp-status-error { color: #b91c1c; }\n\n.settings-mcp-session {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 8px;\n padding: 6px 10px;\n background: rgba(14, 165, 233, 0.06);\n border: 1px dashed rgba(14, 165, 233, 0.32);\n border-radius: 6px;\n}\n.mcp-session-id {\n flex: 1;\n font: 11px/1.2 ui-monospace, \"SF Mono\", Menlo, monospace;\n color: #0c4a6e;\n background: transparent;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n}\n.mcp-session-reset {\n font: inherit;\n font-size: 11px;\n font-weight: 600;\n background: transparent;\n border: 1px solid rgba(14, 165, 233, 0.32);\n color: #0284c7;\n padding: 2px 8px;\n border-radius: 4px;\n cursor: pointer;\n transition: background 100ms ease;\n}\n.mcp-session-reset:hover { background: rgba(14, 165, 233, 0.10); }\n\n/* Dark-mode overrides for the MCP section */\n:host([data-clickly-theme=\"dark\"]) .settings-input {\n background: #1e293b;\n color: #f1f5f9;\n border-color: rgba(255, 255, 255, 0.10);\n}\n:host([data-clickly-theme=\"dark\"]) .settings-input:focus {\n border-color: #38bdf8;\n}\n:host([data-clickly-theme=\"dark\"]) .settings-mcp-status {\n background: #1e293b;\n border-color: rgba(255, 255, 255, 0.10);\n color: #cbd5e1;\n}\n:host([data-clickly-theme=\"dark\"]) .mcp-status-label { color: #f1f5f9; }\n:host([data-clickly-theme=\"dark\"]) .mcp-status-detail { color: #94a3b8; }\n:host([data-clickly-theme=\"dark\"]) .mcp-status-error { color: #fca5a5; }\n:host([data-clickly-theme=\"dark\"]) .settings-mcp-session {\n background: rgba(14, 165, 233, 0.08);\n border-color: rgba(14, 165, 233, 0.40);\n}\n:host([data-clickly-theme=\"dark\"]) .mcp-session-id { color: #bae6fd; }\n\n/* ─── Dark mode ─────────────────────────────────────────────────────\n *\n * Driven by data-clickly-theme on the shadow host. ClicklyRoot sets it\n * to \"dark\" / \"light\" based on the Settings store (resolving \"system\"\n * via prefers-color-scheme + a media-query listener). Selectors inside\n * the shadow root reach the host via :host(...).\n *\n * The toolbar itself is dark in both themes (matches Agentation's dock-\n * style aesthetic). These rules override the *panel* surfaces: popups,\n * settings panel, annotation list cards, computed-styles list.\n */\n:host([data-clickly-theme=\"dark\"]) .clickly-popup,\n:host([data-clickly-theme=\"dark\"]) .clickly-popover,\n:host([data-clickly-theme=\"dark\"]) .pin-edit {\n background: #0f172a;\n color: #e2e8f0;\n box-shadow:\n 0 16px 40px rgba(0, 0, 0, 0.55),\n 0 0 0 1px rgba(255, 255, 255, 0.08) inset;\n}\n:host([data-clickly-theme=\"dark\"]) .pin-edit .popup-header:hover {\n background: rgba(255, 255, 255, 0.04);\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup textarea,\n:host([data-clickly-theme=\"dark\"]) .clickly-popover textarea,\n:host([data-clickly-theme=\"dark\"]) .pin-edit textarea {\n background: #1e293b;\n color: #f1f5f9;\n border-color: rgba(255, 255, 255, 0.10);\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup textarea::placeholder,\n:host([data-clickly-theme=\"dark\"]) .pin-edit textarea::placeholder {\n color: #64748b;\n}\n\n/* Computed-styles panel — was white in light mode; needs full dark\n treatment so it doesn't blowtorch into the popup body. */\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .popup-styles,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .popup-styles {\n background: #0b1220;\n border-color: rgba(255, 255, 255, 0.08);\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .popup-header,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .popup-header {\n color: #cbd5e1;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .popup-header:hover,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .popup-header:hover {\n background: rgba(255, 255, 255, 0.04);\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .popup-chevron,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .popup-chevron {\n color: #94a3b8;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .popup-label,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .popup-label {\n color: #94a3b8;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .style-key,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .style-key {\n /* Brighter purple for syntax-highlight feel on dark bg. */\n color: #c4b5fd;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .style-val,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .style-val {\n color: #e2e8f0;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .style-val-input,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .style-val-input {\n color: #e2e8f0;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .style-val-input:focus {\n border-bottom-color: #38bdf8;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .style-row--changed,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .style-row--changed {\n background: rgba(251, 191, 36, 0.14);\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .style-revert-btn,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .style-revert-btn {\n color: #94a3b8;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .style-revert-btn:hover,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .style-revert-btn:hover {\n background: rgba(255, 255, 255, 0.06);\n color: #f8fafc;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .popup-edit-toggle {\n color: #94a3b8;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .popup-edit-toggle:hover {\n background: rgba(255, 255, 255, 0.06);\n color: #e2e8f0;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .popup-edit-toggle.is-editing {\n background: rgba(14, 165, 233, 0.18);\n color: #38bdf8;\n}\n:host([data-clickly-theme=\"dark\"]) .clickly-popup .style-hint,\n:host([data-clickly-theme=\"dark\"]) .pin-edit .style-hint {\n color: #64748b;\n}\n\n/* Settings panel */\n:host([data-clickly-theme=\"dark\"]) .clickly-settings {\n background: #0f172a;\n color: #e2e8f0;\n box-shadow:\n 0 16px 40px rgba(0, 0, 0, 0.55),\n 0 0 0 1px rgba(255, 255, 255, 0.08) inset;\n}\n:host([data-clickly-theme=\"dark\"]) .settings-title,\n:host([data-clickly-theme=\"dark\"]) .settings-label,\n:host([data-clickly-theme=\"dark\"]) .settings-row-label { color: #e2e8f0; }\n:host([data-clickly-theme=\"dark\"]) .settings-hint { color: #94a3b8; }\n:host([data-clickly-theme=\"dark\"]) .settings-close {\n background: rgba(255, 255, 255, 0.06);\n color: #cbd5e1;\n}\n:host([data-clickly-theme=\"dark\"]) .settings-close:hover {\n background: rgba(255, 255, 255, 0.12);\n color: #f8fafc;\n}\n:host([data-clickly-theme=\"dark\"]) .settings-select,\n:host([data-clickly-theme=\"dark\"]) .settings-color-wrap {\n background: #1e293b;\n color: #f1f5f9;\n border-color: rgba(255, 255, 255, 0.10);\n}\n:host([data-clickly-theme=\"dark\"]) .settings-divider {\n border-top-color: rgba(255, 255, 255, 0.08);\n}\n\n/* Annotation list */\n:host([data-clickly-theme=\"dark\"]) .clickly-list {\n background: #0f172a;\n color: #e2e8f0;\n box-shadow:\n 0 16px 40px rgba(0, 0, 0, 0.55),\n 0 0 0 1px rgba(255, 255, 255, 0.08) inset;\n}\n:host([data-clickly-theme=\"dark\"]) .list-title,\n:host([data-clickly-theme=\"dark\"]) .list-card-title,\n:host([data-clickly-theme=\"dark\"]) .list-card-comment { color: #e2e8f0; }\n:host([data-clickly-theme=\"dark\"]) .list-count,\n:host([data-clickly-theme=\"dark\"]) .list-empty,\n:host([data-clickly-theme=\"dark\"]) .list-card-num,\n:host([data-clickly-theme=\"dark\"]) .list-card-path { color: #94a3b8; }\n:host([data-clickly-theme=\"dark\"]) .list-card {\n background: rgba(255, 255, 255, 0.03);\n border-color: rgba(255, 255, 255, 0.06);\n}\n:host([data-clickly-theme=\"dark\"]) .list-card:hover {\n background: rgba(255, 255, 255, 0.06);\n}\n:host([data-clickly-theme=\"dark\"]) .list-card-css-label { color: #94a3b8; }\n:host([data-clickly-theme=\"dark\"]) .list-card-css-code { color: #cbd5e1; }\n:host([data-clickly-theme=\"dark\"]) .list-card-footer {\n border-top-color: rgba(255, 255, 255, 0.08);\n}\n\n/* Pin-edit inputs/rows */\n:host([data-clickly-theme=\"dark\"]) .pin-edit .row .ghost {\n color: #94a3b8;\n border-color: rgba(255, 255, 255, 0.10);\n}\n:host([data-clickly-theme=\"dark\"]) .pin-edit .row .ghost:hover {\n background: rgba(255, 255, 255, 0.06);\n}\n\n/* Generic borders left as #e2e8f0 in light mode get washed-out treatment */\n:host([data-clickly-theme=\"dark\"]) .clickly-popup *[style*=\"border-color\"],\n:host([data-clickly-theme=\"dark\"]) .clickly-list *[style*=\"border-color\"] {\n border-color: rgba(255, 255, 255, 0.10) !important;\n}\n\n/* ─── Layout Mode palette ───────────────────────────────────────────── */\n\n.clickly-palette {\n position: fixed;\n top: 16px;\n left: 16px;\n width: 200px;\n max-height: calc(100vh - 32px);\n display: flex;\n flex-direction: column;\n background: rgba(9, 14, 28, 0.97);\n color: #f8fafc;\n border-radius: 12px;\n font: 12px/1.3 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n box-shadow:\n 0 16px 40px rgba(0,0,0,0.45),\n 0 0 0 1px rgba(255,255,255,0.08) inset;\n pointer-events: auto;\n user-select: none;\n z-index: 2;\n animation: clickly-palette-open 240ms cubic-bezier(0.34, 1.56, 0.64, 1) both;\n}\n@keyframes clickly-palette-open {\n from { opacity: 0; transform: translateX(-12px); }\n to { opacity: 1; transform: translateX(0); }\n}\n\n.clickly-palette-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px 8px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n}\n.clickly-palette-title {\n font-weight: 600;\n font-size: 12px;\n letter-spacing: 0.02em;\n color: #f8fafc;\n}\n.clickly-palette-wireframe-btn {\n font: inherit;\n font-size: 11px;\n background: rgba(255,255,255,0.05);\n color: #cbd5e1;\n border: 1px solid rgba(255,255,255,0.10);\n border-radius: 6px;\n padding: 3px 7px;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease;\n}\n.clickly-palette-wireframe-btn:hover { background: rgba(255,255,255,0.10); color: #f8fafc; }\n.clickly-palette-wireframe-btn.is-on {\n background: #0ea5e9;\n color: #f8fafc;\n border-color: #0ea5e9;\n}\n\n.clickly-palette-scroll {\n overflow-y: auto;\n padding: 6px 8px 10px;\n scrollbar-width: thin;\n scrollbar-color: rgba(255,255,255,0.15) transparent;\n}\n.clickly-palette-scroll::-webkit-scrollbar { width: 6px; }\n.clickly-palette-scroll::-webkit-scrollbar-thumb {\n background: rgba(255,255,255,0.15);\n border-radius: 3px;\n}\n\n.clickly-palette-section { margin-top: 6px; }\n.clickly-palette-section:first-child { margin-top: 0; }\n\n.clickly-palette-section-header {\n display: flex;\n align-items: center;\n width: 100%;\n gap: 6px;\n padding: 4px 4px;\n background: transparent;\n border: none;\n color: #94a3b8;\n font: inherit;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n cursor: pointer;\n border-radius: 4px;\n}\n.clickly-palette-section-header:hover { background: rgba(255,255,255,0.04); color: #cbd5e1; }\n.clickly-palette-chevron {\n display: inline-block;\n width: 10px;\n font-size: 10px;\n color: #64748b;\n}\n.clickly-palette-count {\n margin-left: auto;\n font-weight: 400;\n color: #64748b;\n}\n\n.clickly-palette-grid {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 4px;\n padding: 4px 0 6px;\n}\n\n.clickly-palette-tile {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n height: 56px;\n padding: 6px 4px;\n background: rgba(255,255,255,0.03);\n color: #e2e8f0;\n border: 1px solid rgba(255,255,255,0.08);\n border-radius: 8px;\n cursor: grab;\n font: inherit;\n transition:\n background 120ms ease,\n border-color 120ms ease,\n transform 80ms ease;\n}\n.clickly-palette-tile:hover {\n background: rgba(255,255,255,0.07);\n border-color: rgba(255,255,255,0.18);\n color: #f8fafc;\n}\n.clickly-palette-tile:active {\n cursor: grabbing;\n background: rgba(14,165,233,0.18);\n border-color: #0ea5e9;\n transform: scale(0.96);\n}\n.clickly-palette-tile-glyph {\n font-size: 18px;\n line-height: 1;\n color: #94a3b8;\n}\n.clickly-palette-tile:hover .clickly-palette-tile-glyph,\n.clickly-palette-tile:active .clickly-palette-tile-glyph { color: #f8fafc; }\n.clickly-palette-tile-label {\n font-size: 10.5px;\n text-align: center;\n color: inherit;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n\n/* ─── Layout Mode ghost (drag preview) ──────────────────────────────── */\n\n.clickly-ghost {\n /* position/dimensions are set inline by LayoutGhost */\n z-index: 3;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: flex-start;\n gap: 4px;\n padding: 8px 10px;\n background: rgba(14,165,233,0.10);\n border: 2px dashed #0ea5e9;\n border-radius: 10px;\n color: #f8fafc;\n font: 11px/1.2 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n box-shadow: 0 12px 32px rgba(14,165,233,0.18);\n /* pointer-events: none is also set inline as a belt-and-suspenders */\n}\n.clickly-ghost-label {\n font-weight: 600;\n font-size: 12px;\n color: #0ea5e9;\n letter-spacing: 0.01em;\n}\n.clickly-ghost-size {\n font-size: 10px;\n color: #94a3b8;\n letter-spacing: 0.02em;\n}\n\n/* ─── Layout Mode drop-comment bubble ───────────────────────────────── */\n\n.clickly-drop-bubble {\n z-index: 4;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 6px 6px 10px;\n min-width: 280px;\n max-width: 420px;\n background: rgba(9, 14, 28, 0.97);\n color: #f8fafc;\n border-radius: 10px;\n box-shadow:\n 0 16px 40px rgba(0,0,0,0.45),\n 0 0 0 1px rgba(255,255,255,0.10) inset;\n pointer-events: auto;\n user-select: none;\n font: 13px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n animation: clickly-drop-bubble-open 200ms cubic-bezier(0.34, 1.56, 0.64, 1) both;\n}\n@keyframes clickly-drop-bubble-open {\n from { opacity: 0; transform: scale(0.85); }\n to { opacity: 1; transform: scale(1); }\n}\n.clickly-drop-bubble-chip {\n font-size: 11px;\n font-weight: 600;\n color: #0ea5e9;\n background: rgba(14,165,233,0.12);\n padding: 3px 7px;\n border-radius: 6px;\n white-space: nowrap;\n}\n.clickly-drop-bubble-input {\n flex: 1 1 auto;\n min-width: 0;\n background: transparent;\n border: none;\n color: #f8fafc;\n font: inherit;\n outline: none;\n padding: 4px 0;\n}\n.clickly-drop-bubble-input::placeholder { color: #64748b; }\n.clickly-drop-bubble-cancel,\n.clickly-drop-bubble-commit {\n font: inherit;\n border: none;\n cursor: pointer;\n border-radius: 6px;\n padding: 6px 8px;\n background: transparent;\n color: #94a3b8;\n transition: background 120ms ease, color 120ms ease;\n}\n.clickly-drop-bubble-cancel:hover { background: rgba(255,255,255,0.07); color: #f8fafc; }\n.clickly-drop-bubble-commit {\n background: #0ea5e9;\n color: #f8fafc;\n padding: 6px 12px;\n font-weight: 600;\n font-size: 12px;\n}\n.clickly-drop-bubble-commit:hover { background: #0284c7; }\n\n/* ─── Layout Mode rearrange overlay (section outlines) ──────────────── */\n\n.clickly-rearrange-layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 2;\n}\n\n.clickly-rearrange-outline {\n /* Position/size from inline style (RearrangeOverlay sets per-rect). */\n border: 1.5px dashed rgba(14,165,233,0.55);\n border-radius: 6px;\n background: rgba(14,165,233,0.04);\n transition: border-color 100ms ease, background 100ms ease;\n}\n.clickly-rearrange-outline.is-hover {\n border-color: #0ea5e9;\n background: rgba(14,165,233,0.10);\n box-shadow: 0 0 0 2px rgba(14,165,233,0.18) inset;\n}\n\n.clickly-rearrange-label {\n position: absolute;\n top: -22px;\n left: 0;\n padding: 2px 6px;\n background: #0ea5e9;\n color: #f8fafc;\n font: 600 10.5px/1 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 4px;\n letter-spacing: 0.02em;\n white-space: nowrap;\n}\n\n/* ─── Layout Mode wireframe surface (M7) ────────────────────────────── */\n\n.clickly-wireframe-fade {\n /* Position / opacity / pointer-events / z-index set inline. */\n transition: opacity 120ms ease;\n}\n\n.clickly-wireframe-controls {\n position: fixed;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n width: min(520px, calc(100vw - 32px));\n z-index: 5; /* above everything else in the Layout Mode stack */\n display: flex;\n flex-direction: column;\n gap: 8px;\n padding: 10px 12px;\n background: rgba(9, 14, 28, 0.97);\n color: #f8fafc;\n border-radius: 12px;\n box-shadow:\n 0 16px 40px rgba(0,0,0,0.45),\n 0 0 0 1px rgba(255,255,255,0.10) inset;\n pointer-events: auto;\n font: 12px/1.3 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n animation: clickly-wireframe-open 200ms cubic-bezier(0.34, 1.56, 0.64, 1) both;\n}\n@keyframes clickly-wireframe-open {\n from { opacity: 0; transform: translate(-50%, -8px); }\n to { opacity: 1; transform: translate(-50%, 0); }\n}\n\n.clickly-wireframe-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.clickly-wireframe-label {\n display: flex;\n align-items: center;\n gap: 8px;\n flex: 1 1 auto;\n font-weight: 600;\n font-size: 11px;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n color: #94a3b8;\n}\n.clickly-wireframe-slider {\n flex: 1 1 auto;\n appearance: none;\n height: 4px;\n background: rgba(255,255,255,0.10);\n border-radius: 2px;\n outline: none;\n cursor: pointer;\n}\n.clickly-wireframe-slider::-webkit-slider-thumb {\n appearance: none;\n width: 14px;\n height: 14px;\n background: #0ea5e9;\n border-radius: 50%;\n cursor: grab;\n border: none;\n box-shadow: 0 0 0 3px rgba(14,165,233,0.18);\n}\n.clickly-wireframe-slider::-moz-range-thumb {\n width: 14px;\n height: 14px;\n background: #0ea5e9;\n border-radius: 50%;\n border: none;\n cursor: grab;\n}\n.clickly-wireframe-value {\n min-width: 36px;\n text-align: right;\n font-variant-numeric: tabular-nums;\n font-weight: 600;\n font-size: 11px;\n color: #f8fafc;\n}\n.clickly-wireframe-exit {\n font: inherit;\n font-size: 11px;\n font-weight: 600;\n background: rgba(255,255,255,0.05);\n color: #cbd5e1;\n border: 1px solid rgba(255,255,255,0.10);\n border-radius: 6px;\n padding: 4px 10px;\n cursor: pointer;\n transition: background 120ms ease, color 120ms ease;\n}\n.clickly-wireframe-exit:hover { background: rgba(255,255,255,0.10); color: #f8fafc; }\n\n.clickly-wireframe-purpose {\n background: rgba(255,255,255,0.04);\n color: #f8fafc;\n border: 1px solid rgba(255,255,255,0.10);\n border-radius: 8px;\n padding: 8px 10px;\n font: inherit;\n font-size: 12px;\n resize: vertical;\n min-height: 44px;\n outline: none;\n transition: border-color 120ms ease, background 120ms ease;\n}\n.clickly-wireframe-purpose:focus {\n border-color: #0ea5e9;\n background: rgba(14,165,233,0.06);\n}\n.clickly-wireframe-purpose::placeholder { color: #64748b; }\n\n/* ─── Layout Mode preview templates (M11) ───────────────────────────── */\n\n/* All previews share the same base — fills its container, light/translucent\n block styling consistent with the dashed ghost border. Each child uses\n percentage-based sizing so the sketch stretches with the box.\n\n Color tokens:\n ink-soft: rgba(15,23,42,0.45) (lines, mid-strength)\n ink-min: rgba(15,23,42,0.25) (subtle separators)\n ink-bold: rgba(15,23,42,0.65) (caps, dots, accents)\n accent: #0ea5e9 (CTA/active highlights)\n*/\n\n.clickly-pv {\n width: 100%;\n height: 100%;\n display: flex;\n box-sizing: border-box;\n color: rgba(15,23,42,0.55);\n}\n\n/* Atoms reused across templates */\n.clickly-pv .pv-line {\n height: 4px;\n background: rgba(15,23,42,0.30);\n border-radius: 2px;\n flex-shrink: 0;\n}\n.clickly-pv .pv-cap {\n height: 6px;\n width: 32%;\n background: rgba(15,23,42,0.55);\n border-radius: 3px;\n flex-shrink: 0;\n}\n.clickly-pv .pv-h1 {\n height: 10px;\n width: 65%;\n background: rgba(15,23,42,0.70);\n border-radius: 3px;\n}\n.clickly-pv .pv-dot {\n width: 12px;\n height: 12px;\n border-radius: 50%;\n background: rgba(15,23,42,0.45);\n flex-shrink: 0;\n}\n.clickly-pv .pv-cta {\n height: 22px;\n min-width: 56px;\n border-radius: 6px;\n background: linear-gradient(180deg, #38bdf8, #0ea5e9);\n flex-shrink: 0;\n box-shadow: 0 1px 0 rgba(255,255,255,0.30) inset;\n}\n.clickly-pv .pv-logo {\n width: 36px;\n height: 18px;\n background: rgba(15,23,42,0.60);\n border-radius: 4px;\n flex-shrink: 0;\n}\n.clickly-pv .pv-chev {\n width: 0;\n height: 0;\n border: 4px solid transparent;\n border-top-color: rgba(15,23,42,0.55);\n margin-top: 4px;\n flex-shrink: 0;\n}\n.clickly-pv .pv-x {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n background: rgba(15,23,42,0.30);\n flex-shrink: 0;\n position: relative;\n}\n\n/* Bar with items (Navigation, Banner) */\n.clickly-pv-bar {\n align-items: center;\n padding: 0 14px;\n gap: 14px;\n}\n.clickly-pv-bar.is-dense { padding: 0 10px; gap: 8px; }\n.clickly-pv-bar .pv-bar-items {\n display: flex;\n gap: 14px;\n flex: 1 1 auto;\n}\n.clickly-pv-bar .pv-bar-item {\n width: 32px;\n height: 4px;\n background: rgba(15,23,42,0.30);\n border-radius: 2px;\n}\n\n/* Headed area (Header, Hero, CTA, Toast) */\n.clickly-pv-head {\n flex-direction: column;\n justify-content: center;\n gap: 8px;\n padding: 18px 22px;\n}\n.clickly-pv-head.is-dense { padding: 10px 14px; gap: 6px; }\n.clickly-pv-head.is-centered { align-items: center; text-align: center; }\n.clickly-pv-head.is-centered .pv-h1 { width: 50%; }\n.clickly-pv-head.is-centered .pv-line { width: 60%; }\n.clickly-pv-head .pv-line { width: 80%; }\n\n/* Footer */\n.clickly-pv-footer {\n flex-direction: column;\n padding: 16px 20px;\n gap: 10px;\n background: rgba(15,23,42,0.04);\n}\n.clickly-pv-footer .pv-footer-cols {\n display: flex;\n gap: 16px;\n flex: 1;\n}\n.clickly-pv-footer .pv-footer-col {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.clickly-pv-footer .pv-rule {\n height: 1px;\n background: rgba(15,23,42,0.10);\n margin: 4px 0;\n}\n\n/* Toast */\n.clickly-pv-toast {\n align-items: center;\n padding: 0 12px;\n gap: 10px;\n}\n\n/* Card grids (FeatureGrid) */\n.clickly-pv-grid {\n display: grid;\n gap: 8px;\n padding: 10px;\n width: 100%;\n height: 100%;\n}\n.clickly-pv-grid .pv-grid-card {\n background: rgba(15,23,42,0.05);\n border-radius: 6px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* PricingTable */\n.clickly-pv-pricing {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 8px;\n padding: 10px;\n width: 100%;\n}\n.clickly-pv-pricing .pv-pricing-col {\n background: rgba(15,23,42,0.05);\n border-radius: 6px;\n padding: 10px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.clickly-pv-pricing .pv-pricing-col.is-featured {\n background: rgba(14,165,233,0.15);\n outline: 1px solid rgba(14,165,233,0.4);\n}\n.clickly-pv-pricing .pv-price {\n height: 18px;\n width: 50%;\n background: rgba(15,23,42,0.65);\n border-radius: 3px;\n}\n\n/* Logos row */\n.clickly-pv-logos {\n align-items: center;\n justify-content: space-around;\n padding: 0 16px;\n}\n.clickly-pv-logos .pv-logo-tile {\n width: 14%;\n height: 32px;\n background: rgba(15,23,42,0.15);\n border-radius: 4px;\n}\n\n/* Dashboard */\n.clickly-pv-dashboard {\n flex-direction: column;\n padding: 10px;\n gap: 8px;\n}\n.clickly-pv-dashboard .pv-dash-top {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.clickly-pv-dashboard .pv-dash-stats {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr;\n gap: 8px;\n}\n.clickly-pv-dashboard .pv-stat {\n background: rgba(15,23,42,0.06);\n border-radius: 6px;\n padding: 8px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.clickly-pv-dashboard .pv-dash-chart {\n flex: 1;\n background: rgba(15,23,42,0.04);\n border-radius: 6px;\n padding: 10px;\n display: flex;\n align-items: flex-end;\n gap: 6px;\n}\n.clickly-pv .pv-bar {\n flex: 1;\n background: linear-gradient(180deg, #38bdf8, #0ea5e9);\n border-radius: 2px;\n min-height: 8px;\n}\n\n/* FAQ */\n.clickly-pv-faq {\n flex-direction: column;\n gap: 0;\n padding: 8px 0;\n}\n.clickly-pv-faq .pv-faq-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n border-bottom: 1px solid rgba(15,23,42,0.08);\n}\n.clickly-pv-faq .pv-faq-row:last-child { border-bottom: none; }\n\n/* Media (Image, Video) */\n.clickly-pv-media {\n background: rgba(15,23,42,0.08);\n align-items: center;\n justify-content: center;\n position: relative;\n overflow: hidden;\n}\n.clickly-pv-media .pv-mountain {\n position: absolute;\n bottom: 10%;\n left: 10%;\n right: 10%;\n height: 60%;\n background:\n linear-gradient(135deg, transparent 50%, rgba(15,23,42,0.30) 50%) 0 100% / 60% 100% no-repeat,\n linear-gradient(225deg, transparent 50%, rgba(15,23,42,0.20) 50%) 100% 100% / 60% 100% no-repeat;\n}\n.clickly-pv-media.is-image::before {\n content: \"\";\n position: absolute;\n top: 18%;\n right: 22%;\n width: 18px;\n height: 18px;\n border-radius: 50%;\n background: rgba(15,23,42,0.30);\n}\n.clickly-pv-media .pv-play {\n width: 0;\n height: 0;\n border-style: solid;\n border-width: 14px 0 14px 22px;\n border-color: transparent transparent transparent rgba(15,23,42,0.55);\n margin-left: 4px;\n}\n\n/* Card / MediaCard */\n.clickly-pv-card {\n flex-direction: column;\n background: rgba(15,23,42,0.04);\n}\n.clickly-pv-card .pv-card-media {\n flex: 1.4;\n background: rgba(15,23,42,0.12);\n}\n.clickly-pv-card .pv-card-body {\n padding: 10px 12px;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n/* Container — just an empty dashed box, no inner content */\n.clickly-pv-container {\n background:\n repeating-linear-gradient(\n 45deg,\n rgba(15,23,42,0.04),\n rgba(15,23,42,0.04) 6px,\n transparent 6px,\n transparent 12px\n );\n}\n\n/* Modal */\n.clickly-pv-modal {\n flex-direction: column;\n background: rgba(15,23,42,0.04);\n padding: 12px;\n gap: 8px;\n}\n.clickly-pv-modal .pv-modal-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.clickly-pv-modal .pv-modal-body {\n display: flex;\n flex-direction: column;\n gap: 4px;\n flex: 1;\n}\n.clickly-pv-modal .pv-modal-foot {\n display: flex;\n justify-content: flex-end;\n}\n\n/* Lists */\n.clickly-pv-list {\n flex-direction: column;\n padding: 10px;\n gap: 0;\n}\n.clickly-pv-list .pv-cap { margin-bottom: 6px; }\n.clickly-pv-list .pv-list-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 4px;\n border-bottom: 1px solid rgba(15,23,42,0.06);\n}\n.clickly-pv-list .pv-list-row:last-child { border-bottom: none; }\n.clickly-pv-list.is-dense .pv-list-row { padding: 3px 4px; }\n\n/* Table */\n.clickly-pv-table {\n flex-direction: column;\n padding: 8px;\n gap: 4px;\n}\n.clickly-pv-table .pv-table-head {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr 1fr;\n gap: 8px;\n padding-bottom: 6px;\n border-bottom: 1px solid rgba(15,23,42,0.15);\n}\n.clickly-pv-table .pv-table-row {\n display: grid;\n grid-template-columns: 1fr 1fr 1fr 1fr;\n gap: 8px;\n padding: 4px 0;\n}\n\n/* Stat / Chart / Testimonial / Avatar */\n.clickly-pv-stat {\n flex-direction: column;\n padding: 14px;\n justify-content: space-between;\n}\n.clickly-pv-chart {\n align-items: flex-end;\n padding: 12px;\n gap: 6px;\n}\n.clickly-pv-testimonial {\n align-items: center;\n padding: 14px;\n gap: 14px;\n}\n.clickly-pv-testimonial .pv-avatar {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: rgba(15,23,42,0.25);\n flex-shrink: 0;\n}\n.clickly-pv-testimonial .pv-quote {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.clickly-pv-avatar {\n background: rgba(15,23,42,0.30);\n border-radius: 50%;\n}\n\n/* Forms */\n.clickly-pv-form {\n flex-direction: column;\n padding: 14px;\n gap: 8px;\n}\n.clickly-pv-form .pv-input {\n height: 24px;\n background: rgba(15,23,42,0.06);\n border: 1px solid rgba(15,23,42,0.18);\n border-radius: 4px;\n}\n.clickly-pv-form .pv-input-tall { height: 56px; }\n.clickly-pv-input-only {\n background: rgba(15,23,42,0.06);\n border: 1px solid rgba(15,23,42,0.20);\n border-radius: 4px;\n}\n.clickly-pv-select {\n background: rgba(15,23,42,0.06);\n border: 1px solid rgba(15,23,42,0.20);\n border-radius: 4px;\n align-items: center;\n padding: 0 8px;\n gap: 8px;\n}\n.clickly-pv-button {\n background: linear-gradient(180deg, #38bdf8, #0ea5e9);\n border-radius: 4px;\n align-items: center;\n justify-content: center;\n box-shadow: 0 1px 0 rgba(255,255,255,0.30) inset;\n}\n.clickly-pv-button .pv-line { background: rgba(255,255,255,0.85); }\n.clickly-pv-toggle {\n background: rgba(15,23,42,0.20);\n border-radius: 999px;\n padding: 2px;\n align-items: center;\n}\n.clickly-pv-toggle .pv-toggle-knob {\n width: 50%;\n height: 100%;\n background: #fff;\n border-radius: 50%;\n margin-left: auto;\n box-shadow: 0 1px 2px rgba(0,0,0,0.2);\n}\n\n/* Generic fallback */\n.clickly-pv-generic {\n align-items: center;\n justify-content: center;\n font-size: 11px;\n font-weight: 600;\n color: rgba(15,23,42,0.55);\n}\n\n/* ─── Ghost preview wrapper (updated) ───────────────────────────────── */\n\n/* Replace the older flat ghost label with a Figma-style external tag +\n inner structured preview. Keep .clickly-ghost as the outer dashed box\n (already defined earlier in this file). */\n.clickly-ghost {\n /* Background changes from cyan-tinted to nearly white so the dark\n preview content reads clearly. */\n background: rgba(255,255,255,0.92) !important;\n color: rgba(15,23,42,0.65);\n}\n.clickly-ghost-tag {\n position: absolute;\n top: -22px;\n left: 0;\n padding: 2px 8px;\n background: #0ea5e9;\n color: #f8fafc;\n font: 600 11px/1.2 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 4px;\n white-space: nowrap;\n letter-spacing: 0.02em;\n}\n.clickly-ghost-preview {\n position: absolute;\n inset: 0;\n display: flex;\n /* Inner padding so the preview content has breathing room from the\n dashed border. */\n padding: 0;\n}\n.clickly-ghost-preview > .clickly-pv {\n width: 100%;\n height: 100%;\n}\n\n/* Override the older size readout to bottom-right corner. */\n.clickly-ghost-size {\n position: absolute;\n bottom: -20px;\n right: 0;\n font-size: 10px;\n color: #64748b;\n letter-spacing: 0.02em;\n background: rgba(9,14,28,0.85);\n color: #cbd5e1;\n padding: 2px 6px;\n border-radius: 4px;\n}\n\n/* ─── Placed-components layer (M12-M13) ─────────────────────────────── */\n\n.clickly-placed-layer {\n /* Layer container — children are position:fixed so this layer can\n stay 0×0 in the flow. */\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 2;\n}\n\n.clickly-placed {\n pointer-events: auto;\n background: rgba(255,255,255,0.94);\n border: 1.5px dashed rgba(14,165,233,0.55);\n border-radius: 6px;\n box-sizing: border-box;\n box-shadow: 0 4px 12px rgba(14,165,233,0.10);\n transition: border-color 100ms ease, box-shadow 100ms ease;\n overflow: hidden;\n /* When unselected, click cursor signals \"tap to select\". */\n cursor: pointer;\n}\n.clickly-placed:hover {\n border-color: rgba(14,165,233,0.80);\n}\n.clickly-placed.is-selected {\n border: 1.5px solid #0ea5e9;\n box-shadow:\n 0 0 0 3px rgba(14,165,233,0.18),\n 0 8px 24px rgba(14,165,233,0.20);\n /* Selected body reads as a drag handle. Cursor flips to grabbing\n on :active so the user sees a clear state change mid-drag. */\n cursor: move;\n overflow: visible; /* let handles + delete button render outside */\n}\n.clickly-placed.is-selected:active { cursor: grabbing; }\n\n.clickly-placed-tag {\n position: absolute;\n top: -22px;\n left: 0;\n padding: 2px 8px;\n background: #0ea5e9;\n color: #f8fafc;\n font: 600 11px/1.2 -apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif;\n border-radius: 4px;\n white-space: nowrap;\n letter-spacing: 0.02em;\n pointer-events: none;\n}\n\n.clickly-placed-preview {\n position: absolute;\n inset: 0;\n pointer-events: none; /* clicks fall through to the .clickly-placed wrapper */\n}\n.clickly-placed-preview > .clickly-pv {\n width: 100%;\n height: 100%;\n}\n\n/* Corner resize handles — only visible when selected. */\n.clickly-placed-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n background: #0ea5e9;\n border: 2px solid #fff;\n border-radius: 2px;\n box-shadow: 0 1px 3px rgba(14,165,233,0.40);\n /* pointer-events: auto already inherited */\n}\n.clickly-placed-handle.is-nw { top: -6px; left: -6px; cursor: nwse-resize; }\n.clickly-placed-handle.is-ne { top: -6px; right: -6px; cursor: nesw-resize; }\n.clickly-placed-handle.is-sw { bottom: -6px; left: -6px; cursor: nesw-resize; }\n.clickly-placed-handle.is-se { bottom: -6px; right: -6px; cursor: nwse-resize; }\n\n/* Delete X — floating to the top-right outside the box. */\n.clickly-placed-delete {\n position: absolute;\n top: -22px;\n right: 0;\n width: 22px;\n height: 22px;\n display: grid;\n place-items: center;\n background: rgba(9,14,28,0.92);\n color: #f8fafc;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n font: 600 12px/1 -apple-system, BlinkMacSystemFont, system-ui, sans-serif;\n box-shadow: 0 4px 8px rgba(0,0,0,0.30);\n transition: background 100ms ease, transform 80ms ease;\n}\n.clickly-placed-delete:hover {\n background: #dc2626;\n transform: scale(1.08);\n}\n\n/* Done-editing checkmark — bottom-right outside the box. */\n.clickly-placed-deselect {\n position: absolute;\n bottom: -22px;\n right: 0;\n width: 22px;\n height: 22px;\n display: grid;\n place-items: center;\n background: #0ea5e9;\n color: #f8fafc;\n border: none;\n border-radius: 50%;\n cursor: pointer;\n font: 600 12px/1 -apple-system, BlinkMacSystemFont, system-ui, sans-serif;\n box-shadow: 0 4px 8px rgba(14,165,233,0.40);\n transition: background 100ms ease, transform 80ms ease;\n}\n.clickly-placed-deselect:hover {\n background: #0284c7;\n transform: scale(1.08);\n}\n`;\n","/**\n * CSS injected into `document.head` (NOT the shadow root). Targets the\n * host page body to:\n *\n * - disable text selection while we're inspecting/pressed/dragging\n * (otherwise the browser tries to select text mid-drag and the\n * marquee never starts)\n * - swap the cursor to crosshair in area mode for a clear UX cue\n *\n * Mounted by `Clickly.tsx`, torn down on unmount.\n */\nexport const GLOBAL_PAGE_CSS = `\nbody[data-clickly-active] {\n -webkit-user-select: none !important;\n user-select: none !important;\n}\nbody[data-clickly-active],\nbody[data-clickly-active] *:not(input):not(textarea):not(select) {\n cursor: crosshair !important;\n}\nbody[data-clickly-mode=\"multi\"],\nbody[data-clickly-mode=\"multi\"] *:not(input):not(textarea):not(select) {\n cursor: copy !important;\n}\n/* Restore normal cursor while the annotation popup is open so the user\n can comfortably type in the textarea + click the buttons. */\nbody[data-clickly-annotating] {\n cursor: default !important;\n}\n`;\n","import { useEffect, useState } from \"react\";\nimport { createRoot, type Root } from \"react-dom/client\";\nimport {\n Overlay,\n SelectionEngine,\n createShadowHost,\n type ShadowHost,\n} from \"@useclickly/core\";\nimport { ClicklyRoot } from \"./internal/ClicklyRoot\";\nimport { REACT_UI_CSS } from \"./internal/styles\";\nimport { GLOBAL_PAGE_CSS } from \"./internal/globalStyles\";\n\nexport interface ClicklyProps {\n /** Custom class on the host element (for z-index / positioning overrides). */\n className?: string;\n /** Optional MCP server endpoint, e.g. \"http://localhost:4747\". */\n endpoint?: string;\n /** Join an existing MCP session by ID. */\n sessionId?: string;\n\n /* Lifecycle callbacks (Phase 6+ will wire these to annotation events) */\n onAnnotationAdd?: (id: string) => void;\n onAnnotationDelete?: (id: string) => void;\n onAnnotationsClear?: () => void;\n onCopy?: (markdown: string) => void;\n onSessionCreated?: (sessionId: string) => void;\n}\n\ninterface Mount {\n shadow: ShadowHost;\n engine: SelectionEngine;\n overlay: Overlay;\n portal: HTMLDivElement;\n root: Root;\n}\n\n/**\n * Mount once near the root of your React app. Dev-only by convention:\n *\n * ```tsx\n * {process.env.NODE_ENV === \"development\" && <Clickly />}\n * ```\n *\n * Renders a small floating button (FAB) in the bottom-right corner.\n * Click it (or press `⌘/Ctrl+Shift+F`) to open the full toolbar.\n *\n * Implementation note: we create a *separate* React root inside the shadow\n * (via `createRoot(portal)`) rather than using `createPortal` from this\n * component. Reason: React's event delegation listens at the React root\n * container. With createPortal from the parent app tree, clicks bubbling\n * out of the shadow are retargeted to `<clickly-root>`, which has no React\n * fiber attached, so onClick handlers on toolbar buttons never fire. A\n * dedicated root inside the shadow keeps the entire dispatch path inside\n * the shadow boundary, which is what React's synthetic events need.\n */\nexport function Clickly({ className }: ClicklyProps = {}) {\n const [mount, setMount] = useState<Mount | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n\n let shadow: ShadowHost | null = null;\n let engine: SelectionEngine | null = null;\n let overlay: Overlay | null = null;\n let portal: HTMLDivElement | null = null;\n let root: Root | null = null;\n\n try {\n shadow = createShadowHost({ document });\n\n portal = document.createElement(\"div\");\n portal.setAttribute(\"data-clickly-react-root\", \"\");\n shadow.root.appendChild(portal);\n\n if (!shadow.root.querySelector(\"style[data-clickly-react]\")) {\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-clickly-react\", \"\");\n style.textContent = REACT_UI_CSS;\n shadow.root.appendChild(style);\n }\n\n // Document-level styles (cursor + text-select inhibitor) — these\n // can't live inside the shadow root because they target body.\n if (!document.head.querySelector(\"style[data-clickly-globals]\")) {\n const gstyle = document.createElement(\"style\");\n gstyle.setAttribute(\"data-clickly-globals\", \"\");\n gstyle.textContent = GLOBAL_PAGE_CSS;\n document.head.appendChild(gstyle);\n }\n\n engine = new SelectionEngine({ document, host: shadow.host });\n overlay = new Overlay({\n engine,\n root: shadow.root,\n document,\n excludeHost: shadow.host,\n });\n\n // Dedicated React root anchored INSIDE the shadow. React 18+\n // attaches event listeners to this container, so synthetic events\n // never cross the shadow boundary and don't suffer retargeting.\n root = createRoot(portal);\n root.render(<ClicklyRoot engine={engine} host={shadow.host} />);\n\n setMount({ shadow, engine, overlay, portal, root });\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn(\"[clickly] failed to mount\", err);\n root?.unmount();\n overlay?.destroy();\n engine?.destroy();\n portal?.remove();\n shadow?.destroy();\n }\n\n return () => {\n setMount(null);\n // Unmount the dedicated root BEFORE removing its container, so React\n // can run cleanup effects without seeing a detached DOM.\n root?.unmount();\n overlay?.destroy();\n engine?.destroy();\n portal?.remove();\n shadow?.destroy();\n document.head.querySelector(\"style[data-clickly-globals]\")?.remove();\n document.body.removeAttribute(\"data-clickly-active\");\n document.body.removeAttribute(\"data-clickly-mode\");\n };\n }, []);\n\n useEffect(() => {\n if (!mount || !className) return;\n mount.shadow.host.className = className;\n return () => {\n if (mount.shadow.host.isConnected) mount.shadow.host.className = \"\";\n };\n }, [mount, className]);\n\n // We render nothing into the parent React tree — the toolbar lives in\n // its own root inside the shadow. Returning null avoids the createPortal\n // event-delegation bug described above.\n return null;\n}\n"]}
|