edododraw 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"EdodoDraw-DGkcHuA6.js","sources":["../../src/engine/geometry.ts","../../src/engine/scene/anchors.ts","../../src/engine/scene/query.ts","../../src/engine/scene/palette.ts","../../src/engine/annotate/layer.ts","../../src/engine/annotate/interact.ts","../../src/engine/dsl/diagnostics.ts","../../src/engine/dsl/tokens.ts","../../src/engine/dsl/lexer.ts","../../src/engine/dsl/parser.ts","../../src/engine/dsl/patch.ts","../../src/engine/edit/controller.ts","../../src/engine/camera/fit.ts","../../src/engine/camera/easing.ts","../../src/engine/camera/controller.ts","../../src/engine/layout/dag.ts","../../src/engine/layout/grid.ts","../../src/engine/layout/radial.ts","../../src/engine/layout/index.ts","../../src/engine/scene/overrides.ts","../../src/engine/scene/defaults.ts","../../src/engine/dsl/ast.ts","../../src/engine/dsl/lower.ts","../../src/engine/dsl/compile.ts","../../src/engine/dsl/index.ts","../../src/engine/render/fontData.ts","../../src/engine/export.ts","../../src/engine/plugins/registry.ts","../../src/engine/render/shapes.ts","../../src/engine/plugins/builtins.ts","../../src/engine/render/edges.ts","../../src/engine/render/theme.css.ts","../../src/engine/render/svgRenderer.ts","../../src/engine/timeline/player.ts","../../src/engine/import/mermaid.ts","../../src/lib/EdodoDraw.ts"],"sourcesContent":["/**\n * Geometry primitives shared across the engine.\n * All engine coordinates are in \"world\" space (unbounded, y-down) unless a\n * function name says otherwise. The camera converts world <-> screen.\n */\n\nexport interface Point {\n x: number;\n y: number;\n}\n\nexport interface Size {\n w: number;\n h: number;\n}\n\n/** Axis-aligned rectangle by top-left corner + size. */\nexport interface Rect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** Axis-aligned bounding box by extents. */\nexport interface BBox {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport const clamp = (v: number, lo: number, hi: number): number =>\n v < lo ? lo : v > hi ? hi : v;\n\nexport const lerp = (a: number, b: number, t: number): number => a + (b - a) * t;\n\nexport const dist = (a: Point, b: Point): number => Math.hypot(b.x - a.x, b.y - a.y);\n\nexport const rectCenter = (r: Rect): Point => ({ x: r.x + r.w / 2, y: r.y + r.h / 2 });\n\nexport const rectToBBox = (r: Rect): BBox => ({\n minX: r.x,\n minY: r.y,\n maxX: r.x + r.w,\n maxY: r.y + r.h,\n});\n\nexport const bboxToRect = (b: BBox): Rect => ({\n x: b.minX,\n y: b.minY,\n w: b.maxX - b.minX,\n h: b.maxY - b.minY,\n});\n\nexport const bboxCenter = (b: BBox): Point => ({\n x: (b.minX + b.maxX) / 2,\n y: (b.minY + b.maxY) / 2,\n});\n\nexport const bboxSize = (b: BBox): Size => ({\n w: b.maxX - b.minX,\n h: b.maxY - b.minY,\n});\n\nexport const emptyBBox = (): BBox => ({\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity,\n});\n\nexport const isEmptyBBox = (b: BBox): boolean =>\n !Number.isFinite(b.minX) || b.maxX < b.minX || b.maxY < b.minY;\n\nexport const bboxUnion = (a: BBox, b: BBox): BBox => ({\n minX: Math.min(a.minX, b.minX),\n minY: Math.min(a.minY, b.minY),\n maxX: Math.max(a.maxX, b.maxX),\n maxY: Math.max(a.maxY, b.maxY),\n});\n\nexport const bboxOfPoints = (points: Point[]): BBox => {\n const b = emptyBBox();\n for (const p of points) {\n if (p.x < b.minX) b.minX = p.x;\n if (p.y < b.minY) b.minY = p.y;\n if (p.x > b.maxX) b.maxX = p.x;\n if (p.y > b.maxY) b.maxY = p.y;\n }\n return b;\n};\n\nexport const expandBBox = (b: BBox, pad: number): BBox => ({\n minX: b.minX - pad,\n minY: b.minY - pad,\n maxX: b.maxX + pad,\n maxY: b.maxY + pad,\n});\n\nexport const pointInRect = (p: Point, r: Rect): boolean =>\n p.x >= r.x && p.x <= r.x + r.w && p.y >= r.y && p.y <= r.y + r.h;\n\n/**\n * Intersection of the segment from the rect center toward `target` with the\n * rect border. Used to make an edge touch a node's border instead of its\n * center. Returns the border point (falls back to center if degenerate).\n */\nexport const borderPointToward = (r: Rect, target: Point): Point => {\n const c = rectCenter(r);\n const dx = target.x - c.x;\n const dy = target.y - c.y;\n if (dx === 0 && dy === 0) return c;\n const hw = r.w / 2;\n const hh = r.h / 2;\n // scale so that the larger normalized axis hits +/-1 (the border)\n const scaleX = dx !== 0 ? hw / Math.abs(dx) : Infinity;\n const scaleY = dy !== 0 ? hh / Math.abs(dy) : Infinity;\n const s = Math.min(scaleX, scaleY);\n return { x: c.x + dx * s, y: c.y + dy * s };\n};\n\n/**\n * Border point for an ellipse toward a target (used for ellipse/circle nodes so\n * edges meet the curve, not the bounding rect).\n */\nexport const ellipseBorderToward = (r: Rect, target: Point): Point => {\n const c = rectCenter(r);\n const dx = target.x - c.x;\n const dy = target.y - c.y;\n if (dx === 0 && dy === 0) return c;\n const rx = r.w / 2;\n const ry = r.h / 2;\n const denom = Math.sqrt((dx * dx) / (rx * rx) + (dy * dy) / (ry * ry));\n if (denom === 0) return c;\n return { x: c.x + dx / denom, y: c.y + dy / denom };\n};\n\n/** Deterministic 32-bit hash of a string — used for stable rough.js seeds. */\nexport const hashString = (s: string): number => {\n let h = 2166136261 >>> 0;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return h >>> 0;\n};\n","/**\n * Anchor resolution — maps an anchor spec on a node to a concrete world point.\n *\n * EDodoDraw exposes far more connection points than Excalidraw's 4:\n * - 8 compass points + center: n s e w ne nw se sw c\n * - aliases: top bottom left right center\n * - fractional side positions: \"top:0.3\" (30% along the top edge, l->r)\n * also right:0.75, bottom:0.5, left:0.2\n * - polar angle from center: \"angle:45\" (degrees, 0 = east, CW)\n * - auto (undefined): border point aimed at the other endpoint\n */\n\nimport type { Point, Rect } from \"../geometry.js\";\nimport { borderPointToward, ellipseBorderToward, rectCenter } from \"../geometry.js\";\nimport type { SceneNode } from \"./types.js\";\n\nexport function nodeRect(n: SceneNode): Rect {\n return { x: n.x, y: n.y, w: n.w, h: n.h };\n}\n\nconst COMPASS: Record<string, (r: Rect) => Point> = {\n c: (r) => rectCenter(r),\n center: (r) => rectCenter(r),\n n: (r) => ({ x: r.x + r.w / 2, y: r.y }),\n top: (r) => ({ x: r.x + r.w / 2, y: r.y }),\n s: (r) => ({ x: r.x + r.w / 2, y: r.y + r.h }),\n bottom: (r) => ({ x: r.x + r.w / 2, y: r.y + r.h }),\n e: (r) => ({ x: r.x + r.w, y: r.y + r.h / 2 }),\n right: (r) => ({ x: r.x + r.w, y: r.y + r.h / 2 }),\n w: (r) => ({ x: r.x, y: r.y + r.h / 2 }),\n left: (r) => ({ x: r.x, y: r.y + r.h / 2 }),\n ne: (r) => ({ x: r.x + r.w, y: r.y }),\n nw: (r) => ({ x: r.x, y: r.y }),\n se: (r) => ({ x: r.x + r.w, y: r.y + r.h }),\n sw: (r) => ({ x: r.x, y: r.y + r.h }),\n};\n\n/**\n * Resolve a named/parametric anchor to a world point.\n * `toward` is the opposite endpoint (used for \"auto\"/border computation).\n */\nexport function resolveAnchor(\n node: SceneNode,\n anchor: string | undefined,\n toward?: Point,\n): Point {\n const r = nodeRect(node);\n if (!anchor || anchor === \"auto\") {\n const target = toward ?? rectCenter(r);\n if (node.shape === \"ellipse\" || node.shape === \"circle\") {\n return ellipseBorderToward(r, target);\n }\n return borderPointToward(r, target);\n }\n\n const key = anchor.trim().toLowerCase();\n if (key in COMPASS) return COMPASS[key](r);\n\n // normalized position: \"@u,v\" (u,v in 0..1 of the node box)\n const uv = key.match(/^@\\(?(-?[0-9.]+),\\s*(-?[0-9.]+)\\)?$/);\n if (uv) {\n return { x: r.x + r.w * parseFloat(uv[1]), y: r.y + r.h * parseFloat(uv[2]) };\n }\n\n // side:fraction — e.g. \"top:0.3\"\n const frac = key.match(/^(top|bottom|left|right|n|s|e|w)\\s*:\\s*([0-9.]+)$/);\n if (frac) {\n const side = frac[1];\n const t = Math.max(0, Math.min(1, parseFloat(frac[2])));\n switch (side) {\n case \"top\":\n case \"n\":\n return { x: r.x + r.w * t, y: r.y };\n case \"bottom\":\n case \"s\":\n return { x: r.x + r.w * t, y: r.y + r.h };\n case \"left\":\n case \"w\":\n return { x: r.x, y: r.y + r.h * t };\n case \"right\":\n case \"e\":\n return { x: r.x + r.w, y: r.y + r.h * t };\n }\n }\n\n // angle:deg — polar from center, clipped to border\n const ang = key.match(/^angle\\s*:\\s*(-?[0-9.]+)$/);\n if (ang) {\n const deg = parseFloat(ang[1]);\n const rad = (deg * Math.PI) / 180;\n const c = rectCenter(r);\n const far: Point = { x: c.x + Math.cos(rad) * 1e5, y: c.y + Math.sin(rad) * 1e5 };\n if (node.shape === \"ellipse\" || node.shape === \"circle\") {\n return ellipseBorderToward(r, far);\n }\n return borderPointToward(r, far);\n }\n\n // Unknown anchor -> center (safe fallback)\n return rectCenter(r);\n}\n","/**\n * Read-only queries over a Scene: element lookup and bounding boxes in world\n * space. Used by the camera (fit/focus), layout, and annotation anchoring.\n */\n\nimport type { BBox, Rect } from \"../geometry.js\";\nimport { bboxOfPoints, bboxUnion, emptyBBox, rectToBBox } from \"../geometry.js\";\nimport { nodeRect } from \"./anchors.js\";\nimport type { Scene, SceneEdge, SceneGroup, SceneNode } from \"./types.js\";\n\nexport function getNode(scene: Scene, id: string): SceneNode | undefined {\n return scene.nodes.find((n) => n.id === id);\n}\n\nexport function getEdge(scene: Scene, id: string): SceneEdge | undefined {\n return scene.edges.find((e) => e.id === id);\n}\n\nexport function getGroup(scene: Scene, id: string): SceneGroup | undefined {\n return scene.groups.find((g) => g.id === id);\n}\n\nexport function nodeBBox(n: SceneNode): BBox {\n return rectToBBox(nodeRect(n));\n}\n\nexport function edgeBBox(e: SceneEdge): BBox {\n if (e.points && e.points.length) return bboxOfPoints(e.points);\n return emptyBBox();\n}\n\nexport function groupBBox(scene: Scene, g: SceneGroup): BBox {\n let b = emptyBBox();\n for (const id of g.members) {\n const n = getNode(scene, id);\n if (n) b = bboxUnion(b, nodeBBox(n));\n }\n return b;\n}\n\n/** Resolve any element id (node/group; edges included if routed) to a bbox. */\nexport function elementBBox(scene: Scene, id: string): BBox | undefined {\n const n = getNode(scene, id);\n if (n) return nodeBBox(n);\n const g = getGroup(scene, id);\n if (g) return groupBBox(scene, g);\n const e = getEdge(scene, id);\n if (e) {\n const b = edgeBBox(e);\n return Number.isFinite(b.minX) ? b : undefined;\n }\n return undefined;\n}\n\n/** Union bbox of several element ids. */\nexport function elementsBBox(scene: Scene, ids: string[]): BBox {\n let b = emptyBBox();\n for (const id of ids) {\n const eb = elementBBox(scene, id);\n if (eb) b = bboxUnion(b, eb);\n }\n return b;\n}\n\n/** BBox covering every node (and routed edge) in the scene. */\nexport function sceneBBox(scene: Scene): BBox {\n let b = emptyBBox();\n for (const n of scene.nodes) b = bboxUnion(b, nodeBBox(n));\n for (const e of scene.edges) {\n const eb = edgeBBox(e);\n if (Number.isFinite(eb.minX)) b = bboxUnion(b, eb);\n }\n return b;\n}\n\nexport function nodeRectOf(n: SceneNode): Rect {\n return nodeRect(n);\n}\n\n/** Topmost node whose bounding box contains the given world point, or null. */\nexport function hitTestNode(scene: Scene, p: { x: number; y: number }): SceneNode | null {\n let best: SceneNode | null = null;\n for (const n of scene.nodes) {\n if (p.x >= n.x && p.x <= n.x + n.w && p.y >= n.y && p.y <= n.y + n.h) {\n if (!best || n.z >= best.z) best = n;\n }\n }\n return best;\n}\n","/**\n * Color palette matched to Excalidraw's Open-Colors selection, plus named\n * \"semantic\" colors the DSL exposes (e.g. `fill: green`). Each semantic name\n * maps to a stroke + a soft background so `fill: green` yields the pleasant\n * Excalidraw green box with a matching darker green outline.\n */\n\nexport const STROKE_PALETTE = {\n black: \"#1e1e1e\",\n gray: \"#495057\",\n red: \"#e03131\",\n pink: \"#c2255c\",\n grape: \"#9c36b5\",\n violet: \"#6741d9\",\n blue: \"#1971c2\",\n cyan: \"#0c8599\",\n teal: \"#099268\",\n green: \"#2f9e44\",\n lime: \"#66a80f\",\n yellow: \"#f08c00\",\n orange: \"#e8590c\",\n brown: \"#846358\",\n white: \"#ffffff\",\n} as const;\n\n/** Soft fill backgrounds (Excalidraw's lighter shade for each hue). */\nexport const FILL_PALETTE = {\n transparent: null as string | null,\n none: null as string | null,\n black: \"#e9ecef\",\n gray: \"#e9ecef\",\n red: \"#ffc9c9\",\n pink: \"#fcc2d7\",\n grape: \"#eebefa\",\n violet: \"#d0bfff\",\n blue: \"#a5d8ff\",\n cyan: \"#99e9f2\",\n teal: \"#96f2d7\",\n green: \"#b2f2bb\",\n lime: \"#d8f5a2\",\n yellow: \"#ffec99\",\n orange: \"#ffd8a8\",\n brown: \"#e5dbd4\",\n white: \"#ffffff\",\n} as const;\n\nexport type ColorName = keyof typeof STROKE_PALETTE;\n\n/**\n * Resolve a color token to a hex string.\n * - Named strokes: \"green\" -> #2f9e44\n * - Hex passthrough: \"#ff0000\" -> \"#ff0000\"\n * - \"transparent\"/\"none\" -> null-safe handled by caller\n */\nexport function resolveStroke(token: string | undefined, fallback: string): string {\n if (!token) return fallback;\n const t = token.trim().toLowerCase();\n if (t === \"transparent\" || t === \"none\") return fallback;\n if (t.startsWith(\"#\")) return token.trim();\n if (t in STROKE_PALETTE) return STROKE_PALETTE[t as ColorName];\n // rgb()/hsl()/css named colors pass straight through to SVG\n return token.trim();\n}\n\n/** Resolve a fill token: named -> soft bg, hex passthrough, transparent -> null. */\nexport function resolveFill(token: string | undefined): string | null {\n if (!token) return null;\n const t = token.trim().toLowerCase();\n if (t === \"transparent\" || t === \"none\") return null;\n if (t.startsWith(\"#\")) return token.trim();\n if (t in FILL_PALETTE) return FILL_PALETTE[t as keyof typeof FILL_PALETTE];\n return token.trim();\n}\n\n/**\n * When a user writes `fill: green` we also nudge the stroke to the matching\n * darker green (if the stroke is still the default black). This returns the\n * \"paired\" stroke for a fill color name, or null if there's no pairing.\n */\nexport function pairedStrokeForFill(fillToken: string | undefined): string | null {\n if (!fillToken) return null;\n const t = fillToken.trim().toLowerCase();\n if (t in STROKE_PALETTE) return STROKE_PALETTE[t as ColorName];\n return null;\n}\n\n/** Highlighter/marker colors (semi-transparent) for annotations. */\nexport const MARKER_PALETTE = {\n yellow: \"#ffe066\",\n green: \"#8ce99a\",\n blue: \"#74c0fc\",\n pink: \"#faa2c1\",\n orange: \"#ffc078\",\n violet: \"#b197fc\",\n red: \"#ff8787\",\n} as const;\n\nexport function resolveMarker(token: string | undefined, fallback = MARKER_PALETTE.yellow): string {\n if (!token) return fallback;\n const t = token.trim().toLowerCase();\n if (t.startsWith(\"#\")) return token.trim();\n if (t in MARKER_PALETTE) return MARKER_PALETTE[t as keyof typeof MARKER_PALETTE];\n return resolveStroke(token, fallback);\n}\n","/**\n * AnnotationLayer — renders annotations (scripted or live) into the renderer's\n * world-space annotation layer so they track the camera and the elements they\n * anchor to. Hand-drawn via rough.js to match the aesthetic.\n *\n * The same layer serves M3 (scripted timeline annotations) and M4 (real-time\n * user annotations) — both are just `Annotation` records.\n */\n\nimport rough from \"roughjs\";\nimport type { Options } from \"roughjs/bin/core\";\nimport type { BBox, Point } from \"../geometry.js\";\nimport { bboxCenter, bboxUnion, emptyBBox, expandBBox } from \"../geometry.js\";\nimport { elementBBox } from \"../scene/query.js\";\nimport { resolveMarker } from \"../scene/palette.js\";\nimport type { Annotation, Scene } from \"../scene/types.js\";\nimport type { SvgRenderer } from \"../render/svgRenderer.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst BIG = 200000;\n\nexport class AnnotationLayer {\n private renderer: SvgRenderer;\n private rc: ReturnType<(typeof rough)[\"svg\"]>;\n private root: SVGGElement;\n\n constructor(renderer: SvgRenderer, layer: \"annotations\" | \"live\" = \"annotations\") {\n this.renderer = renderer;\n this.rc = rough.svg(renderer.svg);\n this.root = renderer.getLayer(layer);\n }\n\n clear(): void {\n this.root.replaceChildren();\n }\n\n /** Render a set of annotations (replaces current). */\n render(scene: Scene, annotations: Annotation[], animate = true): void {\n this.clear();\n // spotlights first (drawn under other annotations)\n const sorted = [...annotations].sort((a, b) => rank(a.kind) - rank(b.kind));\n for (const an of sorted) {\n try {\n const g = this.draw(scene, an);\n if (g) {\n if (animate) g.classList.add(revealClass(an.kind));\n this.root.appendChild(g);\n }\n } catch (err) {\n console.warn(\"annotation render failed\", an.kind, err);\n }\n }\n }\n\n private targetBBox(scene: Scene, an: Annotation): BBox | null {\n const members = (an.options.members as string[] | undefined) ?? [];\n if (members.length) {\n let b = emptyBBox();\n for (const id of members) {\n const eb = elementBBox(scene, id);\n if (eb) b = bboxUnion(b, eb);\n }\n return Number.isFinite(b.minX) ? b : null;\n }\n if (an.target.rect) {\n const r = an.target.rect;\n return { minX: r.x, minY: r.y, maxX: r.x + r.w, maxY: r.y + r.h };\n }\n if (an.target.ref) {\n return elementBBox(scene, an.target.ref) ?? null;\n }\n if (an.target.point) {\n const p = an.target.point;\n return { minX: p.x - 4, minY: p.y - 4, maxX: p.x + 4, maxY: p.y + 4 };\n }\n return null;\n }\n\n private draw(scene: Scene, an: Annotation): SVGGElement | null {\n const g = document.createElementNS(SVG_NS, \"g\") as SVGGElement;\n g.setAttribute(\"data-annotation\", an.id);\n g.setAttribute(\"class\", \"edd-annotation\");\n const box = this.targetBBox(scene, an);\n\n switch (an.kind) {\n case \"highlight\":\n if (box) this.drawHighlight(g, box, an);\n break;\n case \"underline\":\n if (box) this.drawUnderline(g, box, an);\n break;\n case \"strike\":\n if (box) this.drawStrike(g, box, an);\n break;\n case \"box\":\n case \"box-around\":\n if (box) this.drawBox(g, box, an);\n break;\n case \"circle-mark\":\n case \"circle-around\":\n if (box) this.drawCircle(g, box, an);\n break;\n case \"point-at\":\n if (box) this.drawPointAt(g, box, an);\n break;\n case \"callout\":\n if (box) this.drawCallout(g, box, an);\n break;\n case \"spotlight\":\n if (box) this.drawSpotlight(g, box, an);\n break;\n case \"emphasize\":\n if (box) this.drawCircle(g, box, an, true);\n break;\n case \"note-marker\":\n case \"badge\":\n if (box) this.drawNoteMarker(g, box, an);\n break;\n case \"connector\":\n this.drawConnector(scene, g, an);\n break;\n case \"sticky\":\n case \"text\":\n this.drawSticky(g, an);\n break;\n default:\n if (box) this.drawBox(g, box, an);\n break;\n }\n return g.childNodes.length ? g : null;\n }\n\n // ---- primitives ---------------------------------------------------------\n\n private drawHighlight(g: SVGGElement, box: BBox, an: Annotation): void {\n const color = resolveMarker(an.color);\n const pad = 6;\n const r = document.createElementNS(SVG_NS, \"rect\");\n r.setAttribute(\"x\", String(box.minX - pad));\n r.setAttribute(\"y\", String(box.minY - pad));\n r.setAttribute(\"width\", String(box.maxX - box.minX + pad * 2));\n r.setAttribute(\"height\", String(box.maxY - box.minY + pad * 2));\n r.setAttribute(\"rx\", \"6\");\n r.setAttribute(\"fill\", color);\n r.setAttribute(\"opacity\", \"0.42\");\n r.style.mixBlendMode = \"multiply\";\n g.appendChild(r);\n }\n\n private drawUnderline(g: SVGGElement, box: BBox, an: Annotation): void {\n const color = an.color || \"#1971c2\";\n const y = box.maxY - 4;\n const opts: Options = { stroke: color, strokeWidth: 3, roughness: 1.8, bowing: 3, seed: 7 };\n const style = String(an.options.style ?? \"solid\");\n if (style === \"wavy\") {\n const pts: [number, number][] = [];\n const steps = 12;\n for (let i = 0; i <= steps; i++) {\n const x = box.minX + ((box.maxX - box.minX) * i) / steps;\n pts.push([x, y + Math.sin(i * 1.3) * 3]);\n }\n g.appendChild(this.rc.curve(pts, opts));\n } else {\n g.appendChild(this.rc.line(box.minX, y, box.maxX, y, opts));\n if (style === \"double\") g.appendChild(this.rc.line(box.minX, y + 5, box.maxX, y + 5, opts));\n }\n }\n\n private drawStrike(g: SVGGElement, box: BBox, an: Annotation): void {\n const color = an.color || \"#e03131\";\n const y = (box.minY + box.maxY) / 2;\n g.appendChild(this.rc.line(box.minX, y, box.maxX, y, { stroke: color, strokeWidth: 3, roughness: 1.5, seed: 9 }));\n }\n\n private drawBox(g: SVGGElement, box: BBox, an: Annotation): void {\n const color = an.color || \"#1971c2\";\n const b = expandBBox(box, 14);\n g.appendChild(\n this.rc.rectangle(b.minX, b.minY, b.maxX - b.minX, b.maxY - b.minY, {\n stroke: color,\n strokeWidth: 2.4,\n roughness: 1.5,\n seed: 11,\n }),\n );\n if (an.text) this.label(g, an.text, { x: b.minX + 6, y: b.minY - 8 }, color, \"start\");\n }\n\n private drawCircle(g: SVGGElement, box: BBox, an: Annotation, pulse = false): void {\n const color = an.color || \"#e8590c\";\n const c = bboxCenter(box);\n const w = (box.maxX - box.minX) * 1.35 + 24;\n const h = (box.maxY - box.minY) * 1.35 + 24;\n const ring = this.rc.ellipse(c.x, c.y, w, h, { stroke: color, strokeWidth: 2.6, roughness: 1.6, seed: 13 });\n if (pulse) ring.classList.add(\"edd-anim-pulse\"), (ring.style.animationDuration = \"1.3s\");\n g.appendChild(ring);\n if (an.text) this.label(g, an.text, { x: c.x, y: box.minY - h * 0.18 }, color, \"middle\");\n }\n\n private drawPointAt(g: SVGGElement, box: BBox, an: Annotation): void {\n const color = an.color || \"#1971c2\";\n const c = bboxCenter(box);\n const from = String(an.options.from ?? \"ne\");\n const dir = dirVec(from);\n const dist = 90;\n const tail: Point = { x: c.x + dir.x * dist, y: c.y + dir.y * dist };\n // tip just outside the target's border\n const tip: Point = { x: c.x + dir.x * ((box.maxX - box.minX) / 2 + 14), y: c.y + dir.y * ((box.maxY - box.minY) / 2 + 14) };\n // curved hand-drawn arrow\n const ctrl: Point = { x: (tail.x + tip.x) / 2 + dir.y * 20, y: (tail.y + tip.y) / 2 - dir.x * 20 };\n g.appendChild(this.rc.curve([[tail.x, tail.y], [ctrl.x, ctrl.y], [tip.x, tip.y]], { stroke: color, strokeWidth: 2.4, roughness: 1.4, seed: 17 }));\n // arrowhead at tip\n const ang = Math.atan2(tip.y - ctrl.y, tip.x - ctrl.x);\n const sz = 14;\n g.appendChild(\n this.rc.linearPath(\n [\n [tip.x - Math.cos(ang - 0.4) * sz, tip.y - Math.sin(ang - 0.4) * sz],\n [tip.x, tip.y],\n [tip.x - Math.cos(ang + 0.4) * sz, tip.y - Math.sin(ang + 0.4) * sz],\n ],\n { stroke: color, strokeWidth: 2.4, roughness: 1, seed: 17 },\n ),\n );\n if (an.text) {\n const anchor = dir.x < -0.3 ? \"end\" : dir.x > 0.3 ? \"start\" : \"middle\";\n this.label(g, an.text, { x: tail.x + dir.x * 6, y: tail.y + dir.y * 6 }, color, anchor);\n }\n }\n\n private drawCallout(g: SVGGElement, box: BBox, an: Annotation): void {\n const color = an.color || \"#1971c2\";\n const placement = String(an.options.placement ?? \"bottom\");\n const c = bboxCenter(box);\n const dir = dirVec(placement);\n const gap = 46;\n const anchor: Point = {\n x: c.x + dir.x * ((box.maxX - box.minX) / 2 + 8),\n y: c.y + dir.y * ((box.maxY - box.minY) / 2 + 8),\n };\n const bubble: Point = { x: anchor.x + dir.x * gap, y: anchor.y + dir.y * gap };\n const text = an.text ?? \"\";\n const w = Math.max(70, text.length * 8.4 + 20);\n const h = 34;\n const bx = bubble.x - (dir.x < -0.3 ? w : dir.x > 0.3 ? 0 : w / 2);\n const by = bubble.y - h / 2;\n // leader line\n g.appendChild(this.rc.line(anchor.x, anchor.y, dir.x < -0.3 ? bx + w : dir.x > 0.3 ? bx : bx + w / 2, by + h / 2, { stroke: color, strokeWidth: 2, roughness: 1.2, seed: 19 }));\n // bubble\n g.appendChild(this.rc.rectangle(bx, by, w, h, { stroke: color, strokeWidth: 2, roughness: 1.2, seed: 21, fill: \"#ffffff\", fillStyle: \"solid\" }));\n this.label(g, text, { x: bx + w / 2, y: by + h / 2 }, color, \"middle\", 15);\n }\n\n private drawNoteMarker(g: SVGGElement, box: BBox, an: Annotation): void {\n const color = an.color || \"#1971c2\";\n const p: Point = { x: box.minX - 6, y: box.minY - 6 };\n g.appendChild(this.rc.circle(p.x, p.y, 30, { stroke: color, strokeWidth: 2, roughness: 1, seed: 23, fill: \"#ffffff\", fillStyle: \"solid\" }));\n this.label(g, an.text ?? \"●\", p, color, \"middle\", 14);\n }\n\n private drawSpotlight(g: SVGGElement, box: BBox, an: Annotation): void {\n const dim = clamp(numOr(an.options.dim, 0.68), 0, 0.95);\n const pad = numOr(an.options.pad, 18);\n const b = expandBBox(box, pad);\n const maskId = `edd-spot-${an.id.replace(/[^a-z0-9]/gi, \"\")}`;\n const mask = document.createElementNS(SVG_NS, \"mask\");\n mask.setAttribute(\"id\", maskId);\n const full = document.createElementNS(SVG_NS, \"rect\");\n full.setAttribute(\"x\", String(-BIG));\n full.setAttribute(\"y\", String(-BIG));\n full.setAttribute(\"width\", String(BIG * 2));\n full.setAttribute(\"height\", String(BIG * 2));\n full.setAttribute(\"fill\", \"white\");\n const hole = document.createElementNS(SVG_NS, \"rect\");\n hole.setAttribute(\"x\", String(b.minX));\n hole.setAttribute(\"y\", String(b.minY));\n hole.setAttribute(\"width\", String(b.maxX - b.minX));\n hole.setAttribute(\"height\", String(b.maxY - b.minY));\n hole.setAttribute(\"rx\", \"14\");\n hole.setAttribute(\"fill\", \"black\");\n mask.appendChild(full);\n mask.appendChild(hole);\n g.appendChild(mask);\n const shade = document.createElementNS(SVG_NS, \"rect\");\n shade.setAttribute(\"x\", String(-BIG));\n shade.setAttribute(\"y\", String(-BIG));\n shade.setAttribute(\"width\", String(BIG * 2));\n shade.setAttribute(\"height\", String(BIG * 2));\n shade.setAttribute(\"fill\", \"#0b1021\");\n shade.setAttribute(\"opacity\", String(dim));\n shade.setAttribute(\"mask\", `url(#${maskId})`);\n g.appendChild(shade);\n }\n\n private drawConnector(scene: Scene, g: SVGGElement, an: Annotation): void {\n const color = an.color || \"#1971c2\";\n const fromPoint = an.options.fromPoint as Point | undefined;\n const fromRef = an.options.fromRef as string | undefined;\n let tail: Point | null = fromPoint ?? null;\n if (!tail && fromRef) {\n const b = elementBBox(scene, fromRef);\n if (b) tail = bboxCenter(b);\n }\n let tip: Point | null = an.target.point ?? null;\n if (!tip && an.target.ref) {\n const b = elementBBox(scene, an.target.ref);\n if (b) tip = bboxCenter(b);\n }\n if (!tail || !tip) return;\n // if tip anchors to an element, pull it to the border toward the tail\n if (an.target.ref) {\n const b = elementBBox(scene, an.target.ref);\n if (b) {\n const c = bboxCenter(b);\n const dx = tail.x - c.x;\n const dy = tail.y - c.y;\n const len = Math.hypot(dx, dy) || 1;\n tip = { x: c.x + (dx / len) * ((b.maxX - b.minX) / 2 + 8), y: c.y + (dy / len) * ((b.maxY - b.minY) / 2 + 8) };\n }\n }\n g.appendChild(this.rc.line(tail.x, tail.y, tip.x, tip.y, { stroke: color, strokeWidth: 2.4, roughness: 1.3, seed: 29 }));\n const ang = Math.atan2(tip.y - tail.y, tip.x - tail.x);\n const sz = 14;\n g.appendChild(\n this.rc.linearPath(\n [\n [tip.x - Math.cos(ang - 0.4) * sz, tip.y - Math.sin(ang - 0.4) * sz],\n [tip.x, tip.y],\n [tip.x - Math.cos(ang + 0.4) * sz, tip.y - Math.sin(ang + 0.4) * sz],\n ],\n { stroke: color, strokeWidth: 2.4, roughness: 1, seed: 29 },\n ),\n );\n if (an.text) this.label(g, an.text, { x: tail.x, y: tail.y - 12 }, color, \"middle\");\n }\n\n private drawSticky(g: SVGGElement, an: Annotation): void {\n const p = an.target.point;\n if (!p) return;\n const color = an.color || \"#e8590c\";\n const text = an.text ?? \"\";\n const w = Math.max(90, text.length * 8.6 + 24);\n const h = 40;\n g.appendChild(\n this.rc.rectangle(p.x - w / 2, p.y - h / 2, w, h, {\n stroke: color,\n strokeWidth: 2,\n roughness: 1.1,\n seed: 31,\n fill: \"#fff9db\",\n fillStyle: \"solid\",\n }),\n );\n this.label(g, text, p, \"#5c3d00\", \"middle\", 16);\n }\n\n private label(g: SVGGElement, text: string, at: Point, color: string, anchor: \"start\" | \"middle\" | \"end\", size = 17): void {\n const t = document.createElementNS(SVG_NS, \"text\");\n const lines = text.split(\"\\n\");\n t.setAttribute(\"text-anchor\", anchor);\n t.setAttribute(\"font-family\", '\"Excalifont\", \"Virgil\", cursive');\n t.setAttribute(\"font-size\", String(size));\n t.setAttribute(\"fill\", color);\n t.setAttribute(\"dominant-baseline\", \"middle\");\n const startY = at.y - ((lines.length - 1) * size * 1.2) / 2;\n lines.forEach((line, i) => {\n const ts = document.createElementNS(SVG_NS, \"tspan\");\n ts.setAttribute(\"x\", String(at.x));\n ts.setAttribute(\"y\", String(startY + i * size * 1.2));\n ts.textContent = line;\n t.appendChild(ts);\n });\n g.appendChild(t);\n }\n}\n\nfunction dirVec(name: string): Point {\n const map: Record<string, Point> = {\n n: { x: 0, y: -1 },\n top: { x: 0, y: -1 },\n s: { x: 0, y: 1 },\n bottom: { x: 0, y: 1 },\n e: { x: 1, y: 0 },\n right: { x: 1, y: 0 },\n w: { x: -1, y: 0 },\n left: { x: -1, y: 0 },\n ne: { x: 0.7, y: -0.7 },\n nw: { x: -0.7, y: -0.7 },\n se: { x: 0.7, y: 0.7 },\n sw: { x: -0.7, y: 0.7 },\n };\n return map[name] ?? map.ne;\n}\n\nfunction rank(kind: string): number {\n return kind === \"spotlight\" ? 0 : 1;\n}\n\nfunction revealClass(kind: string): string {\n if (kind === \"spotlight\") return \"edd-reveal-fade\";\n if (kind === \"highlight\") return \"edd-reveal-sweep\";\n return \"edd-reveal-pop\";\n}\n\nfunction numOr(v: unknown, d: number): number {\n return typeof v === \"number\" ? v : d;\n}\nfunction clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v;\n}\n","/**\n * LiveAnnotationController — real-time interactive annotation editing.\n *\n * Tools:\n * select — pick / move / delete existing live annotations\n * highlight — click an element to marker-highlight it\n * underline — click an element to underline it\n * box — click an element to draw a box around it\n * circle — click an element to ring it\n * arrow — drag to draw a pointer arrow (endpoints snap to elements)\n * text — click to drop a sticky note (then type)\n *\n * Live annotations live in the renderer's 'live' world layer, so they track the\n * camera and their anchored elements automatically. Everything is undoable and\n * serializable back to EDodoDraw code (commit-to-code).\n */\n\nimport type { Point } from \"../geometry.js\";\nimport { bboxCenter } from \"../geometry.js\";\nimport { elementBBox, hitTestNode } from \"../scene/query.js\";\nimport type { Annotation, Scene } from \"../scene/types.js\";\nimport type { SvgRenderer } from \"../render/svgRenderer.js\";\nimport { AnnotationLayer } from \"./layer.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport type Tool = \"select\" | \"highlight\" | \"underline\" | \"box\" | \"circle\" | \"arrow\" | \"text\";\n\nexport interface LiveState {\n tool: Tool;\n count: number;\n canUndo: boolean;\n canRedo: boolean;\n selected: string | null;\n}\n\nconst DEFAULTS: Record<string, { kind: string; color: string; options: Record<string, unknown> }> = {\n highlight: { kind: \"highlight\", color: \"yellow\", options: {} },\n underline: { kind: \"underline\", color: \"#1971c2\", options: { style: \"solid\" } },\n box: { kind: \"box\", color: \"#1971c2\", options: {} },\n circle: { kind: \"circle-mark\", color: \"#e8590c\", options: {} },\n};\n\nexport class LiveAnnotationController {\n private renderer: SvgRenderer;\n private getScene: () => Scene;\n private layer: AnnotationLayer;\n private live: Annotation[] = [];\n private tool: Tool = \"select\";\n private selected: string | null = null;\n private draft: Annotation | null = null;\n private undoStack: Annotation[][] = [];\n private redoStack: Annotation[][] = [];\n private seq = 0;\n private dragging: { id: string; start: Point; orig: Annotation } | null = null;\n\n onChange?: (s: LiveState) => void;\n onRequestText?: (id: string, world: Point) => void;\n\n constructor(renderer: SvgRenderer, getScene: () => Scene) {\n this.renderer = renderer;\n this.getScene = getScene;\n this.layer = new AnnotationLayer(renderer, \"live\");\n }\n\n // ---- state --------------------------------------------------------------\n private emit(): void {\n this.onChange?.({\n tool: this.tool,\n count: this.live.length,\n canUndo: this.undoStack.length > 0,\n canRedo: this.redoStack.length > 0,\n selected: this.selected,\n });\n }\n\n setTool(t: Tool): void {\n this.tool = t;\n this.draft = null;\n if (t !== \"select\") this.selected = null;\n this.render();\n this.emit();\n }\n\n getTool(): Tool {\n return this.tool;\n }\n\n getAnnotations(): Annotation[] {\n return this.live;\n }\n\n private snapshot(): void {\n this.undoStack.push(structuredClone(this.live));\n if (this.undoStack.length > 100) this.undoStack.shift();\n this.redoStack = [];\n }\n\n private id(kind: string): string {\n return `live_${kind}_${this.seq++}`;\n }\n\n // ---- render -------------------------------------------------------------\n render(): void {\n const scene = this.getScene();\n const items = this.draft ? [...this.live, this.draft] : this.live;\n this.layer.render(scene, items, false);\n this.drawSelection();\n }\n\n private drawSelection(): void {\n if (!this.selected) return;\n const an = this.live.find((a) => a.id === this.selected);\n if (!an) return;\n const box = this.anchorBBox(an);\n if (!box) return;\n const root = this.renderer.getLayer(\"live\");\n const rect = document.createElementNS(SVG_NS, \"rect\");\n const pad = 10;\n rect.setAttribute(\"x\", String(box.minX - pad));\n rect.setAttribute(\"y\", String(box.minY - pad));\n rect.setAttribute(\"width\", String(box.maxX - box.minX + pad * 2));\n rect.setAttribute(\"height\", String(box.maxY - box.minY + pad * 2));\n rect.setAttribute(\"fill\", \"none\");\n rect.setAttribute(\"stroke\", \"#6741d9\");\n rect.setAttribute(\"stroke-width\", \"1.5\");\n rect.setAttribute(\"stroke-dasharray\", \"5 4\");\n rect.setAttribute(\"rx\", \"6\");\n root.appendChild(rect);\n }\n\n private anchorBBox(an: Annotation): { minX: number; minY: number; maxX: number; maxY: number } | null {\n const scene = this.getScene();\n if (an.target.ref) return elementBBox(scene, an.target.ref) ?? null;\n if (an.target.point) {\n const p = an.target.point;\n const r = an.kind === \"sticky\" || an.kind === \"text\" ? 50 : 20;\n return { minX: p.x - r, minY: p.y - r, maxX: p.x + r, maxY: p.y + r };\n }\n return null;\n }\n\n // ---- pointer ------------------------------------------------------------\n /** returns true if the controller handled the event (skip camera pan). */\n pointerDown(world: Point, _screen: Point): boolean {\n const scene = this.getScene();\n\n if (this.tool === \"select\") {\n const hit = this.hitLive(world);\n this.selected = hit?.id ?? null;\n if (hit) {\n this.dragging = { id: hit.id, start: world, orig: structuredClone(hit) };\n this.render();\n this.emit();\n return true;\n }\n this.render();\n this.emit();\n return false; // let camera pan\n }\n\n if (this.tool === \"arrow\") {\n const node = hitTestNode(scene, world);\n this.draft = {\n id: this.id(\"connector\"),\n kind: \"connector\",\n target: { ref: null, point: world },\n color: \"#1971c2\",\n options: node ? { fromRef: node.id } : { fromPoint: world },\n z: 0,\n origin: \"live\",\n };\n this.render();\n return true;\n }\n\n if (this.tool === \"text\") {\n const an: Annotation = {\n id: this.id(\"sticky\"),\n kind: \"sticky\",\n target: { ref: null, point: world },\n text: \"note\",\n color: \"#e8590c\",\n options: {},\n z: 0,\n origin: \"live\",\n };\n this.snapshot();\n this.live.push(an);\n this.selected = an.id;\n this.render();\n this.emit();\n this.onRequestText?.(an.id, world);\n return true;\n }\n\n // element-anchored tools\n const def = DEFAULTS[this.tool];\n if (def) {\n const node = hitTestNode(scene, world);\n if (!node) return false; // clicked empty space -> allow pan\n const an: Annotation = {\n id: this.id(def.kind),\n kind: def.kind,\n target: { ref: node.id },\n color: def.color,\n options: { ...def.options },\n z: 0,\n origin: \"live\",\n };\n this.snapshot();\n this.live.push(an);\n this.selected = an.id;\n this.render();\n this.emit();\n return true;\n }\n return false;\n }\n\n pointerMove(world: Point): void {\n if (this.draft) {\n const scene = this.getScene();\n const node = hitTestNode(scene, world);\n if (node) {\n this.draft.target = { ref: node.id };\n } else {\n this.draft.target = { ref: null, point: world };\n }\n this.render();\n return;\n }\n if (this.dragging) {\n const an = this.live.find((a) => a.id === this.dragging!.id);\n if (an && an.target.point) {\n const dx = world.x - this.dragging.start.x;\n const dy = world.y - this.dragging.start.y;\n const o = this.dragging.orig.target.point!;\n an.target.point = { x: o.x + dx, y: o.y + dy };\n if (an.options.fromPoint) {\n const fo = this.dragging.orig.options.fromPoint as Point;\n an.options.fromPoint = { x: fo.x + dx, y: fo.y + dy };\n }\n this.render();\n }\n }\n }\n\n pointerUp(world: Point): void {\n if (this.draft) {\n const scene = this.getScene();\n const node = hitTestNode(scene, world);\n if (node) this.draft.target = { ref: node.id };\n else this.draft.target = { ref: null, point: world };\n this.snapshot();\n this.live.push(this.draft);\n this.selected = this.draft.id;\n this.draft = null;\n this.render();\n this.emit();\n return;\n }\n if (this.dragging) {\n // commit move as one undo step\n const before = this.dragging.orig;\n const cur = this.live.find((a) => a.id === this.dragging!.id);\n if (cur && JSON.stringify(before.target) !== JSON.stringify(cur.target)) {\n this.undoStack.push(this.liveWith(this.dragging.id, before));\n this.redoStack = [];\n }\n this.dragging = null;\n this.emit();\n }\n }\n\n private liveWith(id: string, replacement: Annotation): Annotation[] {\n return this.live.map((a) => (a.id === id ? structuredClone(replacement) : structuredClone(a)));\n }\n\n private hitLive(world: Point): Annotation | null {\n for (let i = this.live.length - 1; i >= 0; i--) {\n const an = this.live[i];\n const box = this.anchorBBox(an);\n if (box && world.x >= box.minX - 12 && world.x <= box.maxX + 12 && world.y >= box.minY - 12 && world.y <= box.maxY + 12) {\n return an;\n }\n }\n return null;\n }\n\n // ---- keyboard / edit ----------------------------------------------------\n handleKey(e: KeyboardEvent): boolean {\n const meta = e.metaKey || e.ctrlKey;\n if (meta && e.key.toLowerCase() === \"z\") {\n if (e.shiftKey) this.redo();\n else this.undo();\n return true;\n }\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && this.selected) {\n this.deleteSelected();\n return true;\n }\n return false;\n }\n\n setText(id: string, text: string): void {\n const an = this.live.find((a) => a.id === id);\n if (!an) return;\n an.text = text;\n this.render();\n }\n\n deleteSelected(): void {\n if (!this.selected) return;\n this.snapshot();\n this.live = this.live.filter((a) => a.id !== this.selected);\n this.selected = null;\n this.render();\n this.emit();\n }\n\n undo(): void {\n const prev = this.undoStack.pop();\n if (!prev) return;\n this.redoStack.push(structuredClone(this.live));\n this.live = prev;\n this.selected = null;\n this.render();\n this.emit();\n }\n\n redo(): void {\n const next = this.redoStack.pop();\n if (!next) return;\n this.undoStack.push(structuredClone(this.live));\n this.live = next;\n this.render();\n this.emit();\n }\n\n clear(): void {\n if (!this.live.length) return;\n this.snapshot();\n this.live = [];\n this.selected = null;\n this.render();\n this.emit();\n }\n\n // ---- serialization ------------------------------------------------------\n /** Serialize live annotations back into an EDodoDraw `annotate { … }` block. */\n commitToCode(): string {\n if (!this.live.length) return \"\";\n const lines: string[] = ['annotate \"live\" {'];\n const scene = this.getScene();\n for (const an of this.live) {\n lines.push(\" \" + this.serialize(an, scene));\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n }\n\n private serialize(an: Annotation, scene: Scene): string {\n const color = an.color;\n const ref = an.target.ref;\n switch (an.kind) {\n case \"highlight\":\n return `highlight ${ref} { color: ${color} }`;\n case \"underline\":\n return `underline ${ref} { color: ${color} }`;\n case \"box\":\n return `box [${ref}]${an.text ? ` \"${an.text}\"` : \"\"} { color: ${color} }`;\n case \"circle-mark\":\n return `circle-mark ${ref}${an.text ? ` \"${an.text}\"` : \"\"} { color: ${color} }`;\n case \"connector\": {\n const fromRef = an.options.fromRef as string | undefined;\n if (ref && fromRef) {\n return `point-at ${ref} { from: ${this.cardinalBetween(fromRef, ref, scene)}, color: ${color} }`;\n }\n if (ref) return `point-at ${ref} { color: ${color} }`;\n return `// free arrow (no element anchor) — not representable in code`;\n }\n case \"sticky\":\n case \"text\": {\n const p = an.target.point;\n return `// note \"${an.text ?? \"\"}\" at (${Math.round(p?.x ?? 0)}, ${Math.round(p?.y ?? 0)})`;\n }\n default:\n return `// ${an.kind} ${ref ?? \"\"}`;\n }\n }\n\n private cardinalBetween(fromRef: string, toRef: string, scene: Scene): string {\n const a = elementBBox(scene, fromRef);\n const b = elementBBox(scene, toRef);\n if (!a || !b) return \"ne\";\n const ca = bboxCenter(a);\n const cb = bboxCenter(b);\n const dx = ca.x - cb.x;\n const dy = ca.y - cb.y;\n const h = Math.abs(dx) > Math.abs(dy) * 0.5;\n const v = Math.abs(dy) > Math.abs(dx) * 0.5;\n const ns = dy < 0 ? \"n\" : \"s\";\n const ew = dx < 0 ? \"w\" : \"e\";\n if (h && v) return ns + ew;\n if (v) return ns;\n return ew;\n }\n}\n","/**\n * Diagnostics — structured, multi-error, with source spans and fix hints\n * (language spec §12.8). The parser and resolver accumulate these; none of them\n * abort the pipeline (except a total lexer failure, which can't happen since the\n * lexer is permissive).\n */\n\nexport type Severity = \"error\" | \"warning\" | \"info\";\n\nexport interface Diagnostic {\n severity: Severity;\n code: string; // stable machine code, e.g. \"E-EDGE-NOOP\"\n message: string;\n line: number; // 1-based\n col: number; // 1-based\n start: number; // source offset\n end: number;\n expected?: string;\n found?: string;\n hint?: string;\n}\n\nexport class DiagnosticBag {\n readonly items: Diagnostic[] = [];\n\n add(d: Diagnostic): void {\n this.items.push(d);\n }\n\n error(code: string, message: string, at: { line: number; col: number; start: number; end: number }, extra?: Partial<Diagnostic>): void {\n this.items.push({ severity: \"error\", code, message, ...at, ...extra });\n }\n\n warn(code: string, message: string, at: { line: number; col: number; start: number; end: number }, extra?: Partial<Diagnostic>): void {\n this.items.push({ severity: \"warning\", code, message, ...at, ...extra });\n }\n\n get hasErrors(): boolean {\n return this.items.some((d) => d.severity === \"error\");\n }\n\n get errors(): Diagnostic[] {\n return this.items.filter((d) => d.severity === \"error\");\n }\n}\n\n/** Nearest match from a closed menu (Levenshtein) — for \"did you mean\" hints. */\nexport function nearest(word: string, menu: Iterable<string>): string | null {\n let best: string | null = null;\n let bestD = Infinity;\n for (const m of menu) {\n const d = levenshtein(word.toLowerCase(), m.toLowerCase());\n if (d < bestD) {\n bestD = d;\n best = m;\n }\n }\n // only suggest if reasonably close\n return best !== null && bestD <= Math.max(2, Math.floor(word.length / 3)) ? best : null;\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n if (m === 0) return n;\n if (n === 0) return m;\n const dp = new Array(n + 1);\n for (let j = 0; j <= n; j++) dp[j] = j;\n for (let i = 1; i <= m; i++) {\n let prev = dp[0];\n dp[0] = i;\n for (let j = 1; j <= n; j++) {\n const tmp = dp[j];\n dp[j] = Math.min(dp[j] + 1, dp[j - 1] + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));\n prev = tmp;\n }\n }\n return dp[n];\n}\n\n/** Human-readable formatting of a diagnostic against the source (spec §12.8). */\nexport function formatDiagnostic(d: Diagnostic, source: string, file = \"input.edd\"): string {\n const lines = source.split(\"\\n\");\n const srcLine = lines[d.line - 1] ?? \"\";\n const caret = \" \".repeat(Math.max(0, d.col - 1)) + \"^\".repeat(Math.max(1, d.end - d.start));\n let out = `${d.severity} [${d.code}] ${file}:${d.line}:${d.col}: ${d.message}\\n ${srcLine}\\n ${caret}`;\n if (d.expected || d.found) out += `\\n expected: ${d.expected ?? \"?\"} ; found: ${d.found ?? \"?\"}`;\n if (d.hint) out += `\\n hint: ${d.hint}`;\n return out;\n}\n","/**\n * Token model for the EDodoDraw DSL lexer.\n *\n * Design notes (per the language spec §3, §12):\n * - Keywords are SOFT: they lex as IDENT and the parser recognizes them by\n * text in head position. This keeps the token set small and lets ids like\n * `focus` or `label` be used as node ids in non-keyword positions.\n * - The lexer is PERMISSIVE: it never throws. Unknown characters become a\n * SYMBOL token so shape-sugar innards (captured raw by the parser via source\n * offsets) don't crash lexing.\n * - Every token keeps byte offsets + line/col for diagnostics and for the\n * parser's raw shape-sugar capture.\n */\n\nexport enum T {\n Newline = \"Newline\",\n Semi = \"Semi\",\n Ident = \"Ident\",\n String = \"String\",\n Raw = \"Raw\", // triple-quoted / mermaid body\n Number = \"Number\", // value + optional unit\n Color = \"Color\",\n Bool = \"Bool\",\n TokenRef = \"TokenRef\", // $name\n TripleColon = \"TripleColon\", // :::\n EdgeOp = \"EdgeOp\",\n At = \"At\", // @\n Amp = \"Amp\", // &\n Pipe = \"Pipe\", // |\n Colon = \"Colon\",\n Comma = \"Comma\",\n Dot = \"Dot\",\n Slash = \"Slash\",\n Eq = \"Eq\",\n LBrace = \"LBrace\",\n RBrace = \"RBrace\",\n LBracket = \"LBracket\",\n RBracket = \"RBracket\",\n LParen = \"LParen\",\n RParen = \"RParen\",\n Symbol = \"Symbol\", // any other single char (permissive)\n EOF = \"EOF\",\n}\n\nexport interface Token {\n kind: T;\n /** Raw lexeme text (for STRING/RAW: the decoded content). */\n text: string;\n /** Numeric value for Number tokens. */\n num?: number;\n /** Unit suffix for Number tokens: px % deg rad turn ms s pt em fr x. */\n unit?: string | null;\n /** For Bool tokens. */\n bool?: boolean;\n /** For TokenRef: the name without `$`. For Raw: an optional tag. */\n name?: string;\n start: number; // source offset (inclusive)\n end: number; // source offset (exclusive)\n line: number; // 1-based\n col: number; // 1-based\n}\n\n/** Edge operator glyphs, longest-first for maximal-munch matching. */\nexport const EDGE_GLYPHS: string[] = [\n \"<-->\",\n \"<--\",\n \"<->\",\n \"-.->\",\n \"--->\",\n \"-->\",\n \"==>\",\n \"===\",\n \"..>\",\n \"--o\",\n \"--x\",\n \"---\",\n \"<-\",\n \"->\",\n \"~>\",\n \"-o\",\n \"-x\",\n \"--\",\n];\n\n/** Soft keyword sets used by the parser (not the lexer). */\nexport const KEYWORDS = new Set([\n \"edd\", \"meta\", \"import\", \"as\", \"plugin\", \"define\", \"use\", \"theme\", \"style\",\n \"defaults\", \"extends\", \"tokens\", \"scene\", \"timeline\", \"beat\", \"step\", \"group\",\n \"container\", \"node\", \"edge\", \"anchor\", \"layout\", \"on\", \"at\", \"to\", \"by\",\n \"from\", \"via\", \"camera\", \"annotate\", \"reveal\", \"mermaid\",\n]);\n\nexport const SHAPE_KEYWORDS = new Set([\n \"rect\", \"rectangle\", \"round-rect\", \"round-rectangle\", \"roundrect\", \"ellipse\",\n \"circle\", \"diamond\", \"decision\", \"cylinder\", \"db\", \"database\", \"hexagon\",\n \"parallelogram\", \"trapezoid\", \"cloud\", \"actor\", \"note\", \"document\", \"stadium\",\n \"pill\", \"subroutine\", \"triangle\", \"star\", \"text\", \"image\", \"frame\", \"custom\",\n]);\n\nexport const LAYOUT_KEYWORDS = new Set([\n \"dag\", \"tree\", \"grid\", \"radial\", \"flow\", \"free\", \"force\", \"manual\",\n]);\n","/**\n * Lexer for the EDodoDraw DSL. Permissive (never throws), position-tracking,\n * maximal-munch for edge operators. See tokens.ts for the token model and the\n * language spec §3/§12 for rules.\n */\n\nimport { EDGE_GLYPHS, T, type Token } from \"./tokens.js\";\n\nconst IDENT_START = /[A-Za-z_]/;\nconst IDENT_PART = /[A-Za-z0-9_]/;\nconst DIGIT = /[0-9]/;\nconst HEX = /[0-9a-fA-F]/;\nconst EDGE_START = new Set([\"-\", \"<\", \"=\", \"~\", \".\"]);\nconst UNITS = [\"turn\", \"deg\", \"rad\", \"px\", \"pt\", \"em\", \"fr\", \"ms\", \"s\", \"x\", \"%\"];\nconst BOOLS: Record<string, boolean> = { true: true, false: false, yes: true, no: false };\n\nexport function lex(source: string): Token[] {\n const tokens: Token[] = [];\n const len = source.length;\n let pos = 0;\n let line = 1;\n let lineStart = 0;\n\n const col = () => pos - lineStart + 1;\n const push = (kind: T, start: number, extra: Partial<Token> = {}) => {\n tokens.push({ kind, text: source.slice(start, pos), start, end: pos, line, col: start - lineStart + 1, ...extra });\n };\n const newline = () => {\n const start = pos;\n pos++;\n tokens.push({ kind: T.Newline, text: \"\\n\", start, end: pos, line, col: col() });\n line++;\n lineStart = pos;\n };\n\n while (pos < len) {\n const c = source[pos];\n\n // horizontal whitespace\n if (c === \" \" || c === \"\\t\" || c === \"\\r\") {\n pos++;\n continue;\n }\n if (c === \"\\n\") {\n newline();\n continue;\n }\n\n // comments\n if (c === \"/\" && source[pos + 1] === \"/\") {\n while (pos < len && source[pos] !== \"\\n\") pos++;\n continue;\n }\n if (c === \"%\" && source[pos + 1] === \"%\") {\n while (pos < len && source[pos] !== \"\\n\") pos++;\n continue;\n }\n if (c === \"/\" && source[pos + 1] === \"*\") {\n let depth = 1;\n pos += 2;\n while (pos < len && depth > 0) {\n if (source[pos] === \"/\" && source[pos + 1] === \"*\") {\n depth++;\n pos += 2;\n } else if (source[pos] === \"*\" && source[pos + 1] === \"/\") {\n depth--;\n pos += 2;\n } else {\n if (source[pos] === \"\\n\") {\n line++;\n lineStart = pos + 1;\n }\n pos++;\n }\n }\n continue;\n }\n\n if (c === \";\") {\n const start = pos;\n pos++;\n push(T.Semi, start);\n continue;\n }\n\n // triple-quoted raw block \"\"\"...\"\"\"\n if (c === '\"' && source[pos + 1] === '\"' && source[pos + 2] === '\"') {\n const start = pos;\n const startLine = line;\n const startLineStart = lineStart;\n pos += 3;\n let body = \"\";\n while (pos < len && !(source[pos] === '\"' && source[pos + 1] === '\"' && source[pos + 2] === '\"')) {\n if (source[pos] === \"\\n\") {\n line++;\n lineStart = pos + 1;\n }\n body += source[pos];\n pos++;\n }\n pos += 3; // closing \"\"\"\n tokens.push({ kind: T.Raw, text: body.replace(/^\\n/, \"\"), start, end: pos, line: startLine, col: start - startLineStart + 1 });\n continue;\n }\n\n // strings\n if (c === '\"' || c === \"'\") {\n const start = pos;\n const quote = c;\n pos++;\n let value = \"\";\n while (pos < len && source[pos] !== quote) {\n if (source[pos] === \"\\\\\") {\n const n = source[pos + 1];\n value += n === \"n\" ? \"\\n\" : n === \"t\" ? \"\\t\" : n === \"r\" ? \"\\r\" : n ?? \"\";\n pos += 2;\n } else {\n if (source[pos] === \"\\n\") {\n line++;\n lineStart = pos + 1;\n }\n value += source[pos];\n pos++;\n }\n }\n pos++; // closing quote\n tokens.push({ kind: T.String, text: value, start, end: pos, line, col: start - lineStart + 1 });\n continue;\n }\n\n // color hex\n if (c === \"#\" && HEX.test(source[pos + 1] ?? \"\")) {\n const start = pos;\n pos++;\n while (pos < len && HEX.test(source[pos])) pos++;\n push(T.Color, start);\n continue;\n }\n\n // token ref $name\n if (c === \"$\" && IDENT_START.test(source[pos + 1] ?? \"\")) {\n const start = pos;\n pos++;\n const nameStart = pos;\n while (pos < len && IDENT_PART.test(source[pos])) pos++;\n tokens.push({ kind: T.TokenRef, text: source.slice(start, pos), name: source.slice(nameStart, pos), start, end: pos, line, col: start - lineStart + 1 });\n continue;\n }\n\n // ::: before :\n if (c === \":\" && source[pos + 1] === \":\" && source[pos + 2] === \":\") {\n const start = pos;\n pos += 3;\n push(T.TripleColon, start);\n continue;\n }\n\n // edge operators (maximal munch)\n if (EDGE_START.has(c)) {\n const glyph = matchEdge(source, pos);\n if (glyph) {\n const start = pos;\n pos += glyph.length;\n push(T.EdgeOp, start);\n continue;\n }\n // '.' -> Dot; '=' -> Eq; others fall through\n if (c === \".\") {\n const start = pos;\n pos++;\n push(T.Dot, start);\n continue;\n }\n if (c === \"=\") {\n const start = pos;\n pos++;\n push(T.Eq, start);\n continue;\n }\n // '-' followed by digit => number (handled below); '<'/'~'/'-' alone => symbol\n if (c !== \"-\") {\n const start = pos;\n pos++;\n push(T.Symbol, start);\n continue;\n }\n }\n\n // number (optionally negative)\n if (DIGIT.test(c) || (c === \"-\" && DIGIT.test(source[pos + 1] ?? \"\"))) {\n const start = pos;\n if (c === \"-\") pos++;\n while (pos < len && DIGIT.test(source[pos])) pos++;\n if (source[pos] === \".\" && DIGIT.test(source[pos + 1] ?? \"\")) {\n pos++;\n while (pos < len && DIGIT.test(source[pos])) pos++;\n }\n const numText = source.slice(start, pos);\n const unit = matchUnit(source, pos);\n if (unit) pos += unit.length;\n tokens.push({ kind: T.Number, text: source.slice(start, pos), num: parseFloat(numText), unit: unit ?? null, start, end: pos, line, col: start - lineStart + 1 });\n continue;\n }\n\n // identifier (with internal-dash rule) / bool\n if (IDENT_START.test(c)) {\n const start = pos;\n pos++;\n while (pos < len) {\n const ch = source[pos];\n if (IDENT_PART.test(ch)) {\n pos++;\n } else if (ch === \"-\" && IDENT_PART.test(source[pos + 1] ?? \"\")) {\n pos++;\n } else {\n break;\n }\n }\n const text = source.slice(start, pos);\n const low = text.toLowerCase();\n if (low in BOOLS) {\n tokens.push({ kind: T.Bool, text, bool: BOOLS[low], start, end: pos, line, col: start - lineStart + 1 });\n } else {\n push(T.Ident, start);\n }\n continue;\n }\n\n // single-char punctuation\n const single: Record<string, T> = {\n \"@\": T.At,\n \"&\": T.Amp,\n \"|\": T.Pipe,\n \":\": T.Colon,\n \",\": T.Comma,\n \"/\": T.Slash,\n \"{\": T.LBrace,\n \"}\": T.RBrace,\n \"[\": T.LBracket,\n \"]\": T.RBracket,\n \"(\": T.LParen,\n \")\": T.RParen,\n };\n if (c in single) {\n const start = pos;\n pos++;\n push(single[c], start);\n continue;\n }\n\n // anything else -> permissive symbol (keeps lexing alive for raw sugar)\n {\n const start = pos;\n pos++;\n push(T.Symbol, start);\n }\n }\n\n tokens.push({ kind: T.EOF, text: \"\", start: pos, end: pos, line, col: col() });\n return tokens;\n}\n\nfunction matchEdge(source: string, pos: number): string | null {\n for (const g of EDGE_GLYPHS) {\n if (source.startsWith(g, pos)) return g;\n }\n return null;\n}\n\nfunction matchUnit(source: string, pos: number): string | null {\n for (const u of UNITS) {\n if (source.startsWith(u, pos)) {\n const after = source[pos + u.length] ?? \"\";\n // a letter-unit must end at a non-identifier boundary; '%' always ok\n if (u === \"%\" || !IDENT_PART.test(after)) return u;\n }\n }\n return null;\n}\n","/**\n * Recursive-descent parser for the EDodoDraw DSL.\n *\n * Strategy (spec §12.1): keyword-dispatched, LL(2). Two lookahead spots need\n * care: node-vs-edge (§12.3) and brace-role D1 (§12.4). Shape sugar (`[Label]`,\n * `((Label))`, `{Label}` …) is captured RAW from the source by offset, so the\n * permissive lexer never has to understand label contents.\n *\n * Errors are recovered at statement/block boundaries and accumulated; the\n * parser returns a best-effort AST plus a DiagnosticBag.\n */\n\nimport { DiagnosticBag } from \"./diagnostics.js\";\nimport { lex } from \"./lexer.js\";\nimport { SHAPE_KEYWORDS, T, type Token } from \"./tokens.js\";\nimport type {\n AnchorDecl,\n AnchorSpecAst,\n AnnotateDecl,\n AnnotationCmd,\n Attr,\n AttrBlock,\n BeatDecl,\n BeatItem,\n CameraStmt,\n DefaultsDecl,\n EdgeDecl,\n EdgeOpInfo,\n Endpoint,\n GroupDecl,\n LayoutDecl,\n MermaidDecl,\n MetaDecl,\n NodeDecl,\n OverridesDecl,\n Program,\n Prop,\n RevealBlock,\n RevealCmd,\n SceneDecl,\n SceneStmt,\n Span,\n StaggerStmt,\n StyleDecl,\n ThemeDecl,\n TimelineDecl,\n TopStmt,\n UseStmt,\n Value,\n} from \"./ast.js\";\n\nconst SUGAR: Array<{ open: string; close: string; shape: string }> = [\n { open: \"((\", close: \"))\", shape: \"circle\" },\n { open: \"([\", close: \"])\", shape: \"pill\" },\n { open: \"[[\", close: \"]]\", shape: \"rectangle\" },\n { open: \"[(\", close: \")]\", shape: \"cylinder\" },\n { open: \"[/\", close: \"/]\", shape: \"parallelogram\" },\n { open: \"[/\", close: \"\\\\]\", shape: \"trapezoid\" },\n { open: \"[\\\\\", close: \"/]\", shape: \"trapezoid\" },\n { open: \"[\\\\\", close: \"\\\\]\", shape: \"parallelogram\" },\n { open: \"{{\", close: \"}}\", shape: \"hexagon\" },\n { open: \"[\", close: \"]\", shape: \"rectangle\" },\n { open: \"(\", close: \")\", shape: \"round-rectangle\" },\n { open: \"{\", close: \"}\", shape: \"diamond\" },\n];\n\nexport interface ParseResult {\n program: Program;\n diagnostics: DiagnosticBag;\n}\n\nexport function parse(source: string): ParseResult {\n const p = new Parser(source);\n const program = p.parseProgram();\n return { program, diagnostics: p.diags };\n}\n\nclass Parser {\n toks: Token[];\n i = 0;\n source: string;\n diags = new DiagnosticBag();\n\n constructor(source: string) {\n this.source = source;\n this.toks = lex(source);\n }\n\n // ---- cursor -------------------------------------------------------------\n private cur(): Token {\n return this.toks[this.i];\n }\n private peek(n = 1): Token {\n return this.toks[Math.min(this.i + n, this.toks.length - 1)];\n }\n private is(kind: T): boolean {\n return this.cur().kind === kind;\n }\n private isKw(text: string): boolean {\n const t = this.cur();\n return t.kind === T.Ident && t.text === text;\n }\n private advance(): Token {\n const t = this.toks[this.i];\n if (this.i < this.toks.length - 1) this.i++;\n return t;\n }\n private eat(kind: T): Token | null {\n if (this.is(kind)) return this.advance();\n return null;\n }\n private atEnd(): boolean {\n return this.is(T.EOF);\n }\n private spanFrom(t: Token): Span {\n const end = this.toks[Math.max(0, this.i - 1)];\n return { start: t.start, end: end.end, line: t.line, col: t.col };\n }\n private tokSpan(t: Token): Span {\n return { start: t.start, end: t.end, line: t.line, col: t.col };\n }\n\n /** consume newline/semi/comma separators (commas are interchangeable). */\n private skipSeps(): void {\n while (this.is(T.Newline) || this.is(T.Semi) || this.is(T.Comma)) this.advance();\n }\n private isSep(): boolean {\n return this.is(T.Newline) || this.is(T.Semi) || this.is(T.EOF) || this.is(T.RBrace);\n }\n\n /** move cursor to the first token whose start offset >= off (for raw sugar). */\n private seekOffset(off: number): void {\n while (this.i < this.toks.length - 1 && this.cur().start < off) this.i++;\n }\n\n private error(code: string, message: string, at: Token, extra?: { expected?: string; hint?: string }): void {\n this.diags.error(code, message, this.tokSpan(at), { found: at.text || at.kind, ...extra });\n }\n\n /** skip to the next SEP for statement-level recovery. */\n private recoverStmt(): void {\n let depth = 0;\n while (!this.atEnd()) {\n const k = this.cur().kind;\n if (depth === 0 && (k === T.Newline || k === T.Semi)) {\n return;\n }\n if (k === T.LBrace || k === T.LBracket || k === T.LParen) depth++;\n if (k === T.RBrace || k === T.RBracket || k === T.RParen) {\n if (depth === 0) return;\n depth--;\n }\n this.advance();\n }\n }\n\n /** consume a balanced { ... } block for block-level recovery. */\n private skipBlock(): void {\n if (!this.eat(T.LBrace)) return;\n let depth = 1;\n while (!this.atEnd() && depth > 0) {\n const k = this.advance().kind;\n if (k === T.LBrace) depth++;\n else if (k === T.RBrace) depth--;\n }\n }\n\n // ---- program ------------------------------------------------------------\n parseProgram(): Program {\n const statements: TopStmt[] = [];\n this.skipSeps();\n while (!this.atEnd()) {\n const before = this.i;\n const stmt = this.parseTop();\n if (stmt) statements.push(stmt);\n if (this.i === before) this.advance(); // guarantee progress\n this.skipSeps();\n }\n return { type: \"program\", statements };\n }\n\n private parseTop(): TopStmt | null {\n const t = this.cur();\n if (t.kind === T.Ident) {\n switch (t.text) {\n case \"edd\":\n return this.parseVersion();\n case \"meta\":\n return this.parseMeta();\n case \"import\":\n return this.parseImport();\n case \"theme\":\n return this.parseTheme();\n case \"style\":\n return this.parseStyle();\n case \"defaults\":\n return this.parseDefaults();\n case \"scene\":\n return this.parseScene();\n case \"timeline\":\n return this.parseTimeline();\n case \"annotate\":\n return this.parseAnnotate();\n case \"mermaid\":\n return this.parseMermaid();\n case \"overrides\":\n return this.parseOverrides();\n case \"plugin\":\n case \"define\":\n // parsed-but-ignored for now: skip its block/line\n this.advance();\n if (this.is(T.String)) this.advance();\n if (this.is(T.LBrace)) this.skipBlock();\n else this.recoverStmt();\n return null;\n }\n }\n // Unknown top-level construct: report once and recover.\n this.error(\"E-TOP\", `unexpected '${t.text || t.kind}' at top level`, t, {\n expected: \"meta | theme | style | defaults | scene | timeline | annotate | mermaid\",\n hint: \"structure lives inside a `scene { … }` block\",\n });\n this.recoverStmt();\n return null;\n }\n\n private parseVersion(): TopStmt {\n const t = this.advance(); // edd\n const num = this.eat(T.Number);\n return { type: \"version\", value: num?.num ?? 1, span: this.spanFrom(t) };\n }\n\n private parseImport(): TopStmt {\n const t = this.advance(); // import\n const path = this.eat(T.String)?.text ?? \"\";\n let as: string | undefined;\n if (this.isKw(\"as\")) {\n this.advance();\n as = this.eat(T.Ident)?.text;\n }\n return { type: \"import\", path, as, span: this.spanFrom(t) };\n }\n\n private parseMeta(): MetaDecl {\n const t = this.advance(); // meta\n const attrs = this.parseAttrBlock();\n return { type: \"meta\", attrs, span: this.spanFrom(t) };\n }\n\n private parseMermaid(): MermaidDecl {\n const t = this.advance(); // mermaid\n const raw = this.eat(T.Raw);\n return { type: \"mermaid\", body: raw?.text ?? \"\", span: this.spanFrom(t) };\n }\n\n /** `overrides { id at (x,y) [size (w,h)]; … }` — machine-managed positions. */\n private parseOverrides(): OverridesDecl {\n const t = this.advance(); // overrides\n const entries: OverridesDecl[\"entries\"] = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const id = this.eat(T.Ident)?.text;\n if (id) {\n if (this.is(T.Colon)) this.advance();\n else if (this.isKw(\"at\")) this.advance();\n const pos = this.parseValue();\n let x = 0;\n let y = 0;\n let w: number | undefined;\n let h: number | undefined;\n if (pos.t === \"tuple\" && pos.v[0]?.t === \"num\" && pos.v[1]?.t === \"num\") {\n x = pos.v[0].v;\n y = pos.v[1].v;\n }\n if (this.isKw(\"size\")) {\n this.advance();\n const s = this.parseValue();\n if (s.t === \"tuple\" && s.v[0]?.t === \"num\" && s.v[1]?.t === \"num\") {\n w = s.v[0].v;\n h = s.v[1].v;\n }\n }\n entries.push({ id, x, y, w, h });\n } else {\n this.advance();\n }\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"overrides\", entries, span: this.spanFrom(t) };\n }\n\n private parseTheme(): ThemeDecl {\n const t = this.advance(); // theme\n const name = this.eat(T.Ident)?.text ?? \"theme\";\n let ext: string | undefined;\n if (this.isKw(\"extends\")) {\n this.advance();\n ext = this.eat(T.Ident)?.text;\n }\n const tokens: { name: string; value: Value }[] = [];\n const props: AttrBlock = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n if (this.isKw(\"tokens\")) {\n this.advance();\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n if (this.cur().kind === T.TokenRef) {\n const tk = this.advance();\n this.eat(T.Colon);\n tokens.push({ name: tk.name ?? tk.text.slice(1), value: this.parseValue() });\n } else {\n this.advance();\n }\n while (this.is(T.Comma) || this.is(T.Newline) || this.is(T.Semi)) this.advance();\n }\n this.eat(T.RBrace);\n } else if (this.cur().kind === T.TokenRef) {\n const tk = this.advance();\n this.eat(T.Colon);\n tokens.push({ name: tk.name ?? tk.text.slice(1), value: this.parseValue() });\n } else {\n const a = this.parseAttrEntry();\n if (a) props.push(a);\n }\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"theme\", name, extends: ext, tokens, props, span: this.spanFrom(t) };\n }\n\n private parseStyle(): StyleDecl {\n const t = this.advance(); // style\n // class name: `.name` or `name`\n let name = \"\";\n if (this.is(T.Dot)) {\n this.advance();\n name = this.eat(T.Ident)?.text ?? \"\";\n } else {\n name = this.eat(T.Ident)?.text ?? \"\";\n }\n let ext: string | undefined;\n if (this.isKw(\"extends\")) {\n this.advance();\n if (this.is(T.Dot)) this.advance();\n ext = this.eat(T.Ident)?.text;\n }\n const attrs = this.is(T.LBrace) ? this.parseAttrBlock() : [];\n return { type: \"style\", name, extends: ext, attrs, span: this.spanFrom(t) };\n }\n\n private parseDefaults(): DefaultsDecl {\n const t = this.advance(); // defaults\n const rules: { target: string; attrs: AttrBlock }[] = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const target = this.eat(T.Ident)?.text ?? \"node\";\n const attrs = this.is(T.LBrace) ? this.parseAttrBlock() : [];\n rules.push({ target, attrs });\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"defaults\", rules, span: this.spanFrom(t) };\n }\n\n private parseAnnotate(): AnnotateDecl {\n const t = this.advance(); // annotate\n const name = this.is(T.String) ? this.advance().text : undefined;\n const commands: AnnotationCmd[] = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const cmd = this.parseAnnotationCmd();\n if (cmd) commands.push(cmd);\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"annotate\", name, commands, span: this.spanFrom(t) };\n }\n\n // ---- scene --------------------------------------------------------------\n private parseScene(): SceneDecl {\n const t = this.advance(); // scene\n const name = this.is(T.Ident) && !this.is(T.LBrace) ? this.maybeSceneName() : undefined;\n const statements: SceneStmt[] = [];\n const braceOpen = this.cur().start;\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const before = this.i;\n const stmt = this.parseSceneStmt();\n if (stmt) statements.push(stmt);\n if (this.i === before) this.advance();\n this.skipSeps();\n }\n const closeTok = this.cur();\n this.eat(T.RBrace);\n return { type: \"scene\", name, statements, span: this.spanFrom(t), braceOpen, braceClose: closeTok.start };\n }\n\n private maybeSceneName(): string | undefined {\n // scene name only if an ident directly precedes the '{'\n if (this.is(T.Ident) && this.peek().kind === T.LBrace) return this.advance().text;\n return undefined;\n }\n\n private parseSceneStmt(): SceneStmt | null {\n const t = this.cur();\n if (t.kind === T.Ident) {\n switch (t.text) {\n case \"layout\":\n return this.parseLayout();\n case \"group\":\n case \"container\":\n return this.parseGroup();\n case \"anchor\":\n return this.parseAnchorStmt();\n case \"use\":\n return this.parseUse();\n case \"style\":\n return this.parseStyle();\n case \"annotate\":\n return this.parseAnnotate();\n case \"mermaid\":\n return this.parseMermaid();\n case \"node\":\n return this.parseExplicitNode();\n }\n // shape-keyword-led node: `cylinder db \"Postgres\"` — only if next is an id\n if (SHAPE_KEYWORDS.has(t.text) && this.peek().kind === T.Ident) {\n return this.parseKeywordNode();\n }\n }\n // otherwise: id-led node or edge (disambiguate)\n return this.parseNodeOrEdge();\n }\n\n private parseLayout(): LayoutDecl {\n const t = this.advance(); // layout\n const kind = this.eat(T.Ident)?.text ?? \"dag\";\n const attrs = this.is(T.LBrace) ? this.parseAttrBlock() : [];\n return { type: \"layout\", kind, attrs, span: this.spanFrom(t) };\n }\n\n private parseUse(): UseStmt {\n const t = this.advance(); // use\n if (this.isKw(\"theme\")) {\n this.advance();\n const name = this.eat(T.Ident)?.text ?? \"\";\n return { type: \"use\", what: \"theme\", name, span: this.spanFrom(t) };\n }\n if (this.is(T.Dot)) {\n this.advance();\n const name = this.eat(T.Ident)?.text ?? \"\";\n return { type: \"use\", what: \"class\", name, span: this.spanFrom(t) };\n }\n const name = this.eat(T.Ident)?.text ?? \"\";\n let args: Value[] | undefined;\n if (this.is(T.LParen)) args = this.parseArgList();\n return { type: \"use\", what: args ? \"macro\" : \"class\", name, args, span: this.spanFrom(t) };\n }\n\n private parseAnchorStmt(): AnchorDecl {\n const t = this.advance(); // anchor\n const name = this.eat(T.Ident)?.text ?? \"\";\n let on: string | undefined;\n if (this.isKw(\"on\")) {\n this.advance();\n on = this.eat(T.Ident)?.text;\n }\n let spec: AnchorSpecAst = { kind: \"cardinal\", v: \"c\" };\n if (this.isKw(\"at\")) {\n this.advance();\n spec = this.parseAnchorSpec();\n }\n return { type: \"anchor\", name, on, spec, span: this.spanFrom(t) };\n }\n\n private parseAnchorSpec(): AnchorSpecAst {\n if (this.is(T.At)) {\n this.advance();\n this.eat(T.LParen);\n const u = this.eat(T.Number)?.num ?? 0;\n this.eat(T.Comma);\n const v = this.eat(T.Number)?.num ?? 0;\n this.eat(T.RParen);\n return { kind: \"uv\", u, v };\n }\n const word = this.eat(T.Ident)?.text ?? \"c\";\n if (this.is(T.Colon)) {\n this.advance();\n const num = this.eat(T.Number);\n const raw = num?.num ?? 50;\n const frac = num?.unit === \"%\" ? raw / 100 : raw > 1 ? raw / 100 : raw;\n return { kind: \"side\", side: word, frac };\n }\n return { kind: \"cardinal\", v: word };\n }\n\n // keyword node: SHAPE_KW id [\"label\"] {:::cls} [attrs]\n private parseKeywordNode(): NodeDecl {\n const t = this.advance(); // shape kw\n const shape = t.text;\n const id = this.eat(T.Ident)?.text ?? \"\";\n return this.finishNode(t, id, shape, undefined);\n }\n\n // explicit: node id [\"label\"] [as shape] {:::cls} [attrs]\n private parseExplicitNode(): NodeDecl {\n const t = this.advance(); // node\n const id = this.eat(T.Ident)?.text ?? \"\";\n let label: string | undefined;\n if (this.is(T.String)) label = this.advance().text;\n let shape: string | undefined;\n if (this.isKw(\"as\")) {\n this.advance();\n shape = this.eat(T.Ident)?.text;\n if (shape === \"custom\" && this.is(T.LParen)) {\n const args = this.parseArgList();\n const s = args[0];\n shape = s && s.t === \"str\" ? `custom:${s.v}` : \"custom\";\n }\n }\n return this.finishNode(t, id, shape, label);\n }\n\n private finishNode(t: Token, id: string, shape: string | undefined, label: string | undefined): NodeDecl {\n if (label === undefined && this.is(T.String)) label = this.advance().text;\n const classes: string[] = [];\n // shape sugar right after id (only for id-led — keyword/explicit rarely use it)\n if (shape === undefined) {\n const sug = this.tryCaptureSugar();\n if (sug) {\n shape = sug.shape;\n if (label === undefined && sug.label) label = sug.label;\n }\n }\n while (this.is(T.TripleColon)) {\n this.advance();\n const cls = this.eat(T.Ident)?.text;\n if (cls) classes.push(cls);\n }\n if (label === undefined && this.is(T.String)) label = this.advance().text;\n const anchors: AnchorDecl[] = [];\n let attrs: AttrBlock = [];\n let attrOpen: number | undefined;\n let attrClose: number | undefined;\n if (this.is(T.LBrace)) {\n const block = this.parseNodeBlock();\n attrs = block.attrs;\n anchors.push(...block.anchors);\n attrOpen = block.attrOpen;\n attrClose = block.attrClose;\n if (block.diamondLabel !== undefined) {\n shape = shape ?? block.diamondShape ?? \"diamond\";\n if (label === undefined) label = block.diamondLabel;\n // brace sugar (`{Label}` / `{{Label}}`) may be followed by an\n // attribute block: `gw{{API Gateway}} { fill: violet }`.\n if (this.is(T.LBrace)) {\n const attrBlock = this.parseNodeBlock();\n attrs = attrBlock.attrs;\n anchors.push(...attrBlock.anchors);\n attrOpen = attrBlock.attrOpen;\n attrClose = attrBlock.attrClose;\n }\n }\n }\n return { type: \"node\", id, label, shape, classes, attrs, anchors, span: this.spanFrom(t), attrOpen, attrClose };\n }\n\n /** Parse `{ ... }` after a node: could be attr-block OR a diamond label (D1). */\n private parseNodeBlock(): { attrs: AttrBlock; anchors: AnchorDecl[]; diamondLabel?: string; diamondShape?: string; attrOpen?: number; attrClose?: number } {\n if (this.braceIsAttr()) {\n const anchors: AnchorDecl[] = [];\n const attrs: AttrBlock = [];\n const attrOpen = this.cur().start;\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n if (this.isKw(\"anchor\")) {\n const a = this.parseAnchorStmt();\n anchors.push(a);\n } else if (this.isKw(\"use\")) {\n const u = this.parseUse();\n // represent `use .class` inside node as a synthetic attr for the cascade\n attrs.push({ key: \"__use\", value: { t: \"class\", v: u.name }, span: u.span });\n } else {\n const a = this.parseAttrEntry();\n if (a) attrs.push(a);\n }\n this.skipSeps();\n }\n const closeTok = this.cur();\n this.eat(T.RBrace);\n return { attrs, anchors, attrOpen, attrClose: closeTok.end };\n }\n // brace sugar ({Label} diamond, {{Label}} hexagon): raw-capture to close\n const open = this.cur();\n const cap = this.captureSugarAt(open.start);\n if (cap) {\n this.seekOffset(cap.end);\n return { attrs: [], anchors: [], diamondLabel: cap.label, diamondShape: cap.shape };\n }\n // fallback: treat as empty attr block\n this.skipBlock();\n return { attrs: [], anchors: [] };\n }\n\n /** D1: does the `{` at cursor open an attribute block (vs a diamond label)? */\n private braceIsAttr(): boolean {\n // peek past the '{' and separators\n let j = this.i + 1;\n while (j < this.toks.length && (this.toks[j].kind === T.Newline || this.toks[j].kind === T.Semi)) j++;\n const a = this.toks[j];\n if (!a) return true;\n if (a.kind === T.RBrace) return true; // empty -> attr\n if (a.kind === T.Ident) {\n // keyword-led (use/anchor) or `ident:` / `ident=` -> attr\n if (a.text === \"use\" || a.text === \"anchor\") return true;\n const b = this.toks[j + 1];\n if (b && (b.kind === T.Colon || b.kind === T.Eq)) return true;\n }\n if (a.kind === T.TokenRef) return true;\n return false;\n }\n\n // ---- node vs edge -------------------------------------------------------\n private parseNodeOrEdge(): SceneStmt | null {\n // optional `edge id:` prefix\n let edgeId: string | undefined;\n if (this.isKw(\"edge\")) {\n this.advance();\n edgeId = this.eat(T.Ident)?.text;\n this.eat(T.Colon);\n }\n\n const t = this.cur();\n if (t.kind !== T.Ident) {\n this.error(\"E-STMT\", `unexpected '${t.text || t.kind}'`, t, { hint: \"expected a node id, shape keyword, or statement keyword\" });\n this.recoverStmt();\n return null;\n }\n\n const first = this.parseEndpointGroup();\n\n // edge?\n if (this.is(T.EdgeOp)) {\n return this.parseEdgeRest(t, edgeId, first);\n }\n\n if (edgeId !== undefined) {\n // `edge id:` must be followed by an edge\n this.error(\"E-EDGE-NOOP\", \"expected an edge operator after 'edge' declaration\", this.cur(), { expected: \"-> | --> | -.-> | ==> | ~> | -- | <->\" });\n }\n\n // Node declaration (single endpoint, no fan). The endpoint may already hold\n // shape sugar (parseEndpoint captured it) — carry it into the node.\n const ep = first[0];\n // gather :::classes\n const classes: string[] = [];\n while (this.is(T.TripleColon)) {\n this.advance();\n const cls = this.eat(T.Ident)?.text;\n if (cls) classes.push(cls);\n }\n // bare `id:::class` (no sugar, no attrs) => classapply (re-tagging an id)\n const hasMore = this.is(T.String) || this.is(T.LBrace);\n if (!ep.inline && !hasMore && classes.length > 0) {\n return { type: \"classapply\", id: ep.id, classes, span: this.spanFrom(t) };\n }\n const nd = this.finishNode(t, ep.id, ep.inline?.shape, ep.inline?.label);\n nd.classes.unshift(...classes);\n return nd;\n }\n\n private parseEndpointGroup(): Endpoint[] {\n const list = [this.parseEndpoint()];\n while (this.is(T.Amp)) {\n this.advance();\n list.push(this.parseEndpoint());\n }\n return list;\n }\n\n private parseEndpoint(): Endpoint {\n const t = this.cur();\n const id = this.eat(T.Ident)?.text ?? \"\";\n let sub: string | undefined;\n let uv: [number, number] | undefined;\n let inline: NodeDecl | undefined;\n // inline bracket sugar: `b[Label]`, `b([Label])`, `b((Label))` …\n const sug = this.tryCaptureSugar();\n if (sug) {\n inline = { type: \"node\", id, label: sug.label, shape: sug.shape, classes: [], attrs: [], anchors: [], span: this.tokSpan(t) };\n } else if (this.is(T.LBrace) && !this.braceIsAttr()) {\n // inline brace sugar: `b{Decision}` (diamond) / `b{{Gateway}}` (hexagon).\n // Only when the `{` is NOT an attribute block (D1), so edge attr blocks\n // like `a -> b { color: red }` are still left for the edge to consume.\n const cap = this.captureSugarAt(this.cur().start);\n if (cap) {\n this.seekOffset(cap.end);\n inline = { type: \"node\", id, label: cap.label, shape: cap.shape, classes: [], attrs: [], anchors: [], span: this.tokSpan(t) };\n }\n }\n if (this.is(T.Dot)) {\n this.advance();\n sub = this.eat(T.Ident)?.text;\n // side-fraction / angle anchors: `.top:0.3`, `.right:0.75`, `.angle:45`\n if (sub && this.is(T.Colon)) {\n this.advance();\n const n = this.eat(T.Number);\n if (n) sub = `${sub}:${n.num}`;\n }\n }\n if (this.is(T.At)) {\n this.advance();\n this.eat(T.LParen);\n const u = this.eat(T.Number)?.num ?? 0;\n this.eat(T.Comma);\n const v = this.eat(T.Number)?.num ?? 0;\n this.eat(T.RParen);\n uv = [u, v];\n }\n return { id, sub, uv, inline, span: this.tokSpan(t) };\n }\n\n private parseEdgeRest(t: Token, edgeId: string | undefined, first: Endpoint[]): EdgeDecl {\n const groups: Endpoint[][] = [first];\n const ops: EdgeOpInfo[] = [];\n while (this.is(T.EdgeOp)) {\n const glyph = this.advance().text;\n let midLabel: string | undefined;\n if (this.is(T.Pipe)) {\n midLabel = this.readPipeLabel();\n }\n const g = this.parseEndpointGroup();\n groups.push(g);\n ops.push({ glyph, midLabel });\n }\n let label: string | undefined;\n if (this.is(T.String)) label = this.advance().text;\n const attrs = this.is(T.LBrace) ? this.parseAttrBlock() : [];\n return { type: \"edge\", id: edgeId, groups, ops, label, attrs, span: this.spanFrom(t) };\n }\n\n private readPipeLabel(): string {\n // cur is Pipe; capture raw source until next Pipe\n const open = this.advance(); // first pipe\n const start = open.end;\n let end = start;\n while (this.i < this.toks.length && !this.is(T.Pipe) && !this.atEnd()) {\n end = this.cur().end;\n this.advance();\n }\n this.eat(T.Pipe);\n return this.source.slice(start, end).trim();\n }\n\n // ---- groups -------------------------------------------------------------\n private parseGroup(): GroupDecl {\n const t = this.advance(); // group|container\n const id = this.eat(T.Ident)?.text ?? \"\";\n let label: string | undefined;\n if (this.is(T.String)) label = this.advance().text;\n const attrs: AttrBlock = [];\n let layout: LayoutDecl | undefined;\n const items: SceneStmt[] = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const before = this.i;\n if (this.isKw(\"layout\")) {\n layout = this.parseLayout();\n } else if (this.cur().kind === T.Ident && this.peek().kind === T.Colon && !SHAPE_KEYWORDS.has(this.cur().text)) {\n // group-level property like `fill: $surface`\n const a = this.parseAttrEntry();\n if (a) attrs.push(a);\n } else {\n const stmt = this.parseSceneStmt();\n if (stmt) items.push(stmt);\n }\n if (this.i === before) this.advance();\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"group\", id, label, attrs, layout, items, span: this.spanFrom(t) };\n }\n\n // ---- timeline -----------------------------------------------------------\n private parseTimeline(): TimelineDecl {\n const t = this.advance(); // timeline\n const name = this.is(T.Ident) && this.peek().kind === T.LBrace ? this.advance().text : undefined;\n const props: Prop[] = [];\n const beats: BeatDecl[] = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const before = this.i;\n if (this.isKw(\"beat\") || this.isKw(\"step\")) {\n beats.push(this.parseBeat());\n } else if (this.cur().kind === T.Ident && this.peek().kind === T.Colon) {\n const a = this.parseAttrEntry();\n if (a) props.push({ type: \"prop\", key: a.key, value: a.value, span: a.span });\n } else {\n this.recoverStmt();\n }\n if (this.i === before) this.advance();\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"timeline\", name, props, beats, span: this.spanFrom(t) };\n }\n\n private parseBeat(): BeatDecl {\n const t = this.advance(); // beat|step\n const id = this.eat(T.Ident)?.text ?? `beat_${t.line}`;\n const title = this.is(T.String) ? this.advance().text : undefined;\n const items: BeatItem[] = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const before = this.i;\n const item = this.parseBeatItem();\n if (item) items.push(item);\n if (this.i === before) this.advance();\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"beat\", id, title, items, span: this.spanFrom(t) };\n }\n\n private parseBeatItem(): BeatItem | null {\n const t = this.cur();\n if (t.kind === T.Ident) {\n switch (t.text) {\n case \"camera\":\n return this.parseCamera();\n case \"reveal\":\n return this.parseReveal();\n case \"annotate\":\n return this.parseAnnotate();\n case \"stagger\":\n return this.parseStagger();\n }\n // property? `key: value`\n if (this.peek().kind === T.Colon) {\n const a = this.parseAttrEntry();\n if (a) return { type: \"prop\", key: a.key, value: a.value, span: a.span };\n return null;\n }\n // bare annotation or reveal command\n if (ANNOT_KINDS.has(t.text)) return this.parseAnnotationCmd();\n if (REVEAL_VERBS.has(t.text)) return this.parseRevealCmd();\n }\n this.error(\"E-BEAT\", `unexpected '${t.text || t.kind}' in beat`, t, {\n hint: \"expected camera | reveal | annotate | stagger | narrate: … | a command\",\n });\n this.recoverStmt();\n return null;\n }\n\n private parseCamera(): CameraStmt {\n const t = this.advance(); // camera\n const cam: CameraStmt = { type: \"camera\", attrs: [], span: this.spanFrom(t) };\n // block form: camera { focus: …, zoom: … }\n if (this.is(T.LBrace)) {\n cam.attrs = this.parseAttrBlock();\n this.applyCameraAttrs(cam);\n cam.span = this.spanFrom(t);\n return cam;\n }\n // inline form: camera <op> [targets] [zoom N] [over D] [ease E] [pad N] [pan (x,y)]\n if (this.is(T.Ident)) {\n cam.op = this.advance().text;\n // ops whose argument follows the op word directly: `camera zoom 1.3`,\n // `camera pan (x,y)`, `camera pan to (x,y)`.\n if (cam.op === \"zoom\" && this.is(T.Number)) {\n cam.zoom = this.advance().num;\n } else if (cam.op === \"pan\") {\n if (this.isKw(\"to\") || this.isKw(\"by\")) this.advance();\n if (this.is(T.LParen)) {\n const v = this.parseValue();\n if (v.t === \"tuple\" && v.v.length >= 2 && v.v[0].t === \"num\" && v.v[1].t === \"num\") {\n cam.pan = [v.v[0].v, v.v[1].v];\n }\n }\n }\n }\n // optional targets (ident / ref / list) unless the next word is a modifier\n if (this.canStartCameraTarget()) {\n cam.targets = [this.parseValue()];\n }\n // modifiers\n while (this.is(T.Ident) || this.is(T.LBrace)) {\n if (this.is(T.LBrace)) {\n const block = this.parseAttrBlock();\n cam.attrs.push(...block);\n this.applyCameraAttrs(cam);\n break;\n }\n const w = this.cur().text;\n if (w === \"zoom\") {\n this.advance();\n cam.zoom = this.eat(T.Number)?.num;\n } else if (w === \"over\" || w === \"duration\") {\n this.advance();\n cam.over = this.readDuration();\n } else if (w === \"ease\") {\n this.advance();\n cam.ease = this.parseValue();\n } else if (w === \"pad\") {\n this.advance();\n cam.pad = this.eat(T.Number)?.num;\n } else if (w === \"pan\") {\n this.advance();\n this.eat(T.Ident); // to|by (optional)\n const v = this.parseValue();\n if (v.t === \"tuple\" && v.v.length >= 2 && v.v[0].t === \"num\" && v.v[1].t === \"num\") {\n cam.pan = [v.v[0].v, v.v[1].v];\n }\n } else {\n break;\n }\n }\n cam.span = this.spanFrom(t);\n return cam;\n }\n\n private canStartCameraTarget(): boolean {\n if (this.is(T.LBracket)) return true;\n if (this.is(T.Dot)) return true;\n if (this.is(T.Ident)) {\n const w = this.cur().text;\n return ![\"zoom\", \"over\", \"ease\", \"pad\", \"pan\", \"duration\", \"tilt\"].includes(w);\n }\n return false;\n }\n\n private applyCameraAttrs(cam: CameraStmt): void {\n for (const a of cam.attrs) {\n switch (a.key) {\n case \"focus\":\n cam.op = \"focus\";\n cam.targets = [a.value];\n break;\n case \"fit\":\n cam.op = \"fit\";\n cam.targets = [a.value];\n break;\n case \"center\":\n cam.op = \"center\";\n cam.targets = [a.value];\n break;\n case \"zoom\":\n if (a.value.t === \"num\") cam.zoom = a.value.v;\n break;\n case \"pad\":\n if (a.value.t === \"num\") cam.pad = a.value.v;\n break;\n case \"duration\":\n case \"over\":\n if (a.value.t === \"num\") cam.over = a.value.unit === \"s\" ? a.value.v * 1000 : a.value.v;\n break;\n case \"ease\":\n cam.ease = a.value;\n break;\n case \"pan\":\n if (a.value.t === \"tuple\" && a.value.v[0]?.t === \"num\" && a.value.v[1]?.t === \"num\") {\n cam.pan = [a.value.v[0].v, a.value.v[1].v];\n }\n break;\n }\n }\n // A block that only sets zoom/pan (no focus/fit/center) IS a zoom/pan op —\n // otherwise it would default to fit-all and drop the value at runtime.\n if (!cam.op) {\n if (cam.pan) cam.op = \"pan\";\n else if (cam.zoom != null) cam.op = \"zoom\";\n }\n }\n\n private parseReveal(): RevealBlock {\n const t = this.advance(); // reveal\n const commands: RevealCmd[] = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const cmd = this.parseRevealCmd();\n if (cmd) commands.push(cmd);\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"reveal\", commands, span: this.spanFrom(t) };\n }\n\n private parseRevealCmd(): RevealCmd | null {\n const t = this.cur();\n const verb = this.eat(T.Ident)?.text ?? \"\";\n const targets: Value[] = [];\n // targets until 'with' / block / sep\n while (this.canStartValue() && !this.isKw(\"with\")) {\n targets.push(this.parseValue());\n if (this.is(T.Comma)) this.advance();\n else break;\n }\n let withEffect: string | undefined;\n if (this.isKw(\"with\")) {\n this.advance();\n withEffect = this.eat(T.Ident)?.text;\n }\n const attrs = this.is(T.LBrace) ? this.parseAttrBlock() : [];\n return { type: \"revealcmd\", verb, targets, with: withEffect, attrs, span: this.spanFrom(t) };\n }\n\n private parseStagger(): StaggerStmt {\n const t = this.advance(); // stagger\n const delayMs = this.readDuration();\n const commands: (RevealCmd | AnnotationCmd)[] = [];\n this.eat(T.LBrace);\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const w = this.cur().text;\n if (this.cur().kind === T.Ident && ANNOT_KINDS.has(w)) {\n const c = this.parseAnnotationCmd();\n if (c) commands.push(c);\n } else {\n const c = this.parseRevealCmd();\n if (c) commands.push(c);\n }\n this.skipSeps();\n }\n this.eat(T.RBrace);\n return { type: \"stagger\", delayMs, commands, span: this.spanFrom(t) };\n }\n\n private parseAnnotationCmd(): AnnotationCmd | null {\n const t = this.cur();\n const kind = this.eat(T.Ident)?.text ?? \"\";\n let target: Endpoint | undefined;\n let targetList: Value | undefined;\n if (this.is(T.LBracket)) {\n targetList = this.parseValue();\n } else if (this.is(T.Ident)) {\n target = this.parseEndpoint();\n }\n const text = this.is(T.String) ? this.advance().text : undefined;\n const attrs = this.is(T.LBrace) ? this.parseAttrBlock() : [];\n return { type: \"annotcmd\", kind, target, targetList, text, attrs, span: this.spanFrom(t) };\n }\n\n // ---- attributes & values ------------------------------------------------\n private parseAttrBlock(): AttrBlock {\n const attrs: AttrBlock = [];\n if (!this.eat(T.LBrace)) return attrs;\n this.skipSeps();\n while (!this.is(T.RBrace) && !this.atEnd()) {\n const a = this.parseAttrEntry();\n if (a) attrs.push(a);\n // separators between entries: comma or newline/semi\n while (this.is(T.Comma) || this.is(T.Newline) || this.is(T.Semi)) this.advance();\n }\n this.eat(T.RBrace);\n return attrs;\n }\n\n private parseAttrEntry(): Attr | null {\n const t = this.cur();\n if (t.kind !== T.Ident) {\n this.error(\"E-ATTR\", `expected attribute name, found '${t.text || t.kind}'`, t);\n this.recoverStmt();\n return null;\n }\n const key = this.advance().text;\n if (!this.eat(T.Colon)) this.eat(T.Eq); // accept ':' or '='\n const value = this.parseValue();\n return { key, value, span: this.spanFrom(t) };\n }\n\n private canStartValue(): boolean {\n switch (this.cur().kind) {\n case T.String:\n case T.Number:\n case T.Color:\n case T.Bool:\n case T.TokenRef:\n case T.Ident:\n case T.LParen:\n case T.LBracket:\n case T.Dot:\n return true;\n default:\n return false;\n }\n }\n\n private parseValue(): Value {\n const t = this.cur();\n switch (t.kind) {\n case T.String:\n this.advance();\n return { t: \"str\", v: t.text };\n case T.Number:\n this.advance();\n return { t: \"num\", v: t.num ?? 0, unit: t.unit ?? null };\n case T.Color:\n this.advance();\n return { t: \"color\", v: t.text };\n case T.Bool:\n this.advance();\n return { t: \"bool\", v: t.bool ?? false };\n case T.TokenRef:\n this.advance();\n return { t: \"token\", v: t.name ?? t.text.slice(1) };\n case T.Dot: {\n this.advance();\n const name = this.eat(T.Ident)?.text ?? \"\";\n return { t: \"class\", v: name };\n }\n case T.LParen:\n return this.parseTuple();\n case T.LBracket:\n return this.parseList();\n case T.Ident:\n return this.parseIdentValue();\n default:\n this.advance();\n return { t: \"ident\", v: t.text };\n }\n }\n\n private parseIdentValue(): Value {\n const t = this.advance();\n // func call: name(...)\n if (this.is(T.LParen)) {\n const args = this.parseArgList();\n return { t: \"call\", name: t.text, args };\n }\n // port ref: name.sub or name@(u,v)\n if (this.is(T.Dot) || this.is(T.At)) {\n let sub: string | undefined;\n let uv: [number, number] | undefined;\n if (this.is(T.Dot)) {\n this.advance();\n sub = this.eat(T.Ident)?.text;\n }\n if (this.is(T.At)) {\n this.advance();\n this.eat(T.LParen);\n const u = this.eat(T.Number)?.num ?? 0;\n this.eat(T.Comma);\n const v = this.eat(T.Number)?.num ?? 0;\n this.eat(T.RParen);\n uv = [u, v];\n }\n return { t: \"ref\", id: t.text, sub, uv };\n }\n // styled enum: `flow { speed: 1.2 }`\n if (this.is(T.LBrace)) {\n const block = this.parseAttrBlock();\n return { t: \"styled\", name: t.text, block };\n }\n return { t: \"ident\", v: t.text };\n }\n\n private parseTuple(): Value {\n this.eat(T.LParen);\n const vals: Value[] = [];\n this.skipSeps();\n while (!this.is(T.RParen) && !this.atEnd()) {\n vals.push(this.parseValue());\n while (this.is(T.Comma) || this.is(T.Newline)) this.advance();\n }\n this.eat(T.RParen);\n return { t: \"tuple\", v: vals };\n }\n\n private parseList(): Value {\n this.eat(T.LBracket);\n const vals: Value[] = [];\n this.skipSeps();\n while (!this.is(T.RBracket) && !this.atEnd()) {\n vals.push(this.parseValue());\n while (this.is(T.Comma) || this.is(T.Newline)) this.advance();\n }\n this.eat(T.RBracket);\n return { t: \"list\", v: vals };\n }\n\n private parseArgList(): Value[] {\n this.eat(T.LParen);\n const args: Value[] = [];\n this.skipSeps();\n while (!this.is(T.RParen) && !this.atEnd()) {\n // support named args `mass: 1` by flattening to value (drop name for now)\n if (this.cur().kind === T.Ident && this.peek().kind === T.Colon) {\n this.advance();\n this.advance();\n }\n args.push(this.parseValue());\n while (this.is(T.Comma) || this.is(T.Newline)) this.advance();\n }\n this.eat(T.RParen);\n return args;\n }\n\n private readDuration(): number {\n const n = this.eat(T.Number);\n if (!n) return 0;\n const val = n.num ?? 0;\n return n.unit === \"s\" ? val * 1000 : val;\n }\n\n // ---- shape sugar capture ------------------------------------------------\n private tryCaptureSugar(): { shape: string; label: string } | null {\n // only if cur token starts a sugar opener in the source\n const t = this.cur();\n if (t.kind !== T.LBracket && t.kind !== T.LParen) return null;\n const cap = this.captureSugarAt(t.start);\n if (!cap) return null;\n this.seekOffset(cap.end);\n return { shape: cap.shape, label: cap.label };\n }\n\n /** raw-capture mermaid shape sugar from source at `start`. */\n private captureSugarAt(start: number): { shape: string; label: string; end: number } | null {\n const src = this.source;\n for (const s of SUGAR) {\n if (src.startsWith(s.open, start)) {\n const bodyStart = start + s.open.length;\n const closeIdx = src.indexOf(s.close, bodyStart);\n if (closeIdx === -1) continue;\n // guard: don't let '[' greedily swallow a following '(' opener for '(['\n const label = src.slice(bodyStart, closeIdx).trim().replace(/^[\"']|[\"']$/g, \"\");\n return { shape: s.shape, label, end: closeIdx + s.close.length };\n }\n }\n return null;\n }\n}\n\nconst ANNOT_KINDS = new Set([\n \"highlight\", \"underline\", \"strike\", \"point-at\", \"spotlight\", \"callout\",\n \"label\", \"box\", \"circle-mark\", \"note-marker\", \"emphasize\", \"badge\",\n]);\n\nconst REVEAL_VERBS = new Set([\n \"show\", \"hide\", \"draw-on\", \"emphasize\", \"fade-in\", \"fade-out\", \"pop\", \"flow\",\n \"pulse\", \"move\", \"restyle\", \"add\", \"remove\",\n]);\n","/**\n * Source patcher — turns direct canvas edits into surgical edits of the `.edd`\n * source, so the code stays the single source of truth (you drag a node and\n * watch the code update). Uses the parser's AST spans to edit precisely and\n * leave the rest of the source untouched.\n *\n * - move / resize -> a machine-managed `overrides { … }` block (works for\n * every node: declared, auto-created from an edge, or Mermaid-imported)\n * - rename -> replace the node's label (or add a `label:` attr)\n * - restyle -> upsert `fill` / `stroke` / `shape` attrs on the decl\n * - add node/edge -> append a declaration to the scene block\n * - delete -> remove the node's decl, its edges, and its override\n */\n\nimport { parse } from \"./parser.js\";\nimport type { NodeDecl, Program, SceneDecl, SceneStmt } from \"./ast.js\";\n\nexport interface OverrideEntry {\n id: string;\n x: number;\n y: number;\n w?: number;\n h?: number;\n}\n\nconst r = (n: number) => Math.round(n);\n\n// ---- AST lookup -------------------------------------------------------------\n\nfunction firstScene(program: Program): SceneDecl | undefined {\n return program.statements.find((s): s is SceneDecl => s.type === \"scene\");\n}\n\nfunction walkNodes(stmts: SceneStmt[], visit: (n: NodeDecl) => void): void {\n for (const st of stmts) {\n if (st.type === \"node\") visit(st);\n else if (st.type === \"group\") walkNodes(st.items, visit);\n }\n}\n\nfunction findNodeDecl(program: Program, id: string): NodeDecl | undefined {\n let found: NodeDecl | undefined;\n for (const s of program.statements) {\n if (s.type === \"scene\") walkNodes(s.statements, (n) => { if (n.id === id && !found) found = n; });\n }\n return found;\n}\n\n// ---- string helpers ---------------------------------------------------------\n\nfunction splice(source: string, start: number, end: number, text: string): string {\n return source.slice(0, start) + text + source.slice(end);\n}\n\n/** Remove the whole line(s) a span covers (incl. trailing newline). */\nfunction removeLines(source: string, start: number, end: number): string {\n let ls = start;\n while (ls > 0 && source[ls - 1] !== \"\\n\") ls--;\n let le = end;\n while (le < source.length && source[le] !== \"\\n\") le++;\n if (le < source.length) le++; // include the newline\n return source.slice(0, ls) + source.slice(le);\n}\n\n// ---- overrides block --------------------------------------------------------\n\nfunction formatOverrides(entries: OverrideEntry[]): string {\n if (!entries.length) return \"\";\n const lines = entries\n .slice()\n .sort((a, b) => a.id.localeCompare(b.id))\n .map((e) => {\n const size = e.w != null && e.h != null ? ` size (${r(e.w)}, ${r(e.h)})` : \"\";\n return ` ${e.id} at (${r(e.x)}, ${r(e.y)})${size}`;\n });\n return `overrides {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\n/** Regenerate the `overrides { … }` block (replace, append, or remove). */\nexport function writeOverrides(source: string, entries: OverrideEntry[]): string {\n const { program } = parse(source);\n const existing = program.statements.find((s) => s.type === \"overrides\");\n const block = formatOverrides(entries);\n if (existing) {\n if (!block) {\n return removeLines(source, existing.span.start, existing.span.end).replace(/\\n{3,}/g, \"\\n\\n\");\n }\n return splice(source, existing.span.start, existing.span.end, block);\n }\n if (!block) return source;\n return source.replace(/\\s*$/, \"\") + \"\\n\\n\" + block + \"\\n\";\n}\n\n// ---- attribute upsert -------------------------------------------------------\n\ninterface AttrUpdate {\n key: string;\n value: string; // already-serialized .edd value text\n}\n\nfunction upsertAttrs(source: string, decl: NodeDecl, updates: AttrUpdate[]): string {\n if (!updates.length) return source;\n if (decl.attrOpen == null || decl.attrClose == null) {\n // no attr block -> create one after the declaration head\n const body = updates.map((u) => `${u.key}: ${u.value}`).join(\", \");\n return splice(source, decl.span.end, decl.span.end, ` { ${body} }`);\n }\n const edits: Array<{ start: number; end: number; text: string }> = [];\n const inserts: string[] = [];\n const realAttrs = decl.attrs.filter((a) => a.key !== \"__use\");\n const byKey = new Map(realAttrs.map((a) => [a.key, a]));\n for (const u of updates) {\n const ex = byKey.get(u.key);\n if (ex) edits.push({ start: ex.span.start, end: ex.span.end, text: `${u.key}: ${u.value}` });\n else inserts.push(`${u.key}: ${u.value}`);\n }\n if (inserts.length) {\n if (realAttrs.length) {\n // append right after the last existing attribute (clean \", \" separator,\n // no stray space before the comma from the block's trailing whitespace)\n const lastEnd = Math.max(...realAttrs.map((a) => a.span.end));\n edits.push({ start: lastEnd, end: lastEnd, text: `, ${inserts.join(\", \")}` });\n } else {\n // empty attr block `{ }` -> drop the new attrs just inside the braces\n const pos = decl.attrClose - 1; // just before the closing '}'\n edits.push({ start: pos, end: pos, text: `${inserts.join(\", \")} ` });\n }\n }\n edits.sort((a, b) => b.start - a.start);\n let out = source;\n for (const e of edits) out = splice(out, e.start, e.end, e.text);\n return out;\n}\n\n// ---- high-level ops ---------------------------------------------------------\n\n/** Rename a node (replace its label string, or add a `label:` attr / decl). */\nexport function renameNode(source: string, id: string, label: string): string {\n const { program } = parse(source);\n const decl = findNodeDecl(program, id);\n const quoted = `\"${label.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n if (!decl) return ensureNodeDecl(source, program, id, undefined, quoted, []);\n // replace the first quoted string inside the decl (the label), if any\n const declText = source.slice(decl.span.start, decl.span.end);\n const m = declText.match(/(['\"])(?:\\\\.|(?!\\1).)*\\1/);\n if (m && m.index != null) {\n const start = decl.span.start + m.index;\n return splice(source, start, start + m[0].length, quoted);\n }\n return upsertAttrs(source, decl, [{ key: \"label\", value: quoted }]);\n}\n\n/** Set fill / stroke / shape on a node (upsert attrs, or create a decl). */\nexport function styleNode(source: string, id: string, style: { fill?: string; stroke?: string; shape?: string }): string {\n const { program } = parse(source);\n const decl = findNodeDecl(program, id);\n const updates: AttrUpdate[] = [];\n if (style.fill !== undefined) updates.push({ key: \"fill\", value: style.fill });\n if (style.stroke !== undefined) updates.push({ key: \"stroke\", value: style.stroke });\n if (style.shape !== undefined) updates.push({ key: \"shape\", value: style.shape });\n if (!updates.length) return source;\n if (decl) return upsertAttrs(source, decl, updates);\n return ensureNodeDecl(source, program, id, undefined, undefined, updates);\n}\n\n/** Insert a new node declaration into the (first) scene block. */\nexport function addNode(source: string, node: { id: string; shape: string; label: string }): string {\n const { program } = parse(source);\n const decl = `${node.shape} ${node.id} \"${node.label.replace(/\"/g, '\\\\\"')}\"`;\n return insertIntoScene(source, program, decl);\n}\n\n/** Append an edge to the (first) scene block. */\nexport function addEdge(source: string, edge: { from: string; to: string; glyph?: string; label?: string }): string {\n const { program } = parse(source);\n const glyph = edge.glyph ?? \"-->\";\n const label = edge.label ? ` \"${edge.label.replace(/\"/g, '\\\\\"')}\"` : \"\";\n return insertIntoScene(source, program, `${edge.from} ${glyph} ${edge.to}${label}`);\n}\n\n/** Delete a node: remove its decl, any edges mentioning it, and its override. */\nexport function deleteElements(source: string, ids: string[]): string {\n let out = source;\n for (const id of ids) {\n const { program } = parse(out);\n const removals: Array<{ start: number; end: number }> = [];\n const decl = findNodeDecl(program, id);\n if (decl) removals.push({ start: decl.span.start, end: decl.span.end });\n for (const s of program.statements) {\n if (s.type !== \"scene\") continue;\n for (const st of s.statements) {\n if (st.type === \"edge\") {\n const mentions = st.groups.some((g) => g.some((ep) => ep.id === id));\n if (mentions) removals.push({ start: st.span.start, end: st.span.end });\n }\n }\n }\n // remove bottom-up so offsets stay valid\n removals.sort((a, b) => b.start - a.start);\n for (const rm of removals) out = removeLines(out, rm.start, rm.end);\n }\n // also drop the id(s) from the overrides block\n const { program } = parse(out);\n const ov = program.statements.find((s) => s.type === \"overrides\");\n if (ov && ov.type === \"overrides\") {\n const kept = ov.entries.filter((e) => !ids.includes(e.id));\n if (kept.length !== ov.entries.length) out = writeOverrides(out, kept);\n }\n return out.replace(/\\n{3,}/g, \"\\n\\n\");\n}\n\n// ---- shared insertion -------------------------------------------------------\n\nfunction insertIntoScene(source: string, program: Program, line: string): string {\n const scene = firstScene(program);\n if (scene && scene.braceClose != null) {\n // insert on its own line just before the scene's closing '}'\n let pos = scene.braceClose;\n // back up over trailing whitespace/newline before '}'\n while (pos > 0 && (source[pos - 1] === \" \" || source[pos - 1] === \"\\t\")) pos--;\n const indent = \" \";\n return splice(source, pos, pos, `${source[pos - 1] === \"\\n\" ? \"\" : \"\\n\"}${indent}${line}\\n`);\n }\n // no scene block -> create one at the end\n return source.replace(/\\s*$/, \"\") + `\\n\\nscene {\\n ${line}\\n}\\n`;\n}\n\n/** Ensure a node id has a declaration; patch or create it. */\nfunction ensureNodeDecl(\n source: string,\n program: Program,\n id: string,\n shape: string | undefined,\n quotedLabel: string | undefined,\n attrs: AttrUpdate[],\n): string {\n const decl = findNodeDecl(program, id);\n if (decl) {\n let out = source;\n if (quotedLabel) out = renameNode(out, id, quotedLabel.replace(/^\"|\"$/g, \"\"));\n if (attrs.length) {\n const rp = parse(out);\n const d2 = findNodeDecl(rp.program, id);\n if (d2) out = upsertAttrs(out, d2, attrs);\n }\n return out;\n }\n const head = `${shape ?? \"rect\"} ${id}${quotedLabel ? ` ${quotedLabel}` : \"\"}`;\n const attrText = attrs.length ? ` { ${attrs.map((a) => `${a.key}: ${a.value}`).join(\", \")} }` : \"\";\n return insertIntoScene(source, program, head + attrText);\n}\n","/**\n * EditController — direct manipulation of the rendered diagram (Excalidraw-like)\n * with every edit rounding back to the `.edd` source, so code stays the single\n * source of truth. Driven by the EdodoDraw facade, which routes pointer events\n * here when an edit tool is active.\n *\n * Tools: select (move/resize/rename/delete), hand (pan), rect/ellipse/diamond/\n * text (add nodes), arrow (connect nodes). Move/resize write an `overrides`\n * block; rename/style/add/delete surgically patch the source.\n */\n\nimport type { Point } from \"../geometry.js\";\nimport { rectCenter } from \"../geometry.js\";\nimport { addEdge, addNode, deleteElements, renameNode, styleNode, writeOverrides, type OverrideEntry } from \"../dsl/patch.js\";\nimport { hitTestNode } from \"../scene/query.js\";\nimport type { Scene, SceneNode } from \"../scene/types.js\";\nimport type { SvgRenderer } from \"../render/svgRenderer.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst HANDLE = 9; // handle box size (screen px)\nconst MIN = 24; // minimum node size\n\nexport type EditTool = \"select\" | \"hand\" | \"rect\" | \"ellipse\" | \"diamond\" | \"text\" | \"arrow\";\n\nexport interface EditState {\n tool: EditTool;\n selected: string | null;\n}\n\ntype HandleId = \"nw\" | \"n\" | \"ne\" | \"e\" | \"se\" | \"s\" | \"sw\" | \"w\";\n\ninterface Callbacks {\n getScene: () => Scene;\n getSource: () => string;\n onSource: (next: string) => void;\n onState: (s: EditState) => void;\n onRequestRename: (id: string, current: string, screen: Point) => void;\n}\n\nconst SHAPE_FOR: Record<string, string> = { rect: \"rect\", ellipse: \"ellipse\", diamond: \"diamond\", text: \"text\" };\nconst ID_PREFIX: Record<string, string> = { rect: \"box\", ellipse: \"oval\", diamond: \"dec\", text: \"txt\" };\n\nexport class EditController {\n private r: SvgRenderer;\n private cb: Callbacks;\n private overlay: SVGGElement;\n private tool: EditTool = \"select\";\n private selected: string | null = null;\n\n private drag:\n | null\n | { kind: \"move\"; id: string; startWorld: Point; orig: { x: number; y: number } }\n | { kind: \"resize\"; id: string; handle: HandleId; startWorld: Point; orig: { x: number; y: number; w: number; h: number } }\n | { kind: \"create\"; startWorld: Point; cur: Point }\n | { kind: \"connect\"; from: string; cur: Point } = null;\n\n constructor(renderer: SvgRenderer, cb: Callbacks) {\n this.r = renderer;\n this.cb = cb;\n this.overlay = document.createElementNS(SVG_NS, \"g\") as SVGGElement;\n this.overlay.setAttribute(\"class\", \"edd-edit-overlay\");\n renderer.screenLayer.appendChild(this.overlay);\n }\n\n setTool(t: EditTool): void {\n this.tool = t;\n if (t !== \"select\") this.selected = null;\n this.render();\n this.emit();\n }\n getTool(): EditTool {\n return this.tool;\n }\n getSelected(): string | null {\n return this.selected;\n }\n getSelectedNode(): SceneNode | null {\n const id = this.selected;\n return id ? this.cb.getScene().nodes.find((n) => n.id === id) ?? null : null;\n }\n clearSelection(): void {\n this.selected = null;\n this.render();\n this.emit();\n }\n\n private emit(): void {\n this.cb.onState({ tool: this.tool, selected: this.selected });\n }\n\n // ---- selection overlay (screen space, constant size) --------------------\n render(): void {\n this.overlay.replaceChildren();\n if (this.drag?.kind === \"create\") return this.drawCreatePreview();\n if (this.drag?.kind === \"connect\") return this.drawConnectPreview();\n const node = this.getSelectedNode();\n if (!node) return;\n const a = this.r.worldToScreen({ x: node.x, y: node.y });\n const b = this.r.worldToScreen({ x: node.x + node.w, y: node.y + node.h });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const w = Math.abs(b.x - a.x);\n const h = Math.abs(b.y - a.y);\n this.overlay.appendChild(this.rect(x - 2, y - 2, w + 4, h + 4, \"#6741d9\", \"none\", \"4 3\"));\n for (const [hid, p] of this.handlePoints(x, y, w, h)) {\n const hb = this.rect(p.x - HANDLE / 2, p.y - HANDLE / 2, HANDLE, HANDLE, \"#6741d9\", \"#ffffff\");\n hb.setAttribute(\"data-handle\", hid);\n this.overlay.appendChild(hb);\n }\n }\n\n private handlePoints(x: number, y: number, w: number, h: number): [HandleId, Point][] {\n return [\n [\"nw\", { x, y }],\n [\"n\", { x: x + w / 2, y }],\n [\"ne\", { x: x + w, y }],\n [\"e\", { x: x + w, y: y + h / 2 }],\n [\"se\", { x: x + w, y: y + h }],\n [\"s\", { x: x + w / 2, y: y + h }],\n [\"sw\", { x, y: y + h }],\n [\"w\", { x, y: y + h / 2 }],\n ];\n }\n\n private rect(x: number, y: number, w: number, h: number, stroke: string, fill: string, dash?: string): SVGRectElement {\n const r = document.createElementNS(SVG_NS, \"rect\") as SVGRectElement;\n r.setAttribute(\"x\", String(x));\n r.setAttribute(\"y\", String(y));\n r.setAttribute(\"width\", String(Math.max(0, w)));\n r.setAttribute(\"height\", String(Math.max(0, h)));\n r.setAttribute(\"stroke\", stroke);\n r.setAttribute(\"stroke-width\", \"1.5\");\n r.setAttribute(\"fill\", fill);\n if (dash) r.setAttribute(\"stroke-dasharray\", dash);\n return r;\n }\n\n private drawCreatePreview(): void {\n if (this.drag?.kind !== \"create\") return;\n const a = this.r.worldToScreen(this.drag.startWorld);\n const b = this.r.worldToScreen(this.drag.cur);\n this.overlay.appendChild(this.rect(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.abs(b.x - a.x), Math.abs(b.y - a.y), \"#6741d9\", \"rgba(103,65,217,0.08)\", \"4 3\"));\n }\n private drawConnectPreview(): void {\n const d = this.drag;\n if (!d || d.kind !== \"connect\") return;\n const scene = this.cb.getScene();\n const fromNode = scene.nodes.find((n) => n.id === d.from);\n if (!fromNode) return;\n const a = this.r.worldToScreen(rectCenter({ x: fromNode.x, y: fromNode.y, w: fromNode.w, h: fromNode.h }));\n const b = this.r.worldToScreen(d.cur);\n const line = document.createElementNS(SVG_NS, \"line\");\n line.setAttribute(\"x1\", String(a.x));\n line.setAttribute(\"y1\", String(a.y));\n line.setAttribute(\"x2\", String(b.x));\n line.setAttribute(\"y2\", String(b.y));\n line.setAttribute(\"stroke\", \"#6741d9\");\n line.setAttribute(\"stroke-width\", \"2\");\n line.setAttribute(\"stroke-dasharray\", \"5 4\");\n this.overlay.appendChild(line);\n }\n\n // ---- hit testing --------------------------------------------------------\n private hitHandle(screen: Point): HandleId | null {\n const node = this.getSelectedNode();\n if (!node) return null;\n const a = this.r.worldToScreen({ x: node.x, y: node.y });\n const b = this.r.worldToScreen({ x: node.x + node.w, y: node.y + node.h });\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const w = Math.abs(b.x - a.x);\n const h = Math.abs(b.y - a.y);\n for (const [hid, p] of this.handlePoints(x, y, w, h)) {\n if (Math.abs(screen.x - p.x) <= HANDLE && Math.abs(screen.y - p.y) <= HANDLE) return hid;\n }\n return null;\n }\n\n // ---- pointer ------------------------------------------------------------\n /** returns true if handled (facade should not pan). */\n pointerDown(world: Point, screen: Point): boolean {\n const scene = this.cb.getScene();\n if (this.tool === \"hand\") return false;\n\n if (this.tool === \"select\") {\n const handle = this.hitHandle(screen);\n if (handle && this.selected) {\n const n = this.getSelectedNode()!;\n this.drag = { kind: \"resize\", id: n.id, handle, startWorld: world, orig: { x: n.x, y: n.y, w: n.w, h: n.h } };\n return true;\n }\n const hit = hitTestNode(scene, world);\n if (hit) {\n this.selected = hit.id;\n this.drag = { kind: \"move\", id: hit.id, startWorld: world, orig: { x: hit.x, y: hit.y } };\n this.render();\n this.emit();\n return true;\n }\n this.selected = null;\n this.render();\n this.emit();\n return false; // empty -> allow pan\n }\n\n if (this.tool === \"arrow\") {\n const hit = hitTestNode(scene, world);\n if (hit) {\n this.drag = { kind: \"connect\", from: hit.id, cur: world };\n return true;\n }\n return true;\n }\n\n // create tools\n this.drag = { kind: \"create\", startWorld: world, cur: world };\n return true;\n }\n\n pointerMove(world: Point): void {\n const d = this.drag;\n if (!d) return;\n const scene = this.cb.getScene();\n if (d.kind === \"move\") {\n const n = scene.nodes.find((x) => x.id === d.id);\n if (n) {\n n.x = d.orig.x + (world.x - d.startWorld.x);\n n.y = d.orig.y + (world.y - d.startWorld.y);\n this.r.render(scene);\n this.render();\n }\n } else if (d.kind === \"resize\") {\n const n = scene.nodes.find((x) => x.id === d.id);\n if (n) {\n this.applyResize(n, d.handle, d.orig, world);\n this.r.render(scene);\n this.render();\n }\n } else if (d.kind === \"create\" || d.kind === \"connect\") {\n d.cur = world;\n this.render();\n }\n }\n\n pointerUp(world: Point): void {\n const d = this.drag;\n this.drag = null;\n if (!d) return;\n const scene = this.cb.getScene();\n\n if (d.kind === \"move\") {\n const n = scene.nodes.find((x) => x.id === d.id);\n // a plain click (no drag) only selects — don't write an override\n if (n && (Math.abs(n.x - d.orig.x) > 0.5 || Math.abs(n.y - d.orig.y) > 0.5)) this.commitGeometry(n, false);\n } else if (d.kind === \"resize\") {\n const n = scene.nodes.find((x) => x.id === d.id);\n if (n && (Math.abs(n.w - d.orig.w) > 0.5 || Math.abs(n.h - d.orig.h) > 0.5)) this.commitGeometry(n, true);\n } else if (d.kind === \"create\") {\n this.finishCreate(d.startWorld, world);\n } else if (d.kind === \"connect\") {\n const target = hitTestNode(scene, world);\n if (target && target.id !== d.from) {\n this.cb.onSource(addEdge(this.cb.getSource(), { from: d.from, to: target.id }));\n } else {\n this.render();\n }\n }\n }\n\n private applyResize(n: SceneNode, handle: HandleId, o: { x: number; y: number; w: number; h: number }, world: Point): void {\n let { x, y, w, h } = o;\n const right = o.x + o.w;\n const bottom = o.y + o.h;\n if (handle.includes(\"e\")) w = Math.max(MIN, world.x - o.x);\n if (handle.includes(\"s\")) h = Math.max(MIN, world.y - o.y);\n if (handle.includes(\"w\")) {\n x = Math.min(world.x, right - MIN);\n w = right - x;\n }\n if (handle.includes(\"n\")) {\n y = Math.min(world.y, bottom - MIN);\n h = bottom - y;\n }\n n.x = x;\n n.y = y;\n n.w = w;\n n.h = h;\n }\n\n /**\n * Commit a move/resize. Freezes EVERY node's current position into overrides\n * (the Excalidraw-like \"you've taken manual control\" model), so pinning one\n * node never reshuffles the auto-layout of the others. Existing size overrides\n * are preserved; the edited node gets its new geometry.\n */\n private commitGeometry(n: SceneNode, withSize: boolean): void {\n const scene = this.cb.getScene();\n const prevSize = new Map((scene.overrides ?? []).map((o) => [o.id, o]));\n const map = new Map<string, OverrideEntry>();\n for (const node of scene.nodes) {\n const p = prevSize.get(node.id);\n map.set(node.id, { id: node.id, x: node.x, y: node.y, w: p?.w, h: p?.h });\n }\n map.set(n.id, { id: n.id, x: n.x, y: n.y, w: withSize ? n.w : prevSize.get(n.id)?.w, h: withSize ? n.h : prevSize.get(n.id)?.h });\n this.cb.onSource(writeOverrides(this.cb.getSource(), [...map.values()]));\n }\n\n private finishCreate(a: Point, b: Point): void {\n const scene = this.cb.getScene();\n const shape = SHAPE_FOR[this.tool] ?? \"rect\";\n const dragW = Math.abs(b.x - a.x);\n const dragH = Math.abs(b.y - a.y);\n const w = dragW < 8 ? 140 : dragW;\n const h = dragH < 8 ? 70 : dragH;\n const x = dragW < 8 ? a.x - w / 2 : Math.min(a.x, b.x);\n const y = dragH < 8 ? a.y - h / 2 : Math.min(a.y, b.y);\n const id = this.uniqueId(scene, ID_PREFIX[this.tool] ?? \"box\");\n let src = addNode(this.cb.getSource(), { id, shape, label: \"\" });\n const map = new Map<string, OverrideEntry>((scene.overrides ?? []).map((o) => [o.id, { ...o }]));\n map.set(id, { id, x, y, w, h });\n src = writeOverrides(src, [...map.values()]);\n this.cb.onSource(src);\n this.selected = id;\n this.tool = \"select\";\n this.emit();\n // open rename immediately\n const center = this.r.worldToScreen({ x: x + w / 2, y: y + h / 2 });\n this.cb.onRequestRename(id, \"\", center);\n }\n\n private uniqueId(scene: Scene, prefix: string): string {\n const ids = new Set(scene.nodes.map((n) => n.id));\n let i = 1;\n while (ids.has(`${prefix}${i}`)) i++;\n return `${prefix}${i}`;\n }\n\n // ---- discrete ops -------------------------------------------------------\n requestRenameSelected(): void {\n const n = this.getSelectedNode();\n if (!n) return;\n const c = this.r.worldToScreen(rectCenter({ x: n.x, y: n.y, w: n.w, h: n.h }));\n this.cb.onRequestRename(n.id, n.label, c);\n }\n dblclick(world: Point): boolean {\n const hit = hitTestNode(this.cb.getScene(), world);\n if (hit) {\n this.selected = hit.id;\n const c = this.r.worldToScreen(rectCenter({ x: hit.x, y: hit.y, w: hit.w, h: hit.h }));\n this.cb.onRequestRename(hit.id, hit.label, c);\n return true;\n }\n return false;\n }\n applyRename(id: string, label: string): void {\n this.cb.onSource(renameNode(this.cb.getSource(), id, label));\n }\n applyStyle(id: string, style: { fill?: string; stroke?: string; shape?: string }): void {\n this.cb.onSource(styleNode(this.cb.getSource(), id, style));\n }\n deleteSelected(): void {\n if (!this.selected) return;\n const id = this.selected;\n this.selected = null;\n this.cb.onSource(deleteElements(this.cb.getSource(), [id]));\n this.emit();\n }\n handleKey(e: KeyboardEvent): boolean {\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && this.selected) {\n this.deleteSelected();\n return true;\n }\n if (e.key === \"Escape\") {\n this.clearSelection();\n return true;\n }\n return false;\n }\n\n dispose(): void {\n this.overlay.remove();\n }\n}\n","/**\n * Pure camera math: compute the { cx, cy, zoom } that frames a bbox (or the\n * whole scene) inside a viewport with padding. Shared by fitAll/focus and the\n * animated CameraController (M3).\n */\n\nimport type { BBox, Size } from \"../geometry.js\";\nimport { bboxCenter, isEmptyBBox } from \"../geometry.js\";\nimport type { CameraTransform } from \"../render/svgRenderer.js\";\n\nexport interface FitOptions {\n /** Screen-space padding around the target, in px. */\n padding?: number;\n minZoom?: number;\n maxZoom?: number;\n}\n\n/** Camera that frames `bbox` within `viewport`. */\nexport function cameraForBBox(bbox: BBox, viewport: Size, opts: FitOptions = {}): CameraTransform {\n const padding = opts.padding ?? 64;\n const minZoom = opts.minZoom ?? 0.05;\n const maxZoom = opts.maxZoom ?? 2.5;\n if (isEmptyBBox(bbox)) return { cx: 0, cy: 0, zoom: 1 };\n const w = Math.max(1, bbox.maxX - bbox.minX);\n const h = Math.max(1, bbox.maxY - bbox.minY);\n const c = bboxCenter(bbox);\n const availW = Math.max(1, viewport.w - padding * 2);\n const availH = Math.max(1, viewport.h - padding * 2);\n let zoom = Math.min(availW / w, availH / h);\n if (!Number.isFinite(zoom) || zoom <= 0) zoom = 1;\n zoom = Math.max(minZoom, Math.min(maxZoom, zoom));\n return { cx: c.x, cy: c.y, zoom };\n}\n\n/** Camera that centers a target zoomed to an explicit factor. */\nexport function cameraForCenter(center: { x: number; y: number }, zoom: number): CameraTransform {\n return { cx: center.x, cy: center.y, zoom };\n}\n","/**\n * Easing catalog for camera magic-move and annotation reveals.\n * All functions map t in [0,1] -> eased value (usually [0,1], some overshoot).\n */\n\nimport type { EasingName } from \"../scene/types.js\";\n\nexport type EasingFn = (t: number) => number;\n\nconst c1 = 1.70158;\nconst c3 = c1 + 1;\n\nexport const EASINGS: Record<EasingName, EasingFn> = {\n linear: (t) => t,\n ease: (t) => cubicBezier(0.25, 0.1, 0.25, 1, t),\n \"ease-in\": (t) => t * t,\n \"ease-out\": (t) => 1 - (1 - t) * (1 - t),\n \"ease-in-out\": (t) => (t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2),\n \"back-out\": (t) => 1 + c3 * Math.pow(t - 1, 3) + c1 * Math.pow(t - 1, 2),\n anticipate: (t) => {\n const s = c1 * 1.2;\n return t < 0.5 ? (2 * t) ** 2 * ((s + 1) * 2 * t - s) / 2 : 1;\n },\n // A tuned spring feel for magic-move: settles with a soft overshoot.\n spring: (t) => {\n if (t >= 1) return 1;\n const damping = 6.5;\n const freq = 9;\n return 1 - Math.exp(-damping * t) * Math.cos(freq * t * (1 - t) + 0);\n },\n};\n\nexport function easingByName(name: EasingName | undefined): EasingFn {\n return (name && EASINGS[name]) || EASINGS[\"ease-in-out\"];\n}\n\n/** Approximate cubic-bezier easing solver (Newton-ish), good enough for UI. */\nfunction cubicBezier(x1: number, y1: number, x2: number, y2: number, t: number): number {\n // sample x(t) to find parameter, then eval y — cheap fixed iterations\n const cx = 3 * x1;\n const bx = 3 * (x2 - x1) - cx;\n const ax = 1 - cx - bx;\n const cy = 3 * y1;\n const by = 3 * (y2 - y1) - cy;\n const ay = 1 - cy - by;\n const sampleX = (u: number) => ((ax * u + bx) * u + cx) * u;\n const sampleY = (u: number) => ((ay * u + by) * u + cy) * u;\n let u = t;\n for (let i = 0; i < 6; i++) {\n const x = sampleX(u) - t;\n const dx = (3 * ax * u + 2 * bx) * u + cx;\n if (Math.abs(x) < 1e-4 || Math.abs(dx) < 1e-6) break;\n u -= x / dx;\n }\n return sampleY(Math.max(0, Math.min(1, u)));\n}\n","/**\n * CameraController — drives the SvgRenderer's camera with interruptible,\n * retargetable rAF tweens (\"magic move\"). Zoom is interpolated in log space so\n * fast/slow zooms feel natural; position is eased linearly.\n */\n\nimport type { BBox, Point } from \"../geometry.js\";\nimport { bboxUnion, emptyBBox } from \"../geometry.js\";\nimport { elementBBox, sceneBBox } from \"../scene/query.js\";\nimport type { EasingName, Scene } from \"../scene/types.js\";\nimport type { CameraTransform, SvgRenderer } from \"../render/svgRenderer.js\";\nimport { cameraForBBox } from \"./fit.js\";\nimport { easingByName } from \"./easing.js\";\n\nexport interface MoveOptions {\n durationMs?: number;\n easing?: EasingName;\n padding?: number;\n}\n\ninterface Tween {\n from: CameraTransform;\n to: CameraTransform;\n start: number;\n duration: number;\n easing: EasingName;\n resolve: () => void;\n}\n\nexport class CameraController {\n private renderer: SvgRenderer;\n private tween: Tween | null = null;\n private raf = 0;\n /** notified every applied frame (for grid/overlay sync). */\n onFrame?: (cam: CameraTransform) => void;\n\n constructor(renderer: SvgRenderer) {\n this.renderer = renderer;\n }\n\n get current(): CameraTransform {\n return this.renderer.getCamera();\n }\n\n /** Snap immediately (used by user pan/zoom). Cancels any tween. */\n setImmediate(cam: CameraTransform): void {\n this.stop();\n this.renderer.applyCamera(cam);\n this.onFrame?.(cam);\n }\n\n stop(): void {\n if (this.raf) cancelAnimationFrame(this.raf);\n this.raf = 0;\n if (this.tween) {\n const r = this.tween.resolve;\n this.tween = null;\n r();\n }\n }\n\n /** Animate to a target camera, retargeting smoothly if already animating. */\n animateTo(to: CameraTransform, opts: MoveOptions = {}): Promise<void> {\n const from = this.current;\n const duration = opts.durationMs ?? this.autoDuration(from, to);\n if (duration <= 0) {\n this.setImmediate(to);\n return Promise.resolve();\n }\n // resolve any in-flight tween's promise (it's being superseded)\n if (this.tween) {\n const prev = this.tween.resolve;\n this.tween = null;\n prev();\n }\n return new Promise<void>((resolve) => {\n this.tween = { from, to, start: performance.now(), duration, easing: opts.easing ?? \"spring\", resolve };\n if (!this.raf) this.raf = requestAnimationFrame(this.frame);\n });\n }\n\n private frame = (now: number): void => {\n this.raf = 0;\n const tw = this.tween;\n if (!tw) return;\n const t = Math.min(1, (now - tw.start) / tw.duration);\n const e = easingByName(tw.easing)(t);\n const cam: CameraTransform = {\n cx: lerp(tw.from.cx, tw.to.cx, e),\n cy: lerp(tw.from.cy, tw.to.cy, e),\n zoom: logLerp(tw.from.zoom, tw.to.zoom, e),\n };\n this.renderer.applyCamera(cam);\n this.onFrame?.(cam);\n if (t < 1) {\n this.raf = requestAnimationFrame(this.frame);\n } else {\n const done = tw.resolve;\n this.tween = null;\n done();\n }\n };\n\n /** Duration heuristic: further travel + bigger zoom change => longer. */\n private autoDuration(from: CameraTransform, to: CameraTransform): number {\n const dist = Math.hypot(to.cx - from.cx, to.cy - from.cy) * Math.min(from.zoom, to.zoom);\n const zoomRatio = Math.abs(Math.log(to.zoom / from.zoom));\n return clamp(420 + dist * 0.12 + zoomRatio * 320, 420, 1300);\n }\n\n // ---- high-level ops -----------------------------------------------------\n fitAll(scene: Scene, opts: MoveOptions = {}): Promise<void> {\n const cam = cameraForBBox(sceneBBox(scene), this.renderer.getViewportSize(), { padding: opts.padding ?? 80 });\n return this.animateTo(cam, opts);\n }\n\n focus(scene: Scene, ids: string[], opts: MoveOptions & { zoom?: number } = {}): Promise<void> {\n let box = emptyBBox();\n for (const id of ids) {\n const b = elementBBox(scene, id);\n if (b) box = bboxUnion(box, b);\n }\n if (!Number.isFinite(box.minX)) return this.fitAll(scene, opts);\n const cam = cameraForBBox(box, this.renderer.getViewportSize(), { padding: opts.padding ?? 90, maxZoom: 4 });\n if (opts.zoom != null) cam.zoom = opts.zoom;\n return this.animateTo(cam, opts);\n }\n\n focusBBox(box: BBox, opts: MoveOptions & { zoom?: number } = {}): Promise<void> {\n const cam = cameraForBBox(box, this.renderer.getViewportSize(), { padding: opts.padding ?? 90 });\n if (opts.zoom != null) cam.zoom = opts.zoom;\n return this.animateTo(cam, opts);\n }\n\n /** Zoom by a factor around a screen anchor (default: viewport center). */\n zoomBy(factor: number, anchorScreen?: Point): void {\n const cam = this.current;\n const vp = this.renderer.getViewportSize();\n const anchor = anchorScreen ?? { x: vp.w / 2, y: vp.h / 2 };\n const worldBefore = this.renderer.screenToWorld(anchor);\n const zoom = clamp(cam.zoom * factor, 0.05, 8);\n // keep the anchor world-point under the cursor\n const cx = worldBefore.x - (anchor.x - vp.w / 2) / zoom;\n const cy = worldBefore.y - (anchor.y - vp.h / 2) / zoom;\n this.setImmediate({ cx, cy, zoom });\n }\n\n /** Pan by a screen-space delta. */\n panByScreen(dx: number, dy: number): void {\n const cam = this.current;\n this.setImmediate({ cx: cam.cx - dx / cam.zoom, cy: cam.cy - dy / cam.zoom, zoom: cam.zoom });\n }\n}\n\nfunction lerp(a: number, b: number, t: number): number {\n return a + (b - a) * t;\n}\nfunction logLerp(a: number, b: number, t: number): number {\n return a * Math.pow(b / a, t);\n}\nfunction clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v;\n}\n","/**\n * Directed-acyclic (layered) layout via dagre.\n *\n * dagre works in CENTRE coordinates; the Scene IR stores TOP-LEFT, so read-back\n * subtracts half the node size. Scene groups become dagre compound clusters so\n * that grouped members are kept adjacent in the final layering.\n */\n\nimport dagre from \"@dagrejs/dagre\";\n\nimport type { Scene, SceneNode } from \"../scene/types.js\";\n\nexport type RankDir = \"TB\" | \"BT\" | \"LR\" | \"RL\";\n\nexport interface DagOptions {\n /** dagre rank direction. */\n rankdir: RankDir;\n /** Separation between nodes in the same rank (px). */\n nodesep: number;\n /** Separation between ranks (px). */\n ranksep: number;\n /** Graph margin on both axes (px). */\n margin: number;\n}\n\n/**\n * Lay out the given `movable` nodes with dagre and write their top-left x/y.\n *\n * Only nodes in `movable` are fed to the graph (pinned nodes are excluded by\n * the caller). Edges are included only when both endpoints are real nodes that\n * are present in the graph. Throws if dagre returns a non-finite position so\n * the caller can fall back to another layout.\n */\nexport function layoutDag(scene: Scene, movable: SceneNode[], opts: DagOptions): void {\n const g = new dagre.graphlib.Graph({ compound: true });\n g.setGraph({\n rankdir: opts.rankdir,\n nodesep: opts.nodesep,\n ranksep: opts.ranksep,\n marginx: opts.margin,\n marginy: opts.margin,\n });\n g.setDefaultEdgeLabel(() => ({}));\n\n // Feed every layout-eligible node with its real size.\n const inGraph = new Set<string>();\n for (const n of movable) {\n g.setNode(n.id, { width: n.w, height: n.h });\n inGraph.add(n.id);\n }\n\n // Group clustering: one compound cluster per group keeps members together.\n // Skip groups whose members are all pinned/absent, and never let a cluster id\n // collide with a real node id.\n for (const grp of scene.groups) {\n if (inGraph.has(grp.id)) continue;\n const members = grp.members.filter((id) => inGraph.has(id));\n if (members.length === 0) continue;\n g.setNode(grp.id, {});\n for (const id of members) g.setParent(id, grp.id);\n }\n\n // Feed edges whose endpoints are both present, non-null node ids in the graph.\n for (const e of scene.edges) {\n const from = e.from.node;\n const to = e.to.node;\n if (from == null || to == null) continue;\n if (!inGraph.has(from) || !inGraph.has(to)) continue;\n g.setEdge(from, to);\n }\n\n dagre.layout(g);\n\n // Convert dagre CENTRE coordinates back to Scene TOP-LEFT coordinates.\n for (const n of movable) {\n const gn = g.node(n.id);\n if (!gn || !Number.isFinite(gn.x) || !Number.isFinite(gn.y)) {\n throw new Error(`dagre produced no finite position for node \"${n.id}\"`);\n }\n n.x = gn.x - n.w / 2;\n n.y = gn.y - n.h / 2;\n }\n\n // Capture dagre's routed waypoints per edge (world coords, same frame as node\n // centres) so the renderer can dodge nodes in dense graphs. A per-edge copy\n // avoids shared references (parallel edges) being translated twice later.\n for (const e of scene.edges) {\n const from = e.from.node;\n const to = e.to.node;\n if (from == null || to == null || !inGraph.has(from) || !inGraph.has(to)) {\n e.points = undefined;\n continue;\n }\n const ge = g.edge(from, to) as { points?: Array<{ x: number; y: number }> } | undefined;\n e.points = ge?.points && ge.points.length >= 2 ? ge.points.map((p) => ({ x: p.x, y: p.y })) : undefined;\n }\n}\n","/**\n * Grid layout — arrange nodes on a uniform square grid, row-major.\n *\n * Columns = ceil(sqrt(n)). The cell is a square sized to the largest single\n * node dimension (width OR height) plus the gap, so neighbouring cells can\n * never overlap regardless of how the nodes are shaped. Each node is centred\n * inside its cell, which keeps mixed-size grids visually aligned.\n */\n\nimport type { SceneNode } from \"../scene/types.js\";\n\n/** Lay `nodes` out on a grid, mutating each node's top-left x/y in place. */\nexport function layoutGrid(nodes: SceneNode[], gap: number): void {\n const n = nodes.length;\n if (n === 0) return;\n\n const cols = Math.max(1, Math.ceil(Math.sqrt(n)));\n\n // Largest node extent in either axis → uniform square cell size.\n let maxDim = 0;\n for (const node of nodes) {\n if (node.w > maxDim) maxDim = node.w;\n if (node.h > maxDim) maxDim = node.h;\n }\n const cell = maxDim + gap;\n\n for (let i = 0; i < n; i++) {\n const node = nodes[i];\n const row = Math.floor(i / cols);\n const col = i % cols;\n // Centre the node within its cell so rows/columns line up.\n node.x = col * cell + (cell - node.w) / 2;\n node.y = row * cell + (cell - node.h) / 2;\n }\n}\n","/**\n * Radial layout — a hub node at the world origin with the remaining nodes\n * distributed evenly around a circle.\n *\n * The hub is either the node whose id matches the requested `centerId`, or the\n * first node when no match is found. Ring radius = max(radiusFloor, n * 40),\n * which grows the circle as the node count rises so labels stay legible.\n */\n\nimport type { SceneNode } from \"../scene/types.js\";\n\n/**\n * Place `nodes` radially, mutating each node's top-left x/y in place.\n *\n * @param nodes nodes to arrange (hub + ring)\n * @param centerId preferred hub node id; falls back to the first node\n * @param radiusFloor minimum ring radius in world px\n */\nexport function layoutRadial(\n nodes: SceneNode[],\n centerId: string | undefined,\n radiusFloor = 220,\n): void {\n const n = nodes.length;\n if (n === 0) return;\n\n // Pick the hub: an explicit id match wins, otherwise the first node.\n let hubIdx = 0;\n if (centerId !== undefined) {\n const idx = nodes.findIndex((node) => node.id === centerId);\n if (idx >= 0) hubIdx = idx;\n }\n\n // Centre the hub on the origin (top-left = centre - half-size).\n const hub = nodes[hubIdx];\n hub.x = -hub.w / 2;\n hub.y = -hub.h / 2;\n\n const ring = nodes.filter((_, i) => i !== hubIdx);\n const count = ring.length;\n if (count === 0) return;\n\n const radius = Math.max(radiusFloor, n * 40);\n for (let k = 0; k < count; k++) {\n const angle = (2 * Math.PI * k) / count;\n const cx = Math.cos(angle) * radius;\n const cy = Math.sin(angle) * radius;\n ring[k].x = cx - ring[k].w / 2;\n ring[k].y = cy - ring[k].h / 2;\n }\n}\n","/**\n * Auto-layout — assigns world positions to a Scene's nodes.\n *\n * `applyLayout(scene)` reads `scene.meta.layout` and mutates each non-pinned\n * node's top-left `x`/`y` in place. Supported modes:\n *\n * - \"dag\" / \"dag-lr\" / \"dag-rl\" / \"dag-bt\" — layered graph layout via dagre\n * - \"grid\" — uniform square grid, row-major\n * - \"radial\" — hub node at origin, the rest on a circle\n * - \"manual\" — no-op (author already positioned everything)\n *\n * Cross-cutting rules:\n * - Any node with `pinned === true` is a fixed obstacle: it is excluded from\n * every auto-layout mode and its coordinates are never changed.\n * - The function never throws. If dagre fails (or a graph is empty/degenerate)\n * it falls back to grid; an empty scene is a no-op.\n * - After arranging, the laid-out nodes are shifted so their bounding box\n * starts at a small positive margin (~40,40). Pinned nodes anchor an\n * absolute frame and are not shifted; when nothing is pinned this is\n * exactly \"translate the whole diagram\".\n *\n * The public surface is `applyLayout`; per-mode maths lives in dag/grid/radial.\n */\n\nimport type { LayoutKind, Scene, SceneNode } from \"../scene/types.js\";\nimport { layoutDag, type DagOptions, type RankDir } from \"./dag.js\";\nimport { layoutGrid } from \"./grid.js\";\nimport { layoutRadial } from \"./radial.js\";\n\n// ----------------------------------------------------------------------------\n// Tunable defaults\n// ----------------------------------------------------------------------------\n\nconst DEFAULT_NODESEP = 60; // dagre same-rank separation\nconst DEFAULT_RANKSEP = 90; // dagre inter-rank separation\nconst DAG_MARGIN = 20; // dagre graph margin\nconst DEFAULT_GRID_GAP = 40; // gap between grid cells\nconst RADIAL_RADIUS_FLOOR = 220; // minimum radial ring radius\nconst NORMALIZE_MARGIN = 40; // final min-corner offset\n\n/** Optional direction hint carried on meta (not part of the typed surface). */\ntype DirectionHint = \"down\" | \"up\" | \"left\" | \"right\" | \"TB\" | \"BT\" | \"LR\" | \"RL\";\n\n// ----------------------------------------------------------------------------\n// Public API\n// ----------------------------------------------------------------------------\n\n/**\n * Assign positions to `scene.nodes` according to `scene.meta.layout`.\n * Mutates node `x`/`y` (top-left, world space) in place. Never throws.\n */\nexport function applyLayout(scene: Scene): void {\n // Manual layout: positions are authored — never touch a thing.\n if (scene.meta.layout === \"manual\") return;\n\n // Pinned nodes are fixed obstacles: excluded from every auto-layout mode.\n const movable = scene.nodes.filter((n) => n.pinned !== true);\n if (movable.length === 0) return; // empty scene, or everything is pinned\n\n runLayout(scene, movable);\n\n // Normalise the just-arranged nodes to a small positive margin. Pinned nodes\n // are left untouched; with no pins, `movable` is every node so this shifts\n // the whole diagram — matching the \"bbox min ≈ (40,40)\" contract.\n const { dx, dy } = normalizeMargin(movable, NORMALIZE_MARGIN);\n\n // Any dagre-routed edge waypoints share the movable frame — shift them too.\n if (dx !== 0 || dy !== 0) {\n for (const e of scene.edges) {\n if (e.points) e.points = e.points.map((p) => ({ x: p.x + dx, y: p.y + dy }));\n }\n }\n}\n\n// ----------------------------------------------------------------------------\n// Mode dispatch (with grid fallback)\n// ----------------------------------------------------------------------------\n\nfunction runLayout(scene: Scene, movable: SceneNode[]): void {\n const kind = scene.meta.layout;\n try {\n switch (kind) {\n case \"dag\":\n case \"dag-lr\":\n case \"dag-rl\":\n case \"dag-bt\":\n layoutDag(scene, movable, dagOptions(scene, kind));\n return;\n case \"grid\":\n layoutGrid(movable, gridGap(scene));\n return;\n case \"radial\":\n layoutRadial(movable, readCenterId(scene), RADIAL_RADIUS_FLOOR);\n return;\n default:\n // Forward-compat / unknown kind → grid.\n layoutGrid(movable, gridGap(scene));\n return;\n }\n } catch {\n // Never throw: any failure (dagre error, degenerate graph, …) → grid.\n try {\n layoutGrid(movable, gridGap(scene));\n } catch {\n /* Give up silently and keep whatever coordinates already exist. */\n }\n }\n}\n\n// ----------------------------------------------------------------------------\n// Option resolution\n// ----------------------------------------------------------------------------\n\nfunction dagOptions(scene: Scene, kind: LayoutKind): DagOptions {\n return {\n rankdir: resolveRankdir(scene, kind),\n nodesep: scene.meta.spacing?.node ?? DEFAULT_NODESEP,\n ranksep: scene.meta.spacing?.rank ?? DEFAULT_RANKSEP,\n margin: DAG_MARGIN,\n };\n}\n\n/** Base rank direction from the layout kind, overridden by any direction hint. */\nfunction resolveRankdir(scene: Scene, kind: LayoutKind): RankDir {\n const hinted = directionToRankdir(readDirection(scene));\n if (hinted) return hinted;\n switch (kind) {\n case \"dag-lr\":\n return \"LR\";\n case \"dag-rl\":\n return \"RL\";\n case \"dag-bt\":\n return \"BT\";\n default:\n return \"TB\"; // \"dag\" and any non-dag kind that reaches here\n }\n}\n\nfunction directionToRankdir(dir: DirectionHint | undefined): RankDir | undefined {\n switch (dir) {\n case \"down\":\n case \"TB\":\n return \"TB\";\n case \"up\":\n case \"BT\":\n return \"BT\";\n case \"left\":\n case \"RL\":\n return \"RL\";\n case \"right\":\n case \"LR\":\n return \"LR\";\n default:\n return undefined;\n }\n}\n\nfunction gridGap(scene: Scene): number {\n return scene.meta.spacing?.node ?? DEFAULT_GRID_GAP;\n}\n\n// ----------------------------------------------------------------------------\n// Optional meta hints — the only untyped reads in this module.\n// `SceneMeta` does not declare `direction`/`center`, but importers/DSL may set\n// them, so we read them defensively through a narrow cast and validate.\n// ----------------------------------------------------------------------------\n\nfunction readDirection(scene: Scene): DirectionHint | undefined {\n const raw = (scene.meta as { direction?: unknown }).direction;\n if (typeof raw !== \"string\") return undefined;\n switch (raw) {\n case \"down\":\n case \"up\":\n case \"left\":\n case \"right\":\n case \"TB\":\n case \"BT\":\n case \"LR\":\n case \"RL\":\n return raw;\n default:\n return undefined;\n }\n}\n\nfunction readCenterId(scene: Scene): string | undefined {\n const raw = (scene.meta as { center?: unknown }).center;\n return typeof raw === \"string\" ? raw : undefined;\n}\n\n// ----------------------------------------------------------------------------\n// Normalisation\n// ----------------------------------------------------------------------------\n\n/**\n * Translate `nodes` so their bounding-box min corner sits at (margin, margin).\n * The min corner is simply the min of top-left x and y across the nodes.\n */\nfunction normalizeMargin(nodes: SceneNode[], margin: number): { dx: number; dy: number } {\n let minX = Infinity;\n let minY = Infinity;\n for (const n of nodes) {\n if (n.x < minX) minX = n.x;\n if (n.y < minY) minY = n.y;\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) return { dx: 0, dy: 0 };\n\n const dx = margin - minX;\n const dy = margin - minY;\n if (dx === 0 && dy === 0) return { dx: 0, dy: 0 };\n\n for (const n of nodes) {\n n.x += dx;\n n.y += dy;\n }\n return { dx, dy };\n}\n","/**\n * Apply position/size overrides to a scene. Overrides come from the DSL\n * `overrides { … }` block (what direct canvas edits write back to). Applied\n * before layout so overridden nodes are pinned at their coordinates and the\n * auto-layout arranges everything else around them. Idempotent — safe to call\n * again after Mermaid injection so imported nodes can be overridden too.\n */\n\nimport type { Scene } from \"./types.js\";\n\nexport function applyOverrides(scene: Scene): void {\n if (!scene.overrides || !scene.overrides.length) return;\n const byId = new Map(scene.nodes.map((n) => [n.id, n]));\n for (const o of scene.overrides) {\n const n = byId.get(o.id);\n if (!n) continue;\n n.x = o.x;\n n.y = o.y;\n if (o.w != null && o.w > 0) n.w = o.w;\n if (o.h != null && o.h > 0) n.h = o.h;\n n.pinned = true;\n }\n}\n","/**\n * Default styles, theme, and factory helpers for building Scene elements.\n * Factories assign deterministic rough seeds (hash of id) so re-rendering an\n * unchanged element never re-jitters its hand-drawn strokes.\n */\n\nimport { hashString } from \"../geometry.js\";\nimport { STROKE_PALETTE } from \"./palette.js\";\nimport type {\n EdgeStyle,\n NodeStyle,\n Scene,\n SceneEdge,\n SceneNode,\n ShapeKind,\n Theme,\n} from \"./types.js\";\n\nexport const LIGHT_THEME: Theme = {\n name: \"excalidraw-light\",\n background: \"#ffffff\",\n defaultStroke: STROKE_PALETTE.black,\n defaultText: STROKE_PALETTE.black,\n gridColor: \"#eceff3\",\n mode: \"light\",\n};\n\nexport const DARK_THEME: Theme = {\n name: \"excalidraw-dark\",\n background: \"#121212\",\n defaultStroke: \"#e3e3e3\",\n defaultText: \"#e3e3e3\",\n gridColor: \"#22262c\",\n mode: \"dark\",\n};\n\nexport function defaultNodeStyle(seed: number, mode: \"light\" | \"dark\" = \"light\"): NodeStyle {\n return {\n stroke: mode === \"dark\" ? \"#e3e3e3\" : STROKE_PALETTE.black,\n fill: null,\n fillStyle: \"hachure\",\n strokeWidth: 1.4,\n strokeStyle: \"solid\",\n roughness: 1.1,\n roundness: null,\n fontFamily: \"hand\",\n fontSize: 20,\n textColor: mode === \"dark\" ? \"#e3e3e3\" : STROKE_PALETTE.black,\n textAlign: \"center\",\n verticalAlign: \"middle\",\n opacity: 100,\n seed,\n };\n}\n\nexport function defaultEdgeStyle(seed: number, mode: \"light\" | \"dark\" = \"light\"): EdgeStyle {\n return {\n stroke: mode === \"dark\" ? \"#e3e3e3\" : STROKE_PALETTE.black,\n strokeWidth: 1.4,\n strokeStyle: \"solid\",\n roughness: 1.1,\n startArrowhead: \"none\",\n endArrowhead: \"arrow\",\n animation: \"none\",\n animationSpeed: 1,\n opacity: 100,\n seed,\n fontFamily: \"hand\",\n fontSize: 16,\n textColor: mode === \"dark\" ? \"#e3e3e3\" : STROKE_PALETTE.black,\n labelBg: mode === \"dark\" ? \"#121212\" : \"#ffffff\",\n };\n}\n\n/** Default box size for a node given its label (rough auto-size fallback). */\nexport function defaultNodeSize(shape: ShapeKind, label: string): { w: number; h: number } {\n const lines = label ? label.split(\"\\n\") : [\"\"];\n const longest = lines.reduce((m, l) => Math.max(m, l.length), 0);\n const baseW = Math.max(90, longest * 11 + 40);\n const baseH = Math.max(52, lines.length * 26 + 24);\n switch (shape) {\n case \"circle\":\n return { w: Math.max(baseW, baseH), h: Math.max(baseW, baseH) };\n case \"diamond\":\n return { w: baseW * 1.3, h: baseH * 1.3 };\n case \"ellipse\":\n return { w: baseW * 1.15, h: baseH * 1.15 };\n case \"cylinder\":\n return { w: baseW, h: baseH * 1.25 };\n case \"hexagon\":\n case \"parallelogram\":\n case \"trapezoid\":\n return { w: baseW * 1.2, h: baseH };\n case \"text\":\n return { w: baseW, h: baseH * 0.8 };\n default:\n return { w: baseW, h: baseH };\n }\n}\n\nexport interface MakeNodeInput {\n id: string;\n shape?: ShapeKind;\n label?: string;\n x?: number;\n y?: number;\n w?: number;\n h?: number;\n style?: Partial<NodeStyle>;\n group?: string;\n z?: number;\n pinned?: boolean;\n data?: Record<string, unknown>;\n mode?: \"light\" | \"dark\";\n}\n\nexport function makeNode(input: MakeNodeInput): SceneNode {\n const shape = input.shape ?? \"rectangle\";\n const label = input.label ?? \"\";\n const seed = (hashString(input.id) % 2_000_000) + 1;\n const size =\n input.w != null && input.h != null\n ? { w: input.w, h: input.h }\n : defaultNodeSize(shape, label);\n return {\n id: input.id,\n shape,\n label,\n x: input.x ?? 0,\n y: input.y ?? 0,\n w: input.w ?? size.w,\n h: input.h ?? size.h,\n style: { ...defaultNodeStyle(seed, input.mode), ...input.style, seed },\n group: input.group,\n z: input.z ?? 0,\n pinned: input.pinned ?? (input.x != null && input.y != null),\n data: input.data,\n };\n}\n\nexport interface MakeEdgeInput {\n id: string;\n from: string;\n to: string;\n fromAnchor?: string;\n toAnchor?: string;\n label?: string;\n style?: Partial<EdgeStyle>;\n routing?: SceneEdge[\"routing\"];\n z?: number;\n data?: Record<string, unknown>;\n mode?: \"light\" | \"dark\";\n}\n\nexport function makeEdge(input: MakeEdgeInput): SceneEdge {\n const seed = (hashString(input.id) % 2_000_000) + 1;\n return {\n id: input.id,\n from: { node: input.from, anchor: input.fromAnchor },\n to: { node: input.to, anchor: input.toAnchor },\n label: input.label ?? \"\",\n style: { ...defaultEdgeStyle(seed, input.mode), ...input.style, seed },\n routing: input.routing ?? \"straight\",\n z: input.z ?? 0,\n data: input.data,\n };\n}\n\nexport function emptyScene(mode: \"light\" | \"dark\" = \"light\"): Scene {\n return {\n id: \"scene\",\n theme: mode === \"dark\" ? DARK_THEME : LIGHT_THEME,\n meta: { layout: \"dag\" },\n nodes: [],\n edges: [],\n groups: [],\n annotations: [],\n steps: [],\n };\n}\n","/**\n * AST for the EDodoDraw DSL. A pragmatic, compile-oriented tree: it captures\n * everything the compiler needs to emit a Scene IR (structure + annotations +\n * timeline steps) while staying close to the surface grammar.\n */\n\nexport interface Span {\n start: number;\n end: number;\n line: number;\n col: number;\n}\n\n// ---- values ----------------------------------------------------------------\n\nexport type Value =\n | { t: \"str\"; v: string }\n | { t: \"num\"; v: number; unit: string | null }\n | { t: \"color\"; v: string }\n | { t: \"bool\"; v: boolean }\n | { t: \"ident\"; v: string } // enum keyword / bare word\n | { t: \"token\"; v: string } // $name\n | { t: \"class\"; v: string } // .name (selector)\n | { t: \"tuple\"; v: Value[] } // (a, b)\n | { t: \"list\"; v: Value[] } // [a, b, c]\n | { t: \"call\"; name: string; args: Value[] } // spring(180, 22)\n | { t: \"styled\"; name: string; block: Attr[] } // flow { speed: 1.2 }\n | { t: \"ref\"; id: string; sub?: string; uv?: [number, number] }; // port ref\n\nexport interface Attr {\n key: string;\n value: Value;\n span: Span;\n}\n\nexport type AttrBlock = Attr[];\n\nexport function attr(block: AttrBlock, key: string): Value | undefined {\n const found = block.find((a) => a.key === key);\n return found?.value;\n}\n\n// ---- endpoints / anchors ---------------------------------------------------\n\nexport interface Endpoint {\n id: string;\n sub?: string; // .anchor or .label\n uv?: [number, number]; // @(u,v)\n /** inline-declared node (e.g. `a --> b[New]`). */\n inline?: NodeDecl;\n span: Span;\n}\n\nexport interface AnchorDecl {\n type: \"anchor\";\n name: string;\n on?: string; // scene-level: `anchor x on node at ...`\n spec: AnchorSpecAst;\n span: Span;\n}\n\nexport type AnchorSpecAst =\n | { kind: \"cardinal\"; v: string }\n | { kind: \"side\"; side: string; frac: number }\n | { kind: \"uv\"; u: number; v: number };\n\n// ---- scene statements ------------------------------------------------------\n\nexport interface NodeDecl {\n type: \"node\";\n id: string;\n label?: string;\n shape?: string;\n classes: string[];\n attrs: AttrBlock;\n anchors: AnchorDecl[];\n span: Span;\n /** Source offsets of the attribute block braces (for surgical patching). */\n attrOpen?: number;\n attrClose?: number;\n}\n\nexport interface EdgeOpInfo {\n glyph: string;\n midLabel?: string;\n}\n\nexport interface EdgeDecl {\n type: \"edge\";\n id?: string;\n /** fan groups connected by ops: groups[0] --op0--> groups[1] --op1--> ... */\n groups: Endpoint[][];\n ops: EdgeOpInfo[];\n label?: string; // trailing quoted label\n attrs: AttrBlock;\n span: Span;\n}\n\nexport interface GroupDecl {\n type: \"group\";\n id: string;\n label?: string;\n attrs: AttrBlock;\n layout?: LayoutDecl;\n items: SceneStmt[];\n span: Span;\n}\n\nexport interface LayoutDecl {\n type: \"layout\";\n kind: string;\n attrs: AttrBlock;\n span: Span;\n}\n\nexport interface UseStmt {\n type: \"use\";\n what: \"theme\" | \"class\" | \"macro\";\n name: string;\n args?: Value[];\n span: Span;\n}\n\nexport interface ClassApplyStmt {\n type: \"classapply\";\n id: string;\n classes: string[];\n span: Span;\n}\n\nexport interface MermaidDecl {\n type: \"mermaid\";\n body: string;\n span: Span;\n}\n\nexport type SceneStmt =\n | NodeDecl\n | EdgeDecl\n | GroupDecl\n | LayoutDecl\n | AnchorDecl\n | UseStmt\n | StyleDecl\n | AnnotateDecl\n | MermaidDecl\n | ClassApplyStmt;\n\n// ---- annotations -----------------------------------------------------------\n\nexport interface AnnotationCmd {\n type: \"annotcmd\";\n kind: string; // highlight, underline, point-at, spotlight, callout, box, ...\n target?: Endpoint;\n targetList?: Value; // for box [a,b,c]\n text?: string;\n attrs: AttrBlock;\n span: Span;\n}\n\nexport interface AnnotateDecl {\n type: \"annotate\";\n name?: string;\n commands: AnnotationCmd[];\n span: Span;\n}\n\n// ---- timeline --------------------------------------------------------------\n\nexport interface CameraStmt {\n type: \"camera\";\n op?: string; // fit-all, fit, focus, center, zoom, pan, follow, reset\n targets?: Value[]; // node/group ids or [list]\n zoom?: number;\n over?: number; // ms\n ease?: Value;\n pad?: number;\n pan?: [number, number];\n attrs: AttrBlock;\n span: Span;\n}\n\nexport interface RevealCmd {\n type: \"revealcmd\";\n verb: string; // show, hide, draw-on, emphasize, flow, pulse, pop, fade-in, ...\n targets: Value[];\n with?: string;\n attrs: AttrBlock;\n span: Span;\n}\n\nexport interface RevealBlock {\n type: \"reveal\";\n commands: RevealCmd[];\n span: Span;\n}\n\nexport interface StaggerStmt {\n type: \"stagger\";\n delayMs: number;\n commands: (RevealCmd | AnnotationCmd)[];\n span: Span;\n}\n\nexport interface Prop {\n type: \"prop\";\n key: string;\n value: Value;\n span: Span;\n}\n\nexport type BeatItem = CameraStmt | AnnotateDecl | RevealBlock | StaggerStmt | AnnotationCmd | RevealCmd | Prop;\n\nexport interface BeatDecl {\n type: \"beat\";\n id: string;\n title?: string;\n items: BeatItem[];\n span: Span;\n}\n\nexport interface TimelineDecl {\n type: \"timeline\";\n name?: string;\n props: Prop[];\n beats: BeatDecl[];\n span: Span;\n}\n\n// ---- top-level -------------------------------------------------------------\n\nexport interface MetaDecl {\n type: \"meta\";\n attrs: AttrBlock;\n span: Span;\n}\n\nexport interface ThemeDecl {\n type: \"theme\";\n name: string;\n extends?: string;\n tokens: { name: string; value: Value }[];\n props: AttrBlock;\n span: Span;\n}\n\nexport interface StyleDecl {\n type: \"style\";\n name: string; // class name (without leading dot)\n extends?: string;\n attrs: AttrBlock;\n span: Span;\n}\n\nexport interface DefaultsDecl {\n type: \"defaults\";\n rules: { target: string; attrs: AttrBlock }[];\n span: Span;\n}\n\nexport interface SceneDecl {\n type: \"scene\";\n name?: string;\n statements: SceneStmt[];\n span: Span;\n /** Source offsets of the scene block braces (for appending nodes/edges). */\n braceOpen?: number;\n braceClose?: number;\n}\n\nexport interface OverrideEntry {\n id: string;\n x: number;\n y: number;\n w?: number;\n h?: number;\n}\n\nexport interface OverridesDecl {\n type: \"overrides\";\n entries: OverrideEntry[];\n span: Span;\n}\n\nexport interface VersionDecl {\n type: \"version\";\n value: number;\n span: Span;\n}\n\nexport interface ImportDecl {\n type: \"import\";\n path: string;\n as?: string;\n span: Span;\n}\n\nexport type TopStmt =\n | VersionDecl\n | MetaDecl\n | ImportDecl\n | ThemeDecl\n | StyleDecl\n | DefaultsDecl\n | SceneDecl\n | TimelineDecl\n | AnnotateDecl\n | MermaidDecl\n | OverridesDecl;\n\nexport interface Program {\n type: \"program\";\n statements: TopStmt[];\n}\n","/**\n * Lowering helpers: map DSL surface enums/glyphs onto Scene IR values.\n * Kept separate from the parser so the same tables document the language and\n * drive the compiler.\n */\n\nimport { resolveFill, resolveStroke } from \"../scene/palette.js\";\nimport type {\n ArrowAnimationKind,\n ArrowheadKind,\n EdgeRouting,\n EasingName,\n FillStyle,\n ShapeKind,\n StrokeStyle,\n} from \"../scene/types.js\";\nimport type { Value } from \"./ast.js\";\n\n/** DSL shape name -> renderable ShapeKind. */\nexport const SHAPE_MAP: Record<string, ShapeKind> = {\n rect: \"rectangle\",\n rectangle: \"rectangle\",\n \"round-rect\": \"round-rectangle\",\n \"round-rectangle\": \"round-rectangle\",\n roundrect: \"round-rectangle\",\n ellipse: \"ellipse\",\n circle: \"circle\",\n diamond: \"diamond\",\n decision: \"diamond\",\n cylinder: \"cylinder\",\n db: \"cylinder\",\n database: \"cylinder\",\n hexagon: \"hexagon\",\n parallelogram: \"parallelogram\",\n trapezoid: \"trapezoid\",\n cloud: \"cloud\",\n actor: \"actor\",\n note: \"note\",\n document: \"document\",\n stadium: \"pill\",\n pill: \"pill\",\n subroutine: \"rectangle\",\n triangle: \"triangle\",\n star: \"star\",\n text: \"text\",\n image: \"rectangle\",\n frame: \"rectangle\",\n};\n\nexport function mapShape(name: string | undefined): ShapeKind {\n if (!name) return \"rectangle\";\n if (name.startsWith(\"custom:\")) return name;\n return SHAPE_MAP[name] ?? (name as ShapeKind);\n}\n\nexport interface GlyphLowering {\n strokeStyle: StrokeStyle;\n startArrowhead: ArrowheadKind;\n endArrowhead: ArrowheadKind;\n animation?: ArrowAnimationKind;\n strokeWidthMul?: number;\n routing?: EdgeRouting;\n}\n\n/** Edge glyph -> default styling (spec §6.2). Overridable by the trailing block. */\nexport function lowerGlyph(glyph: string): GlyphLowering {\n switch (glyph) {\n case \"--\":\n case \"---\":\n return { strokeStyle: \"solid\", startArrowhead: \"none\", endArrowhead: \"none\" };\n case \"->\":\n case \"-->\":\n case \"--->\":\n return { strokeStyle: \"solid\", startArrowhead: \"none\", endArrowhead: \"arrow\" };\n case \"<-\":\n case \"<--\":\n return { strokeStyle: \"solid\", startArrowhead: \"arrow\", endArrowhead: \"none\" };\n case \"<->\":\n case \"<-->\":\n return { strokeStyle: \"solid\", startArrowhead: \"arrow\", endArrowhead: \"arrow\" };\n case \"-.->\":\n return { strokeStyle: \"dashed\", startArrowhead: \"none\", endArrowhead: \"arrow\" };\n case \"..>\":\n return { strokeStyle: \"dotted\", startArrowhead: \"none\", endArrowhead: \"arrow\" };\n case \"==>\":\n return { strokeStyle: \"solid\", startArrowhead: \"none\", endArrowhead: \"arrow\", strokeWidthMul: 2.1 };\n case \"===\":\n return { strokeStyle: \"solid\", startArrowhead: \"none\", endArrowhead: \"none\", strokeWidthMul: 2.1 };\n case \"~>\":\n return { strokeStyle: \"solid\", startArrowhead: \"none\", endArrowhead: \"arrow\", animation: \"flow\", routing: \"curved\" };\n case \"--o\":\n case \"-o\":\n return { strokeStyle: \"solid\", startArrowhead: \"none\", endArrowhead: \"circle\" };\n case \"--x\":\n case \"-x\":\n return { strokeStyle: \"solid\", startArrowhead: \"none\", endArrowhead: \"bar\" };\n default:\n return { strokeStyle: \"solid\", startArrowhead: \"none\", endArrowhead: \"arrow\" };\n }\n}\n\nexport function mapStrokeWidth(v: Value): number | undefined {\n if (v.t === \"num\") return v.v;\n if (v.t === \"ident\") {\n return { thin: 1, medium: 1.4, bold: 2.8, thick: 3.4 }[v.v];\n }\n return undefined;\n}\n\nexport function mapRoughness(v: Value): number | undefined {\n if (v.t === \"num\") return v.v;\n if (v.t === \"ident\") {\n return { architect: 0, artist: 1, cartoonist: 2 }[v.v];\n }\n return undefined;\n}\n\nexport function mapFillStyle(v: Value): FillStyle | undefined {\n if (v.t !== \"ident\") return undefined;\n const ok = new Set([\"hachure\", \"cross-hatch\", \"solid\", \"zigzag\", \"dots\", \"none\"]);\n return ok.has(v.v) ? (v.v as FillStyle) : undefined;\n}\n\nexport function mapStrokeStyle(v: Value): StrokeStyle | undefined {\n if (v.t !== \"ident\") return undefined;\n return [\"solid\", \"dashed\", \"dotted\"].includes(v.v) ? (v.v as StrokeStyle) : undefined;\n}\n\nexport function mapRouting(v: Value): EdgeRouting | undefined {\n if (v.t !== \"ident\") return undefined;\n const map: Record<string, EdgeRouting> = {\n straight: \"straight\",\n bezier: \"curved\",\n curved: \"curved\",\n orthogonal: \"orthogonal\",\n elbow: \"elbow\",\n step: \"orthogonal\",\n arc: \"curved\",\n };\n return map[v.v];\n}\n\nexport function mapArrowhead(v: Value): ArrowheadKind | undefined {\n if (v.t !== \"ident\") return undefined;\n return v.v as ArrowheadKind;\n}\n\nexport function mapAnimation(v: Value): { kind: ArrowAnimationKind; speed?: number } | undefined {\n let name: string | undefined;\n let speed: number | undefined;\n if (v.t === \"ident\") name = v.v;\n else if (v.t === \"styled\") {\n name = v.name;\n const sp = v.block.find((a) => a.key === \"speed\");\n if (sp && sp.value.t === \"num\") speed = sp.value.v;\n }\n if (!name) return undefined;\n const known = new Set([\"none\", \"flow\", \"dash-march\", \"draw-on\", \"pulse\", \"comet\", \"gradient-flow\", \"electric\", \"glow\", \"caravan\", \"wiggle\"]);\n // remap a couple of spec names onto implemented kinds\n const remap: Record<string, ArrowAnimationKind> = { glow: \"comet\", caravan: \"dash-march\", wiggle: \"flow\" };\n const kind = (remap[name] ?? (known.has(name) ? name : \"flow\")) as ArrowAnimationKind;\n return { kind, speed };\n}\n\nexport function mapEasing(v: Value | undefined): EasingName {\n if (!v) return \"ease-in-out\";\n if (v.t === \"ident\") {\n const known: EasingName[] = [\"linear\", \"ease\", \"ease-in\", \"ease-out\", \"ease-in-out\", \"back-out\", \"anticipate\", \"spring\"];\n if ((known as string[]).includes(v.v)) return v.v as EasingName;\n if (v.v === \"magic\" || v.v === \"bounce\") return \"spring\";\n return \"ease-in-out\";\n }\n if (v.t === \"call\") {\n if (v.name === \"spring\") return \"spring\";\n return \"ease-in-out\";\n }\n return \"ease-in-out\";\n}\n\n/** Resolve a color-ish value to a hex/CSS string, following $token indirection. */\nexport function resolveColor(v: Value, tokens: Map<string, Value>, kind: \"stroke\" | \"fill\", depth = 0): string | null {\n if (depth > 8) return null;\n switch (v.t) {\n case \"color\":\n return v.v;\n case \"str\":\n return kind === \"fill\" ? resolveFill(v.v) : resolveStroke(v.v, \"#1e1e1e\");\n case \"ident\":\n return kind === \"fill\" ? resolveFill(v.v) : resolveStroke(v.v, \"#1e1e1e\");\n case \"token\": {\n const t = tokens.get(v.v);\n if (!t) return null;\n return resolveColor(t, tokens, kind, depth + 1);\n }\n default:\n return null;\n }\n}\n\nexport function numberOf(v: Value | undefined): number | undefined {\n return v && v.t === \"num\" ? v.v : undefined;\n}\n","/**\n * Compiler: EDodoDraw AST -> Scene IR. Applies the style cascade (theme tokens\n * -> defaults -> classes -> inline), expands edge chains/fan-outs, lifts\n * annotate blocks and timeline beats into the IR, then runs auto-layout.\n */\n\nimport { applyLayout } from \"../layout/index.js\";\nimport { applyOverrides } from \"../scene/overrides.js\";\nimport { emptyScene, makeEdge, makeNode } from \"../scene/defaults.js\";\nimport { resolveMarker } from \"../scene/palette.js\";\nimport type {\n Annotation,\n AnnotationTarget,\n CameraDirective,\n EdgeRouting,\n EdgeStyle,\n LayoutKind,\n NodeStyle,\n Scene,\n SceneGroup,\n Step,\n} from \"../scene/types.js\";\nimport type {\n AnnotationCmd,\n AttrBlock,\n BeatDecl,\n EdgeDecl,\n Endpoint,\n GroupDecl,\n NodeDecl,\n Program,\n SceneStmt,\n Value,\n} from \"./ast.js\";\nimport { attr } from \"./ast.js\";\nimport { DiagnosticBag } from \"./diagnostics.js\";\nimport {\n lowerGlyph,\n mapAnimation,\n mapArrowhead,\n mapEasing,\n mapFillStyle,\n mapRoughness,\n mapRouting,\n mapShape,\n mapStrokeStyle,\n mapStrokeWidth,\n numberOf,\n resolveColor,\n} from \"./lower.js\";\n\nexport interface CompileOptions {\n diagnostics?: DiagnosticBag;\n}\n\nexport interface CompileResult {\n scene: Scene;\n diagnostics: DiagnosticBag;\n}\n\nconst FONT_MAP: Record<string, NodeStyle[\"fontFamily\"]> = {\n hand: \"hand\",\n normal: \"normal\",\n sans: \"normal\",\n mono: \"code\",\n code: \"code\",\n};\n\nexport function compileProgram(program: Program, opts: CompileOptions = {}): CompileResult {\n const diags = opts.diagnostics ?? new DiagnosticBag();\n\n // ---- gather top-level declarations --------------------------------------\n const themes = new Map<string, { tokens: { name: string; value: Value }[]; props: AttrBlock; extends?: string }>();\n const styles = new Map<string, { attrs: AttrBlock; extends?: string }>();\n const defaults = new Map<string, AttrBlock>();\n const sceneStmts: SceneStmt[] = [];\n const annotateTop: AnnotationCmd[] = [];\n let timeline: BeatDecl[] = [];\n let timelineProps: Record<string, Value> = {};\n const metaAttrs: AttrBlock = [];\n const overrideEntries: Scene[\"overrides\"] = [];\n let activeTheme: string | undefined;\n let hasMermaid = false;\n\n for (const s of program.statements) {\n switch (s.type) {\n case \"overrides\":\n overrideEntries!.push(...s.entries);\n break;\n case \"meta\":\n metaAttrs.push(...s.attrs);\n break;\n case \"theme\":\n themes.set(s.name, { tokens: s.tokens, props: s.props, extends: s.extends });\n break;\n case \"style\":\n styles.set(s.name, { attrs: s.attrs, extends: s.extends });\n break;\n case \"defaults\":\n for (const r of s.rules) defaults.set(r.target, [...(defaults.get(r.target) ?? []), ...r.attrs]);\n break;\n case \"scene\":\n sceneStmts.push(...s.statements);\n break;\n case \"annotate\":\n annotateTop.push(...s.commands);\n break;\n case \"timeline\":\n timeline = s.beats;\n timelineProps = Object.fromEntries(s.props.map((p) => [p.key, p.value]));\n break;\n case \"mermaid\":\n hasMermaid = true;\n break;\n }\n }\n\n if (hasMermaid) {\n diags.warn(\"W-MERMAID-SYNC\", \"the pure compiler skips `mermaid` blocks; import Mermaid via the EdodoDraw facade or convertMermaid()\", { line: 1, col: 1, start: 0, end: 0 }, { hint: \"see docs/IMPORT_AND_EXPORT_GUIDE\" });\n }\n\n // ---- collect scene statements (recursing into groups) -------------------\n const nodeDecls = new Map<string, NodeDecl>();\n const nodeOrder: string[] = [];\n const edgeDecls: EdgeDecl[] = [];\n const groupInfos: { decl: GroupDecl; members: string[] }[] = [];\n const nodeGroup = new Map<string, string>();\n const sceneAnnotates: AnnotationCmd[] = [];\n let layoutKind: string | undefined;\n let layoutAttrs: AttrBlock = [];\n\n const mergeNodeDecl = (nd: NodeDecl, group?: string) => {\n const existing = nodeDecls.get(nd.id);\n if (existing) {\n existing.classes.push(...nd.classes);\n existing.attrs.push(...nd.attrs);\n existing.anchors.push(...nd.anchors);\n if (nd.shape) existing.shape = nd.shape;\n if (nd.label !== undefined) existing.label = nd.label;\n } else {\n nodeDecls.set(nd.id, { ...nd, classes: [...nd.classes], attrs: [...nd.attrs], anchors: [...nd.anchors] });\n nodeOrder.push(nd.id);\n }\n if (group) nodeGroup.set(nd.id, group);\n };\n\n const walk = (stmts: SceneStmt[], group?: string) => {\n for (const st of stmts) {\n switch (st.type) {\n case \"node\":\n mergeNodeDecl(st, group);\n break;\n case \"edge\":\n edgeDecls.push(st);\n break;\n case \"group\": {\n const members: string[] = [];\n for (const it of st.items) if (it.type === \"node\") members.push(it.id);\n groupInfos.push({ decl: st, members });\n walk(st.items, st.id);\n break;\n }\n case \"layout\":\n layoutKind = st.kind;\n layoutAttrs = st.attrs;\n break;\n case \"use\":\n if (st.what === \"theme\") activeTheme = st.name;\n break;\n case \"style\":\n styles.set(st.name, { attrs: st.attrs, extends: st.extends });\n break;\n case \"annotate\":\n sceneAnnotates.push(...st.commands);\n break;\n case \"classapply\": {\n const nd: NodeDecl = { type: \"node\", id: st.id, classes: st.classes, attrs: [], anchors: [], span: st.span };\n mergeNodeDecl(nd, group);\n break;\n }\n case \"anchor\":\n // scene-level anchor: attach to its node as a synthetic attr later (skipped in M2 render)\n break;\n case \"mermaid\":\n hasMermaid = true;\n break;\n }\n }\n };\n walk(sceneStmts);\n\n // ---- theme tokens -------------------------------------------------------\n const tokenMap = new Map<string, Value>();\n const themeName = activeTheme ?? [...themes.keys()][0];\n if (themeName) {\n // resolve extends chain (base first)\n const chain: string[] = [];\n let cur: string | undefined = themeName;\n const seen = new Set<string>();\n while (cur && themes.has(cur) && !seen.has(cur)) {\n chain.unshift(cur);\n seen.add(cur);\n cur = themes.get(cur)!.extends;\n }\n for (const name of chain) {\n for (const t of themes.get(name)!.tokens) tokenMap.set(t.name, t.value);\n }\n }\n const mode: \"light\" | \"dark\" = themeName?.toLowerCase().includes(\"dark\") ? \"dark\" : \"light\";\n\n // ---- class chain resolution --------------------------------------------\n const classAttrs = (name: string, seen = new Set<string>()): { attrs: AttrBlock } => {\n if (seen.has(name) || !styles.has(name)) return { attrs: [] };\n seen.add(name);\n const s = styles.get(name)!;\n const base = s.extends ? classAttrs(s.extends, seen).attrs : [];\n return { attrs: [...base, ...s.attrs] };\n };\n\n // ---- build scene --------------------------------------------------------\n const scene = emptyScene(mode);\n applyMeta(scene, metaAttrs, tokenMap);\n\n // node styling\n const styleFor = (kind: \"node\" | \"edge\", classes: string[], inline: AttrBlock): AttrBlock => {\n const layered: AttrBlock = [];\n for (const a of defaults.get(kind) ?? []) layered.push(a);\n for (const c of classes) layered.push(...classAttrs(c).attrs);\n layered.push(...inline);\n return layered;\n };\n\n const ensureNode = (id: string, label?: string) => {\n if (scene.nodes.some((n) => n.id === id)) return;\n scene.nodes.push(makeNode({ id, label: label ?? id, mode }));\n };\n\n // create nodes\n for (const id of nodeOrder) {\n const nd = nodeDecls.get(id)!;\n const classes = collectClasses(nd);\n const layered = styleFor(\"node\", classes, nd.attrs);\n const built = buildNodeStyle(layered, tokenMap, mode);\n const shape = mapShape(built.shape ?? nd.shape);\n const label = built.label ?? nd.label ?? prettyId(id);\n const node = makeNode({\n id,\n shape,\n label,\n style: built.style,\n x: built.x,\n y: built.y,\n w: built.w,\n h: built.h,\n pinned: built.pinned,\n group: nodeGroup.get(id),\n mode,\n data: { tags: collectTags(nd), classes },\n });\n scene.nodes.push(node);\n }\n\n // groups\n for (const gi of groupInfos) {\n const g: SceneGroup = {\n id: gi.decl.id,\n label: gi.decl.label ?? \"\",\n members: gi.members,\n style: buildGroupStyle(gi.decl.attrs, tokenMap),\n frame: true,\n };\n scene.groups.push(g);\n }\n\n // edges (expand chains + fan)\n let edgeSeq = 0;\n for (const ed of edgeDecls) {\n for (let h = 0; h < ed.ops.length; h++) {\n const gl = lowerGlyph(ed.ops[h].glyph);\n const fromSet = ed.groups[h];\n const toSet = ed.groups[h + 1];\n const singleHop = ed.ops.length === 1;\n for (const from of fromSet) {\n for (const to of toSet) {\n if (from.inline) ensureInline(scene, from.inline, tokenMap, mode, styleFor);\n if (to.inline) ensureInline(scene, to.inline, tokenMap, mode, styleFor);\n ensureNode(from.id);\n ensureNode(to.id);\n const label = ed.ops[h].midLabel ?? (singleHop ? ed.label : undefined) ?? \"\";\n const id = ed.id && singleHop && fromSet.length === 1 && toSet.length === 1 ? ed.id : `e${edgeSeq++}_${from.id}_${to.id}`;\n const built = buildEdgeStyle(gl, styleFor(\"edge\", [], ed.attrs), tokenMap, mode);\n const edge = makeEdge({\n id,\n from: from.id,\n to: to.id,\n fromAnchor: endpointAnchor(from),\n toAnchor: endpointAnchor(to),\n label,\n style: built.style,\n routing: built.routing ?? gl.routing ?? \"straight\",\n mode,\n });\n scene.edges.push(edge);\n }\n }\n }\n }\n\n // fan parallel edges (same unordered node pair) apart so they don't overlap\n const pairCount = new Map<string, number>();\n const pairKey = (e: (typeof scene.edges)[number]) => [e.from.node, e.to.node].filter(Boolean).sort().join(\"|\");\n for (const e of scene.edges) pairCount.set(pairKey(e), (pairCount.get(pairKey(e)) ?? 0) + 1);\n const pairIdx = new Map<string, number>();\n for (const e of scene.edges) {\n const key = pairKey(e);\n const count = pairCount.get(key)!;\n if (count > 1) {\n const idx = pairIdx.get(key) ?? 0;\n pairIdx.set(key, idx + 1);\n e.data = { ...e.data, parallel: { index: idx, count } };\n e.routing = \"curved\";\n }\n }\n\n // ---- annotations (script) ----------------------------------------------\n for (const cmd of [...annotateTop, ...sceneAnnotates]) {\n const a = annotationFromCmd(cmd, tokenMap, \"script\");\n if (a) scene.annotations.push(a);\n }\n\n // ---- timeline -> steps --------------------------------------------------\n scene.steps = timeline.map((b, idx) => beatToStep(b, idx, scene, tokenMap, timelineProps));\n\n // ---- layout -------------------------------------------------------------\n scene.meta.layout = resolveLayoutKind(layoutKind, scene);\n const dir = layoutAttrs.length ? attr(layoutAttrs, \"direction\") : undefined;\n if (dir && dir.t === \"ident\") (scene.meta as { direction?: string }).direction = dir.v;\n const gap = numberOf(attr(layoutAttrs, \"gap\"));\n const rankGap = numberOf(attr(layoutAttrs, \"rankGap\")) ?? numberOf(attr(layoutAttrs, \"rankgap\"));\n if (gap || rankGap) scene.meta.spacing = { node: gap, rank: rankGap };\n const centerId = attr(layoutAttrs, \"center\");\n if (centerId && centerId.t === \"ref\") (scene.meta as { center?: string }).center = centerId.id;\n else if (centerId && centerId.t === \"ident\") (scene.meta as { center?: string }).center = centerId.v;\n\n // Position/size overrides (direct-edit round-trip): pin before layout.\n if (overrideEntries && overrideEntries.length) {\n scene.overrides = overrideEntries;\n applyOverrides(scene);\n }\n\n applyLayout(scene);\n\n return { scene, diagnostics: diags };\n}\n\n// ---- helpers ---------------------------------------------------------------\n\nfunction prettyId(id: string): string {\n return id;\n}\n\nfunction collectClasses(nd: NodeDecl): string[] {\n const out = [...nd.classes];\n for (const a of nd.attrs) {\n if (a.key === \"__use\" && a.value.t === \"class\") out.push(a.value.v);\n if (a.key === \"class\" && a.value.t === \"ident\") out.push(a.value.v);\n if (a.key === \"class\" && a.value.t === \"class\") out.push(a.value.v);\n }\n return out;\n}\n\nfunction collectTags(nd: NodeDecl): string[] {\n const tags: string[] = [];\n const t = nd.attrs.find((a) => a.key === \"tags\");\n if (t && t.value.t === \"list\") {\n for (const v of t.value.v) if (v.t === \"ident\") tags.push(v.v);\n }\n return tags;\n}\n\ninterface BuiltNode {\n style: Partial<NodeStyle>;\n shape?: string;\n label?: string;\n x?: number;\n y?: number;\n w?: number;\n h?: number;\n pinned?: boolean;\n}\n\nfunction buildNodeStyle(attrs: AttrBlock, tokens: Map<string, Value>, _mode: \"light\" | \"dark\"): BuiltNode {\n const style: Partial<NodeStyle> = {};\n const out: BuiltNode = { style };\n for (const a of attrs) {\n const v = a.value;\n switch (a.key) {\n case \"stroke\":\n case \"color\": {\n const c = resolveColor(v, tokens, \"stroke\");\n if (c) style.stroke = c;\n break;\n }\n case \"fill\":\n case \"bg\":\n case \"bgColor\":\n case \"background\": {\n const c = resolveColor(v, tokens, \"fill\");\n style.fill = c;\n break;\n }\n case \"fillStyle\": {\n const fs = mapFillStyle(v);\n if (fs) style.fillStyle = fs;\n break;\n }\n case \"strokeWidth\": {\n const w = mapStrokeWidth(v);\n if (w != null) style.strokeWidth = w;\n break;\n }\n case \"strokeStyle\": {\n const ss = mapStrokeStyle(v);\n if (ss) style.strokeStyle = ss;\n break;\n }\n case \"roughness\": {\n const r = mapRoughness(v);\n if (r != null) style.roughness = r;\n break;\n }\n case \"roundness\":\n case \"radius\":\n if (v.t === \"num\") style.roundness = v.v;\n break;\n case \"font\":\n if (v.t === \"ident\") style.fontFamily = FONT_MAP[v.v] ?? \"hand\";\n break;\n case \"fontSize\":\n if (v.t === \"num\") style.fontSize = v.v;\n break;\n case \"textColor\": {\n const c = resolveColor(v, tokens, \"stroke\");\n if (c) style.textColor = c;\n break;\n }\n case \"textAlign\":\n if (v.t === \"ident\") style.textAlign = v.v as NodeStyle[\"textAlign\"];\n break;\n case \"opacity\":\n if (v.t === \"num\") style.opacity = v.unit === \"%\" ? v.v : v.v <= 1 ? v.v * 100 : v.v;\n break;\n case \"shape\":\n if (v.t === \"ident\") out.shape = v.v;\n else if (v.t === \"call\" && v.name === \"custom\") out.shape = `custom:${v.args[0]?.t === \"str\" ? v.args[0].v : \"\"}`;\n break;\n case \"label\":\n case \"text\":\n if (v.t === \"str\") out.label = v.v;\n break;\n case \"at\":\n if (v.t === \"tuple\" && v.v[0]?.t === \"num\" && v.v[1]?.t === \"num\") {\n out.x = v.v[0].v;\n out.y = v.v[1].v;\n }\n break;\n case \"pin\":\n if (v.t === \"bool\") out.pinned = v.v;\n break;\n case \"size\":\n if (v.t === \"tuple\" && v.v[0]?.t === \"num\" && v.v[1]?.t === \"num\") {\n out.w = v.v[0].v;\n out.h = v.v[1].v;\n }\n break;\n case \"w\":\n case \"width\":\n if (v.t === \"num\") out.w = v.v;\n break;\n case \"h\":\n case \"height\":\n if (v.t === \"num\") out.h = v.v;\n break;\n }\n }\n if (out.pinned === undefined && out.x != null) out.pinned = true;\n return out;\n}\n\nfunction buildGroupStyle(attrs: AttrBlock, tokens: Map<string, Value>): Partial<NodeStyle> {\n const style: Partial<NodeStyle> = {};\n const stroke = attrs.find((a) => a.key === \"stroke\" || a.key === \"color\");\n if (stroke) {\n const c = resolveColor(stroke.value, tokens, \"stroke\");\n if (c) style.stroke = c;\n }\n const fill = attrs.find((a) => a.key === \"fill\" || a.key === \"bg\");\n if (fill) style.fill = resolveColor(fill.value, tokens, \"fill\");\n return style;\n}\n\ninterface BuiltEdge {\n style: Partial<EdgeStyle>;\n routing?: EdgeRouting;\n}\n\nfunction buildEdgeStyle(\n gl: ReturnType<typeof lowerGlyph>,\n attrs: AttrBlock,\n tokens: Map<string, Value>,\n _mode: \"light\" | \"dark\",\n): BuiltEdge {\n const style: Partial<EdgeStyle> = {\n strokeStyle: gl.strokeStyle,\n startArrowhead: gl.startArrowhead,\n endArrowhead: gl.endArrowhead,\n };\n if (gl.animation) style.animation = gl.animation;\n if (gl.strokeWidthMul) style.strokeWidth = 1.4 * gl.strokeWidthMul;\n let routing: BuiltEdge[\"routing\"];\n for (const a of attrs) {\n const v = a.value;\n switch (a.key) {\n case \"stroke\":\n case \"color\": {\n const c = resolveColor(v, tokens, \"stroke\");\n if (c) style.stroke = c;\n break;\n }\n case \"strokeWidth\": {\n const w = mapStrokeWidth(v);\n if (w != null) style.strokeWidth = w;\n break;\n }\n case \"strokeStyle\": {\n const ss = mapStrokeStyle(v);\n if (ss) style.strokeStyle = ss;\n break;\n }\n case \"roughness\": {\n const r = mapRoughness(v);\n if (r != null) style.roughness = r;\n break;\n }\n case \"startArrow\":\n case \"startArrowhead\": {\n const ah = mapArrowhead(v);\n if (ah) style.startArrowhead = ah;\n break;\n }\n case \"endArrow\":\n case \"endArrowhead\": {\n const ah = mapArrowhead(v);\n if (ah) style.endArrowhead = ah;\n break;\n }\n case \"animate\":\n case \"animation\": {\n const an = mapAnimation(v);\n if (an) {\n style.animation = an.kind;\n if (an.speed) style.animationSpeed = an.speed;\n }\n break;\n }\n case \"curve\":\n case \"routing\": {\n const r = mapRouting(v);\n if (r) routing = r;\n break;\n }\n case \"opacity\":\n if (v.t === \"num\") style.opacity = v.unit === \"%\" ? v.v : v.v <= 1 ? v.v * 100 : v.v;\n break;\n case \"fontSize\":\n if (v.t === \"num\") style.fontSize = v.v;\n break;\n case \"textColor\": {\n const c = resolveColor(v, tokens, \"stroke\");\n if (c) style.textColor = c;\n break;\n }\n case \"labelBg\": {\n const c = resolveColor(v, tokens, \"fill\");\n style.labelBg = c;\n break;\n }\n }\n }\n return { style, routing };\n}\n\nfunction endpointAnchor(e: Endpoint): string | undefined {\n if (e.uv) return `@${e.uv[0]},${e.uv[1]}`; // engine ignores unknown -> center; refined later\n if (e.sub && e.sub !== \"label\" && e.sub !== \"text\") return e.sub;\n return undefined;\n}\n\nfunction ensureInline(\n scene: Scene,\n nd: NodeDecl,\n tokens: Map<string, Value>,\n mode: \"light\" | \"dark\",\n styleFor: (kind: \"node\" | \"edge\", classes: string[], inline: AttrBlock) => AttrBlock,\n): void {\n if (scene.nodes.some((n) => n.id === nd.id)) return;\n const layered = styleFor(\"node\", nd.classes, nd.attrs);\n const built = buildNodeStyle(layered, tokens, mode);\n scene.nodes.push(\n makeNode({\n id: nd.id,\n shape: mapShape(built.shape ?? nd.shape),\n label: built.label ?? nd.label ?? nd.id,\n style: built.style,\n x: built.x,\n y: built.y,\n w: built.w,\n h: built.h,\n pinned: built.pinned,\n mode,\n }),\n );\n}\n\nfunction applyMeta(scene: Scene, attrs: AttrBlock, tokens: Map<string, Value>): void {\n for (const a of attrs) {\n if (a.key === \"title\" && a.value.t === \"str\") scene.meta.title = a.value.v;\n if (a.key === \"background\" || a.key === \"bg\") {\n const c = resolveColor(a.value, tokens, \"fill\");\n if (c) scene.meta.background = c;\n }\n }\n}\n\nfunction resolveLayoutKind(kind: string | undefined, scene: Scene): LayoutKind {\n if (!kind) {\n // default: if every node is pinned or has coords, treat as manual\n const anyUnpinned = scene.nodes.some((n) => !n.pinned);\n return anyUnpinned ? \"dag\" : \"manual\";\n }\n const map: Record<string, LayoutKind> = {\n dag: \"dag\",\n tree: \"dag\",\n flow: \"dag\",\n force: \"dag\",\n grid: \"grid\",\n radial: \"radial\",\n free: \"manual\",\n manual: \"manual\",\n };\n return map[kind] ?? \"dag\";\n}\n\n// ---- annotations -----------------------------------------------------------\n\nfunction valueToPlain(v: Value, tokens: Map<string, Value>): unknown {\n switch (v.t) {\n case \"num\":\n return v.v;\n case \"str\":\n case \"ident\":\n case \"color\":\n case \"class\":\n return v.v;\n case \"bool\":\n return v.v;\n case \"token\": {\n const t = tokens.get(v.v);\n return t ? valueToPlain(t, tokens) : undefined;\n }\n case \"tuple\":\n case \"list\":\n return v.v.map((x) => valueToPlain(x, tokens));\n default:\n return undefined;\n }\n}\n\nfunction annotationTargetFromEndpoint(e: Endpoint | undefined): AnnotationTarget {\n if (!e) return { ref: null };\n return { ref: e.id, part: e.sub };\n}\n\nexport function annotationFromCmd(cmd: AnnotationCmd, tokens: Map<string, Value>, origin: \"script\" | \"live\"): Annotation | null {\n const colorAttr = cmd.attrs.find((a) => a.key === \"color\");\n const colorPlain = colorAttr ? (resolveColor(colorAttr.value, tokens, \"stroke\") ?? String(valueToPlain(colorAttr.value, tokens))) : undefined;\n const options: Record<string, unknown> = {};\n for (const a of cmd.attrs) {\n if (a.key === \"color\") continue;\n options[a.key] = valueToPlain(a.value, tokens);\n }\n // members for box/spotlight over a list\n let members: string[] | undefined;\n if (cmd.targetList && cmd.targetList.t === \"list\") {\n members = cmd.targetList.v.map((v) => (v.t === \"ident\" ? v.v : v.t === \"ref\" ? v.id : \"\")).filter(Boolean);\n options.members = members;\n }\n const target = cmd.targetList ? { ref: members?.[0] ?? null } : annotationTargetFromEndpoint(cmd.target);\n const defaultColor = cmd.kind === \"highlight\" ? resolveMarker(undefined) : cmd.kind === \"spotlight\" ? \"#000000\" : \"#1971c2\";\n return {\n id: `an_${cmd.span.start}_${cmd.kind}`,\n kind: cmd.kind,\n target,\n text: cmd.text,\n color: colorPlain ?? defaultColor,\n options,\n z: 0,\n origin,\n };\n}\n\n// ---- timeline --------------------------------------------------------------\n\nfunction resolveTargetIds(v: Value, scene: Scene): string[] {\n switch (v.t) {\n case \"ident\": {\n if (v.v === \"all\") return [...scene.nodes.map((n) => n.id), ...scene.edges.map((e) => e.id)];\n if (v.v === \"nodes\") return scene.nodes.map((n) => n.id);\n if (v.v === \"edges\") return scene.edges.map((e) => e.id);\n if (v.v === \"groups\") return scene.groups.map((g) => g.id);\n return [v.v];\n }\n case \"ref\":\n return [v.id];\n case \"class\": {\n const cls = v.v;\n return scene.nodes\n .filter((n) => {\n const d = (n.data ?? {}) as { classes?: string[]; tags?: string[] };\n return d.classes?.includes(cls) || d.tags?.includes(cls);\n })\n .map((n) => n.id);\n }\n case \"list\":\n return v.v.flatMap((x) => resolveTargetIds(x, scene));\n case \"str\":\n return [v.v];\n default:\n return [];\n }\n}\n\nfunction beatToStep(b: BeatDecl, idx: number, scene: Scene, tokens: Map<string, Value>, timelineProps: Record<string, Value>): Step {\n const step: Step = {\n id: b.id || `beat_${idx}`,\n name: b.title ?? b.id,\n annotations: [],\n reveal: [],\n hide: [],\n };\n\n for (const item of b.items) {\n switch (item.type) {\n case \"camera\":\n step.camera = cameraDirective(item, scene, tokens, timelineProps);\n break;\n case \"annotate\":\n for (const c of item.commands) {\n const a = annotationFromCmd(c, tokens, \"script\");\n if (a) step.annotations.push(a);\n }\n break;\n case \"annotcmd\": {\n const a = annotationFromCmd(item, tokens, \"script\");\n if (a) step.annotations.push(a);\n break;\n }\n case \"reveal\":\n for (const c of item.commands) applyRevealToStep(c, scene, step);\n break;\n case \"revealcmd\":\n applyRevealToStep(item, scene, step);\n break;\n case \"stagger\":\n for (const c of item.commands) {\n if (c.type === \"revealcmd\") applyRevealToStep(c, scene, step);\n else {\n const a = annotationFromCmd(c, tokens, \"script\");\n if (a) step.annotations.push(a);\n }\n }\n break;\n case \"prop\":\n if (item.key === \"narrate\" && item.value.t === \"str\") step.caption = item.value.v;\n if ((item.key === \"hold\" || item.key === \"wait\") && item.value.t === \"num\") {\n step.autoAdvanceMs = item.value.unit === \"s\" ? item.value.v * 1000 : item.value.v;\n }\n break;\n }\n }\n return step;\n}\n\nfunction applyRevealToStep(c: { verb: string; targets: Value[] }, scene: Scene, step: Step): void {\n const ids = c.targets.flatMap((t) => resolveTargetIds(t, scene));\n if (c.verb === \"hide\" || c.verb === \"fade-out\" || c.verb === \"remove\") {\n step.hide!.push(...ids);\n } else {\n step.reveal!.push(...ids);\n }\n}\n\nfunction cameraDirective(cam: import(\"./ast.js\").CameraStmt, scene: Scene, _tokens: Map<string, Value>, timelineProps: Record<string, Value>): CameraDirective {\n const op = (cam.op ?? \"fit-all\") as CameraDirective[\"op\"];\n const directive: CameraDirective = { op: normalizeCamOp(op) };\n if (cam.targets && cam.targets.length) {\n directive.targets = cam.targets.flatMap((t) => resolveTargetIds(t, scene));\n }\n if (cam.zoom != null) directive.zoom = cam.zoom;\n if (cam.pad != null) directive.padding = cam.pad;\n if (cam.pan) directive.center = { x: cam.pan[0], y: cam.pan[1] };\n directive.easing = mapEasing(cam.ease ?? timelineProps.defaultEase);\n if (cam.over != null) directive.durationMs = cam.over;\n return directive;\n}\n\nfunction normalizeCamOp(op: string): CameraDirective[\"op\"] {\n switch (op) {\n case \"fit-all\":\n case \"reset\":\n return \"fit-all\";\n case \"fit\":\n return \"focus\";\n case \"focus\":\n return \"focus\";\n case \"center\":\n return \"focus\";\n case \"zoom\":\n return \"zoom\";\n case \"pan\":\n return \"pan\";\n case \"follow\":\n return \"focus\";\n default:\n return \"focus\";\n }\n}\n","/**\n * Public DSL entrypoint: source text -> { scene, diagnostics }.\n * This is the \"100% code -> diagram\" contract.\n */\n\nimport { compileProgram } from \"./compile.js\";\nimport { DiagnosticBag, formatDiagnostic } from \"./diagnostics.js\";\nimport { parse } from \"./parser.js\";\nimport type { Scene } from \"../scene/types.js\";\n\nexport interface CompileEddResult {\n scene: Scene;\n diagnostics: DiagnosticBag;\n /** Formatted, human-readable diagnostics (one block each). */\n report: string[];\n}\n\nexport function compileEdd(source: string): CompileEddResult {\n const { program, diagnostics } = parse(source);\n const { scene } = compileProgram(program, { diagnostics });\n const report = diagnostics.items.map((d) => formatDiagnostic(d, source));\n return { scene, diagnostics, report };\n}\n\nexport { parse } from \"./parser.js\";\nexport { compileProgram } from \"./compile.js\";\nexport { lex } from \"./lexer.js\";\nexport { DiagnosticBag, formatDiagnostic } from \"./diagnostics.js\";\nexport type { Diagnostic } from \"./diagnostics.js\";\n","/**\n * The hand-drawn Virgil font (OFL) embedded as a base64 data URI so the\n * engine is fully self-contained — text renders correctly in the app, in\n * exported SVGs, and in any host app that consumes the npm package, with no\n * external /fonts dependency. Source: public/fonts/Virgil-Regular.woff2.\n */\nexport const HAND_FONT_WOFF2_DATA_URI =\n \"data:font/woff2;base64,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\";\n","/**\n * Export helpers: turn the live diagram into a self-contained SVG (with the\n * hand-drawn font embedded as base64 so it renders anywhere), a PNG raster, the\n * raw scene JSON, or the source code. All framing uses the scene's content\n * bbox, independent of the current camera.\n */\n\nimport { bboxToRect, expandBBox } from \"./geometry.js\";\nimport { sceneBBox } from \"./scene/query.js\";\nimport type { Scene } from \"./scene/types.js\";\nimport { HAND_FONT_WOFF2_DATA_URI } from \"./render/fontData.js\";\nimport type { SvgRenderer } from \"./render/svgRenderer.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/** The hand-drawn font as an @font-face rule (embedded, no fetch). */\nfunction embeddedFontCss(): string {\n const src = `url(${HAND_FONT_WOFF2_DATA_URI}) format(\"woff2\")`;\n return `\n@font-face { font-family: \"Excalifont\"; src: ${src}; }\n@font-face { font-family: \"Virgil\"; src: ${src}; }`;\n}\n\nexport interface ExportOptions {\n padding?: number;\n embedFont?: boolean;\n scale?: number; // PNG only\n background?: string | null;\n}\n\n/** Build a standalone SVG string of the whole scene at content coordinates. */\nexport async function exportSVGString(renderer: SvgRenderer, scene: Scene, opts: ExportOptions = {}): Promise<string> {\n const padding = opts.padding ?? 40;\n const box = expandBBox(sceneBBox(scene), padding);\n const rect = bboxToRect(Number.isFinite(box.minX) ? box : { minX: 0, minY: 0, maxX: 400, maxY: 300 });\n\n const clone = renderer.svg.cloneNode(true) as SVGSVGElement;\n // reset camera + drop screen-space overlays / live layer selection artifacts\n clone.querySelector(\".edd-world\")?.removeAttribute(\"transform\");\n clone.querySelector(\".edd-layer-screen\")?.remove();\n clone.querySelectorAll(\".edd-hidden\").forEach((el) => el.remove());\n clone.setAttribute(\"viewBox\", `${rect.x} ${rect.y} ${rect.w} ${rect.h}`);\n clone.setAttribute(\"width\", String(rect.w));\n clone.setAttribute(\"height\", String(rect.h));\n clone.style.removeProperty(\"position\");\n clone.style.removeProperty(\"inset\");\n clone.style.width = \"\";\n clone.style.height = \"\";\n\n // background rect: cover the viewBox\n const bg = clone.querySelector(\".edd-bg\") as SVGRectElement | null;\n const bgColor = opts.background === undefined ? scene.meta.background || scene.theme.background : opts.background;\n if (bg) {\n if (bgColor) {\n bg.setAttribute(\"x\", String(rect.x));\n bg.setAttribute(\"y\", String(rect.y));\n bg.setAttribute(\"width\", String(rect.w));\n bg.setAttribute(\"height\", String(rect.h));\n bg.setAttribute(\"fill\", bgColor);\n } else {\n bg.remove();\n }\n }\n\n // embed font\n if (opts.embedFont !== false) {\n const css = embeddedFontCss();\n if (css) {\n const style = document.createElementNS(SVG_NS, \"style\");\n style.textContent = css;\n clone.insertBefore(style, clone.firstChild);\n }\n }\n\n clone.setAttribute(\"xmlns\", SVG_NS);\n return '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n' + new XMLSerializer().serializeToString(clone);\n}\n\nexport async function exportPNGBlob(renderer: SvgRenderer, scene: Scene, opts: ExportOptions = {}): Promise<Blob> {\n const scale = opts.scale ?? 2;\n const svg = await exportSVGString(renderer, scene, { ...opts, background: opts.background === undefined ? scene.theme.background : opts.background });\n const box = expandBBox(sceneBBox(scene), opts.padding ?? 40);\n const rect = bboxToRect(Number.isFinite(box.minX) ? box : { minX: 0, minY: 0, maxX: 400, maxY: 300 });\n\n const blobUrl = URL.createObjectURL(new Blob([svg], { type: \"image/svg+xml\" }));\n try {\n const img = await loadImage(blobUrl);\n const canvas = document.createElement(\"canvas\");\n canvas.width = Math.max(1, Math.round(rect.w * scale));\n canvas.height = Math.max(1, Math.round(rect.h * scale));\n const ctx = canvas.getContext(\"2d\")!;\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\n return await new Promise<Blob>((resolve, reject) => canvas.toBlob((b) => (b ? resolve(b) : reject(new Error(\"toBlob failed\"))), \"image/png\"));\n } finally {\n URL.revokeObjectURL(blobUrl);\n }\n}\n\nfunction loadImage(url: 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 = url;\n });\n}\n\nexport function download(filename: string, data: Blob | string, type = \"text/plain\"): void {\n const blob = typeof data === \"string\" ? new Blob([data], { type }) : data;\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\nexport async function downloadSVG(renderer: SvgRenderer, scene: Scene): Promise<void> {\n const svg = await exportSVGString(renderer, scene);\n download(`${slug(scene)}.svg`, svg, \"image/svg+xml\");\n}\n\nexport async function downloadPNG(renderer: SvgRenderer, scene: Scene): Promise<void> {\n const blob = await exportPNGBlob(renderer, scene);\n download(`${slug(scene)}.png`, blob);\n}\n\nexport function downloadJSON(scene: Scene): void {\n download(`${slug(scene)}.json`, JSON.stringify(scene, null, 2), \"application/json\");\n}\n\nfunction slug(scene: Scene): string {\n return (scene.meta.title ?? \"edododraw\").toLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/^-|-$/g, \"\") || \"edododraw\";\n}\n","/**\n * Plugin registries — the extension seams that make EDodoDraw \"much more\n * extendible than Excalidraw\". A plugin registers a named renderer for a shape\n * (or, later, an arrow animation / annotation kind) and it becomes usable from\n * the DSL immediately (`shape: myshape` or the keyword), with no grammar change.\n *\n * The Scene IR types are open unions, so the compiler already accepts unknown\n * names; the renderer resolves them here.\n */\n\nimport type rough from \"roughjs\";\nimport type { NodeStyle, ShapeKind } from \"../scene/types.js\";\nimport type { ShapeRect } from \"../render/shapes.js\";\n\ntype RoughSVG = ReturnType<(typeof rough)[\"svg\"]>;\n\nexport type ShapePluginFn = (rc: RoughSVG, rect: ShapeRect, style: NodeStyle) => SVGGElement;\n\nconst shapePlugins = new Map<string, ShapePluginFn>();\n\nexport function registerShape(name: string, fn: ShapePluginFn): void {\n shapePlugins.set(name, fn);\n}\n\nexport function getShapePlugin(name: ShapeKind): ShapePluginFn | undefined {\n return shapePlugins.get(name);\n}\n\nexport function listShapePlugins(): string[] {\n return [...shapePlugins.keys()];\n}\n","/**\n * Shape body generation. Each ShapeKind is turned into one or more rough.js\n * drawables and returned as a single <g>. Text is NOT drawn here (the renderer\n * overlays it). Composite shapes (cylinder, cloud, document, note, actor) are\n * built from hand-authored SVG path strings so rough.js can \"sketch\" them.\n */\n\nimport type rough from \"roughjs\";\nimport type { Options } from \"roughjs/bin/core\";\nimport type { NodeStyle, ShapeKind } from \"../scene/types.js\";\nimport { getShapePlugin } from \"../plugins/registry.js\";\n\ntype RoughSVG = ReturnType<(typeof rough)[\"svg\"]>;\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/** Map a NodeStyle to rough.js Options. */\nexport function nodeRoughOptions(style: NodeStyle, filled: boolean): Options {\n const opts: Options = {\n stroke: style.stroke,\n strokeWidth: style.strokeWidth,\n roughness: style.roughness,\n seed: style.seed,\n bowing: 1,\n preserveVertices: false,\n };\n if (filled && style.fill && style.fillStyle !== \"none\") {\n opts.fill = style.fill;\n opts.fillStyle = style.fillStyle;\n opts.fillWeight = Math.max(1, style.strokeWidth * 0.9);\n opts.hachureGap = Math.max(6, style.fontSize * 0.4);\n opts.hachureAngle = -41;\n }\n if (style.strokeStyle === \"dashed\") opts.strokeLineDash = [8, 8];\n else if (style.strokeStyle === \"dotted\") opts.strokeLineDash = [1.6, 6];\n return opts;\n}\n\n// --- composite path builders -------------------------------------------------\n\nfunction roundedRectPath(x: number, y: number, w: number, h: number, r: number): string {\n const rr = Math.min(r, w / 2, h / 2);\n return [\n `M${x + rr},${y}`,\n `L${x + w - rr},${y}`,\n `Q${x + w},${y} ${x + w},${y + rr}`,\n `L${x + w},${y + h - rr}`,\n `Q${x + w},${y + h} ${x + w - rr},${y + h}`,\n `L${x + rr},${y + h}`,\n `Q${x},${y + h} ${x},${y + h - rr}`,\n `L${x},${y + rr}`,\n `Q${x},${y} ${x + rr},${y}`,\n \"Z\",\n ].join(\" \");\n}\n\nfunction documentPath(x: number, y: number, w: number, h: number): string {\n const wave = h * 0.14;\n const midY = y + h - wave;\n return [\n `M${x},${y}`,\n `L${x + w},${y}`,\n `L${x + w},${midY}`,\n `C${x + w * 0.75},${midY + wave * 1.5} ${x + w * 0.25},${midY - wave * 1.5} ${x},${midY}`,\n \"Z\",\n ].join(\" \");\n}\n\nfunction notePaths(x: number, y: number, w: number, h: number): { body: string; fold: string } {\n const fold = Math.min(w, h) * 0.24;\n const body = [\n `M${x},${y}`,\n `L${x + w - fold},${y}`,\n `L${x + w},${y + fold}`,\n `L${x + w},${y + h}`,\n `L${x},${y + h}`,\n \"Z\",\n ].join(\" \");\n const foldPath = [\n `M${x + w - fold},${y}`,\n `L${x + w - fold},${y + fold}`,\n `L${x + w},${y + fold}`,\n ].join(\" \");\n return { body, fold: foldPath };\n}\n\nfunction cloudPath(x: number, y: number, w: number, h: number): string {\n // A blobby cloud built from cubic bumps around an inset rectangle.\n const cx = x + w / 2;\n const t = y + h * 0.32;\n const b = y + h * 0.82;\n const l = x + w * 0.12;\n const r = x + w * 0.88;\n return [\n `M${l},${b}`,\n `C${x - w * 0.02},${b} ${x - w * 0.02},${t + h * 0.05} ${l + w * 0.06},${t + h * 0.02}`,\n `C${x + w * 0.1},${y + h * 0.02} ${x + w * 0.34},${y - h * 0.04} ${cx - w * 0.04},${t - h * 0.02}`,\n `C${x + w * 0.5},${y - h * 0.02} ${x + w * 0.74},${y + h * 0.0} ${r - w * 0.08},${t + h * 0.02}`,\n `C${x + w * 1.02},${t} ${x + w * 1.02},${b - h * 0.02} ${r},${b}`,\n \"Z\",\n ].join(\" \");\n}\n\nfunction polygonPoints(pts: Array<[number, number]>): Array<[number, number]> {\n return pts;\n}\n\n// --- main entry --------------------------------------------------------------\n\nexport interface ShapeRect {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/**\n * Draw a node body and return a <g> ready to append. Never returns text.\n */\nexport function renderShapeBody(\n rc: RoughSVG,\n shape: ShapeKind,\n rect: ShapeRect,\n style: NodeStyle,\n): SVGGElement {\n const g = document.createElementNS(SVG_NS, \"g\") as SVGGElement;\n const { x, y, w, h } = rect;\n const filledOpts = nodeRoughOptions(style, true);\n const strokeOpts = nodeRoughOptions(style, false);\n\n const add = (el: SVGGElement) => g.appendChild(el);\n\n switch (shape) {\n case \"rectangle\": {\n if (style.roundness && style.roundness > 0) {\n add(rc.path(roundedRectPath(x, y, w, h, style.roundness), filledOpts));\n } else {\n add(rc.rectangle(x, y, w, h, filledOpts));\n }\n break;\n }\n case \"round-rectangle\": {\n add(rc.path(roundedRectPath(x, y, w, h, style.roundness ?? Math.min(w, h) * 0.18), filledOpts));\n break;\n }\n case \"pill\": {\n add(rc.path(roundedRectPath(x, y, w, h, h / 2), filledOpts));\n break;\n }\n case \"ellipse\": {\n add(rc.ellipse(x + w / 2, y + h / 2, w, h, filledOpts));\n break;\n }\n case \"circle\": {\n const d = Math.min(w, h);\n add(rc.ellipse(x + w / 2, y + h / 2, d, d, filledOpts));\n break;\n }\n case \"diamond\": {\n add(\n rc.polygon(\n polygonPoints([\n [x + w / 2, y],\n [x + w, y + h / 2],\n [x + w / 2, y + h],\n [x, y + h / 2],\n ]),\n filledOpts,\n ),\n );\n break;\n }\n case \"triangle\": {\n add(\n rc.polygon(\n polygonPoints([\n [x + w / 2, y],\n [x + w, y + h],\n [x, y + h],\n ]),\n filledOpts,\n ),\n );\n break;\n }\n case \"hexagon\": {\n const dx = w * 0.22;\n add(\n rc.polygon(\n polygonPoints([\n [x + dx, y],\n [x + w - dx, y],\n [x + w, y + h / 2],\n [x + w - dx, y + h],\n [x + dx, y + h],\n [x, y + h / 2],\n ]),\n filledOpts,\n ),\n );\n break;\n }\n case \"parallelogram\": {\n const sk = w * 0.2;\n add(\n rc.polygon(\n polygonPoints([\n [x + sk, y],\n [x + w, y],\n [x + w - sk, y + h],\n [x, y + h],\n ]),\n filledOpts,\n ),\n );\n break;\n }\n case \"trapezoid\": {\n const inset = w * 0.2;\n add(\n rc.polygon(\n polygonPoints([\n [x + inset, y],\n [x + w - inset, y],\n [x + w, y + h],\n [x, y + h],\n ]),\n filledOpts,\n ),\n );\n break;\n }\n case \"cylinder\": {\n const rx = w / 2;\n const ry = Math.min(h * 0.14, 22);\n const bodyTop = y + ry;\n const bodyBot = y + h - ry;\n // filled body (top chord -> down -> bottom front arc -> up)\n const body = [\n `M${x},${bodyTop}`,\n `L${x},${bodyBot}`,\n `A${rx},${ry} 0 0 0 ${x + w},${bodyBot}`,\n `L${x + w},${bodyTop}`,\n `A${rx},${ry} 0 0 0 ${x},${bodyTop}`,\n \"Z\",\n ].join(\" \");\n add(rc.path(body, filledOpts));\n // top rim ellipse (stroke only)\n add(rc.ellipse(x + w / 2, bodyTop, w, ry * 2, strokeOpts));\n break;\n }\n case \"cloud\": {\n add(rc.path(cloudPath(x, y, w, h), filledOpts));\n break;\n }\n case \"document\": {\n add(rc.path(documentPath(x, y, w, h), filledOpts));\n break;\n }\n case \"note\": {\n const { body, fold } = notePaths(x, y, w, h);\n add(rc.path(body, filledOpts));\n add(rc.path(fold, strokeOpts));\n break;\n }\n case \"actor\": {\n const cx = x + w / 2;\n const headR = Math.min(w, h) * 0.16;\n const headY = y + headR + 2;\n const shoulderY = headY + headR + 4;\n const hipY = y + h * 0.66;\n const footY = y + h;\n add(rc.ellipse(cx, headY, headR * 2, headR * 2, strokeOpts));\n add(rc.line(cx, shoulderY, cx, hipY, strokeOpts)); // spine\n add(rc.line(x + w * 0.2, shoulderY + 8, x + w * 0.8, shoulderY + 8, strokeOpts)); // arms\n add(rc.line(cx, hipY, x + w * 0.28, footY, strokeOpts)); // left leg\n add(rc.line(cx, hipY, x + w * 0.72, footY, strokeOpts)); // right leg\n break;\n }\n case \"text\": {\n // no body\n break;\n }\n default: {\n // Plugin-registered shape?\n const plugin = getShapePlugin(shape);\n if (plugin) {\n return plugin(rc, rect, style);\n }\n // Unknown shape -> fall back to a rounded rectangle so nothing\n // silently disappears.\n add(rc.path(roundedRectPath(x, y, w, h, 8), filledOpts));\n break;\n }\n }\n\n return g;\n}\n\n/** Shapes whose label should render above (not centered inside) the body. */\nexport function labelBelow(shape: ShapeKind): boolean {\n return shape === \"actor\" || shape === \"text\";\n}\n","/**\n * Built-in plugin shapes — also a worked example of how a senior engineer adds\n * a new shape without touching the renderer's core switch.\n *\n * Registration is exposed as an idempotent function AND called from the\n * renderer on mount, so the built-ins survive a tree-shaking library build\n * (a bare side-effect import can be dropped by bundlers when nothing \"uses\" it).\n */\n\nimport { nodeRoughOptions } from \"../render/shapes.js\";\nimport { registerShape } from \"./registry.js\";\n\nlet registered = false;\n\nexport function registerBuiltinShapes(): void {\n if (registered) return;\n registered = true;\n\n // A crisp 5-point star.\n registerShape(\"star\", (rc, rect, style) => {\n const g = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\") as SVGGElement;\n const cx = rect.x + rect.w / 2;\n const cy = rect.y + rect.h / 2;\n const outer = Math.min(rect.w, rect.h) / 2;\n const inner = outer * 0.42;\n const pts: [number, number][] = [];\n for (let i = 0; i < 10; i++) {\n const r = i % 2 === 0 ? outer : inner;\n const a = -Math.PI / 2 + (i * Math.PI) / 5;\n pts.push([cx + Math.cos(a) * r, cy + Math.sin(a) * r]);\n }\n g.appendChild(rc.polygon(pts, nodeRoughOptions(style, true)));\n return g;\n });\n}\n\n// Eager registration for direct engine users (survives when this module is\n// imported for its side effect, e.g. via the engine barrel).\nregisterBuiltinShapes();\n","/**\n * Edge geometry + rendering.\n *\n * An edge is drawn as:\n * 1. a hand-drawn (rough.js) base stroke following the routed centerline,\n * 2. optional arrowheads at each end (rough, matched to the stroke),\n * 3. an optional CLEAN overlay <path> that carries the animation\n * (flow / dash-march / draw-on / comet / gradient-flow / pulse / electric),\n * 4. an optional label chip at the midpoint.\n *\n * The clean overlay follows the exact same centerline so animations read as\n * \"energy flowing along the drawn line\".\n */\n\nimport type rough from \"roughjs\";\nimport type { Options } from \"roughjs/bin/core\";\nimport type { Point } from \"../geometry.js\";\nimport { rectCenter } from \"../geometry.js\";\nimport { resolveAnchor, nodeRect } from \"../scene/anchors.js\";\nimport { getNode } from \"../scene/query.js\";\nimport type { EdgeStyle, Scene, SceneEdge } from \"../scene/types.js\";\n\ntype RoughSVG = ReturnType<(typeof rough)[\"svg\"]>;\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport function edgeRoughOptions(style: EdgeStyle): Options {\n const opts: Options = {\n stroke: style.stroke,\n strokeWidth: style.strokeWidth,\n roughness: style.roughness,\n seed: style.seed,\n bowing: 1,\n };\n if (style.strokeStyle === \"dashed\") opts.strokeLineDash = [9, 9];\n else if (style.strokeStyle === \"dotted\") opts.strokeLineDash = [1.6, 6];\n return opts;\n}\n\n/** Resolve the two endpoints of an edge in world space, border-aware. */\nexport function resolveEndpoints(scene: Scene, edge: SceneEdge): { a: Point; b: Point } {\n const fromNode = edge.from.node ? getNode(scene, edge.from.node) : undefined;\n const toNode = edge.to.node ? getNode(scene, edge.to.node) : undefined;\n\n const fromCenter = fromNode ? rectCenter(nodeRect(fromNode)) : edge.from.point ?? { x: 0, y: 0 };\n const toCenter = toNode ? rectCenter(nodeRect(toNode)) : edge.to.point ?? { x: 0, y: 0 };\n\n let a: Point = fromNode ? resolveAnchor(fromNode, edge.from.anchor, toCenter) : fromCenter;\n let b: Point = toNode ? resolveAnchor(toNode, edge.to.anchor, fromCenter) : toCenter;\n\n // One refinement pass so auto-anchors aim at the *actual* opposite point.\n if (fromNode && (!edge.from.anchor || edge.from.anchor === \"auto\")) a = resolveAnchor(fromNode, undefined, b);\n if (toNode && (!edge.to.anchor || edge.to.anchor === \"auto\")) b = resolveAnchor(toNode, undefined, a);\n\n return { a, b };\n}\n\n/** Build the routed polyline (world points) for an edge. */\nexport function routePoints(edge: SceneEdge, a: Point, b: Point): Point[] {\n switch (edge.routing) {\n case \"straight\":\n return [a, b];\n case \"curved\": {\n const mid: Point = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy) || 1;\n const nx = -dy / len;\n const ny = dx / len;\n // parallel edges between the same pair fan out symmetrically\n const par = (edge.data as { parallel?: { index: number; count: number } } | undefined)?.parallel;\n let bow: number;\n if (par && par.count > 1) {\n bow = (par.index - (par.count - 1) / 2) * 38;\n } else {\n // longer curved/animated edges arc more so loop-backs clear the nodes\n bow = Math.min(70, len * 0.16);\n }\n return [a, { x: mid.x + nx * bow, y: mid.y + ny * bow }, b];\n }\n case \"orthogonal\":\n case \"elbow\": {\n const dx = Math.abs(b.x - a.x);\n const dy = Math.abs(b.y - a.y);\n // route along the dominant axis first\n const mid: Point[] =\n dx > dy ? [{ x: (a.x + b.x) / 2, y: a.y }, { x: (a.x + b.x) / 2, y: b.y }] : [{ x: a.x, y: (a.y + b.y) / 2 }, { x: b.x, y: (a.y + b.y) / 2 }];\n return [a, ...mid, b];\n }\n default:\n return [a, b];\n }\n}\n\n/** SVG path `d` for the clean overlay following the same routed points. */\nexport function centerlinePath(points: Point[], routing: SceneEdge[\"routing\"]): string {\n if (points.length < 2) return \"\";\n if (routing === \"curved\" && points.length === 3) {\n const [a, c, b] = points;\n return `M${a.x},${a.y} Q${c.x},${c.y} ${b.x},${b.y}`;\n }\n if (routing === \"elbow\" && points.length >= 3) {\n // rounded corners\n let d = `M${points[0].x},${points[0].y}`;\n const r = 10;\n for (let i = 1; i < points.length - 1; i++) {\n const p = points[i];\n const prev = points[i - 1];\n const next = points[i + 1];\n const v1 = norm(sub(prev, p));\n const v2 = norm(sub(next, p));\n const p1 = { x: p.x + v1.x * r, y: p.y + v1.y * r };\n const p2 = { x: p.x + v2.x * r, y: p.y + v2.y * r };\n d += ` L${p1.x},${p1.y} Q${p.x},${p.y} ${p2.x},${p2.y}`;\n }\n const last = points[points.length - 1];\n d += ` L${last.x},${last.y}`;\n return d;\n }\n return \"M\" + points.map((p) => `${p.x},${p.y}`).join(\" L\");\n}\n\nfunction sub(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\nfunction norm(v: Point): Point {\n const l = Math.hypot(v.x, v.y) || 1;\n return { x: v.x / l, y: v.y / l };\n}\n\n/**\n * Route an edge through dagre's computed waypoints (so it dodges nodes in dense\n * graphs). Returns null when there are no usable waypoints or the edge is a\n * fanned parallel edge (which handles its own bow). Endpoints are re-clipped to\n * the node borders aimed at the first/last bend.\n */\nfunction dagreRoute(scene: Scene, edge: SceneEdge): Point[] | null {\n const raw = edge.points;\n if (!raw || raw.length < 3) return null;\n if ((edge.data as { parallel?: unknown } | undefined)?.parallel) return null;\n const fromNode = edge.from.node ? getNode(scene, edge.from.node) : undefined;\n const toNode = edge.to.node ? getNode(scene, edge.to.node) : undefined;\n const firstBend = raw[1];\n const lastBend = raw[raw.length - 2];\n const a = fromNode ? resolveAnchor(fromNode, edge.from.anchor, firstBend) : raw[0];\n const b = toNode ? resolveAnchor(toNode, edge.to.anchor, lastBend) : raw[raw.length - 1];\n return [a, ...raw.slice(1, -1), b];\n}\n\n/** Catmull-Rom smooth path through points (for the animated overlay). */\nfunction smoothPath(points: Point[]): string {\n if (points.length < 3) return \"M\" + points.map((p) => `${p.x},${p.y}`).join(\" L\");\n let d = `M${points[0].x},${points[0].y}`;\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i - 1] ?? points[i];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[i + 2] ?? p2;\n const c1x = p1.x + (p2.x - p0.x) / 6;\n const c1y = p1.y + (p2.y - p0.y) / 6;\n const c2x = p2.x - (p3.x - p1.x) / 6;\n const c2y = p2.y - (p3.y - p1.y) / 6;\n d += ` C${c1x},${c1y} ${c2x},${c2y} ${p2.x},${p2.y}`;\n }\n return d;\n}\n\n/** Draw the rough base stroke of an edge. */\nfunction drawBase(rc: RoughSVG, points: Point[], edge: SceneEdge, smooth: boolean): SVGGElement {\n const opts = edgeRoughOptions(edge.style);\n if (smooth && points.length >= 3) {\n return rc.curve(points.map((p) => [p.x, p.y]) as [number, number][], opts);\n }\n if (points.length === 2) {\n return rc.line(points[0].x, points[0].y, points[1].x, points[1].y, opts);\n }\n return rc.linearPath(points.map((p) => [p.x, p.y]) as [number, number][], opts);\n}\n\n// --- arrowheads --------------------------------------------------------------\n\nfunction drawArrowhead(\n rc: RoughSVG,\n kind: string,\n tip: Point,\n angle: number,\n style: EdgeStyle,\n): SVGGElement | null {\n if (!kind || kind === \"none\") return null;\n const size = 11 + style.strokeWidth * 2.4;\n const opts: Options = {\n stroke: style.stroke,\n strokeWidth: style.strokeWidth,\n roughness: Math.min(style.roughness, 1),\n seed: style.seed,\n };\n const filledOpts: Options = { ...opts, fill: style.stroke, fillStyle: \"solid\" };\n const back = (dist: number, spread: number): Point => ({\n x: tip.x - Math.cos(angle - spread) * dist,\n y: tip.y - Math.sin(angle - spread) * dist,\n });\n const back2 = (dist: number, spread: number): Point => ({\n x: tip.x - Math.cos(angle + spread) * dist,\n y: tip.y - Math.sin(angle + spread) * dist,\n });\n\n switch (kind) {\n case \"arrow\": {\n const p1 = back(size, 0.42);\n const p2 = back2(size, 0.42);\n return rc.linearPath(\n [\n [p1.x, p1.y],\n [tip.x, tip.y],\n [p2.x, p2.y],\n ],\n opts,\n );\n }\n case \"triangle\": {\n const p1 = back(size, 0.42);\n const p2 = back2(size, 0.42);\n return rc.polygon(\n [\n [tip.x, tip.y],\n [p1.x, p1.y],\n [p2.x, p2.y],\n ],\n filledOpts,\n );\n }\n case \"triangle-outline\": {\n const p1 = back(size, 0.42);\n const p2 = back2(size, 0.42);\n return rc.polygon(\n [\n [tip.x, tip.y],\n [p1.x, p1.y],\n [p2.x, p2.y],\n ],\n opts,\n );\n }\n case \"bar\": {\n const p1 = {\n x: tip.x - Math.cos(angle + Math.PI / 2) * size * 0.6,\n y: tip.y - Math.sin(angle + Math.PI / 2) * size * 0.6,\n };\n const p2 = {\n x: tip.x + Math.cos(angle + Math.PI / 2) * size * 0.6,\n y: tip.y + Math.sin(angle + Math.PI / 2) * size * 0.6,\n };\n return rc.line(p1.x, p1.y, p2.x, p2.y, opts);\n }\n case \"dot\":\n case \"circle\": {\n const r = size * 0.42;\n const c = { x: tip.x - Math.cos(angle) * r, y: tip.y - Math.sin(angle) * r };\n return rc.circle(c.x, c.y, r * 2, kind === \"dot\" ? filledOpts : opts);\n }\n case \"circle-outline\": {\n const r = size * 0.42;\n const c = { x: tip.x - Math.cos(angle) * r, y: tip.y - Math.sin(angle) * r };\n return rc.circle(c.x, c.y, r * 2, opts);\n }\n case \"diamond\":\n case \"diamond-outline\": {\n const r = size * 0.55;\n const c = { x: tip.x - Math.cos(angle) * r, y: tip.y - Math.sin(angle) * r };\n const perp = angle + Math.PI / 2;\n const pts: [number, number][] = [\n [tip.x, tip.y],\n [c.x + Math.cos(perp) * r * 0.6, c.y + Math.sin(perp) * r * 0.6],\n [c.x - Math.cos(angle) * r, c.y - Math.sin(angle) * r],\n [c.x - Math.cos(perp) * r * 0.6, c.y - Math.sin(perp) * r * 0.6],\n ];\n return rc.polygon(pts, kind === \"diamond\" ? filledOpts : opts);\n }\n case \"crow\": {\n const spread = 0.5;\n const p1 = back(size, spread);\n const p2 = back2(size, spread);\n const mid = back(size, 0);\n const g = document.createElementNS(SVG_NS, \"g\") as SVGGElement;\n g.appendChild(rc.line(tip.x, tip.y, p1.x, p1.y, opts));\n g.appendChild(rc.line(tip.x, tip.y, p2.x, p2.y, opts));\n g.appendChild(rc.line(tip.x, tip.y, mid.x, mid.y, opts));\n return g;\n }\n default:\n return null;\n }\n}\n\nfunction angleOf(from: Point, to: Point): number {\n return Math.atan2(to.y - from.y, to.x - from.x);\n}\n\n// --- animated overlay --------------------------------------------------------\n\n/**\n * A clean <path> following the centerline that carries the CSS-driven flow\n * animation. Returns null when animation is \"none\". The overlay sits above the\n * hand-drawn base so the motion reads as energy travelling along the line.\n */\nfunction animationOverlay(edge: SceneEdge, centerline: string, len: number): SVGPathElement | null {\n const kind = edge.style.animation;\n if (!kind || kind === \"none\") return null;\n const p = document.createElementNS(SVG_NS, \"path\") as SVGPathElement;\n p.setAttribute(\"d\", centerline);\n p.setAttribute(\"fill\", \"none\");\n p.setAttribute(\"class\", `edd-anim edd-anim-${kind}`);\n p.setAttribute(\"pointer-events\", \"none\");\n const speed = edge.style.animationSpeed || 1;\n const sw = edge.style.strokeWidth;\n const stroke = edge.style.stroke;\n const style = p.style;\n style.setProperty(\"--edd-len\", String(Math.max(1, Math.round(len))));\n style.setProperty(\"--edd-speed\", String(speed));\n\n switch (kind) {\n case \"flow\":\n case \"dash-march\":\n case \"electric\": {\n p.setAttribute(\"stroke\", stroke);\n p.setAttribute(\"stroke-width\", String(sw * (kind === \"electric\" ? 1.6 : 1.2)));\n const dash = kind === \"electric\" ? \"2 7\" : \"10 8\";\n p.setAttribute(\"stroke-dasharray\", dash);\n p.setAttribute(\"stroke-linecap\", \"round\");\n style.animationDuration = `${(kind === \"electric\" ? 0.5 : 0.9) / speed}s`;\n break;\n }\n case \"draw-on\": {\n p.setAttribute(\"stroke\", stroke);\n p.setAttribute(\"stroke-width\", String(sw * 1.3));\n p.setAttribute(\"stroke-linecap\", \"round\");\n p.setAttribute(\"stroke-dasharray\", String(len));\n style.setProperty(\"--edd-dashoffset\", String(len));\n style.animationDuration = `${1.4 / speed}s`;\n break;\n }\n case \"comet\": {\n p.setAttribute(\"stroke\", stroke);\n p.setAttribute(\"stroke-width\", String(sw * 2.2));\n p.setAttribute(\"stroke-linecap\", \"round\");\n const seg = Math.max(24, len * 0.14);\n p.setAttribute(\"stroke-dasharray\", `${seg} ${len}`);\n p.style.filter = \"drop-shadow(0 0 4px currentColor)\";\n p.style.color = stroke;\n style.animationDuration = `${1.6 / speed}s`;\n break;\n }\n case \"pulse\": {\n p.setAttribute(\"stroke\", stroke);\n p.setAttribute(\"stroke-width\", String(sw * 1.2));\n style.animationDuration = `${1.3 / speed}s`;\n break;\n }\n case \"gradient-flow\": {\n p.setAttribute(\"stroke\", \"url(#eddFlowGradient)\");\n p.setAttribute(\"stroke-width\", String(sw * 2.4));\n p.setAttribute(\"stroke-linecap\", \"round\");\n style.animationDuration = `${1.2 / speed}s`;\n break;\n }\n default:\n return null;\n }\n return p;\n}\n\n// --- public render -----------------------------------------------------------\n\nexport interface RenderedEdge {\n group: SVGGElement;\n points: Point[];\n centerline: string;\n length: number;\n}\n\nexport function pathLength(points: Point[]): number {\n let len = 0;\n for (let i = 1; i < points.length; i++) len += Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y);\n return len;\n}\n\n/**\n * Render one edge into a <g>. `animId` uniquely identifies the animation\n * overlay so we can wire per-edge gradients/keyframes.\n */\nexport function renderEdge(rc: RoughSVG, scene: Scene, edge: SceneEdge): RenderedEdge {\n const g = document.createElementNS(SVG_NS, \"g\") as SVGGElement;\n g.setAttribute(\"data-edge\", edge.id);\n g.setAttribute(\"class\", \"edd-edge\");\n g.style.opacity = String(edge.style.opacity / 100);\n\n // Prefer dagre's routed waypoints (dodges nodes); fall back to direct routing.\n const routed = dagreRoute(scene, edge);\n let points: Point[];\n let smooth: boolean;\n if (routed) {\n points = routed;\n smooth = true;\n } else {\n const { a, b } = resolveEndpoints(scene, edge);\n points = routePoints(edge, a, b);\n smooth = edge.routing === \"curved\" && points.length === 3;\n }\n const centerline = smooth ? smoothPath(points) : centerlinePath(points, edge.routing);\n const len = pathLength(points);\n\n // 1. base rough stroke\n g.appendChild(drawBase(rc, points, edge, smooth));\n\n // 2. arrowheads\n const endTangent = angleOf(points[points.length - 2], points[points.length - 1]);\n const startTangent = angleOf(points[1], points[0]);\n const endHead = drawArrowhead(rc, edge.style.endArrowhead, points[points.length - 1], endTangent, edge.style);\n if (endHead) g.appendChild(endHead);\n const startHead = drawArrowhead(rc, edge.style.startArrowhead, points[0], startTangent, edge.style);\n if (startHead) g.appendChild(startHead);\n\n // 3. animated overlay (flow/march/draw-on/comet/gradient/pulse/electric)\n const overlay = animationOverlay(edge, centerline, len);\n if (overlay) g.appendChild(overlay);\n\n return { group: g, points, centerline, length: len };\n}\n","/**\n * Engine-owned CSS: @font-face for the hand-drawn fonts and the keyframes that\n * power animated arrows and annotation reveals. Injected once per document by\n * ensureEngineStyles(). Kept as a TS string so the engine is self-contained and\n * has no build-time CSS dependency.\n *\n * Fonts are the OFL-licensed Excalifont + Virgil copied from the Excalidraw\n * project into /public/fonts.\n */\n\nimport { HAND_FONT_WOFF2_DATA_URI } from \"./fontData.js\";\n\nexport const FONT_FAMILY = {\n hand: '\"Excalifont\", \"Virgil\", \"Segoe Print\", \"Comic Sans MS\", cursive',\n normal: '\"Nunito\", \"Assistant\", system-ui, -apple-system, sans-serif',\n code: '\"Cascadia Code\", \"Cascadia\", ui-monospace, \"SF Mono\", Menlo, monospace',\n} as const;\n\nconst CSS = `\n/* Hand-drawn font is embedded (base64) so it works with zero external files —\n in the app, in exported SVGs, and in any host app using the npm package. */\n@font-face {\n font-family: \"Excalifont\";\n src: url(\"${HAND_FONT_WOFF2_DATA_URI}\") format(\"woff2\");\n font-weight: normal;\n font-style: normal;\n font-display: swap;\n}\n@font-face {\n font-family: \"Virgil\";\n src: url(\"${HAND_FONT_WOFF2_DATA_URI}\") format(\"woff2\");\n font-weight: normal;\n font-style: normal;\n font-display: swap;\n}\n/* \"normal\" and \"code\" diagram fonts fall back to the host's system sans/mono\n (no external files) — the engine embeds only the hand-drawn font it needs. */\n\n/* ---- animated arrows -------------------------------------------------- */\n.edd-anim { pointer-events: none; }\n\n@keyframes edd-march {\n to { stroke-dashoffset: -18; }\n}\n.edd-anim-flow,\n.edd-anim-dash-march {\n animation-name: edd-march;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n@keyframes edd-electric {\n to { stroke-dashoffset: -9; }\n}\n.edd-anim-electric {\n animation-name: edd-electric;\n animation-timing-function: steps(3);\n animation-iteration-count: infinite;\n}\n@keyframes edd-draw-on {\n from { stroke-dashoffset: var(--edd-dashoffset, 1000); }\n to { stroke-dashoffset: 0; }\n}\n.edd-anim-draw-on {\n animation-name: edd-draw-on;\n animation-timing-function: ease-in-out;\n animation-iteration-count: infinite;\n animation-direction: alternate;\n}\n@keyframes edd-comet {\n from { stroke-dashoffset: calc(var(--edd-len) * 1px); }\n to { stroke-dashoffset: calc(var(--edd-len) * -0.14px); }\n}\n.edd-anim-comet {\n animation-name: edd-comet;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n@keyframes edd-pulse {\n 0%, 100% { opacity: 0.15; stroke-width: inherit; }\n 50% { opacity: 0.85; }\n}\n.edd-anim-pulse {\n animation-name: edd-pulse;\n animation-timing-function: ease-in-out;\n animation-iteration-count: infinite;\n}\n@keyframes edd-gradient-flow {\n to { stroke-dashoffset: -30; }\n}\n.edd-anim-gradient-flow {\n stroke-dasharray: 16 10;\n animation-name: edd-gradient-flow;\n animation-timing-function: linear;\n animation-iteration-count: infinite;\n}\n\n/* ---- timeline visibility --------------------------------------------- */\n.edd-node, .edd-edge { transition: opacity 0.45s ease; }\n.edd-hidden { opacity: 0 !important; pointer-events: none; }\n\n/* ---- annotation reveals ---------------------------------------------- */\n@keyframes edd-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n@keyframes edd-marker-sweep {\n from { clip-path: inset(0 100% 0 0); }\n to { clip-path: inset(0 0 0 0); }\n}\n@keyframes edd-pop-in {\n 0% { transform: scale(0.6); opacity: 0; }\n 70% { transform: scale(1.06); opacity: 1; }\n 100% { transform: scale(1); opacity: 1; }\n}\n.edd-reveal-fade { animation: edd-fade-in 0.4s ease both; }\n.edd-reveal-sweep { animation: edd-marker-sweep 0.5s ease-out both; }\n.edd-reveal-pop { animation: edd-pop-in 0.45s cubic-bezier(0.34,1.56,0.64,1) both; transform-box: fill-box; transform-origin: center; }\n\n@media (prefers-reduced-motion: reduce) {\n .edd-anim, .edd-reveal-fade, .edd-reveal-sweep, .edd-reveal-pop { animation: none !important; }\n}\n`;\n\nlet injected = false;\nexport function ensureEngineStyles(doc: Document = document): void {\n if (injected && doc.getElementById(\"edd-engine-styles\")) return;\n const style = doc.createElement(\"style\");\n style.id = \"edd-engine-styles\";\n style.textContent = CSS;\n doc.head.appendChild(style);\n injected = true;\n}\n","/**\n * SvgRenderer — imperative renderer that owns an <svg> and paints a Scene into\n * it. React only provides the mount container; this class manages the SVG DOM\n * directly (like Excalidraw manages its canvas outside React) for full control\n * over the camera transform, animated overlays, and annotation layers.\n *\n * Layer stack (bottom -> top), all inside the camera-transformed world group\n * except the screen background/overlay:\n * bg (screen) < grid < groups < edges < nodes < annotations < screen-overlay\n */\n\nimport rough from \"roughjs\";\nimport type { Point } from \"../geometry.js\";\nimport type { Scene, SceneNode } from \"../scene/types.js\";\nimport { registerBuiltinShapes } from \"../plugins/builtins.js\";\nimport { renderEdge } from \"./edges.js\";\nimport { labelBelow, renderShapeBody } from \"./shapes.js\";\nimport { ensureEngineStyles, FONT_FAMILY } from \"./theme.css.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport interface CameraTransform {\n cx: number;\n cy: number;\n zoom: number;\n}\n\nexport class SvgRenderer {\n readonly container: HTMLElement;\n svg!: SVGSVGElement;\n private defs!: SVGDefsElement;\n private bg!: SVGRectElement;\n world!: SVGGElement;\n private layers!: Record<string, SVGGElement>;\n screenLayer!: SVGGElement;\n private rc!: ReturnType<(typeof rough)[\"svg\"]>;\n\n private camera: CameraTransform = { cx: 0, cy: 0, zoom: 1 };\n private viewport = { w: 800, h: 600 };\n private scene: Scene | null = null;\n\n constructor(container: HTMLElement) {\n this.container = container;\n }\n\n mount(): void {\n registerBuiltinShapes(); // ensure built-in plugin shapes survive lib builds\n ensureEngineStyles(this.container.ownerDocument);\n const doc = this.container.ownerDocument;\n const svg = doc.createElementNS(SVG_NS, \"svg\") as SVGSVGElement;\n svg.setAttribute(\"class\", \"edd-canvas\");\n svg.style.position = \"absolute\";\n svg.style.inset = \"0\";\n svg.style.width = \"100%\";\n svg.style.height = \"100%\";\n svg.style.display = \"block\";\n svg.style.userSelect = \"none\";\n svg.style.touchAction = \"none\";\n this.svg = svg;\n\n this.defs = doc.createElementNS(SVG_NS, \"defs\") as SVGDefsElement;\n this.defs.innerHTML = this.defsMarkup();\n svg.appendChild(this.defs);\n\n this.bg = doc.createElementNS(SVG_NS, \"rect\") as SVGRectElement;\n this.bg.setAttribute(\"class\", \"edd-bg\");\n this.bg.setAttribute(\"x\", \"0\");\n this.bg.setAttribute(\"y\", \"0\");\n this.bg.setAttribute(\"width\", \"100%\");\n this.bg.setAttribute(\"height\", \"100%\");\n this.bg.setAttribute(\"fill\", \"#ffffff\");\n svg.appendChild(this.bg);\n\n this.world = doc.createElementNS(SVG_NS, \"g\") as SVGGElement;\n this.world.setAttribute(\"class\", \"edd-world\");\n svg.appendChild(this.world);\n\n this.layers = {};\n for (const name of [\"grid\", \"groups\", \"edges\", \"nodes\", \"annotations\", \"live\"]) {\n const g = doc.createElementNS(SVG_NS, \"g\") as SVGGElement;\n g.setAttribute(\"class\", `edd-layer edd-layer-${name}`);\n this.world.appendChild(g);\n this.layers[name] = g;\n }\n\n this.screenLayer = doc.createElementNS(SVG_NS, \"g\") as SVGGElement;\n this.screenLayer.setAttribute(\"class\", \"edd-layer-screen\");\n svg.appendChild(this.screenLayer);\n\n this.rc = rough.svg(svg);\n this.container.appendChild(svg);\n this.measure();\n this.applyCamera(this.camera);\n }\n\n destroy(): void {\n this.svg?.remove();\n }\n\n private defsMarkup(): string {\n return `\n <linearGradient id=\"eddFlowGradient\" x1=\"0\" y1=\"0\" x2=\"1\" y2=\"0\" gradientUnits=\"objectBoundingBox\">\n <stop offset=\"0\" stop-color=\"#4dabf7\"/>\n <stop offset=\"0.4\" stop-color=\"#22b8cf\"/>\n <stop offset=\"0.7\" stop-color=\"#845ef7\"/>\n <stop offset=\"1\" stop-color=\"#4dabf7\"/>\n </linearGradient>\n <filter id=\"eddSoftGlow\" x=\"-30%\" y=\"-30%\" width=\"160%\" height=\"160%\">\n <feGaussianBlur stdDeviation=\"2.2\" result=\"b\"/>\n <feMerge><feMergeNode in=\"b\"/><feMergeNode in=\"SourceGraphic\"/></feMerge>\n </filter>\n `;\n }\n\n /** Read the container size; call on mount + resize. */\n measure(): { w: number; h: number } {\n const rect = this.container.getBoundingClientRect();\n this.viewport = { w: Math.max(1, rect.width), h: Math.max(1, rect.height) };\n return this.viewport;\n }\n\n getViewportSize(): { w: number; h: number } {\n return { ...this.viewport };\n }\n\n getCamera(): CameraTransform {\n return { ...this.camera };\n }\n\n applyCamera(cam: CameraTransform): void {\n this.camera = cam;\n const { w, h } = this.viewport;\n const t = `translate(${w / 2} ${h / 2}) scale(${cam.zoom}) translate(${-cam.cx} ${-cam.cy})`;\n this.world.setAttribute(\"transform\", t);\n }\n\n worldToScreen(p: Point): Point {\n const { w, h } = this.viewport;\n return {\n x: (p.x - this.camera.cx) * this.camera.zoom + w / 2,\n y: (p.y - this.camera.cy) * this.camera.zoom + h / 2,\n };\n }\n\n screenToWorld(p: Point): Point {\n const { w, h } = this.viewport;\n return {\n x: (p.x - w / 2) / this.camera.zoom + this.camera.cx,\n y: (p.y - h / 2) / this.camera.zoom + this.camera.cy,\n };\n }\n\n getLayer(name: \"grid\" | \"groups\" | \"edges\" | \"nodes\" | \"annotations\" | \"live\"): SVGGElement {\n return this.layers[name];\n }\n\n /** Show/hide nodes+edges for timeline reveal. `hidden` = ids to fade out. */\n applyVisibility(hidden: Set<string>): void {\n const els = this.svg.querySelectorAll<SVGGElement>(\"[data-node],[data-edge]\");\n els.forEach((el) => {\n const id = el.getAttribute(\"data-node\") ?? el.getAttribute(\"data-edge\");\n if (id && hidden.has(id)) el.classList.add(\"edd-hidden\");\n else el.classList.remove(\"edd-hidden\");\n });\n }\n\n render(scene: Scene): void {\n this.scene = scene;\n this.bg.setAttribute(\"fill\", scene.meta.background || scene.theme.background);\n\n // clear dynamic layers\n for (const name of [\"groups\", \"edges\", \"nodes\"]) this.layers[name].replaceChildren();\n\n // groups / container frames\n for (const group of scene.groups) {\n if (!group.frame) continue;\n const els = this.renderGroupFrame(scene, group);\n if (els) this.layers.groups.appendChild(els);\n }\n\n // edges (below nodes)\n const edges = [...scene.edges].sort((a, b) => a.z - b.z);\n for (const edge of edges) {\n try {\n const r = renderEdge(this.rc, scene, edge);\n if (edge.label) r.group.appendChild(this.edgeLabel(scene, edge, r.points));\n this.layers.edges.appendChild(r.group);\n } catch (err) {\n // never let one bad edge blank the whole diagram\n console.warn(\"edge render failed\", edge.id, err);\n }\n }\n\n // nodes (above edges)\n const nodes = [...scene.nodes].sort((a, b) => a.z - b.z);\n for (const node of nodes) {\n try {\n this.layers.nodes.appendChild(this.renderNode(scene, node));\n } catch (err) {\n console.warn(\"node render failed\", node.id, err);\n }\n }\n }\n\n private renderNode(_scene: Scene, node: SceneNode): SVGGElement {\n const doc = this.container.ownerDocument;\n const g = doc.createElementNS(SVG_NS, \"g\") as SVGGElement;\n g.setAttribute(\"data-node\", node.id);\n g.setAttribute(\"class\", \"edd-node\");\n g.style.opacity = String(node.style.opacity / 100);\n\n const body = renderShapeBody(this.rc, node.shape, { x: node.x, y: node.y, w: node.w, h: node.h }, node.style);\n g.appendChild(body);\n\n if (node.label) {\n const cx = node.x + node.w / 2;\n const below = labelBelow(node.shape);\n const cy = below ? node.y + node.h + node.style.fontSize : node.y + node.h / 2;\n g.appendChild(this.textBlock(node.label, cx, cy, node.style.fontSize, node.style.textColor, node.style.fontFamily, node.style.textAlign));\n }\n return g;\n }\n\n private textBlock(\n text: string,\n cx: number,\n cy: number,\n fontSize: number,\n color: string,\n family: SceneNode[\"style\"][\"fontFamily\"],\n align: SceneNode[\"style\"][\"textAlign\"] = \"center\",\n ): SVGTextElement {\n const doc = this.container.ownerDocument;\n const t = doc.createElementNS(SVG_NS, \"text\") as SVGTextElement;\n const lines = text.split(\"\\n\");\n const lineHeight = fontSize * 1.25;\n const anchor = align === \"left\" ? \"start\" : align === \"right\" ? \"end\" : \"middle\";\n t.setAttribute(\"text-anchor\", anchor);\n t.setAttribute(\"font-family\", FONT_FAMILY[family]);\n t.setAttribute(\"font-size\", String(fontSize));\n t.setAttribute(\"fill\", color);\n t.setAttribute(\"dominant-baseline\", \"middle\");\n t.style.whiteSpace = \"pre\";\n const startY = cy - ((lines.length - 1) * lineHeight) / 2;\n lines.forEach((line, i) => {\n const tspan = doc.createElementNS(SVG_NS, \"tspan\");\n tspan.setAttribute(\"x\", String(cx));\n tspan.setAttribute(\"y\", String(startY + i * lineHeight));\n tspan.textContent = line;\n t.appendChild(tspan);\n });\n return t;\n }\n\n private edgeLabel(scene: Scene, edge: (typeof scene.edges)[number], points: Point[]): SVGGElement {\n const doc = this.container.ownerDocument;\n const g = doc.createElementNS(SVG_NS, \"g\") as SVGGElement;\n // midpoint of the polyline\n const mid = points[Math.floor(points.length / 2)] ?? points[0];\n const fontSize = edge.style.fontSize;\n const padX = 6;\n const estW = edge.label.length * fontSize * 0.55 + padX * 2;\n if (edge.style.labelBg) {\n const rect = doc.createElementNS(SVG_NS, \"rect\");\n rect.setAttribute(\"x\", String(mid.x - estW / 2));\n rect.setAttribute(\"y\", String(mid.y - fontSize * 0.85));\n rect.setAttribute(\"width\", String(estW));\n rect.setAttribute(\"height\", String(fontSize * 1.7));\n rect.setAttribute(\"rx\", \"4\");\n rect.setAttribute(\"fill\", edge.style.labelBg);\n rect.setAttribute(\"opacity\", \"0.92\");\n g.appendChild(rect);\n }\n g.appendChild(this.textBlock(edge.label, mid.x, mid.y, fontSize, edge.style.textColor, edge.style.fontFamily, \"center\"));\n return g;\n }\n\n private renderGroupFrame(scene: Scene, group: (typeof scene.groups)[number]): SVGGElement | null {\n const doc = this.container.ownerDocument;\n let minX = Infinity,\n minY = Infinity,\n maxX = -Infinity,\n maxY = -Infinity;\n for (const id of group.members) {\n const n = scene.nodes.find((x) => x.id === id);\n if (!n) continue;\n minX = Math.min(minX, n.x);\n minY = Math.min(minY, n.y);\n maxX = Math.max(maxX, n.x + n.w);\n maxY = Math.max(maxY, n.y + n.h);\n }\n if (!Number.isFinite(minX)) return null;\n const pad = 26;\n const g = doc.createElementNS(SVG_NS, \"g\") as SVGGElement;\n g.setAttribute(\"data-group\", group.id);\n const stroke = group.style.stroke ?? \"#adb5bd\";\n const rectEl = this.rc.path(\n `M${minX - pad},${minY - pad} h${maxX - minX + pad * 2} v${maxY - minY + pad * 2} h${-(maxX - minX + pad * 2)} Z`,\n { stroke, strokeWidth: 1.2, roughness: 0.8, seed: 42, strokeLineDash: [6, 6], fill: group.style.fill ?? undefined, fillStyle: \"solid\" },\n );\n g.appendChild(rectEl);\n if (group.label) {\n g.appendChild(this.textBlock(group.label, minX - pad + 4, minY - pad - 2, 15, stroke, \"hand\", \"left\"));\n }\n return g;\n }\n}\n","/**\n * TimelinePlayer — plays a scene's steps as a magic-move presentation.\n * Each step diffs against the running state: camera (sticky), visibility\n * (sticky), and beat-scoped annotations (replaced each step). Always-on\n * scene.annotations render underneath every step.\n */\n\nimport type { AnnotationLayer } from \"../annotate/layer.js\";\nimport type { CameraController } from \"../camera/controller.js\";\nimport type { SvgRenderer } from \"../render/svgRenderer.js\";\nimport type { Scene, Step } from \"../scene/types.js\";\n\nexport interface PlayerState {\n index: number; // -1 = home/overview (no step)\n total: number;\n caption: string;\n playing: boolean;\n stepName: string;\n}\n\nexport class TimelinePlayer {\n private renderer: SvgRenderer;\n private controller: CameraController;\n private annotations: AnnotationLayer;\n private scene: Scene | null = null;\n private steps: Step[] = [];\n private idx = -1;\n private playing = false;\n private timer: number | undefined;\n\n onChange?: (state: PlayerState) => void;\n\n constructor(renderer: SvgRenderer, controller: CameraController, annotations: AnnotationLayer) {\n this.renderer = renderer;\n this.controller = controller;\n this.annotations = annotations;\n }\n\n get hasTimeline(): boolean {\n return this.steps.length > 0;\n }\n\n load(scene: Scene): void {\n this.pause();\n this.scene = scene;\n this.steps = scene.steps ?? [];\n this.idx = -1;\n // baseline: everything visible, always-on annotations shown\n this.renderer.applyVisibility(new Set());\n this.annotations.render(scene, scene.annotations, false);\n this.emit();\n }\n\n private emit(): void {\n const step = this.idx >= 0 ? this.steps[this.idx] : undefined;\n this.onChange?.({\n index: this.idx,\n total: this.steps.length,\n caption: step?.caption ?? \"\",\n stepName: step?.name ?? \"Overview\",\n playing: this.playing,\n });\n }\n\n /** Cumulative sticky visibility through step `i`. */\n private computeHidden(i: number): Set<string> {\n const hidden = new Set<string>();\n for (let s = 0; s <= i; s++) {\n const step = this.steps[s];\n for (const id of step.reveal ?? []) hidden.delete(id);\n for (const id of step.hide ?? []) hidden.add(id);\n }\n return hidden;\n }\n\n async goto(i: number, animate = true): Promise<void> {\n if (!this.scene || i < 0 || i >= this.steps.length) return;\n this.idx = i;\n const step = this.steps[i];\n const scene = this.scene;\n\n // visibility (sticky)\n this.renderer.applyVisibility(this.computeHidden(i));\n\n // annotations: always-on + this step's (beat-scoped)\n this.annotations.render(scene, [...scene.annotations, ...step.annotations], animate);\n\n this.emit();\n\n // camera (sticky if none)\n if (step.camera) {\n await this.runCamera(step, animate);\n }\n }\n\n private async runCamera(step: Step, animate: boolean): Promise<void> {\n const scene = this.scene!;\n const cam = step.camera!;\n const opts = { durationMs: animate ? cam.durationMs : 0, easing: cam.easing, padding: cam.padding };\n switch (cam.op) {\n case \"fit-all\":\n await this.controller.fitAll(scene, opts);\n break;\n case \"focus\":\n await this.controller.focus(scene, cam.targets ?? [], { ...opts, zoom: cam.zoom });\n break;\n case \"zoom\": {\n const cur = this.controller.current;\n await this.controller.animateTo({ ...cur, zoom: cam.zoom ?? cur.zoom }, opts);\n break;\n }\n case \"pan\": {\n const cur = this.controller.current;\n await this.controller.animateTo({ cx: cam.center?.x ?? cur.cx, cy: cam.center?.y ?? cur.cy, zoom: cur.zoom }, opts);\n break;\n }\n default:\n await this.controller.fitAll(scene, opts);\n }\n }\n\n next(): void {\n if (this.idx < this.steps.length - 1) void this.goto(this.idx + 1);\n }\n prev(): void {\n if (this.idx > 0) void this.goto(this.idx - 1);\n else if (this.idx === 0) {\n this.idx = -1;\n this.load(this.scene!);\n void this.controller.fitAll(this.scene!);\n }\n }\n restart(): void {\n this.pause();\n void this.goto(0);\n }\n\n play(): void {\n if (!this.hasTimeline) return;\n this.playing = true;\n if (this.idx < 0) void this.goto(0).then(() => this.scheduleNext());\n else this.scheduleNext();\n this.emit();\n }\n\n private scheduleNext(): void {\n window.clearTimeout(this.timer);\n if (!this.playing) return;\n if (this.idx >= this.steps.length - 1) {\n this.playing = false;\n this.emit();\n return;\n }\n const dwell = this.steps[this.idx]?.autoAdvanceMs ?? 3200;\n this.timer = window.setTimeout(async () => {\n if (!this.playing) return;\n await this.goto(this.idx + 1);\n this.scheduleNext();\n }, dwell);\n }\n\n pause(): void {\n this.playing = false;\n window.clearTimeout(this.timer);\n this.emit();\n }\n\n dispose(): void {\n this.pause();\n }\n}\n","/**\n * Mermaid import — converts a mermaid diagram string into EDodoDraw Scene IR\n * fragments (nodes + edges) via @excalidraw/mermaid-to-excalidraw. Node ids are\n * preserved (mermaid ids like `grafana`), so the timeline/annotate layers can\n * reference imported elements directly.\n *\n * Runs in the browser only (mermaid renders to a hidden SVG). The pure DSL\n * compiler stays synchronous; the app awaits this and injects the result.\n */\n\nimport { makeEdge, makeNode } from \"../scene/defaults.js\";\nimport type { SceneEdge, SceneNode, ShapeKind } from \"../scene/types.js\";\n\n// mermaid is heavy (it pulls in every diagram type + katex). It is lazy-loaded\n// on first use so it never bloats the main bundle — only pages that actually\n// contain a `mermaid` block pay for it.\ntype ParseFn = (def: string, config?: unknown) => Promise<{ elements: SkeletonElement[] }>;\nlet _parse: ParseFn | null = null;\nasync function loadParser(): Promise<ParseFn> {\n if (!_parse) {\n const mod = await import(\"@excalidraw/mermaid-to-excalidraw\");\n _parse = mod.parseMermaidToExcalidraw as unknown as ParseFn;\n }\n return _parse;\n}\n\ninterface SkeletonElement {\n id?: string;\n type: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n strokeColor?: string;\n backgroundColor?: string;\n strokeStyle?: string;\n strokeWidth?: number;\n roundness?: unknown;\n label?: { text?: string | null };\n text?: string;\n start?: { id?: string };\n end?: { id?: string };\n}\n\nexport interface MermaidFragment {\n nodes: SceneNode[];\n edges: SceneEdge[];\n}\n\nfunction shapeFor(el: SkeletonElement): ShapeKind {\n switch (el.type) {\n case \"ellipse\":\n return \"ellipse\";\n case \"diamond\":\n return \"diamond\";\n case \"rectangle\":\n return el.roundness ? \"round-rectangle\" : \"rectangle\";\n default:\n return \"rectangle\";\n }\n}\n\n/** Convert a mermaid definition into Scene IR fragments. */\nexport async function convertMermaid(definition: string, mode: \"light\" | \"dark\" = \"light\"): Promise<MermaidFragment> {\n const parse = await loadParser();\n const { elements } = await parse(definition, { themeVariables: { fontSize: \"20px\" } });\n\n const nodes: SceneNode[] = [];\n const edges: SceneEdge[] = [];\n const nodeIds = new Set<string>();\n\n // First pass: container/vertex + standalone text elements -> nodes\n for (const el of elements) {\n if (el.type === \"arrow\" || el.type === \"line\") continue;\n if (el.type === \"text\" && !el.id) continue; // labels handled via container\n const id = el.id ?? `m_${nodes.length}`;\n if (nodeIds.has(id)) continue;\n const label = el.label?.text ?? el.text ?? \"\";\n const node = makeNode({\n id,\n shape: el.type === \"text\" ? \"text\" : shapeFor(el),\n label,\n x: el.x ?? 0,\n y: el.y ?? 0,\n w: el.width && el.width > 0 ? el.width : undefined,\n h: el.height && el.height > 0 ? el.height : undefined,\n pinned: true,\n mode,\n style: {\n ...(el.strokeColor ? { stroke: el.strokeColor } : {}),\n ...(el.backgroundColor && el.backgroundColor !== \"transparent\" ? { fill: el.backgroundColor } : {}),\n },\n data: { source: \"mermaid\" },\n });\n nodes.push(node);\n nodeIds.add(id);\n }\n\n // Second pass: arrows -> edges\n let seq = 0;\n for (const el of elements) {\n if (el.type !== \"arrow\" && el.type !== \"line\") continue;\n const from = el.start?.id;\n const to = el.end?.id;\n if (!from || !to || !nodeIds.has(from) || !nodeIds.has(to)) continue;\n edges.push(\n makeEdge({\n id: el.id ?? `me${seq++}_${from}_${to}`,\n from,\n to,\n label: el.label?.text ?? \"\",\n mode,\n style: {\n strokeStyle: el.strokeStyle === \"dashed\" ? \"dashed\" : \"solid\",\n strokeWidth: el.strokeWidth === 4 ? 2.6 : 1.4,\n endArrowhead: el.type === \"line\" ? \"none\" : \"arrow\",\n },\n data: { source: \"mermaid\" },\n }),\n );\n }\n\n // normalize so the fragment's min corner sits near the origin\n if (nodes.length) {\n const minX = Math.min(...nodes.map((n) => n.x));\n const minY = Math.min(...nodes.map((n) => n.y));\n for (const n of nodes) {\n n.x -= minX - 40;\n n.y -= minY - 40;\n }\n }\n\n return { nodes, edges };\n}\n\n/**\n * Merge a mermaid fragment into a scene. If a node id already exists (e.g. a\n * `grafana:::signal` class-application placeholder), keep its cascaded style but\n * adopt the mermaid geometry/shape/label.\n */\nexport function injectMermaid(scene: import(\"../scene/types.js\").Scene, frag: MermaidFragment): void {\n for (const n of frag.nodes) {\n const ex = scene.nodes.find((x) => x.id === n.id);\n if (ex) {\n ex.x = n.x;\n ex.y = n.y;\n ex.w = n.w;\n ex.h = n.h;\n ex.pinned = true;\n if (ex.shape === \"rectangle\") ex.shape = n.shape;\n if (!ex.label) ex.label = n.label;\n } else {\n scene.nodes.push(n);\n }\n }\n for (const e of frag.edges) {\n if (!scene.edges.some((x) => x.id === e.id)) scene.edges.push(e);\n }\n}\n\n/** Extract `mermaid \"\"\" … \"\"\"` block bodies from EDodoDraw source. */\nexport function extractMermaidBlocks(source: string): string[] {\n const blocks: string[] = [];\n const re = /mermaid\\s*\"\"\"([\\s\\S]*?)\"\"\"/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(source)) !== null) {\n blocks.push(m[1].replace(/^\\n/, \"\"));\n }\n return blocks;\n}\n","/**\n * EdodoDraw — the framework-agnostic embedding facade.\n *\n * One class that mounts a diagram into any DOM element and exposes the full\n * feature set (render, camera magic-move, timeline, live annotations, export)\n * behind a small, stable API. The React wrapper and the playground both build\n * on this, so the published package is exactly what we dogfood.\n *\n * const edd = new EdodoDraw(document.getElementById(\"diagram\"));\n * await edd.render(`scene { a[Hello] --> b[World] }`);\n * edd.play();\n */\n\nimport { AnnotationLayer } from \"../engine/annotate/layer.js\";\nimport { LiveAnnotationController, type LiveState, type Tool } from \"../engine/annotate/interact.js\";\nimport { EditController, type EditState, type EditTool } from \"../engine/edit/controller.js\";\nimport { CameraController } from \"../engine/camera/controller.js\";\nimport { cameraForBBox } from \"../engine/camera/fit.js\";\nimport { compileEdd } from \"../engine/dsl/index.js\";\nimport type { Diagnostic } from \"../engine/dsl/diagnostics.js\";\nimport { downloadJSON, downloadPNG, downloadSVG, exportPNGBlob, exportSVGString } from \"../engine/export.js\";\nimport type { Point } from \"../engine/geometry.js\";\nimport { SvgRenderer } from \"../engine/render/svgRenderer.js\";\nimport { sceneBBox } from \"../engine/scene/query.js\";\nimport { applyOverrides } from \"../engine/scene/overrides.js\";\nimport type { Scene } from \"../engine/scene/types.js\";\nimport { TimelinePlayer, type PlayerState } from \"../engine/timeline/player.js\";\nimport { convertMermaid, extractMermaidBlocks, injectMermaid } from \"../engine/import/mermaid.js\";\n\nexport interface EdodoDrawOptions {\n /** Enable pan (drag) + zoom (wheel) + live-annotation pointer handling. */\n interactive?: boolean;\n /** Draw a dotted grid that pans/zooms with the camera. Default true. */\n grid?: boolean;\n /** Fit the whole diagram after each render. Default true. */\n autoFit?: boolean;\n /** Padding (screen px) used when fitting. */\n padding?: number;\n}\n\nexport type EdodoEvent = \"render\" | \"state\" | \"live\" | \"diagnostics\" | \"edit\" | \"editstate\";\n\n/** Tools: diagram-edit tools go to the EditController; annotation tools to the\n * LiveAnnotationController. */\nconst EDIT_TOOLS = new Set<string>([\"select\", \"hand\", \"rect\", \"ellipse\", \"diamond\", \"text\", \"arrow\"]);\nconst ANNOT_MAP: Record<string, Tool> = {\n highlight: \"highlight\",\n underline: \"underline\",\n \"mark-box\": \"box\",\n \"mark-circle\": \"circle\",\n point: \"arrow\",\n note: \"text\",\n};\n\nexport interface RenderResult {\n scene: Scene;\n diagnostics: Diagnostic[];\n}\n\nexport class EdodoDraw {\n readonly container: HTMLElement;\n private opts: Required<EdodoDrawOptions>;\n private renderer: SvgRenderer;\n private controller: CameraController;\n private annotations: AnnotationLayer;\n private player: TimelinePlayer;\n private live: LiveAnnotationController;\n private edit: EditController;\n private mode: \"edit\" | \"annotate\" = \"edit\";\n private scene: Scene;\n private source = \"\";\n private renderSeq = 0;\n private hasFitted = false;\n private fitOnce = false;\n private listeners = new Map<EdodoEvent, Set<(payload: unknown) => void>>();\n private textInput: HTMLInputElement | null = null;\n private closeInput: ((commit: boolean) => void) | null = null;\n private cleanup: Array<() => void> = [];\n\n constructor(container: HTMLElement, options: EdodoDrawOptions = {}) {\n this.container = container;\n this.opts = {\n interactive: options.interactive ?? true,\n grid: options.grid ?? true,\n autoFit: options.autoFit ?? true,\n padding: options.padding ?? 80,\n };\n if (getComputedStyle(container).position === \"static\") container.style.position = \"relative\";\n container.style.overflow = \"hidden\";\n\n this.renderer = new SvgRenderer(container);\n this.renderer.mount();\n this.scene = compileEdd(\"scene {}\").scene;\n this.controller = new CameraController(this.renderer);\n this.annotations = new AnnotationLayer(this.renderer);\n this.player = new TimelinePlayer(this.renderer, this.controller, this.annotations);\n this.live = new LiveAnnotationController(this.renderer, () => this.scene);\n this.edit = new EditController(this.renderer, {\n getScene: () => this.scene,\n getSource: () => this.source,\n onSource: (next) => this.applyEdit(next),\n onState: (s) => this.emit(\"editstate\", s),\n onRequestRename: (id, current, screen) => this.showRenameInput(id, current, screen),\n });\n\n this.player.onChange = (s) => this.emit(\"state\", s);\n this.live.onChange = (s) => this.emit(\"live\", s);\n this.live.onRequestText = (id, world) => this.showTextInput(id, world);\n this.controller.onFrame = (cam) => this.onCameraFrame(cam);\n if (this.opts.interactive) this.bindInteraction();\n }\n\n private onCameraFrame(cam: { cx: number; cy: number; zoom: number }): void {\n if (this.opts.grid) this.updateGrid(cam);\n this.edit.render();\n }\n\n /** Apply a source edit from direct manipulation. Keeps `source` fresh for\n * chained edits and notifies the host, which re-renders (single render). */\n private applyEdit(next: string): void {\n this.source = next;\n this.emit(\"edit\", next);\n }\n\n // ---- events -------------------------------------------------------------\n on(event: \"state\", cb: (s: PlayerState) => void): () => void;\n on(event: \"live\", cb: (s: LiveState) => void): () => void;\n on(event: \"diagnostics\", cb: (d: Diagnostic[]) => void): () => void;\n on(event: \"render\", cb: (r: RenderResult) => void): () => void;\n on(event: \"edit\", cb: (source: string) => void): () => void;\n on(event: \"editstate\", cb: (s: EditState) => void): () => void;\n on(event: EdodoEvent, cb: (payload: never) => void): () => void {\n if (!this.listeners.has(event)) this.listeners.set(event, new Set());\n this.listeners.get(event)!.add(cb as (p: unknown) => void);\n return () => this.listeners.get(event)?.delete(cb as (p: unknown) => void);\n }\n private emit(event: EdodoEvent, payload: unknown): void {\n this.listeners.get(event)?.forEach((cb) => cb(payload));\n }\n\n // ---- render -------------------------------------------------------------\n /**\n * Compile + render EDodoDraw source. Async because a `mermaid` block may need\n * the (lazy-loaded) Mermaid runtime. Safe to call on every keystroke; stale\n * runs are discarded.\n */\n async render(source: string): Promise<RenderResult> {\n this.source = source;\n const seq = ++this.renderSeq;\n const { scene, diagnostics } = compileEdd(source);\n let diags = diagnostics.items;\n\n const blocks = extractMermaidBlocks(source);\n if (blocks.length) {\n diags = diags.filter((d) => d.code !== \"W-MERMAID-SYNC\");\n for (const body of blocks) {\n try {\n injectMermaid(scene, await convertMermaid(body, scene.theme.mode));\n } catch (err) {\n diags = [...diags, { severity: \"error\", code: \"M-PARSE\", message: `mermaid: ${(err as Error).message}`, line: 1, col: 1, start: 0, end: 0 }];\n }\n }\n if (scene.nodes.every((n) => n.pinned)) scene.meta.layout = \"manual\";\n applyOverrides(scene); // re-apply so imported nodes honor overrides too\n }\n if (seq !== this.renderSeq) return { scene, diagnostics: diags };\n\n this.scene = scene;\n this.renderer.render(scene);\n this.player.load(scene);\n this.renderer.measure();\n // Fit only on the first render or when explicitly requested — NOT on every\n // edit/keystroke (that would reset the camera while you're working).\n if (this.opts.autoFit && (!this.hasFitted || this.fitOnce)) this.fit(false);\n else this.updateGrid(this.controller.current);\n this.hasFitted = true;\n this.fitOnce = false;\n this.live.render();\n this.edit.render();\n\n this.emit(\"diagnostics\", diags);\n this.emit(\"render\", { scene, diagnostics: diags });\n return { scene, diagnostics: diags };\n }\n\n getScene(): Scene {\n return this.scene;\n }\n getSource(): string {\n return this.source;\n }\n\n // ---- camera -------------------------------------------------------------\n fit(animate = true): void {\n this.renderer.measure();\n const cam = cameraForBBox(sceneBBox(this.scene), this.renderer.getViewportSize(), { padding: this.opts.padding });\n if (animate) void this.controller.animateTo(cam);\n else this.controller.setImmediate(cam);\n }\n focus(ids: string[], opts?: { zoom?: number; padding?: number }): Promise<void> {\n return this.controller.focus(this.scene, ids, opts);\n }\n zoomBy(factor: number): void {\n this.controller.zoomBy(factor);\n }\n reset(): void {\n this.fit(true);\n }\n get camera(): CameraController {\n return this.controller;\n }\n\n // ---- timeline -----------------------------------------------------------\n play(): void {\n this.player.play();\n }\n pause(): void {\n this.player.pause();\n }\n next(): void {\n this.player.next();\n }\n prev(): void {\n this.player.prev();\n }\n goto(i: number): void {\n void this.player.goto(i);\n }\n restart(): void {\n this.player.restart();\n }\n get timeline(): TimelinePlayer {\n return this.player;\n }\n\n // ---- tools (diagram-edit + annotation) ----------------------------------\n /** Select the active tool. Edit tools (select/hand/rect/ellipse/diamond/\n * text/arrow) manipulate the diagram; annotation tools (highlight/underline/\n * mark-box/mark-circle/point/note) overlay annotations. */\n setTool(tool: string): void {\n if (EDIT_TOOLS.has(tool)) {\n this.mode = \"edit\";\n this.edit.setTool(tool as EditTool);\n this.container.style.cursor = tool === \"select\" || tool === \"hand\" ? \"grab\" : \"crosshair\";\n } else if (tool in ANNOT_MAP) {\n this.mode = \"annotate\";\n this.edit.clearSelection();\n this.live.setTool(ANNOT_MAP[tool]);\n this.container.style.cursor = \"crosshair\";\n }\n }\n /** Fit the whole diagram on the next render (used when loading an example). */\n fitNext(): void {\n this.fitOnce = true;\n }\n get editor(): EditController {\n return this.edit;\n }\n applyStyle(id: string, style: { fill?: string; stroke?: string; shape?: string }): void {\n this.edit.applyStyle(id, style);\n }\n deleteSelected(): void {\n this.edit.deleteSelected();\n }\n renameSelected(): void {\n this.edit.requestRenameSelected();\n }\n\n // ---- live annotations ---------------------------------------------------\n undo(): void {\n this.live.undo();\n }\n redo(): void {\n this.live.redo();\n }\n clearAnnotations(): void {\n this.live.clear();\n }\n /** Serialize live annotations into an `annotate { … }` block. */\n annotationsToCode(): string {\n return this.live.commitToCode();\n }\n get annotator(): LiveAnnotationController {\n return this.live;\n }\n\n // ---- export -------------------------------------------------------------\n toSVG(): Promise<string> {\n return exportSVGString(this.renderer, this.scene);\n }\n toPNG(): Promise<Blob> {\n return exportPNGBlob(this.renderer, this.scene);\n }\n toJSON(): Scene {\n return this.scene;\n }\n downloadSVG(): Promise<void> {\n return downloadSVG(this.renderer, this.scene);\n }\n downloadPNG(): Promise<void> {\n return downloadPNG(this.renderer, this.scene);\n }\n downloadJSON(): void {\n downloadJSON(this.scene);\n }\n\n // ---- lifecycle ----------------------------------------------------------\n resize(): void {\n this.renderer.measure();\n this.renderer.applyCamera(this.renderer.getCamera());\n this.updateGrid(this.controller.current);\n }\n destroy(): void {\n for (const fn of this.cleanup) fn();\n this.cleanup = [];\n this.closeInput?.(false);\n this.textInput?.remove();\n this.edit.dispose();\n this.player.dispose();\n this.renderer.destroy();\n this.listeners.clear();\n }\n\n // ---- internals ----------------------------------------------------------\n private updateGrid(cam: { cx: number; cy: number; zoom: number }): void {\n if (!this.opts.grid) return;\n const { w, h } = this.renderer.getViewportSize();\n const cell = 26 * cam.zoom;\n const c = this.container;\n if (cell < 7) {\n c.style.backgroundImage = \"none\";\n return;\n }\n c.style.backgroundImage = \"radial-gradient(circle, #d5d9e0 1px, transparent 1px)\";\n c.style.backgroundSize = `${cell}px ${cell}px`;\n c.style.backgroundPosition = `${-cam.cx * cam.zoom + w / 2}px ${-cam.cy * cam.zoom + h / 2}px`;\n }\n\n private localPoint(e: { clientX: number; clientY: number }): Point {\n const rect = this.container.getBoundingClientRect();\n return { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }\n\n private bindInteraction(): void {\n const host = this.container;\n const add = <K extends keyof HTMLElementEventMap>(t: K, fn: (e: HTMLElementEventMap[K]) => void, opts?: AddEventListenerOptions) => {\n host.addEventListener(t, fn as EventListener, opts);\n this.cleanup.push(() => host.removeEventListener(t, fn as EventListener, opts));\n };\n\n const ro = new ResizeObserver(() => this.resize());\n ro.observe(host);\n this.cleanup.push(() => ro.disconnect());\n\n add(\"wheel\", (e) => {\n e.preventDefault();\n this.player.pause();\n this.controller.zoomBy(Math.exp(-e.deltaY * 0.0016), this.localPoint(e));\n this.live.render();\n }, { passive: false });\n\n let dragging = false;\n let lx = 0;\n let ly = 0;\n add(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n const local = this.localPoint(e);\n const world = this.renderer.screenToWorld(local);\n const handled = this.mode === \"edit\" ? this.edit.pointerDown(world, local) : this.live.pointerDown(world, local);\n if (handled) {\n host.setPointerCapture(e.pointerId);\n return;\n }\n dragging = true; // fall through to camera pan\n lx = e.clientX;\n ly = e.clientY;\n host.setPointerCapture(e.pointerId);\n host.style.cursor = \"grabbing\";\n });\n add(\"pointermove\", (e) => {\n const world = this.renderer.screenToWorld(this.localPoint(e));\n if (this.mode === \"edit\") this.edit.pointerMove(world);\n else this.live.pointerMove(world);\n if (!dragging) return;\n this.player.pause();\n this.controller.panByScreen(e.clientX - lx, e.clientY - ly);\n lx = e.clientX;\n ly = e.clientY;\n this.live.render();\n this.edit.render();\n });\n add(\"pointerup\", (e) => {\n const world = this.renderer.screenToWorld(this.localPoint(e));\n if (this.mode === \"edit\") this.edit.pointerUp(world);\n else this.live.pointerUp(world);\n dragging = false;\n try {\n host.releasePointerCapture(e.pointerId);\n } catch {\n /* ignore */\n }\n host.style.cursor = this.mode === \"edit\" && (this.edit.getTool() === \"select\" || this.edit.getTool() === \"hand\") ? \"grab\" : \"crosshair\";\n });\n add(\"dblclick\", (e) => {\n if (this.mode !== \"edit\") return;\n this.edit.dblclick(this.renderer.screenToWorld(this.localPoint(e)));\n });\n\n const onKey = (e: KeyboardEvent) => {\n const tag = (e.target as HTMLElement)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\") return;\n if (this.mode === \"edit\" && this.edit.handleKey(e)) {\n e.preventDefault();\n return;\n }\n if (this.live.handleKey(e)) e.preventDefault();\n };\n window.addEventListener(\"keydown\", onKey);\n this.cleanup.push(() => window.removeEventListener(\"keydown\", onKey));\n host.style.cursor = \"grab\";\n }\n\n /** Inline text editor for renaming a node (double-click / new node). */\n private showRenameInput(id: string, current: string, screen: Point): void {\n this.openInlineInput({\n value: current,\n placeholder: \"label…\",\n screen,\n style: { background: \"#ffffff\", color: \"#1e1e1e\", textAlign: \"center\", zIndex: \"30\", minWidth: \"80px\" },\n onCommit: (v) => this.edit.applyRename(id, v),\n });\n }\n\n private showTextInput(id: string, world: Point): void {\n this.openInlineInput({\n value: \"note\",\n screen: this.renderer.worldToScreen(world),\n style: { background: \"#fff9db\", color: \"#5c3d00\", zIndex: \"20\" },\n onCommit: (v) => this.live.setText(id, v),\n });\n }\n\n /**\n * Shared inline text-entry field (used for rename + sticky notes). One code\n * path so the create/focus/commit/teardown lifecycle is race-free: the blur\n * listener is detached before removal and every settle is idempotent, so\n * dismissing one input to open another can't double-remove a DOM node.\n */\n private openInlineInput(opts: {\n value: string;\n screen: Point;\n style?: Record<string, string>;\n placeholder?: string;\n onCommit: (value: string) => void;\n }): void {\n this.closeInput?.(false); // dismiss any open field (no commit) before opening a new one\n const input = this.container.ownerDocument.createElement(\"input\");\n input.value = opts.value;\n if (opts.placeholder) input.placeholder = opts.placeholder;\n Object.assign(\n input.style,\n {\n position: \"absolute\",\n left: `${opts.screen.x}px`,\n top: `${opts.screen.y}px`,\n transform: \"translate(-50%, -50%)\",\n font: '16px \"Excalifont\", \"Virgil\", cursive',\n padding: \"4px 8px\",\n border: \"2px solid #6741d9\",\n borderRadius: \"6px\",\n outline: \"none\",\n },\n opts.style ?? {},\n );\n let settled = false;\n const settle = (commit: boolean) => {\n if (settled) return;\n settled = true;\n input.removeEventListener(\"blur\", onBlur); // stop removal from re-triggering commit\n const value = input.value;\n if (this.closeInput === settle) this.closeInput = null;\n if (this.textInput === input) this.textInput = null;\n if (input.parentNode) input.parentNode.removeChild(input);\n if (commit) opts.onCommit(value);\n };\n const onBlur = () => settle(true);\n input.addEventListener(\"keydown\", (e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") {\n e.preventDefault();\n settle(true);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n settle(false);\n }\n });\n input.addEventListener(\"blur\", onBlur);\n this.container.appendChild(input);\n this.textInput = input;\n this.closeInput = settle;\n input.focus();\n input.select();\n }\n}\n"],"names":["clamp","lerp","r","SVG_NS","dist","T","name","sub","program","u","parse"],"mappings":";;AAgCO,MAAMA,UAAQ,CAAC,GAAW,IAAY,OAC3C,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;AAEvB,MAAMC,SAAO,CAAC,GAAW,GAAW,MAAsB,KAAK,IAAI,KAAK;AAExE,MAAM,OAAO,CAAC,GAAU,MAAqB,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAE5E,MAAM,aAAa,CAACC,QAAoB,EAAE,GAAGA,GAAE,IAAIA,GAAE,IAAI,GAAG,GAAGA,GAAE,IAAIA,GAAE,IAAI,EAAA;AAE3E,MAAM,aAAa,CAACA,QAAmB;AAAA,EAC5C,MAAMA,GAAE;AAAA,EACR,MAAMA,GAAE;AAAA,EACR,MAAMA,GAAE,IAAIA,GAAE;AAAA,EACd,MAAMA,GAAE,IAAIA,GAAE;AAChB;AAEO,MAAM,aAAa,CAAC,OAAmB;AAAA,EAC5C,GAAG,EAAE;AAAA,EACL,GAAG,EAAE;AAAA,EACL,GAAG,EAAE,OAAO,EAAE;AAAA,EACd,GAAG,EAAE,OAAO,EAAE;AAChB;AAEO,MAAM,aAAa,CAAC,OAAoB;AAAA,EAC7C,IAAI,EAAE,OAAO,EAAE,QAAQ;AAAA,EACvB,IAAI,EAAE,OAAO,EAAE,QAAQ;AACzB;AAEO,MAAM,WAAW,CAAC,OAAmB;AAAA,EAC1C,GAAG,EAAE,OAAO,EAAE;AAAA,EACd,GAAG,EAAE,OAAO,EAAE;AAChB;AAEO,MAAM,YAAY,OAAa;AAAA,EACpC,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,MAAM,cAAc,CAAC,MAC1B,CAAC,OAAO,SAAS,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;AAErD,MAAM,YAAY,CAAC,GAAS,OAAmB;AAAA,EACpD,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI;AAAA,EAC7B,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI;AAAA,EAC7B,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI;AAAA,EAC7B,MAAM,KAAK,IAAI,EAAE,MAAM,EAAE,IAAI;AAC/B;AAEO,MAAM,eAAe,CAAC,WAA0B;AACrD,QAAM,IAAI,UAAA;AACV,aAAW,KAAK,QAAQ;AACtB,QAAI,EAAE,IAAI,EAAE,KAAM,GAAE,OAAO,EAAE;AAC7B,QAAI,EAAE,IAAI,EAAE,KAAM,GAAE,OAAO,EAAE;AAC7B,QAAI,EAAE,IAAI,EAAE,KAAM,GAAE,OAAO,EAAE;AAC7B,QAAI,EAAE,IAAI,EAAE,KAAM,GAAE,OAAO,EAAE;AAAA,EAC/B;AACA,SAAO;AACT;AAEO,MAAM,aAAa,CAAC,GAAS,SAAuB;AAAA,EACzD,MAAM,EAAE,OAAO;AAAA,EACf,MAAM,EAAE,OAAO;AAAA,EACf,MAAM,EAAE,OAAO;AAAA,EACf,MAAM,EAAE,OAAO;AACjB;AAEO,MAAM,cAAc,CAAC,GAAUA,OACpC,EAAE,KAAKA,GAAE,KAAK,EAAE,KAAKA,GAAE,IAAIA,GAAE,KAAK,EAAE,KAAKA,GAAE,KAAK,EAAE,KAAKA,GAAE,IAAIA,GAAE;AAO1D,MAAM,oBAAoB,CAACA,IAAS,WAAyB;AAClE,QAAM,IAAI,WAAWA,EAAC;AACtB,QAAM,KAAK,OAAO,IAAI,EAAE;AACxB,QAAM,KAAK,OAAO,IAAI,EAAE;AACxB,MAAI,OAAO,KAAK,OAAO,EAAG,QAAO;AACjC,QAAM,KAAKA,GAAE,IAAI;AACjB,QAAM,KAAKA,GAAE,IAAI;AAEjB,QAAM,SAAS,OAAO,IAAI,KAAK,KAAK,IAAI,EAAE,IAAI;AAC9C,QAAM,SAAS,OAAO,IAAI,KAAK,KAAK,IAAI,EAAE,IAAI;AAC9C,QAAM,IAAI,KAAK,IAAI,QAAQ,MAAM;AACjC,SAAO,EAAE,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,KAAK,EAAA;AAC1C;AAMO,MAAM,sBAAsB,CAACA,IAAS,WAAyB;AACpE,QAAM,IAAI,WAAWA,EAAC;AACtB,QAAM,KAAK,OAAO,IAAI,EAAE;AACxB,QAAM,KAAK,OAAO,IAAI,EAAE;AACxB,MAAI,OAAO,KAAK,OAAO,EAAG,QAAO;AACjC,QAAM,KAAKA,GAAE,IAAI;AACjB,QAAM,KAAKA,GAAE,IAAI;AACjB,QAAM,QAAQ,KAAK,KAAM,KAAK,MAAO,KAAK,MAAO,KAAK,MAAO,KAAK,GAAG;AACrE,MAAI,UAAU,EAAG,QAAO;AACxB,SAAO,EAAE,GAAG,EAAE,IAAI,KAAK,OAAO,GAAG,EAAE,IAAI,KAAK,MAAA;AAC9C;AAGO,MAAM,aAAa,CAAC,MAAsB;AAC/C,MAAI,IAAI,eAAe;AACvB,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,SAAK,EAAE,WAAW,CAAC;AACnB,QAAI,KAAK,KAAK,GAAG,QAAQ;AAAA,EAC3B;AACA,SAAO,MAAM;AACf;AClIO,SAAS,SAAS,GAAoB;AAC3C,SAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAA;AACxC;AAEA,MAAM,UAA8C;AAAA,EAClD,GAAG,CAACA,OAAM,WAAWA,EAAC;AAAA,EACtB,QAAQ,CAACA,OAAM,WAAWA,EAAC;AAAA,EAC3B,GAAG,CAACA,QAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,IAAI,GAAG,GAAGA,GAAE,EAAA;AAAA,EACpC,KAAK,CAACA,QAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,IAAI,GAAG,GAAGA,GAAE,EAAA;AAAA,EACtC,GAAG,CAACA,QAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,IAAI,GAAG,GAAGA,GAAE,IAAIA,GAAE,EAAA;AAAA,EAC1C,QAAQ,CAACA,QAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,IAAI,GAAG,GAAGA,GAAE,IAAIA,GAAE,EAAA;AAAA,EAC/C,GAAG,CAACA,QAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,GAAG,GAAGA,GAAE,IAAIA,GAAE,IAAI,EAAA;AAAA,EAC1C,OAAO,CAACA,QAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,GAAG,GAAGA,GAAE,IAAIA,GAAE,IAAI,EAAA;AAAA,EAC9C,GAAG,CAACA,QAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,IAAIA,GAAE,IAAI,EAAA;AAAA,EACpC,MAAM,CAACA,QAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,IAAIA,GAAE,IAAI,EAAA;AAAA,EACvC,IAAI,CAACA,QAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,GAAG,GAAGA,GAAE,EAAA;AAAA,EACjC,IAAI,CAACA,QAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE;EAC3B,IAAI,CAACA,QAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,GAAG,GAAGA,GAAE,IAAIA,GAAE,EAAA;AAAA,EACvC,IAAI,CAACA,QAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,IAAIA,GAAE,EAAA;AACnC;AAMO,SAAS,cACd,MACA,QACA,QACO;AACP,QAAMA,KAAI,SAAS,IAAI;AACvB,MAAI,CAAC,UAAU,WAAW,QAAQ;AAChC,UAAM,SAAS,UAAU,WAAWA,EAAC;AACrC,QAAI,KAAK,UAAU,aAAa,KAAK,UAAU,UAAU;AACvD,aAAO,oBAAoBA,IAAG,MAAM;AAAA,IACtC;AACA,WAAO,kBAAkBA,IAAG,MAAM;AAAA,EACpC;AAEA,QAAM,MAAM,OAAO,KAAA,EAAO,YAAA;AAC1B,MAAI,OAAO,QAAS,QAAO,QAAQ,GAAG,EAAEA,EAAC;AAGzC,QAAM,KAAK,IAAI,MAAM,qCAAqC;AAC1D,MAAI,IAAI;AACN,WAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,IAAI,WAAW,GAAG,CAAC,CAAC,GAAG,GAAGA,GAAE,IAAIA,GAAE,IAAI,WAAW,GAAG,CAAC,CAAC,EAAA;AAAA,EAC5E;AAGA,QAAM,OAAO,IAAI,MAAM,mDAAmD;AAC1E,MAAI,MAAM;AACR,UAAM,OAAO,KAAK,CAAC;AACnB,UAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC;AACtD,YAAQ,MAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,IAAI,GAAG,GAAGA,GAAE,EAAA;AAAA,MAClC,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,IAAI,GAAG,GAAGA,GAAE,IAAIA,GAAE,EAAA;AAAA,MACxC,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,GAAGA,GAAE,GAAG,GAAGA,GAAE,IAAIA,GAAE,IAAI,EAAA;AAAA,MAClC,KAAK;AAAA,MACL,KAAK;AACH,eAAO,EAAE,GAAGA,GAAE,IAAIA,GAAE,GAAG,GAAGA,GAAE,IAAIA,GAAE,IAAI,EAAA;AAAA,IAAE;AAAA,EAE9C;AAGA,QAAM,MAAM,IAAI,MAAM,2BAA2B;AACjD,MAAI,KAAK;AACP,UAAM,MAAM,WAAW,IAAI,CAAC,CAAC;AAC7B,UAAM,MAAO,MAAM,KAAK,KAAM;AAC9B,UAAM,IAAI,WAAWA,EAAC;AACtB,UAAM,MAAa,EAAE,GAAG,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI,IAAA;AAC5E,QAAI,KAAK,UAAU,aAAa,KAAK,UAAU,UAAU;AACvD,aAAO,oBAAoBA,IAAG,GAAG;AAAA,IACnC;AACA,WAAO,kBAAkBA,IAAG,GAAG;AAAA,EACjC;AAGA,SAAO,WAAWA,EAAC;AACrB;AC1FO,SAAS,QAAQ,OAAc,IAAmC;AACvE,SAAO,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC5C;AAEO,SAAS,QAAQ,OAAc,IAAmC;AACvE,SAAO,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC5C;AAEO,SAAS,SAAS,OAAc,IAAoC;AACzE,SAAO,MAAM,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC7C;AAEO,SAAS,SAAS,GAAoB;AAC3C,SAAO,WAAW,SAAS,CAAC,CAAC;AAC/B;AAEO,SAAS,SAAS,GAAoB;AAC3C,MAAI,EAAE,UAAU,EAAE,OAAO,OAAQ,QAAO,aAAa,EAAE,MAAM;AAC7D,SAAO,UAAA;AACT;AAEO,SAAS,UAAU,OAAc,GAAqB;AAC3D,MAAI,IAAI,UAAA;AACR,aAAW,MAAM,EAAE,SAAS;AAC1B,UAAM,IAAI,QAAQ,OAAO,EAAE;AAC3B,QAAI,EAAG,KAAI,UAAU,GAAG,SAAS,CAAC,CAAC;AAAA,EACrC;AACA,SAAO;AACT;AAGO,SAAS,YAAY,OAAc,IAA8B;AACtE,QAAM,IAAI,QAAQ,OAAO,EAAE;AAC3B,MAAI,EAAG,QAAO,SAAS,CAAC;AACxB,QAAM,IAAI,SAAS,OAAO,EAAE;AAC5B,MAAI,EAAG,QAAO,UAAU,OAAO,CAAC;AAChC,QAAM,IAAI,QAAQ,OAAO,EAAE;AAC3B,MAAI,GAAG;AACL,UAAM,IAAI,SAAS,CAAC;AACpB,WAAO,OAAO,SAAS,EAAE,IAAI,IAAI,IAAI;AAAA,EACvC;AACA,SAAO;AACT;AAGO,SAAS,aAAa,OAAc,KAAqB;AAC9D,MAAI,IAAI,UAAA;AACR,aAAW,MAAM,KAAK;AACpB,UAAM,KAAK,YAAY,OAAO,EAAE;AAChC,QAAI,GAAI,KAAI,UAAU,GAAG,EAAE;AAAA,EAC7B;AACA,SAAO;AACT;AAGO,SAAS,UAAU,OAAoB;AAC5C,MAAI,IAAI,UAAA;AACR,aAAW,KAAK,MAAM,MAAO,KAAI,UAAU,GAAG,SAAS,CAAC,CAAC;AACzD,aAAW,KAAK,MAAM,OAAO;AAC3B,UAAM,KAAK,SAAS,CAAC;AACrB,QAAI,OAAO,SAAS,GAAG,IAAI,EAAG,KAAI,UAAU,GAAG,EAAE;AAAA,EACnD;AACA,SAAO;AACT;AAEO,SAAS,WAAW,GAAoB;AAC7C,SAAO,SAAS,CAAC;AACnB;AAGO,SAAS,YAAY,OAAc,GAA+C;AACvF,MAAI,OAAyB;AAC7B,aAAW,KAAK,MAAM,OAAO;AAC3B,QAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG;AACpE,UAAI,CAAC,QAAQ,EAAE,KAAK,KAAK,EAAG,QAAO;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;ACjFO,MAAM,iBAAiB;AAAA,EAC5B,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT;AAGO,MAAM,eAAe;AAAA,EAC1B,aAAa;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT;AAUO,SAAS,cAAc,OAA2B,UAA0B;AACjF,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,MAAM,KAAA,EAAO,YAAA;AACvB,MAAI,MAAM,iBAAiB,MAAM,OAAQ,QAAO;AAChD,MAAI,EAAE,WAAW,GAAG,EAAG,QAAO,MAAM,KAAA;AACpC,MAAI,KAAK,eAAgB,QAAO,eAAe,CAAc;AAE7D,SAAO,MAAM,KAAA;AACf;AAGO,SAAS,YAAY,OAA0C;AACpE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,MAAM,KAAA,EAAO,YAAA;AACvB,MAAI,MAAM,iBAAiB,MAAM,OAAQ,QAAO;AAChD,MAAI,EAAE,WAAW,GAAG,EAAG,QAAO,MAAM,KAAA;AACpC,MAAI,KAAK,aAAc,QAAO,aAAa,CAA8B;AACzE,SAAO,MAAM,KAAA;AACf;AAOO,SAAS,oBAAoB,WAA8C;AAChF,MAAI,CAAC,UAAW,QAAO;AACvB,QAAM,IAAI,UAAU,KAAA,EAAO,YAAA;AAC3B,MAAI,KAAK,eAAgB,QAAO,eAAe,CAAc;AAC7D,SAAO;AACT;AAGO,MAAM,iBAAiB;AAAA,EAC5B,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,KAAK;AACP;AAEO,SAAS,cAAc,OAA2B,WAAW,eAAe,QAAgB;AACjG,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,MAAM,KAAA,EAAO,YAAA;AACvB,MAAI,EAAE,WAAW,GAAG,EAAG,QAAO,MAAM,KAAA;AACpC,MAAI,KAAK,eAAgB,QAAO,eAAe,CAAgC;AAC/E,SAAO,cAAc,OAAO,QAAQ;AACtC;ACrFA,MAAMC,WAAS;AACf,MAAM,MAAM;AAEL,MAAM,gBAAgB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,UAAuB,QAAgC,eAAe;AAChF,SAAK,WAAW;AAChB,SAAK,KAAK,MAAM,IAAI,SAAS,GAAG;AAChC,SAAK,OAAO,SAAS,SAAS,KAAK;AAAA,EACrC;AAAA,EAEA,QAAc;AACZ,SAAK,KAAK,gBAAA;AAAA,EACZ;AAAA;AAAA,EAGA,OAAO,OAAc,aAA2B,UAAU,MAAY;AACpE,SAAK,MAAA;AAEL,UAAM,SAAS,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,CAAC;AAC1E,eAAW,MAAM,QAAQ;AACvB,UAAI;AACF,cAAM,IAAI,KAAK,KAAK,OAAO,EAAE;AAC7B,YAAI,GAAG;AACL,cAAI,QAAS,GAAE,UAAU,IAAI,YAAY,GAAG,IAAI,CAAC;AACjD,eAAK,KAAK,YAAY,CAAC;AAAA,QACzB;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,KAAK,4BAA4B,GAAG,MAAM,GAAG;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,OAAc,IAA6B;AAC5D,UAAM,UAAW,GAAG,QAAQ,WAAoC,CAAA;AAChE,QAAI,QAAQ,QAAQ;AAClB,UAAI,IAAI,UAAA;AACR,iBAAW,MAAM,SAAS;AACxB,cAAM,KAAK,YAAY,OAAO,EAAE;AAChC,YAAI,GAAI,KAAI,UAAU,GAAG,EAAE;AAAA,MAC7B;AACA,aAAO,OAAO,SAAS,EAAE,IAAI,IAAI,IAAI;AAAA,IACvC;AACA,QAAI,GAAG,OAAO,MAAM;AAClB,YAAMD,KAAI,GAAG,OAAO;AACpB,aAAO,EAAE,MAAMA,GAAE,GAAG,MAAMA,GAAE,GAAG,MAAMA,GAAE,IAAIA,GAAE,GAAG,MAAMA,GAAE,IAAIA,GAAE,EAAA;AAAA,IAChE;AACA,QAAI,GAAG,OAAO,KAAK;AACjB,aAAO,YAAY,OAAO,GAAG,OAAO,GAAG,KAAK;AAAA,IAC9C;AACA,QAAI,GAAG,OAAO,OAAO;AACnB,YAAM,IAAI,GAAG,OAAO;AACpB,aAAO,EAAE,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,IAAI,EAAA;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,KAAK,OAAc,IAAoC;AAC7D,UAAM,IAAI,SAAS,gBAAgBC,UAAQ,GAAG;AAC9C,MAAE,aAAa,mBAAmB,GAAG,EAAE;AACvC,MAAE,aAAa,SAAS,gBAAgB;AACxC,UAAM,MAAM,KAAK,WAAW,OAAO,EAAE;AAErC,YAAQ,GAAG,MAAA;AAAA,MACT,KAAK;AACH,YAAI,IAAK,MAAK,cAAc,GAAG,KAAK,EAAE;AACtC;AAAA,MACF,KAAK;AACH,YAAI,IAAK,MAAK,cAAc,GAAG,KAAK,EAAE;AACtC;AAAA,MACF,KAAK;AACH,YAAI,IAAK,MAAK,WAAW,GAAG,KAAK,EAAE;AACnC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,IAAK,MAAK,QAAQ,GAAG,KAAK,EAAE;AAChC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,IAAK,MAAK,WAAW,GAAG,KAAK,EAAE;AACnC;AAAA,MACF,KAAK;AACH,YAAI,IAAK,MAAK,YAAY,GAAG,KAAK,EAAE;AACpC;AAAA,MACF,KAAK;AACH,YAAI,IAAK,MAAK,YAAY,GAAG,KAAK,EAAE;AACpC;AAAA,MACF,KAAK;AACH,YAAI,IAAK,MAAK,cAAc,GAAG,KAAK,EAAE;AACtC;AAAA,MACF,KAAK;AACH,YAAI,IAAK,MAAK,WAAW,GAAG,KAAK,IAAI,IAAI;AACzC;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,IAAK,MAAK,eAAe,GAAG,KAAK,EAAE;AACvC;AAAA,MACF,KAAK;AACH,aAAK,cAAc,OAAO,GAAG,EAAE;AAC/B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,aAAK,WAAW,GAAG,EAAE;AACrB;AAAA,MACF;AACE,YAAI,IAAK,MAAK,QAAQ,GAAG,KAAK,EAAE;AAChC;AAAA,IAAA;AAEJ,WAAO,EAAE,WAAW,SAAS,IAAI;AAAA,EACnC;AAAA;AAAA,EAIQ,cAAc,GAAgB,KAAW,IAAsB;AACrE,UAAM,QAAQ,cAAc,GAAG,KAAK;AACpC,UAAM,MAAM;AACZ,UAAMD,KAAI,SAAS,gBAAgBC,UAAQ,MAAM;AACjD,IAAAD,GAAE,aAAa,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC;AAC1C,IAAAA,GAAE,aAAa,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC;AAC1C,IAAAA,GAAE,aAAa,SAAS,OAAO,IAAI,OAAO,IAAI,OAAO,MAAM,CAAC,CAAC;AAC7D,IAAAA,GAAE,aAAa,UAAU,OAAO,IAAI,OAAO,IAAI,OAAO,MAAM,CAAC,CAAC;AAC9D,IAAAA,GAAE,aAAa,MAAM,GAAG;AACxB,IAAAA,GAAE,aAAa,QAAQ,KAAK;AAC5B,IAAAA,GAAE,aAAa,WAAW,MAAM;AAChC,IAAAA,GAAE,MAAM,eAAe;AACvB,MAAE,YAAYA,EAAC;AAAA,EACjB;AAAA,EAEQ,cAAc,GAAgB,KAAW,IAAsB;AACrE,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,IAAI,IAAI,OAAO;AACrB,UAAM,OAAgB,EAAE,QAAQ,OAAO,aAAa,GAAG,WAAW,KAAK,QAAQ,GAAG,MAAM,EAAA;AACxF,UAAM,QAAQ,OAAO,GAAG,QAAQ,SAAS,OAAO;AAChD,QAAI,UAAU,QAAQ;AACpB,YAAM,MAA0B,CAAA;AAChC,YAAM,QAAQ;AACd,eAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,cAAM,IAAI,IAAI,QAAS,IAAI,OAAO,IAAI,QAAQ,IAAK;AACnD,YAAI,KAAK,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,MACzC;AACA,QAAE,YAAY,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,IACxC,OAAO;AACL,QAAE,YAAY,KAAK,GAAG,KAAK,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC;AAC1D,UAAI,UAAU,SAAU,GAAE,YAAY,KAAK,GAAG,KAAK,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC;AAAA,IAC5F;AAAA,EACF;AAAA,EAEQ,WAAW,GAAgB,KAAW,IAAsB;AAClE,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,KAAK,IAAI,OAAO,IAAI,QAAQ;AAClC,MAAE,YAAY,KAAK,GAAG,KAAK,IAAI,MAAM,GAAG,IAAI,MAAM,GAAG,EAAE,QAAQ,OAAO,aAAa,GAAG,WAAW,KAAK,MAAM,EAAA,CAAG,CAAC;AAAA,EAClH;AAAA,EAEQ,QAAQ,GAAgB,KAAW,IAAsB;AAC/D,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,IAAI,WAAW,KAAK,EAAE;AAC5B,MAAE;AAAA,MACA,KAAK,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;AAAA,QAClE,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,WAAW;AAAA,QACX,MAAM;AAAA,MAAA,CACP;AAAA,IAAA;AAEH,QAAI,GAAG,KAAM,MAAK,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,GAAG,EAAE,OAAO,EAAA,GAAK,OAAO,OAAO;AAAA,EACtF;AAAA,EAEQ,WAAW,GAAgB,KAAW,IAAgB,QAAQ,OAAa;AACjF,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,IAAI,WAAW,GAAG;AACxB,UAAM,KAAK,IAAI,OAAO,IAAI,QAAQ,OAAO;AACzC,UAAM,KAAK,IAAI,OAAO,IAAI,QAAQ,OAAO;AACzC,UAAM,OAAO,KAAK,GAAG,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,QAAQ,OAAO,aAAa,KAAK,WAAW,KAAK,MAAM,IAAI;AAC1G,QAAI,YAAY,UAAU,IAAI,gBAAgB,GAAI,KAAK,MAAM,oBAAoB;AACjF,MAAE,YAAY,IAAI;AAClB,QAAI,GAAG,KAAM,MAAK,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI,OAAO,IAAI,KAAA,GAAQ,OAAO,QAAQ;AAAA,EACzF;AAAA,EAEQ,YAAY,GAAgB,KAAW,IAAsB;AACnE,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,IAAI,WAAW,GAAG;AACxB,UAAM,OAAO,OAAO,GAAG,QAAQ,QAAQ,IAAI;AAC3C,UAAM,MAAM,OAAO,IAAI;AACvB,UAAME,QAAO;AACb,UAAM,OAAc,EAAE,GAAG,EAAE,IAAI,IAAI,IAAIA,OAAM,GAAG,EAAE,IAAI,IAAI,IAAIA,MAAA;AAE9D,UAAM,MAAa,EAAE,GAAG,EAAE,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,KAAK,GAAG,EAAE,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI,IAAA;AAEtH,UAAM,OAAc,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,GAAA;AAC9F,MAAE,YAAY,KAAK,GAAG,MAAM,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,OAAO,aAAa,KAAK,WAAW,KAAK,MAAM,GAAA,CAAI,CAAC;AAEhJ,UAAM,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC;AACrD,UAAM,KAAK;AACX,MAAE;AAAA,MACA,KAAK,GAAG;AAAA,QACN;AAAA,UACE,CAAC,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,EAAE;AAAA,UACnE,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,UACb,CAAC,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,EAAE;AAAA,QAAA;AAAA,QAErE,EAAE,QAAQ,OAAO,aAAa,KAAK,WAAW,GAAG,MAAM,GAAA;AAAA,MAAG;AAAA,IAC5D;AAEF,QAAI,GAAG,MAAM;AACX,YAAM,SAAS,IAAI,IAAI,OAAO,QAAQ,IAAI,IAAI,MAAM,UAAU;AAC9D,WAAK,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,KAAK,IAAI,IAAI,IAAI,GAAG,GAAG,KAAK,IAAI,IAAI,IAAI,EAAA,GAAK,OAAO,MAAM;AAAA,IACxF;AAAA,EACF;AAAA,EAEQ,YAAY,GAAgB,KAAW,IAAsB;AACnE,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,YAAY,OAAO,GAAG,QAAQ,aAAa,QAAQ;AACzD,UAAM,IAAI,WAAW,GAAG;AACxB,UAAM,MAAM,OAAO,SAAS;AAC5B,UAAM,MAAM;AACZ,UAAM,SAAgB;AAAA,MACpB,GAAG,EAAE,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI;AAAA,MAC9C,GAAG,EAAE,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,QAAQ,IAAI;AAAA,IAAA;AAEhD,UAAM,SAAgB,EAAE,GAAG,OAAO,IAAI,IAAI,IAAI,KAAK,GAAG,OAAO,IAAI,IAAI,IAAI,IAAA;AACzE,UAAM,OAAO,GAAG,QAAQ;AACxB,UAAM,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,MAAM,EAAE;AAC7C,UAAM,IAAI;AACV,UAAM,KAAK,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI;AAChE,UAAM,KAAK,OAAO,IAAI,IAAI;AAE1B,MAAE,YAAY,KAAK,GAAG,KAAK,OAAO,GAAG,OAAO,GAAG,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,IAAI,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,QAAQ,OAAO,aAAa,GAAG,WAAW,KAAK,MAAM,GAAA,CAAI,CAAC;AAE9K,MAAE,YAAY,KAAK,GAAG,UAAU,IAAI,IAAI,GAAG,GAAG,EAAE,QAAQ,OAAO,aAAa,GAAG,WAAW,KAAK,MAAM,IAAI,MAAM,WAAW,WAAW,QAAA,CAAS,CAAC;AAC/I,SAAK,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,EAAA,GAAK,OAAO,UAAU,EAAE;AAAA,EAC3E;AAAA,EAEQ,eAAe,GAAgB,KAAW,IAAsB;AACtE,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,IAAW,EAAE,GAAG,IAAI,OAAO,GAAG,GAAG,IAAI,OAAO,EAAA;AAClD,MAAE,YAAY,KAAK,GAAG,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,OAAO,aAAa,GAAG,WAAW,GAAG,MAAM,IAAI,MAAM,WAAW,WAAW,QAAA,CAAS,CAAC;AAC1I,SAAK,MAAM,GAAG,GAAG,QAAQ,KAAK,GAAG,OAAO,UAAU,EAAE;AAAA,EACtD;AAAA,EAEQ,cAAc,GAAgB,KAAW,IAAsB;AACrE,UAAM,MAAMJ,QAAM,MAAM,GAAG,QAAQ,KAAK,IAAI,GAAG,GAAG,IAAI;AACtD,UAAM,MAAM,MAAM,GAAG,QAAQ,KAAK,EAAE;AACpC,UAAM,IAAI,WAAW,KAAK,GAAG;AAC7B,UAAM,SAAS,YAAY,GAAG,GAAG,QAAQ,eAAe,EAAE,CAAC;AAC3D,UAAM,OAAO,SAAS,gBAAgBG,UAAQ,MAAM;AACpD,SAAK,aAAa,MAAM,MAAM;AAC9B,UAAM,OAAO,SAAS,gBAAgBA,UAAQ,MAAM;AACpD,SAAK,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC;AACnC,SAAK,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC;AACnC,SAAK,aAAa,SAAS,OAAO,MAAM,CAAC,CAAC;AAC1C,SAAK,aAAa,UAAU,OAAO,MAAM,CAAC,CAAC;AAC3C,SAAK,aAAa,QAAQ,OAAO;AACjC,UAAM,OAAO,SAAS,gBAAgBA,UAAQ,MAAM;AACpD,SAAK,aAAa,KAAK,OAAO,EAAE,IAAI,CAAC;AACrC,SAAK,aAAa,KAAK,OAAO,EAAE,IAAI,CAAC;AACrC,SAAK,aAAa,SAAS,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAClD,SAAK,aAAa,UAAU,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AACnD,SAAK,aAAa,MAAM,IAAI;AAC5B,SAAK,aAAa,QAAQ,OAAO;AACjC,SAAK,YAAY,IAAI;AACrB,SAAK,YAAY,IAAI;AACrB,MAAE,YAAY,IAAI;AAClB,UAAM,QAAQ,SAAS,gBAAgBA,UAAQ,MAAM;AACrD,UAAM,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC;AACpC,UAAM,aAAa,KAAK,OAAO,CAAC,GAAG,CAAC;AACpC,UAAM,aAAa,SAAS,OAAO,MAAM,CAAC,CAAC;AAC3C,UAAM,aAAa,UAAU,OAAO,MAAM,CAAC,CAAC;AAC5C,UAAM,aAAa,QAAQ,SAAS;AACpC,UAAM,aAAa,WAAW,OAAO,GAAG,CAAC;AACzC,UAAM,aAAa,QAAQ,QAAQ,MAAM,GAAG;AAC5C,MAAE,YAAY,KAAK;AAAA,EACrB;AAAA,EAEQ,cAAc,OAAc,GAAgB,IAAsB;AACxE,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,YAAY,GAAG,QAAQ;AAC7B,UAAM,UAAU,GAAG,QAAQ;AAC3B,QAAI,OAAqB,aAAa;AACtC,QAAI,CAAC,QAAQ,SAAS;AACpB,YAAM,IAAI,YAAY,OAAO,OAAO;AACpC,UAAI,EAAG,QAAO,WAAW,CAAC;AAAA,IAC5B;AACA,QAAI,MAAoB,GAAG,OAAO,SAAS;AAC3C,QAAI,CAAC,OAAO,GAAG,OAAO,KAAK;AACzB,YAAM,IAAI,YAAY,OAAO,GAAG,OAAO,GAAG;AAC1C,UAAI,EAAG,OAAM,WAAW,CAAC;AAAA,IAC3B;AACA,QAAI,CAAC,QAAQ,CAAC,IAAK;AAEnB,QAAI,GAAG,OAAO,KAAK;AACjB,YAAM,IAAI,YAAY,OAAO,GAAG,OAAO,GAAG;AAC1C,UAAI,GAAG;AACL,cAAM,IAAI,WAAW,CAAC;AACtB,cAAM,KAAK,KAAK,IAAI,EAAE;AACtB,cAAM,KAAK,KAAK,IAAI,EAAE;AACtB,cAAM,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK;AAClC,cAAM,EAAE,GAAG,EAAE,IAAK,KAAK,QAAS,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI,GAAG,EAAE,IAAK,KAAK,QAAS,EAAE,OAAO,EAAE,QAAQ,IAAI,GAAA;AAAA,MAC5G;AAAA,IACF;AACA,MAAE,YAAY,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,QAAQ,OAAO,aAAa,KAAK,WAAW,KAAK,MAAM,GAAA,CAAI,CAAC;AACvH,UAAM,MAAM,KAAK,MAAM,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,CAAC;AACrD,UAAM,KAAK;AACX,MAAE;AAAA,MACA,KAAK,GAAG;AAAA,QACN;AAAA,UACE,CAAC,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,EAAE;AAAA,UACnE,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,UACb,CAAC,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,MAAM,GAAG,IAAI,EAAE;AAAA,QAAA;AAAA,QAErE,EAAE,QAAQ,OAAO,aAAa,KAAK,WAAW,GAAG,MAAM,GAAA;AAAA,MAAG;AAAA,IAC5D;AAEF,QAAI,GAAG,KAAM,MAAK,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,IAAI,GAAA,GAAM,OAAO,QAAQ;AAAA,EACpF;AAAA,EAEQ,WAAW,GAAgB,IAAsB;AACvD,UAAM,IAAI,GAAG,OAAO;AACpB,QAAI,CAAC,EAAG;AACR,UAAM,QAAQ,GAAG,SAAS;AAC1B,UAAM,OAAO,GAAG,QAAQ;AACxB,UAAM,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,MAAM,EAAE;AAC7C,UAAM,IAAI;AACV,MAAE;AAAA,MACA,KAAK,GAAG,UAAU,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,GAAG;AAAA,QAChD,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,WAAW;AAAA,QACX,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW;AAAA,MAAA,CACZ;AAAA,IAAA;AAEH,SAAK,MAAM,GAAG,MAAM,GAAG,WAAW,UAAU,EAAE;AAAA,EAChD;AAAA,EAEQ,MAAM,GAAgB,MAAc,IAAW,OAAe,QAAoC,OAAO,IAAU;AACzH,UAAM,IAAI,SAAS,gBAAgBA,UAAQ,MAAM;AACjD,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,MAAE,aAAa,eAAe,MAAM;AACpC,MAAE,aAAa,eAAe,iCAAiC;AAC/D,MAAE,aAAa,aAAa,OAAO,IAAI,CAAC;AACxC,MAAE,aAAa,QAAQ,KAAK;AAC5B,MAAE,aAAa,qBAAqB,QAAQ;AAC5C,UAAM,SAAS,GAAG,KAAM,MAAM,SAAS,KAAK,OAAO,MAAO;AAC1D,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAM,KAAK,SAAS,gBAAgBA,UAAQ,OAAO;AACnD,SAAG,aAAa,KAAK,OAAO,GAAG,CAAC,CAAC;AACjC,SAAG,aAAa,KAAK,OAAO,SAAS,IAAI,OAAO,GAAG,CAAC;AACpD,SAAG,cAAc;AACjB,QAAE,YAAY,EAAE;AAAA,IAClB,CAAC;AACD,MAAE,YAAY,CAAC;AAAA,EACjB;AACF;AAEA,SAAS,OAAO,MAAqB;AACnC,QAAM,MAA6B;AAAA,IACjC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAA;AAAA,IACd,KAAK,EAAE,GAAG,GAAG,GAAG,GAAA;AAAA,IAChB,GAAG,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,IACd,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,IACnB,GAAG,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,IACd,OAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AAAA,IAClB,GAAG,EAAE,GAAG,IAAI,GAAG,EAAA;AAAA,IACf,MAAM,EAAE,GAAG,IAAI,GAAG,EAAA;AAAA,IAClB,IAAI,EAAE,GAAG,KAAK,GAAG,KAAA;AAAA,IACjB,IAAI,EAAE,GAAG,MAAM,GAAG,KAAA;AAAA,IAClB,IAAI,EAAE,GAAG,KAAK,GAAG,IAAA;AAAA,IACjB,IAAI,EAAE,GAAG,MAAM,GAAG,IAAA;AAAA,EAAI;AAExB,SAAO,IAAI,IAAI,KAAK,IAAI;AAC1B;AAEA,SAAS,KAAK,MAAsB;AAClC,SAAO,SAAS,cAAc,IAAI;AACpC;AAEA,SAAS,YAAY,MAAsB;AACzC,MAAI,SAAS,YAAa,QAAO;AACjC,MAAI,SAAS,YAAa,QAAO;AACjC,SAAO;AACT;AAEA,SAAS,MAAM,GAAY,GAAmB;AAC5C,SAAO,OAAO,MAAM,WAAW,IAAI;AACrC;AACA,SAASH,QAAM,GAAW,IAAY,IAAoB;AACxD,SAAO,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;AACrC;ACjYA,MAAMG,WAAS;AAYf,MAAM,WAA8F;AAAA,EAClG,WAAW,EAAE,MAAM,aAAa,OAAO,UAAU,SAAS,GAAC;AAAA,EAC3D,WAAW,EAAE,MAAM,aAAa,OAAO,WAAW,SAAS,EAAE,OAAO,UAAQ;AAAA,EAC5E,KAAK,EAAE,MAAM,OAAO,OAAO,WAAW,SAAS,GAAC;AAAA,EAChD,QAAQ,EAAE,MAAM,eAAe,OAAO,WAAW,SAAS,CAAA,EAAC;AAC7D;AAEO,MAAM,yBAAyB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAqB,CAAA;AAAA,EACrB,OAAa;AAAA,EACb,WAA0B;AAAA,EAC1B,QAA2B;AAAA,EAC3B,YAA4B,CAAA;AAAA,EAC5B,YAA4B,CAAA;AAAA,EAC5B,MAAM;AAAA,EACN,WAAkE;AAAA,EAE1E;AAAA,EACA;AAAA,EAEA,YAAY,UAAuB,UAAuB;AACxD,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,QAAQ,IAAI,gBAAgB,UAAU,MAAM;AAAA,EACnD;AAAA;AAAA,EAGQ,OAAa;AACnB,SAAK,WAAW;AAAA,MACd,MAAM,KAAK;AAAA,MACX,OAAO,KAAK,KAAK;AAAA,MACjB,SAAS,KAAK,UAAU,SAAS;AAAA,MACjC,SAAS,KAAK,UAAU,SAAS;AAAA,MACjC,UAAU,KAAK;AAAA,IAAA,CAChB;AAAA,EACH;AAAA,EAEA,QAAQ,GAAe;AACrB,SAAK,OAAO;AACZ,SAAK,QAAQ;AACb,QAAI,MAAM,SAAU,MAAK,WAAW;AACpC,SAAK,OAAA;AACL,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,UAAgB;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAA+B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,WAAiB;AACvB,SAAK,UAAU,KAAK,gBAAgB,KAAK,IAAI,CAAC;AAC9C,QAAI,KAAK,UAAU,SAAS,IAAK,MAAK,UAAU,MAAA;AAChD,SAAK,YAAY,CAAA;AAAA,EACnB;AAAA,EAEQ,GAAG,MAAsB;AAC/B,WAAO,QAAQ,IAAI,IAAI,KAAK,KAAK;AAAA,EACnC;AAAA;AAAA,EAGA,SAAe;AACb,UAAM,QAAQ,KAAK,SAAA;AACnB,UAAM,QAAQ,KAAK,QAAQ,CAAC,GAAG,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK;AAC7D,SAAK,MAAM,OAAO,OAAO,OAAO,KAAK;AACrC,SAAK,cAAA;AAAA,EACP;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,CAAC,KAAK,SAAU;AACpB,UAAM,KAAK,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ;AACvD,QAAI,CAAC,GAAI;AACT,UAAM,MAAM,KAAK,WAAW,EAAE;AAC9B,QAAI,CAAC,IAAK;AACV,UAAM,OAAO,KAAK,SAAS,SAAS,MAAM;AAC1C,UAAM,OAAO,SAAS,gBAAgBA,UAAQ,MAAM;AACpD,UAAM,MAAM;AACZ,SAAK,aAAa,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC;AAC7C,SAAK,aAAa,KAAK,OAAO,IAAI,OAAO,GAAG,CAAC;AAC7C,SAAK,aAAa,SAAS,OAAO,IAAI,OAAO,IAAI,OAAO,MAAM,CAAC,CAAC;AAChE,SAAK,aAAa,UAAU,OAAO,IAAI,OAAO,IAAI,OAAO,MAAM,CAAC,CAAC;AACjE,SAAK,aAAa,QAAQ,MAAM;AAChC,SAAK,aAAa,UAAU,SAAS;AACrC,SAAK,aAAa,gBAAgB,KAAK;AACvC,SAAK,aAAa,oBAAoB,KAAK;AAC3C,SAAK,aAAa,MAAM,GAAG;AAC3B,SAAK,YAAY,IAAI;AAAA,EACvB;AAAA,EAEQ,WAAW,IAAmF;AACpG,UAAM,QAAQ,KAAK,SAAA;AACnB,QAAI,GAAG,OAAO,IAAK,QAAO,YAAY,OAAO,GAAG,OAAO,GAAG,KAAK;AAC/D,QAAI,GAAG,OAAO,OAAO;AACnB,YAAM,IAAI,GAAG,OAAO;AACpB,YAAMD,KAAI,GAAG,SAAS,YAAY,GAAG,SAAS,SAAS,KAAK;AAC5D,aAAO,EAAE,MAAM,EAAE,IAAIA,IAAG,MAAM,EAAE,IAAIA,IAAG,MAAM,EAAE,IAAIA,IAAG,MAAM,EAAE,IAAIA,GAAA;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAIA,YAAY,OAAc,SAAyB;AACjD,UAAM,QAAQ,KAAK,SAAA;AAEnB,QAAI,KAAK,SAAS,UAAU;AAC1B,YAAM,MAAM,KAAK,QAAQ,KAAK;AAC9B,WAAK,WAAW,KAAK,MAAM;AAC3B,UAAI,KAAK;AACP,aAAK,WAAW,EAAE,IAAI,IAAI,IAAI,OAAO,OAAO,MAAM,gBAAgB,GAAG,EAAA;AACrE,aAAK,OAAA;AACL,aAAK,KAAA;AACL,eAAO;AAAA,MACT;AACA,WAAK,OAAA;AACL,WAAK,KAAA;AACL,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,OAAO,YAAY,OAAO,KAAK;AACrC,WAAK,QAAQ;AAAA,QACX,IAAI,KAAK,GAAG,WAAW;AAAA,QACvB,MAAM;AAAA,QACN,QAAQ,EAAE,KAAK,MAAM,OAAO,MAAA;AAAA,QAC5B,OAAO;AAAA,QACP,SAAS,OAAO,EAAE,SAAS,KAAK,OAAO,EAAE,WAAW,MAAA;AAAA,QACpD,GAAG;AAAA,QACH,QAAQ;AAAA,MAAA;AAEV,WAAK,OAAA;AACL,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,YAAM,KAAiB;AAAA,QACrB,IAAI,KAAK,GAAG,QAAQ;AAAA,QACpB,MAAM;AAAA,QACN,QAAQ,EAAE,KAAK,MAAM,OAAO,MAAA;AAAA,QAC5B,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS,CAAA;AAAA,QACT,GAAG;AAAA,QACH,QAAQ;AAAA,MAAA;AAEV,WAAK,SAAA;AACL,WAAK,KAAK,KAAK,EAAE;AACjB,WAAK,WAAW,GAAG;AACnB,WAAK,OAAA;AACL,WAAK,KAAA;AACL,WAAK,gBAAgB,GAAG,IAAI,KAAK;AACjC,aAAO;AAAA,IACT;AAGA,UAAM,MAAM,SAAS,KAAK,IAAI;AAC9B,QAAI,KAAK;AACP,YAAM,OAAO,YAAY,OAAO,KAAK;AACrC,UAAI,CAAC,KAAM,QAAO;AAClB,YAAM,KAAiB;AAAA,QACrB,IAAI,KAAK,GAAG,IAAI,IAAI;AAAA,QACpB,MAAM,IAAI;AAAA,QACV,QAAQ,EAAE,KAAK,KAAK,GAAA;AAAA,QACpB,OAAO,IAAI;AAAA,QACX,SAAS,EAAE,GAAG,IAAI,QAAA;AAAA,QAClB,GAAG;AAAA,QACH,QAAQ;AAAA,MAAA;AAEV,WAAK,SAAA;AACL,WAAK,KAAK,KAAK,EAAE;AACjB,WAAK,WAAW,GAAG;AACnB,WAAK,OAAA;AACL,WAAK,KAAA;AACL,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAAoB;AAC9B,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,KAAK,SAAA;AACnB,YAAM,OAAO,YAAY,OAAO,KAAK;AACrC,UAAI,MAAM;AACR,aAAK,MAAM,SAAS,EAAE,KAAK,KAAK,GAAA;AAAA,MAClC,OAAO;AACL,aAAK,MAAM,SAAS,EAAE,KAAK,MAAM,OAAO,MAAA;AAAA,MAC1C;AACA,WAAK,OAAA;AACL;AAAA,IACF;AACA,QAAI,KAAK,UAAU;AACjB,YAAM,KAAK,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,SAAU,EAAE;AAC3D,UAAI,MAAM,GAAG,OAAO,OAAO;AACzB,cAAM,KAAK,MAAM,IAAI,KAAK,SAAS,MAAM;AACzC,cAAM,KAAK,MAAM,IAAI,KAAK,SAAS,MAAM;AACzC,cAAM,IAAI,KAAK,SAAS,KAAK,OAAO;AACpC,WAAG,OAAO,QAAQ,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAA;AAC1C,YAAI,GAAG,QAAQ,WAAW;AACxB,gBAAM,KAAK,KAAK,SAAS,KAAK,QAAQ;AACtC,aAAG,QAAQ,YAAY,EAAE,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAA;AAAA,QACnD;AACA,aAAK,OAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAoB;AAC5B,QAAI,KAAK,OAAO;AACd,YAAM,QAAQ,KAAK,SAAA;AACnB,YAAM,OAAO,YAAY,OAAO,KAAK;AACrC,UAAI,KAAM,MAAK,MAAM,SAAS,EAAE,KAAK,KAAK,GAAA;AAAA,gBAChC,MAAM,SAAS,EAAE,KAAK,MAAM,OAAO,MAAA;AAC7C,WAAK,SAAA;AACL,WAAK,KAAK,KAAK,KAAK,KAAK;AACzB,WAAK,WAAW,KAAK,MAAM;AAC3B,WAAK,QAAQ;AACb,WAAK,OAAA;AACL,WAAK,KAAA;AACL;AAAA,IACF;AACA,QAAI,KAAK,UAAU;AAEjB,YAAM,SAAS,KAAK,SAAS;AAC7B,YAAM,MAAM,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,SAAU,EAAE;AAC5D,UAAI,OAAO,KAAK,UAAU,OAAO,MAAM,MAAM,KAAK,UAAU,IAAI,MAAM,GAAG;AACvE,aAAK,UAAU,KAAK,KAAK,SAAS,KAAK,SAAS,IAAI,MAAM,CAAC;AAC3D,aAAK,YAAY,CAAA;AAAA,MACnB;AACA,WAAK,WAAW;AAChB,WAAK,KAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,SAAS,IAAY,aAAuC;AAClE,WAAO,KAAK,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,gBAAgB,WAAW,IAAI,gBAAgB,CAAC,CAAE;AAAA,EAC/F;AAAA,EAEQ,QAAQ,OAAiC;AAC/C,aAAS,IAAI,KAAK,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AAC9C,YAAM,KAAK,KAAK,KAAK,CAAC;AACtB,YAAM,MAAM,KAAK,WAAW,EAAE;AAC9B,UAAI,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,OAAO,MAAM,MAAM,KAAK,IAAI,OAAO,IAAI;AACvH,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,GAA2B;AACnC,UAAM,OAAO,EAAE,WAAW,EAAE;AAC5B,QAAI,QAAQ,EAAE,IAAI,YAAA,MAAkB,KAAK;AACvC,UAAI,EAAE,SAAU,MAAK,KAAA;AAAA,gBACX,KAAA;AACV,aAAO;AAAA,IACT;AACA,SAAK,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,KAAK,UAAU;AAClE,WAAK,eAAA;AACL,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAQ,IAAY,MAAoB;AACtC,UAAM,KAAK,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC5C,QAAI,CAAC,GAAI;AACT,OAAG,OAAO;AACV,SAAK,OAAA;AAAA,EACP;AAAA,EAEA,iBAAuB;AACrB,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,SAAA;AACL,SAAK,OAAO,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,QAAQ;AAC1D,SAAK,WAAW;AAChB,SAAK,OAAA;AACL,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,OAAa;AACX,UAAM,OAAO,KAAK,UAAU,IAAA;AAC5B,QAAI,CAAC,KAAM;AACX,SAAK,UAAU,KAAK,gBAAgB,KAAK,IAAI,CAAC;AAC9C,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,OAAA;AACL,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,OAAa;AACX,UAAM,OAAO,KAAK,UAAU,IAAA;AAC5B,QAAI,CAAC,KAAM;AACX,SAAK,UAAU,KAAK,gBAAgB,KAAK,IAAI,CAAC;AAC9C,SAAK,OAAO;AACZ,SAAK,OAAA;AACL,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,QAAc;AACZ,QAAI,CAAC,KAAK,KAAK,OAAQ;AACvB,SAAK,SAAA;AACL,SAAK,OAAO,CAAA;AACZ,SAAK,WAAW;AAChB,SAAK,OAAA;AACL,SAAK,KAAA;AAAA,EACP;AAAA;AAAA;AAAA,EAIA,eAAuB;AACrB,QAAI,CAAC,KAAK,KAAK,OAAQ,QAAO;AAC9B,UAAM,QAAkB,CAAC,mBAAmB;AAC5C,UAAM,QAAQ,KAAK,SAAA;AACnB,eAAW,MAAM,KAAK,MAAM;AAC1B,YAAM,KAAK,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC;AAAA,IAC7C;AACA,UAAM,KAAK,GAAG;AACd,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,UAAU,IAAgB,OAAsB;AACtD,UAAM,QAAQ,GAAG;AACjB,UAAM,MAAM,GAAG,OAAO;AACtB,YAAQ,GAAG,MAAA;AAAA,MACT,KAAK;AACH,eAAO,aAAa,GAAG,aAAa,KAAK;AAAA,MAC3C,KAAK;AACH,eAAO,aAAa,GAAG,aAAa,KAAK;AAAA,MAC3C,KAAK;AACH,eAAO,QAAQ,GAAG,IAAI,GAAG,OAAO,KAAK,GAAG,IAAI,MAAM,EAAE,aAAa,KAAK;AAAA,MACxE,KAAK;AACH,eAAO,eAAe,GAAG,GAAG,GAAG,OAAO,KAAK,GAAG,IAAI,MAAM,EAAE,aAAa,KAAK;AAAA,MAC9E,KAAK,aAAa;AAChB,cAAM,UAAU,GAAG,QAAQ;AAC3B,YAAI,OAAO,SAAS;AAClB,iBAAO,YAAY,GAAG,YAAY,KAAK,gBAAgB,SAAS,KAAK,KAAK,CAAC,YAAY,KAAK;AAAA,QAC9F;AACA,YAAI,IAAK,QAAO,YAAY,GAAG,aAAa,KAAK;AACjD,eAAO;AAAA,MACT;AAAA,MACA,KAAK;AAAA,MACL,KAAK,QAAQ;AACX,cAAM,IAAI,GAAG,OAAO;AACpB,eAAO,YAAY,GAAG,QAAQ,EAAE,SAAS,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,MAC1F;AAAA,MACA;AACE,eAAO,MAAM,GAAG,IAAI,IAAI,OAAO,EAAE;AAAA,IAAA;AAAA,EAEvC;AAAA,EAEQ,gBAAgB,SAAiB,OAAe,OAAsB;AAC5E,UAAM,IAAI,YAAY,OAAO,OAAO;AACpC,UAAM,IAAI,YAAY,OAAO,KAAK;AAClC,QAAI,CAAC,KAAK,CAAC,EAAG,QAAO;AACrB,UAAM,KAAK,WAAW,CAAC;AACvB,UAAM,KAAK,WAAW,CAAC;AACvB,UAAM,KAAK,GAAG,IAAI,GAAG;AACrB,UAAM,KAAK,GAAG,IAAI,GAAG;AACrB,UAAM,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI;AACxC,UAAM,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI;AACxC,UAAM,KAAK,KAAK,IAAI,MAAM;AAC1B,UAAM,KAAK,KAAK,IAAI,MAAM;AAC1B,QAAI,KAAK,EAAG,QAAO,KAAK;AACxB,QAAI,EAAG,QAAO;AACd,WAAO;AAAA,EACT;AACF;AClYO,MAAM,cAAc;AAAA,EAChB,QAAsB,CAAA;AAAA,EAE/B,IAAI,GAAqB;AACvB,SAAK,MAAM,KAAK,CAAC;AAAA,EACnB;AAAA,EAEA,MAAM,MAAc,SAAiB,IAA+D,OAAmC;AACrI,SAAK,MAAM,KAAK,EAAE,UAAU,SAAS,MAAM,SAAS,GAAG,IAAI,GAAG,MAAA,CAAO;AAAA,EACvE;AAAA,EAEA,KAAK,MAAc,SAAiB,IAA+D,OAAmC;AACpI,SAAK,MAAM,KAAK,EAAE,UAAU,WAAW,MAAM,SAAS,GAAG,IAAI,GAAG,MAAA,CAAO;AAAA,EACzE;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,aAAa,OAAO;AAAA,EACtD;AAAA,EAEA,IAAI,SAAuB;AACzB,WAAO,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,aAAa,OAAO;AAAA,EACxD;AACF;AAqCO,SAAS,iBAAiB,GAAe,QAAgB,OAAO,aAAqB;AAC1F,QAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,QAAM,UAAU,MAAM,EAAE,OAAO,CAAC,KAAK;AACrC,QAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,GAAG,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI,OAAO,KAAK,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC;AAC1F,MAAI,MAAM,GAAG,EAAE,QAAQ,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG,KAAK,EAAE,OAAO;AAAA,IAAO,OAAO;AAAA,IAAO,KAAK;AACtG,MAAI,EAAE,YAAY,EAAE,MAAO,QAAO;AAAA,cAAiB,EAAE,YAAY,GAAG,aAAa,EAAE,SAAS,GAAG;AAC/F,MAAI,EAAE,KAAM,QAAO;AAAA,UAAa,EAAE,IAAI;AACtC,SAAO;AACT;AC3EO,IAAK,sBAAAG,OAAL;AACLA,KAAA,SAAA,IAAU;AACVA,KAAA,MAAA,IAAO;AACPA,KAAA,OAAA,IAAQ;AACRA,KAAA,QAAA,IAAS;AACTA,KAAA,KAAA,IAAM;AACNA,KAAA,QAAA,IAAS;AACTA,KAAA,OAAA,IAAQ;AACRA,KAAA,MAAA,IAAO;AACPA,KAAA,UAAA,IAAW;AACXA,KAAA,aAAA,IAAc;AACdA,KAAA,QAAA,IAAS;AACTA,KAAA,IAAA,IAAK;AACLA,KAAA,KAAA,IAAM;AACNA,KAAA,MAAA,IAAO;AACPA,KAAA,OAAA,IAAQ;AACRA,KAAA,OAAA,IAAQ;AACRA,KAAA,KAAA,IAAM;AACNA,KAAA,OAAA,IAAQ;AACRA,KAAA,IAAA,IAAK;AACLA,KAAA,QAAA,IAAS;AACTA,KAAA,QAAA,IAAS;AACTA,KAAA,UAAA,IAAW;AACXA,KAAA,UAAA,IAAW;AACXA,KAAA,QAAA,IAAS;AACTA,KAAA,QAAA,IAAS;AACTA,KAAA,QAAA,IAAS;AACTA,KAAA,KAAA,IAAM;AA3BI,SAAAA;AAAA,GAAA,KAAA,CAAA,CAAA;AAiDL,MAAM,cAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,MAAM,qCAAqB,IAAI;AAAA,EACpC;AAAA,EAAQ;AAAA,EAAa;AAAA,EAAc;AAAA,EAAmB;AAAA,EAAa;AAAA,EACnE;AAAA,EAAU;AAAA,EAAW;AAAA,EAAY;AAAA,EAAY;AAAA,EAAM;AAAA,EAAY;AAAA,EAC/D;AAAA,EAAiB;AAAA,EAAa;AAAA,EAAS;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAY;AAAA,EACpE;AAAA,EAAQ;AAAA,EAAc;AAAA,EAAY;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AACtE,CAAC;ACzFD,MAAM,cAAc;AACpB,MAAM,aAAa;AACnB,MAAM,QAAQ;AACd,MAAM,MAAM;AACZ,MAAM,iCAAiB,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,CAAC;AACpD,MAAM,QAAQ,CAAC,QAAQ,OAAO,OAAO,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,KAAK,GAAG;AAChF,MAAM,QAAiC,EAAE,MAAM,MAAM,OAAO,OAAO,KAAK,MAAM,IAAI,MAAA;AAE3E,SAAS,IAAI,QAAyB;AAC3C,QAAM,SAAkB,CAAA;AACxB,QAAM,MAAM,OAAO;AACnB,MAAI,MAAM;AACV,MAAI,OAAO;AACX,MAAI,YAAY;AAEhB,QAAM,MAAM,MAAM,MAAM,YAAY;AACpC,QAAM,OAAO,CAAC,MAAS,OAAe,QAAwB,CAAA,MAAO;AACnE,WAAO,KAAK,EAAE,MAAM,MAAM,OAAO,MAAM,OAAO,GAAG,GAAG,OAAO,KAAK,KAAK,MAAM,KAAK,QAAQ,YAAY,GAAG,GAAG,OAAO;AAAA,EACnH;AACA,QAAM,UAAU,MAAM;AACpB,UAAM,QAAQ;AACd;AACA,WAAO,KAAK,EAAE,MAAM,EAAE,SAAS,MAAM,MAAM,OAAO,KAAK,KAAK,MAAM,KAAK,IAAA,GAAO;AAC9E;AACA,gBAAY;AAAA,EACd;AAEA,SAAO,MAAM,KAAK;AAChB,UAAM,IAAI,OAAO,GAAG;AAGpB,QAAI,MAAM,OAAO,MAAM,OAAQ,MAAM,MAAM;AACzC;AACA;AAAA,IACF;AACA,QAAI,MAAM,MAAM;AACd,cAAA;AACA;AAAA,IACF;AAGA,QAAI,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK;AACxC,aAAO,MAAM,OAAO,OAAO,GAAG,MAAM,KAAM;AAC1C;AAAA,IACF;AACA,QAAI,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK;AACxC,aAAO,MAAM,OAAO,OAAO,GAAG,MAAM,KAAM;AAC1C;AAAA,IACF;AACA,QAAI,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK;AACxC,UAAI,QAAQ;AACZ,aAAO;AACP,aAAO,MAAM,OAAO,QAAQ,GAAG;AAC7B,YAAI,OAAO,GAAG,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK;AAClD;AACA,iBAAO;AAAA,QACT,WAAW,OAAO,GAAG,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK;AACzD;AACA,iBAAO;AAAA,QACT,OAAO;AACL,cAAI,OAAO,GAAG,MAAM,MAAM;AACxB;AACA,wBAAY,MAAM;AAAA,UACpB;AACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,MAAM,KAAK;AACb,YAAM,QAAQ;AACd;AACA,WAAK,EAAE,MAAM,KAAK;AAClB;AAAA,IACF;AAGA,QAAI,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK;AACnE,YAAM,QAAQ;AACd,YAAM,YAAY;AAClB,YAAM,iBAAiB;AACvB,aAAO;AACP,UAAI,OAAO;AACX,aAAO,MAAM,OAAO,EAAE,OAAO,GAAG,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,MAAM;AAChG,YAAI,OAAO,GAAG,MAAM,MAAM;AACxB;AACA,sBAAY,MAAM;AAAA,QACpB;AACA,gBAAQ,OAAO,GAAG;AAClB;AAAA,MACF;AACA,aAAO;AACP,aAAO,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,KAAK,QAAQ,OAAO,EAAE,GAAG,OAAO,KAAK,KAAK,MAAM,WAAW,KAAK,QAAQ,iBAAiB,GAAG;AAC7H;AAAA,IACF;AAGA,QAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,YAAM,QAAQ;AACd,YAAM,QAAQ;AACd;AACA,UAAI,QAAQ;AACZ,aAAO,MAAM,OAAO,OAAO,GAAG,MAAM,OAAO;AACzC,YAAI,OAAO,GAAG,MAAM,MAAM;AACxB,gBAAM,IAAI,OAAO,MAAM,CAAC;AACxB,mBAAS,MAAM,MAAM,OAAO,MAAM,MAAM,MAAO,MAAM,MAAM,OAAO,KAAK;AACvE,iBAAO;AAAA,QACT,OAAO;AACL,cAAI,OAAO,GAAG,MAAM,MAAM;AACxB;AACA,wBAAY,MAAM;AAAA,UACpB;AACA,mBAAS,OAAO,GAAG;AACnB;AAAA,QACF;AAAA,MACF;AACA;AACA,aAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM,KAAK,QAAQ,YAAY,GAAG;AAC9F;AAAA,IACF;AAGA,QAAI,MAAM,OAAO,IAAI,KAAK,OAAO,MAAM,CAAC,KAAK,EAAE,GAAG;AAChD,YAAM,QAAQ;AACd;AACA,aAAO,MAAM,OAAO,IAAI,KAAK,OAAO,GAAG,CAAC,EAAG;AAC3C,WAAK,EAAE,OAAO,KAAK;AACnB;AAAA,IACF;AAGA,QAAI,MAAM,OAAO,YAAY,KAAK,OAAO,MAAM,CAAC,KAAK,EAAE,GAAG;AACxD,YAAM,QAAQ;AACd;AACA,YAAM,YAAY;AAClB,aAAO,MAAM,OAAO,WAAW,KAAK,OAAO,GAAG,CAAC,EAAG;AAClD,aAAO,KAAK,EAAE,MAAM,EAAE,UAAU,MAAM,OAAO,MAAM,OAAO,GAAG,GAAG,MAAM,OAAO,MAAM,WAAW,GAAG,GAAG,OAAO,KAAK,KAAK,MAAM,KAAK,QAAQ,YAAY,EAAA,CAAG;AACvJ;AAAA,IACF;AAGA,QAAI,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,KAAK;AACnE,YAAM,QAAQ;AACd,aAAO;AACP,WAAK,EAAE,aAAa,KAAK;AACzB;AAAA,IACF;AAGA,QAAI,WAAW,IAAI,CAAC,GAAG;AACrB,YAAM,QAAQ,UAAU,QAAQ,GAAG;AACnC,UAAI,OAAO;AACT,cAAM,QAAQ;AACd,eAAO,MAAM;AACb,aAAK,EAAE,QAAQ,KAAK;AACpB;AAAA,MACF;AAEA,UAAI,MAAM,KAAK;AACb,cAAM,QAAQ;AACd;AACA,aAAK,EAAE,KAAK,KAAK;AACjB;AAAA,MACF;AACA,UAAI,MAAM,KAAK;AACb,cAAM,QAAQ;AACd;AACA,aAAK,EAAE,IAAI,KAAK;AAChB;AAAA,MACF;AAEA,UAAI,MAAM,KAAK;AACb,cAAM,QAAQ;AACd;AACA,aAAK,EAAE,QAAQ,KAAK;AACpB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,KAAK,CAAC,KAAM,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,CAAC,KAAK,EAAE,GAAI;AACrE,YAAM,QAAQ;AACd,UAAI,MAAM,IAAK;AACf,aAAO,MAAM,OAAO,MAAM,KAAK,OAAO,GAAG,CAAC,EAAG;AAC7C,UAAI,OAAO,GAAG,MAAM,OAAO,MAAM,KAAK,OAAO,MAAM,CAAC,KAAK,EAAE,GAAG;AAC5D;AACA,eAAO,MAAM,OAAO,MAAM,KAAK,OAAO,GAAG,CAAC,EAAG;AAAA,MAC/C;AACA,YAAM,UAAU,OAAO,MAAM,OAAO,GAAG;AACvC,YAAM,OAAO,UAAU,QAAQ,GAAG;AAClC,UAAI,aAAa,KAAK;AACtB,aAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,MAAM,OAAO,MAAM,OAAO,GAAG,GAAG,KAAK,WAAW,OAAO,GAAG,MAAM,QAAQ,MAAM,OAAO,KAAK,KAAK,MAAM,KAAK,QAAQ,YAAY,EAAA,CAAG;AAC/J;AAAA,IACF;AAGA,QAAI,YAAY,KAAK,CAAC,GAAG;AACvB,YAAM,QAAQ;AACd;AACA,aAAO,MAAM,KAAK;AAChB,cAAM,KAAK,OAAO,GAAG;AACrB,YAAI,WAAW,KAAK,EAAE,GAAG;AACvB;AAAA,QACF,WAAW,OAAO,OAAO,WAAW,KAAK,OAAO,MAAM,CAAC,KAAK,EAAE,GAAG;AAC/D;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,YAAM,OAAO,OAAO,MAAM,OAAO,GAAG;AACpC,YAAM,MAAM,KAAK,YAAA;AACjB,UAAI,OAAO,OAAO;AAChB,eAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,MAAM,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,MAAM,KAAK,QAAQ,YAAY,GAAG;AAAA,MACzG,OAAO;AACL,aAAK,EAAE,OAAO,KAAK;AAAA,MACrB;AACA;AAAA,IACF;AAGA,UAAM,SAA4B;AAAA,MAChC,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,IAAA;AAET,QAAI,KAAK,QAAQ;AACf,YAAM,QAAQ;AACd;AACA,WAAK,OAAO,CAAC,GAAG,KAAK;AACrB;AAAA,IACF;AAGA;AACE,YAAM,QAAQ;AACd;AACA,WAAK,EAAE,QAAQ,KAAK;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,KAAK,EAAE,MAAM,EAAE,KAAK,MAAM,IAAI,OAAO,KAAK,KAAK,KAAK,MAAM,KAAK,IAAA,GAAO;AAC7E,SAAO;AACT;AAEA,SAAS,UAAU,QAAgB,KAA4B;AAC7D,aAAW,KAAK,aAAa;AAC3B,QAAI,OAAO,WAAW,GAAG,GAAG,EAAG,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,UAAU,QAAgB,KAA4B;AAC7D,aAAW,KAAK,OAAO;AACrB,QAAI,OAAO,WAAW,GAAG,GAAG,GAAG;AAC7B,YAAM,QAAQ,OAAO,MAAM,EAAE,MAAM,KAAK;AAExC,UAAI,MAAM,OAAO,CAAC,WAAW,KAAK,KAAK,EAAG,QAAO;AAAA,IACnD;AAAA,EACF;AACA,SAAO;AACT;ACnOA,MAAM,QAA+D;AAAA,EACnE,EAAE,MAAM,MAAM,OAAO,MAAM,OAAO,SAAA;AAAA,EAClC,EAAE,MAAM,MAAM,OAAO,MAAM,OAAO,OAAA;AAAA,EAClC,EAAE,MAAM,MAAM,OAAO,MAAM,OAAO,YAAA;AAAA,EAClC,EAAE,MAAM,MAAM,OAAO,MAAM,OAAO,WAAA;AAAA,EAClC,EAAE,MAAM,MAAM,OAAO,MAAM,OAAO,gBAAA;AAAA,EAClC,EAAE,MAAM,MAAM,OAAO,OAAO,OAAO,YAAA;AAAA,EACnC,EAAE,MAAM,OAAO,OAAO,MAAM,OAAO,YAAA;AAAA,EACnC,EAAE,MAAM,OAAO,OAAO,OAAO,OAAO,gBAAA;AAAA,EACpC,EAAE,MAAM,MAAM,OAAO,MAAM,OAAO,UAAA;AAAA,EAClC,EAAE,MAAM,KAAK,OAAO,KAAK,OAAO,YAAA;AAAA,EAChC,EAAE,MAAM,KAAK,OAAO,KAAK,OAAO,kBAAA;AAAA,EAChC,EAAE,MAAM,KAAK,OAAO,KAAK,OAAO,UAAA;AAClC;AAOO,SAAS,MAAM,QAA6B;AACjD,QAAM,IAAI,IAAI,OAAO,MAAM;AAC3B,QAAM,UAAU,EAAE,aAAA;AAClB,SAAO,EAAE,SAAS,aAAa,EAAE,MAAA;AACnC;AAEA,MAAM,OAAO;AAAA,EACX;AAAA,EACA,IAAI;AAAA,EACJ;AAAA,EACA,QAAQ,IAAI,cAAA;AAAA,EAEZ,YAAY,QAAgB;AAC1B,SAAK,SAAS;AACd,SAAK,OAAO,IAAI,MAAM;AAAA,EACxB;AAAA;AAAA,EAGQ,MAAa;AACnB,WAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EACzB;AAAA,EACQ,KAAK,IAAI,GAAU;AACzB,WAAO,KAAK,KAAK,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC;AAAA,EAC7D;AAAA,EACQ,GAAG,MAAkB;AAC3B,WAAO,KAAK,MAAM,SAAS;AAAA,EAC7B;AAAA,EACQ,KAAK,MAAuB;AAClC,UAAM,IAAI,KAAK,IAAA;AACf,WAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;AAAA,EAC1C;AAAA,EACQ,UAAiB;AACvB,UAAM,IAAI,KAAK,KAAK,KAAK,CAAC;AAC1B,QAAI,KAAK,IAAI,KAAK,KAAK,SAAS,EAAG,MAAK;AACxC,WAAO;AAAA,EACT;AAAA,EACQ,IAAI,MAAuB;AACjC,QAAI,KAAK,GAAG,IAAI,EAAG,QAAO,KAAK,QAAA;AAC/B,WAAO;AAAA,EACT;AAAA,EACQ,QAAiB;AACvB,WAAO,KAAK,GAAG,EAAE,GAAG;AAAA,EACtB;AAAA,EACQ,SAAS,GAAgB;AAC/B,UAAM,MAAM,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;AAC7C,WAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,EAAE,MAAM,KAAK,EAAE,IAAA;AAAA,EAC9D;AAAA,EACQ,QAAQ,GAAgB;AAC9B,WAAO,EAAE,OAAO,EAAE,OAAO,KAAK,EAAE,KAAK,MAAM,EAAE,MAAM,KAAK,EAAE,IAAA;AAAA,EAC5D;AAAA;AAAA,EAGQ,WAAiB;AACvB,WAAO,KAAK,GAAG,EAAE,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,KAAK,KAAK,GAAG,EAAE,KAAK,QAAQ,QAAA;AAAA,EACzE;AAAA,EACQ,QAAiB;AACvB,WAAO,KAAK,GAAG,EAAE,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,KAAK,KAAK,GAAG,EAAE,GAAG,KAAK,KAAK,GAAG,EAAE,MAAM;AAAA,EACpF;AAAA;AAAA,EAGQ,WAAW,KAAmB;AACpC,WAAO,KAAK,IAAI,KAAK,KAAK,SAAS,KAAK,KAAK,IAAA,EAAM,QAAQ,IAAK,MAAK;AAAA,EACvE;AAAA,EAEQ,MAAM,MAAc,SAAiB,IAAW,OAAoD;AAC1G,SAAK,MAAM,MAAM,MAAM,SAAS,KAAK,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO;AAAA,EAC3F;AAAA;AAAA,EAGQ,cAAoB;AAC1B,QAAI,QAAQ;AACZ,WAAO,CAAC,KAAK,SAAS;AACpB,YAAM,IAAI,KAAK,IAAA,EAAM;AACrB,UAAI,UAAU,MAAM,MAAM,EAAE,WAAW,MAAM,EAAE,OAAO;AACpD;AAAA,MACF;AACA,UAAI,MAAM,EAAE,UAAU,MAAM,EAAE,YAAY,MAAM,EAAE,OAAQ;AAC1D,UAAI,MAAM,EAAE,UAAU,MAAM,EAAE,YAAY,MAAM,EAAE,QAAQ;AACxD,YAAI,UAAU,EAAG;AACjB;AAAA,MACF;AACA,WAAK,QAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGQ,YAAkB;AACxB,QAAI,CAAC,KAAK,IAAI,EAAE,MAAM,EAAG;AACzB,QAAI,QAAQ;AACZ,WAAO,CAAC,KAAK,WAAW,QAAQ,GAAG;AACjC,YAAM,IAAI,KAAK,QAAA,EAAU;AACzB,UAAI,MAAM,EAAE,OAAQ;AAAA,eACX,MAAM,EAAE,OAAQ;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA,EAGA,eAAwB;AACtB,UAAM,aAAwB,CAAA;AAC9B,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,SAAS;AACpB,YAAM,SAAS,KAAK;AACpB,YAAM,OAAO,KAAK,SAAA;AAClB,UAAI,KAAM,YAAW,KAAK,IAAI;AAC9B,UAAI,KAAK,MAAM,OAAQ,MAAK,QAAA;AAC5B,WAAK,SAAA;AAAA,IACP;AACA,WAAO,EAAE,MAAM,WAAW,WAAA;AAAA,EAC5B;AAAA,EAEQ,WAA2B;AACjC,UAAM,IAAI,KAAK,IAAA;AACf,QAAI,EAAE,SAAS,EAAE,OAAO;AACtB,cAAQ,EAAE,MAAA;AAAA,QACR,KAAK;AACH,iBAAO,KAAK,aAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,UAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,YAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,WAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,WAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,cAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,WAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,cAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,cAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,aAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,eAAA;AAAA,QACd,KAAK;AAAA,QACL,KAAK;AAEH,eAAK,QAAA;AACL,cAAI,KAAK,GAAG,EAAE,MAAM,QAAQ,QAAA;AAC5B,cAAI,KAAK,GAAG,EAAE,MAAM,QAAQ,UAAA;AAAA,oBAClB,YAAA;AACV,iBAAO;AAAA,MAAA;AAAA,IAEb;AAEA,SAAK,MAAM,SAAS,eAAe,EAAE,QAAQ,EAAE,IAAI,kBAAkB,GAAG;AAAA,MACtE,UAAU;AAAA,MACV,MAAM;AAAA,IAAA,CACP;AACD,SAAK,YAAA;AACL,WAAO;AAAA,EACT;AAAA,EAEQ,eAAwB;AAC9B,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,MAAM,KAAK,IAAI,EAAE,MAAM;AAC7B,WAAO,EAAE,MAAM,WAAW,OAAO,KAAK,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACvE;AAAA,EAEQ,cAAuB;AAC7B,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,OAAO,KAAK,IAAI,EAAE,MAAM,GAAG,QAAQ;AACzC,QAAI;AACJ,QAAI,KAAK,KAAK,IAAI,GAAG;AACnB,WAAK,QAAA;AACL,WAAK,KAAK,IAAI,EAAE,KAAK,GAAG;AAAA,IAC1B;AACA,WAAO,EAAE,MAAM,UAAU,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAC1D;AAAA,EAEQ,YAAsB;AAC5B,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,QAAQ,KAAK,eAAA;AACnB,WAAO,EAAE,MAAM,QAAQ,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACrD;AAAA,EAEQ,eAA4B;AAClC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,MAAM,KAAK,IAAI,EAAE,GAAG;AAC1B,WAAO,EAAE,MAAM,WAAW,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACxE;AAAA;AAAA,EAGQ,iBAAgC;AACtC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,UAAoC,CAAA;AAC1C,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG;AAC9B,UAAI,IAAI;AACN,YAAI,KAAK,GAAG,EAAE,KAAK,QAAQ,QAAA;AAAA,iBAClB,KAAK,KAAK,IAAI,QAAQ,QAAA;AAC/B,cAAM,MAAM,KAAK,WAAA;AACjB,YAAI,IAAI;AACR,YAAI,IAAI;AACR,YAAI;AACJ,YAAI;AACJ,YAAI,IAAI,MAAM,WAAW,IAAI,EAAE,CAAC,GAAG,MAAM,SAAS,IAAI,EAAE,CAAC,GAAG,MAAM,OAAO;AACvE,cAAI,IAAI,EAAE,CAAC,EAAE;AACb,cAAI,IAAI,EAAE,CAAC,EAAE;AAAA,QACf;AACA,YAAI,KAAK,KAAK,MAAM,GAAG;AACrB,eAAK,QAAA;AACL,gBAAM,IAAI,KAAK,WAAA;AACf,cAAI,EAAE,MAAM,WAAW,EAAE,EAAE,CAAC,GAAG,MAAM,SAAS,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO;AACjE,gBAAI,EAAE,EAAE,CAAC,EAAE;AACX,gBAAI,EAAE,EAAE,CAAC,EAAE;AAAA,UACb;AAAA,QACF;AACA,gBAAQ,KAAK,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG;AAAA,MACjC,OAAO;AACL,aAAK,QAAA;AAAA,MACP;AACA,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,aAAa,SAAS,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAC5D;AAAA,EAEQ,aAAwB;AAC9B,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,QAAI;AACJ,QAAI,KAAK,KAAK,SAAS,GAAG;AACxB,WAAK,QAAA;AACL,YAAM,KAAK,IAAI,EAAE,KAAK,GAAG;AAAA,IAC3B;AACA,UAAM,SAA2C,CAAA;AACjD,UAAM,QAAmB,CAAA;AACzB,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,UAAI,KAAK,KAAK,QAAQ,GAAG;AACvB,aAAK,QAAA;AACL,aAAK,IAAI,EAAE,MAAM;AACjB,aAAK,SAAA;AACL,eAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,cAAI,KAAK,IAAA,EAAM,SAAS,EAAE,UAAU;AAClC,kBAAM,KAAK,KAAK,QAAA;AAChB,iBAAK,IAAI,EAAE,KAAK;AAChB,mBAAO,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,MAAM,CAAC,GAAG,OAAO,KAAK,WAAA,GAAc;AAAA,UAC7E,OAAO;AACL,iBAAK,QAAA;AAAA,UACP;AACA,iBAAO,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,QAAQ,QAAA;AAAA,QACzE;AACA,aAAK,IAAI,EAAE,MAAM;AAAA,MACnB,WAAW,KAAK,IAAA,EAAM,SAAS,EAAE,UAAU;AACzC,cAAM,KAAK,KAAK,QAAA;AAChB,aAAK,IAAI,EAAE,KAAK;AAChB,eAAO,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,MAAM,CAAC,GAAG,OAAO,KAAK,WAAA,GAAc;AAAA,MAC7E,OAAO;AACL,cAAM,IAAI,KAAK,eAAA;AACf,YAAI,EAAG,OAAM,KAAK,CAAC;AAAA,MACrB;AACA,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,SAAS,MAAM,SAAS,KAAK,QAAQ,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAClF;AAAA,EAEQ,aAAwB;AAC9B,UAAM,IAAI,KAAK,QAAA;AAEf,QAAI,OAAO;AACX,QAAI,KAAK,GAAG,EAAE,GAAG,GAAG;AAClB,WAAK,QAAA;AACL,aAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AAAA,IACpC,OAAO;AACL,aAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AAAA,IACpC;AACA,QAAI;AACJ,QAAI,KAAK,KAAK,SAAS,GAAG;AACxB,WAAK,QAAA;AACL,UAAI,KAAK,GAAG,EAAE,GAAG,QAAQ,QAAA;AACzB,YAAM,KAAK,IAAI,EAAE,KAAK,GAAG;AAAA,IAC3B;AACA,UAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,eAAA,IAAmB,CAAA;AAC1D,WAAO,EAAE,MAAM,SAAS,MAAM,SAAS,KAAK,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAC1E;AAAA,EAEQ,gBAA8B;AACpC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,QAAgD,CAAA;AACtD,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,SAAS,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AAC1C,YAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,eAAA,IAAmB,CAAA;AAC1D,YAAM,KAAK,EAAE,QAAQ,MAAA,CAAO;AAC5B,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,YAAY,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACzD;AAAA,EAEQ,gBAA8B;AACpC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,OAAO,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,UAAU,OAAO;AACvD,UAAM,WAA4B,CAAA;AAClC,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,MAAM,KAAK,mBAAA;AACjB,UAAI,IAAK,UAAS,KAAK,GAAG;AAC1B,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,YAAY,MAAM,UAAU,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAClE;AAAA;AAAA,EAGQ,aAAwB;AAC9B,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,OAAO,KAAK,GAAG,EAAE,KAAK,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,mBAAmB;AAC9E,UAAM,aAA0B,CAAA;AAChC,UAAM,YAAY,KAAK,IAAA,EAAM;AAC7B,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,SAAS,KAAK;AACpB,YAAM,OAAO,KAAK,eAAA;AAClB,UAAI,KAAM,YAAW,KAAK,IAAI;AAC9B,UAAI,KAAK,MAAM,OAAQ,MAAK,QAAA;AAC5B,WAAK,SAAA;AAAA,IACP;AACA,UAAM,WAAW,KAAK,IAAA;AACtB,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,SAAS,MAAM,YAAY,MAAM,KAAK,SAAS,CAAC,GAAG,WAAW,YAAY,SAAS,MAAA;AAAA,EACpG;AAAA,EAEQ,iBAAqC;AAE3C,QAAI,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,KAAA,EAAO,SAAS,EAAE,OAAQ,QAAO,KAAK,UAAU;AAC7E,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAmC;AACzC,UAAM,IAAI,KAAK,IAAA;AACf,QAAI,EAAE,SAAS,EAAE,OAAO;AACtB,cAAQ,EAAE,MAAA;AAAA,QACR,KAAK;AACH,iBAAO,KAAK,YAAA;AAAA,QACd,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,KAAK,WAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,gBAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,SAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,WAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,cAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,aAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,kBAAA;AAAA,MAAkB;AAGlC,UAAI,eAAe,IAAI,EAAE,IAAI,KAAK,KAAK,OAAO,SAAS,EAAE,OAAO;AAC9D,eAAO,KAAK,iBAAA;AAAA,MACd;AAAA,IACF;AAEA,WAAO,KAAK,gBAAA;AAAA,EACd;AAAA,EAEQ,cAA0B;AAChC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,UAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,eAAA,IAAmB,CAAA;AAC1D,WAAO,EAAE,MAAM,UAAU,MAAM,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAC7D;AAAA,EAEQ,WAAoB;AAC1B,UAAM,IAAI,KAAK,QAAA;AACf,QAAI,KAAK,KAAK,OAAO,GAAG;AACtB,WAAK,QAAA;AACL,YAAMC,QAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,aAAO,EAAE,MAAM,OAAO,MAAM,SAAS,MAAAA,OAAM,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,IAClE;AACA,QAAI,KAAK,GAAG,EAAE,GAAG,GAAG;AAClB,WAAK,QAAA;AACL,YAAMA,QAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,aAAO,EAAE,MAAM,OAAO,MAAM,SAAS,MAAAA,OAAM,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,IAClE;AACA,UAAM,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,QAAI;AACJ,QAAI,KAAK,GAAG,EAAE,MAAM,EAAG,QAAO,KAAK,aAAA;AACnC,WAAO,EAAE,MAAM,OAAO,MAAM,OAAO,UAAU,SAAS,MAAM,MAAM,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACzF;AAAA,EAEQ,kBAA8B;AACpC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,QAAI;AACJ,QAAI,KAAK,KAAK,IAAI,GAAG;AACnB,WAAK,QAAA;AACL,WAAK,KAAK,IAAI,EAAE,KAAK,GAAG;AAAA,IAC1B;AACA,QAAI,OAAsB,EAAE,MAAM,YAAY,GAAG,IAAA;AACjD,QAAI,KAAK,KAAK,IAAI,GAAG;AACnB,WAAK,QAAA;AACL,aAAO,KAAK,gBAAA;AAAA,IACd;AACA,WAAO,EAAE,MAAM,UAAU,MAAM,IAAI,MAAM,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAChE;AAAA,EAEQ,kBAAiC;AACvC,QAAI,KAAK,GAAG,EAAE,EAAE,GAAG;AACjB,WAAK,QAAA;AACL,WAAK,IAAI,EAAE,MAAM;AACjB,YAAM,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,OAAO;AACrC,WAAK,IAAI,EAAE,KAAK;AAChB,YAAM,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,OAAO;AACrC,WAAK,IAAI,EAAE,MAAM;AACjB,aAAO,EAAE,MAAM,MAAM,GAAG,EAAA;AAAA,IAC1B;AACA,UAAM,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,QAAI,KAAK,GAAG,EAAE,KAAK,GAAG;AACpB,WAAK,QAAA;AACL,YAAM,MAAM,KAAK,IAAI,EAAE,MAAM;AAC7B,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,OAAO,KAAK,SAAS,MAAM,MAAM,MAAM,MAAM,IAAI,MAAM,MAAM;AACnE,aAAO,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAA;AAAA,IACrC;AACA,WAAO,EAAE,MAAM,YAAY,GAAG,KAAA;AAAA,EAChC;AAAA;AAAA,EAGQ,mBAA6B;AACnC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,QAAQ,EAAE;AAChB,UAAM,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACtC,WAAO,KAAK,WAAW,GAAG,IAAI,OAAO,MAAS;AAAA,EAChD;AAAA;AAAA,EAGQ,oBAA8B;AACpC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACtC,QAAI;AACJ,QAAI,KAAK,GAAG,EAAE,MAAM,EAAG,SAAQ,KAAK,UAAU;AAC9C,QAAI;AACJ,QAAI,KAAK,KAAK,IAAI,GAAG;AACnB,WAAK,QAAA;AACL,cAAQ,KAAK,IAAI,EAAE,KAAK,GAAG;AAC3B,UAAI,UAAU,YAAY,KAAK,GAAG,EAAE,MAAM,GAAG;AAC3C,cAAM,OAAO,KAAK,aAAA;AAClB,cAAM,IAAI,KAAK,CAAC;AAChB,gBAAQ,KAAK,EAAE,MAAM,QAAQ,UAAU,EAAE,CAAC,KAAK;AAAA,MACjD;AAAA,IACF;AACA,WAAO,KAAK,WAAW,GAAG,IAAI,OAAO,KAAK;AAAA,EAC5C;AAAA,EAEQ,WAAW,GAAU,IAAY,OAA2B,OAAqC;AACvG,QAAI,UAAU,UAAa,KAAK,GAAG,EAAE,MAAM,EAAG,SAAQ,KAAK,QAAA,EAAU;AACrE,UAAM,UAAoB,CAAA;AAE1B,QAAI,UAAU,QAAW;AACvB,YAAM,MAAM,KAAK,gBAAA;AACjB,UAAI,KAAK;AACP,gBAAQ,IAAI;AACZ,YAAI,UAAU,UAAa,IAAI,eAAe,IAAI;AAAA,MACpD;AAAA,IACF;AACA,WAAO,KAAK,GAAG,EAAE,WAAW,GAAG;AAC7B,WAAK,QAAA;AACL,YAAM,MAAM,KAAK,IAAI,EAAE,KAAK,GAAG;AAC/B,UAAI,IAAK,SAAQ,KAAK,GAAG;AAAA,IAC3B;AACA,QAAI,UAAU,UAAa,KAAK,GAAG,EAAE,MAAM,EAAG,SAAQ,KAAK,QAAA,EAAU;AACrE,UAAM,UAAwB,CAAA;AAC9B,QAAI,QAAmB,CAAA;AACvB,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,GAAG,EAAE,MAAM,GAAG;AACrB,YAAM,QAAQ,KAAK,eAAA;AACnB,cAAQ,MAAM;AACd,cAAQ,KAAK,GAAG,MAAM,OAAO;AAC7B,iBAAW,MAAM;AACjB,kBAAY,MAAM;AAClB,UAAI,MAAM,iBAAiB,QAAW;AACpC,gBAAQ,SAAS,MAAM,gBAAgB;AACvC,YAAI,UAAU,OAAW,SAAQ,MAAM;AAGvC,YAAI,KAAK,GAAG,EAAE,MAAM,GAAG;AACrB,gBAAM,YAAY,KAAK,eAAA;AACvB,kBAAQ,UAAU;AAClB,kBAAQ,KAAK,GAAG,UAAU,OAAO;AACjC,qBAAW,UAAU;AACrB,sBAAY,UAAU;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,MAAM,QAAQ,IAAI,OAAO,OAAO,SAAS,OAAO,SAAS,MAAM,KAAK,SAAS,CAAC,GAAG,UAAU,UAAA;AAAA,EACtG;AAAA;AAAA,EAGQ,iBAAmJ;AACzJ,QAAI,KAAK,eAAe;AACtB,YAAM,UAAwB,CAAA;AAC9B,YAAM,QAAmB,CAAA;AACzB,YAAM,WAAW,KAAK,IAAA,EAAM;AAC5B,WAAK,IAAI,EAAE,MAAM;AACjB,WAAK,SAAA;AACL,aAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAI,KAAK,KAAK,QAAQ,GAAG;AACvB,gBAAM,IAAI,KAAK,gBAAA;AACf,kBAAQ,KAAK,CAAC;AAAA,QAChB,WAAW,KAAK,KAAK,KAAK,GAAG;AAC3B,gBAAM,IAAI,KAAK,SAAA;AAEf,gBAAM,KAAK,EAAE,KAAK,SAAS,OAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAA,GAAQ,MAAM,EAAE,MAAM;AAAA,QAC7E,OAAO;AACL,gBAAM,IAAI,KAAK,eAAA;AACf,cAAI,EAAG,OAAM,KAAK,CAAC;AAAA,QACrB;AACA,aAAK,SAAA;AAAA,MACP;AACA,YAAM,WAAW,KAAK,IAAA;AACtB,WAAK,IAAI,EAAE,MAAM;AACjB,aAAO,EAAE,OAAO,SAAS,UAAU,WAAW,SAAS,IAAA;AAAA,IACzD;AAEA,UAAM,OAAO,KAAK,IAAA;AAClB,UAAM,MAAM,KAAK,eAAe,KAAK,KAAK;AAC1C,QAAI,KAAK;AACP,WAAK,WAAW,IAAI,GAAG;AACvB,aAAO,EAAE,OAAO,IAAI,SAAS,CAAA,GAAI,cAAc,IAAI,OAAO,cAAc,IAAI,MAAA;AAAA,IAC9E;AAEA,SAAK,UAAA;AACL,WAAO,EAAE,OAAO,IAAI,SAAS,CAAA,EAAC;AAAA,EAChC;AAAA;AAAA,EAGQ,cAAuB;AAE7B,QAAI,IAAI,KAAK,IAAI;AACjB,WAAO,IAAI,KAAK,KAAK,WAAW,KAAK,KAAK,CAAC,EAAE,SAAS,EAAE,WAAW,KAAK,KAAK,CAAC,EAAE,SAAS,EAAE,MAAO;AAClG,UAAM,IAAI,KAAK,KAAK,CAAC;AACrB,QAAI,CAAC,EAAG,QAAO;AACf,QAAI,EAAE,SAAS,EAAE,OAAQ,QAAO;AAChC,QAAI,EAAE,SAAS,EAAE,OAAO;AAEtB,UAAI,EAAE,SAAS,SAAS,EAAE,SAAS,SAAU,QAAO;AACpD,YAAM,IAAI,KAAK,KAAK,IAAI,CAAC;AACzB,UAAI,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,IAAK,QAAO;AAAA,IAC3D;AACA,QAAI,EAAE,SAAS,EAAE,SAAU,QAAO;AAClC,WAAO;AAAA,EACT;AAAA;AAAA,EAGQ,kBAAoC;AAE1C,QAAI;AACJ,QAAI,KAAK,KAAK,MAAM,GAAG;AACrB,WAAK,QAAA;AACL,eAAS,KAAK,IAAI,EAAE,KAAK,GAAG;AAC5B,WAAK,IAAI,EAAE,KAAK;AAAA,IAClB;AAEA,UAAM,IAAI,KAAK,IAAA;AACf,QAAI,EAAE,SAAS,EAAE,OAAO;AACtB,WAAK,MAAM,UAAU,eAAe,EAAE,QAAQ,EAAE,IAAI,KAAK,GAAG,EAAE,MAAM,0DAAA,CAA2D;AAC/H,WAAK,YAAA;AACL,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,KAAK,mBAAA;AAGnB,QAAI,KAAK,GAAG,EAAE,MAAM,GAAG;AACrB,aAAO,KAAK,cAAc,GAAG,QAAQ,KAAK;AAAA,IAC5C;AAEA,QAAI,WAAW,QAAW;AAExB,WAAK,MAAM,eAAe,sDAAsD,KAAK,OAAO,EAAE,UAAU,yCAAyC;AAAA,IACnJ;AAIA,UAAM,KAAK,MAAM,CAAC;AAElB,UAAM,UAAoB,CAAA;AAC1B,WAAO,KAAK,GAAG,EAAE,WAAW,GAAG;AAC7B,WAAK,QAAA;AACL,YAAM,MAAM,KAAK,IAAI,EAAE,KAAK,GAAG;AAC/B,UAAI,IAAK,SAAQ,KAAK,GAAG;AAAA,IAC3B;AAEA,UAAM,UAAU,KAAK,GAAG,EAAE,MAAM,KAAK,KAAK,GAAG,EAAE,MAAM;AACrD,QAAI,CAAC,GAAG,UAAU,CAAC,WAAW,QAAQ,SAAS,GAAG;AAChD,aAAO,EAAE,MAAM,cAAc,IAAI,GAAG,IAAI,SAAS,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,IACxE;AACA,UAAM,KAAK,KAAK,WAAW,GAAG,GAAG,IAAI,GAAG,QAAQ,OAAO,GAAG,QAAQ,KAAK;AACvE,OAAG,QAAQ,QAAQ,GAAG,OAAO;AAC7B,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAiC;AACvC,UAAM,OAAO,CAAC,KAAK,eAAe;AAClC,WAAO,KAAK,GAAG,EAAE,GAAG,GAAG;AACrB,WAAK,QAAA;AACL,WAAK,KAAK,KAAK,eAAe;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAA0B;AAChC,UAAM,IAAI,KAAK,IAAA;AACf,UAAM,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACtC,QAAIC;AACJ,QAAI;AACJ,QAAI;AAEJ,UAAM,MAAM,KAAK,gBAAA;AACjB,QAAI,KAAK;AACP,eAAS,EAAE,MAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,OAAO,IAAI,OAAO,SAAS,CAAA,GAAI,OAAO,CAAA,GAAI,SAAS,IAAI,MAAM,KAAK,QAAQ,CAAC,EAAA;AAAA,IAC5H,WAAW,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,eAAe;AAInD,YAAM,MAAM,KAAK,eAAe,KAAK,IAAA,EAAM,KAAK;AAChD,UAAI,KAAK;AACP,aAAK,WAAW,IAAI,GAAG;AACvB,iBAAS,EAAE,MAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,OAAO,IAAI,OAAO,SAAS,CAAA,GAAI,OAAO,CAAA,GAAI,SAAS,IAAI,MAAM,KAAK,QAAQ,CAAC,EAAA;AAAA,MAC5H;AAAA,IACF;AACA,QAAI,KAAK,GAAG,EAAE,GAAG,GAAG;AAClB,WAAK,QAAA;AACL,MAAAA,OAAM,KAAK,IAAI,EAAE,KAAK,GAAG;AAEzB,UAAIA,QAAO,KAAK,GAAG,EAAE,KAAK,GAAG;AAC3B,aAAK,QAAA;AACL,cAAM,IAAI,KAAK,IAAI,EAAE,MAAM;AAC3B,YAAI,EAAG,CAAAA,OAAM,GAAGA,IAAG,IAAI,EAAE,GAAG;AAAA,MAC9B;AAAA,IACF;AACA,QAAI,KAAK,GAAG,EAAE,EAAE,GAAG;AACjB,WAAK,QAAA;AACL,WAAK,IAAI,EAAE,MAAM;AACjB,YAAM,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,OAAO;AACrC,WAAK,IAAI,EAAE,KAAK;AAChB,YAAM,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,OAAO;AACrC,WAAK,IAAI,EAAE,MAAM;AACjB,WAAK,CAAC,GAAG,CAAC;AAAA,IACZ;AACA,WAAO,EAAE,IAAI,KAAAA,MAAK,IAAI,QAAQ,MAAM,KAAK,QAAQ,CAAC,EAAA;AAAA,EACpD;AAAA,EAEQ,cAAc,GAAU,QAA4B,OAA6B;AACvF,UAAM,SAAuB,CAAC,KAAK;AACnC,UAAM,MAAoB,CAAA;AAC1B,WAAO,KAAK,GAAG,EAAE,MAAM,GAAG;AACxB,YAAM,QAAQ,KAAK,QAAA,EAAU;AAC7B,UAAI;AACJ,UAAI,KAAK,GAAG,EAAE,IAAI,GAAG;AACnB,mBAAW,KAAK,cAAA;AAAA,MAClB;AACA,YAAM,IAAI,KAAK,mBAAA;AACf,aAAO,KAAK,CAAC;AACb,UAAI,KAAK,EAAE,OAAO,SAAA,CAAU;AAAA,IAC9B;AACA,QAAI;AACJ,QAAI,KAAK,GAAG,EAAE,MAAM,EAAG,SAAQ,KAAK,UAAU;AAC9C,UAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,eAAA,IAAmB,CAAA;AAC1D,WAAO,EAAE,MAAM,QAAQ,IAAI,QAAQ,QAAQ,KAAK,OAAO,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACrF;AAAA,EAEQ,gBAAwB;AAE9B,UAAM,OAAO,KAAK,QAAA;AAClB,UAAM,QAAQ,KAAK;AACnB,QAAI,MAAM;AACV,WAAO,KAAK,IAAI,KAAK,KAAK,UAAU,CAAC,KAAK,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,SAAS;AACrE,YAAM,KAAK,MAAM;AACjB,WAAK,QAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,IAAI;AACf,WAAO,KAAK,OAAO,MAAM,OAAO,GAAG,EAAE,KAAA;AAAA,EACvC;AAAA;AAAA,EAGQ,aAAwB;AAC9B,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACtC,QAAI;AACJ,QAAI,KAAK,GAAG,EAAE,MAAM,EAAG,SAAQ,KAAK,UAAU;AAC9C,UAAM,QAAmB,CAAA;AACzB,QAAI;AACJ,UAAM,QAAqB,CAAA;AAC3B,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,SAAS,KAAK;AACpB,UAAI,KAAK,KAAK,QAAQ,GAAG;AACvB,iBAAS,KAAK,YAAA;AAAA,MAChB,WAAW,KAAK,IAAA,EAAM,SAAS,EAAE,SAAS,KAAK,KAAA,EAAO,SAAS,EAAE,SAAS,CAAC,eAAe,IAAI,KAAK,MAAM,IAAI,GAAG;AAE9G,cAAM,IAAI,KAAK,eAAA;AACf,YAAI,EAAG,OAAM,KAAK,CAAC;AAAA,MACrB,OAAO;AACL,cAAM,OAAO,KAAK,eAAA;AAClB,YAAI,KAAM,OAAM,KAAK,IAAI;AAAA,MAC3B;AACA,UAAI,KAAK,MAAM,OAAQ,MAAK,QAAA;AAC5B,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,SAAS,IAAI,OAAO,OAAO,QAAQ,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAChF;AAAA;AAAA,EAGQ,gBAA8B;AACpC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,OAAO,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,KAAA,EAAO,SAAS,EAAE,SAAS,KAAK,QAAA,EAAU,OAAO;AACvF,UAAM,QAAgB,CAAA;AACtB,UAAM,QAAoB,CAAA;AAC1B,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,SAAS,KAAK;AACpB,UAAI,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,GAAG;AAC1C,cAAM,KAAK,KAAK,WAAW;AAAA,MAC7B,WAAW,KAAK,IAAA,EAAM,SAAS,EAAE,SAAS,KAAK,KAAA,EAAO,SAAS,EAAE,OAAO;AACtE,cAAM,IAAI,KAAK,eAAA;AACf,YAAI,EAAG,OAAM,KAAK,EAAE,MAAM,QAAQ,KAAK,EAAE,KAAK,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM;AAAA,MAC9E,OAAO;AACL,aAAK,YAAA;AAAA,MACP;AACA,UAAI,KAAK,MAAM,OAAQ,MAAK,QAAA;AAC5B,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,YAAY,MAAM,OAAO,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACtE;AAAA,EAEQ,YAAsB;AAC5B,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ,QAAQ,EAAE,IAAI;AACpD,UAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,UAAU,OAAO;AACxD,UAAM,QAAoB,CAAA;AAC1B,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,SAAS,KAAK;AACpB,YAAM,OAAO,KAAK,cAAA;AAClB,UAAI,KAAM,OAAM,KAAK,IAAI;AACzB,UAAI,KAAK,MAAM,OAAQ,MAAK,QAAA;AAC5B,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,QAAQ,IAAI,OAAO,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAChE;AAAA,EAEQ,gBAAiC;AACvC,UAAM,IAAI,KAAK,IAAA;AACf,QAAI,EAAE,SAAS,EAAE,OAAO;AACtB,cAAQ,EAAE,MAAA;AAAA,QACR,KAAK;AACH,iBAAO,KAAK,YAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,YAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,cAAA;AAAA,QACd,KAAK;AACH,iBAAO,KAAK,aAAA;AAAA,MAAa;AAG7B,UAAI,KAAK,KAAA,EAAO,SAAS,EAAE,OAAO;AAChC,cAAM,IAAI,KAAK,eAAA;AACf,YAAI,EAAG,QAAO,EAAE,MAAM,QAAQ,KAAK,EAAE,KAAK,OAAO,EAAE,OAAO,MAAM,EAAE,KAAA;AAClE,eAAO;AAAA,MACT;AAEA,UAAI,YAAY,IAAI,EAAE,IAAI,EAAG,QAAO,KAAK,mBAAA;AACzC,UAAI,aAAa,IAAI,EAAE,IAAI,EAAG,QAAO,KAAK,eAAA;AAAA,IAC5C;AACA,SAAK,MAAM,UAAU,eAAe,EAAE,QAAQ,EAAE,IAAI,aAAa,GAAG;AAAA,MAClE,MAAM;AAAA,IAAA,CACP;AACD,SAAK,YAAA;AACL,WAAO;AAAA,EACT;AAAA,EAEQ,cAA0B;AAChC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,MAAkB,EAAE,MAAM,UAAU,OAAO,IAAI,MAAM,KAAK,SAAS,CAAC,EAAA;AAE1E,QAAI,KAAK,GAAG,EAAE,MAAM,GAAG;AACrB,UAAI,QAAQ,KAAK,eAAA;AACjB,WAAK,iBAAiB,GAAG;AACzB,UAAI,OAAO,KAAK,SAAS,CAAC;AAC1B,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,GAAG,EAAE,KAAK,GAAG;AACpB,UAAI,KAAK,KAAK,QAAA,EAAU;AAGxB,UAAI,IAAI,OAAO,UAAU,KAAK,GAAG,EAAE,MAAM,GAAG;AAC1C,YAAI,OAAO,KAAK,QAAA,EAAU;AAAA,MAC5B,WAAW,IAAI,OAAO,OAAO;AAC3B,YAAI,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,EAAG,MAAK,QAAA;AAC7C,YAAI,KAAK,GAAG,EAAE,MAAM,GAAG;AACrB,gBAAM,IAAI,KAAK,WAAA;AACf,cAAI,EAAE,MAAM,WAAW,EAAE,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,SAAS,EAAE,EAAE,CAAC,EAAE,MAAM,OAAO;AAClF,gBAAI,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,wBAAwB;AAC/B,UAAI,UAAU,CAAC,KAAK,WAAA,CAAY;AAAA,IAClC;AAEA,WAAO,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,MAAM,GAAG;AAC5C,UAAI,KAAK,GAAG,EAAE,MAAM,GAAG;AACrB,cAAM,QAAQ,KAAK,eAAA;AACnB,YAAI,MAAM,KAAK,GAAG,KAAK;AACvB,aAAK,iBAAiB,GAAG;AACzB;AAAA,MACF;AACA,YAAM,IAAI,KAAK,IAAA,EAAM;AACrB,UAAI,MAAM,QAAQ;AAChB,aAAK,QAAA;AACL,YAAI,OAAO,KAAK,IAAI,EAAE,MAAM,GAAG;AAAA,MACjC,WAAW,MAAM,UAAU,MAAM,YAAY;AAC3C,aAAK,QAAA;AACL,YAAI,OAAO,KAAK,aAAA;AAAA,MAClB,WAAW,MAAM,QAAQ;AACvB,aAAK,QAAA;AACL,YAAI,OAAO,KAAK,WAAA;AAAA,MAClB,WAAW,MAAM,OAAO;AACtB,aAAK,QAAA;AACL,YAAI,MAAM,KAAK,IAAI,EAAE,MAAM,GAAG;AAAA,MAChC,WAAW,MAAM,OAAO;AACtB,aAAK,QAAA;AACL,aAAK,IAAI,EAAE,KAAK;AAChB,cAAM,IAAI,KAAK,WAAA;AACf,YAAI,EAAE,MAAM,WAAW,EAAE,EAAE,UAAU,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,SAAS,EAAE,EAAE,CAAC,EAAE,MAAM,OAAO;AAClF,cAAI,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;AAAA,QAC/B;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,KAAK,SAAS,CAAC;AAC1B,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAgC;AACtC,QAAI,KAAK,GAAG,EAAE,QAAQ,EAAG,QAAO;AAChC,QAAI,KAAK,GAAG,EAAE,GAAG,EAAG,QAAO;AAC3B,QAAI,KAAK,GAAG,EAAE,KAAK,GAAG;AACpB,YAAM,IAAI,KAAK,IAAA,EAAM;AACrB,aAAO,CAAC,CAAC,QAAQ,QAAQ,QAAQ,OAAO,OAAO,YAAY,MAAM,EAAE,SAAS,CAAC;AAAA,IAC/E;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,KAAuB;AAC9C,eAAW,KAAK,IAAI,OAAO;AACzB,cAAQ,EAAE,KAAA;AAAA,QACR,KAAK;AACH,cAAI,KAAK;AACT,cAAI,UAAU,CAAC,EAAE,KAAK;AACtB;AAAA,QACF,KAAK;AACH,cAAI,KAAK;AACT,cAAI,UAAU,CAAC,EAAE,KAAK;AACtB;AAAA,QACF,KAAK;AACH,cAAI,KAAK;AACT,cAAI,UAAU,CAAC,EAAE,KAAK;AACtB;AAAA,QACF,KAAK;AACH,cAAI,EAAE,MAAM,MAAM,MAAO,KAAI,OAAO,EAAE,MAAM;AAC5C;AAAA,QACF,KAAK;AACH,cAAI,EAAE,MAAM,MAAM,MAAO,KAAI,MAAM,EAAE,MAAM;AAC3C;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,cAAI,EAAE,MAAM,MAAM,WAAW,OAAO,EAAE,MAAM,SAAS,MAAM,EAAE,MAAM,IAAI,MAAO,EAAE,MAAM;AACtF;AAAA,QACF,KAAK;AACH,cAAI,OAAO,EAAE;AACb;AAAA,QACF,KAAK;AACH,cAAI,EAAE,MAAM,MAAM,WAAW,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO;AACnF,gBAAI,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAAA,UAC3C;AACA;AAAA,MAAA;AAAA,IAEN;AAGA,QAAI,CAAC,IAAI,IAAI;AACX,UAAI,IAAI,IAAK,KAAI,KAAK;AAAA,eACb,IAAI,QAAQ,KAAM,KAAI,KAAK;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,cAA2B;AACjC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,WAAwB,CAAA;AAC9B,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,MAAM,KAAK,eAAA;AACjB,UAAI,IAAK,UAAS,KAAK,GAAG;AAC1B,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,UAAU,UAAU,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAC1D;AAAA,EAEQ,iBAAmC;AACzC,UAAM,IAAI,KAAK,IAAA;AACf,UAAM,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,UAAM,UAAmB,CAAA;AAEzB,WAAO,KAAK,cAAA,KAAmB,CAAC,KAAK,KAAK,MAAM,GAAG;AACjD,cAAQ,KAAK,KAAK,YAAY;AAC9B,UAAI,KAAK,GAAG,EAAE,KAAK,QAAQ,QAAA;AAAA,UACtB;AAAA,IACP;AACA,QAAI;AACJ,QAAI,KAAK,KAAK,MAAM,GAAG;AACrB,WAAK,QAAA;AACL,mBAAa,KAAK,IAAI,EAAE,KAAK,GAAG;AAAA,IAClC;AACA,UAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,eAAA,IAAmB,CAAA;AAC1D,WAAO,EAAE,MAAM,aAAa,MAAM,SAAS,MAAM,YAAY,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAC3F;AAAA,EAEQ,eAA4B;AAClC,UAAM,IAAI,KAAK,QAAA;AACf,UAAM,UAAU,KAAK,aAAA;AACrB,UAAM,WAA0C,CAAA;AAChD,SAAK,IAAI,EAAE,MAAM;AACjB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,IAAI,KAAK,IAAA,EAAM;AACrB,UAAI,KAAK,MAAM,SAAS,EAAE,SAAS,YAAY,IAAI,CAAC,GAAG;AACrD,cAAM,IAAI,KAAK,mBAAA;AACf,YAAI,EAAG,UAAS,KAAK,CAAC;AAAA,MACxB,OAAO;AACL,cAAM,IAAI,KAAK,eAAA;AACf,YAAI,EAAG,UAAS,KAAK,CAAC;AAAA,MACxB;AACA,WAAK,SAAA;AAAA,IACP;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,MAAM,WAAW,SAAS,UAAU,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACpE;AAAA,EAEQ,qBAA2C;AACjD,UAAM,IAAI,KAAK,IAAA;AACf,UAAM,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,GAAG,EAAE,QAAQ,GAAG;AACvB,mBAAa,KAAK,WAAA;AAAA,IACpB,WAAW,KAAK,GAAG,EAAE,KAAK,GAAG;AAC3B,eAAS,KAAK,cAAA;AAAA,IAChB;AACA,UAAM,OAAO,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,UAAU,OAAO;AACvD,UAAM,QAAQ,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,eAAA,IAAmB,CAAA;AAC1D,WAAO,EAAE,MAAM,YAAY,MAAM,QAAQ,YAAY,MAAM,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EACzF;AAAA;AAAA,EAGQ,iBAA4B;AAClC,UAAM,QAAmB,CAAA;AACzB,QAAI,CAAC,KAAK,IAAI,EAAE,MAAM,EAAG,QAAO;AAChC,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,YAAM,IAAI,KAAK,eAAA;AACf,UAAI,EAAG,OAAM,KAAK,CAAC;AAEnB,aAAO,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,OAAO,KAAK,KAAK,GAAG,EAAE,IAAI,QAAQ,QAAA;AAAA,IACzE;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO;AAAA,EACT;AAAA,EAEQ,iBAA8B;AACpC,UAAM,IAAI,KAAK,IAAA;AACf,QAAI,EAAE,SAAS,EAAE,OAAO;AACtB,WAAK,MAAM,UAAU,mCAAmC,EAAE,QAAQ,EAAE,IAAI,KAAK,CAAC;AAC9E,WAAK,YAAA;AACL,aAAO;AAAA,IACT;AACA,UAAM,MAAM,KAAK,QAAA,EAAU;AAC3B,QAAI,CAAC,KAAK,IAAI,EAAE,KAAK,EAAG,MAAK,IAAI,EAAE,EAAE;AACrC,UAAM,QAAQ,KAAK,WAAA;AACnB,WAAO,EAAE,KAAK,OAAO,MAAM,KAAK,SAAS,CAAC,EAAA;AAAA,EAC5C;AAAA,EAEQ,gBAAyB;AAC/B,YAAQ,KAAK,IAAA,EAAM,MAAA;AAAA,MACjB,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AACL,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IAAA;AAAA,EAEb;AAAA,EAEQ,aAAoB;AAC1B,UAAM,IAAI,KAAK,IAAA;AACf,YAAQ,EAAE,MAAA;AAAA,MACR,KAAK,EAAE;AACL,aAAK,QAAA;AACL,eAAO,EAAE,GAAG,OAAO,GAAG,EAAE,KAAA;AAAA,MAC1B,KAAK,EAAE;AACL,aAAK,QAAA;AACL,eAAO,EAAE,GAAG,OAAO,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,QAAQ,KAAA;AAAA,MACpD,KAAK,EAAE;AACL,aAAK,QAAA;AACL,eAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAA;AAAA,MAC5B,KAAK,EAAE;AACL,aAAK,QAAA;AACL,eAAO,EAAE,GAAG,QAAQ,GAAG,EAAE,QAAQ,MAAA;AAAA,MACnC,KAAK,EAAE;AACL,aAAK,QAAA;AACL,eAAO,EAAE,GAAG,SAAS,GAAG,EAAE,QAAQ,EAAE,KAAK,MAAM,CAAC,EAAA;AAAA,MAClD,KAAK,EAAE,KAAK;AACV,aAAK,QAAA;AACL,cAAM,OAAO,KAAK,IAAI,EAAE,KAAK,GAAG,QAAQ;AACxC,eAAO,EAAE,GAAG,SAAS,GAAG,KAAA;AAAA,MAC1B;AAAA,MACA,KAAK,EAAE;AACL,eAAO,KAAK,WAAA;AAAA,MACd,KAAK,EAAE;AACL,eAAO,KAAK,UAAA;AAAA,MACd,KAAK,EAAE;AACL,eAAO,KAAK,gBAAA;AAAA,MACd;AACE,aAAK,QAAA;AACL,eAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAA;AAAA,IAAK;AAAA,EAErC;AAAA,EAEQ,kBAAyB;AAC/B,UAAM,IAAI,KAAK,QAAA;AAEf,QAAI,KAAK,GAAG,EAAE,MAAM,GAAG;AACrB,YAAM,OAAO,KAAK,aAAA;AAClB,aAAO,EAAE,GAAG,QAAQ,MAAM,EAAE,MAAM,KAAA;AAAA,IACpC;AAEA,QAAI,KAAK,GAAG,EAAE,GAAG,KAAK,KAAK,GAAG,EAAE,EAAE,GAAG;AACnC,UAAIA;AACJ,UAAI;AACJ,UAAI,KAAK,GAAG,EAAE,GAAG,GAAG;AAClB,aAAK,QAAA;AACL,QAAAA,OAAM,KAAK,IAAI,EAAE,KAAK,GAAG;AAAA,MAC3B;AACA,UAAI,KAAK,GAAG,EAAE,EAAE,GAAG;AACjB,aAAK,QAAA;AACL,aAAK,IAAI,EAAE,MAAM;AACjB,cAAM,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,OAAO;AACrC,aAAK,IAAI,EAAE,KAAK;AAChB,cAAM,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,OAAO;AACrC,aAAK,IAAI,EAAE,MAAM;AACjB,aAAK,CAAC,GAAG,CAAC;AAAA,MACZ;AACA,aAAO,EAAE,GAAG,OAAO,IAAI,EAAE,MAAM,KAAAA,MAAK,GAAA;AAAA,IACtC;AAEA,QAAI,KAAK,GAAG,EAAE,MAAM,GAAG;AACrB,YAAM,QAAQ,KAAK,eAAA;AACnB,aAAO,EAAE,GAAG,UAAU,MAAM,EAAE,MAAM,MAAA;AAAA,IACtC;AACA,WAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAA;AAAA,EAC5B;AAAA,EAEQ,aAAoB;AAC1B,SAAK,IAAI,EAAE,MAAM;AACjB,UAAM,OAAgB,CAAA;AACtB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAC1C,WAAK,KAAK,KAAK,YAAY;AAC3B,aAAO,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,OAAO,EAAG,MAAK,QAAA;AAAA,IACtD;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO,EAAE,GAAG,SAAS,GAAG,KAAA;AAAA,EAC1B;AAAA,EAEQ,YAAmB;AACzB,SAAK,IAAI,EAAE,QAAQ;AACnB,UAAM,OAAgB,CAAA;AACtB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,QAAQ,KAAK,CAAC,KAAK,SAAS;AAC5C,WAAK,KAAK,KAAK,YAAY;AAC3B,aAAO,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,OAAO,EAAG,MAAK,QAAA;AAAA,IACtD;AACA,SAAK,IAAI,EAAE,QAAQ;AACnB,WAAO,EAAE,GAAG,QAAQ,GAAG,KAAA;AAAA,EACzB;AAAA,EAEQ,eAAwB;AAC9B,SAAK,IAAI,EAAE,MAAM;AACjB,UAAM,OAAgB,CAAA;AACtB,SAAK,SAAA;AACL,WAAO,CAAC,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC,KAAK,SAAS;AAE1C,UAAI,KAAK,MAAM,SAAS,EAAE,SAAS,KAAK,KAAA,EAAO,SAAS,EAAE,OAAO;AAC/D,aAAK,QAAA;AACL,aAAK,QAAA;AAAA,MACP;AACA,WAAK,KAAK,KAAK,YAAY;AAC3B,aAAO,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,GAAG,EAAE,OAAO,EAAG,MAAK,QAAA;AAAA,IACtD;AACA,SAAK,IAAI,EAAE,MAAM;AACjB,WAAO;AAAA,EACT;AAAA,EAEQ,eAAuB;AAC7B,UAAM,IAAI,KAAK,IAAI,EAAE,MAAM;AAC3B,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,MAAM,EAAE,OAAO;AACrB,WAAO,EAAE,SAAS,MAAM,MAAM,MAAO;AAAA,EACvC;AAAA;AAAA,EAGQ,kBAA2D;AAEjE,UAAM,IAAI,KAAK,IAAA;AACf,QAAI,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,OAAQ,QAAO;AACzD,UAAM,MAAM,KAAK,eAAe,EAAE,KAAK;AACvC,QAAI,CAAC,IAAK,QAAO;AACjB,SAAK,WAAW,IAAI,GAAG;AACvB,WAAO,EAAE,OAAO,IAAI,OAAO,OAAO,IAAI,MAAA;AAAA,EACxC;AAAA;AAAA,EAGQ,eAAe,OAAqE;AAC1F,UAAM,MAAM,KAAK;AACjB,eAAW,KAAK,OAAO;AACrB,UAAI,IAAI,WAAW,EAAE,MAAM,KAAK,GAAG;AACjC,cAAM,YAAY,QAAQ,EAAE,KAAK;AACjC,cAAM,WAAW,IAAI,QAAQ,EAAE,OAAO,SAAS;AAC/C,YAAI,aAAa,GAAI;AAErB,cAAM,QAAQ,IAAI,MAAM,WAAW,QAAQ,EAAE,OAAO,QAAQ,gBAAgB,EAAE;AAC9E,eAAO,EAAE,OAAO,EAAE,OAAO,OAAO,KAAK,WAAW,EAAE,MAAM,OAAA;AAAA,MAC1D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAEA,MAAM,kCAAkB,IAAI;AAAA,EAC1B;AAAA,EAAa;AAAA,EAAa;AAAA,EAAU;AAAA,EAAY;AAAA,EAAa;AAAA,EAC7D;AAAA,EAAS;AAAA,EAAO;AAAA,EAAe;AAAA,EAAe;AAAA,EAAa;AAC7D,CAAC;AAED,MAAM,mCAAmB,IAAI;AAAA,EAC3B;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAa;AAAA,EAAW;AAAA,EAAY;AAAA,EAAO;AAAA,EACtE;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAW;AAAA,EAAO;AACrC,CAAC;AC5sCD,MAAM,IAAI,CAAC,MAAc,KAAK,MAAM,CAAC;AAIrC,SAAS,WAAW,SAAyC;AAC3D,SAAO,QAAQ,WAAW,KAAK,CAAC,MAAsB,EAAE,SAAS,OAAO;AAC1E;AAEA,SAAS,UAAU,OAAoB,OAAoC;AACzE,aAAW,MAAM,OAAO;AACtB,QAAI,GAAG,SAAS,OAAQ,OAAM,EAAE;AAAA,aACvB,GAAG,SAAS,QAAS,WAAU,GAAG,OAAO,KAAK;AAAA,EACzD;AACF;AAEA,SAAS,aAAa,SAAkB,IAAkC;AACxE,MAAI;AACJ,aAAW,KAAK,QAAQ,YAAY;AAClC,QAAI,EAAE,SAAS,mBAAmB,EAAE,YAAY,CAAC,MAAM;AAAE,UAAI,EAAE,OAAO,MAAM,CAAC,MAAO,SAAQ;AAAA,IAAG,CAAC;AAAA,EAClG;AACA,SAAO;AACT;AAIA,SAAS,OAAO,QAAgB,OAAe,KAAa,MAAsB;AAChF,SAAO,OAAO,MAAM,GAAG,KAAK,IAAI,OAAO,OAAO,MAAM,GAAG;AACzD;AAGA,SAAS,YAAY,QAAgB,OAAe,KAAqB;AACvE,MAAI,KAAK;AACT,SAAO,KAAK,KAAK,OAAO,KAAK,CAAC,MAAM,KAAM;AAC1C,MAAI,KAAK;AACT,SAAO,KAAK,OAAO,UAAU,OAAO,EAAE,MAAM,KAAM;AAClD,MAAI,KAAK,OAAO,OAAQ;AACxB,SAAO,OAAO,MAAM,GAAG,EAAE,IAAI,OAAO,MAAM,EAAE;AAC9C;AAIA,SAAS,gBAAgB,SAAkC;AACzD,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,QAAM,QAAQ,QACX,MAAA,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACvC,IAAI,CAAC,MAAM;AACV,UAAM,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM;AAC3E,WAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI;AAAA,EACnD,CAAC;AACH,SAAO;AAAA,EAAgB,MAAM,KAAK,IAAI,CAAC;AAAA;AACzC;AAGO,SAAS,eAAe,QAAgB,SAAkC;AAC/E,QAAM,EAAE,QAAA,IAAY,MAAM,MAAM;AAChC,QAAM,WAAW,QAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACtE,QAAM,QAAQ,gBAAgB,OAAO;AACrC,MAAI,UAAU;AACZ,QAAI,CAAC,OAAO;AACV,aAAO,YAAY,QAAQ,SAAS,KAAK,OAAO,SAAS,KAAK,GAAG,EAAE,QAAQ,WAAW,MAAM;AAAA,IAC9F;AACA,WAAO,OAAO,QAAQ,SAAS,KAAK,OAAO,SAAS,KAAK,KAAK,KAAK;AAAA,EACrE;AACA,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,OAAO,QAAQ,QAAQ,EAAE,IAAI,SAAS,QAAQ;AACvD;AASA,SAAS,YAAY,QAAgB,MAAgB,SAA+B;AAClF,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,MAAI,KAAK,YAAY,QAAQ,KAAK,aAAa,MAAM;AAEnD,UAAM,OAAO,QAAQ,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI;AACjE,WAAO,OAAO,QAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,IAAI;AAAA,EACpE;AACA,QAAM,QAA6D,CAAA;AACnE,QAAM,UAAoB,CAAA;AAC1B,QAAM,YAAY,KAAK,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,OAAO;AAC5D,QAAM,QAAQ,IAAI,IAAI,UAAU,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;AACtD,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,MAAM,IAAI,EAAE,GAAG;AAC1B,QAAI,UAAU,KAAK,EAAE,OAAO,GAAG,KAAK,OAAO,KAAK,GAAG,KAAK,KAAK,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,IAAI;AAAA,QACtF,SAAQ,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE;AAAA,EAC1C;AACA,MAAI,QAAQ,QAAQ;AAClB,QAAI,UAAU,QAAQ;AAGpB,YAAM,UAAU,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC;AAC5D,YAAM,KAAK,EAAE,OAAO,SAAS,KAAK,SAAS,MAAM,KAAK,QAAQ,KAAK,IAAI,CAAC,IAAI;AAAA,IAC9E,OAAO;AAEL,YAAM,MAAM,KAAK,YAAY;AAC7B,YAAM,KAAK,EAAE,OAAO,KAAK,KAAK,KAAK,MAAM,GAAG,QAAQ,KAAK,IAAI,CAAC,KAAK;AAAA,IACrE;AAAA,EACF;AACA,QAAM,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACtC,MAAI,MAAM;AACV,aAAW,KAAK,MAAO,OAAM,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI;AAC/D,SAAO;AACT;AAKO,SAAS,WAAW,QAAgB,IAAY,OAAuB;AAC5E,QAAM,EAAE,QAAA,IAAY,MAAM,MAAM;AAChC,QAAM,OAAO,aAAa,SAAS,EAAE;AACrC,QAAM,SAAS,IAAI,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,CAAC;AACpE,MAAI,CAAC,KAAM,QAAO,eAAe,QAAQ,SAAS,IAAI,QAAW,QAAQ,EAAE;AAE3E,QAAM,WAAW,OAAO,MAAM,KAAK,KAAK,OAAO,KAAK,KAAK,GAAG;AAC5D,QAAM,IAAI,SAAS,MAAM,0BAA0B;AACnD,MAAI,KAAK,EAAE,SAAS,MAAM;AACxB,UAAM,QAAQ,KAAK,KAAK,QAAQ,EAAE;AAClC,WAAO,OAAO,QAAQ,OAAO,QAAQ,EAAE,CAAC,EAAE,QAAQ,MAAM;AAAA,EAC1D;AACA,SAAO,YAAY,QAAQ,MAAM,CAAC,EAAE,KAAK,SAAS,OAAO,OAAA,CAAQ,CAAC;AACpE;AAGO,SAAS,UAAU,QAAgB,IAAY,OAAmE;AACvH,QAAM,EAAE,QAAA,IAAY,MAAM,MAAM;AAChC,QAAM,OAAO,aAAa,SAAS,EAAE;AACrC,QAAM,UAAwB,CAAA;AAC9B,MAAI,MAAM,SAAS,OAAW,SAAQ,KAAK,EAAE,KAAK,QAAQ,OAAO,MAAM,KAAA,CAAM;AAC7E,MAAI,MAAM,WAAW,OAAW,SAAQ,KAAK,EAAE,KAAK,UAAU,OAAO,MAAM,OAAA,CAAQ;AACnF,MAAI,MAAM,UAAU,OAAW,SAAQ,KAAK,EAAE,KAAK,SAAS,OAAO,MAAM,MAAA,CAAO;AAChF,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,MAAI,KAAM,QAAO,YAAY,QAAQ,MAAM,OAAO;AAClD,SAAO,eAAe,QAAQ,SAAS,IAAI,QAAW,QAAW,OAAO;AAC1E;AAGO,SAAS,QAAQ,QAAgB,MAA4D;AAClG,QAAM,EAAE,QAAA,IAAY,MAAM,MAAM;AAChC,QAAM,OAAO,GAAG,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,KAAK,MAAM,QAAQ,MAAM,KAAK,CAAC;AACzE,SAAO,gBAAgB,QAAQ,SAAS,IAAI;AAC9C;AAGO,SAAS,QAAQ,QAAgB,MAA4E;AAClH,QAAM,EAAE,QAAA,IAAY,MAAM,MAAM;AAChC,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,MAAM,QAAQ,MAAM,KAAK,CAAC,MAAM;AACrE,SAAO,gBAAgB,QAAQ,SAAS,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,GAAG,KAAK,EAAE;AACpF;AAGO,SAAS,eAAe,QAAgB,KAAuB;AACpE,MAAI,MAAM;AACV,aAAW,MAAM,KAAK;AACpB,UAAM,EAAE,SAAAC,aAAY,MAAM,GAAG;AAC7B,UAAM,WAAkD,CAAA;AACxD,UAAM,OAAO,aAAaA,UAAS,EAAE;AACrC,QAAI,KAAM,UAAS,KAAK,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,IAAA,CAAK;AACtE,eAAW,KAAKA,SAAQ,YAAY;AAClC,UAAI,EAAE,SAAS,QAAS;AACxB,iBAAW,MAAM,EAAE,YAAY;AAC7B,YAAI,GAAG,SAAS,QAAQ;AACtB,gBAAM,WAAW,GAAG,OAAO,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,CAAC;AACnE,cAAI,SAAU,UAAS,KAAK,EAAE,OAAO,GAAG,KAAK,OAAO,KAAK,GAAG,KAAK,IAAA,CAAK;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAEA,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACzC,eAAW,MAAM,SAAU,OAAM,YAAY,KAAK,GAAG,OAAO,GAAG,GAAG;AAAA,EACpE;AAEA,QAAM,EAAE,QAAA,IAAY,MAAM,GAAG;AAC7B,QAAM,KAAK,QAAQ,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AAChE,MAAI,MAAM,GAAG,SAAS,aAAa;AACjC,UAAM,OAAO,GAAG,QAAQ,OAAO,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,EAAE,CAAC;AACzD,QAAI,KAAK,WAAW,GAAG,QAAQ,OAAQ,OAAM,eAAe,KAAK,IAAI;AAAA,EACvE;AACA,SAAO,IAAI,QAAQ,WAAW,MAAM;AACtC;AAIA,SAAS,gBAAgB,QAAgB,SAAkB,MAAsB;AAC/E,QAAM,QAAQ,WAAW,OAAO;AAChC,MAAI,SAAS,MAAM,cAAc,MAAM;AAErC,QAAI,MAAM,MAAM;AAEhB,WAAO,MAAM,MAAM,OAAO,MAAM,CAAC,MAAM,OAAO,OAAO,MAAM,CAAC,MAAM,KAAO;AACzE,UAAM,SAAS;AACf,WAAO,OAAO,QAAQ,KAAK,KAAK,GAAG,OAAO,MAAM,CAAC,MAAM,OAAO,KAAK,IAAI,GAAG,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EAC7F;AAEA,SAAO,OAAO,QAAQ,QAAQ,EAAE,IAAI;AAAA;AAAA;AAAA,IAAkB,IAAI;AAAA;AAAA;AAC5D;AAGA,SAAS,eACP,QACA,SACA,IACA,OACA,aACA,OACQ;AACR,QAAM,OAAO,aAAa,SAAS,EAAE;AACrC,MAAI,MAAM;AACR,QAAI,MAAM;AACV,QAAI,mBAAmB,WAAW,KAAK,IAAI,YAAY,QAAQ,UAAU,EAAE,CAAC;AAC5E,QAAI,MAAM,QAAQ;AAChB,YAAM,KAAK,MAAM,GAAG;AACpB,YAAM,KAAK,aAAa,GAAG,SAAS,EAAE;AACtC,UAAI,GAAI,OAAM,YAAY,KAAK,IAAI,KAAK;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,QAAM,OAAO,GAAY,MAAM,IAAI,EAAE,GAAG,cAAc,IAAI,WAAW,KAAK,EAAE;AAC5E,QAAM,WAAW,MAAM,SAAS,MAAM,MAAM,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC,OAAO;AAChG,SAAO,gBAAgB,QAAQ,SAAS,OAAO,QAAQ;AACzD;ACxOA,MAAML,WAAS;AACf,MAAM,SAAS;AACf,MAAM,MAAM;AAmBZ,MAAM,YAAoC,EAAE,MAAM,QAAQ,SAAS,WAAW,SAAS,WAAW,MAAM,OAAA;AACxG,MAAM,YAAoC,EAAE,MAAM,OAAO,SAAS,QAAQ,SAAS,OAAO,MAAM,MAAA;AAEzF,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAiB;AAAA,EACjB,WAA0B;AAAA,EAE1B,OAK4C;AAAA,EAEpD,YAAY,UAAuB,IAAe;AAChD,SAAK,IAAI;AACT,SAAK,KAAK;AACV,SAAK,UAAU,SAAS,gBAAgBA,UAAQ,GAAG;AACnD,SAAK,QAAQ,aAAa,SAAS,kBAAkB;AACrD,aAAS,YAAY,YAAY,KAAK,OAAO;AAAA,EAC/C;AAAA,EAEA,QAAQ,GAAmB;AACzB,SAAK,OAAO;AACZ,QAAI,MAAM,SAAU,MAAK,WAAW;AACpC,SAAK,OAAA;AACL,SAAK,KAAA;AAAA,EACP;AAAA,EACA,UAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,cAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EACA,kBAAoC;AAClC,UAAM,KAAK,KAAK;AAChB,WAAO,KAAK,KAAK,GAAG,SAAA,EAAW,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,OAAO;AAAA,EAC1E;AAAA,EACA,iBAAuB;AACrB,SAAK,WAAW;AAChB,SAAK,OAAA;AACL,SAAK,KAAA;AAAA,EACP;AAAA,EAEQ,OAAa;AACnB,SAAK,GAAG,QAAQ,EAAE,MAAM,KAAK,MAAM,UAAU,KAAK,UAAU;AAAA,EAC9D;AAAA;AAAA,EAGA,SAAe;AACb,SAAK,QAAQ,gBAAA;AACb,QAAI,KAAK,MAAM,SAAS,SAAU,QAAO,KAAK,kBAAA;AAC9C,QAAI,KAAK,MAAM,SAAS,UAAW,QAAO,KAAK,mBAAA;AAC/C,UAAM,OAAO,KAAK,gBAAA;AAClB,QAAI,CAAC,KAAM;AACX,UAAM,IAAI,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,EAAA,CAAG;AACvD,UAAM,IAAI,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,IAAI,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG;AACzE,UAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,UAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,UAAM,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,UAAM,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,SAAK,QAAQ,YAAY,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,WAAW,QAAQ,KAAK,CAAC;AACxF,eAAW,CAAC,KAAK,CAAC,KAAK,KAAK,aAAa,GAAG,GAAG,GAAG,CAAC,GAAG;AACpD,YAAM,KAAK,KAAK,KAAK,EAAE,IAAI,SAAS,GAAG,EAAE,IAAI,SAAS,GAAG,QAAQ,QAAQ,WAAW,SAAS;AAC7F,SAAG,aAAa,eAAe,GAAG;AAClC,WAAK,QAAQ,YAAY,EAAE;AAAA,IAC7B;AAAA,EACF;AAAA,EAEQ,aAAa,GAAW,GAAW,GAAW,GAAgC;AACpF,WAAO;AAAA,MACL,CAAC,MAAM,EAAE,GAAG,GAAG;AAAA,MACf,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG;AAAA,MACzB,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG;AAAA,MACtB,CAAC,KAAK,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG;AAAA,MAChC,CAAC,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG;AAAA,MAC7B,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG;AAAA,MAChC,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG;AAAA,MACtB,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,IAAI,GAAG;AAAA,IAAA;AAAA,EAE7B;AAAA,EAEQ,KAAK,GAAW,GAAW,GAAW,GAAW,QAAgB,MAAc,MAA+B;AACpH,UAAMD,KAAI,SAAS,gBAAgBC,UAAQ,MAAM;AACjD,IAAAD,GAAE,aAAa,KAAK,OAAO,CAAC,CAAC;AAC7B,IAAAA,GAAE,aAAa,KAAK,OAAO,CAAC,CAAC;AAC7B,IAAAA,GAAE,aAAa,SAAS,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;AAC9C,IAAAA,GAAE,aAAa,UAAU,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;AAC/C,IAAAA,GAAE,aAAa,UAAU,MAAM;AAC/B,IAAAA,GAAE,aAAa,gBAAgB,KAAK;AACpC,IAAAA,GAAE,aAAa,QAAQ,IAAI;AAC3B,QAAI,KAAM,CAAAA,GAAE,aAAa,oBAAoB,IAAI;AACjD,WAAOA;AAAA,EACT;AAAA,EAEQ,oBAA0B;AAChC,QAAI,KAAK,MAAM,SAAS,SAAU;AAClC,UAAM,IAAI,KAAK,EAAE,cAAc,KAAK,KAAK,UAAU;AACnD,UAAM,IAAI,KAAK,EAAE,cAAc,KAAK,KAAK,GAAG;AAC5C,SAAK,QAAQ,YAAY,KAAK,KAAK,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,WAAW,yBAAyB,KAAK,CAAC;AAAA,EACjK;AAAA,EACQ,qBAA2B;AACjC,UAAM,IAAI,KAAK;AACf,QAAI,CAAC,KAAK,EAAE,SAAS,UAAW;AAChC,UAAM,QAAQ,KAAK,GAAG,SAAA;AACtB,UAAM,WAAW,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI;AACxD,QAAI,CAAC,SAAU;AACf,UAAM,IAAI,KAAK,EAAE,cAAc,WAAW,EAAE,GAAG,SAAS,GAAG,GAAG,SAAS,GAAG,GAAG,SAAS,GAAG,GAAG,SAAS,EAAA,CAAG,CAAC;AACzG,UAAM,IAAI,KAAK,EAAE,cAAc,EAAE,GAAG;AACpC,UAAM,OAAO,SAAS,gBAAgBC,UAAQ,MAAM;AACpD,SAAK,aAAa,MAAM,OAAO,EAAE,CAAC,CAAC;AACnC,SAAK,aAAa,MAAM,OAAO,EAAE,CAAC,CAAC;AACnC,SAAK,aAAa,MAAM,OAAO,EAAE,CAAC,CAAC;AACnC,SAAK,aAAa,MAAM,OAAO,EAAE,CAAC,CAAC;AACnC,SAAK,aAAa,UAAU,SAAS;AACrC,SAAK,aAAa,gBAAgB,GAAG;AACrC,SAAK,aAAa,oBAAoB,KAAK;AAC3C,SAAK,QAAQ,YAAY,IAAI;AAAA,EAC/B;AAAA;AAAA,EAGQ,UAAU,QAAgC;AAChD,UAAM,OAAO,KAAK,gBAAA;AAClB,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,IAAI,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,EAAA,CAAG;AACvD,UAAM,IAAI,KAAK,EAAE,cAAc,EAAE,GAAG,KAAK,IAAI,KAAK,GAAG,GAAG,KAAK,IAAI,KAAK,GAAG;AACzE,UAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,UAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAC3B,UAAM,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,UAAM,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,eAAW,CAAC,KAAK,CAAC,KAAK,KAAK,aAAa,GAAG,GAAG,GAAG,CAAC,GAAG;AACpD,UAAI,KAAK,IAAI,OAAO,IAAI,EAAE,CAAC,KAAK,UAAU,KAAK,IAAI,OAAO,IAAI,EAAE,CAAC,KAAK,OAAQ,QAAO;AAAA,IACvF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA,EAIA,YAAY,OAAc,QAAwB;AAChD,UAAM,QAAQ,KAAK,GAAG,SAAA;AACtB,QAAI,KAAK,SAAS,OAAQ,QAAO;AAEjC,QAAI,KAAK,SAAS,UAAU;AAC1B,YAAM,SAAS,KAAK,UAAU,MAAM;AACpC,UAAI,UAAU,KAAK,UAAU;AAC3B,cAAM,IAAI,KAAK,gBAAA;AACf,aAAK,OAAO,EAAE,MAAM,UAAU,IAAI,EAAE,IAAI,QAAQ,YAAY,OAAO,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAA,EAAE;AAC1G,eAAO;AAAA,MACT;AACA,YAAM,MAAM,YAAY,OAAO,KAAK;AACpC,UAAI,KAAK;AACP,aAAK,WAAW,IAAI;AACpB,aAAK,OAAO,EAAE,MAAM,QAAQ,IAAI,IAAI,IAAI,YAAY,OAAO,MAAM,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAE;AACtF,aAAK,OAAA;AACL,aAAK,KAAA;AACL,eAAO;AAAA,MACT;AACA,WAAK,WAAW;AAChB,WAAK,OAAA;AACL,WAAK,KAAA;AACL,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,SAAS,SAAS;AACzB,YAAM,MAAM,YAAY,OAAO,KAAK;AACpC,UAAI,KAAK;AACP,aAAK,OAAO,EAAE,MAAM,WAAW,MAAM,IAAI,IAAI,KAAK,MAAA;AAClD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,SAAK,OAAO,EAAE,MAAM,UAAU,YAAY,OAAO,KAAK,MAAA;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAAoB;AAC9B,UAAM,IAAI,KAAK;AACf,QAAI,CAAC,EAAG;AACR,UAAM,QAAQ,KAAK,GAAG,SAAA;AACtB,QAAI,EAAE,SAAS,QAAQ;AACrB,YAAM,IAAI,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;AAC/C,UAAI,GAAG;AACL,UAAE,IAAI,EAAE,KAAK,KAAK,MAAM,IAAI,EAAE,WAAW;AACzC,UAAE,IAAI,EAAE,KAAK,KAAK,MAAM,IAAI,EAAE,WAAW;AACzC,aAAK,EAAE,OAAO,KAAK;AACnB,aAAK,OAAA;AAAA,MACP;AAAA,IACF,WAAW,EAAE,SAAS,UAAU;AAC9B,YAAM,IAAI,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;AAC/C,UAAI,GAAG;AACL,aAAK,YAAY,GAAG,EAAE,QAAQ,EAAE,MAAM,KAAK;AAC3C,aAAK,EAAE,OAAO,KAAK;AACnB,aAAK,OAAA;AAAA,MACP;AAAA,IACF,WAAW,EAAE,SAAS,YAAY,EAAE,SAAS,WAAW;AACtD,QAAE,MAAM;AACR,WAAK,OAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEA,UAAU,OAAoB;AAC5B,UAAM,IAAI,KAAK;AACf,SAAK,OAAO;AACZ,QAAI,CAAC,EAAG;AACR,UAAM,QAAQ,KAAK,GAAG,SAAA;AAEtB,QAAI,EAAE,SAAS,QAAQ;AACrB,YAAM,IAAI,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;AAE/C,UAAI,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,KAAM,MAAK,eAAe,GAAG,KAAK;AAAA,IAC3G,WAAW,EAAE,SAAS,UAAU;AAC9B,YAAM,IAAI,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;AAC/C,UAAI,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,KAAM,MAAK,eAAe,GAAG,IAAI;AAAA,IAC1G,WAAW,EAAE,SAAS,UAAU;AAC9B,WAAK,aAAa,EAAE,YAAY,KAAK;AAAA,IACvC,WAAW,EAAE,SAAS,WAAW;AAC/B,YAAM,SAAS,YAAY,OAAO,KAAK;AACvC,UAAI,UAAU,OAAO,OAAO,EAAE,MAAM;AAClC,aAAK,GAAG,SAAS,QAAQ,KAAK,GAAG,UAAA,GAAa,EAAE,MAAM,EAAE,MAAM,IAAI,OAAO,GAAA,CAAI,CAAC;AAAA,MAChF,OAAO;AACL,aAAK,OAAA;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,GAAc,QAAkB,GAAmD,OAAoB;AACzH,QAAI,EAAE,GAAG,GAAG,GAAG,MAAM;AACrB,UAAM,QAAQ,EAAE,IAAI,EAAE;AACtB,UAAM,SAAS,EAAE,IAAI,EAAE;AACvB,QAAI,OAAO,SAAS,GAAG,EAAG,KAAI,KAAK,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC;AACzD,QAAI,OAAO,SAAS,GAAG,EAAG,KAAI,KAAK,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC;AACzD,QAAI,OAAO,SAAS,GAAG,GAAG;AACxB,UAAI,KAAK,IAAI,MAAM,GAAG,QAAQ,GAAG;AACjC,UAAI,QAAQ;AAAA,IACd;AACA,QAAI,OAAO,SAAS,GAAG,GAAG;AACxB,UAAI,KAAK,IAAI,MAAM,GAAG,SAAS,GAAG;AAClC,UAAI,SAAS;AAAA,IACf;AACA,MAAE,IAAI;AACN,MAAE,IAAI;AACN,MAAE,IAAI;AACN,MAAE,IAAI;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,eAAe,GAAc,UAAyB;AAC5D,UAAM,QAAQ,KAAK,GAAG,SAAA;AACtB,UAAM,WAAW,IAAI,KAAK,MAAM,aAAa,CAAA,GAAI,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACtE,UAAM,0BAAU,IAAA;AAChB,eAAW,QAAQ,MAAM,OAAO;AAC9B,YAAM,IAAI,SAAS,IAAI,KAAK,EAAE;AAC9B,UAAI,IAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG;AAAA,IAC1E;AACA,QAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,WAAW,EAAE,IAAI,SAAS,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,WAAW,EAAE,IAAI,SAAS,IAAI,EAAE,EAAE,GAAG,GAAG;AAChI,SAAK,GAAG,SAAS,eAAe,KAAK,GAAG,UAAA,GAAa,CAAC,GAAG,IAAI,OAAA,CAAQ,CAAC,CAAC;AAAA,EACzE;AAAA,EAEQ,aAAa,GAAU,GAAgB;AAC7C,UAAM,QAAQ,KAAK,GAAG,SAAA;AACtB,UAAM,QAAQ,UAAU,KAAK,IAAI,KAAK;AACtC,UAAM,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAChC,UAAM,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAChC,UAAM,IAAI,QAAQ,IAAI,MAAM;AAC5B,UAAM,IAAI,QAAQ,IAAI,KAAK;AAC3B,UAAM,IAAI,QAAQ,IAAI,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AACrD,UAAM,IAAI,QAAQ,IAAI,EAAE,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AACrD,UAAM,KAAK,KAAK,SAAS,OAAO,UAAU,KAAK,IAAI,KAAK,KAAK;AAC7D,QAAI,MAAM,QAAQ,KAAK,GAAG,aAAa,EAAE,IAAI,OAAO,OAAO,GAAA,CAAI;AAC/D,UAAM,MAAM,IAAI,KAA4B,MAAM,aAAa,CAAA,GAAI,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,GAAG,EAAA,CAAG,CAAC,CAAC;AAC/F,QAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG;AAC9B,UAAM,eAAe,KAAK,CAAC,GAAG,IAAI,OAAA,CAAQ,CAAC;AAC3C,SAAK,GAAG,SAAS,GAAG;AACpB,SAAK,WAAW;AAChB,SAAK,OAAO;AACZ,SAAK,KAAA;AAEL,UAAM,SAAS,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG;AAClE,SAAK,GAAG,gBAAgB,IAAI,IAAI,MAAM;AAAA,EACxC;AAAA,EAEQ,SAAS,OAAc,QAAwB;AACrD,UAAM,MAAM,IAAI,IAAI,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAChD,QAAI,IAAI;AACR,WAAO,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,EAAG;AACjC,WAAO,GAAG,MAAM,GAAG,CAAC;AAAA,EACtB;AAAA;AAAA,EAGA,wBAA8B;AAC5B,UAAM,IAAI,KAAK,gBAAA;AACf,QAAI,CAAC,EAAG;AACR,UAAM,IAAI,KAAK,EAAE,cAAc,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EAAA,CAAG,CAAC;AAC7E,SAAK,GAAG,gBAAgB,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,EAC1C;AAAA,EACA,SAAS,OAAuB;AAC9B,UAAM,MAAM,YAAY,KAAK,GAAG,SAAA,GAAY,KAAK;AACjD,QAAI,KAAK;AACP,WAAK,WAAW,IAAI;AACpB,YAAM,IAAI,KAAK,EAAE,cAAc,WAAW,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,EAAA,CAAG,CAAC;AACrF,WAAK,GAAG,gBAAgB,IAAI,IAAI,IAAI,OAAO,CAAC;AAC5C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EACA,YAAY,IAAY,OAAqB;AAC3C,SAAK,GAAG,SAAS,WAAW,KAAK,GAAG,UAAA,GAAa,IAAI,KAAK,CAAC;AAAA,EAC7D;AAAA,EACA,WAAW,IAAY,OAAiE;AACtF,SAAK,GAAG,SAAS,UAAU,KAAK,GAAG,UAAA,GAAa,IAAI,KAAK,CAAC;AAAA,EAC5D;AAAA,EACA,iBAAuB;AACrB,QAAI,CAAC,KAAK,SAAU;AACpB,UAAM,KAAK,KAAK;AAChB,SAAK,WAAW;AAChB,SAAK,GAAG,SAAS,eAAe,KAAK,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;AAC1D,SAAK,KAAA;AAAA,EACP;AAAA,EACA,UAAU,GAA2B;AACnC,SAAK,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,KAAK,UAAU;AAClE,WAAK,eAAA;AACL,aAAO;AAAA,IACT;AACA,QAAI,EAAE,QAAQ,UAAU;AACtB,WAAK,eAAA;AACL,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAgB;AACd,SAAK,QAAQ,OAAA;AAAA,EACf;AACF;AC5WO,SAAS,cAAc,MAAY,UAAgB,OAAmB,CAAA,GAAqB;AAChG,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,UAAU,KAAK,WAAW;AAChC,MAAI,YAAY,IAAI,EAAG,QAAO,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EAAA;AACpD,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAI;AAC3C,QAAM,IAAI,KAAK,IAAI,GAAG,KAAK,OAAO,KAAK,IAAI;AAC3C,QAAM,IAAI,WAAW,IAAI;AACzB,QAAM,SAAS,KAAK,IAAI,GAAG,SAAS,IAAI,UAAU,CAAC;AACnD,QAAM,SAAS,KAAK,IAAI,GAAG,SAAS,IAAI,UAAU,CAAC;AACnD,MAAI,OAAO,KAAK,IAAI,SAAS,GAAG,SAAS,CAAC;AAC1C,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,QAAQ,EAAG,QAAO;AAChD,SAAO,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,IAAI,CAAC;AAChD,SAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,KAAA;AAC7B;AAGO,SAAS,gBAAgB,QAAkC,MAA+B;AAC/F,SAAO,EAAE,IAAI,OAAO,GAAG,IAAI,OAAO,GAAG,KAAA;AACvC;AC5BA,MAAM,KAAK;AACX,MAAM,KAAK,KAAK;AAET,MAAM,UAAwC;AAAA,EACnD,QAAQ,CAAC,MAAM;AAAA,EACf,MAAM,CAAC,MAAM,YAAY,MAAM,KAAK,MAAM,GAAG,CAAC;AAAA,EAC9C,WAAW,CAAC,MAAM,IAAI;AAAA,EACtB,YAAY,CAAC,MAAM,KAAK,IAAI,MAAM,IAAI;AAAA,EACtC,eAAe,CAAC,MAAO,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI;AAAA,EAC3E,YAAY,CAAC,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,CAAC;AAAA,EACvE,YAAY,CAAC,MAAM;AACjB,UAAM,IAAI,KAAK;AACf,WAAO,IAAI,OAAO,IAAI,MAAM,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA,EAC9D;AAAA;AAAA,EAEA,QAAQ,CAAC,MAAM;AACb,QAAI,KAAK,EAAG,QAAO;AAEnB,UAAM,OAAO;AACb,WAAO,IAAI,KAAK,IAAI,OAAW,CAAC,IAAI,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,EACrE;AACF;AAEO,SAAS,aAAa,MAAwC;AACnE,SAAQ,QAAQ,QAAQ,IAAI,KAAM,QAAQ,aAAa;AACzD;AAGA,SAAS,YAAY,IAAY,IAAY,IAAY,IAAY,GAAmB;AAEtF,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,QAAM,KAAK,IAAI,KAAK;AACpB,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,KAAK,KAAK,MAAM;AAC3B,QAAM,KAAK,IAAI,KAAK;AACpB,QAAM,UAAU,CAACM,SAAgB,KAAKA,KAAI,MAAMA,KAAI,MAAMA;AAC1D,QAAM,UAAU,CAACA,SAAgB,KAAKA,KAAI,MAAMA,KAAI,MAAMA;AAC1D,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAI,QAAQ,CAAC,IAAI;AACvB,UAAM,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI;AACvC,QAAI,KAAK,IAAI,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,IAAI,KAAM;AAC/C,SAAK,IAAI;AAAA,EACX;AACA,SAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;AAC5C;AC1BO,MAAM,iBAAiB;AAAA,EACpB;AAAA,EACA,QAAsB;AAAA,EACtB,MAAM;AAAA;AAAA,EAEd;AAAA,EAEA,YAAY,UAAuB;AACjC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAI,UAA2B;AAC7B,WAAO,KAAK,SAAS,UAAA;AAAA,EACvB;AAAA;AAAA,EAGA,aAAa,KAA4B;AACvC,SAAK,KAAA;AACL,SAAK,SAAS,YAAY,GAAG;AAC7B,SAAK,UAAU,GAAG;AAAA,EACpB;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,IAAK,sBAAqB,KAAK,GAAG;AAC3C,SAAK,MAAM;AACX,QAAI,KAAK,OAAO;AACd,YAAMP,KAAI,KAAK,MAAM;AACrB,WAAK,QAAQ;AACb,MAAAA,GAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,IAAqB,OAAoB,IAAmB;AACpE,UAAM,OAAO,KAAK;AAClB,UAAM,WAAW,KAAK,cAAc,KAAK,aAAa,MAAM,EAAE;AAC9D,QAAI,YAAY,GAAG;AACjB,WAAK,aAAa,EAAE;AACpB,aAAO,QAAQ,QAAA;AAAA,IACjB;AAEA,QAAI,KAAK,OAAO;AACd,YAAM,OAAO,KAAK,MAAM;AACxB,WAAK,QAAQ;AACb,WAAA;AAAA,IACF;AACA,WAAO,IAAI,QAAc,CAAC,YAAY;AACpC,WAAK,QAAQ,EAAE,MAAM,IAAI,OAAO,YAAY,IAAA,GAAO,UAAU,QAAQ,KAAK,UAAU,UAAU,QAAA;AAC9F,UAAI,CAAC,KAAK,UAAU,MAAM,sBAAsB,KAAK,KAAK;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EAEQ,QAAQ,CAAC,QAAsB;AACrC,SAAK,MAAM;AACX,UAAM,KAAK,KAAK;AAChB,QAAI,CAAC,GAAI;AACT,UAAM,IAAI,KAAK,IAAI,IAAI,MAAM,GAAG,SAAS,GAAG,QAAQ;AACpD,UAAM,IAAI,aAAa,GAAG,MAAM,EAAE,CAAC;AACnC,UAAM,MAAuB;AAAA,MAC3B,IAAI,KAAK,GAAG,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,MAChC,IAAI,KAAK,GAAG,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC;AAAA,MAChC,MAAM,QAAQ,GAAG,KAAK,MAAM,GAAG,GAAG,MAAM,CAAC;AAAA,IAAA;AAE3C,SAAK,SAAS,YAAY,GAAG;AAC7B,SAAK,UAAU,GAAG;AAClB,QAAI,IAAI,GAAG;AACT,WAAK,MAAM,sBAAsB,KAAK,KAAK;AAAA,IAC7C,OAAO;AACL,YAAM,OAAO,GAAG;AAChB,WAAK,QAAQ;AACb,WAAA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGQ,aAAa,MAAuB,IAA6B;AACvE,UAAME,QAAO,KAAK,MAAM,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,KAAK,MAAM,GAAG,IAAI;AACvF,UAAM,YAAY,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,KAAK,IAAI,CAAC;AACxD,WAAO,MAAM,MAAMA,QAAO,OAAO,YAAY,KAAK,KAAK,IAAI;AAAA,EAC7D;AAAA;AAAA,EAGA,OAAO,OAAc,OAAoB,IAAmB;AAC1D,UAAM,MAAM,cAAc,UAAU,KAAK,GAAG,KAAK,SAAS,gBAAA,GAAmB,EAAE,SAAS,KAAK,WAAW,IAAI;AAC5G,WAAO,KAAK,UAAU,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,MAAM,OAAc,KAAe,OAAwC,CAAA,GAAmB;AAC5F,QAAI,MAAM,UAAA;AACV,eAAW,MAAM,KAAK;AACpB,YAAM,IAAI,YAAY,OAAO,EAAE;AAC/B,UAAI,EAAG,OAAM,UAAU,KAAK,CAAC;AAAA,IAC/B;AACA,QAAI,CAAC,OAAO,SAAS,IAAI,IAAI,EAAG,QAAO,KAAK,OAAO,OAAO,IAAI;AAC9D,UAAM,MAAM,cAAc,KAAK,KAAK,SAAS,gBAAA,GAAmB,EAAE,SAAS,KAAK,WAAW,IAAI,SAAS,GAAG;AAC3G,QAAI,KAAK,QAAQ,KAAM,KAAI,OAAO,KAAK;AACvC,WAAO,KAAK,UAAU,KAAK,IAAI;AAAA,EACjC;AAAA,EAEA,UAAU,KAAW,OAAwC,IAAmB;AAC9E,UAAM,MAAM,cAAc,KAAK,KAAK,SAAS,gBAAA,GAAmB,EAAE,SAAS,KAAK,WAAW,GAAA,CAAI;AAC/F,QAAI,KAAK,QAAQ,KAAM,KAAI,OAAO,KAAK;AACvC,WAAO,KAAK,UAAU,KAAK,IAAI;AAAA,EACjC;AAAA;AAAA,EAGA,OAAO,QAAgB,cAA4B;AACjD,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,KAAK,SAAS,gBAAA;AACzB,UAAM,SAAS,gBAAgB,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,EAAA;AACxD,UAAM,cAAc,KAAK,SAAS,cAAc,MAAM;AACtD,UAAM,OAAO,MAAM,IAAI,OAAO,QAAQ,MAAM,CAAC;AAE7C,UAAM,KAAK,YAAY,KAAK,OAAO,IAAI,GAAG,IAAI,KAAK;AACnD,UAAM,KAAK,YAAY,KAAK,OAAO,IAAI,GAAG,IAAI,KAAK;AACnD,SAAK,aAAa,EAAE,IAAI,IAAI,MAAM;AAAA,EACpC;AAAA;AAAA,EAGA,YAAY,IAAY,IAAkB;AACxC,UAAM,MAAM,KAAK;AACjB,SAAK,aAAa,EAAE,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,KAAK,IAAI,MAAM,MAAM,IAAI,MAAM;AAAA,EAC9F;AACF;AAEA,SAAS,KAAK,GAAW,GAAW,GAAmB;AACrD,SAAO,KAAK,IAAI,KAAK;AACvB;AACA,SAAS,QAAQ,GAAW,GAAW,GAAmB;AACxD,SAAO,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC;AAC9B;AACA,SAAS,MAAM,GAAW,IAAY,IAAoB;AACxD,SAAO,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK;AACrC;ACjIO,SAAS,UAAU,OAAc,SAAsB,MAAwB;AACpF,QAAM,IAAI,IAAI,MAAM,SAAS,MAAM,EAAE,UAAU,MAAM;AACrD,IAAE,SAAS;AAAA,IACT,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,EAAA,CACf;AACD,IAAE,oBAAoB,OAAO,CAAA,EAAG;AAGhC,QAAM,8BAAc,IAAA;AACpB,aAAW,KAAK,SAAS;AACvB,MAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,EAAA,CAAG;AAC3C,YAAQ,IAAI,EAAE,EAAE;AAAA,EAClB;AAKA,aAAW,OAAO,MAAM,QAAQ;AAC9B,QAAI,QAAQ,IAAI,IAAI,EAAE,EAAG;AACzB,UAAM,UAAU,IAAI,QAAQ,OAAO,CAAC,OAAO,QAAQ,IAAI,EAAE,CAAC;AAC1D,QAAI,QAAQ,WAAW,EAAG;AAC1B,MAAE,QAAQ,IAAI,IAAI,CAAA,CAAE;AACpB,eAAW,MAAM,QAAS,GAAE,UAAU,IAAI,IAAI,EAAE;AAAA,EAClD;AAGA,aAAW,KAAK,MAAM,OAAO;AAC3B,UAAM,OAAO,EAAE,KAAK;AACpB,UAAM,KAAK,EAAE,GAAG;AAChB,QAAI,QAAQ,QAAQ,MAAM,KAAM;AAChC,QAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAG;AAC5C,MAAE,QAAQ,MAAM,EAAE;AAAA,EACpB;AAEA,QAAM,OAAO,CAAC;AAGd,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,EAAE,KAAK,EAAE,EAAE;AACtB,QAAI,CAAC,MAAM,CAAC,OAAO,SAAS,GAAG,CAAC,KAAK,CAAC,OAAO,SAAS,GAAG,CAAC,GAAG;AAC3D,YAAM,IAAI,MAAM,+CAA+C,EAAE,EAAE,GAAG;AAAA,IACxE;AACA,MAAE,IAAI,GAAG,IAAI,EAAE,IAAI;AACnB,MAAE,IAAI,GAAG,IAAI,EAAE,IAAI;AAAA,EACrB;AAKA,aAAW,KAAK,MAAM,OAAO;AAC3B,UAAM,OAAO,EAAE,KAAK;AACpB,UAAM,KAAK,EAAE,GAAG;AAChB,QAAI,QAAQ,QAAQ,MAAM,QAAQ,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,GAAG;AACxE,QAAE,SAAS;AACX;AAAA,IACF;AACA,UAAM,KAAK,EAAE,KAAK,MAAM,EAAE;AAC1B,MAAE,SAAS,IAAI,UAAU,GAAG,OAAO,UAAU,IAAI,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,IAAI;AAAA,EAChG;AACF;ACpFO,SAAS,WAAW,OAAoB,KAAmB;AAChE,QAAM,IAAI,MAAM;AAChB,MAAI,MAAM,EAAG;AAEb,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC;AAGhD,MAAI,SAAS;AACb,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,IAAI,OAAQ,UAAS,KAAK;AACnC,QAAI,KAAK,IAAI,OAAQ,UAAS,KAAK;AAAA,EACrC;AACA,QAAM,OAAO,SAAS;AAEtB,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,UAAM,MAAM,IAAI;AAEhB,SAAK,IAAI,MAAM,QAAQ,OAAO,KAAK,KAAK;AACxC,SAAK,IAAI,MAAM,QAAQ,OAAO,KAAK,KAAK;AAAA,EAC1C;AACF;AChBO,SAAS,aACd,OACA,UACA,cAAc,KACR;AACN,QAAM,IAAI,MAAM;AAChB,MAAI,MAAM,EAAG;AAGb,MAAI,SAAS;AACb,MAAI,aAAa,QAAW;AAC1B,UAAM,MAAM,MAAM,UAAU,CAAC,SAAS,KAAK,OAAO,QAAQ;AAC1D,QAAI,OAAO,EAAG,UAAS;AAAA,EACzB;AAGA,QAAM,MAAM,MAAM,MAAM;AACxB,MAAI,IAAI,CAAC,IAAI,IAAI;AACjB,MAAI,IAAI,CAAC,IAAI,IAAI;AAEjB,QAAM,OAAO,MAAM,OAAO,CAAC,GAAG,MAAM,MAAM,MAAM;AAChD,QAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,EAAG;AAEjB,QAAM,SAAS,KAAK,IAAI,aAAa,IAAI,EAAE;AAC3C,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,QAAS,IAAI,KAAK,KAAK,IAAK;AAClC,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI;AAC7B,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI;AAC7B,SAAK,CAAC,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI;AAAA,EAC/B;AACF;ACjBA,MAAM,kBAAkB;AACxB,MAAM,kBAAkB;AACxB,MAAM,aAAa;AACnB,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAC5B,MAAM,mBAAmB;AAalB,SAAS,YAAY,OAAoB;AAE9C,MAAI,MAAM,KAAK,WAAW,SAAU;AAGpC,QAAM,UAAU,MAAM,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,IAAI;AAC3D,MAAI,QAAQ,WAAW,EAAG;AAE1B,YAAU,OAAO,OAAO;AAKxB,QAAM,EAAE,IAAI,GAAA,IAAO,gBAAgB,SAAS,gBAAgB;AAG5D,MAAI,OAAO,KAAK,OAAO,GAAG;AACxB,eAAW,KAAK,MAAM,OAAO;AAC3B,UAAI,EAAE,OAAQ,GAAE,SAAS,EAAE,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,KAAK;AAAA,IAC7E;AAAA,EACF;AACF;AAMA,SAAS,UAAU,OAAc,SAA4B;AAC3D,QAAM,OAAO,MAAM,KAAK;AACxB,MAAI;AACF,YAAQ,MAAA;AAAA,MACN,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,kBAAU,OAAO,SAAS,WAAW,OAAO,IAAI,CAAC;AACjD;AAAA,MACF,KAAK;AACH,mBAAW,SAAS,QAAQ,KAAK,CAAC;AAClC;AAAA,MACF,KAAK;AACH,qBAAa,SAAS,aAAa,KAAK,GAAG,mBAAmB;AAC9D;AAAA,MACF;AAEE,mBAAW,SAAS,QAAQ,KAAK,CAAC;AAClC;AAAA,IAAA;AAAA,EAEN,QAAQ;AAEN,QAAI;AACF,iBAAW,SAAS,QAAQ,KAAK,CAAC;AAAA,IACpC,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAMA,SAAS,WAAW,OAAc,MAA8B;AAC9D,SAAO;AAAA,IACL,SAAS,eAAe,OAAO,IAAI;AAAA,IACnC,SAAS,MAAM,KAAK,SAAS,QAAQ;AAAA,IACrC,SAAS,MAAM,KAAK,SAAS,QAAQ;AAAA,IACrC,QAAQ;AAAA,EAAA;AAEZ;AAGA,SAAS,eAAe,OAAc,MAA2B;AAC/D,QAAM,SAAS,mBAAmB,cAAc,KAAK,CAAC;AACtD,MAAI,OAAQ,QAAO;AACnB,UAAQ,MAAA;AAAA,IACN,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,mBAAmB,KAAqD;AAC/E,UAAQ,KAAA;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,QAAQ,OAAsB;AACrC,SAAO,MAAM,KAAK,SAAS,QAAQ;AACrC;AAQA,SAAS,cAAc,OAAyC;AAC9D,QAAM,MAAO,MAAM,KAAiC;AACpD,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,UAAQ,KAAA;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,aAAa,OAAkC;AACtD,QAAM,MAAO,MAAM,KAA8B;AACjD,SAAO,OAAO,QAAQ,WAAW,MAAM;AACzC;AAUA,SAAS,gBAAgB,OAAoB,QAA4C;AACvF,MAAI,OAAO;AACX,MAAI,OAAO;AACX,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,IAAI,KAAM,QAAO,EAAE;AACzB,QAAI,EAAE,IAAI,KAAM,QAAO,EAAE;AAAA,EAC3B;AACA,MAAI,CAAC,OAAO,SAAS,IAAI,KAAK,CAAC,OAAO,SAAS,IAAI,EAAG,QAAO,EAAE,IAAI,GAAG,IAAI,EAAA;AAE1E,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS;AACpB,MAAI,OAAO,KAAK,OAAO,UAAU,EAAE,IAAI,GAAG,IAAI,EAAA;AAE9C,aAAW,KAAK,OAAO;AACrB,MAAE,KAAK;AACP,MAAE,KAAK;AAAA,EACT;AACA,SAAO,EAAE,IAAI,GAAA;AACf;AC9MO,SAAS,eAAe,OAAoB;AACjD,MAAI,CAAC,MAAM,aAAa,CAAC,MAAM,UAAU,OAAQ;AACjD,QAAM,OAAO,IAAI,IAAI,MAAM,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACtD,aAAW,KAAK,MAAM,WAAW;AAC/B,UAAM,IAAI,KAAK,IAAI,EAAE,EAAE;AACvB,QAAI,CAAC,EAAG;AACR,MAAE,IAAI,EAAE;AACR,MAAE,IAAI,EAAE;AACR,QAAI,EAAE,KAAK,QAAQ,EAAE,IAAI,EAAG,GAAE,IAAI,EAAE;AACpC,QAAI,EAAE,KAAK,QAAQ,EAAE,IAAI,EAAG,GAAE,IAAI,EAAE;AACpC,MAAE,SAAS;AAAA,EACb;AACF;ACJO,MAAM,cAAqB;AAAA,EAChC,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,eAAe,eAAe;AAAA,EAC9B,aAAa,eAAe;AAAA,EAC5B,WAAW;AAAA,EACX,MAAM;AACR;AAEO,MAAM,aAAoB;AAAA,EAC/B,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,WAAW;AAAA,EACX,MAAM;AACR;AAEO,SAAS,iBAAiB,MAAc,OAAyB,SAAoB;AAC1F,SAAO;AAAA,IACL,QAAQ,SAAS,SAAS,YAAY,eAAe;AAAA,IACrD,MAAM;AAAA,IACN,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW,SAAS,SAAS,YAAY,eAAe;AAAA,IACxD,WAAW;AAAA,IACX,eAAe;AAAA,IACf,SAAS;AAAA,IACT;AAAA,EAAA;AAEJ;AAEO,SAAS,iBAAiB,MAAc,OAAyB,SAAoB;AAC1F,SAAO;AAAA,IACL,QAAQ,SAAS,SAAS,YAAY,eAAe;AAAA,IACrD,aAAa;AAAA,IACb,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT;AAAA,IACA,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,WAAW,SAAS,SAAS,YAAY,eAAe;AAAA,IACxD,SAAS,SAAS,SAAS,YAAY;AAAA,EAAA;AAE3C;AAGO,SAAS,gBAAgB,OAAkB,OAAyC;AACzF,QAAM,QAAQ,QAAQ,MAAM,MAAM,IAAI,IAAI,CAAC,EAAE;AAC7C,QAAM,UAAU,MAAM,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC;AAC/D,QAAM,QAAQ,KAAK,IAAI,IAAI,UAAU,KAAK,EAAE;AAC5C,QAAM,QAAQ,KAAK,IAAI,IAAI,MAAM,SAAS,KAAK,EAAE;AACjD,UAAQ,OAAA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,GAAG,KAAK,IAAI,OAAO,KAAK,GAAG,GAAG,KAAK,IAAI,OAAO,KAAK,EAAA;AAAA,IAC9D,KAAK;AACH,aAAO,EAAE,GAAG,QAAQ,KAAK,GAAG,QAAQ,IAAA;AAAA,IACtC,KAAK;AACH,aAAO,EAAE,GAAG,QAAQ,MAAM,GAAG,QAAQ,KAAA;AAAA,IACvC,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,GAAG,QAAQ,KAAA;AAAA,IAChC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,GAAG,QAAQ,KAAK,GAAG,MAAA;AAAA,IAC9B,KAAK;AACH,aAAO,EAAE,GAAG,OAAO,GAAG,QAAQ,IAAA;AAAA,IAChC;AACE,aAAO,EAAE,GAAG,OAAO,GAAG,MAAA;AAAA,EAAM;AAElC;AAkBO,SAAS,SAAS,OAAiC;AACxD,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,OAAQ,WAAW,MAAM,EAAE,IAAI,MAAa;AAClD,QAAM,OACJ,MAAM,KAAK,QAAQ,MAAM,KAAK,OAC1B,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,MACvB,gBAAgB,OAAO,KAAK;AAClC,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA,GAAG,MAAM,KAAK;AAAA,IACd,GAAG,MAAM,KAAK;AAAA,IACd,GAAG,MAAM,KAAK,KAAK;AAAA,IACnB,GAAG,MAAM,KAAK,KAAK;AAAA,IACnB,OAAO,EAAE,GAAG,iBAAiB,MAAM,MAAM,IAAI,GAAG,GAAG,MAAM,OAAO,KAAA;AAAA,IAChE,OAAO,MAAM;AAAA,IACb,GAAG,MAAM,KAAK;AAAA,IACd,QAAQ,MAAM,WAAW,MAAM,KAAK,QAAQ,MAAM,KAAK;AAAA,IACvD,MAAM,MAAM;AAAA,EAAA;AAEhB;AAgBO,SAAS,SAAS,OAAiC;AACxD,QAAM,OAAQ,WAAW,MAAM,EAAE,IAAI,MAAa;AAClD,SAAO;AAAA,IACL,IAAI,MAAM;AAAA,IACV,MAAM,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,WAAA;AAAA,IACxC,IAAI,EAAE,MAAM,MAAM,IAAI,QAAQ,MAAM,SAAA;AAAA,IACpC,OAAO,MAAM,SAAS;AAAA,IACtB,OAAO,EAAE,GAAG,iBAAiB,MAAM,MAAM,IAAI,GAAG,GAAG,MAAM,OAAO,KAAA;AAAA,IAChE,SAAS,MAAM,WAAW;AAAA,IAC1B,GAAG,MAAM,KAAK;AAAA,IACd,MAAM,MAAM;AAAA,EAAA;AAEhB;AAEO,SAAS,WAAW,OAAyB,SAAgB;AAClE,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,SAAS,SAAS,aAAa;AAAA,IACtC,MAAM,EAAE,QAAQ,MAAA;AAAA,IAChB,OAAO,CAAA;AAAA,IACP,OAAO,CAAA;AAAA,IACP,QAAQ,CAAA;AAAA,IACR,aAAa,CAAA;AAAA,IACb,OAAO,CAAA;AAAA,EAAC;AAEZ;AC9IO,SAAS,KAAK,OAAkB,KAAgC;AACrE,QAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,GAAG;AAC7C,SAAO,OAAO;AAChB;ACrBO,MAAM,YAAuC;AAAA,EAClD,MAAM;AAAA,EACN,WAAW;AAAA,EACX,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,eAAe;AAAA,EACf,WAAW;AAAA,EACX,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAEO,SAAS,SAAS,MAAqC;AAC5D,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,KAAK,WAAW,SAAS,EAAG,QAAO;AACvC,SAAO,UAAU,IAAI,KAAM;AAC7B;AAYO,SAAS,WAAW,OAA8B;AACvD,UAAQ,OAAA;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,QAAQ,cAAc,OAAA;AAAA,IACvE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,QAAQ,cAAc,QAAA;AAAA,IACvE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,SAAS,cAAc,OAAA;AAAA,IACxE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,SAAS,cAAc,QAAA;AAAA,IACxE,KAAK;AACH,aAAO,EAAE,aAAa,UAAU,gBAAgB,QAAQ,cAAc,QAAA;AAAA,IACxE,KAAK;AACH,aAAO,EAAE,aAAa,UAAU,gBAAgB,QAAQ,cAAc,QAAA;AAAA,IACxE,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,QAAQ,cAAc,SAAS,gBAAgB,IAAA;AAAA,IAChG,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,QAAQ,cAAc,QAAQ,gBAAgB,IAAA;AAAA,IAC/F,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,QAAQ,cAAc,SAAS,WAAW,QAAQ,SAAS,SAAA;AAAA,IAC5G,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,QAAQ,cAAc,SAAA;AAAA,IACvE,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,aAAa,SAAS,gBAAgB,QAAQ,cAAc,MAAA;AAAA,IACvE;AACE,aAAO,EAAE,aAAa,SAAS,gBAAgB,QAAQ,cAAc,QAAA;AAAA,EAAQ;AAEnF;AAEO,SAAS,eAAe,GAA8B;AAC3D,MAAI,EAAE,MAAM,MAAO,QAAO,EAAE;AAC5B,MAAI,EAAE,MAAM,SAAS;AACnB,WAAO,EAAE,MAAM,GAAG,QAAQ,KAAK,MAAM,KAAK,OAAO,MAAM,EAAE,CAAC;AAAA,EAC5D;AACA,SAAO;AACT;AAEO,SAAS,aAAa,GAA8B;AACzD,MAAI,EAAE,MAAM,MAAO,QAAO,EAAE;AAC5B,MAAI,EAAE,MAAM,SAAS;AACnB,WAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,YAAY,EAAA,EAAI,EAAE,CAAC;AAAA,EACvD;AACA,SAAO;AACT;AAEO,SAAS,aAAa,GAAiC;AAC5D,MAAI,EAAE,MAAM,QAAS,QAAO;AAC5B,QAAM,KAAK,oBAAI,IAAI,CAAC,WAAW,eAAe,SAAS,UAAU,QAAQ,MAAM,CAAC;AAChF,SAAO,GAAG,IAAI,EAAE,CAAC,IAAK,EAAE,IAAkB;AAC5C;AAEO,SAAS,eAAe,GAAmC;AAChE,MAAI,EAAE,MAAM,QAAS,QAAO;AAC5B,SAAO,CAAC,SAAS,UAAU,QAAQ,EAAE,SAAS,EAAE,CAAC,IAAK,EAAE,IAAoB;AAC9E;AAEO,SAAS,WAAW,GAAmC;AAC5D,MAAI,EAAE,MAAM,QAAS,QAAO;AAC5B,QAAM,MAAmC;AAAA,IACvC,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,KAAK;AAAA,EAAA;AAEP,SAAO,IAAI,EAAE,CAAC;AAChB;AAEO,SAAS,aAAa,GAAqC;AAChE,MAAI,EAAE,MAAM,QAAS,QAAO;AAC5B,SAAO,EAAE;AACX;AAEO,SAAS,aAAa,GAAoE;AAC/F,MAAI;AACJ,MAAI;AACJ,MAAI,EAAE,MAAM,QAAS,QAAO,EAAE;AAAA,WACrB,EAAE,MAAM,UAAU;AACzB,WAAO,EAAE;AACT,UAAM,KAAK,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO;AAChD,QAAI,MAAM,GAAG,MAAM,MAAM,MAAO,SAAQ,GAAG,MAAM;AAAA,EACnD;AACA,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,QAAQ,oBAAI,IAAI,CAAC,QAAQ,QAAQ,cAAc,WAAW,SAAS,SAAS,iBAAiB,YAAY,QAAQ,WAAW,QAAQ,CAAC;AAE3I,QAAM,QAA4C,EAAE,MAAM,SAAS,SAAS,cAAc,QAAQ,OAAA;AAClG,QAAM,OAAQ,MAAM,IAAI,MAAM,MAAM,IAAI,IAAI,IAAI,OAAO;AACvD,SAAO,EAAE,MAAM,MAAA;AACjB;AAEO,SAAS,UAAU,GAAkC;AAC1D,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,EAAE,MAAM,SAAS;AACnB,UAAM,QAAsB,CAAC,UAAU,QAAQ,WAAW,YAAY,eAAe,YAAY,cAAc,QAAQ;AACvH,QAAK,MAAmB,SAAS,EAAE,CAAC,UAAU,EAAE;AAChD,QAAI,EAAE,MAAM,WAAW,EAAE,MAAM,SAAU,QAAO;AAChD,WAAO;AAAA,EACT;AACA,MAAI,EAAE,MAAM,QAAQ;AAClB,QAAI,EAAE,SAAS,SAAU,QAAO;AAChC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,aAAa,GAAU,QAA4B,MAAyB,QAAQ,GAAkB;AACpH,MAAI,QAAQ,EAAG,QAAO;AACtB,UAAQ,EAAE,GAAA;AAAA,IACR,KAAK;AACH,aAAO,EAAE;AAAA,IACX,KAAK;AACH,aAAO,SAAS,SAAS,YAAY,EAAE,CAAC,IAAI,cAAc,EAAE,GAAG,SAAS;AAAA,IAC1E,KAAK;AACH,aAAO,SAAS,SAAS,YAAY,EAAE,CAAC,IAAI,cAAc,EAAE,GAAG,SAAS;AAAA,IAC1E,KAAK,SAAS;AACZ,YAAM,IAAI,OAAO,IAAI,EAAE,CAAC;AACxB,UAAI,CAAC,EAAG,QAAO;AACf,aAAO,aAAa,GAAG,QAAQ,MAAM,QAAQ,CAAC;AAAA,IAChD;AAAA,IACA;AACE,aAAO;AAAA,EAAA;AAEb;AAEO,SAAS,SAAS,GAA0C;AACjE,SAAO,KAAK,EAAE,MAAM,QAAQ,EAAE,IAAI;AACpC;AC7IA,MAAM,WAAoD;AAAA,EACxD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACR;AAEO,SAAS,eAAe,SAAkB,OAAuB,IAAmB;AACzF,QAAM,QAAQ,KAAK,eAAe,IAAI,cAAA;AAGtC,QAAM,6BAAa,IAAA;AACnB,QAAM,6BAAa,IAAA;AACnB,QAAM,+BAAe,IAAA;AACrB,QAAM,aAA0B,CAAA;AAChC,QAAM,cAA+B,CAAA;AACrC,MAAI,WAAuB,CAAA;AAC3B,MAAI,gBAAuC,CAAA;AAC3C,QAAM,YAAuB,CAAA;AAC7B,QAAM,kBAAsC,CAAA;AAC5C,MAAI;AACJ,MAAI,aAAa;AAEjB,aAAW,KAAK,QAAQ,YAAY;AAClC,YAAQ,EAAE,MAAA;AAAA,MACR,KAAK;AACH,wBAAiB,KAAK,GAAG,EAAE,OAAO;AAClC;AAAA,MACF,KAAK;AACH,kBAAU,KAAK,GAAG,EAAE,KAAK;AACzB;AAAA,MACF,KAAK;AACH,eAAO,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,OAAO,EAAE,OAAO,SAAS,EAAE,SAAS;AAC3E;AAAA,MACF,KAAK;AACH,eAAO,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,SAAS,EAAE,QAAA,CAAS;AACzD;AAAA,MACF,KAAK;AACH,mBAAWF,MAAK,EAAE,gBAAgB,IAAIA,GAAE,QAAQ,CAAC,GAAI,SAAS,IAAIA,GAAE,MAAM,KAAK,CAAA,GAAK,GAAGA,GAAE,KAAK,CAAC;AAC/F;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,GAAG,EAAE,UAAU;AAC/B;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,GAAG,EAAE,QAAQ;AAC9B;AAAA,MACF,KAAK;AACH,mBAAW,EAAE;AACb,wBAAgB,OAAO,YAAY,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvE;AAAA,MACF,KAAK;AACH,qBAAa;AACb;AAAA,IAAA;AAAA,EAEN;AAEA,MAAI,YAAY;AACd,UAAM,KAAK,kBAAkB,yGAAyG,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,EAAA,GAAK,EAAE,MAAM,oCAAoC;AAAA,EAC3N;AAGA,QAAM,gCAAgB,IAAA;AACtB,QAAM,YAAsB,CAAA;AAC5B,QAAM,YAAwB,CAAA;AAC9B,QAAM,aAAuD,CAAA;AAC7D,QAAM,gCAAgB,IAAA;AACtB,QAAM,iBAAkC,CAAA;AACxC,MAAI;AACJ,MAAI,cAAyB,CAAA;AAE7B,QAAM,gBAAgB,CAAC,IAAc,UAAmB;AACtD,UAAM,WAAW,UAAU,IAAI,GAAG,EAAE;AACpC,QAAI,UAAU;AACZ,eAAS,QAAQ,KAAK,GAAG,GAAG,OAAO;AACnC,eAAS,MAAM,KAAK,GAAG,GAAG,KAAK;AAC/B,eAAS,QAAQ,KAAK,GAAG,GAAG,OAAO;AACnC,UAAI,GAAG,MAAO,UAAS,QAAQ,GAAG;AAClC,UAAI,GAAG,UAAU,OAAW,UAAS,QAAQ,GAAG;AAAA,IAClD,OAAO;AACL,gBAAU,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,GAAG,OAAO,GAAG,OAAO,CAAC,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC,GAAG,GAAG,OAAO,GAAG;AACxG,gBAAU,KAAK,GAAG,EAAE;AAAA,IACtB;AACA,QAAI,MAAO,WAAU,IAAI,GAAG,IAAI,KAAK;AAAA,EACvC;AAEA,QAAM,OAAO,CAAC,OAAoB,UAAmB;AACnD,eAAW,MAAM,OAAO;AACtB,cAAQ,GAAG,MAAA;AAAA,QACT,KAAK;AACH,wBAAc,IAAI,KAAK;AACvB;AAAA,QACF,KAAK;AACH,oBAAU,KAAK,EAAE;AACjB;AAAA,QACF,KAAK,SAAS;AACZ,gBAAM,UAAoB,CAAA;AAC1B,qBAAW,MAAM,GAAG,MAAO,KAAI,GAAG,SAAS,OAAQ,SAAQ,KAAK,GAAG,EAAE;AACrE,qBAAW,KAAK,EAAE,MAAM,IAAI,SAAS;AACrC,eAAK,GAAG,OAAO,GAAG,EAAE;AACpB;AAAA,QACF;AAAA,QACA,KAAK;AACH,uBAAa,GAAG;AAChB,wBAAc,GAAG;AACjB;AAAA,QACF,KAAK;AACH,cAAI,GAAG,SAAS,QAAS,eAAc,GAAG;AAC1C;AAAA,QACF,KAAK;AACH,iBAAO,IAAI,GAAG,MAAM,EAAE,OAAO,GAAG,OAAO,SAAS,GAAG,QAAA,CAAS;AAC5D;AAAA,QACF,KAAK;AACH,yBAAe,KAAK,GAAG,GAAG,QAAQ;AAClC;AAAA,QACF,KAAK,cAAc;AACjB,gBAAM,KAAe,EAAE,MAAM,QAAQ,IAAI,GAAG,IAAI,SAAS,GAAG,SAAS,OAAO,IAAI,SAAS,CAAA,GAAI,MAAM,GAAG,KAAA;AACtG,wBAAc,IAAI,KAAK;AACvB;AAAA,QACF;AAAA,QACA,KAAK;AAEH;AAAA,QACF,KAAK;AACH,uBAAa;AACb;AAAA,MAAA;AAAA,IAEN;AAAA,EACF;AACA,OAAK,UAAU;AAGf,QAAM,+BAAe,IAAA;AACrB,QAAM,YAAY,eAAe,CAAC,GAAG,OAAO,KAAA,CAAM,EAAE,CAAC;AACrD,MAAI,WAAW;AAEb,UAAM,QAAkB,CAAA;AACxB,QAAI,MAA0B;AAC9B,UAAM,2BAAW,IAAA;AACjB,WAAO,OAAO,OAAO,IAAI,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG,GAAG;AAC/C,YAAM,QAAQ,GAAG;AACjB,WAAK,IAAI,GAAG;AACZ,YAAM,OAAO,IAAI,GAAG,EAAG;AAAA,IACzB;AACA,eAAW,QAAQ,OAAO;AACxB,iBAAW,KAAK,OAAO,IAAI,IAAI,EAAG,OAAQ,UAAS,IAAI,EAAE,MAAM,EAAE,KAAK;AAAA,IACxE;AAAA,EACF;AACA,QAAM,OAAyB,WAAW,YAAA,EAAc,SAAS,MAAM,IAAI,SAAS;AAGpF,QAAM,aAAa,CAAC,MAAc,OAAO,oBAAI,UAAwC;AACnF,QAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI,EAAG,QAAO,EAAE,OAAO,CAAA,EAAC;AAC1D,SAAK,IAAI,IAAI;AACb,UAAM,IAAI,OAAO,IAAI,IAAI;AACzB,UAAM,OAAO,EAAE,UAAU,WAAW,EAAE,SAAS,IAAI,EAAE,QAAQ,CAAA;AAC7D,WAAO,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,EAAE,KAAK,EAAA;AAAA,EACtC;AAGA,QAAM,QAAQ,WAAW,IAAI;AAC7B,YAAU,OAAO,WAAW,QAAQ;AAGpC,QAAM,WAAW,CAAC,MAAuB,SAAmB,WAAiC;AAC3F,UAAM,UAAqB,CAAA;AAC3B,eAAW,KAAK,SAAS,IAAI,IAAI,KAAK,GAAI,SAAQ,KAAK,CAAC;AACxD,eAAW,KAAK,QAAS,SAAQ,KAAK,GAAG,WAAW,CAAC,EAAE,KAAK;AAC5D,YAAQ,KAAK,GAAG,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,CAAC,IAAY,UAAmB;AACjD,QAAI,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAG;AAC1C,UAAM,MAAM,KAAK,SAAS,EAAE,IAAI,OAAgB,IAAI,KAAA,CAAM,CAAC;AAAA,EAC7D;AAGA,aAAW,MAAM,WAAW;AAC1B,UAAM,KAAK,UAAU,IAAI,EAAE;AAC3B,UAAM,UAAU,eAAe,EAAE;AACjC,UAAM,UAAU,SAAS,QAAQ,SAAS,GAAG,KAAK;AAClD,UAAM,QAAQ,eAAe,SAAS,QAAc;AACpD,UAAM,QAAQ,SAAS,MAAM,SAAS,GAAG,KAAK;AAC9C,UAAM,QAAQ,MAAM,SAAS,GAAG,SAAS,SAAS,EAAE;AACpD,UAAM,OAAO,SAAS;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM;AAAA,MACb,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,QAAQ,MAAM;AAAA,MACd,OAAO,UAAU,IAAI,EAAE;AAAA,MACvB;AAAA,MACA,MAAM,EAAE,MAAM,YAAY,EAAE,GAAG,QAAA;AAAA,IAAQ,CACxC;AACD,UAAM,MAAM,KAAK,IAAI;AAAA,EACvB;AAGA,aAAW,MAAM,YAAY;AAC3B,UAAM,IAAgB;AAAA,MACpB,IAAI,GAAG,KAAK;AAAA,MACZ,OAAO,GAAG,KAAK,SAAS;AAAA,MACxB,SAAS,GAAG;AAAA,MACZ,OAAO,gBAAgB,GAAG,KAAK,OAAO,QAAQ;AAAA,MAC9C,OAAO;AAAA,IAAA;AAET,UAAM,OAAO,KAAK,CAAC;AAAA,EACrB;AAGA,MAAI,UAAU;AACd,aAAW,MAAM,WAAW;AAC1B,aAAS,IAAI,GAAG,IAAI,GAAG,IAAI,QAAQ,KAAK;AACtC,YAAM,KAAK,WAAW,GAAG,IAAI,CAAC,EAAE,KAAK;AACrC,YAAM,UAAU,GAAG,OAAO,CAAC;AAC3B,YAAM,QAAQ,GAAG,OAAO,IAAI,CAAC;AAC7B,YAAM,YAAY,GAAG,IAAI,WAAW;AACpC,iBAAW,QAAQ,SAAS;AAC1B,mBAAW,MAAM,OAAO;AACtB,cAAI,KAAK,OAAQ,cAAa,OAAO,KAAK,QAAQ,UAAU,MAAM,QAAQ;AAC1E,cAAI,GAAG,OAAQ,cAAa,OAAO,GAAG,QAAQ,UAAU,MAAM,QAAQ;AACtE,qBAAW,KAAK,EAAE;AAClB,qBAAW,GAAG,EAAE;AAChB,gBAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,aAAa,YAAY,GAAG,QAAQ,WAAc;AAC1E,gBAAM,KAAK,GAAG,MAAM,aAAa,QAAQ,WAAW,KAAK,MAAM,WAAW,IAAI,GAAG,KAAK,IAAI,SAAS,IAAI,KAAK,EAAE,IAAI,GAAG,EAAE;AACvH,gBAAM,QAAQ,eAAe,IAAI,SAAS,QAAQ,CAAA,GAAI,GAAG,KAAK,GAAG,QAAc;AAC/E,gBAAM,OAAO,SAAS;AAAA,YACpB;AAAA,YACA,MAAM,KAAK;AAAA,YACX,IAAI,GAAG;AAAA,YACP,YAAY,eAAe,IAAI;AAAA,YAC/B,UAAU,eAAe,EAAE;AAAA,YAC3B;AAAA,YACA,OAAO,MAAM;AAAA,YACb,SAAS,MAAM,WAAW,GAAG,WAAW;AAAA,YACxC;AAAA,UAAA,CACD;AACD,gBAAM,MAAM,KAAK,IAAI;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gCAAgB,IAAA;AACtB,QAAM,UAAU,CAAC,MAAoC,CAAC,EAAE,KAAK,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,OAAO,EAAE,KAAA,EAAO,KAAK,GAAG;AAC7G,aAAW,KAAK,MAAM,MAAO,WAAU,IAAI,QAAQ,CAAC,IAAI,UAAU,IAAI,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC;AAC3F,QAAM,8BAAc,IAAA;AACpB,aAAW,KAAK,MAAM,OAAO;AAC3B,UAAM,MAAM,QAAQ,CAAC;AACrB,UAAM,QAAQ,UAAU,IAAI,GAAG;AAC/B,QAAI,QAAQ,GAAG;AACb,YAAM,MAAM,QAAQ,IAAI,GAAG,KAAK;AAChC,cAAQ,IAAI,KAAK,MAAM,CAAC;AACxB,QAAE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,EAAE,OAAO,KAAK,QAAM;AACpD,QAAE,UAAU;AAAA,IACd;AAAA,EACF;AAGA,aAAW,OAAO,CAAC,GAAG,aAAa,GAAG,cAAc,GAAG;AACrD,UAAM,IAAI,kBAAkB,KAAK,UAAU,QAAQ;AACnD,QAAI,EAAG,OAAM,YAAY,KAAK,CAAC;AAAA,EACjC;AAGA,QAAM,QAAQ,SAAS,IAAI,CAAC,GAAG,QAAQ,WAAW,GAAG,KAAK,OAAO,UAAU,aAAa,CAAC;AAGzF,QAAM,KAAK,SAAS,kBAAkB,YAAY,KAAK;AACvD,QAAM,MAAM,YAAY,SAAS,KAAK,aAAa,WAAW,IAAI;AAClE,MAAI,OAAO,IAAI,MAAM,QAAU,OAAM,KAAgC,YAAY,IAAI;AACrF,QAAM,MAAM,SAAS,KAAK,aAAa,KAAK,CAAC;AAC7C,QAAM,UAAU,SAAS,KAAK,aAAa,SAAS,CAAC,KAAK,SAAS,KAAK,aAAa,SAAS,CAAC;AAC/F,MAAI,OAAO,QAAS,OAAM,KAAK,UAAU,EAAE,MAAM,KAAK,MAAM,QAAA;AAC5D,QAAM,WAAW,KAAK,aAAa,QAAQ;AAC3C,MAAI,YAAY,SAAS,MAAM,MAAQ,OAAM,KAA6B,SAAS,SAAS;AAAA,WACnF,YAAY,SAAS,MAAM,QAAU,OAAM,KAA6B,SAAS,SAAS;AAGnG,MAAI,mBAAmB,gBAAgB,QAAQ;AAC7C,UAAM,YAAY;AAClB,mBAAe,KAAK;AAAA,EACtB;AAEA,cAAY,KAAK;AAEjB,SAAO,EAAE,OAAO,aAAa,MAAA;AAC/B;AAIA,SAAS,SAAS,IAAoB;AACpC,SAAO;AACT;AAEA,SAAS,eAAe,IAAwB;AAC9C,QAAM,MAAM,CAAC,GAAG,GAAG,OAAO;AAC1B,aAAW,KAAK,GAAG,OAAO;AACxB,QAAI,EAAE,QAAQ,WAAW,EAAE,MAAM,MAAM,QAAS,KAAI,KAAK,EAAE,MAAM,CAAC;AAClE,QAAI,EAAE,QAAQ,WAAW,EAAE,MAAM,MAAM,QAAS,KAAI,KAAK,EAAE,MAAM,CAAC;AAClE,QAAI,EAAE,QAAQ,WAAW,EAAE,MAAM,MAAM,QAAS,KAAI,KAAK,EAAE,MAAM,CAAC;AAAA,EACpE;AACA,SAAO;AACT;AAEA,SAAS,YAAY,IAAwB;AAC3C,QAAM,OAAiB,CAAA;AACvB,QAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,MAAM;AAC/C,MAAI,KAAK,EAAE,MAAM,MAAM,QAAQ;AAC7B,eAAW,KAAK,EAAE,MAAM,EAAG,KAAI,EAAE,MAAM,QAAS,MAAK,KAAK,EAAE,CAAC;AAAA,EAC/D;AACA,SAAO;AACT;AAaA,SAAS,eAAe,OAAkB,QAA4B,OAAoC;AACxG,QAAM,QAA4B,CAAA;AAClC,QAAM,MAAiB,EAAE,MAAA;AACzB,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,EAAE;AACZ,YAAQ,EAAE,KAAA;AAAA,MACR,KAAK;AAAA,MACL,KAAK,SAAS;AACZ,cAAM,IAAI,aAAa,GAAG,QAAQ,QAAQ;AAC1C,YAAI,SAAS,SAAS;AACtB;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,cAAc;AACjB,cAAM,IAAI,aAAa,GAAG,QAAQ,MAAM;AACxC,cAAM,OAAO;AACb;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,KAAK,aAAa,CAAC;AACzB,YAAI,UAAU,YAAY;AAC1B;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,IAAI,eAAe,CAAC;AAC1B,YAAI,KAAK,KAAM,OAAM,cAAc;AACnC;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,KAAK,eAAe,CAAC;AAC3B,YAAI,UAAU,cAAc;AAC5B;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,cAAMA,KAAI,aAAa,CAAC;AACxB,YAAIA,MAAK,KAAM,OAAM,YAAYA;AACjC;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACH,YAAI,EAAE,MAAM,MAAO,OAAM,YAAY,EAAE;AACvC;AAAA,MACF,KAAK;AACH,YAAI,EAAE,MAAM,QAAS,OAAM,aAAa,SAAS,EAAE,CAAC,KAAK;AACzD;AAAA,MACF,KAAK;AACH,YAAI,EAAE,MAAM,MAAO,OAAM,WAAW,EAAE;AACtC;AAAA,MACF,KAAK,aAAa;AAChB,cAAM,IAAI,aAAa,GAAG,QAAQ,QAAQ;AAC1C,YAAI,SAAS,YAAY;AACzB;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,EAAE,MAAM,QAAS,OAAM,YAAY,EAAE;AACzC;AAAA,MACF,KAAK;AACH,YAAI,EAAE,MAAM,MAAO,OAAM,UAAU,EAAE,SAAS,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,IAAI,MAAM,EAAE;AACnF;AAAA,MACF,KAAK;AACH,YAAI,EAAE,MAAM,QAAS,KAAI,QAAQ,EAAE;AAAA,iBAC1B,EAAE,MAAM,UAAU,EAAE,SAAS,SAAU,KAAI,QAAQ,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE;AAC/G;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,EAAE,MAAM,MAAO,KAAI,QAAQ,EAAE;AACjC;AAAA,MACF,KAAK;AACH,YAAI,EAAE,MAAM,WAAW,EAAE,EAAE,CAAC,GAAG,MAAM,SAAS,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO;AACjE,cAAI,IAAI,EAAE,EAAE,CAAC,EAAE;AACf,cAAI,IAAI,EAAE,EAAE,CAAC,EAAE;AAAA,QACjB;AACA;AAAA,MACF,KAAK;AACH,YAAI,EAAE,MAAM,OAAQ,KAAI,SAAS,EAAE;AACnC;AAAA,MACF,KAAK;AACH,YAAI,EAAE,MAAM,WAAW,EAAE,EAAE,CAAC,GAAG,MAAM,SAAS,EAAE,EAAE,CAAC,GAAG,MAAM,OAAO;AACjE,cAAI,IAAI,EAAE,EAAE,CAAC,EAAE;AACf,cAAI,IAAI,EAAE,EAAE,CAAC,EAAE;AAAA,QACjB;AACA;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,EAAE,MAAM,MAAO,KAAI,IAAI,EAAE;AAC7B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,YAAI,EAAE,MAAM,MAAO,KAAI,IAAI,EAAE;AAC7B;AAAA,IAAA;AAAA,EAEN;AACA,MAAI,IAAI,WAAW,UAAa,IAAI,KAAK,UAAU,SAAS;AAC5D,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAkB,QAAgD;AACzF,QAAM,QAA4B,CAAA;AAClC,QAAM,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,YAAY,EAAE,QAAQ,OAAO;AACxE,MAAI,QAAQ;AACV,UAAM,IAAI,aAAa,OAAO,OAAO,QAAQ,QAAQ;AACrD,QAAI,SAAS,SAAS;AAAA,EACxB;AACA,QAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,UAAU,EAAE,QAAQ,IAAI;AACjE,MAAI,KAAM,OAAM,OAAO,aAAa,KAAK,OAAO,QAAQ,MAAM;AAC9D,SAAO;AACT;AAOA,SAAS,eACP,IACA,OACA,QACA,OACW;AACX,QAAM,QAA4B;AAAA,IAChC,aAAa,GAAG;AAAA,IAChB,gBAAgB,GAAG;AAAA,IACnB,cAAc,GAAG;AAAA,EAAA;AAEnB,MAAI,GAAG,UAAW,OAAM,YAAY,GAAG;AACvC,MAAI,GAAG,eAAgB,OAAM,cAAc,MAAM,GAAG;AACpD,MAAI;AACJ,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,EAAE;AACZ,YAAQ,EAAE,KAAA;AAAA,MACR,KAAK;AAAA,MACL,KAAK,SAAS;AACZ,cAAM,IAAI,aAAa,GAAG,QAAQ,QAAQ;AAC1C,YAAI,SAAS,SAAS;AACtB;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,IAAI,eAAe,CAAC;AAC1B,YAAI,KAAK,KAAM,OAAM,cAAc;AACnC;AAAA,MACF;AAAA,MACA,KAAK,eAAe;AAClB,cAAM,KAAK,eAAe,CAAC;AAC3B,YAAI,UAAU,cAAc;AAC5B;AAAA,MACF;AAAA,MACA,KAAK,aAAa;AAChB,cAAMA,KAAI,aAAa,CAAC;AACxB,YAAIA,MAAK,KAAM,OAAM,YAAYA;AACjC;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,kBAAkB;AACrB,cAAM,KAAK,aAAa,CAAC;AACzB,YAAI,UAAU,iBAAiB;AAC/B;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,gBAAgB;AACnB,cAAM,KAAK,aAAa,CAAC;AACzB,YAAI,UAAU,eAAe;AAC7B;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,aAAa;AAChB,cAAM,KAAK,aAAa,CAAC;AACzB,YAAI,IAAI;AACN,gBAAM,YAAY,GAAG;AACrB,cAAI,GAAG,MAAO,OAAM,iBAAiB,GAAG;AAAA,QAC1C;AACA;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK,WAAW;AACd,cAAMA,KAAI,WAAW,CAAC;AACtB,YAAIA,GAAG,WAAUA;AACjB;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,EAAE,MAAM,MAAO,OAAM,UAAU,EAAE,SAAS,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,IAAI,MAAM,EAAE;AACnF;AAAA,MACF,KAAK;AACH,YAAI,EAAE,MAAM,MAAO,OAAM,WAAW,EAAE;AACtC;AAAA,MACF,KAAK,aAAa;AAChB,cAAM,IAAI,aAAa,GAAG,QAAQ,QAAQ;AAC1C,YAAI,SAAS,YAAY;AACzB;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,IAAI,aAAa,GAAG,QAAQ,MAAM;AACxC,cAAM,UAAU;AAChB;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AACA,SAAO,EAAE,OAAO,QAAA;AAClB;AAEA,SAAS,eAAe,GAAiC;AACvD,MAAI,EAAE,GAAI,QAAO,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACvC,MAAI,EAAE,OAAO,EAAE,QAAQ,WAAW,EAAE,QAAQ,OAAQ,QAAO,EAAE;AAC7D,SAAO;AACT;AAEA,SAAS,aACP,OACA,IACA,QACA,MACA,UACM;AACN,MAAI,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,EAAG;AAC7C,QAAM,UAAU,SAAS,QAAQ,GAAG,SAAS,GAAG,KAAK;AACrD,QAAM,QAAQ,eAAe,SAAS,MAAY;AAClD,QAAM,MAAM;AAAA,IACV,SAAS;AAAA,MACP,IAAI,GAAG;AAAA,MACP,OAAO,SAAS,MAAM,SAAS,GAAG,KAAK;AAAA,MACvC,OAAO,MAAM,SAAS,GAAG,SAAS,GAAG;AAAA,MACrC,OAAO,MAAM;AAAA,MACb,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,QAAQ,MAAM;AAAA,MACd;AAAA,IAAA,CACD;AAAA,EAAA;AAEL;AAEA,SAAS,UAAU,OAAc,OAAkB,QAAkC;AACnF,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAO,OAAM,KAAK,QAAQ,EAAE,MAAM;AACzE,QAAI,EAAE,QAAQ,gBAAgB,EAAE,QAAQ,MAAM;AAC5C,YAAM,IAAI,aAAa,EAAE,OAAO,QAAQ,MAAM;AAC9C,UAAI,EAAG,OAAM,KAAK,aAAa;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,MAA0B,OAA0B;AAC7E,MAAI,CAAC,MAAM;AAET,UAAM,cAAc,MAAM,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM;AACrD,WAAO,cAAc,QAAQ;AAAA,EAC/B;AACA,QAAM,MAAkC;AAAA,IACtC,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA;AAEV,SAAO,IAAI,IAAI,KAAK;AACtB;AAIA,SAAS,aAAa,GAAU,QAAqC;AACnE,UAAQ,EAAE,GAAA;AAAA,IACR,KAAK;AACH,aAAO,EAAE;AAAA,IACX,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE;AAAA,IACX,KAAK;AACH,aAAO,EAAE;AAAA,IACX,KAAK,SAAS;AACZ,YAAM,IAAI,OAAO,IAAI,EAAE,CAAC;AACxB,aAAO,IAAI,aAAa,GAAG,MAAM,IAAI;AAAA,IACvC;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE,EAAE,IAAI,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AAAA,IAC/C;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,6BAA6B,GAA2C;AAC/E,MAAI,CAAC,EAAG,QAAO,EAAE,KAAK,KAAA;AACtB,SAAO,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,IAAA;AAC9B;AAEO,SAAS,kBAAkB,KAAoB,QAA4B,QAA8C;AAC9H,QAAM,YAAY,IAAI,MAAM,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO;AACzD,QAAM,aAAa,YAAa,aAAa,UAAU,OAAO,QAAQ,QAAQ,KAAK,OAAO,aAAa,UAAU,OAAO,MAAM,CAAC,IAAK;AACpI,QAAM,UAAmC,CAAA;AACzC,aAAW,KAAK,IAAI,OAAO;AACzB,QAAI,EAAE,QAAQ,QAAS;AACvB,YAAQ,EAAE,GAAG,IAAI,aAAa,EAAE,OAAO,MAAM;AAAA,EAC/C;AAEA,MAAI;AACJ,MAAI,IAAI,cAAc,IAAI,WAAW,MAAM,QAAQ;AACjD,cAAU,IAAI,WAAW,EAAE,IAAI,CAAC,MAAO,EAAE,MAAM,UAAU,EAAE,IAAI,EAAE,MAAM,QAAQ,EAAE,KAAK,EAAG,EAAE,OAAO,OAAO;AACzG,YAAQ,UAAU;AAAA,EACpB;AACA,QAAM,SAAS,IAAI,aAAa,EAAE,KAAK,UAAU,CAAC,KAAK,KAAA,IAAS,6BAA6B,IAAI,MAAM;AACvG,QAAM,eAAe,IAAI,SAAS,cAAc,cAAc,MAAS,IAAI,IAAI,SAAS,cAAc,YAAY;AAClH,SAAO;AAAA,IACL,IAAI,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI;AAAA,IACpC,MAAM,IAAI;AAAA,IACV;AAAA,IACA,MAAM,IAAI;AAAA,IACV,OAAO,cAAc;AAAA,IACrB;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EAAA;AAEJ;AAIA,SAAS,iBAAiB,GAAU,OAAwB;AAC1D,UAAQ,EAAE,GAAA;AAAA,IACR,KAAK,SAAS;AACZ,UAAI,EAAE,MAAM,MAAO,QAAO,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,GAAG,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC3F,UAAI,EAAE,MAAM,QAAS,QAAO,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE;AACvD,UAAI,EAAE,MAAM,QAAS,QAAO,MAAM,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE;AACvD,UAAI,EAAE,MAAM,SAAU,QAAO,MAAM,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE;AACzD,aAAO,CAAC,EAAE,CAAC;AAAA,IACb;AAAA,IACA,KAAK;AACH,aAAO,CAAC,EAAE,EAAE;AAAA,IACd,KAAK,SAAS;AACZ,YAAM,MAAM,EAAE;AACd,aAAO,MAAM,MACV,OAAO,CAAC,MAAM;AACb,cAAM,IAAK,EAAE,QAAQ,CAAA;AACrB,eAAO,EAAE,SAAS,SAAS,GAAG,KAAK,EAAE,MAAM,SAAS,GAAG;AAAA,MACzD,CAAC,EACA,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACpB;AAAA,IACA,KAAK;AACH,aAAO,EAAE,EAAE,QAAQ,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,CAAC,EAAE,CAAC;AAAA,IACb;AACE,aAAO,CAAA;AAAA,EAAC;AAEd;AAEA,SAAS,WAAW,GAAa,KAAa,OAAc,QAA4B,eAA4C;AAClI,QAAM,OAAa;AAAA,IACjB,IAAI,EAAE,MAAM,QAAQ,GAAG;AAAA,IACvB,MAAM,EAAE,SAAS,EAAE;AAAA,IACnB,aAAa,CAAA;AAAA,IACb,QAAQ,CAAA;AAAA,IACR,MAAM,CAAA;AAAA,EAAC;AAGT,aAAW,QAAQ,EAAE,OAAO;AAC1B,YAAQ,KAAK,MAAA;AAAA,MACX,KAAK;AACH,aAAK,SAAS,gBAAgB,MAAM,OAAO,QAAQ,aAAa;AAChE;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,KAAK,UAAU;AAC7B,gBAAM,IAAI,kBAAkB,GAAG,QAAQ,QAAQ;AAC/C,cAAI,EAAG,MAAK,YAAY,KAAK,CAAC;AAAA,QAChC;AACA;AAAA,MACF,KAAK,YAAY;AACf,cAAM,IAAI,kBAAkB,MAAM,QAAQ,QAAQ;AAClD,YAAI,EAAG,MAAK,YAAY,KAAK,CAAC;AAC9B;AAAA,MACF;AAAA,MACA,KAAK;AACH,mBAAW,KAAK,KAAK,SAAU,mBAAkB,GAAG,OAAO,IAAI;AAC/D;AAAA,MACF,KAAK;AACH,0BAAkB,MAAM,OAAO,IAAI;AACnC;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,KAAK,UAAU;AAC7B,cAAI,EAAE,SAAS,YAAa,mBAAkB,GAAG,OAAO,IAAI;AAAA,eACvD;AACH,kBAAM,IAAI,kBAAkB,GAAG,QAAQ,QAAQ;AAC/C,gBAAI,EAAG,MAAK,YAAY,KAAK,CAAC;AAAA,UAChC;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,QAAQ,aAAa,KAAK,MAAM,MAAM,MAAO,MAAK,UAAU,KAAK,MAAM;AAChF,aAAK,KAAK,QAAQ,UAAU,KAAK,QAAQ,WAAW,KAAK,MAAM,MAAM,OAAO;AAC1E,eAAK,gBAAgB,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,IAAI,MAAO,KAAK,MAAM;AAAA,QAClF;AACA;AAAA,IAAA;AAAA,EAEN;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,GAAuC,OAAc,MAAkB;AAChG,QAAM,MAAM,EAAE,QAAQ,QAAQ,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAC/D,MAAI,EAAE,SAAS,UAAU,EAAE,SAAS,cAAc,EAAE,SAAS,UAAU;AACrE,SAAK,KAAM,KAAK,GAAG,GAAG;AAAA,EACxB,OAAO;AACL,SAAK,OAAQ,KAAK,GAAG,GAAG;AAAA,EAC1B;AACF;AAEA,SAAS,gBAAgB,KAAoC,OAAc,SAA6B,eAAuD;AAC7J,QAAM,KAAM,IAAI,MAAM;AACtB,QAAM,YAA6B,EAAE,IAAI,eAAe,EAAE,EAAA;AAC1D,MAAI,IAAI,WAAW,IAAI,QAAQ,QAAQ;AACrC,cAAU,UAAU,IAAI,QAAQ,QAAQ,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAAA,EAC3E;AACA,MAAI,IAAI,QAAQ,KAAM,WAAU,OAAO,IAAI;AAC3C,MAAI,IAAI,OAAO,KAAM,WAAU,UAAU,IAAI;AAC7C,MAAI,IAAI,IAAK,WAAU,SAAS,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,EAAA;AAC7D,YAAU,SAAS,UAAU,IAAI,QAAQ,cAAc,WAAW;AAClE,MAAI,IAAI,QAAQ,KAAM,WAAU,aAAa,IAAI;AACjD,SAAO;AACT;AAEA,SAAS,eAAe,IAAmC;AACzD,UAAQ,IAAA;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EAAA;AAEb;ACnzBO,SAAS,WAAW,QAAkC;AAC3D,QAAM,EAAE,SAAS,gBAAgB,MAAM,MAAM;AAC7C,QAAM,EAAE,MAAA,IAAU,eAAe,SAAS,EAAE,aAAa;AACzD,QAAM,SAAS,YAAY,MAAM,IAAI,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACvE,SAAO,EAAE,OAAO,aAAa,OAAA;AAC/B;AChBO,MAAM,2BACX;ACMF,MAAMC,WAAS;AAGf,SAAS,kBAA0B;AACjC,QAAM,MAAM,OAAO,wBAAwB;AAC3C,SAAO;AAAA,+CACsC,GAAG;AAAA,2CACP,GAAG;AAC9C;AAUA,eAAsB,gBAAgB,UAAuB,OAAc,OAAsB,CAAA,GAAqB;AACpH,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,MAAM,WAAW,UAAU,KAAK,GAAG,OAAO;AAChD,QAAM,OAAO,WAAW,OAAO,SAAS,IAAI,IAAI,IAAI,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK,MAAM,KAAK;AAEpG,QAAM,QAAQ,SAAS,IAAI,UAAU,IAAI;AAEzC,QAAM,cAAc,YAAY,GAAG,gBAAgB,WAAW;AAC9D,QAAM,cAAc,mBAAmB,GAAG,OAAA;AAC1C,QAAM,iBAAiB,aAAa,EAAE,QAAQ,CAAC,OAAO,GAAG,QAAQ;AACjE,QAAM,aAAa,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE;AACvE,QAAM,aAAa,SAAS,OAAO,KAAK,CAAC,CAAC;AAC1C,QAAM,aAAa,UAAU,OAAO,KAAK,CAAC,CAAC;AAC3C,QAAM,MAAM,eAAe,UAAU;AACrC,QAAM,MAAM,eAAe,OAAO;AAClC,QAAM,MAAM,QAAQ;AACpB,QAAM,MAAM,SAAS;AAGrB,QAAM,KAAK,MAAM,cAAc,SAAS;AACxC,QAAM,UAAU,KAAK,eAAe,SAAY,MAAM,KAAK,cAAc,MAAM,MAAM,aAAa,KAAK;AACvG,MAAI,IAAI;AACN,QAAI,SAAS;AACX,SAAG,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AACnC,SAAG,aAAa,KAAK,OAAO,KAAK,CAAC,CAAC;AACnC,SAAG,aAAa,SAAS,OAAO,KAAK,CAAC,CAAC;AACvC,SAAG,aAAa,UAAU,OAAO,KAAK,CAAC,CAAC;AACxC,SAAG,aAAa,QAAQ,OAAO;AAAA,IACjC,OAAO;AACL,SAAG,OAAA;AAAA,IACL;AAAA,EACF;AAGA,MAAI,KAAK,cAAc,OAAO;AAC5B,UAAM,MAAM,gBAAA;AACZ,QAAI,KAAK;AACP,YAAM,QAAQ,SAAS,gBAAgBA,UAAQ,OAAO;AACtD,YAAM,cAAc;AACpB,YAAM,aAAa,OAAO,MAAM,UAAU;AAAA,IAC5C;AAAA,EACF;AAEA,QAAM,aAAa,SAASA,QAAM;AAClC,SAAO,6CAA6C,IAAI,gBAAgB,kBAAkB,KAAK;AACjG;AAEA,eAAsB,cAAc,UAAuB,OAAc,OAAsB,CAAA,GAAmB;AAChH,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,MAAM,MAAM,gBAAgB,UAAU,OAAO,EAAE,GAAG,MAAM,YAAY,KAAK,eAAe,SAAY,MAAM,MAAM,aAAa,KAAK,YAAY;AACpJ,QAAM,MAAM,WAAW,UAAU,KAAK,GAAG,KAAK,WAAW,EAAE;AAC3D,QAAM,OAAO,WAAW,OAAO,SAAS,IAAI,IAAI,IAAI,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,KAAK,MAAM,KAAK;AAEpG,QAAM,UAAU,IAAI,gBAAgB,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,gBAAA,CAAiB,CAAC;AAC9E,MAAI;AACF,UAAM,MAAM,MAAM,UAAU,OAAO;AACnC,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC;AACrD,WAAO,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC;AACtD,UAAM,MAAM,OAAO,WAAW,IAAI;AAClC,QAAI,UAAU,KAAK,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACpD,WAAO,MAAM,IAAI,QAAc,CAAC,SAAS,WAAW,OAAO,OAAO,CAAC,MAAO,IAAI,QAAQ,CAAC,IAAI,OAAO,IAAI,MAAM,eAAe,CAAC,GAAI,WAAW,CAAC;AAAA,EAC9I,UAAA;AACE,QAAI,gBAAgB,OAAO;AAAA,EAC7B;AACF;AAEA,SAAS,UAAU,KAAwC;AACzD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,IAAI,MAAA;AAChB,QAAI,SAAS,MAAM,QAAQ,GAAG;AAC9B,QAAI,UAAU;AACd,QAAI,MAAM;AAAA,EACZ,CAAC;AACH;AAEO,SAAS,SAAS,UAAkB,MAAqB,OAAO,cAAoB;AACzF,QAAM,OAAO,OAAO,SAAS,WAAW,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,KAAA,CAAM,IAAI;AACrE,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,IAAI,SAAS,cAAc,GAAG;AACpC,IAAE,OAAO;AACT,IAAE,WAAW;AACb,WAAS,KAAK,YAAY,CAAC;AAC3B,IAAE,MAAA;AACF,IAAE,OAAA;AACF,aAAW,MAAM,IAAI,gBAAgB,GAAG,GAAG,GAAI;AACjD;AAEA,eAAsB,YAAY,UAAuB,OAA6B;AACpF,QAAM,MAAM,MAAM,gBAAgB,UAAU,KAAK;AACjD,WAAS,GAAG,KAAK,KAAK,CAAC,QAAQ,KAAK,eAAe;AACrD;AAEA,eAAsB,YAAY,UAAuB,OAA6B;AACpF,QAAM,OAAO,MAAM,cAAc,UAAU,KAAK;AAChD,WAAS,GAAG,KAAK,KAAK,CAAC,QAAQ,IAAI;AACrC;AAEO,SAAS,aAAa,OAAoB;AAC/C,WAAS,GAAG,KAAK,KAAK,CAAC,SAAS,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,kBAAkB;AACpF;AAEA,SAAS,KAAK,OAAsB;AAClC,UAAQ,MAAM,KAAK,SAAS,aAAa,YAAA,EAAc,QAAQ,eAAe,GAAG,EAAE,QAAQ,UAAU,EAAE,KAAK;AAC9G;ACrHA,MAAM,mCAAmB,IAAA;AAElB,SAAS,cAAc,MAAc,IAAyB;AACnE,eAAa,IAAI,MAAM,EAAE;AAC3B;AAEO,SAAS,eAAe,MAA4C;AACzE,SAAO,aAAa,IAAI,IAAI;AAC9B;AAEO,SAAS,mBAA6B;AAC3C,SAAO,CAAC,GAAG,aAAa,MAAM;AAChC;AChBA,MAAMA,WAAS;AAGR,SAAS,iBAAiB,OAAkB,QAA0B;AAC3E,QAAM,OAAgB;AAAA,IACpB,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM;AAAA,IACjB,MAAM,MAAM;AAAA,IACZ,QAAQ;AAAA,IACR,kBAAkB;AAAA,EAAA;AAEpB,MAAI,UAAU,MAAM,QAAQ,MAAM,cAAc,QAAQ;AACtD,SAAK,OAAO,MAAM;AAClB,SAAK,YAAY,MAAM;AACvB,SAAK,aAAa,KAAK,IAAI,GAAG,MAAM,cAAc,GAAG;AACrD,SAAK,aAAa,KAAK,IAAI,GAAG,MAAM,WAAW,GAAG;AAClD,SAAK,eAAe;AAAA,EACtB;AACA,MAAI,MAAM,gBAAgB,eAAe,iBAAiB,CAAC,GAAG,CAAC;AAAA,WACtD,MAAM,gBAAgB,eAAe,iBAAiB,CAAC,KAAK,CAAC;AACtE,SAAO;AACT;AAIA,SAAS,gBAAgB,GAAW,GAAW,GAAW,GAAWD,IAAmB;AACtF,QAAM,KAAK,KAAK,IAAIA,IAAG,IAAI,GAAG,IAAI,CAAC;AACnC,SAAO;AAAA,IACL,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,IACf,IAAI,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,IACnB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE;AAAA,IACjC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,IACvB,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,IACzC,IAAI,IAAI,EAAE,IAAI,IAAI,CAAC;AAAA,IACnB,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,IACjC,IAAI,CAAC,IAAI,IAAI,EAAE;AAAA,IACf,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC;AAAA,IACzB;AAAA,EAAA,EACA,KAAK,GAAG;AACZ;AAEA,SAAS,aAAa,GAAW,GAAW,GAAW,GAAmB;AACxE,QAAM,OAAO,IAAI;AACjB,QAAM,OAAO,IAAI,IAAI;AACrB,SAAO;AAAA,IACL,IAAI,CAAC,IAAI,CAAC;AAAA,IACV,IAAI,IAAI,CAAC,IAAI,CAAC;AAAA,IACd,IAAI,IAAI,CAAC,IAAI,IAAI;AAAA,IACjB,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI;AAAA,IACvF;AAAA,EAAA,EACA,KAAK,GAAG;AACZ;AAEA,SAAS,UAAU,GAAW,GAAW,GAAW,GAA2C;AAC7F,QAAM,OAAO,KAAK,IAAI,GAAG,CAAC,IAAI;AAC9B,QAAM,OAAO;AAAA,IACX,IAAI,CAAC,IAAI,CAAC;AAAA,IACV,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,IACrB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;AAAA,IACrB,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,IAClB,IAAI,CAAC,IAAI,IAAI,CAAC;AAAA,IACd;AAAA,EAAA,EACA,KAAK,GAAG;AACV,QAAM,WAAW;AAAA,IACf,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,IACrB,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,IAC5B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI;AAAA,EAAA,EACrB,KAAK,GAAG;AACV,SAAO,EAAE,MAAM,MAAM,SAAA;AACvB;AAEA,SAAS,UAAU,GAAW,GAAW,GAAW,GAAmB;AAErE,QAAM,KAAK,IAAI,IAAI;AACnB,QAAM,IAAI,IAAI,IAAI;AAClB,QAAM,IAAI,IAAI,IAAI;AAClB,QAAM,IAAI,IAAI,IAAI;AAClB,QAAMA,KAAI,IAAI,IAAI;AAClB,SAAO;AAAA,IACL,IAAI,CAAC,IAAI,CAAC;AAAA,IACV,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,IACrF,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,IAChG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAG,IAAIA,KAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAAA,IAC9F,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAIA,EAAC,IAAI,CAAC;AAAA,IAC/D;AAAA,EAAA,EACA,KAAK,GAAG;AACZ;AAEA,SAAS,cAAc,KAAuD;AAC5E,SAAO;AACT;AAcO,SAAS,gBACd,IACA,OACA,MACA,OACa;AACb,QAAM,IAAI,SAAS,gBAAgBC,UAAQ,GAAG;AAC9C,QAAM,EAAE,GAAG,GAAG,GAAG,MAAM;AACvB,QAAM,aAAa,iBAAiB,OAAO,IAAI;AAC/C,QAAM,aAAa,iBAAiB,OAAO,KAAK;AAEhD,QAAM,MAAM,CAAC,OAAoB,EAAE,YAAY,EAAE;AAEjD,UAAQ,OAAA;AAAA,IACN,KAAK,aAAa;AAChB,UAAI,MAAM,aAAa,MAAM,YAAY,GAAG;AAC1C,YAAI,GAAG,KAAK,gBAAgB,GAAG,GAAG,GAAG,GAAG,MAAM,SAAS,GAAG,UAAU,CAAC;AAAA,MACvE,OAAO;AACL,YAAI,GAAG,UAAU,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC;AAAA,MAC1C;AACA;AAAA,IACF;AAAA,IACA,KAAK,mBAAmB;AACtB,UAAI,GAAG,KAAK,gBAAgB,GAAG,GAAG,GAAG,GAAG,MAAM,aAAa,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,UAAU,CAAC;AAC9F;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,UAAI,GAAG,KAAK,gBAAgB,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,UAAU,CAAC;AAC3D;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,UAAI,GAAG,QAAQ,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,UAAU,CAAC;AACtD;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,IAAI,KAAK,IAAI,GAAG,CAAC;AACvB,UAAI,GAAG,QAAQ,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,UAAU,CAAC;AACtD;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd;AAAA,QACE,GAAG;AAAA,UACD,cAAc;AAAA,YACZ,CAAC,IAAI,IAAI,GAAG,CAAC;AAAA,YACb,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,YACjB,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC;AAAA,YACjB,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,UAAA,CACd;AAAA,UACD;AAAA,QAAA;AAAA,MACF;AAEF;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf;AAAA,QACE,GAAG;AAAA,UACD,cAAc;AAAA,YACZ,CAAC,IAAI,IAAI,GAAG,CAAC;AAAA,YACb,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,YACb,CAAC,GAAG,IAAI,CAAC;AAAA,UAAA,CACV;AAAA,UACD;AAAA,QAAA;AAAA,MACF;AAEF;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,YAAM,KAAK,IAAI;AACf;AAAA,QACE,GAAG;AAAA,UACD,cAAc;AAAA,YACZ,CAAC,IAAI,IAAI,CAAC;AAAA,YACV,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,YACd,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC;AAAA,YACjB,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,YAClB,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,YACd,CAAC,GAAG,IAAI,IAAI,CAAC;AAAA,UAAA,CACd;AAAA,UACD;AAAA,QAAA;AAAA,MACF;AAEF;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,YAAM,KAAK,IAAI;AACf;AAAA,QACE,GAAG;AAAA,UACD,cAAc;AAAA,YACZ,CAAC,IAAI,IAAI,CAAC;AAAA,YACV,CAAC,IAAI,GAAG,CAAC;AAAA,YACT,CAAC,IAAI,IAAI,IAAI,IAAI,CAAC;AAAA,YAClB,CAAC,GAAG,IAAI,CAAC;AAAA,UAAA,CACV;AAAA,UACD;AAAA,QAAA;AAAA,MACF;AAEF;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,QAAQ,IAAI;AAClB;AAAA,QACE,GAAG;AAAA,UACD,cAAc;AAAA,YACZ,CAAC,IAAI,OAAO,CAAC;AAAA,YACb,CAAC,IAAI,IAAI,OAAO,CAAC;AAAA,YACjB,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,YACb,CAAC,GAAG,IAAI,CAAC;AAAA,UAAA,CACV;AAAA,UACD;AAAA,QAAA;AAAA,MACF;AAEF;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf,YAAM,KAAK,IAAI;AACf,YAAM,KAAK,KAAK,IAAI,IAAI,MAAM,EAAE;AAChC,YAAM,UAAU,IAAI;AACpB,YAAM,UAAU,IAAI,IAAI;AAExB,YAAM,OAAO;AAAA,QACX,IAAI,CAAC,IAAI,OAAO;AAAA,QAChB,IAAI,CAAC,IAAI,OAAO;AAAA,QAChB,IAAI,EAAE,IAAI,EAAE,UAAU,IAAI,CAAC,IAAI,OAAO;AAAA,QACtC,IAAI,IAAI,CAAC,IAAI,OAAO;AAAA,QACpB,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,OAAO;AAAA,QAClC;AAAA,MAAA,EACA,KAAK,GAAG;AACV,UAAI,GAAG,KAAK,MAAM,UAAU,CAAC;AAE7B,UAAI,GAAG,QAAQ,IAAI,IAAI,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,CAAC;AACzD;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,UAAI,GAAG,KAAK,UAAU,GAAG,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC;AAC9C;AAAA,IACF;AAAA,IACA,KAAK,YAAY;AACf,UAAI,GAAG,KAAK,aAAa,GAAG,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC;AACjD;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,EAAE,MAAM,SAAS,UAAU,GAAG,GAAG,GAAG,CAAC;AAC3C,UAAI,GAAG,KAAK,MAAM,UAAU,CAAC;AAC7B,UAAI,GAAG,KAAK,MAAM,UAAU,CAAC;AAC7B;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,KAAK,IAAI,IAAI;AACnB,YAAM,QAAQ,KAAK,IAAI,GAAG,CAAC,IAAI;AAC/B,YAAM,QAAQ,IAAI,QAAQ;AAC1B,YAAM,YAAY,QAAQ,QAAQ;AAClC,YAAM,OAAO,IAAI,IAAI;AACrB,YAAM,QAAQ,IAAI;AAClB,UAAI,GAAG,QAAQ,IAAI,OAAO,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC3D,UAAI,GAAG,KAAK,IAAI,WAAW,IAAI,MAAM,UAAU,CAAC;AAChD,UAAI,GAAG,KAAK,IAAI,IAAI,KAAK,YAAY,GAAG,IAAI,IAAI,KAAK,YAAY,GAAG,UAAU,CAAC;AAC/E,UAAI,GAAG,KAAK,IAAI,MAAM,IAAI,IAAI,MAAM,OAAO,UAAU,CAAC;AACtD,UAAI,GAAG,KAAK,IAAI,MAAM,IAAI,IAAI,MAAM,OAAO,UAAU,CAAC;AACtD;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AAEX;AAAA,IACF;AAAA,IACA,SAAS;AAEP,YAAM,SAAS,eAAe,KAAK;AACnC,UAAI,QAAQ;AACV,eAAO,OAAO,IAAI,MAAM,KAAK;AAAA,MAC/B;AAGA,UAAI,GAAG,KAAK,gBAAgB,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC;AACvD;AAAA,IACF;AAAA,EAAA;AAGF,SAAO;AACT;AAGO,SAAS,WAAW,OAA2B;AACpD,SAAO,UAAU,WAAW,UAAU;AACxC;AClSA,IAAI,aAAa;AAEV,SAAS,wBAA8B;AAC5C,MAAI,WAAY;AAChB,eAAa;AAGb,gBAAc,QAAQ,CAAC,IAAI,MAAM,UAAU;AACzC,UAAM,IAAI,SAAS,gBAAgB,8BAA8B,GAAG;AACpE,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI;AAC7B,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI;AAC7B,UAAM,QAAQ,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI;AACzC,UAAM,QAAQ,QAAQ;AACtB,UAAM,MAA0B,CAAA;AAChC,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAMD,KAAI,IAAI,MAAM,IAAI,QAAQ;AAChC,YAAM,IAAI,CAAC,KAAK,KAAK,IAAK,IAAI,KAAK,KAAM;AACzC,UAAI,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,IAAIA,IAAG,KAAK,KAAK,IAAI,CAAC,IAAIA,EAAC,CAAC;AAAA,IACvD;AACA,MAAE,YAAY,GAAG,QAAQ,KAAK,iBAAiB,OAAO,IAAI,CAAC,CAAC;AAC5D,WAAO;AAAA,EACT,CAAC;AACH;AAIA,sBAAA;ACfA,MAAMC,WAAS;AAER,SAAS,iBAAiB,OAA2B;AAC1D,QAAM,OAAgB;AAAA,IACpB,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,IACnB,WAAW,MAAM;AAAA,IACjB,MAAM,MAAM;AAAA,IACZ,QAAQ;AAAA,EAAA;AAEV,MAAI,MAAM,gBAAgB,eAAe,iBAAiB,CAAC,GAAG,CAAC;AAAA,WACtD,MAAM,gBAAgB,eAAe,iBAAiB,CAAC,KAAK,CAAC;AACtE,SAAO;AACT;AAGO,SAAS,iBAAiB,OAAc,MAAyC;AACtF,QAAM,WAAW,KAAK,KAAK,OAAO,QAAQ,OAAO,KAAK,KAAK,IAAI,IAAI;AACnE,QAAM,SAAS,KAAK,GAAG,OAAO,QAAQ,OAAO,KAAK,GAAG,IAAI,IAAI;AAE7D,QAAM,aAAa,WAAW,WAAW,SAAS,QAAQ,CAAC,IAAI,KAAK,KAAK,SAAS,EAAE,GAAG,GAAG,GAAG,EAAA;AAC7F,QAAM,WAAW,SAAS,WAAW,SAAS,MAAM,CAAC,IAAI,KAAK,GAAG,SAAS,EAAE,GAAG,GAAG,GAAG,EAAA;AAErF,MAAI,IAAW,WAAW,cAAc,UAAU,KAAK,KAAK,QAAQ,QAAQ,IAAI;AAChF,MAAI,IAAW,SAAS,cAAc,QAAQ,KAAK,GAAG,QAAQ,UAAU,IAAI;AAG5E,MAAI,aAAa,CAAC,KAAK,KAAK,UAAU,KAAK,KAAK,WAAW,QAAS,KAAI,cAAc,UAAU,QAAW,CAAC;AAC5G,MAAI,WAAW,CAAC,KAAK,GAAG,UAAU,KAAK,GAAG,WAAW,QAAS,KAAI,cAAc,QAAQ,QAAW,CAAC;AAEpG,SAAO,EAAE,GAAG,EAAA;AACd;AAGO,SAAS,YAAY,MAAiB,GAAU,GAAmB;AACxE,UAAQ,KAAK,SAAA;AAAA,IACX,KAAK;AACH,aAAO,CAAC,GAAG,CAAC;AAAA,IACd,KAAK,UAAU;AACb,YAAM,MAAa,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAA;AAC1D,YAAM,KAAK,EAAE,IAAI,EAAE;AACnB,YAAM,KAAK,EAAE,IAAI,EAAE;AACnB,YAAM,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK;AAClC,YAAM,KAAK,CAAC,KAAK;AACjB,YAAM,KAAK,KAAK;AAEhB,YAAM,MAAO,KAAK,MAAsE;AACxF,UAAI;AACJ,UAAI,OAAO,IAAI,QAAQ,GAAG;AACxB,eAAO,IAAI,SAAS,IAAI,QAAQ,KAAK,KAAK;AAAA,MAC5C,OAAO;AAEL,cAAM,KAAK,IAAI,IAAI,MAAM,IAAI;AAAA,MAC/B;AACA,aAAO,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,IAAI,KAAK,IAAA,GAAO,CAAC;AAAA,IAC5D;AAAA,IACA,KAAK;AAAA,IACL,KAAK,SAAS;AACZ,YAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7B,YAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AAE7B,YAAM,MACJ,KAAK,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,EAAE,EAAA,GAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAA,CAAG;AAC9I,aAAO,CAAC,GAAG,GAAG,KAAK,CAAC;AAAA,IACtB;AAAA,IACA;AACE,aAAO,CAAC,GAAG,CAAC;AAAA,EAAA;AAElB;AAGO,SAAS,eAAe,QAAiB,SAAuC;AACrF,MAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,MAAI,YAAY,YAAY,OAAO,WAAW,GAAG;AAC/C,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI;AAClB,WAAO,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;AAAA,EACpD;AACA,MAAI,YAAY,WAAW,OAAO,UAAU,GAAG;AAE7C,QAAI,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC;AACtC,UAAMD,KAAI;AACV,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,YAAM,IAAI,OAAO,CAAC;AAClB,YAAM,OAAO,OAAO,IAAI,CAAC;AACzB,YAAM,OAAO,OAAO,IAAI,CAAC;AACzB,YAAM,KAAK,KAAK,IAAI,MAAM,CAAC,CAAC;AAC5B,YAAM,KAAK,KAAK,IAAI,MAAM,CAAC,CAAC;AAC5B,YAAM,KAAK,EAAE,GAAG,EAAE,IAAI,GAAG,IAAIA,IAAG,GAAG,EAAE,IAAI,GAAG,IAAIA,GAAA;AAChD,YAAM,KAAK,EAAE,GAAG,EAAE,IAAI,GAAG,IAAIA,IAAG,GAAG,EAAE,IAAI,GAAG,IAAIA,GAAA;AAChD,WAAK,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,IACvD;AACA,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,SAAK,KAAK,KAAK,CAAC,IAAI,KAAK,CAAC;AAC1B,WAAO;AAAA,EACT;AACA,SAAO,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI;AAC3D;AAEA,SAAS,IAAI,GAAU,GAAiB;AACtC,SAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,EAAA;AACpC;AACA,SAAS,KAAK,GAAiB;AAC7B,QAAM,IAAI,KAAK,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK;AAClC,SAAO,EAAE,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,EAAA;AAChC;AAQA,SAAS,WAAW,OAAc,MAAiC;AACjE,QAAM,MAAM,KAAK;AACjB,MAAI,CAAC,OAAO,IAAI,SAAS,EAAG,QAAO;AACnC,MAAK,KAAK,MAA6C,SAAU,QAAO;AACxE,QAAM,WAAW,KAAK,KAAK,OAAO,QAAQ,OAAO,KAAK,KAAK,IAAI,IAAI;AACnE,QAAM,SAAS,KAAK,GAAG,OAAO,QAAQ,OAAO,KAAK,GAAG,IAAI,IAAI;AAC7D,QAAM,YAAY,IAAI,CAAC;AACvB,QAAM,WAAW,IAAI,IAAI,SAAS,CAAC;AACnC,QAAM,IAAI,WAAW,cAAc,UAAU,KAAK,KAAK,QAAQ,SAAS,IAAI,IAAI,CAAC;AACjF,QAAM,IAAI,SAAS,cAAc,QAAQ,KAAK,GAAG,QAAQ,QAAQ,IAAI,IAAI,IAAI,SAAS,CAAC;AACvF,SAAO,CAAC,GAAG,GAAG,IAAI,MAAM,GAAG,EAAE,GAAG,CAAC;AACnC;AAGA,SAAS,WAAW,QAAyB;AAC3C,MAAI,OAAO,SAAS,UAAU,MAAM,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,IAAI;AAChF,MAAI,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC;AACtC,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,UAAM,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO,CAAC;AACpC,UAAM,KAAK,OAAO,CAAC;AACnB,UAAM,KAAK,OAAO,IAAI,CAAC;AACvB,UAAM,KAAK,OAAO,IAAI,CAAC,KAAK;AAC5B,UAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACnC,UAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACnC,UAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACnC,UAAM,MAAM,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACnC,SAAK,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,EACpD;AACA,SAAO;AACT;AAGA,SAAS,SAAS,IAAc,QAAiB,MAAiB,QAA8B;AAC9F,QAAM,OAAO,iBAAiB,KAAK,KAAK;AACxC,MAAI,UAAU,OAAO,UAAU,GAAG;AAChC,WAAO,GAAG,MAAM,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAyB,IAAI;AAAA,EAC3E;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,GAAG,KAAK,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,IAAI;AAAA,EACzE;AACA,SAAO,GAAG,WAAW,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAyB,IAAI;AAChF;AAIA,SAAS,cACP,IACA,MACA,KACA,OACA,OACoB;AACpB,MAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO;AACrC,QAAM,OAAO,KAAK,MAAM,cAAc;AACtC,QAAM,OAAgB;AAAA,IACpB,QAAQ,MAAM;AAAA,IACd,aAAa,MAAM;AAAA,IACnB,WAAW,KAAK,IAAI,MAAM,WAAW,CAAC;AAAA,IACtC,MAAM,MAAM;AAAA,EAAA;AAEd,QAAM,aAAsB,EAAE,GAAG,MAAM,MAAM,MAAM,QAAQ,WAAW,QAAA;AACtE,QAAM,OAAO,CAACE,OAAc,YAA2B;AAAA,IACrD,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,MAAM,IAAIA;AAAA,IACtC,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,MAAM,IAAIA;AAAA,EAAA;AAExC,QAAM,QAAQ,CAACA,OAAc,YAA2B;AAAA,IACtD,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,MAAM,IAAIA;AAAA,IACtC,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,MAAM,IAAIA;AAAA,EAAA;AAGxC,UAAQ,MAAA;AAAA,IACN,KAAK,SAAS;AACZ,YAAM,KAAK,KAAK,MAAM,IAAI;AAC1B,YAAM,KAAK,MAAM,MAAM,IAAI;AAC3B,aAAO,GAAG;AAAA,QACR;AAAA,UACE,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,UACX,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,UACb,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,QAAA;AAAA,QAEb;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,KAAK,YAAY;AACf,YAAM,KAAK,KAAK,MAAM,IAAI;AAC1B,YAAM,KAAK,MAAM,MAAM,IAAI;AAC3B,aAAO,GAAG;AAAA,QACR;AAAA,UACE,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,UACb,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,UACX,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,QAAA;AAAA,QAEb;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,KAAK,oBAAoB;AACvB,YAAM,KAAK,KAAK,MAAM,IAAI;AAC1B,YAAM,KAAK,MAAM,MAAM,IAAI;AAC3B,aAAO,GAAG;AAAA,QACR;AAAA,UACE,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,UACb,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,UACX,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,QAAA;AAAA,QAEb;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,KAAK,OAAO;AACV,YAAM,KAAK;AAAA,QACT,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,OAAO;AAAA,QAClD,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,OAAO;AAAA,MAAA;AAEpD,YAAM,KAAK;AAAA,QACT,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,OAAO;AAAA,QAClD,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAI,OAAO;AAAA,MAAA;AAEpD,aAAO,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI;AAAA,IAC7C;AAAA,IACA,KAAK;AAAA,IACL,KAAK,UAAU;AACb,YAAMF,KAAI,OAAO;AACjB,YAAM,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,IAAIA,IAAG,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,IAAIA,GAAA;AACzE,aAAO,GAAG,OAAO,EAAE,GAAG,EAAE,GAAGA,KAAI,GAAG,SAAS,QAAQ,aAAa,IAAI;AAAA,IACtE;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAMA,KAAI,OAAO;AACjB,YAAM,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,IAAIA,IAAG,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,IAAIA,GAAA;AACzE,aAAO,GAAG,OAAO,EAAE,GAAG,EAAE,GAAGA,KAAI,GAAG,IAAI;AAAA,IACxC;AAAA,IACA,KAAK;AAAA,IACL,KAAK,mBAAmB;AACtB,YAAMA,KAAI,OAAO;AACjB,YAAM,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,IAAIA,IAAG,GAAG,IAAI,IAAI,KAAK,IAAI,KAAK,IAAIA,GAAA;AACzE,YAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,YAAM,MAA0B;AAAA,QAC9B,CAAC,IAAI,GAAG,IAAI,CAAC;AAAA,QACb,CAAC,EAAE,IAAI,KAAK,IAAI,IAAI,IAAIA,KAAI,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI,IAAIA,KAAI,GAAG;AAAA,QAC/D,CAAC,EAAE,IAAI,KAAK,IAAI,KAAK,IAAIA,IAAG,EAAE,IAAI,KAAK,IAAI,KAAK,IAAIA,EAAC;AAAA,QACrD,CAAC,EAAE,IAAI,KAAK,IAAI,IAAI,IAAIA,KAAI,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI,IAAIA,KAAI,GAAG;AAAA,MAAA;AAEjE,aAAO,GAAG,QAAQ,KAAK,SAAS,YAAY,aAAa,IAAI;AAAA,IAC/D;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,SAAS;AACf,YAAM,KAAK,KAAK,MAAM,MAAM;AAC5B,YAAM,KAAK,MAAM,MAAM,MAAM;AAC7B,YAAM,MAAM,KAAK,MAAM,CAAC;AACxB,YAAM,IAAI,SAAS,gBAAgBC,UAAQ,GAAG;AAC9C,QAAE,YAAY,GAAG,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AACrD,QAAE,YAAY,GAAG,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;AACrD,QAAE,YAAY,GAAG,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACvD,aAAO;AAAA,IACT;AAAA,IACA;AACE,aAAO;AAAA,EAAA;AAEb;AAEA,SAAS,QAAQ,MAAa,IAAmB;AAC/C,SAAO,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC;AAChD;AASA,SAAS,iBAAiB,MAAiB,YAAoB,KAAoC;AACjG,QAAM,OAAO,KAAK,MAAM;AACxB,MAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO;AACrC,QAAM,IAAI,SAAS,gBAAgBA,UAAQ,MAAM;AACjD,IAAE,aAAa,KAAK,UAAU;AAC9B,IAAE,aAAa,QAAQ,MAAM;AAC7B,IAAE,aAAa,SAAS,qBAAqB,IAAI,EAAE;AACnD,IAAE,aAAa,kBAAkB,MAAM;AACvC,QAAM,QAAQ,KAAK,MAAM,kBAAkB;AAC3C,QAAM,KAAK,KAAK,MAAM;AACtB,QAAM,SAAS,KAAK,MAAM;AAC1B,QAAM,QAAQ,EAAE;AAChB,QAAM,YAAY,aAAa,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC;AACnE,QAAM,YAAY,eAAe,OAAO,KAAK,CAAC;AAE9C,UAAQ,MAAA;AAAA,IACN,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,YAAY;AACf,QAAE,aAAa,UAAU,MAAM;AAC/B,QAAE,aAAa,gBAAgB,OAAO,MAAM,SAAS,aAAa,MAAM,IAAI,CAAC;AAC7E,YAAM,OAAO,SAAS,aAAa,QAAQ;AAC3C,QAAE,aAAa,oBAAoB,IAAI;AACvC,QAAE,aAAa,kBAAkB,OAAO;AACxC,YAAM,oBAAoB,IAAI,SAAS,aAAa,MAAM,OAAO,KAAK;AACtE;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,QAAE,aAAa,UAAU,MAAM;AAC/B,QAAE,aAAa,gBAAgB,OAAO,KAAK,GAAG,CAAC;AAC/C,QAAE,aAAa,kBAAkB,OAAO;AACxC,QAAE,aAAa,oBAAoB,OAAO,GAAG,CAAC;AAC9C,YAAM,YAAY,oBAAoB,OAAO,GAAG,CAAC;AACjD,YAAM,oBAAoB,GAAG,MAAM,KAAK;AACxC;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,QAAE,aAAa,UAAU,MAAM;AAC/B,QAAE,aAAa,gBAAgB,OAAO,KAAK,GAAG,CAAC;AAC/C,QAAE,aAAa,kBAAkB,OAAO;AACxC,YAAM,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI;AACnC,QAAE,aAAa,oBAAoB,GAAG,GAAG,IAAI,GAAG,EAAE;AAClD,QAAE,MAAM,SAAS;AACjB,QAAE,MAAM,QAAQ;AAChB,YAAM,oBAAoB,GAAG,MAAM,KAAK;AACxC;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,QAAE,aAAa,UAAU,MAAM;AAC/B,QAAE,aAAa,gBAAgB,OAAO,KAAK,GAAG,CAAC;AAC/C,YAAM,oBAAoB,GAAG,MAAM,KAAK;AACxC;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,QAAE,aAAa,UAAU,uBAAuB;AAChD,QAAE,aAAa,gBAAgB,OAAO,KAAK,GAAG,CAAC;AAC/C,QAAE,aAAa,kBAAkB,OAAO;AACxC,YAAM,oBAAoB,GAAG,MAAM,KAAK;AACxC;AAAA,IACF;AAAA,IACA;AACE,aAAO;AAAA,EAAA;AAEX,SAAO;AACT;AAWO,SAAS,WAAW,QAAyB;AAClD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,QAAO,KAAK,MAAM,OAAO,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;AACtH,SAAO;AACT;AAMO,SAAS,WAAW,IAAc,OAAc,MAA+B;AACpF,QAAM,IAAI,SAAS,gBAAgBA,UAAQ,GAAG;AAC9C,IAAE,aAAa,aAAa,KAAK,EAAE;AACnC,IAAE,aAAa,SAAS,UAAU;AAClC,IAAE,MAAM,UAAU,OAAO,KAAK,MAAM,UAAU,GAAG;AAGjD,QAAM,SAAS,WAAW,OAAO,IAAI;AACrC,MAAI;AACJ,MAAI;AACJ,MAAI,QAAQ;AACV,aAAS;AACT,aAAS;AAAA,EACX,OAAO;AACL,UAAM,EAAE,GAAG,EAAA,IAAM,iBAAiB,OAAO,IAAI;AAC7C,aAAS,YAAY,MAAM,GAAG,CAAC;AAC/B,aAAS,KAAK,YAAY,YAAY,OAAO,WAAW;AAAA,EAC1D;AACA,QAAM,aAAa,SAAS,WAAW,MAAM,IAAI,eAAe,QAAQ,KAAK,OAAO;AACpF,QAAM,MAAM,WAAW,MAAM;AAG7B,IAAE,YAAY,SAAS,IAAI,QAAQ,MAAM,MAAM,CAAC;AAGhD,QAAM,aAAa,QAAQ,OAAO,OAAO,SAAS,CAAC,GAAG,OAAO,OAAO,SAAS,CAAC,CAAC;AAC/E,QAAM,eAAe,QAAQ,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AACjD,QAAM,UAAU,cAAc,IAAI,KAAK,MAAM,cAAc,OAAO,OAAO,SAAS,CAAC,GAAG,YAAY,KAAK,KAAK;AAC5G,MAAI,QAAS,GAAE,YAAY,OAAO;AAClC,QAAM,YAAY,cAAc,IAAI,KAAK,MAAM,gBAAgB,OAAO,CAAC,GAAG,cAAc,KAAK,KAAK;AAClG,MAAI,UAAW,GAAE,YAAY,SAAS;AAGtC,QAAM,UAAU,iBAAiB,MAAM,YAAY,GAAG;AACtD,MAAI,QAAS,GAAE,YAAY,OAAO;AAElC,SAAO,EAAE,OAAO,GAAG,QAAQ,YAAY,QAAQ,IAAA;AACjD;AC9ZO,MAAM,cAAc;AAAA,EACzB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,cAKE,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAOxB,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6FtC,IAAI,WAAW;AACR,SAAS,mBAAmB,MAAgB,UAAgB;AACjE,MAAI,YAAY,IAAI,eAAe,mBAAmB,EAAG;AACzD,QAAM,QAAQ,IAAI,cAAc,OAAO;AACvC,QAAM,KAAK;AACX,QAAM,cAAc;AACpB,MAAI,KAAK,YAAY,KAAK;AAC1B,aAAW;AACb;AChHA,MAAM,SAAS;AAQR,MAAM,YAAY;AAAA,EACd;AAAA,EACT;AAAA,EACQ;AAAA,EACA;AAAA,EACR;AAAA,EACQ;AAAA,EACR;AAAA,EACQ;AAAA,EAEA,SAA0B,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,EAAA;AAAA,EAChD,WAAW,EAAE,GAAG,KAAK,GAAG,IAAA;AAAA,EACxB,QAAsB;AAAA,EAE9B,YAAY,WAAwB;AAClC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,QAAc;AACZ,0BAAA;AACA,uBAAmB,KAAK,UAAU,aAAa;AAC/C,UAAM,MAAM,KAAK,UAAU;AAC3B,UAAM,MAAM,IAAI,gBAAgB,QAAQ,KAAK;AAC7C,QAAI,aAAa,SAAS,YAAY;AACtC,QAAI,MAAM,WAAW;AACrB,QAAI,MAAM,QAAQ;AAClB,QAAI,MAAM,QAAQ;AAClB,QAAI,MAAM,SAAS;AACnB,QAAI,MAAM,UAAU;AACpB,QAAI,MAAM,aAAa;AACvB,QAAI,MAAM,cAAc;AACxB,SAAK,MAAM;AAEX,SAAK,OAAO,IAAI,gBAAgB,QAAQ,MAAM;AAC9C,SAAK,KAAK,YAAY,KAAK,WAAA;AAC3B,QAAI,YAAY,KAAK,IAAI;AAEzB,SAAK,KAAK,IAAI,gBAAgB,QAAQ,MAAM;AAC5C,SAAK,GAAG,aAAa,SAAS,QAAQ;AACtC,SAAK,GAAG,aAAa,KAAK,GAAG;AAC7B,SAAK,GAAG,aAAa,KAAK,GAAG;AAC7B,SAAK,GAAG,aAAa,SAAS,MAAM;AACpC,SAAK,GAAG,aAAa,UAAU,MAAM;AACrC,SAAK,GAAG,aAAa,QAAQ,SAAS;AACtC,QAAI,YAAY,KAAK,EAAE;AAEvB,SAAK,QAAQ,IAAI,gBAAgB,QAAQ,GAAG;AAC5C,SAAK,MAAM,aAAa,SAAS,WAAW;AAC5C,QAAI,YAAY,KAAK,KAAK;AAE1B,SAAK,SAAS,CAAA;AACd,eAAW,QAAQ,CAAC,QAAQ,UAAU,SAAS,SAAS,eAAe,MAAM,GAAG;AAC9E,YAAM,IAAI,IAAI,gBAAgB,QAAQ,GAAG;AACzC,QAAE,aAAa,SAAS,uBAAuB,IAAI,EAAE;AACrD,WAAK,MAAM,YAAY,CAAC;AACxB,WAAK,OAAO,IAAI,IAAI;AAAA,IACtB;AAEA,SAAK,cAAc,IAAI,gBAAgB,QAAQ,GAAG;AAClD,SAAK,YAAY,aAAa,SAAS,kBAAkB;AACzD,QAAI,YAAY,KAAK,WAAW;AAEhC,SAAK,KAAK,MAAM,IAAI,GAAG;AACvB,SAAK,UAAU,YAAY,GAAG;AAC9B,SAAK,QAAA;AACL,SAAK,YAAY,KAAK,MAAM;AAAA,EAC9B;AAAA,EAEA,UAAgB;AACd,SAAK,KAAK,OAAA;AAAA,EACZ;AAAA,EAEQ,aAAqB;AAC3B,WAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYT;AAAA;AAAA,EAGA,UAAoC;AAClC,UAAM,OAAO,KAAK,UAAU,sBAAA;AAC5B,SAAK,WAAW,EAAE,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK,GAAG,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,EAAA;AACxE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA4C;AAC1C,WAAO,EAAE,GAAG,KAAK,SAAA;AAAA,EACnB;AAAA,EAEA,YAA6B;AAC3B,WAAO,EAAE,GAAG,KAAK,OAAA;AAAA,EACnB;AAAA,EAEA,YAAY,KAA4B;AACtC,SAAK,SAAS;AACd,UAAM,EAAE,GAAG,EAAA,IAAM,KAAK;AACtB,UAAM,IAAI,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;AACzF,SAAK,MAAM,aAAa,aAAa,CAAC;AAAA,EACxC;AAAA,EAEA,cAAc,GAAiB;AAC7B,UAAM,EAAE,GAAG,EAAA,IAAM,KAAK;AACtB,WAAO;AAAA,MACL,IAAI,EAAE,IAAI,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,IAAI;AAAA,MACnD,IAAI,EAAE,IAAI,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,IAAI;AAAA,IAAA;AAAA,EAEvD;AAAA,EAEA,cAAc,GAAiB;AAC7B,UAAM,EAAE,GAAG,EAAA,IAAM,KAAK;AACtB,WAAO;AAAA,MACL,IAAI,EAAE,IAAI,IAAI,KAAK,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,MAClD,IAAI,EAAE,IAAI,IAAI,KAAK,KAAK,OAAO,OAAO,KAAK,OAAO;AAAA,IAAA;AAAA,EAEtD;AAAA,EAEA,SAAS,MAAmF;AAC1F,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAAA;AAAA,EAGA,gBAAgB,QAA2B;AACzC,UAAM,MAAM,KAAK,IAAI,iBAA8B,yBAAyB;AAC5E,QAAI,QAAQ,CAAC,OAAO;AAClB,YAAM,KAAK,GAAG,aAAa,WAAW,KAAK,GAAG,aAAa,WAAW;AACtE,UAAI,MAAM,OAAO,IAAI,EAAE,EAAG,IAAG,UAAU,IAAI,YAAY;AAAA,UAClD,IAAG,UAAU,OAAO,YAAY;AAAA,IACvC,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,OAAoB;AACzB,SAAK,QAAQ;AACb,SAAK,GAAG,aAAa,QAAQ,MAAM,KAAK,cAAc,MAAM,MAAM,UAAU;AAG5E,eAAW,QAAQ,CAAC,UAAU,SAAS,OAAO,EAAG,MAAK,OAAO,IAAI,EAAE,gBAAA;AAGnE,eAAW,SAAS,MAAM,QAAQ;AAChC,UAAI,CAAC,MAAM,MAAO;AAClB,YAAM,MAAM,KAAK,iBAAiB,OAAO,KAAK;AAC9C,UAAI,IAAK,MAAK,OAAO,OAAO,YAAY,GAAG;AAAA,IAC7C;AAGA,UAAM,QAAQ,CAAC,GAAG,MAAM,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AACvD,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,cAAMD,KAAI,WAAW,KAAK,IAAI,OAAO,IAAI;AACzC,YAAI,KAAK,MAAO,CAAAA,GAAE,MAAM,YAAY,KAAK,UAAU,OAAO,MAAMA,GAAE,MAAM,CAAC;AACzE,aAAK,OAAO,MAAM,YAAYA,GAAE,KAAK;AAAA,MACvC,SAAS,KAAK;AAEZ,gBAAQ,KAAK,sBAAsB,KAAK,IAAI,GAAG;AAAA,MACjD;AAAA,IACF;AAGA,UAAM,QAAQ,CAAC,GAAG,MAAM,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC;AACvD,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,aAAK,OAAO,MAAM,YAAY,KAAK,WAAW,OAAO,IAAI,CAAC;AAAA,MAC5D,SAAS,KAAK;AACZ,gBAAQ,KAAK,sBAAsB,KAAK,IAAI,GAAG;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,QAAe,MAA8B;AAC9D,UAAM,MAAM,KAAK,UAAU;AAC3B,UAAM,IAAI,IAAI,gBAAgB,QAAQ,GAAG;AACzC,MAAE,aAAa,aAAa,KAAK,EAAE;AACnC,MAAE,aAAa,SAAS,UAAU;AAClC,MAAE,MAAM,UAAU,OAAO,KAAK,MAAM,UAAU,GAAG;AAEjD,UAAM,OAAO,gBAAgB,KAAK,IAAI,KAAK,OAAO,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,KAAK,EAAA,GAAK,KAAK,KAAK;AAC5G,MAAE,YAAY,IAAI;AAElB,QAAI,KAAK,OAAO;AACd,YAAM,KAAK,KAAK,IAAI,KAAK,IAAI;AAC7B,YAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,YAAM,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,MAAM,WAAW,KAAK,IAAI,KAAK,IAAI;AAC7E,QAAE,YAAY,KAAK,UAAU,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,UAAU,KAAK,MAAM,WAAW,KAAK,MAAM,YAAY,KAAK,MAAM,SAAS,CAAC;AAAA,IAC1I;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,UACN,MACA,IACA,IACA,UACA,OACA,QACA,QAAyC,UACzB;AAChB,UAAM,MAAM,KAAK,UAAU;AAC3B,UAAM,IAAI,IAAI,gBAAgB,QAAQ,MAAM;AAC5C,UAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAM,aAAa,WAAW;AAC9B,UAAM,SAAS,UAAU,SAAS,UAAU,UAAU,UAAU,QAAQ;AACxE,MAAE,aAAa,eAAe,MAAM;AACpC,MAAE,aAAa,eAAe,YAAY,MAAM,CAAC;AACjD,MAAE,aAAa,aAAa,OAAO,QAAQ,CAAC;AAC5C,MAAE,aAAa,QAAQ,KAAK;AAC5B,MAAE,aAAa,qBAAqB,QAAQ;AAC5C,MAAE,MAAM,aAAa;AACrB,UAAM,SAAS,MAAO,MAAM,SAAS,KAAK,aAAc;AACxD,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAM,QAAQ,IAAI,gBAAgB,QAAQ,OAAO;AACjD,YAAM,aAAa,KAAK,OAAO,EAAE,CAAC;AAClC,YAAM,aAAa,KAAK,OAAO,SAAS,IAAI,UAAU,CAAC;AACvD,YAAM,cAAc;AACpB,QAAE,YAAY,KAAK;AAAA,IACrB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,OAAc,MAAoC,QAA8B;AAChG,UAAM,MAAM,KAAK,UAAU;AAC3B,UAAM,IAAI,IAAI,gBAAgB,QAAQ,GAAG;AAEzC,UAAM,MAAM,OAAO,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC,KAAK,OAAO,CAAC;AAC7D,UAAM,WAAW,KAAK,MAAM;AAC5B,UAAM,OAAO;AACb,UAAM,OAAO,KAAK,MAAM,SAAS,WAAW,OAAO,OAAO;AAC1D,QAAI,KAAK,MAAM,SAAS;AACtB,YAAM,OAAO,IAAI,gBAAgB,QAAQ,MAAM;AAC/C,WAAK,aAAa,KAAK,OAAO,IAAI,IAAI,OAAO,CAAC,CAAC;AAC/C,WAAK,aAAa,KAAK,OAAO,IAAI,IAAI,WAAW,IAAI,CAAC;AACtD,WAAK,aAAa,SAAS,OAAO,IAAI,CAAC;AACvC,WAAK,aAAa,UAAU,OAAO,WAAW,GAAG,CAAC;AAClD,WAAK,aAAa,MAAM,GAAG;AAC3B,WAAK,aAAa,QAAQ,KAAK,MAAM,OAAO;AAC5C,WAAK,aAAa,WAAW,MAAM;AACnC,QAAE,YAAY,IAAI;AAAA,IACpB;AACA,MAAE,YAAY,KAAK,UAAU,KAAK,OAAO,IAAI,GAAG,IAAI,GAAG,UAAU,KAAK,MAAM,WAAW,KAAK,MAAM,YAAY,QAAQ,CAAC;AACvH,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,OAAc,OAA0D;AAC/F,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,OAAO,UACT,OAAO,UACP,OAAO,WACP,OAAO;AACT,eAAW,MAAM,MAAM,SAAS;AAC9B,YAAM,IAAI,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC7C,UAAI,CAAC,EAAG;AACR,aAAO,KAAK,IAAI,MAAM,EAAE,CAAC;AACzB,aAAO,KAAK,IAAI,MAAM,EAAE,CAAC;AACzB,aAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;AAC/B,aAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;AAAA,IACjC;AACA,QAAI,CAAC,OAAO,SAAS,IAAI,EAAG,QAAO;AACnC,UAAM,MAAM;AACZ,UAAM,IAAI,IAAI,gBAAgB,QAAQ,GAAG;AACzC,MAAE,aAAa,cAAc,MAAM,EAAE;AACrC,UAAM,SAAS,MAAM,MAAM,UAAU;AACrC,UAAM,SAAS,KAAK,GAAG;AAAA,MACrB,IAAI,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,OAAO,OAAO,MAAM,CAAC,KAAK,OAAO,OAAO,MAAM,CAAC,KAAK,EAAE,OAAO,OAAO,MAAM,EAAE;AAAA,MAC7G,EAAE,QAAQ,aAAa,KAAK,WAAW,KAAK,MAAM,IAAI,gBAAgB,CAAC,GAAG,CAAC,GAAG,MAAM,MAAM,MAAM,QAAQ,QAAW,WAAW,QAAA;AAAA,IAAQ;AAExI,MAAE,YAAY,MAAM;AACpB,QAAI,MAAM,OAAO;AACf,QAAE,YAAY,KAAK,UAAU,MAAM,OAAO,OAAO,MAAM,GAAG,OAAO,MAAM,GAAG,IAAI,QAAQ,QAAQ,MAAM,CAAC;AAAA,IACvG;AACA,WAAO;AAAA,EACT;AACF;AC9RO,MAAM,eAAe;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAsB;AAAA,EACtB,QAAgB,CAAA;AAAA,EAChB,MAAM;AAAA,EACN,UAAU;AAAA,EACV;AAAA,EAER;AAAA,EAEA,YAAY,UAAuB,YAA8B,aAA8B;AAC7F,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,IAAI,cAAuB;AACzB,WAAO,KAAK,MAAM,SAAS;AAAA,EAC7B;AAAA,EAEA,KAAK,OAAoB;AACvB,SAAK,MAAA;AACL,SAAK,QAAQ;AACb,SAAK,QAAQ,MAAM,SAAS,CAAA;AAC5B,SAAK,MAAM;AAEX,SAAK,SAAS,gBAAgB,oBAAI,IAAA,CAAK;AACvC,SAAK,YAAY,OAAO,OAAO,MAAM,aAAa,KAAK;AACvD,SAAK,KAAA;AAAA,EACP;AAAA,EAEQ,OAAa;AACnB,UAAM,OAAO,KAAK,OAAO,IAAI,KAAK,MAAM,KAAK,GAAG,IAAI;AACpD,SAAK,WAAW;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK,MAAM;AAAA,MAClB,SAAS,MAAM,WAAW;AAAA,MAC1B,UAAU,MAAM,QAAQ;AAAA,MACxB,SAAS,KAAK;AAAA,IAAA,CACf;AAAA,EACH;AAAA;AAAA,EAGQ,cAAc,GAAwB;AAC5C,UAAM,6BAAa,IAAA;AACnB,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAM,OAAO,KAAK,MAAM,CAAC;AACzB,iBAAW,MAAM,KAAK,UAAU,CAAA,EAAI,QAAO,OAAO,EAAE;AACpD,iBAAW,MAAM,KAAK,QAAQ,CAAA,EAAI,QAAO,IAAI,EAAE;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,GAAW,UAAU,MAAqB;AACnD,QAAI,CAAC,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK,MAAM,OAAQ;AACpD,SAAK,MAAM;AACX,UAAM,OAAO,KAAK,MAAM,CAAC;AACzB,UAAM,QAAQ,KAAK;AAGnB,SAAK,SAAS,gBAAgB,KAAK,cAAc,CAAC,CAAC;AAGnD,SAAK,YAAY,OAAO,OAAO,CAAC,GAAG,MAAM,aAAa,GAAG,KAAK,WAAW,GAAG,OAAO;AAEnF,SAAK,KAAA;AAGL,QAAI,KAAK,QAAQ;AACf,YAAM,KAAK,UAAU,MAAM,OAAO;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,MAAY,SAAiC;AACnE,UAAM,QAAQ,KAAK;AACnB,UAAM,MAAM,KAAK;AACjB,UAAM,OAAO,EAAE,YAAY,UAAU,IAAI,aAAa,GAAG,QAAQ,IAAI,QAAQ,SAAS,IAAI,QAAA;AAC1F,YAAQ,IAAI,IAAA;AAAA,MACV,KAAK;AACH,cAAM,KAAK,WAAW,OAAO,OAAO,IAAI;AACxC;AAAA,MACF,KAAK;AACH,cAAM,KAAK,WAAW,MAAM,OAAO,IAAI,WAAW,CAAA,GAAI,EAAE,GAAG,MAAM,MAAM,IAAI,MAAM;AACjF;AAAA,MACF,KAAK,QAAQ;AACX,cAAM,MAAM,KAAK,WAAW;AAC5B,cAAM,KAAK,WAAW,UAAU,EAAE,GAAG,KAAK,MAAM,IAAI,QAAQ,IAAI,KAAA,GAAQ,IAAI;AAC5E;AAAA,MACF;AAAA,MACA,KAAK,OAAO;AACV,cAAM,MAAM,KAAK,WAAW;AAC5B,cAAM,KAAK,WAAW,UAAU,EAAE,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,IAAI,KAAA,GAAQ,IAAI;AAClH;AAAA,MACF;AAAA,MACA;AACE,cAAM,KAAK,WAAW,OAAO,OAAO,IAAI;AAAA,IAAA;AAAA,EAE9C;AAAA,EAEA,OAAa;AACX,QAAI,KAAK,MAAM,KAAK,MAAM,SAAS,EAAG,MAAK,KAAK,KAAK,KAAK,MAAM,CAAC;AAAA,EACnE;AAAA,EACA,OAAa;AACX,QAAI,KAAK,MAAM,EAAG,MAAK,KAAK,KAAK,KAAK,MAAM,CAAC;AAAA,aACpC,KAAK,QAAQ,GAAG;AACvB,WAAK,MAAM;AACX,WAAK,KAAK,KAAK,KAAM;AACrB,WAAK,KAAK,WAAW,OAAO,KAAK,KAAM;AAAA,IACzC;AAAA,EACF;AAAA,EACA,UAAgB;AACd,SAAK,MAAA;AACL,SAAK,KAAK,KAAK,CAAC;AAAA,EAClB;AAAA,EAEA,OAAa;AACX,QAAI,CAAC,KAAK,YAAa;AACvB,SAAK,UAAU;AACf,QAAI,KAAK,MAAM,EAAG,MAAK,KAAK,KAAK,CAAC,EAAE,KAAK,MAAM,KAAK,aAAA,CAAc;AAAA,cACxD,aAAA;AACV,SAAK,KAAA;AAAA,EACP;AAAA,EAEQ,eAAqB;AAC3B,WAAO,aAAa,KAAK,KAAK;AAC9B,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,KAAK,OAAO,KAAK,MAAM,SAAS,GAAG;AACrC,WAAK,UAAU;AACf,WAAK,KAAA;AACL;AAAA,IACF;AACA,UAAM,QAAQ,KAAK,MAAM,KAAK,GAAG,GAAG,iBAAiB;AACrD,SAAK,QAAQ,OAAO,WAAW,YAAY;AACzC,UAAI,CAAC,KAAK,QAAS;AACnB,YAAM,KAAK,KAAK,KAAK,MAAM,CAAC;AAC5B,WAAK,aAAA;AAAA,IACP,GAAG,KAAK;AAAA,EACV;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU;AACf,WAAO,aAAa,KAAK,KAAK;AAC9B,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,UAAgB;AACd,SAAK,MAAA;AAAA,EACP;AACF;ACzJA,IAAI,SAAyB;AAC7B,eAAe,aAA+B;AAC5C,MAAI,CAAC,QAAQ;AACX,UAAM,MAAM,MAAM,OAAO,mCAAmC;AAC5D,aAAS,IAAI;AAAA,EACf;AACA,SAAO;AACT;AAyBA,SAAS,SAAS,IAAgC;AAChD,UAAQ,GAAG,MAAA;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,GAAG,YAAY,oBAAoB;AAAA,IAC5C;AACE,aAAO;AAAA,EAAA;AAEb;AAGA,eAAsB,eAAe,YAAoB,OAAyB,SAAmC;AACnH,QAAMQ,SAAQ,MAAM,WAAA;AACpB,QAAM,EAAE,aAAa,MAAMA,OAAM,YAAY,EAAE,gBAAgB,EAAE,UAAU,OAAA,GAAU;AAErF,QAAM,QAAqB,CAAA;AAC3B,QAAM,QAAqB,CAAA;AAC3B,QAAM,8BAAc,IAAA;AAGpB,aAAW,MAAM,UAAU;AACzB,QAAI,GAAG,SAAS,WAAW,GAAG,SAAS,OAAQ;AAC/C,QAAI,GAAG,SAAS,UAAU,CAAC,GAAG,GAAI;AAClC,UAAM,KAAK,GAAG,MAAM,KAAK,MAAM,MAAM;AACrC,QAAI,QAAQ,IAAI,EAAE,EAAG;AACrB,UAAM,QAAQ,GAAG,OAAO,QAAQ,GAAG,QAAQ;AAC3C,UAAM,OAAO,SAAS;AAAA,MACpB;AAAA,MACA,OAAO,GAAG,SAAS,SAAS,SAAS,SAAS,EAAE;AAAA,MAChD;AAAA,MACA,GAAG,GAAG,KAAK;AAAA,MACX,GAAG,GAAG,KAAK;AAAA,MACX,GAAG,GAAG,SAAS,GAAG,QAAQ,IAAI,GAAG,QAAQ;AAAA,MACzC,GAAG,GAAG,UAAU,GAAG,SAAS,IAAI,GAAG,SAAS;AAAA,MAC5C,QAAQ;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,GAAI,GAAG,cAAc,EAAE,QAAQ,GAAG,YAAA,IAAgB,CAAA;AAAA,QAClD,GAAI,GAAG,mBAAmB,GAAG,oBAAoB,gBAAgB,EAAE,MAAM,GAAG,oBAAoB,CAAA;AAAA,MAAC;AAAA,MAEnG,MAAM,EAAE,QAAQ,UAAA;AAAA,IAAU,CAC3B;AACD,UAAM,KAAK,IAAI;AACf,YAAQ,IAAI,EAAE;AAAA,EAChB;AAGA,MAAI,MAAM;AACV,aAAW,MAAM,UAAU;AACzB,QAAI,GAAG,SAAS,WAAW,GAAG,SAAS,OAAQ;AAC/C,UAAM,OAAO,GAAG,OAAO;AACvB,UAAM,KAAK,GAAG,KAAK;AACnB,QAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAG;AAC5D,UAAM;AAAA,MACJ,SAAS;AAAA,QACP,IAAI,GAAG,MAAM,KAAK,KAAK,IAAI,IAAI,IAAI,EAAE;AAAA,QACrC;AAAA,QACA;AAAA,QACA,OAAO,GAAG,OAAO,QAAQ;AAAA,QACzB;AAAA,QACA,OAAO;AAAA,UACL,aAAa,GAAG,gBAAgB,WAAW,WAAW;AAAA,UACtD,aAAa,GAAG,gBAAgB,IAAI,MAAM;AAAA,UAC1C,cAAc,GAAG,SAAS,SAAS,SAAS;AAAA,QAAA;AAAA,QAE9C,MAAM,EAAE,QAAQ,UAAA;AAAA,MAAU,CAC3B;AAAA,IAAA;AAAA,EAEL;AAGA,MAAI,MAAM,QAAQ;AAChB,UAAM,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,UAAM,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9C,eAAW,KAAK,OAAO;AACrB,QAAE,KAAK,OAAO;AACd,QAAE,KAAK,OAAO;AAAA,IAChB;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAA;AAClB;AAOO,SAAS,cAAc,OAA0C,MAA6B;AACnG,aAAW,KAAK,KAAK,OAAO;AAC1B,UAAM,KAAK,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;AAChD,QAAI,IAAI;AACN,SAAG,IAAI,EAAE;AACT,SAAG,IAAI,EAAE;AACT,SAAG,IAAI,EAAE;AACT,SAAG,IAAI,EAAE;AACT,SAAG,SAAS;AACZ,UAAI,GAAG,UAAU,YAAa,IAAG,QAAQ,EAAE;AAC3C,UAAI,CAAC,GAAG,MAAO,IAAG,QAAQ,EAAE;AAAA,IAC9B,OAAO;AACL,YAAM,MAAM,KAAK,CAAC;AAAA,IACpB;AAAA,EACF;AACA,aAAW,KAAK,KAAK,OAAO;AAC1B,QAAI,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAG,OAAM,MAAM,KAAK,CAAC;AAAA,EACjE;AACF;AAGO,SAAS,qBAAqB,QAA0B;AAC7D,QAAM,SAAmB,CAAA;AACzB,QAAM,KAAK;AACX,MAAI;AACJ,UAAQ,IAAI,GAAG,KAAK,MAAM,OAAO,MAAM;AACrC,WAAO,KAAK,EAAE,CAAC,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,EACrC;AACA,SAAO;AACT;AC7HA,MAAM,aAAa,oBAAI,IAAY,CAAC,UAAU,QAAQ,QAAQ,WAAW,WAAW,QAAQ,OAAO,CAAC;AACpG,MAAM,YAAkC;AAAA,EACtC,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,OAAO;AAAA,EACP,MAAM;AACR;AAOO,MAAM,UAAU;AAAA,EACZ;AAAA,EACD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAA4B;AAAA,EAC5B;AAAA,EACA,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,gCAAgB,IAAA;AAAA,EAChB,YAAqC;AAAA,EACrC,aAAiD;AAAA,EACjD,UAA6B,CAAA;AAAA,EAErC,YAAY,WAAwB,UAA4B,IAAI;AAClE,SAAK,YAAY;AACjB,SAAK,OAAO;AAAA,MACV,aAAa,QAAQ,eAAe;AAAA,MACpC,MAAM,QAAQ,QAAQ;AAAA,MACtB,SAAS,QAAQ,WAAW;AAAA,MAC5B,SAAS,QAAQ,WAAW;AAAA,IAAA;AAE9B,QAAI,iBAAiB,SAAS,EAAE,aAAa,SAAU,WAAU,MAAM,WAAW;AAClF,cAAU,MAAM,WAAW;AAE3B,SAAK,WAAW,IAAI,YAAY,SAAS;AACzC,SAAK,SAAS,MAAA;AACd,SAAK,QAAQ,WAAW,UAAU,EAAE;AACpC,SAAK,aAAa,IAAI,iBAAiB,KAAK,QAAQ;AACpD,SAAK,cAAc,IAAI,gBAAgB,KAAK,QAAQ;AACpD,SAAK,SAAS,IAAI,eAAe,KAAK,UAAU,KAAK,YAAY,KAAK,WAAW;AACjF,SAAK,OAAO,IAAI,yBAAyB,KAAK,UAAU,MAAM,KAAK,KAAK;AACxE,SAAK,OAAO,IAAI,eAAe,KAAK,UAAU;AAAA,MAC5C,UAAU,MAAM,KAAK;AAAA,MACrB,WAAW,MAAM,KAAK;AAAA,MACtB,UAAU,CAAC,SAAS,KAAK,UAAU,IAAI;AAAA,MACvC,SAAS,CAAC,MAAM,KAAK,KAAK,aAAa,CAAC;AAAA,MACxC,iBAAiB,CAAC,IAAI,SAAS,WAAW,KAAK,gBAAgB,IAAI,SAAS,MAAM;AAAA,IAAA,CACnF;AAED,SAAK,OAAO,WAAW,CAAC,MAAM,KAAK,KAAK,SAAS,CAAC;AAClD,SAAK,KAAK,WAAW,CAAC,MAAM,KAAK,KAAK,QAAQ,CAAC;AAC/C,SAAK,KAAK,gBAAgB,CAAC,IAAI,UAAU,KAAK,cAAc,IAAI,KAAK;AACrE,SAAK,WAAW,UAAU,CAAC,QAAQ,KAAK,cAAc,GAAG;AACzD,QAAI,KAAK,KAAK,YAAa,MAAK,gBAAA;AAAA,EAClC;AAAA,EAEQ,cAAc,KAAqD;AACzE,QAAI,KAAK,KAAK,KAAM,MAAK,WAAW,GAAG;AACvC,SAAK,KAAK,OAAA;AAAA,EACZ;AAAA;AAAA;AAAA,EAIQ,UAAU,MAAoB;AACpC,SAAK,SAAS;AACd,SAAK,KAAK,QAAQ,IAAI;AAAA,EACxB;AAAA,EASA,GAAG,OAAmB,IAA0C;AAC9D,QAAI,CAAC,KAAK,UAAU,IAAI,KAAK,EAAG,MAAK,UAAU,IAAI,OAAO,oBAAI,IAAA,CAAK;AACnE,SAAK,UAAU,IAAI,KAAK,EAAG,IAAI,EAA0B;AACzD,WAAO,MAAM,KAAK,UAAU,IAAI,KAAK,GAAG,OAAO,EAA0B;AAAA,EAC3E;AAAA,EACQ,KAAK,OAAmB,SAAwB;AACtD,SAAK,UAAU,IAAI,KAAK,GAAG,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,OAAO,QAAuC;AAClD,SAAK,SAAS;AACd,UAAM,MAAM,EAAE,KAAK;AACnB,UAAM,EAAE,OAAO,gBAAgB,WAAW,MAAM;AAChD,QAAI,QAAQ,YAAY;AAExB,UAAM,SAAS,qBAAqB,MAAM;AAC1C,QAAI,OAAO,QAAQ;AACjB,cAAQ,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,gBAAgB;AACvD,iBAAW,QAAQ,QAAQ;AACzB,YAAI;AACF,wBAAc,OAAO,MAAM,eAAe,MAAM,MAAM,MAAM,IAAI,CAAC;AAAA,QACnE,SAAS,KAAK;AACZ,kBAAQ,CAAC,GAAG,OAAO,EAAE,UAAU,SAAS,MAAM,WAAW,SAAS,YAAa,IAAc,OAAO,IAAI,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,GAAG;AAAA,QAC7I;AAAA,MACF;AACA,UAAI,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,EAAG,OAAM,KAAK,SAAS;AAC5D,qBAAe,KAAK;AAAA,IACtB;AACA,QAAI,QAAQ,KAAK,kBAAkB,EAAE,OAAO,aAAa,MAAA;AAEzD,SAAK,QAAQ;AACb,SAAK,SAAS,OAAO,KAAK;AAC1B,SAAK,OAAO,KAAK,KAAK;AACtB,SAAK,SAAS,QAAA;AAGd,QAAI,KAAK,KAAK,YAAY,CAAC,KAAK,aAAa,KAAK,SAAU,MAAK,IAAI,KAAK;AAAA,QACrE,MAAK,WAAW,KAAK,WAAW,OAAO;AAC5C,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,SAAK,KAAK,OAAA;AACV,SAAK,KAAK,OAAA;AAEV,SAAK,KAAK,eAAe,KAAK;AAC9B,SAAK,KAAK,UAAU,EAAE,OAAO,aAAa,OAAO;AACjD,WAAO,EAAE,OAAO,aAAa,MAAA;AAAA,EAC/B;AAAA,EAEA,WAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,UAAU,MAAY;AACxB,SAAK,SAAS,QAAA;AACd,UAAM,MAAM,cAAc,UAAU,KAAK,KAAK,GAAG,KAAK,SAAS,gBAAA,GAAmB,EAAE,SAAS,KAAK,KAAK,SAAS;AAChH,QAAI,QAAS,MAAK,KAAK,WAAW,UAAU,GAAG;AAAA,QAC1C,MAAK,WAAW,aAAa,GAAG;AAAA,EACvC;AAAA,EACA,MAAM,KAAe,MAA2D;AAC9E,WAAO,KAAK,WAAW,MAAM,KAAK,OAAO,KAAK,IAAI;AAAA,EACpD;AAAA,EACA,OAAO,QAAsB;AAC3B,SAAK,WAAW,OAAO,MAAM;AAAA,EAC/B;AAAA,EACA,QAAc;AACZ,SAAK,IAAI,IAAI;AAAA,EACf;AAAA,EACA,IAAI,SAA2B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,OAAa;AACX,SAAK,OAAO,KAAA;AAAA,EACd;AAAA,EACA,QAAc;AACZ,SAAK,OAAO,MAAA;AAAA,EACd;AAAA,EACA,OAAa;AACX,SAAK,OAAO,KAAA;AAAA,EACd;AAAA,EACA,OAAa;AACX,SAAK,OAAO,KAAA;AAAA,EACd;AAAA,EACA,KAAK,GAAiB;AACpB,SAAK,KAAK,OAAO,KAAK,CAAC;AAAA,EACzB;AAAA,EACA,UAAgB;AACd,SAAK,OAAO,QAAA;AAAA,EACd;AAAA,EACA,IAAI,WAA2B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,MAAoB;AAC1B,QAAI,WAAW,IAAI,IAAI,GAAG;AACxB,WAAK,OAAO;AACZ,WAAK,KAAK,QAAQ,IAAgB;AAClC,WAAK,UAAU,MAAM,SAAS,SAAS,YAAY,SAAS,SAAS,SAAS;AAAA,IAChF,WAAW,QAAQ,WAAW;AAC5B,WAAK,OAAO;AACZ,WAAK,KAAK,eAAA;AACV,WAAK,KAAK,QAAQ,UAAU,IAAI,CAAC;AACjC,WAAK,UAAU,MAAM,SAAS;AAAA,IAChC;AAAA,EACF;AAAA;AAAA,EAEA,UAAgB;AACd,SAAK,UAAU;AAAA,EACjB;AAAA,EACA,IAAI,SAAyB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EACA,WAAW,IAAY,OAAiE;AACtF,SAAK,KAAK,WAAW,IAAI,KAAK;AAAA,EAChC;AAAA,EACA,iBAAuB;AACrB,SAAK,KAAK,eAAA;AAAA,EACZ;AAAA,EACA,iBAAuB;AACrB,SAAK,KAAK,sBAAA;AAAA,EACZ;AAAA;AAAA,EAGA,OAAa;AACX,SAAK,KAAK,KAAA;AAAA,EACZ;AAAA,EACA,OAAa;AACX,SAAK,KAAK,KAAA;AAAA,EACZ;AAAA,EACA,mBAAyB;AACvB,SAAK,KAAK,MAAA;AAAA,EACZ;AAAA;AAAA,EAEA,oBAA4B;AAC1B,WAAO,KAAK,KAAK,aAAA;AAAA,EACnB;AAAA,EACA,IAAI,YAAsC;AACxC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,QAAyB;AACvB,WAAO,gBAAgB,KAAK,UAAU,KAAK,KAAK;AAAA,EAClD;AAAA,EACA,QAAuB;AACrB,WAAO,cAAc,KAAK,UAAU,KAAK,KAAK;AAAA,EAChD;AAAA,EACA,SAAgB;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EACA,cAA6B;AAC3B,WAAO,YAAY,KAAK,UAAU,KAAK,KAAK;AAAA,EAC9C;AAAA,EACA,cAA6B;AAC3B,WAAO,YAAY,KAAK,UAAU,KAAK,KAAK;AAAA,EAC9C;AAAA,EACA,eAAqB;AACnB,iBAAa,KAAK,KAAK;AAAA,EACzB;AAAA;AAAA,EAGA,SAAe;AACb,SAAK,SAAS,QAAA;AACd,SAAK,SAAS,YAAY,KAAK,SAAS,WAAW;AACnD,SAAK,WAAW,KAAK,WAAW,OAAO;AAAA,EACzC;AAAA,EACA,UAAgB;AACd,eAAW,MAAM,KAAK,QAAS,IAAA;AAC/B,SAAK,UAAU,CAAA;AACf,SAAK,aAAa,KAAK;AACvB,SAAK,WAAW,OAAA;AAChB,SAAK,KAAK,QAAA;AACV,SAAK,OAAO,QAAA;AACZ,SAAK,SAAS,QAAA;AACd,SAAK,UAAU,MAAA;AAAA,EACjB;AAAA;AAAA,EAGQ,WAAW,KAAqD;AACtE,QAAI,CAAC,KAAK,KAAK,KAAM;AACrB,UAAM,EAAE,GAAG,EAAA,IAAM,KAAK,SAAS,gBAAA;AAC/B,UAAM,OAAO,KAAK,IAAI;AACtB,UAAM,IAAI,KAAK;AACf,QAAI,OAAO,GAAG;AACZ,QAAE,MAAM,kBAAkB;AAC1B;AAAA,IACF;AACA,MAAE,MAAM,kBAAkB;AAC1B,MAAE,MAAM,iBAAiB,GAAG,IAAI,MAAM,IAAI;AAC1C,MAAE,MAAM,qBAAqB,GAAG,CAAC,IAAI,KAAK,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,OAAO,IAAI,CAAC;AAAA,EAC5F;AAAA,EAEQ,WAAW,GAAgD;AACjE,UAAM,OAAO,KAAK,UAAU,sBAAA;AAC5B,WAAO,EAAE,GAAG,EAAE,UAAU,KAAK,MAAM,GAAG,EAAE,UAAU,KAAK,IAAA;AAAA,EACzD;AAAA,EAEQ,kBAAwB;AAC9B,UAAM,OAAO,KAAK;AAClB,UAAM,MAAM,CAAsC,GAAM,IAAyC,SAAmC;AAClI,WAAK,iBAAiB,GAAG,IAAqB,IAAI;AAClD,WAAK,QAAQ,KAAK,MAAM,KAAK,oBAAoB,GAAG,IAAqB,IAAI,CAAC;AAAA,IAChF;AAEA,UAAM,KAAK,IAAI,eAAe,MAAM,KAAK,QAAQ;AACjD,OAAG,QAAQ,IAAI;AACf,SAAK,QAAQ,KAAK,MAAM,GAAG,YAAY;AAEvC,QAAI,SAAS,CAAC,MAAM;AAClB,QAAE,eAAA;AACF,WAAK,OAAO,MAAA;AACZ,WAAK,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE,SAAS,KAAM,GAAG,KAAK,WAAW,CAAC,CAAC;AACvE,WAAK,KAAK,OAAA;AAAA,IACZ,GAAG,EAAE,SAAS,OAAO;AAErB,QAAI,WAAW;AACf,QAAI,KAAK;AACT,QAAI,KAAK;AACT,QAAI,eAAe,CAAC,MAAM;AACxB,UAAI,EAAE,WAAW,EAAG;AACpB,YAAM,QAAQ,KAAK,WAAW,CAAC;AAC/B,YAAM,QAAQ,KAAK,SAAS,cAAc,KAAK;AAC/C,YAAM,UAAU,KAAK,SAAS,SAAS,KAAK,KAAK,YAAY,OAAO,KAAK,IAAI,KAAK,KAAK,YAAY,OAAO,KAAK;AAC/G,UAAI,SAAS;AACX,aAAK,kBAAkB,EAAE,SAAS;AAClC;AAAA,MACF;AACA,iBAAW;AACX,WAAK,EAAE;AACP,WAAK,EAAE;AACP,WAAK,kBAAkB,EAAE,SAAS;AAClC,WAAK,MAAM,SAAS;AAAA,IACtB,CAAC;AACD,QAAI,eAAe,CAAC,MAAM;AACxB,YAAM,QAAQ,KAAK,SAAS,cAAc,KAAK,WAAW,CAAC,CAAC;AAC5D,UAAI,KAAK,SAAS,OAAQ,MAAK,KAAK,YAAY,KAAK;AAAA,UAChD,MAAK,KAAK,YAAY,KAAK;AAChC,UAAI,CAAC,SAAU;AACf,WAAK,OAAO,MAAA;AACZ,WAAK,WAAW,YAAY,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE;AAC1D,WAAK,EAAE;AACP,WAAK,EAAE;AACP,WAAK,KAAK,OAAA;AACV,WAAK,KAAK,OAAA;AAAA,IACZ,CAAC;AACD,QAAI,aAAa,CAAC,MAAM;AACtB,YAAM,QAAQ,KAAK,SAAS,cAAc,KAAK,WAAW,CAAC,CAAC;AAC5D,UAAI,KAAK,SAAS,OAAQ,MAAK,KAAK,UAAU,KAAK;AAAA,UAC9C,MAAK,KAAK,UAAU,KAAK;AAC9B,iBAAW;AACX,UAAI;AACF,aAAK,sBAAsB,EAAE,SAAS;AAAA,MACxC,QAAQ;AAAA,MAER;AACA,WAAK,MAAM,SAAS,KAAK,SAAS,WAAW,KAAK,KAAK,QAAA,MAAc,YAAY,KAAK,KAAK,QAAA,MAAc,UAAU,SAAS;AAAA,IAC9H,CAAC;AACD,QAAI,YAAY,CAAC,MAAM;AACrB,UAAI,KAAK,SAAS,OAAQ;AAC1B,WAAK,KAAK,SAAS,KAAK,SAAS,cAAc,KAAK,WAAW,CAAC,CAAC,CAAC;AAAA,IACpE,CAAC;AAED,UAAM,QAAQ,CAAC,MAAqB;AAClC,YAAM,MAAO,EAAE,QAAwB;AACvC,UAAI,QAAQ,WAAW,QAAQ,WAAY;AAC3C,UAAI,KAAK,SAAS,UAAU,KAAK,KAAK,UAAU,CAAC,GAAG;AAClD,UAAE,eAAA;AACF;AAAA,MACF;AACA,UAAI,KAAK,KAAK,UAAU,CAAC,KAAK,eAAA;AAAA,IAChC;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,SAAK,QAAQ,KAAK,MAAM,OAAO,oBAAoB,WAAW,KAAK,CAAC;AACpE,SAAK,MAAM,SAAS;AAAA,EACtB;AAAA;AAAA,EAGQ,gBAAgB,IAAY,SAAiB,QAAqB;AACxE,SAAK,gBAAgB;AAAA,MACnB,OAAO;AAAA,MACP,aAAa;AAAA,MACb;AAAA,MACA,OAAO,EAAE,YAAY,WAAW,OAAO,WAAW,WAAW,UAAU,QAAQ,MAAM,UAAU,OAAA;AAAA,MAC/F,UAAU,CAAC,MAAM,KAAK,KAAK,YAAY,IAAI,CAAC;AAAA,IAAA,CAC7C;AAAA,EACH;AAAA,EAEQ,cAAc,IAAY,OAAoB;AACpD,SAAK,gBAAgB;AAAA,MACnB,OAAO;AAAA,MACP,QAAQ,KAAK,SAAS,cAAc,KAAK;AAAA,MACzC,OAAO,EAAE,YAAY,WAAW,OAAO,WAAW,QAAQ,KAAA;AAAA,MAC1D,UAAU,CAAC,MAAM,KAAK,KAAK,QAAQ,IAAI,CAAC;AAAA,IAAA,CACzC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,gBAAgB,MAMf;AACP,SAAK,aAAa,KAAK;AACvB,UAAM,QAAQ,KAAK,UAAU,cAAc,cAAc,OAAO;AAChE,UAAM,QAAQ,KAAK;AACnB,QAAI,KAAK,YAAa,OAAM,cAAc,KAAK;AAC/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,QACE,UAAU;AAAA,QACV,MAAM,GAAG,KAAK,OAAO,CAAC;AAAA,QACtB,KAAK,GAAG,KAAK,OAAO,CAAC;AAAA,QACrB,WAAW;AAAA,QACX,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAAS;AAAA,MAAA;AAAA,MAEX,KAAK,SAAS,CAAA;AAAA,IAAC;AAEjB,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,WAAoB;AAClC,UAAI,QAAS;AACb,gBAAU;AACV,YAAM,oBAAoB,QAAQ,MAAM;AACxC,YAAM,QAAQ,MAAM;AACpB,UAAI,KAAK,eAAe,OAAQ,MAAK,aAAa;AAClD,UAAI,KAAK,cAAc,MAAO,MAAK,YAAY;AAC/C,UAAI,MAAM,WAAY,OAAM,WAAW,YAAY,KAAK;AACxD,UAAI,OAAQ,MAAK,SAAS,KAAK;AAAA,IACjC;AACA,UAAM,SAAS,MAAM,OAAO,IAAI;AAChC,UAAM,iBAAiB,WAAW,CAAC,MAAM;AACvC,QAAE,gBAAA;AACF,UAAI,EAAE,QAAQ,SAAS;AACrB,UAAE,eAAA;AACF,eAAO,IAAI;AAAA,MACb,WAAW,EAAE,QAAQ,UAAU;AAC7B,UAAE,eAAA;AACF,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AACD,UAAM,iBAAiB,QAAQ,MAAM;AACrC,SAAK,UAAU,YAAY,KAAK;AAChC,SAAK,YAAY;AACjB,SAAK,aAAa;AAClB,UAAM,MAAA;AACN,UAAM,OAAA;AAAA,EACR;AACF;"}