{
  "version": 3,
  "sources": ["../src/cli.ts", "../../src/contracts/animations.ts", "../../src/contracts/result.ts", "../../src/frontend/detect.ts", "../../src/frontend/preprocess.ts", "../../src/frontend/registry.ts", "../../src/render/registry.ts", "../../src/theme/preset.ts", "../../src/theme/resolver.ts", "../../src/frontend/frontmatter.ts", "../../src/icons/resolver.ts", "../../src/routing/registry.ts", "../../src/routing/router.ts", "../../src/overlay/compiler.ts", "../../src/overlay/layout.ts", "../../src/overlay/apply.ts", "../../src/scene/build.ts", "../../src/text/metrics.ts", "../../src/text/wrap.ts", "../../src/util/round.ts", "../../src/text/formatted.ts", "../../src/diagrams/mermaid/flowchart/layout.ts", "../../src/diagrams/mermaid/flowchart/parser.js", "../../src/diagrams/mermaid/flowchart/index.ts", "../../src/time/dates.ts", "../../src/palette/categorical.ts", "../../src/diagrams/mermaid/timeline/shared.ts", "../../src/diagrams/mermaid/timeline/vertical-spine.ts", "../../src/diagrams/mermaid/timeline/serpentine.ts", "../../src/diagrams/mermaid/timeline/roadmap.ts", "../../src/theme/contrast.ts", "../../src/diagrams/mermaid/timeline/timeline-columns.ts", "../../src/diagrams/mermaid/timeline/numbered.ts", "../../src/diagrams/mermaid/timeline/wave.ts", "../../src/diagrams/mermaid/timeline/layout.ts", "../../src/diagrams/mermaid/timeline/parser.js", "../../src/diagrams/mermaid/timeline/index.ts", "../../src/crosslink/markers.ts", "../../src/crosslink/render.ts", "../../src/crosslink/engine3.ts", "../../src/crosslink/connectors.ts", "../../src/diagrams/triton/ds/struct/shared.ts", "../../src/diagrams/triton/ds/struct/array.ts", "../../src/diagrams/triton/poster/layout.ts", "../../src/diagrams/triton/poster/parser.js", "../../src/diagrams/triton/poster/index.ts", "../../src/diagrams/mermaid/pie/layout.ts", "../../src/diagrams/mermaid/pie/parser.js", "../../src/diagrams/mermaid/pie/index.ts", "../../src/diagrams/mermaid/xychart/layout.ts", "../../src/diagrams/mermaid/xychart/parser.js", "../../src/diagrams/mermaid/xychart/index.ts", "../../src/diagrams/mermaid/quadrant/layout.ts", "../../src/diagrams/mermaid/quadrant/parser.js", "../../src/diagrams/mermaid/quadrant/index.ts", "../../src/diagrams/mermaid/radar/layout.ts", "../../src/diagrams/mermaid/radar/parser.js", "../../src/diagrams/mermaid/radar/index.ts", "../../src/diagrams/mermaid/gantt/layout.ts", "../../src/diagrams/mermaid/gantt/parser.js", "../../src/diagrams/mermaid/gantt/index.ts", "../../src/diagrams/mermaid/journey/layout.ts", "../../src/diagrams/mermaid/journey/parser.js", "../../src/diagrams/mermaid/journey/index.ts", "../../src/diagrams/mermaid/kanban/layout.ts", "../../src/diagrams/mermaid/kanban/parser.js", "../../src/diagrams/mermaid/kanban/index.ts", "../../src/diagrams/mermaid/sequence/layout.ts", "../../src/diagrams/mermaid/sequence/parser.js", "../../src/diagrams/mermaid/sequence/index.ts", "../../src/graph/connect.ts", "../../src/graph/layered.ts", "../../src/diagrams/mermaid/class/layout.ts", "../../src/diagrams/mermaid/class/parser.js", "../../src/diagrams/mermaid/class/index.ts", "../../src/diagrams/mermaid/state/layout.ts", "../../src/diagrams/mermaid/state/parser.js", "../../src/diagrams/mermaid/state/index.ts", "../../src/diagrams/mermaid/er/layout.ts", "../../src/diagrams/mermaid/er/parser.js", "../../src/diagrams/mermaid/er/index.ts", "../../src/diagrams/triton/block/layout.ts", "../../src/diagrams/triton/block/parser.js", "../../src/diagrams/triton/block/index.ts", "../../src/diagrams/mermaid/requirement/layout.ts", "../../src/diagrams/mermaid/requirement/parser.js", "../../src/diagrams/mermaid/requirement/index.ts", "../../src/diagrams/mermaid/sankey/layout.ts", "../../src/diagrams/mermaid/sankey/parser.js", "../../src/diagrams/mermaid/sankey/index.ts", "../../src/diagrams/mermaid/mindmap/layout.ts", "../../src/diagrams/mermaid/mindmap/parser.js", "../../src/diagrams/mermaid/mindmap/index.ts", "../../src/diagrams/mermaid/gitgraph/layout.ts", "../../src/diagrams/mermaid/gitgraph/parser.js", "../../src/diagrams/mermaid/gitgraph/index.ts", "../../src/diagrams/mermaid/c4/layout.ts", "../../src/diagrams/mermaid/c4/parser.js", "../../src/diagrams/mermaid/c4/index.ts", "../../src/diagrams/mermaid/architecture/gridPlacer.ts", "../../src/diagrams/mermaid/architecture/layout.ts", "../../src/diagrams/mermaid/architecture/parser.js", "../../src/diagrams/mermaid/architecture/index.ts", "../../src/diagrams/triton/packet/layout.ts", "../../src/diagrams/triton/packet/parser.js", "../../src/diagrams/triton/packet/index.ts", "../../src/graph/tree.ts", "../../src/diagrams/triton/ds/tree/layout.ts", "../../src/diagrams/triton/ds/tree/parser.js", "../../src/diagrams/triton/ds/tree/build.ts", "../../src/diagrams/triton/ds/tree/bplustree.ts", "../../src/diagrams/triton/ds/tree/merkletree.ts", "../../src/diagrams/triton/ds/tree/lsmtree.ts", "../../src/diagrams/triton/ds/tree/behaviortree.ts", "../../src/diagrams/triton/ds/tree/quadtree.ts", "../../src/diagrams/triton/ds/tree/treap.ts", "../../src/diagrams/triton/ds/tree/tree234.ts", "../../src/diagrams/triton/ds/tree/index.ts", "../../src/diagrams/triton/ds/tree/plan.ts", "../../src/diagrams/triton/ds/tree/avl.ts", "../../src/diagrams/triton/ds/tree/rbtree.ts", "../../src/diagrams/triton/ds/tree/btree.ts", "../../src/diagrams/triton/ds/tree/radix.ts", "../../src/diagrams/triton/ds/tree/segtree.ts", "../../src/diagrams/triton/ds/tree/heap.ts", "../../src/diagrams/triton/ds/struct/linkedlist.ts", "../../src/diagrams/triton/ds/struct/memory.ts", "../../src/diagrams/triton/ds/struct/page.ts", "../../src/scene/strip.ts", "../../src/diagrams/triton/ds/queue/shared.ts", "../../src/diagrams/triton/ds/queue/queue.ts", "../../src/diagrams/triton/ds/queue/cqueue.ts", "../../src/diagrams/triton/ds/queue/deque.ts", "../../src/diagrams/triton/ds/queue/pqueue.ts", "../../src/diagrams/triton/ds/stack/stack.ts", "../../src/diagrams/triton/ds/hashmap/hashmap.ts", "../../src/diagrams/triton/ds/matrix/matrix.ts", "../../src/diagrams/triton/ds/trie/trie.ts", "../../src/diagrams/triton/ds/graph/graph.ts", "../../src/diagrams/triton/ds/unionfind/unionfind.ts", "../../src/style/cost.ts", "../../src/diagrams/triton/topology/topology.ts", "../../src/diagrams/triton/deck/list/list.ts", "../../src/diagrams/triton/fishbone/parser.ts", "../../src/diagrams/triton/fishbone/layout.ts", "../../src/diagrams/triton/fishbone/index.ts", "../../src/diagrams/triton/pyramid/parser.ts", "../../src/diagrams/triton/pyramid/layout.ts", "../../src/diagrams/triton/pyramid/index.ts", "../../src/diagrams/triton/loop/parser.ts", "../../src/diagrams/triton/loop/layout.ts", "../../src/diagrams/triton/loop/index.ts", "../../src/theme/sourceSans3.generated.ts", "../../src/animation/index.ts", "../../src/render/svg.ts", "../../src/theme/validate.ts", "../../src/frontend/index.ts", "../src/pdf.ts", "../src/theme-resolve.ts", "../../src/theme/discover.ts", "../src/icon-resolve.ts", "../../src/icons/discover.ts", "../../src/icons/validate.ts"],
  "sourcesContent": ["/**\n * triton-latex \u2014 render Triton diagrams to vector PDF for LaTeX `\\includegraphics`.\n *\n * Commands:\n *   triton-latex render <input.triton|.mmd> -o <out.pdf|.svg> [--theme N] [--scale S]\n *   triton-latex render-dir <srcDir> -o <outDir> [--theme N] [--scale S]\n *\n * The CLI reuses the core compiler's `renderSync()` (SVG) and converts to vector\n * PDF via ./pdf.ts. It is editor-independent (no `vscode`) and never throws \u2014\n * core returns a Result, which we surface as a clean exit code + message.\n *\n * Core is imported by RELATIVE PATH (the repo has no package `main`/`exports`);\n * esbuild bundles the whole compiler graph in. The PDF toolchain stays external.\n */\n\nimport { readFileSync, writeFileSync, readdirSync, mkdirSync, statSync } from 'node:fs';\nimport { basename, dirname, extname, join, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { renderSync } from '../../src/frontend/index.js';\nimport type { ResolvedTheme } from '../../src/contracts/theme.js';\nimport type { IconPackMap } from '../../src/contracts/icons.js';\nimport { svgToPdf } from './pdf.js';\nimport { resolveCliTheme } from './theme-resolve.js';\nimport { resolveCliIcons } from './icon-resolve.js';\n\n// \u2500\u2500\u2500 Arg parsing (tiny, dependency-free) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface Args {\n  readonly command?: string;\n  readonly positionals: string[];\n  readonly out?: string;\n  readonly theme?: string;\n  readonly themeFile?: string;\n  readonly themesDir?: string;\n  readonly iconPack?: string;\n  readonly iconsDir?: string;\n  readonly scale: number;\n  readonly help: boolean;\n}\n\nfunction parseArgs(argv: string[]): Args {\n  const positionals: string[] = [];\n  let out: string | undefined;\n  let theme: string | undefined;\n  let themeFile: string | undefined;\n  let themesDir: string | undefined;\n  let iconPack: string | undefined;\n  let iconsDir: string | undefined;\n  let scale = 1;\n  let help = false;\n\n  for (let i = 0; i < argv.length; i++) {\n    const a = argv[i];\n    switch (a) {\n      case '-o':\n      case '--out':\n        out = argv[++i];\n        break;\n      case '--theme':\n        theme = argv[++i];\n        break;\n      case '--theme-file':\n        themeFile = argv[++i];\n        break;\n      case '--themes-dir':\n        themesDir = argv[++i];\n        break;\n      case '--icon-pack':\n        iconPack = argv[++i];\n        break;\n      case '--icons-dir':\n        iconsDir = argv[++i];\n        break;\n      case '--scale':\n        scale = Number(argv[++i]) || 1;\n        break;\n      case '-h':\n      case '--help':\n        help = true;\n        break;\n      default:\n        positionals.push(a);\n    }\n  }\n\n  return { command: positionals.shift(), positionals, out, theme, themeFile, themesDir, iconPack, iconsDir, scale, help };\n}\n\nconst USAGE = `triton-latex \u2014 render Triton diagrams to vector PDF for LaTeX.\n\nUsage:\n  triton-latex render <input.triton|.mmd> -o <out.pdf|.svg> [options]\n  triton-latex render-dir <srcDir> -o <outDir> [options]\n\nOptions:\n  -o, --out <path>          Output file (render) or output directory (render-dir).\n  --theme <name>            Theme preset name (default, executive, minimal, \u2026) or\n                            a name from the discovered/loaded custom theme registry.\n  --theme-file <path>       Path to a .triton-theme.json file. Takes precedence over\n                            --theme and --themes-dir. Fails loudly on load error.\n  --themes-dir <dir>        Directory of .triton-theme.json files to register; merged\n                            on top of auto-discovered .triton/themes/ (overrides on\n                            name collision). Use with --theme <name>.\n  --icon-pack <path>        Path to a .triton-icons.json icon pack file. Loaded at\n                            highest precedence (overrides --icons-dir and auto-discovery\n                            on duplicate prefix). Fails loudly on load or validation error.\n  --icons-dir <dir>         Directory of .triton-icons.json files to register; merged\n                            on top of auto-discovered .triton/icons/ (overrides on\n                            duplicate prefix). Use alongside --icon-pack as needed.\n  --scale <number>          Uniform scale for the PDF page box (default 1).\n  -h, --help                Show this help.\n\nTheme resolution order:\n  1. --theme-file <path>    \u2192 load that exact file (errors are fatal)\n  2. --themes-dir + auto-discovery (.triton/themes/ ancestor walk) \u2192 build registry\n     --theme <name>          \u2192 look up name in registry, then fall back to built-in preset\n  3. No theme flags          \u2192 core uses diagram frontmatter / default preset\n\nIcon resolution order:\n  1. --icon-pack <path>     \u2192 load that exact file (errors are fatal); highest precedence\n  2. --icons-dir <dir>      \u2192 discover packs in dir, merged over auto-discovery\n  3. Auto-discovery          \u2192 walk up from input file looking for .triton/icons/\n  (No icon flags + no .triton/icons/ found \u2192 no custom icon packs loaded)\n\nExamples:\n  triton-latex render diagram.mmd -o figures/diagram.pdf\n  triton-latex render diagram.mmd -o diagram.svg                        # SVG pass-through\n  triton-latex render diagram.mmd -o out.pdf --theme-file my.triton-theme.json\n  triton-latex render diagram.mmd -o out.pdf --themes-dir .triton/themes --theme acme\n  triton-latex render diagram.mmd -o out.pdf --icon-pack icons/azure.triton-icons.json\n  triton-latex render diagram.mmd -o out.pdf --icons-dir .triton/icons\n  triton-latex render-dir diagrams/ -o figures/                         # batch \u2192 *.pdf\n`;\n\n// \u2500\u2500\u2500 Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst DIAGRAM_EXTS = new Set(['.triton', '.mmd']);\n\n/** Render one source file to an SVG string, throwing a clean Error on failure. */\nfunction renderToSvg(\n  source: string,\n  themeInput: ResolvedTheme | undefined,\n  icons: IconPackMap,\n): string {\n  const result = renderSync(source, themeInput, undefined, undefined, icons);\n  if (!result.ok) {\n    throw new Error(`${result.error.code}: ${result.error.message}`);\n  }\n  return result.value;\n}\n\n/** Render a single input file to a .pdf or .svg output. */\nasync function renderFile(\n  inputPath: string,\n  outPath: string,\n  themeInput: ResolvedTheme | undefined,\n  icons: IconPackMap,\n  scale: number,\n): Promise<void> {\n  const source = readFileSync(inputPath, 'utf8');\n  const svg = renderToSvg(source, themeInput, icons);\n\n  // The inline LaTeX environment renders into a content-hashed cache dir\n  // (e.g. `\\jobname.triton-cache/<hash>.pdf`) that may not exist yet \u2014 single\n  // `render` must create the parent directory, not just `render-dir`.\n  mkdirSync(dirname(resolve(outPath)), { recursive: true });\n\n  if (extname(outPath).toLowerCase() === '.svg') {\n    writeFileSync(outPath, svg, 'utf8');\n    return;\n  }\n\n  const pdf = await svgToPdf(svg, { scale });\n  writeFileSync(outPath, pdf);\n}\n\n/** Batch-render every *.triton / *.mmd in srcDir to <name>.pdf in outDir. */\nasync function renderDir(\n  srcDir: string,\n  outDir: string,\n  themeInput: ResolvedTheme | undefined,\n  icons: IconPackMap,\n  scale: number,\n): Promise<{ rendered: number; failed: string[] }> {\n  mkdirSync(outDir, { recursive: true });\n\n  const entries = readdirSync(srcDir).filter((f) => {\n    const full = join(srcDir, f);\n    return statSync(full).isFile() && DIAGRAM_EXTS.has(extname(f).toLowerCase());\n  });\n\n  let rendered = 0;\n  const failed: string[] = [];\n\n  for (const file of entries) {\n    const inputPath = join(srcDir, file);\n    const name = basename(file, extname(file));\n    const outPath = join(outDir, `${name}.pdf`);\n    try {\n      await renderFile(inputPath, outPath, themeInput, icons, scale);\n      console.log(`  \u2713 ${file} \u2192 ${name}.pdf`);\n      rendered++;\n    } catch (cause) {\n      const message = cause instanceof Error ? cause.message : String(cause);\n      console.error(`  \u2717 ${file}: ${message}`);\n      failed.push(file);\n    }\n  }\n\n  return { rendered, failed };\n}\n\n// \u2500\u2500\u2500 Entry point \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function main(): Promise<number> {\n  const args = parseArgs(process.argv.slice(2));\n\n  if (args.help || !args.command) {\n    console.log(USAGE);\n    return args.help ? 0 : 1;\n  }\n\n  if (args.command === 'render') {\n    const input = args.positionals[0];\n    if (!input || !args.out) {\n      console.error('error: `render` needs <input> and -o <output>.\\n');\n      console.error(USAGE);\n      return 1;\n    }\n    const inputPath = resolve(input);\n    let themeInput: ResolvedTheme | undefined;\n    let icons: IconPackMap;\n    try {\n      themeInput = resolveCliTheme(args, dirname(inputPath));\n    } catch (e) {\n      console.error(`error: ${(e as Error).message}`);\n      return 1;\n    }\n    try {\n      icons = resolveCliIcons(args, dirname(inputPath));\n    } catch (e) {\n      console.error(`error: ${(e as Error).message}`);\n      return 1;\n    }\n    await renderFile(inputPath, resolve(args.out), themeInput, icons, args.scale);\n    console.log(`\u2713 ${input} \u2192 ${args.out}`);\n    return 0;\n  }\n\n  if (args.command === 'render-dir') {\n    const srcDir = args.positionals[0];\n    if (!srcDir || !args.out) {\n      console.error('error: `render-dir` needs <srcDir> and -o <outDir>.\\n');\n      console.error(USAGE);\n      return 1;\n    }\n    const resolvedSrcDir = resolve(srcDir);\n    let themeInput: ResolvedTheme | undefined;\n    let icons: IconPackMap;\n    try {\n      themeInput = resolveCliTheme(args, resolvedSrcDir);\n    } catch (e) {\n      console.error(`error: ${(e as Error).message}`);\n      return 1;\n    }\n    try {\n      icons = resolveCliIcons(args, resolvedSrcDir);\n    } catch (e) {\n      console.error(`error: ${(e as Error).message}`);\n      return 1;\n    }\n    const { rendered, failed } = await renderDir(\n      resolvedSrcDir,\n      resolve(args.out),\n      themeInput,\n      icons,\n      args.scale,\n    );\n    console.log(`\\n${rendered} rendered, ${failed.length} failed.`);\n    return failed.length > 0 ? 1 : 0;\n  }\n\n  console.error(`error: unknown command \"${args.command}\".\\n`);\n  console.error(USAGE);\n  return 1;\n}\n\nfunction isDirectExecution(): boolean {\n  if (typeof require !== 'undefined' && typeof module !== 'undefined' && require.main === module) {\n    return true;\n  }\n  if (typeof __filename !== 'undefined' && process.argv[1]) {\n    try {\n      return resolve(process.argv[1]) === resolve(__filename);\n    } catch {\n      return false;\n    }\n  }\n  try {\n    if (typeof import.meta !== 'undefined' && import.meta.url && process.argv[1]) {\n      return resolve(process.argv[1]) === resolve(fileURLToPath(import.meta.url));\n    }\n  } catch {\n    return false;\n  }\n  return false;\n}\n\nif (isDirectExecution()) {\n  main()\n    .then((code) => process.exit(code))\n    .catch((cause) => {\n      const message = cause instanceof Error ? cause.message : String(cause);\n      console.error(`error: ${message}`);\n      process.exit(1);\n    });\n}\n\n", "export const CONNECTOR_ANIMATIONS = [\n  'march',\n  'particle',\n  'draw',\n  'pulse',\n  'glow',\n  'comet',\n  'stream',\n  'flow',\n  'colorcycle',\n] as const;\n\nexport type RenderedConnectorAnimation = (typeof CONNECTOR_ANIMATIONS)[number];\nexport type CrossLinkAnimation = RenderedConnectorAnimation | 'none';\n\nexport function isRenderedConnectorAnimation(value: unknown): value is RenderedConnectorAnimation {\n  return typeof value === 'string' && (CONNECTOR_ANIMATIONS as readonly string[]).includes(value);\n}\n", "/**\n * Result\n *\n * A discriminated union for all public API return values.\n *\n * All public-facing functions (render, compile) return Result<T> instead\n * of throwing. Internal functions may still throw \u2014 errors are caught at\n * the pipeline boundary and wrapped into Err values.\n *\n * Usage:\n *   const result = await render(input);\n *   if (!result.ok) { console.error(result.error.message); return; }\n *   console.log(result.value); // string\n */\n\nexport type DiagramErrorCode =\n  | 'PARSE_ERROR'\n  | 'LAYOUT_ERROR'\n  | 'UNKNOWN_DIAGRAM'\n  | 'UNSUPPORTED_FORMAT'\n  | 'UNKNOWN_RENDERER'\n  | 'THEME_VALIDATION_ERROR'\n  | 'ICON_VALIDATION_ERROR'\n  | 'ICON_NOT_FOUND';\n\nexport interface DiagramError {\n  readonly code: DiagramErrorCode;\n  readonly message: string;\n  readonly cause?: unknown;\n}\n\nexport type Result<T> =\n  | { readonly ok: true; readonly value: T }\n  | { readonly ok: false; readonly error: DiagramError };\n\n/** Construct a successful result. */\nexport function ok<T>(value: T): Result<T> {\n  return { ok: true, value };\n}\n\n/** Construct a failed result. */\nexport function err(code: DiagramErrorCode, message: string, cause?: unknown): Result<never> {\n  return {\n    ok: false,\n    error: { code, message, ...(cause !== undefined ? { cause } : {}) },\n  };\n}\n", "import type { DiagramKind, InputFormat } from '../contracts/index.js';\n\nexport interface DetectionResult {\n  readonly format: InputFormat;\n  readonly diagramType: DiagramKind;\n}\n\n/**\n * Detect whether input is YAML or Mermaid, and which diagram type it is.\n * Returns the result without parsing \u2014 no grammar is invoked here.\n *\n * A leading `---` frontmatter block is allowed in front of Mermaid source\n * (e.g. gantt with title/theme); the diagram type is detected from the body\n * after the closing fence. Only a `type:` key without a Mermaid body routes\n * to the YAML path.\n */\nconst MERMAID_PATTERNS: [RegExp, DiagramKind][] = [\n  [/^(flowchart|graph)\\s/i, 'flowchart'],\n  [/^sequenceDiagram/i, 'sequence'],\n  [/^timeline/i, 'timeline'],\n  [/^mindmap/i, 'mindmap'],\n  [/^stateDiagram/i, 'state'],\n  [/^classDiagram/i, 'class'],\n  [/^erDiagram/i, 'er'],\n  [/^gantt/i, 'gantt'],\n  [/^journey/i, 'journey'],\n  [/^C4(Context|Container|Component|Dynamic|Deployment)/i, 'c4'],\n  [/^sankey/i, 'sankey'],\n  [/^kanban/i, 'kanban'],\n  [/^requirementDiagram\\b/i, 'requirement'],\n  [/^gitGraph/i, 'gitgraph'],\n  [/^packet/i, 'packet'],\n  [/^pie\\b/i, 'pie'],\n  [/^xychart(-beta)?/i, 'xychart'],\n  [/^quadrantChart/i, 'quadrant'],\n  [/^radar(-beta)?/i, 'radar'],\n  [/^block/i, 'block'],\n  [/^architecture/i, 'architecture'],\n  [/^poster/i, 'poster'],\n  [/^tree\\b/i, 'tree'],\n  [/^plan\\b/i, 'plan'],\n  [/^avl\\b/i, 'avl'],\n  [/^rbtree\\b/i, 'rbtree'],\n  [/^b\\+tree\\b/i, 'bplustree'],\n  [/^bplustree\\b/i, 'bplustree'],\n  [/^btree\\b/i, 'btree'],\n  [/^radix\\b/i, 'radix'],\n  [/^segtree\\b/i, 'segtree'],\n  [/^heap\\b/i, 'heap'],\n  [/^array\\b/i, 'array'],\n  [/^linkedlist\\b/i, 'linkedlist'],\n  [/^memory\\b/i, 'memory'],\n  [/^page\\b/i, 'page'],\n  [/^cqueue\\b/i, 'cqueue'],\n  [/^deque\\b/i, 'deque'],\n  [/^pqueue\\b/i, 'pqueue'],\n  [/^queue\\b/i, 'queue'],\n  [/^stack\\b/i, 'stack'],\n  [/^hashmap\\b/i, 'hashmap'],\n  [/^matrix\\b/i, 'matrix'],\n  [/^trie\\b/i, 'trie'],\n  // `graph` is owned by Mermaid flowchart (`graph TD`), so the data-structure\n  // graph uses a distinct, unambiguous keyword instead.\n  [/^nodegraph\\b/i, 'nodegraph'],\n  [/^dsgraph\\b/i, 'nodegraph'],\n  [/^unionfind\\b/i, 'unionfind'],\n  [/^dsu\\b/i, 'unionfind'],\n  [/^topology\\b/i, 'topology'],\n  [/^list\\b/i, 'list'],\n  [/^fishbone\\b/i, 'fishbone'],\n  [/^(pyramid|funnel)\\b/i, 'pyramid'],\n  [/^(loop|flywheel)\\b/i, 'loop'],\n  [/^merkletree\\b/i, 'merkletree'],\n  [/^lsmtree\\b/i, 'lsmtree'],\n  [/^behaviortree\\b/i, 'behaviortree'],\n  [/^quadtree\\b/i, 'quadtree'],\n  [/^treap\\b/i, 'treap'],\n  [/^(2-3-4tree|234tree)\\b/i, '234tree'],\n];\n\nexport function matchMermaid(text: string): DiagramKind | undefined {\n  for (const [pattern, type] of MERMAID_PATTERNS) {\n    if (pattern.test(text)) return type;\n  }\n  return undefined;\n}\n\nexport function detect(input: string): DetectionResult {\n  const trimmed = input.trimStart();\n\n  // Frontmatter block (--- \u2026 ---): peek at the body for a Mermaid keyword.\n  if (trimmed.startsWith('---')) {\n    const fm = trimmed.match(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/);\n    if (fm) {\n      const body = trimmed.slice(fm[0].length).trimStart();\n      const bodyType = matchMermaid(body);\n      if (bodyType) return { format: 'mermaid', diagramType: bodyType };\n      const typeInFm = fm[0].match(/^\\s*type:\\s*(\\w+)/m);\n      if (typeInFm) return { format: 'yaml', diagramType: typeInFm[1] as DiagramKind };\n    }\n    const typeMatch = trimmed.match(/^type:\\s*(\\w+)/m);\n    return { format: 'yaml', diagramType: (typeMatch?.[1] ?? 'flowchart') as DiagramKind };\n  }\n\n  // YAML with a leading `type:` key (first line only \u2014 avoid matching a\n  // `type:` field inside a diagram body, e.g. requirement element blocks).\n  if (/^type:\\s/.test(trimmed)) {\n    const typeMatch = trimmed.match(/^type:\\s*(\\w+)/);\n    return { format: 'yaml', diagramType: (typeMatch?.[1] ?? 'flowchart') as DiagramKind };\n  }\n\n  // Mermaid: match the first non-comment, non-whitespace token.\n  return { format: 'mermaid', diagramType: matchMermaid(trimmed) ?? 'flowchart' };\n}\n", "/**\n * @file frontend/preprocess.ts \u2014 Source pre-processing before grammar dispatch.\n *\n * Central `%%` comment stripping so that every diagram family accepts comment\n * lines without requiring per-grammar Comment rules.\n */\n\n/**\n * Strip full-line `%%` comments from Mermaid diagram source.\n *\n * ### Semantics (aligned with the 4 built-in grammars that handle `%%` natively)\n *\n * - **Full-line only:** a line is a comment iff its first non-whitespace\n *   characters are `%%`. Such lines are removed entirely.\n * - **No inline trailing comments:** `A --> B %% note` is NOT stripped. This\n *   is the safe default \u2014 distinguishing a real trailing comment from `%%`\n *   inside node labels such as `A[\"50%% off\"]` is unsafe without a full parse.\n *   The 4 grammars that already handle their own Comment rules continue to work\n *   unchanged on the pre-stripped input.\n * - **Frontmatter preserved:** if the input opens with a `---\\n\u2026\\n---` YAML\n *   frontmatter block, that block is passed through verbatim (YAML may contain\n *   `%%` in values). Comment stripping applies only to the Mermaid body that\n *   follows the closing fence.\n * - **Pure-YAML inputs untouched:** if the first non-whitespace token is\n *   `type:` (the Triton YAML path), the input is returned unchanged so that\n *   `parseYaml` receives exactly what the author wrote.\n */\nexport function stripComments(input: string): string {\n  const trimmed = input.trimStart();\n\n  // Pure-YAML path: do not strip \u2014 `%%` is not a YAML construct and may\n  // appear legitimately inside YAML string values.\n  if (/^type:\\s/.test(trimmed)) return input;\n\n  // Frontmatter path: preserve the `---\u2026---` block verbatim; strip comments\n  // only in the Mermaid body that follows.\n  if (trimmed.startsWith('---')) {\n    const fmMatch = trimmed.match(/^---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/);\n    if (fmMatch) {\n      const leadingWs = input.slice(0, input.length - trimmed.length);\n      const frontmatter = fmMatch[0];\n      const body = trimmed.slice(frontmatter.length);\n      return leadingWs + frontmatter + removeCommentLines(body);\n    }\n    // Malformed frontmatter (no closing `---`) \u2014 treat conservatively as\n    // YAML-ish and return untouched.\n    return input;\n  }\n\n  // Plain Mermaid text \u2014 strip comment lines from the entire input.\n  return removeCommentLines(input);\n}\n\n/**\n * Remove every line whose first non-whitespace characters are `%%`.\n * Lines are joined back with `\\n`; `\\r` characters within lines are preserved.\n */\nfunction removeCommentLines(text: string): string {\n  return text\n    .split('\\n')\n    .filter((line) => !/^\\s*%%/.test(line))\n    .join('\\n');\n}\n", "/**\n * Diagram Registry\n *\n * Central registry of all available diagram modules.\n * Built-in modules are registered in frontend/index.ts at startup.\n * Third-party diagrams call registerDiagram() from their own package.\n *\n * The registry stores modules as DiagramModule<any> internally to handle\n * the contravariance of layout()'s IR parameter. Type safety is preserved\n * at registration time via the generic constraint on registerDiagram().\n */\n\nimport type { DiagramKind, DiagramModule, BaseIR } from '../contracts/index.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyModule = DiagramModule<any>;\n\nconst registry = new Map<DiagramKind, AnyModule>();\n\n/** Register a diagram module under the given kind key. */\nexport function registerDiagram<IR extends BaseIR>(\n  kind: DiagramKind,\n  module: DiagramModule<IR>,\n): void {\n  registry.set(kind, module as AnyModule);\n}\n\n/** Look up a registered diagram module by kind. Returns undefined if not found. */\nexport function getModule(kind: DiagramKind): AnyModule | undefined {\n  return registry.get(kind);\n}\n\n/** Return all currently registered diagram kind strings. */\nexport function registeredKinds(): DiagramKind[] {\n  return [...registry.keys()];\n}\n", "/**\n * Renderer Registry\n *\n * Central registry of all available output renderers.\n * The built-in 'svg' renderer is registered in frontend/index.ts.\n * Third-party renderers (PNG, Canvas, PDF\u2026) call registerRenderer().\n */\n\nimport type { Renderer } from '../contracts/index.js';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst registry = new Map<string, Renderer<any>>();\n\n/** Register an output renderer under its name. */\nexport function registerRenderer<Output>(renderer: Renderer<Output>): void {\n  registry.set(renderer.name, renderer);\n}\n\n/** Look up a renderer by name. Returns undefined if not registered. */\nexport function getRenderer<Output = string>(name: string): Renderer<Output> | undefined {\n  return registry.get(name) as Renderer<Output> | undefined;\n}\n\n/** Return all currently registered renderer names. */\nexport function registeredRenderers(): string[] {\n  return [...registry.keys()];\n}\n", "import type { ResolvedTheme } from '../contracts/index.js';\n\n// \u2500\u2500\u2500 Shared base tokens (typography / spacing / edges) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Palettes vary per theme; structure stays constant so every diagram responds\n// identically to a theme switch.\n\nconst SANS = 'Inter, system-ui, -apple-system, sans-serif';\nconst SERIF = 'Georgia, \"Times New Roman\", serif';\nconst MONO = 'JetBrains Mono, Fira Code, monospace';\n\nconst baseTypography = {\n  fontFamily: SANS,\n  monoFamily: MONO,\n  baseFontSize: 14,\n  titleFontSize: 18,\n  smallFontSize: 11,\n  lineHeight: 1.4,\n} as const;\n\nconst baseSpacing = {\n  unit: 8,\n  nodePadding: 12,\n  nodeGap: 40,\n  diagramMargin: 24,\n} as const;\n\nconst baseEdges = {\n  strokeWidth: 1.5,\n  arrowSize: 8,\n  labelFontSize: 12,\n  curveTension: 0.4,\n} as const;\n\n// Default panel/cell-title chrome: plain text, top-left, inside the frame.\nconst basePanel = {\n  titleAlign: 'left',\n  titlePosition: 'inside',\n  titleChrome: 'none',\n} as const;\n\nexport const baseNodes = {\n  standard: {\n    borderWidth: 1.5,\n    cornerRadius: 6,\n    padding: 12,\n  },\n  leaf: {\n    borderWidth: 1.2,\n    cornerRadius: 18,\n    padding: 10,\n  },\n  datastore: {\n    borderWidth: 1.5,\n    padding: 12,\n  },\n} as const;\n\n// \u2500\u2500\u2500 Themes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const defaultTheme: ResolvedTheme = {\n  name: 'default',\n  palette: {\n    primary: '#087F78',\n    secondary: '#B9503F',\n    background: '#FFFFFF',\n    surface: '#F3F6F5',\n    border: '#899796',\n    text: '#20282B',\n    textMuted: '#576567',\n    success: '#24704A',\n    warning: '#A56816',\n    error: '#B83E43',\n  },\n  typography: {\n    ...baseTypography,\n    fontFamily: '\"Source Sans 3\", \"Segoe UI\", sans-serif',\n    baseFontSize: 15,\n    titleFontSize: 20,\n    smallFontSize: 12,\n    lineHeight: 1.45,\n  },\n  spacing: baseSpacing,\n  edges: { ...baseEdges, strokeWidth: 2, labelFontSize: 13 },\n  panel: basePanel,\n  nodes: {\n    ...baseNodes,\n    standard: { ...baseNodes.standard, cornerRadius: 4 },\n    leaf: { ...baseNodes.leaf, cornerRadius: 8 },\n  },\n} as const;\n\n/** Boardroom / presentation aesthetic \u2014 deep navy canvas, light text. */\nexport const executiveTheme: ResolvedTheme = {\n  name: 'executive',\n  palette: {\n    primary: '#3A86C8',\n    secondary: '#7986CB',\n    background: '#0D1B2A',\n    surface: '#16263B',\n    border: '#2A4060',\n    text: '#E8EEF5',\n    textMuted: '#8BAAC8',\n    success: '#2DD4BF',\n    warning: '#F4A742',\n    error: '#E05252',\n  },\n  typography: { ...baseTypography, fontFamily: SERIF },\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'box' },\n  nodes: baseNodes,\n} as const;\n\n/** Greyscale, ink-on-paper minimalism. */\nexport const minimalTheme: ResolvedTheme = {\n  name: 'minimal',\n  palette: {\n    primary: '#525252',\n    secondary: '#A3A3A3',\n    background: '#FFFFFF',\n    surface: '#F5F5F5',\n    border: '#D4D4D4',\n    text: '#171717',\n    textMuted: '#737373',\n    success: '#737373',\n    warning: '#A3A3A3',\n    error: '#404040',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: basePanel,\n  nodes: baseNodes,\n} as const;\n\n/**\n * Framed light variant of `minimal`. Identical greyscale palette, but intended\n * to always paint its white background \u2014 the VS Code extension exempts this\n * preset from the transparent-canvas blanking it applies to other built-ins,\n * so a diagram stays readable on a white card regardless of the editor theme.\n */\nexport const bwLightTheme: ResolvedTheme = {\n  name: 'bw-light',\n  palette: {\n    primary: '#525252',\n    secondary: '#A3A3A3',\n    background: '#FFFFFF',\n    surface: '#F5F5F5',\n    border: '#D4D4D4',\n    text: '#171717',\n    textMuted: '#737373',\n    success: '#737373',\n    warning: '#A3A3A3',\n    error: '#404040',\n  },\n  typography: {\n    ...baseTypography,\n    baseFontSize: 13,\n  },\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: basePanel,\n  nodes: baseNodes,\n} as const;\n\n/** Greyscale, ink-on-paper minimalism \u2014 dark canvas variant of `minimal`. */\nexport const bwDarkTheme: ResolvedTheme = {\n  name: 'bw-dark',\n  palette: {\n    primary: '#D4D4D4',\n    secondary: '#8B8B8B',\n    background: '#171717',\n    surface: '#262626',\n    border: '#3F3F3F',\n    text: '#FAFAFA',\n    textMuted: '#A3A3A3',\n    success: '#A3A3A3',\n    warning: '#8B8B8B',\n    error: '#E5E5E5',\n  },\n  typography: {\n    ...baseTypography,\n    baseFontSize: 13,\n  },\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: basePanel,\n  nodes: baseNodes,\n} as const;\n\n/** Navy + amber on white \u2014 classic consulting deck. */\nexport const consultingTheme: ResolvedTheme = {\n  name: 'consulting',\n  palette: {\n    primary: '#1F497D',\n    secondary: '#D97706',\n    background: '#FFFFFF',\n    surface: '#F4F6FA',\n    border: '#D6DEE8',\n    text: '#111111',\n    textMuted: '#555555',\n    success: '#1F8A5B',\n    warning: '#D97706',\n    error: '#DC2626',\n  },\n  typography: { ...baseTypography, fontFamily: SERIF },\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'left', titlePosition: 'on-border', titleChrome: 'none' },\n  nodes: baseNodes,\n} as const;\n\n/** Modern SaaS product \u2014 violet + blue on white. */\nexport const productTheme: ResolvedTheme = {\n  name: 'product',\n  palette: {\n    primary: '#3B82F6',\n    secondary: '#8B5CF6',\n    background: '#FFFFFF',\n    surface: '#F9FAFB',\n    border: '#E5E7EB',\n    text: '#111827',\n    textMuted: '#6B7280',\n    success: '#10B981',\n    warning: '#F59E0B',\n    error: '#EF4444',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'center', titlePosition: 'inside', titleChrome: 'pill' },\n  nodes: baseNodes,\n} as const;\n\n/** Release-management palette \u2014 vivid status hues. */\nexport const releaseTheme: ResolvedTheme = {\n  name: 'release',\n  palette: {\n    primary: '#2563EB',\n    secondary: '#16A34A',\n    background: '#FFFFFF',\n    surface: '#F8FAFC',\n    border: '#E2E8F0',\n    text: '#111111',\n    textMuted: '#6B7280',\n    success: '#16A34A',\n    warning: '#D97706',\n    error: '#DC2626',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'left', titlePosition: 'inside', titleChrome: 'box' },\n  nodes: baseNodes,\n} as const;\n\n/** Indigo accent on near-white \u2014 the AI-timeline editorial look. */\nexport const aiTimelineTheme: ResolvedTheme = {\n  name: 'ai-timeline',\n  palette: {\n    primary: '#5B4FCF',\n    secondary: '#0EA5A8',\n    background: '#F8F9FF',\n    surface: '#FFFFFF',\n    border: '#C0C4DF',\n    text: '#1A1A2E',\n    textMuted: '#4A4A6A',\n    success: '#2D9E67',\n    warning: '#D97706',\n    error: '#E05B5B',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'left', titlePosition: 'above', titleChrome: 'none' },\n  nodes: baseNodes,\n} as const;\n\n/** ByteByteGo-style dark infographic \u2014 navy canvas, vivid teal accent. */\nexport const byteByteGoTheme: ResolvedTheme = {\n  name: 'bytebytego',\n  palette: {\n    primary: '#2DD4BF',\n    secondary: '#4D9AFF',\n    background: '#111827',\n    surface: '#1F2937',\n    border: '#374151',\n    text: '#F9FAFB',\n    textMuted: '#9CA3AF',\n    success: '#2DD4BF',\n    warning: '#FFB800',\n    error: '#FF4D6D',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'pill' },\n  nodes: baseNodes,\n} as const;\n\n/** Gitline dark-card look \u2014 deep navy canvas, periwinkle-blue accent. */\nexport const gitlineTheme: ResolvedTheme = {\n  name: 'gitline',\n  palette: {\n    primary: '#4D9AFF',\n    secondary: '#2C6EA8',\n    background: '#0A1628',\n    surface: '#132035',\n    border: '#1C3558',\n    text: '#E8EDF5',\n    textMuted: '#6B8FAF',\n    success: '#3FB950',\n    warning: '#D29922',\n    error: '#F85149',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'left', titlePosition: 'on-border', titleChrome: 'box' },\n  nodes: baseNodes,\n} as const;\n\n/** \"Our Timeline\" infographic \u2014 white canvas, navy + amber. */\nexport const ourTimelineTheme: ResolvedTheme = {\n  name: 'our-timeline',\n  palette: {\n    primary: '#1F497D',\n    secondary: '#D97706',\n    background: '#FFFFFF',\n    surface: '#F4F6FA',\n    border: '#CCCCCC',\n    text: '#111111',\n    textMuted: '#555555',\n    success: '#1F8A5B',\n    warning: '#D97706',\n    error: '#DC2626',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'center', titlePosition: 'above', titleChrome: 'none' },\n  nodes: baseNodes,\n} as const;\n\n/** Subject Timeline dark theme \u2014 deep navy, vivid cyan + pink accents. */\nexport const subjectTimelineTheme: ResolvedTheme = {\n  name: 'subject-timeline',\n  palette: {\n    primary: '#22D3EE',\n    secondary: '#EC4899',\n    background: '#1A1A2E',\n    surface: '#2A2A48',\n    border: '#3A3A5C',\n    text: '#E8EEF4',\n    textMuted: '#8A9BB0',\n    success: '#34D399',\n    warning: '#F59E0B',\n    error: '#EC4899',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'pill' },\n  nodes: baseNodes,\n} as const;\n\n/** Showcase Tier-3 aesthetic \u2014 deep navy canvas, electric-cyan accent. */\nexport const showcaseTheme: ResolvedTheme = {\n  name: 'showcase',\n  palette: {\n    primary: '#00D4FF',\n    secondary: '#9B8FDF',\n    background: '#0D1B2A',\n    surface: '#132035',\n    border: '#1E3A5A',\n    text: '#E8EEF5',\n    textMuted: '#7AACCC',\n    success: '#00CC88',\n    warning: '#FFB800',\n    error: '#FF4D6D',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'box' },\n  nodes: baseNodes,\n} as const;\n\n/** Editorial light aesthetic \u2014 warm paper, jet-black ink, atomic-tangerine accent, editorial blue link. */\nexport const editorialTheme: ResolvedTheme = {\n  name: 'editorial',\n  palette: {\n    primary: '#EB6C36',\n    secondary: '#2E5AA8',\n    background: '#F5F5F5',\n    surface: '#ECECEC',\n    border: '#BFC0C0',\n    text: '#2D3142',\n    textMuted: '#4F5D75',\n    success: '#7C8F6F',\n    warning: '#B8915A',\n    error: '#9C6B50',\n  },\n  typography: {\n    ...baseTypography,\n    fontFamily: SANS,\n    monoFamily: 'Geist Mono, JetBrains Mono, Fira Code, monospace',\n    titleFontSize: 20,\n  },\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'left', titlePosition: 'inside', titleChrome: 'none' },\n  nodes: baseNodes,\n} as const;\n\n/** Editorial dark aesthetic \u2014 jet-black paper, warm white-smoke ink, luminous tangerine accent. */\nexport const editorialDarkTheme: ResolvedTheme = {\n  name: 'editorial-dark',\n  palette: {\n    primary: '#F08A59',\n    secondary: '#6A95D8',\n    background: '#2D3142',\n    surface: '#393E53',\n    border: '#4F5D75',\n    text: '#F5F5F5',\n    textMuted: '#BFC0C0',\n    success: '#9CAF8F',\n    warning: '#D3AD7A',\n    error: '#B88670',\n  },\n  typography: {\n    ...baseTypography,\n    fontFamily: SANS,\n    monoFamily: 'Geist Mono, JetBrains Mono, Fira Code, monospace',\n    titleFontSize: 20,\n  },\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'left', titlePosition: 'inside', titleChrome: 'none' },\n  nodes: baseNodes,\n} as const;\n\n/** Spectrum vibrant infographic aesthetic \u2014 obsidian tech canvas, multi-hue neon accents. */\nexport const spectrumTheme: ResolvedTheme = {\n  name: 'spectrum',\n  palette: {\n    primary: '#00D4B2',\n    secondary: '#F72585',\n    background: '#0B1120',\n    surface: '#162032',\n    border: '#27354A',\n    text: '#F8FAFC',\n    textMuted: '#94A3B8',\n    success: '#10B981',\n    warning: '#F59E0B',\n    error: '#EF4444',\n  },\n  typography: baseTypography,\n  spacing: baseSpacing,\n  edges: baseEdges,\n  panel: { titleAlign: 'center', titlePosition: 'on-border', titleChrome: 'pill' },\n  nodes: baseNodes,\n} as const;\n\n// \u2500\u2500\u2500 Registry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Named theme presets. Selected via a diagram's `theme:` / metadata.theme. */\nexport const THEMES: Readonly<Record<string, ResolvedTheme>> = {\n  default: defaultTheme,\n  executive: executiveTheme,\n  minimal: minimalTheme,\n  editorial: editorialTheme,\n  'editorial-dark': editorialDarkTheme,\n  'bw-light': bwLightTheme,\n  'bw-dark': bwDarkTheme,\n  consulting: consultingTheme,\n  product: productTheme,\n  release: releaseTheme,\n  'ai-timeline': aiTimelineTheme,\n  bytebytego: byteByteGoTheme,\n  gitline: gitlineTheme,\n  'our-timeline': ourTimelineTheme,\n  'subject-timeline': subjectTimelineTheme,\n  showcase: showcaseTheme,\n  spectrum: spectrumTheme,\n};\n\n/** Ordered names of every built-in theme preset. */\nexport const themePresetNames = Object.freeze(Object.keys(THEMES)) as readonly string[];\n\n/** Resolve a theme preset by name, falling back to the default theme. */\nexport function getThemePreset(name?: string): ResolvedTheme {\n  return (name !== undefined && THEMES[name]) || defaultTheme;\n}\n", "import type { ResolvedTheme, ThemeInput } from '../contracts/index.js';\n\n/**\n * Merge a partial ThemeInput over a base ResolvedTheme.\n * Only present fields override the base \u2014 absent fields keep the base value.\n */\nexport function resolveTheme(input: ThemeInput, base: ResolvedTheme): ResolvedTheme {\n  const baseNodes = base.nodes;\n  const inputNodes = input.nodes;\n  const nodes =\n    baseNodes || inputNodes\n      ? {\n          standard: {\n            ...(baseNodes?.standard ?? { borderWidth: 1.5, cornerRadius: 6, padding: 12 }),\n            ...inputNodes?.standard,\n          },\n          leaf: {\n            ...(baseNodes?.leaf ?? { borderWidth: 1.2, cornerRadius: 18, padding: 10 }),\n            ...inputNodes?.leaf,\n          },\n          datastore: {\n            ...(baseNodes?.datastore ?? { borderWidth: 1.5, padding: 12 }),\n            ...inputNodes?.datastore,\n          },\n        }\n      : undefined;\n\n  return {\n    name: input.name ?? base.name,\n    palette: { ...base.palette, ...input.palette },\n    typography: { ...base.typography, ...input.typography },\n    spacing: { ...base.spacing, ...input.spacing },\n    edges: { ...base.edges, ...input.edges },\n    panel: { ...base.panel, ...input.panel },\n    ...(nodes !== undefined ? { nodes } : {}),\n  };\n}\n", "/**\n * @file frontend/frontmatter.ts \u2014 Robust YAML-ish frontmatter extractor.\n */\n\nexport interface ExtractedFrontmatter {\n  readonly metadata: Record<string, unknown>;\n  readonly body: string;\n}\n\n/**\n * Extract leading `---...---` frontmatter block from diagram input.\n * Strips the frontmatter block from `body` so hand-written DSL parsers\n * don't choke on frontmatter lines.\n */\nexport function extractFrontmatter(input: string): ExtractedFrontmatter {\n  const m = input.match(/^\\s*---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/);\n  if (!m) return { metadata: {}, body: input };\n\n  const metadata: Record<string, unknown> = {};\n  for (const line of (m[1] ?? '').split(/\\r?\\n/)) {\n    const idx = line.indexOf(':');\n    if (idx === -1) continue;\n    const key = line.slice(0, idx).trim();\n    const value = line\n      .slice(idx + 1)\n      .trim()\n      .replace(/^[\"']|[\"']$/g, '');\n    if (key) metadata[key] = value;\n  }\n\n  return { metadata, body: input.slice(m[0].length) };\n}\n", "/**\n * Icon resolution \u2014 pure, no I/O.\n *\n * Three exported functions:\n *\n *   parseIconRef(token)          \u2014 parse \"prefix:name\" \u2192 Result<IconRef>\n *   resolveIcon(ref, packs)      \u2014 resolve IconRef against IconPackMap \u2192 Result<ResolvedIcon>\n *   detectColorMode(body)        \u2014 classify body as 'monochrome' | 'brand'\n *\n * All functions are pure: they take data in and return data out.\n * No filesystem access, no network, no process.\n *\n * ViewBox merge order (highest priority first):\n *   1. Alias-level dimension overrides (if the reference was an alias)\n *   2. Icon-level dimension overrides\n *   3. Pack-level dimension defaults\n *   4. System defaults: width=16, height=16, left=0, top=0\n *\n * Transform composition (alias-level on top of icon-level):\n *   rotate : (aliasRotate + iconRotate) mod 4\n *   hFlip  : aliasHFlip XOR iconHFlip\n *   vFlip  : aliasVFlip XOR iconVFlip\n *\n * Color-mode detection heuristic (precise, documented):\n *   Scan body for fill=\"...\" and stroke=\"...\" attribute values.\n *   If any value is not in {none, currentColor, inherit} \u2192 brand.\n *   If body contains <linearGradient or <radialGradient \u2192 brand.\n *   Otherwise \u2192 monochrome.\n *\n * Alias depth limit: MAX_ALIAS_DEPTH (4) to prevent infinite loops.\n */\n\nimport type {\n  IconRef,\n  IconViewBox,\n  IconTransforms,\n  IconRotate,\n  ResolvedIcon,\n  IconifyJSON,\n  IconPackMap,\n  IconData,\n  IconAlias,\n} from '../contracts/icons.js';\nimport { ok, err, type Result } from '../contracts/result.js';\n\n// \u2500\u2500\u2500 Token grammar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Valid prefix: starts with a lowercase letter, followed by lowercase alnum or hyphens.\n * Examples: \"azure\", \"mdi\", \"my-pack\"\n */\nconst PREFIX_RE = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Valid name: starts with lowercase alnum, followed by lowercase alnum or hyphens.\n * Examples: \"app-service\", \"server\", \"12px\" (unusual but valid per grammar)\n */\nconst NAME_RE = /^[a-z0-9][a-z0-9-]*$/;\n\n// \u2500\u2500\u2500 System defaults \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst DEFAULT_WIDTH = 16;\nconst DEFAULT_HEIGHT = 16;\nconst DEFAULT_LEFT = 0;\nconst DEFAULT_TOP = 0;\n\n/** Maximum alias chain depth. Prevents infinite loops from circular aliases. */\nconst MAX_ALIAS_DEPTH = 4;\n\n// \u2500\u2500\u2500 parseIconRef \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Parse an icon token string of the form \"prefix:name\" into an IconRef.\n *\n * Valid: \"azure:app-service\", \"mdi:server\", \"lucide:0-circle\"\n * Invalid: \"no-colon\", \":name\" (empty prefix), \"prefix:\" (empty name),\n *          \"Azure:App\" (uppercase), \"prefix:name:extra\" (too many colons)\n *\n * Returns err(ICON_NOT_FOUND, ...) on parse failure (not ICON_VALIDATION_ERROR\n * since this is a reference parse, not a pack-structure validation).\n */\nexport function parseIconRef(token: string): Result<IconRef> {\n  if (typeof token !== 'string' || token.length === 0) {\n    return err(\n      'ICON_NOT_FOUND',\n      `Icon token must be a non-empty string, got ${JSON.stringify(token)}`,\n    );\n  }\n\n  const colonIdx = token.indexOf(':');\n  if (colonIdx === -1) {\n    return err(\n      'ICON_NOT_FOUND',\n      `Invalid icon token ${JSON.stringify(token)}: must be \"prefix:name\"`,\n    );\n  }\n\n  // Only one colon allowed\n  if (token.indexOf(':', colonIdx + 1) !== -1) {\n    return err(\n      'ICON_NOT_FOUND',\n      `Invalid icon token ${JSON.stringify(token)}: too many colons \u2014 expected \"prefix:name\"`,\n    );\n  }\n\n  const prefix = token.slice(0, colonIdx);\n  const name = token.slice(colonIdx + 1);\n\n  if (!PREFIX_RE.test(prefix)) {\n    return err(\n      'ICON_NOT_FOUND',\n      `Invalid icon token ${JSON.stringify(token)}: prefix ${JSON.stringify(prefix)} must match ^[a-z][a-z0-9-]*$`,\n    );\n  }\n\n  if (!NAME_RE.test(name)) {\n    return err(\n      'ICON_NOT_FOUND',\n      `Invalid icon token ${JSON.stringify(token)}: name ${JSON.stringify(name)} must match ^[a-z0-9][a-z0-9-]*$`,\n    );\n  }\n\n  return ok({ prefix, name });\n}\n\n// \u2500\u2500\u2500 detectColorMode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Classify an icon body as 'monochrome' or 'brand'.\n *\n * Heuristic (precise):\n *   1. Scan body for fill=\"...\" and stroke=\"...\" attribute values.\n *      If any value is not one of {none, currentColor, inherit} \u2192 brand.\n *   2. If body contains \"<linearGradient\" or \"<radialGradient\" \u2192 brand.\n *   3. Otherwise \u2192 monochrome.\n *\n * Rationale:\n *   Monochrome icons (MDI, Lucide, Heroicons) use only fill=\"currentColor\" or\n *   fill=\"none\", allowing the renderer to tint them via CSS color inheritance.\n *   Brand icons (Azure architecture icons, logos) embed hardcoded hex fills\n *   and/or gradient definitions that must render verbatim.\n *\n *   The gradient check is necessary because some icons use fill=\"url(#grad1)\"\n *   which would pass the fill-value check but still requires brand rendering.\n *\n * Note: this is a string scan heuristic, not a full SVG parser. It handles\n * well-formed IconifyJSON bodies as produced by @iconify/tools. Pathological\n * bodies with fill/stroke in non-attribute contexts (e.g. CSS text) could\n * produce false positives, but this is acceptable for the BYOP use case.\n */\nexport function detectColorMode(body: string): 'monochrome' | 'brand' {\n  // Gradient definitions always \u2192 brand\n  if (body.includes('<linearGradient') || body.includes('<radialGradient')) {\n    return 'brand';\n  }\n\n  // Scan fill=\"...\" and stroke=\"...\" attribute values\n  // Match: fill=\"value\" or stroke=\"value\" (handles single/double quotes)\n  const ATTR_RE = /(?:fill|stroke)=[\"']([^\"']+)[\"']/g;\n  const NEUTRAL = new Set(['none', 'currentcolor', 'inherit']);\n\n  let match: RegExpExecArray | null;\n  while ((match = ATTR_RE.exec(body)) !== null) {\n    const value = match[1];\n    if (value === undefined) continue;\n    // Normalize to lowercase for case-insensitive comparison\n    const lower = value.toLowerCase();\n    if (!NEUTRAL.has(lower)) {\n      return 'brand';\n    }\n  }\n\n  return 'monochrome';\n}\n\n// \u2500\u2500\u2500 Internal: dimension merge \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype DimSource = {\n  width?: number;\n  height?: number;\n  left?: number;\n  top?: number;\n};\n\nfunction mergeViewBox(\n  aliasLevel: DimSource,\n  iconLevel: DimSource,\n  packLevel: DimSource,\n): IconViewBox {\n  return {\n    width: aliasLevel.width ?? iconLevel.width ?? packLevel.width ?? DEFAULT_WIDTH,\n    height: aliasLevel.height ?? iconLevel.height ?? packLevel.height ?? DEFAULT_HEIGHT,\n    left: aliasLevel.left ?? iconLevel.left ?? packLevel.left ?? DEFAULT_LEFT,\n    top: aliasLevel.top ?? iconLevel.top ?? packLevel.top ?? DEFAULT_TOP,\n  };\n}\n\n// \u2500\u2500\u2500 Internal: transform composition \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction composeTransforms(\n  icon: Pick<IconData, 'rotate' | 'hFlip' | 'vFlip'>,\n  alias: Pick<IconAlias, 'rotate' | 'hFlip' | 'vFlip'> | null,\n): IconTransforms {\n  const iconRotate = icon.rotate ?? 0;\n  const iconHFlip = icon.hFlip ?? false;\n  const iconVFlip = icon.vFlip ?? false;\n\n  if (alias === null) {\n    return {\n      rotate: iconRotate as IconRotate,\n      hFlip: iconHFlip,\n      vFlip: iconVFlip,\n    };\n  }\n\n  const aliasRotate = alias.rotate ?? 0;\n  const aliasHFlip = alias.hFlip ?? false;\n  const aliasVFlip = alias.vFlip ?? false;\n\n  return {\n    rotate: ((iconRotate + aliasRotate) % 4) as IconRotate,\n    hFlip: iconHFlip !== aliasHFlip, // XOR\n    vFlip: iconVFlip !== aliasVFlip, // XOR\n  };\n}\n\n// \u2500\u2500\u2500 resolveIcon \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Resolve an IconRef against an IconPackMap to produce a ResolvedIcon.\n *\n * Resolution steps:\n *   1. Look up the pack by ref.prefix. \u2192 ICON_NOT_FOUND if absent.\n *   2. Look for ref.name in pack.icons. If found, use it directly.\n *   3. Else look in pack.aliases. Follow the alias chain up to MAX_ALIAS_DEPTH.\n *      \u2192 ICON_NOT_FOUND if name not in icons or aliases, or chain too deep.\n *   4. Merge viewBox dimensions: alias-level \u2192 icon-level \u2192 pack-level \u2192 defaults.\n *   5. Compose transforms: alias-level on top of icon-level.\n *   6. Detect colorMode from the resolved body.\n *\n * Pure \u2014 never throws, never touches the filesystem.\n */\nexport function resolveIcon(ref: IconRef, packs: IconPackMap): Result<ResolvedIcon> {\n  const pack = packs.get(ref.prefix);\n  if (pack === undefined) {\n    return err(\n      'ICON_NOT_FOUND',\n      `Icon pack \"${ref.prefix}\" not loaded (looking up \"${ref.prefix}:${ref.name}\")`,\n    );\n  }\n\n  // Try direct icon lookup first\n  const directIcon = pack.icons[ref.name];\n  if (directIcon !== undefined) {\n    const viewBox = mergeViewBox({}, directIcon, pack);\n    const transforms = composeTransforms(directIcon, null);\n    return ok({\n      body: directIcon.body,\n      viewBox,\n      transforms,\n      colorMode: detectColorMode(directIcon.body),\n    });\n  }\n\n  // Try alias lookup\n  const aliases = pack.aliases;\n  if (aliases === undefined || !(ref.name in aliases)) {\n    return err(\n      'ICON_NOT_FOUND',\n      `Icon \"${ref.name}\" not found in pack \"${ref.prefix}\" (checked icons and aliases)`,\n    );\n  }\n\n  // Follow alias chain, accumulating the first alias's transform/dim overrides\n  let currentName = ref.name;\n  let currentAlias: IconAlias | null = aliases[ref.name] ?? null;\n  const topAlias = currentAlias; // preserve top-level alias for dim/transform composition\n\n  for (let depth = 0; depth < MAX_ALIAS_DEPTH; depth++) {\n    if (currentAlias === null) break;\n\n    const parentName = currentAlias.parent;\n    const parentIcon = pack.icons[parentName];\n\n    if (parentIcon !== undefined) {\n      // Found the base icon \u2014 compose transforms and merge viewBox\n      const viewBox = mergeViewBox(topAlias ?? {}, parentIcon, pack);\n      const transforms = composeTransforms(parentIcon, topAlias);\n      return ok({\n        body: parentIcon.body,\n        viewBox,\n        transforms,\n        colorMode: detectColorMode(parentIcon.body),\n      });\n    }\n\n    // Parent is itself an alias \u2014 follow one more level\n    const parentAlias = aliases[parentName];\n    if (parentAlias === undefined) {\n      return err(\n        'ICON_NOT_FOUND',\n        `Alias \"${currentName}\" in pack \"${ref.prefix}\" points to parent \"${parentName}\" which does not exist`,\n      );\n    }\n\n    currentName = parentName;\n    currentAlias = parentAlias;\n  }\n\n  return err(\n    'ICON_NOT_FOUND',\n    `Alias chain for \"${ref.name}\" in pack \"${ref.prefix}\" exceeds maximum depth of ${MAX_ALIAS_DEPTH}`,\n  );\n}\n", "/**\n * Router Registry\n *\n * Central registry of all available routing algorithms.\n * Built-in routers (straight, orthogonal, bezier, polyline) are\n * registered in frontend/index.ts.\n * Third-party routers call registerRouter().\n */\n\nimport type { Router, RouteStyle } from '../contracts/index.js';\n\nconst registry = new Map<RouteStyle, Router>();\n\n/** Register a routing algorithm under a route style name. */\nexport function registerRouter(style: RouteStyle, router: Router): void {\n  registry.set(style, router);\n}\n\n/** Look up a router by style. Returns undefined if not registered. */\nexport function getRouter(style: RouteStyle): Router | undefined {\n  return registry.get(style);\n}\n\n/** Return all currently registered route style names. */\nexport function registeredRouters(): RouteStyle[] {\n  return [...registry.keys()];\n}\n", "import type { Router, RouteRequest, Route, RouteStyle, PortDirection } from '../contracts/index.js';\nimport type { Point, Rect } from '../contracts/index.js';\n\n// \u2500\u2500\u2500 Straight \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nclass StraightRouter implements Router {\n  route(req: RouteRequest): Route {\n    const { from, to, obstacles, padding } = req;\n    const noWarn = (req as { noWarn?: boolean }).noWarn;\n    const pad = padding ?? 12;\n\n    // If no obstacles or no crossing, use a direct line\n    if (!obstacles || obstacles.length === 0 || !straightHitsObstacles(from, to, obstacles, pad)) {\n      return {\n        points: [from, to],\n        path: `M ${from.x} ${from.y} L ${to.x} ${to.y}`,\n        labelPosition: midpoint(from, to),\n      };\n    }\n\n    // Deflect: find a waypoint that avoids all obstacles.\n    // Try perpendicular offsets of increasing magnitude in both directions.\n    const dx = to.x - from.x,\n      dy = to.y - from.y;\n    const len = Math.sqrt(dx * dx + dy * dy);\n    if (len < 1) {\n      return {\n        points: [from, to],\n        path: `M ${from.x} ${from.y} L ${to.x} ${to.y}`,\n        labelPosition: from,\n      };\n    }\n\n    const perpX = -dy / len,\n      perpY = dx / len;\n    const mid = midpoint(from, to);\n\n    for (let offset = len * 0.1; offset <= len * 0.6; offset += len * 0.1) {\n      for (const sign of [1, -1]) {\n        const wp: Point = { x: mid.x + perpX * offset * sign, y: mid.y + perpY * offset * sign };\n        if (\n          !straightHitsObstacles(from, wp, obstacles, pad) &&\n          !straightHitsObstacles(wp, to, obstacles, pad)\n        ) {\n          return {\n            points: [from, wp, to],\n            path: `M ${from.x} ${from.y} L ${wp.x} ${wp.y} L ${to.x} ${to.y}`,\n            labelPosition: wp,\n          };\n        }\n      }\n    }\n\n    // Fallback: direct line (best effort)\n    if (\n      !noWarn &&\n      obstacles &&\n      obstacles.length > 0 &&\n      straightHitsObstacles(from, to, obstacles, pad)\n    ) {\n      console.warn(\n        `[routing] No clear route between (${from.x}, ${from.y}) and (${to.x}, ${to.y}): route intersects obstacles.`,\n      );\n    }\n    return {\n      points: [from, to],\n      path: `M ${from.x} ${from.y} L ${to.x} ${to.y}`,\n      labelPosition: midpoint(from, to),\n    };\n  }\n}\n\n/** Check if a straight line from\u2192to passes through any obstacle interior. */\nfunction straightHitsObstacles(\n  from: Point,\n  to: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): boolean {\n  for (const obs of obstacles) {\n    if (\n      segCrossesInterior(\n        from,\n        to,\n        {\n          x: obs.x - pad,\n          y: obs.y - pad,\n          width: obs.width + 2 * pad,\n          height: obs.height + 2 * pad,\n        },\n        0,\n      )\n    ) {\n      return true;\n    }\n  }\n  return false;\n}\n\n// \u2500\u2500\u2500 Orthogonal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nclass OrthogonalRouter implements Router {\n  route(req: RouteRequest): Route {\n    const { from, to, fromDir, toDir, obstacles, padding } = req;\n    const noWarn = (req as { noWarn?: boolean }).noWarn;\n    const dx = to.x - from.x;\n    const dy = to.y - from.y;\n    const midX = (from.x + to.x) / 2;\n    const midY = (from.y + to.y) / 2;\n    const pad = padding ?? 12;\n    // Minimum straight \"landing\" run before an arrowhead / after an exit port,\n    // so a same-wall detour never places the arrowhead directly on a bend.\n    const STUB = Math.max(pad, 20);\n\n    // Already aligned on one axis \u2014 straight line. But only shortcut when the\n    // segment actually leaves the source along its wall normal, approaches the\n    // target from that wall's outboard side, and crosses no obstacles.\n    const straightH = Math.abs(dy) < 1; // horizontal straight line\n    const straightV = Math.abs(dx) < 1; // vertical straight line\n    if (straightH || straightV) {\n      const dirsOk = straightDirsOk(from, to, straightH, straightV, fromDir, toDir);\n      const clear = !obstacles || countRouteCollisions([from, to], obstacles) === 0;\n      if (dirsOk && clear) {\n        return {\n          points: [from, to],\n          path: `M ${from.x} ${from.y} L ${to.x} ${to.y}`,\n          labelPosition: { x: midX, y: midY },\n        };\n      }\n    }\n\n    // With port direction hints, route so the first segment leaves in\n    // fromDir and the last segment arrives along toDir.\n    if (fromDir && toDir) {\n      const exitH = fromDir === 'E' || fromDir === 'W';\n      const entryH = toDir === 'E' || toDir === 'W';\n\n      let points: Point[];\n      let path: string;\n\n      if (exitH && entryH) {\n        // Both horizontal \u2014 bend at midX, shifted to avoid obstacles.\n        // For a same-wall pair (both E or both W) the two stubs point the same\n        // way, so the connecting segment must sit OUTSIDE both ports, otherwise\n        // the route collapses back onto the wall.\n        const sameWall = fromDir === toDir;\n        const baseX = sameWall\n          ? fromDir === 'E'\n            ? Math.max(from.x, to.x) + STUB\n            : Math.min(from.x, to.x) - STUB\n          : midX;\n        let bendX: number;\n        if (sameWall) {\n          // The connecting channel must stay OUTBOARD of the shared wall. The\n          // generic avoidance keeps the bend within the port x-range, which for\n          // a same-wall pair pulls it to the INBOARD side \u2014 driving the landing\n          // segment straight through the target box to reach the far wall\n          // (\"behind the target\"). Only ever shift the channel further outboard.\n          bendX = clearBendXOutboard(baseX, from, to, obstacles, pad, fromDir === 'E' ? 1 : -1);\n        } else {\n          bendX = clearVerticalBend(baseX, from.y, to.y, from.x, to.x, obstacles, pad);\n          bendX = clearHorizontalSegments(bendX, from, to, obstacles, pad);\n        }\n        const v1: Point = { x: bendX, y: from.y };\n        const v2: Point = { x: bendX, y: to.y };\n        let hhPoints: Point[] = [from, v1, v2, to];\n        if (sameWall && obstacles) {\n          const originalCollisions = countRouteCollisions(hhPoints, obstacles);\n          if (originalCollisions > 0) {\n            const detour = buildSameHorizontalWallRoute(from, to, fromDir, obstacles, pad, STUB);\n            if (\n              countRouteCollisions(detour, obstacles) < originalCollisions ||\n              routeHitsEndpointObstacle(hhPoints, from, to, obstacles)\n            ) {\n              hhPoints = detour;\n            }\n          }\n        }\n\n        // Verify the H+H route is clear; if not, try V+V with direction stubs.\n        // Skip the fallback for same-wall pairs: the outboard H+H route is the\n        // one that honours the wall hint without crossing the target, so we keep\n        // it even if it grazes other cells.\n        if (!sameWall && obstacles && countRouteCollisions(hhPoints, obstacles) > 0) {\n          const vvRoute = buildVVRouteWithStubs(from, to, fromDir!, toDir!, obstacles, pad);\n          if (\n            countRouteCollisions(vvRoute, obstacles) < countRouteCollisions(hhPoints, obstacles)\n          ) {\n            points = vvRoute;\n          } else {\n            points = hhPoints;\n          }\n        } else {\n          points = hhPoints;\n        }\n        path = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n      } else if (!exitH && !entryH) {\n        // Both vertical \u2014 bend at midY, shifted to avoid obstacles.\n        // For a same-wall pair (both N or both S) push the connecting segment\n        // OUTSIDE both ports so the route arcs over/under the nodes.\n        const sameWall = fromDir === toDir;\n        const baseY = sameWall\n          ? fromDir === 'S'\n            ? Math.max(from.y, to.y) + STUB\n            : Math.min(from.y, to.y) - STUB\n          : midY;\n        let bendY: number;\n        if (sameWall) {\n          // Same reasoning as the horizontal case: keep the connecting channel\n          // outboard of the shared wall so the landing segment never passes\n          // through the target box.\n          bendY = clearBendYOutboard(baseY, from, to, obstacles, pad, fromDir === 'S' ? 1 : -1);\n        } else {\n          bendY = clearHorizontalBend(baseY, from.x, to.x, from.y, to.y, obstacles, pad);\n          bendY = clearVerticalSegments(bendY, from, to, obstacles, pad);\n        }\n        const v1: Point = { x: from.x, y: bendY };\n        const v2: Point = { x: to.x, y: bendY };\n        let vvPoints: Point[] = [from, v1, v2, to];\n        if (sameWall && obstacles) {\n          const originalCollisions = countRouteCollisions(vvPoints, obstacles);\n          if (originalCollisions > 0) {\n            const detour = buildSameVerticalWallRoute(from, to, fromDir, obstacles, pad, STUB);\n            if (\n              countRouteCollisions(detour, obstacles) < originalCollisions ||\n              routeHitsEndpointObstacle(vvPoints, from, to, obstacles)\n            ) {\n              vvPoints = detour;\n            }\n          }\n        }\n\n        // Verify the V+V route is clear; if not, try H+H with direction stubs.\n        // Same-wall pairs keep their outboard V+V route (see horizontal case).\n        if (!sameWall && obstacles && countRouteCollisions(vvPoints, obstacles) > 0) {\n          const hhRoute = buildHHRouteWithStubs(from, to, fromDir!, toDir!, obstacles, pad);\n          if (\n            countRouteCollisions(hhRoute, obstacles) < countRouteCollisions(vvPoints, obstacles)\n          ) {\n            points = hhRoute;\n          } else {\n            points = vvPoints;\n          }\n        } else {\n          points = vvPoints;\n        }\n        path = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n      } else if (exitH && !entryH) {\n        // Exit horizontal, enter vertical\n        const corner: Point = { x: to.x, y: from.y };\n        const leavesOk = fromDir === 'E' ? to.x >= from.x : to.x <= from.x;\n        const arrivesOk = toDir === 'N' ? from.y <= to.y : from.y >= to.y;\n        const directRoute = [from, corner, to];\n        const isClear =\n          leavesOk &&\n          arrivesOk &&\n          (!obstacles || countRouteCollisions(directRoute, obstacles) === 0);\n\n        if (isClear) {\n          points = directRoute;\n        } else {\n          const sign = fromDir === 'E' ? 1 : -1;\n          const baseX = fromDir === 'E' ? from.x + pad : from.x - pad;\n          const bendX = clearBendXOutboard(baseX, from, to, obstacles, pad, sign);\n          const bendY = toDir === 'N' ? to.y - pad : to.y + pad;\n          points = [\n            from,\n            { x: bendX, y: from.y },\n            { x: bendX, y: bendY },\n            { x: to.x, y: bendY },\n            to,\n          ];\n        }\n        path = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n        return {\n          points,\n          path,\n          labelPosition: { x: (points[0]!.x + points[1]!.x) / 2, y: points[0]!.y },\n        };\n      } else {\n        // Exit vertical, enter horizontal\n        const corner: Point = { x: from.x, y: to.y };\n        const leavesOk = fromDir === 'S' ? to.y >= from.y : to.y <= from.y;\n        const arrivesOk = toDir === 'W' ? from.x <= to.x : from.x >= to.x;\n        const directRoute = [from, corner, to];\n        const isClear =\n          leavesOk &&\n          arrivesOk &&\n          (!obstacles || countRouteCollisions(directRoute, obstacles) === 0);\n\n        if (isClear) {\n          points = directRoute;\n        } else {\n          const sign = fromDir === 'S' ? 1 : -1;\n          const baseY = fromDir === 'S' ? from.y + pad : from.y - pad;\n          const bendY = clearBendYOutboard(baseY, from, to, obstacles, pad, sign);\n          const bendX = toDir === 'W' ? to.x - pad : to.x + pad;\n          points = [\n            from,\n            { x: from.x, y: bendY },\n            { x: bendX, y: bendY },\n            { x: bendX, y: to.y },\n            to,\n          ];\n        }\n        path = points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n        return {\n          points,\n          path,\n          labelPosition: { x: points[0]!.x, y: (points[0]!.y + points[1]!.y) / 2 },\n        };\n      }\n\n      return { points, path, labelPosition: { x: midX, y: midY } };\n    }\n\n    // Fallback: no direction hints \u2014 heuristic based on geometry\n    let points: Point[];\n    let path: string;\n\n    if (Math.abs(dy) >= Math.abs(dx)) {\n      // Mainly vertical \u2014 bend at mid-Y\n      const bendY = clearHorizontalBend(midY, from.x, to.x, from.y, to.y, obstacles, pad);\n      const v1: Point = { x: from.x, y: bendY };\n      const v2: Point = { x: to.x, y: bendY };\n      points = [from, v1, v2, to];\n      path = `M ${from.x} ${from.y} L ${v1.x} ${v1.y} L ${v2.x} ${v2.y} L ${to.x} ${to.y}`;\n    } else {\n      // Mainly horizontal \u2014 bend at mid-X\n      const bendX = clearVerticalBend(midX, from.y, to.y, from.x, to.x, obstacles, pad);\n      const v1: Point = { x: bendX, y: from.y };\n      const v2: Point = { x: bendX, y: to.y };\n      points = [from, v1, v2, to];\n      path = `M ${from.x} ${from.y} L ${v1.x} ${v1.y} L ${v2.x} ${v2.y} L ${to.x} ${to.y}`;\n    }\n\n    if (\n      !noWarn &&\n      obstacles &&\n      obstacles.length > 0 &&\n      countRouteCollisions(points, obstacles) > 0\n    ) {\n      console.warn(\n        `[routing] No clear route between (${from.x}, ${from.y}) and (${to.x}, ${to.y}): route intersects obstacles.`,\n      );\n    }\n\n    return { points, path, labelPosition: { x: midX, y: midY } };\n  }\n}\n\n/**\n * Clear a same-wall vertical bend channel by shifting it ONLY further outboard\n * (in `dir`: -1 = west, +1 = east). Unlike clearVerticalBend, this never pulls\n * the channel back toward the ports \u2014 for a same-wall pair the inboard side is\n * across the target box, so an inboard shift would route the landing segment\n * \"behind the target\". The channel and both horizontal stubs are checked; on a\n * hit the channel jumps past the obstacle's outboard edge.\n */\nfunction clearBendXOutboard(\n  baseX: number,\n  from: { x: number; y: number },\n  to: { x: number; y: number },\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect> | undefined,\n  pad: number,\n  dir: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return baseX;\n  let x = baseX;\n  const yMin = Math.min(from.y, to.y);\n  const yMax = Math.max(from.y, to.y);\n  for (let pass = 0; pass < obstacles.length * 2 + 2; pass++) {\n    let moved = false;\n    for (const obs of obstacles) {\n      const oLeft = obs.x - pad;\n      const oRight = obs.x + obs.width + pad;\n      const oTop = obs.y;\n      const oBottom = obs.y + obs.height;\n      const vHits = x > oLeft && x < oRight && yMax > oTop && yMin < oBottom;\n      const hHitTo = segCrossesInterior({ x, y: to.y }, { x: to.x, y: to.y }, obs, pad);\n      const hHitFrom = segCrossesInterior({ x: from.x, y: from.y }, { x, y: from.y }, obs, pad);\n      if (vHits || hHitTo || hHitFrom) {\n        const edge = dir < 0 ? oLeft : oRight;\n        if ((dir < 0 && edge < x) || (dir > 0 && edge > x)) {\n          x = edge;\n          moved = true;\n          break;\n        }\n      }\n    }\n    if (!moved) break;\n  }\n  return x;\n}\n\n/**\n * Vertical-wall analogue of clearBendXOutboard: shift a same-wall horizontal\n * bend line only further outboard (dir: -1 = north, +1 = south).\n */\nfunction clearBendYOutboard(\n  baseY: number,\n  from: { x: number; y: number },\n  to: { x: number; y: number },\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect> | undefined,\n  pad: number,\n  dir: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return baseY;\n  let y = baseY;\n  const xMin = Math.min(from.x, to.x);\n  const xMax = Math.max(from.x, to.x);\n  for (let pass = 0; pass < obstacles.length * 2 + 2; pass++) {\n    let moved = false;\n    for (const obs of obstacles) {\n      const oTop = obs.y - pad;\n      const oBottom = obs.y + obs.height + pad;\n      const oLeft = obs.x;\n      const oRight = obs.x + obs.width;\n      const hHits = y > oTop && y < oBottom && xMax > oLeft && xMin < oRight;\n      const vHitTo = segCrossesInterior({ x: to.x, y }, { x: to.x, y: to.y }, obs, pad);\n      const vHitFrom = segCrossesInterior({ x: from.x, y: from.y }, { x: from.x, y }, obs, pad);\n      if (hHits || vHitTo || vHitFrom) {\n        const edge = dir < 0 ? oTop : oBottom;\n        if ((dir < 0 && edge < y) || (dir > 0 && edge > y)) {\n          y = edge;\n          moved = true;\n          break;\n        }\n      }\n    }\n    if (!moved) break;\n  }\n  return y;\n}\n\nfunction straightDirsOk(\n  from: Point,\n  to: Point,\n  straightH: boolean,\n  straightV: boolean,\n  fromDir?: PortDirection,\n  toDir?: PortDirection,\n): boolean {\n  if (!fromDir && !toDir) return true;\n  const dx = to.x - from.x;\n  const dy = to.y - from.y;\n  if (straightH && Math.abs(dx) < 1) return true;\n\n  let requiredFrom: PortDirection;\n  let requiredTo: PortDirection;\n  if (straightH) {\n    requiredFrom = dx > 0 ? 'E' : 'W';\n    requiredTo = dx > 0 ? 'W' : 'E';\n  } else if (straightV) {\n    requiredFrom = dy > 0 ? 'S' : 'N';\n    requiredTo = dy > 0 ? 'N' : 'S';\n  } else {\n    return false;\n  }\n\n  return (!fromDir || fromDir === requiredFrom) && (!toDir || toDir === requiredTo);\n}\n\nfunction buildSameVerticalWallRoute(\n  from: Point,\n  to: Point,\n  wall: PortDirection,\n  obstacles: ReadonlyArray<Rect>,\n  pad: number,\n  stub: number,\n): Point[] {\n  const dir = wall === 'S' ? 1 : -1;\n  const fromOut: Point = { x: from.x, y: from.y + dir * stub };\n  const toOut: Point = { x: to.x, y: to.y + dir * stub };\n  const colliders = collidingObstacles([from, fromOut, { x: to.x, y: fromOut.y }, to], obstacles);\n  const relevant = colliders.length > 0 ? colliders : obstacles;\n  const leftX = Math.min(...relevant.map((o) => o.x - pad));\n  const rightX = Math.max(...relevant.map((o) => o.x + o.width + pad));\n  return bestSameVerticalCandidate(from, to, fromOut, toOut, [leftX, rightX], obstacles);\n}\n\nfunction buildSameHorizontalWallRoute(\n  from: Point,\n  to: Point,\n  wall: PortDirection,\n  obstacles: ReadonlyArray<Rect>,\n  pad: number,\n  stub: number,\n): Point[] {\n  const dir = wall === 'E' ? 1 : -1;\n  const fromOut: Point = { x: from.x + dir * stub, y: from.y };\n  const toOut: Point = { x: to.x + dir * stub, y: to.y };\n  const colliders = collidingObstacles([from, fromOut, { x: fromOut.x, y: to.y }, to], obstacles);\n  const relevant = colliders.length > 0 ? colliders : obstacles;\n  const topY = Math.min(...relevant.map((o) => o.y - pad));\n  const bottomY = Math.max(...relevant.map((o) => o.y + o.height + pad));\n  return bestSameHorizontalCandidate(from, to, fromOut, toOut, [topY, bottomY], obstacles);\n}\n\nfunction bestSameVerticalCandidate(\n  from: Point,\n  to: Point,\n  fromOut: Point,\n  toOut: Point,\n  escapeXs: readonly number[],\n  obstacles: ReadonlyArray<Rect>,\n): Point[] {\n  let best: Point[] | undefined;\n  let bestCost = Infinity;\n  for (const escapeX of escapeXs) {\n    const candidate = [\n      from,\n      fromOut,\n      { x: escapeX, y: fromOut.y },\n      { x: escapeX, y: toOut.y },\n      toOut,\n      to,\n    ];\n    const cost = countRouteCollisions(candidate, obstacles) * 1_000_000 + polylineLength(candidate);\n    if (cost < bestCost) {\n      best = candidate;\n      bestCost = cost;\n    }\n  }\n  return best!;\n}\n\nfunction bestSameHorizontalCandidate(\n  from: Point,\n  to: Point,\n  fromOut: Point,\n  toOut: Point,\n  escapeYs: readonly number[],\n  obstacles: ReadonlyArray<Rect>,\n): Point[] {\n  let best: Point[] | undefined;\n  let bestCost = Infinity;\n  for (const escapeY of escapeYs) {\n    const candidate = [\n      from,\n      fromOut,\n      { x: fromOut.x, y: escapeY },\n      { x: toOut.x, y: escapeY },\n      toOut,\n      to,\n    ];\n    const cost = countRouteCollisions(candidate, obstacles) * 1_000_000 + polylineLength(candidate);\n    if (cost < bestCost) {\n      best = candidate;\n      bestCost = cost;\n    }\n  }\n  return best!;\n}\n\nfunction collidingObstacles(points: readonly Point[], obstacles: ReadonlyArray<Rect>): Rect[] {\n  return obstacles.filter((obs) => {\n    for (let i = 0; i < points.length - 1; i++) {\n      if (segCrossesInterior(points[i]!, points[i + 1]!, obs, 0)) return true;\n    }\n    return false;\n  });\n}\n\nfunction routeHitsEndpointObstacle(\n  points: readonly Point[],\n  from: Point,\n  to: Point,\n  obstacles: ReadonlyArray<Rect>,\n): boolean {\n  return collidingObstacles(points, obstacles).some(\n    (obs) => pointInOrOnRect(from, obs) || pointInOrOnRect(to, obs),\n  );\n}\n\nfunction pointInOrOnRect(p: Point, r: Rect): boolean {\n  const eps = 1e-6;\n  return (\n    p.x >= r.x - eps &&\n    p.x <= r.x + r.width + eps &&\n    p.y >= r.y - eps &&\n    p.y <= r.y + r.height + eps\n  );\n}\n\nfunction polylineLength(points: readonly Point[]): number {\n  let len = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    const a = points[i]!;\n    const b = points[i + 1]!;\n    len += Math.abs(b.x - a.x) + Math.abs(b.y - a.y);\n  }\n  return len;\n}\n/**\n * Shift a vertical bend line (at x=bendX, spanning yMin\u2013yMax) to avoid obstacles.\n * Returns the original bendX if it doesn't intersect anything, otherwise shifts\n * to the nearest clear side of all intersecting obstacles.\n */\nfunction clearVerticalBend(\n  bendX: number,\n  y1: number,\n  y2: number,\n  fromX: number,\n  toX: number,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return bendX;\n\n  const yMin = Math.min(y1, y2);\n  const yMax = Math.max(y1, y2);\n\n  // Iteratively shift until clear of all obstacles (max passes to avoid infinite loop)\n  let shifted = bendX;\n  for (let pass = 0; pass < obstacles.length; pass++) {\n    let hit = false;\n    for (const obs of obstacles) {\n      const oLeft = obs.x - pad;\n      const oRight = obs.x + obs.width + pad;\n      const oTop = obs.y;\n      const oBottom = obs.y + obs.height;\n\n      if (shifted > oLeft && shifted < oRight && yMax > oTop && yMin < oBottom) {\n        const leftCandidate = oLeft;\n        const rightCandidate = oRight;\n        const minX = Math.min(fromX, toX);\n        const maxX = Math.max(fromX, toX);\n\n        const leftValid = leftCandidate >= minX;\n        const rightValid = rightCandidate <= maxX;\n\n        if (leftValid && rightValid) {\n          shifted =\n            shifted - leftCandidate < rightCandidate - shifted ? leftCandidate : rightCandidate;\n        } else if (leftValid) {\n          shifted = leftCandidate;\n        } else if (rightValid) {\n          shifted = rightCandidate;\n        } else {\n          shifted =\n            shifted - leftCandidate < rightCandidate - shifted ? leftCandidate : rightCandidate;\n        }\n        hit = true;\n        break; // re-check from start with new position\n      }\n    }\n    if (!hit) break;\n  }\n\n  return shifted;\n}\n\n/**\n * Shift a horizontal bend line (at y=bendY, spanning xMin\u2013xMax) to avoid obstacles.\n */\nfunction clearHorizontalBend(\n  bendY: number,\n  x1: number,\n  x2: number,\n  fromY: number,\n  toY: number,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return bendY;\n\n  const xMin = Math.min(x1, x2);\n  const xMax = Math.max(x1, x2);\n\n  // Iteratively shift until clear of all obstacles\n  let shifted = bendY;\n  for (let pass = 0; pass < obstacles.length; pass++) {\n    let hit = false;\n    for (const obs of obstacles) {\n      const oTop = obs.y - pad;\n      const oBottom = obs.y + obs.height + pad;\n      const oLeft = obs.x;\n      const oRight = obs.x + obs.width;\n\n      if (shifted > oTop && shifted < oBottom && xMax > oLeft && xMin < oRight) {\n        const topCandidate = oTop;\n        const bottomCandidate = oBottom;\n        const minY = Math.min(fromY, toY);\n        const maxY = Math.max(fromY, toY);\n\n        const topValid = topCandidate >= minY;\n        const bottomValid = bottomCandidate <= maxY;\n\n        if (topValid && bottomValid) {\n          shifted =\n            shifted - topCandidate < bottomCandidate - shifted ? topCandidate : bottomCandidate;\n        } else if (topValid) {\n          shifted = topCandidate;\n        } else if (bottomValid) {\n          shifted = bottomCandidate;\n        } else {\n          shifted =\n            shifted - topCandidate < bottomCandidate - shifted ? topCandidate : bottomCandidate;\n        }\n        hit = true;\n        break; // re-check from start with new position\n      }\n    }\n    if (!hit) break;\n  }\n\n  return shifted;\n}\n\n/**\n * After placing a vertical bend at bendX for an H\u2192V\u2192H route (from\u2192(bendX, from.y)\u2192(bendX, to.y)\u2192to),\n * verify that the two horizontal segments don't cross obstacles. If they do, shift bendX\n * so it's on the target/source side of the obstacle.\n * If conflicting (fixing one breaks the other), push bendX outside all obstacles.\n */\nfunction clearHorizontalSegments(\n  bendX: number,\n  from: { x: number; y: number },\n  to: { x: number; y: number },\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect> | undefined,\n  pad: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return bendX;\n\n  let shifted = bendX;\n  let prevShifted = NaN;\n  for (let pass = 0; pass < obstacles.length * 2; pass++) {\n    // Detect oscillation (conflicting constraints)\n    if (shifted === prevShifted) break;\n    prevShifted = shifted;\n\n    let hit = false;\n    for (const obs of obstacles) {\n      // Check last horizontal: shifted \u2192 to.x at y=to.y\n      if (segCrossesInterior({ x: shifted, y: to.y }, { x: to.x, y: to.y }, obs, pad)) {\n        shifted = to.x < obs.x ? obs.x - pad : obs.x + obs.width + pad;\n        hit = true;\n        break;\n      }\n\n      // Check first horizontal: from.x \u2192 shifted at y=from.y\n      if (segCrossesInterior({ x: from.x, y: from.y }, { x: shifted, y: from.y }, obs, pad)) {\n        shifted = from.x < obs.x ? obs.x - pad : obs.x + obs.width + pad;\n        hit = true;\n        break;\n      }\n    }\n    if (!hit) break;\n  }\n\n  // Final verification \u2014 if still colliding, push outside all obstacles\n  const stillCollides = obstacles.some(\n    (obs) =>\n      segCrossesInterior({ x: shifted, y: to.y }, { x: to.x, y: to.y }, obs, pad) ||\n      segCrossesInterior({ x: from.x, y: from.y }, { x: shifted, y: from.y }, obs, pad),\n  );\n  if (stillCollides) {\n    // Compute the leftmost and rightmost obstacle edges\n    let globalLeft = Infinity,\n      globalRight = -Infinity;\n    for (const obs of obstacles) {\n      globalLeft = Math.min(globalLeft, obs.x - pad);\n      globalRight = Math.max(globalRight, obs.x + obs.width + pad);\n    }\n    // Push to whichever side is closer to the target\n    const leftDist = Math.abs(to.x - globalLeft) + Math.abs(from.x - globalLeft);\n    const rightDist = Math.abs(to.x - globalRight) + Math.abs(from.x - globalRight);\n    shifted = leftDist < rightDist ? globalLeft : globalRight;\n  }\n\n  return shifted;\n}\n\n/**\n * After placing a horizontal bend at bendY for a V\u2192H\u2192V route (from\u2192(from.x, bendY)\u2192(to.x, bendY)\u2192to),\n * verify that the two vertical segments don't cross obstacles. If they do, shift bendY.\n * If conflicting, push outside all obstacles.\n */\nfunction clearVerticalSegments(\n  bendY: number,\n  from: { x: number; y: number },\n  to: { x: number; y: number },\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect> | undefined,\n  pad: number,\n): number {\n  if (!obstacles || obstacles.length === 0) return bendY;\n\n  let shifted = bendY;\n  let prevShifted = NaN;\n  for (let pass = 0; pass < obstacles.length * 2; pass++) {\n    if (shifted === prevShifted) break;\n    prevShifted = shifted;\n\n    let hit = false;\n    for (const obs of obstacles) {\n      if (segCrossesInterior({ x: to.x, y: shifted }, { x: to.x, y: to.y }, obs, pad)) {\n        shifted = to.y < obs.y ? obs.y - pad : obs.y + obs.height + pad;\n        hit = true;\n        break;\n      }\n      if (segCrossesInterior({ x: from.x, y: from.y }, { x: from.x, y: shifted }, obs, pad)) {\n        shifted = from.y < obs.y ? obs.y - pad : obs.y + obs.height + pad;\n        hit = true;\n        break;\n      }\n    }\n    if (!hit) break;\n  }\n\n  // Final verification\n  const stillCollides = obstacles.some(\n    (obs) =>\n      segCrossesInterior({ x: to.x, y: shifted }, { x: to.x, y: to.y }, obs, pad) ||\n      segCrossesInterior({ x: from.x, y: from.y }, { x: from.x, y: shifted }, obs, pad),\n  );\n  if (stillCollides) {\n    let globalTop = Infinity,\n      globalBottom = -Infinity;\n    for (const obs of obstacles) {\n      globalTop = Math.min(globalTop, obs.y - pad);\n      globalBottom = Math.max(globalBottom, obs.y + obs.height + pad);\n    }\n    const topDist = Math.abs(to.y - globalTop) + Math.abs(from.y - globalTop);\n    const bottomDist = Math.abs(to.y - globalBottom) + Math.abs(from.y - globalBottom);\n    shifted = topDist < bottomDist ? globalTop : globalBottom;\n  }\n\n  return shifted;\n}\n\n/** Test if segment p1\u2192p2 crosses the strict interior of obs (boundary touches don't count). */\nfunction segCrossesInterior(\n  p1: { x: number; y: number },\n  p2: { x: number; y: number },\n  obs: import('../contracts/index.js').Rect,\n  _pad: number,\n): boolean {\n  const dx = p2.x - p1.x,\n    dy = p2.y - p1.y;\n  const xmin = obs.x,\n    xmax = obs.x + obs.width;\n  const ymin = obs.y,\n    ymax = obs.y + obs.height;\n  let tmin = 0,\n    tmax = 1;\n  const edges = [\n    { p: -dx, q: p1.x - xmin },\n    { p: dx, q: xmax - p1.x },\n    { p: -dy, q: p1.y - ymin },\n    { p: dy, q: ymax - p1.y },\n  ];\n  for (const { p, q } of edges) {\n    if (Math.abs(p) < 1e-10) {\n      // Parallel: segment must be strictly inside (not on boundary) to count\n      if (q <= 0) return false;\n    } else {\n      const t = q / p;\n      if (p < 0) tmin = Math.max(tmin, t);\n      else tmax = Math.min(tmax, t);\n      if (tmin > tmax) return false;\n    }\n  }\n  return tmin < tmax; // strict interior crossing only\n}\n\n/** Count total segment-obstacle collisions along a polyline route. */\nexport function countRouteCollisions(\n  points: readonly Point[],\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n): number {\n  let count = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    for (const obs of obstacles) {\n      if (segCrossesInterior(points[i]!, points[i + 1]!, obs, 0)) count++;\n    }\n  }\n  return count;\n}\n\n/** Build a V\u2192H\u2192V route (vertical-first) with obstacle avoidance. */\nfunction buildVVRoute(\n  from: Point,\n  to: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): Point[] {\n  const midY = (from.y + to.y) / 2;\n  let bendY = clearHorizontalBend(midY, from.x, to.x, from.y, to.y, obstacles, pad);\n  bendY = clearVerticalSegments(bendY, from, to, obstacles, pad);\n  return [from, { x: from.x, y: bendY }, { x: to.x, y: bendY }, to];\n}\n\n/** Build an H\u2192V\u2192H route (horizontal-first) with obstacle avoidance. */\nfunction buildHHRoute(\n  from: Point,\n  to: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): Point[] {\n  const midX = (from.x + to.x) / 2;\n  let bendX = clearVerticalBend(midX, from.y, to.y, from.x, to.x, obstacles, pad);\n  bendX = clearHorizontalSegments(bendX, from, to, obstacles, pad);\n  return [from, { x: bendX, y: from.y }, { x: bendX, y: to.y }, to];\n}\n\n/**\n * Build a V+V fallback route that honours H exit/entry port directions.\n * Adds short horizontal stubs at start/end, then routes V\u2192H\u2192V in between.\n * Route shape: from \u2192 stub1 \u2192 (stub1.x, bendY) \u2192 (stub2.x, bendY) \u2192 stub2 \u2192 to\n */\nfunction buildVVRouteWithStubs(\n  from: Point,\n  to: Point,\n  fromDir: PortDirection,\n  toDir: PortDirection,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): Point[] {\n  const stubLen = pad;\n  const stub1: Point = {\n    x: from.x + (fromDir === 'W' ? -stubLen : fromDir === 'E' ? stubLen : 0),\n    y: from.y + (fromDir === 'N' ? -stubLen : fromDir === 'S' ? stubLen : 0),\n  };\n  const stub2: Point = {\n    x: to.x + (toDir === 'W' ? -stubLen : toDir === 'E' ? stubLen : 0),\n    y: to.y + (toDir === 'N' ? -stubLen : toDir === 'S' ? stubLen : 0),\n  };\n\n  // Route V+V between the stubs\n  const midY = (stub1.y + stub2.y) / 2;\n  let bendY = clearHorizontalBend(midY, stub1.x, stub2.x, stub1.y, stub2.y, obstacles, pad);\n  bendY = clearVerticalSegments(bendY, stub1, stub2, obstacles, pad);\n\n  return [from, stub1, { x: stub1.x, y: bendY }, { x: stub2.x, y: bendY }, stub2, to];\n}\n\n/**\n * Build an H+H fallback route that honours V exit/entry port directions.\n * Adds short vertical stubs at start/end, then routes H\u2192V\u2192H in between.\n */\nfunction buildHHRouteWithStubs(\n  from: Point,\n  to: Point,\n  fromDir: PortDirection,\n  toDir: PortDirection,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n): Point[] {\n  const stubLen = pad;\n  const stub1: Point = {\n    x: from.x + (fromDir === 'W' ? -stubLen : fromDir === 'E' ? stubLen : 0),\n    y: from.y + (fromDir === 'N' ? -stubLen : fromDir === 'S' ? stubLen : 0),\n  };\n  const stub2: Point = {\n    x: to.x + (toDir === 'W' ? -stubLen : toDir === 'E' ? stubLen : 0),\n    y: to.y + (toDir === 'N' ? -stubLen : toDir === 'S' ? stubLen : 0),\n  };\n\n  const midX = (stub1.x + stub2.x) / 2;\n  let bendX = clearVerticalBend(midX, stub1.y, stub2.y, stub1.x, stub2.x, obstacles, pad);\n  bendX = clearHorizontalSegments(bendX, stub1, stub2, obstacles, pad);\n\n  return [from, stub1, { x: bendX, y: stub1.y }, { x: bendX, y: stub2.y }, stub2, to];\n}\n\n// \u2500\u2500\u2500 Bezier \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction controlPointForPort(point: Point, dir: PortDirection, pull: number): Point {\n  switch (dir) {\n    case 'N':\n      return { x: point.x, y: point.y - pull };\n    case 'S':\n      return { x: point.x, y: point.y + pull };\n    case 'E':\n      return { x: point.x + pull, y: point.y };\n    case 'W':\n      return { x: point.x - pull, y: point.y };\n  }\n}\n\nfunction pointDistance(a: Point, b: Point): number {\n  const dx = b.x - a.x;\n  const dy = b.y - a.y;\n  return Math.sqrt(dx * dx + dy * dy);\n}\n\nfunction avoidObstaclesWithPortTangents(\n  from: Point,\n  to: Point,\n  cp1: Point,\n  cp2: Point,\n  fromDir: PortDirection | undefined,\n  toDir: PortDirection | undefined,\n  basePull: number,\n  obstacles: ReadonlyArray<Rect>,\n  pad: number,\n): { cp1: Point; cp2: Point } {\n  if (!fromDir && !toDir) return { cp1, cp2 };\n  if (!bezierSegmentsHitObstacles(from, cp1, cp2, to, obstacles, 16)) return { cp1, cp2 };\n\n  const maxPull = Math.max(basePull, Math.min(pointDistance(from, to) * 0.6, 600));\n  const step = Math.max(pad * 2, (maxPull - basePull) / 6, 24);\n  const fromPulls = fromDir ? portPullCandidates(basePull, maxPull, step) : [basePull];\n  const toPulls = toDir ? portPullCandidates(basePull, maxPull, step) : [basePull];\n  const pairs = fromPulls\n    .flatMap((fromPull) =>\n      toPulls.map((toPull) => ({\n        fromPull,\n        toPull,\n        cost:\n          (fromDir ? Math.abs(fromPull - basePull) : 0) + (toDir ? Math.abs(toPull - basePull) : 0),\n      })),\n    )\n    .sort((a, b) => a.cost - b.cost);\n\n  for (const { fromPull, toPull } of pairs) {\n    const candidateCp1 = fromDir ? controlPointForPort(from, fromDir, fromPull) : cp1;\n    const candidateCp2 = toDir ? controlPointForPort(to, toDir, toPull) : cp2;\n    if (!bezierSegmentsHitObstacles(from, candidateCp1, candidateCp2, to, obstacles, 16)) {\n      return { cp1: candidateCp1, cp2: candidateCp2 };\n    }\n  }\n\n  return { cp1, cp2 };\n}\n\nfunction portPullCandidates(basePull: number, maxPull: number, step: number): number[] {\n  const pulls = new Set<number>([basePull]);\n  const minPull = basePull > 0 ? Math.min(step, basePull) : 0;\n  for (let pull = minPull; pull <= maxPull; pull += step) pulls.add(Math.min(pull, maxPull));\n  pulls.add(maxPull);\n  return [...pulls].sort((a, b) => Math.abs(a - basePull) - Math.abs(b - basePull));\n}\n\nfunction bezierSegmentsHitObstacles(\n  p0: Point,\n  p1: Point,\n  p2: Point,\n  p3: Point,\n  obstacles: ReadonlyArray<Rect>,\n  samples: number,\n): boolean {\n  let prev = p0;\n  for (let i = 1; i <= samples; i++) {\n    const curr = sampleBezier(p0, p1, p2, p3, i / samples);\n    for (const obs of obstacles) {\n      if (segCrossesInterior(prev, curr, obs, 0)) return true;\n    }\n    prev = curr;\n  }\n  return false;\n}\n\nclass BezierRouter implements Router {\n  route({ from, to, tension, obstacles, padding, fromDir, toDir }: RouteRequest): Route {\n    const t = tension ?? 0.4;\n    const dx = to.x - from.x;\n    const dy = to.y - from.y;\n    const pad = padding ?? 12;\n    const dist = Math.sqrt(dx * dx + dy * dy);\n\n    // Cap the control point pull to avoid exaggerated arcs on long routes.\n    // Pull scales with distance but is clamped to a sensible maximum.\n    const MAX_PULL = 150;\n\n    let cp1: Point;\n    let cp2: Point;\n\n    if (Math.abs(dy) >= Math.abs(dx)) {\n      const pull = Math.min(Math.abs(dy) * t, MAX_PULL);\n      cp1 = { x: from.x, y: from.y + (dy >= 0 ? pull : -pull) };\n      cp2 = { x: to.x, y: to.y + (dy >= 0 ? -pull : pull) };\n    } else {\n      const pull = Math.min(Math.abs(dx) * t, MAX_PULL);\n      cp1 = { x: from.x + (dx >= 0 ? pull : -pull), y: from.y };\n      cp2 = { x: to.x + (dx >= 0 ? -pull : pull), y: to.y };\n    }\n\n    const portPull = Math.min(dist * t, MAX_PULL);\n    if (fromDir) cp1 = controlPointForPort(from, fromDir, portPull);\n    if (toDir) cp2 = controlPointForPort(to, toDir, portPull);\n\n    // Check for obstacle collisions and adjust control points if needed\n    if (obstacles && obstacles.length > 0) {\n      const adjusted = avoidObstaclesBezier(from, to, cp1, cp2, obstacles, pad, t);\n      cp1 = adjusted.cp1;\n      cp2 = adjusted.cp2;\n      if (fromDir) cp1 = controlPointForPort(from, fromDir, portPull);\n      if (toDir) cp2 = controlPointForPort(to, toDir, portPull);\n      const portAdjusted = avoidObstaclesWithPortTangents(\n        from,\n        to,\n        cp1,\n        cp2,\n        fromDir,\n        toDir,\n        portPull,\n        obstacles,\n        pad,\n      );\n      cp1 = portAdjusted.cp1;\n      cp2 = portAdjusted.cp2;\n      if (bezierSegmentsHitObstacles(from, cp1, cp2, to, obstacles, 16)) {\n        const fallbackRequest: RouteRequest = {\n          from,\n          to,\n          style: 'orthogonal',\n          obstacles,\n          padding: pad,\n        };\n        if (fromDir) (fallbackRequest as { fromDir?: PortDirection }).fromDir = fromDir;\n        if (toDir) (fallbackRequest as { toDir?: PortDirection }).toDir = toDir;\n        return new OrthogonalRouter().route(fallbackRequest);\n      }\n    }\n\n    return {\n      points: [from, cp1, cp2, to],\n      path: `M ${from.x} ${from.y} C ${cp1.x} ${cp1.y} ${cp2.x} ${cp2.y} ${to.x} ${to.y}`,\n      labelPosition: midpoint(from, to),\n    };\n  }\n}\n\n/**\n * Adjust bezier control points to avoid obstacles.\n *\n * Strategy: sample the curve and check for obstacle hits.\n * If the default curve collides, try offsetting control points\n * perpendicular to the from\u2192to axis in both directions.\n * Pick the direction with fewer collisions. If both still collide,\n * increase the perpendicular offset until clear (up to a limit).\n */\nfunction avoidObstaclesBezier(\n  from: Point,\n  to: Point,\n  cp1: Point,\n  cp2: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n  tension: number,\n): { cp1: Point; cp2: Point } {\n  const SAMPLES = 64;\n\n  // Check if default curve hits any obstacle\n  if (!bezierHitsObstacles(from, cp1, cp2, to, obstacles, pad, SAMPLES)) {\n    return { cp1, cp2 };\n  }\n\n  // Perpendicular to from\u2192to\n  const dx = to.x - from.x,\n    dy = to.y - from.y;\n  const len = Math.sqrt(dx * dx + dy * dy);\n  if (len < 1) return { cp1, cp2 };\n  const perpX = -dy / len;\n  const perpY = dx / len;\n\n  // The from\u2192to midpoint \u2014 prefer curves that stay close to this\n  const mid = midpoint(from, to);\n\n  // Try increasing perpendicular offsets; at each step, try BOTH directions\n  // and prefer the one whose curve stays closer to the from\u2192to midpoint (inner arc).\n  // Dense grouped layouts sometimes need a large arc to clear a whole service\n  // row. Try increasingly wider offsets before falling back to a polyline.\n  const MAX_OFFSET = len * 0.75;\n  const STEP = Math.max(20, len * 0.05);\n  for (let offset = STEP; offset <= MAX_OFFSET; offset += STEP) {\n    const cp1p: Point = { x: cp1.x + perpX * offset, y: cp1.y + perpY * offset };\n    const cp2p: Point = { x: cp2.x + perpX * offset, y: cp2.y + perpY * offset };\n    const clearP = !bezierHitsObstacles(from, cp1p, cp2p, to, obstacles, pad, SAMPLES);\n\n    const cp1n: Point = { x: cp1.x - perpX * offset, y: cp1.y - perpY * offset };\n    const cp2n: Point = { x: cp2.x - perpX * offset, y: cp2.y - perpY * offset };\n    const clearN = !bezierHitsObstacles(from, cp1n, cp2n, to, obstacles, pad, SAMPLES);\n\n    if (clearP && clearN) {\n      // Both clear \u2014 pick the one whose curve midpoint is closer to from\u2192to midpoint\n      const midP = sampleBezier(from, cp1p, cp2p, to, 0.5);\n      const midN = sampleBezier(from, cp1n, cp2n, to, 0.5);\n      const distP = (midP.x - mid.x) ** 2 + (midP.y - mid.y) ** 2;\n      const distN = (midN.x - mid.x) ** 2 + (midN.y - mid.y) ** 2;\n      return distP <= distN ? { cp1: cp1p, cp2: cp2p } : { cp1: cp1n, cp2: cp2n };\n    }\n    if (clearP) return { cp1: cp1p, cp2: cp2p };\n    if (clearN) return { cp1: cp1n, cp2: cp2n };\n  }\n\n  // Fallback: return the least-colliding direction at capped offset, preferring inner\n  const maxOff = MAX_OFFSET;\n  const cp1p: Point = { x: cp1.x + perpX * maxOff, y: cp1.y + perpY * maxOff };\n  const cp2p: Point = { x: cp2.x + perpX * maxOff, y: cp2.y + perpY * maxOff };\n  const cp1n: Point = { x: cp1.x - perpX * maxOff, y: cp1.y - perpY * maxOff };\n  const cp2n: Point = { x: cp2.x - perpX * maxOff, y: cp2.y - perpY * maxOff };\n\n  const hitsP = countBezierHits(from, cp1p, cp2p, to, obstacles, pad, SAMPLES);\n  const hitsN = countBezierHits(from, cp1n, cp2n, to, obstacles, pad, SAMPLES);\n  if (hitsP === hitsN) {\n    const midP = sampleBezier(from, cp1p, cp2p, to, 0.5);\n    const midN = sampleBezier(from, cp1n, cp2n, to, 0.5);\n    const distP = (midP.x - mid.x) ** 2 + (midP.y - mid.y) ** 2;\n    const distN = (midN.x - mid.x) ** 2 + (midN.y - mid.y) ** 2;\n    return distP <= distN ? { cp1: cp1p, cp2: cp2p } : { cp1: cp1n, cp2: cp2n };\n  }\n  return hitsP < hitsN ? { cp1: cp1p, cp2: cp2p } : { cp1: cp1n, cp2: cp2n };\n}\n\n/** Sample a cubic bezier and check if any sample is inside an obstacle. */\nfunction bezierHitsObstacles(\n  p0: Point,\n  p1: Point,\n  p2: Point,\n  p3: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n  samples: number,\n): boolean {\n  for (let i = 1; i < samples; i++) {\n    const t = i / samples;\n    const pt = sampleBezier(p0, p1, p2, p3, t);\n    for (const obs of obstacles) {\n      if (\n        pt.x > obs.x - pad &&\n        pt.x < obs.x + obs.width + pad &&\n        pt.y > obs.y - pad &&\n        pt.y < obs.y + obs.height + pad\n      )\n        return true;\n    }\n  }\n  return false;\n}\n\n/** Count obstacle hits along a bezier curve. */\nfunction countBezierHits(\n  p0: Point,\n  p1: Point,\n  p2: Point,\n  p3: Point,\n  obstacles: ReadonlyArray<import('../contracts/index.js').Rect>,\n  pad: number,\n  samples: number,\n): number {\n  let count = 0;\n  for (let i = 1; i < samples; i++) {\n    const t = i / samples;\n    const pt = sampleBezier(p0, p1, p2, p3, t);\n    for (const obs of obstacles) {\n      if (\n        pt.x > obs.x - pad &&\n        pt.x < obs.x + obs.width + pad &&\n        pt.y > obs.y - pad &&\n        pt.y < obs.y + obs.height + pad\n      )\n        count++;\n    }\n  }\n  return count;\n}\n\n/** Evaluate a cubic bezier at parameter t \u2208 [0, 1]. */\nfunction sampleBezier(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n  const u = 1 - t;\n  return {\n    x: u * u * u * p0.x + 3 * u * u * t * p1.x + 3 * u * t * t * p2.x + t * t * t * p3.x,\n    y: u * u * u * p0.y + 3 * u * u * t * p1.y + 3 * u * t * t * p2.y + t * t * t * p3.y,\n  };\n}\n\n// \u2500\u2500\u2500 Polyline \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Placeholder \u2014 routes straight until explicit waypoints are in RouteRequest.\n\nclass PolylineRouter implements Router {\n  route(req: RouteRequest): Route {\n    return new StraightRouter().route(req);\n  }\n}\n\n// \u2500\u2500\u2500 Singleton Instances \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const straightRouter: Router = new StraightRouter();\nexport const orthogonalRouter: Router = new OrthogonalRouter();\nexport const bezierRouter: Router = new BezierRouter();\nexport const polylineRouter: Router = new PolylineRouter();\n\n// \u2500\u2500\u2500 Factory & Default \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Create (or look up) a router by style name. */\nexport function createRouter(style: RouteStyle): Router {\n  switch (style) {\n    case 'straight':\n      return straightRouter;\n    case 'orthogonal':\n      return orthogonalRouter;\n    case 'bezier':\n      return bezierRouter;\n    case 'polyline':\n      return polylineRouter;\n  }\n}\n\n/** Default router used by layout engines unless overridden. */\nexport const defaultRouter: Router = orthogonalRouter;\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction midpoint(a: Point, b: Point): Point {\n  return { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n}\n", "import type {\n  RawOverlay,\n  CompiledOverlays,\n  Annotation,\n  Legend,\n  LegendCorner,\n} from '../contracts/index.js';\n\n/**\n * Convert raw grammar-emitted overlay directives into resolved overlay types.\n *\n * Position resolution for notes is deferred \u2014 positions are relative offsets\n * from the anchor element. The overlay layout function resolves these to\n * absolute coordinates once node positions are known.\n */\nexport function compileOverlays(raw: readonly RawOverlay[]): CompiledOverlays {\n  const annotations: Annotation[] = [];\n  let legend: Legend | undefined;\n\n  for (const item of raw) {\n    switch (item.type) {\n      case 'callout':\n      case 'note': {\n        const dx = item.offset?.dx ?? 0;\n        const dy = item.offset?.dy ?? -60;\n        annotations.push({\n          id: `${item.type}-${slugify(item.target)}-${annotations.length}`,\n          type: item.type,\n          text: item.text,\n          // position is the offset from the anchor; absolute coords resolved at layout time\n          position: { x: dx, y: dy },\n          anchor: { elementId: item.target },\n        });\n        break;\n      }\n\n      case 'legend': {\n        legend = {\n          ...(item.title !== undefined ? { title: item.title } : {}),\n          entries: item.entries,\n          corner: parseLegendCorner(item.corner),\n        };\n        break;\n      }\n    }\n  }\n\n  return { annotations, ...(legend !== undefined ? { legend } : {}) };\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction slugify(text: string): string {\n  return text\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '');\n}\n\nfunction parseLegendCorner(raw: string): LegendCorner {\n  const valid: LegendCorner[] = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];\n  return valid.includes(raw as LegendCorner) ? (raw as LegendCorner) : 'bottom-right';\n}\n", "import type {\n  CompiledOverlays,\n  Annotation,\n  Legend,\n  Scene,\n  SceneElement,\n  SceneGroup,\n  Rect,\n  Point,\n  ResolvedTheme,\n} from '../contracts/index.js';\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ANNO_MIN_W = 100;\nconst ANNO_MAX_W = 200;\nconst ANNO_PAD = 10;\nconst ANNO_FOLD = 10;\nconst LEGEND_MIN_W = 140;\nconst LEGEND_ROW_H = 20;\nconst LEGEND_PAD = 10;\nconst LEGEND_MARGIN = 12;\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface OverlayResult {\n  /** Additional elements to append to the scene's elements list. */\n  elements: SceneElement[];\n  /** Expanded viewBox that encompasses all overlay geometry. */\n  viewBox: Rect;\n}\n\n/**\n * Lay out compiled overlays (annotations + legend) relative to an existing scene.\n *\n * Diagram layout functions call this internally after positioning all nodes/edges.\n * The returned elements are appended to the scene's element list. The returned\n * viewBox replaces the scene's viewBox if it has expanded.\n */\nexport function layoutOverlays(\n  compiled: CompiledOverlays,\n  scene: Scene,\n  theme: ResolvedTheme,\n): OverlayResult {\n  const result: SceneElement[] = [];\n  let viewBox: Rect = { ...scene.viewBox };\n\n  // Build element-id \u2192 bounding box map for annotation anchor resolution\n  const boundsMap = new Map<string, Rect>();\n  for (const el of scene.elements) {\n    collectGroupBounds(el, 0, 0, boundsMap);\n  }\n\n  for (const anno of compiled.annotations) {\n    const laid = layoutAnnotation(anno, boundsMap, theme, scene.elements);\n    if (laid) {\n      result.push(laid.group);\n      viewBox = expandViewBox(viewBox, laid.bounds);\n    }\n  }\n\n  if (compiled.legend) {\n    const laid = layoutLegend(compiled.legend, viewBox, theme);\n    result.push(laid.group);\n    viewBox = expandViewBox(viewBox, laid.bounds);\n  }\n\n  return { elements: result, viewBox };\n}\n\n// \u2500\u2500\u2500 Annotation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction findObstructingHorizontalLine(\n  elements: readonly SceneElement[],\n  x: number,\n  yMin: number,\n  yMax: number,\n): number | null {\n  for (const el of elements) {\n    if (el.type === 'path' && el.d) {\n      const m = el.d.match(/^M\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)\\s*L\\s*([\\d.]+)\\s*[, ]\\s*([\\d.]+)/i);\n      if (m) {\n        const x1 = parseFloat(m[1]!),\n          y1 = parseFloat(m[2]!),\n          x2 = parseFloat(m[3]!),\n          y2 = parseFloat(m[4]!);\n        if (Math.abs(y1 - y2) < 1e-3) {\n          const minX = Math.min(x1, x2),\n            maxX = Math.max(x1, x2);\n          if (x >= minX - 10 && x <= maxX + 10 && y1 >= yMin && y1 <= yMax) {\n            return y1;\n          }\n        }\n      }\n    }\n  }\n  return null;\n}\n\nfunction layoutAnnotation(\n  anno: Annotation,\n  boundsMap: Map<string, Rect>,\n  theme: ResolvedTheme,\n  sceneElements: readonly SceneElement[],\n): { group: SceneGroup; bounds: Rect } | null {\n  const { palette, typography } = theme;\n\n  // Resolve absolute anchor point\n  let anchorPt: Point;\n\n  if ('elementId' in anno.anchor) {\n    const rawId = anno.anchor.elementId;\n    const elBounds =\n      boundsMap.get(rawId) ?? boundsMap.get(slugify(rawId)) ?? boundsMap.get(rawId.toLowerCase());\n    if (!elBounds) return null;\n    anchorPt = { x: elBounds.x + elBounds.width / 2, y: elBounds.y };\n  } else {\n    anchorPt = anno.anchor.point;\n  }\n\n  // Measure text\n  const charW = typography.baseFontSize * 0.52;\n  const maxW = anno.width ?? ANNO_MAX_W;\n  const lines = wrapText(anno.text, maxW, charW);\n  const textW = Math.max(\n    ANNO_MIN_W,\n    Math.min(maxW, Math.max(...lines.map((l) => l.length * charW)) + ANNO_PAD * 2),\n  );\n  const lineH = typography.baseFontSize * typography.lineHeight;\n  const boxW = textW;\n  const boxH = lines.length * lineH + ANNO_PAD * 2;\n\n  let x: number;\n  let y: number;\n  if ('elementId' in anno.anchor) {\n    x = anchorPt.x - boxW / 2 + anno.position.x;\n    // Default position.y is -60; place box 14px above anchor point, adjusted by any custom offset\n    const yOffset = anno.position.y !== -60 ? anno.position.y : -boxH - 14;\n    y = anchorPt.y + yOffset;\n    if (anno.position.y === -60) {\n      // Check if the proposed box intersects a horizontal divider/axis line above the anchor\n      const obstLineY = findObstructingHorizontalLine(sceneElements, anchorPt.x, y, y + boxH);\n      if (obstLineY !== null) {\n        y = obstLineY - boxH - 14;\n      }\n    }\n  } else {\n    x = anno.position.x;\n    y = anno.position.y;\n  }\n\n  // Connector: dashed line from closest box-edge point to anchor\n  const connStart = closestEdgePoint({ x, y, width: boxW, height: boxH }, anchorPt);\n\n  const isCallout = anno.type === 'callout';\n  const children: SceneElement[] = [];\n\n  if (isCallout) {\n    // Callout connector line\n    children.push({\n      type: 'path',\n      d: `M ${connStart.x} ${connStart.y} L ${anchorPt.x} ${anchorPt.y}`,\n      stroke: palette.primary,\n      strokeWidth: 1,\n    });\n    // Anchor dot\n    children.push({\n      type: 'circle',\n      center: anchorPt,\n      radius: 2.5,\n      fill: palette.primary,\n      stroke: palette.primary,\n      strokeWidth: 1,\n    });\n    // Rounded pill/card box\n    children.push({\n      type: 'rect',\n      bounds: { x, y, width: boxW, height: boxH },\n      rx: 4,\n      fill: palette.background,\n      stroke: palette.primary,\n      strokeWidth: 1,\n    });\n  } else {\n    // Note connector\n    children.push({\n      type: 'path',\n      d: `M ${connStart.x} ${connStart.y} L ${anchorPt.x} ${anchorPt.y}`,\n      stroke: palette.border,\n      strokeWidth: 1,\n      strokeDasharray: '4 3',\n    });\n    // Box body with folded corner\n    children.push({\n      type: 'path',\n      d: `M ${x} ${y} L ${x + boxW - ANNO_FOLD} ${y} L ${x + boxW} ${y + ANNO_FOLD} L ${x + boxW} ${y + boxH} L ${x} ${y + boxH} Z`,\n      fill: palette.surface,\n      stroke: palette.border,\n      strokeWidth: 1,\n    });\n    // Fold triangle\n    children.push({\n      type: 'path',\n      d: `M ${x + boxW - ANNO_FOLD} ${y} L ${x + boxW - ANNO_FOLD} ${y + ANNO_FOLD} L ${x + boxW} ${y + ANNO_FOLD} Z`,\n      fill: palette.border,\n      stroke: palette.border,\n      strokeWidth: 1,\n    });\n  }\n\n  // Text lines\n  for (let i = 0; i < lines.length; i++) {\n    children.push({\n      type: 'text',\n      content: lines[i] ?? '',\n      position: { x: x + ANNO_PAD, y: y + ANNO_PAD + typography.baseFontSize + i * lineH },\n      fontSize: typography.baseFontSize,\n      fontFamily: isCallout\n        ? 'Instrument Serif, Georgia, \"Times New Roman\", serif'\n        : typography.fontFamily,\n      fill: palette.text,\n    });\n  }\n\n  const bx = Math.min(x, anchorPt.x);\n  const by = Math.min(y, anchorPt.y);\n  const bounds: Rect = {\n    x: bx,\n    y: by,\n    width: Math.max(boxW, Math.abs(anchorPt.x - x)) + Math.max(0, x - bx),\n    height: Math.max(boxH, Math.abs(anchorPt.y - y)) + Math.max(0, y - by),\n  };\n\n  return { group: { type: 'group', id: anno.id, children }, bounds };\n}\n\n// \u2500\u2500\u2500 Legend \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction layoutLegend(\n  legend: Legend,\n  viewBox: Rect,\n  theme: ResolvedTheme,\n): { group: SceneGroup; bounds: Rect } {\n  const { palette, typography } = theme;\n  const titleH = legend.title ? LEGEND_ROW_H + 4 : 0;\n  const boxH = LEGEND_PAD * 2 + titleH + legend.entries.length * LEGEND_ROW_H;\n  const boxW = Math.max(\n    legend.width ?? LEGEND_MIN_W,\n    ...(legend.title\n      ? [legend.title.length * typography.baseFontSize * 0.55 + LEGEND_PAD * 2]\n      : []),\n    ...legend.entries.map(\n      (e) => (e.key.length + e.value.length + 3) * typography.smallFontSize * 0.52 + LEGEND_PAD * 2,\n    ),\n  );\n\n  const c = legend.corner;\n  const x =\n    c === 'top-left' || c === 'bottom-left'\n      ? viewBox.x + LEGEND_MARGIN\n      : viewBox.x + viewBox.width - boxW - LEGEND_MARGIN;\n  const y =\n    c === 'top-left' || c === 'top-right'\n      ? viewBox.y + LEGEND_MARGIN\n      : viewBox.y + viewBox.height - boxH - LEGEND_MARGIN;\n\n  const children: SceneElement[] = [\n    {\n      type: 'rect',\n      bounds: { x, y, width: boxW, height: boxH },\n      fill: palette.background,\n      stroke: palette.border,\n      strokeWidth: 1,\n      rx: 4,\n    },\n  ];\n\n  let rowY = y + LEGEND_PAD;\n\n  if (legend.title) {\n    children.push({\n      type: 'text',\n      content: legend.title,\n      position: { x: x + LEGEND_PAD, y: rowY + typography.baseFontSize },\n      fontSize: typography.baseFontSize,\n      fontFamily: typography.fontFamily,\n      fontWeight: 'bold',\n      fill: palette.text,\n    });\n    rowY += LEGEND_ROW_H + 4;\n    children.push({\n      type: 'path',\n      d: `M ${x + 4} ${rowY - 2} L ${x + boxW - 4} ${rowY - 2}`,\n      stroke: palette.border,\n      strokeWidth: 1,\n    });\n  }\n\n  for (const entry of legend.entries) {\n    children.push({\n      type: 'text',\n      content: entry.key,\n      position: { x: x + LEGEND_PAD, y: rowY + typography.smallFontSize },\n      fontSize: typography.smallFontSize,\n      fontFamily: typography.fontFamily,\n      fontWeight: 'bold',\n      fill: palette.text,\n    });\n    children.push({\n      type: 'text',\n      content: entry.value,\n      position: { x: x + boxW / 2 + 4, y: rowY + typography.smallFontSize },\n      fontSize: typography.smallFontSize,\n      fontFamily: typography.fontFamily,\n      fill: palette.textMuted,\n    });\n    rowY += LEGEND_ROW_H;\n  }\n\n  return {\n    group: { type: 'group', children },\n    bounds: { x, y, width: boxW, height: boxH },\n  };\n}\n\n// \u2500\u2500\u2500 Scene Tree Walking \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Walk the element tree collecting id \u2192 bounding box for every named group. */\nfunction slugify(text: string): string {\n  return text\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '');\n}\n\nfunction collectGroupBounds(\n  el: SceneElement,\n  ox: number,\n  oy: number,\n  map: Map<string, Rect>,\n): void {\n  if (el.type === 'text') {\n    const b = elementBoundsAt(el, ox, oy);\n    if (b) {\n      const trimmed = el.content.trim();\n      if (!map.has(trimmed)) map.set(trimmed, b);\n      const slug = slugify(trimmed);\n      if (slug && !map.has(slug)) map.set(slug, b);\n    }\n    return;\n  }\n\n  if (el.type !== 'group') return;\n\n  const [tx, ty] = parseTranslate(el.transform);\n  const nx = ox + tx;\n  const ny = oy + ty;\n\n  if (el.id) {\n    const childBounds = el.children\n      .map((c) => elementBoundsAt(c, nx, ny))\n      .filter((b): b is Rect => b !== null);\n    if (childBounds.length > 0) map.set(el.id, unionRects(childBounds));\n  }\n\n  for (const child of el.children) {\n    collectGroupBounds(child, nx, ny, map);\n  }\n}\n\nfunction elementBoundsAt(el: SceneElement, ox: number, oy: number): Rect | null {\n  switch (el.type) {\n    case 'rect':\n      return {\n        x: el.bounds.x + ox,\n        y: el.bounds.y + oy,\n        width: el.bounds.width,\n        height: el.bounds.height,\n      };\n    case 'circle':\n      return {\n        x: el.center.x - el.radius + ox,\n        y: el.center.y - el.radius + oy,\n        width: el.radius * 2,\n        height: el.radius * 2,\n      };\n    case 'text': {\n      const w = el.content.length * el.fontSize * 0.52;\n      const anchor = (el as { anchor?: string }).anchor ?? 'start';\n      const startX =\n        anchor === 'middle'\n          ? el.position.x - w / 2\n          : anchor === 'end'\n            ? el.position.x - w\n            : el.position.x;\n      return {\n        x: startX + ox,\n        y: el.position.y - el.fontSize + oy,\n        width: w,\n        height: el.fontSize * 1.4,\n      };\n    }\n    case 'group': {\n      const [tx, ty] = parseTranslate(el.transform);\n      const kids = el.children\n        .map((c) => elementBoundsAt(c, ox + tx, oy + ty))\n        .filter((b): b is Rect => b !== null);\n      return kids.length > 0 ? unionRects(kids) : null;\n    }\n    case 'path':\n      return null;\n    case 'icon':\n      return { x: el.x + ox, y: el.y + oy, width: el.size, height: el.size };\n  }\n}\n\n// \u2500\u2500\u2500 Geometry Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parseTranslate(transform: string | undefined): [number, number] {\n  if (!transform) return [0, 0];\n  const m = transform.match(/translate\\(\\s*(-?[\\d.]+)\\s*[, ]\\s*(-?[\\d.]+)\\s*\\)/);\n  return m ? [parseFloat(m[1]!), parseFloat(m[2]!)] : [0, 0];\n}\n\nfunction closestEdgePoint(box: Rect, target: Point): Point {\n  const cx = box.x + box.width / 2;\n  const cy = box.y + box.height / 2;\n  const dx = target.x - cx;\n  const dy = target.y - cy;\n\n  if (Math.abs(dx) * box.height > Math.abs(dy) * box.width) {\n    const sx = dx > 0 ? 1 : -1;\n    const ex = cx + (sx * box.width) / 2;\n    const ey = cy + (Math.abs(dx) > 0 ? (dy / Math.abs(dx)) * (box.width / 2) : 0);\n    return { x: ex, y: clamp(ey, box.y, box.y + box.height) };\n  } else {\n    const sy = dy > 0 ? 1 : -1;\n    const ey = cy + (sy * box.height) / 2;\n    const ex = cx + (Math.abs(dy) > 0 ? (dx / Math.abs(dy)) * (box.height / 2) : 0);\n    return { x: clamp(ex, box.x, box.x + box.width), y: ey };\n  }\n}\n\nfunction wrapText(text: string, maxWidth: number, charWidth: number): string[] {\n  const words = text.split(' ');\n  const lines: string[] = [];\n  let current = '';\n  for (const word of words) {\n    const candidate = current ? `${current} ${word}` : word;\n    if (candidate.length * charWidth > maxWidth && current) {\n      lines.push(current);\n      current = word;\n    } else {\n      current = candidate;\n    }\n  }\n  if (current) lines.push(current);\n  return lines.length > 0 ? lines : [''];\n}\n\nfunction expandViewBox(vb: Rect, bounds: Rect): Rect {\n  const x = Math.min(vb.x, bounds.x);\n  const y = Math.min(vb.y, bounds.y);\n  const right = Math.max(vb.x + vb.width, bounds.x + bounds.width);\n  const bottom = Math.max(vb.y + vb.height, bounds.y + bounds.height);\n  return { x, y, width: right - x, height: bottom - y };\n}\n\nfunction unionRects(rects: Rect[]): Rect {\n  const x = Math.min(...rects.map((r) => r.x));\n  const y = Math.min(...rects.map((r) => r.y));\n  const right = Math.max(...rects.map((r) => r.x + r.width));\n  const bottom = Math.max(...rects.map((r) => r.y + r.height));\n  return { x, y, width: right - x, height: bottom - y };\n}\n\nfunction clamp(v: number, lo: number, hi: number): number {\n  return Math.max(lo, Math.min(hi, v));\n}\n", "/**\n * @file overlay/apply.ts \u2014 Uniform overlay application for layout engines.\n *\n * Every diagram layout ends the same way: if the IR carries overlays, compile\n * them, lay them out against the finished scene, and merge their elements +\n * expanded viewBox back in. This helper centralizes that tail so each layout\n * engine reduces to a single call.\n */\n\nimport type { RawOverlay, Scene, ResolvedTheme } from '../contracts/index.js';\nimport { compileOverlays } from './compiler.js';\nimport { layoutOverlays } from './layout.js';\n\n/**\n * Return a scene with the IR's overlays merged in. When there are no overlays\n * the input scene is returned unchanged.\n */\nexport function applyOverlays(\n  scene: Scene,\n  overlays: readonly RawOverlay[] | undefined,\n  theme: ResolvedTheme,\n): Scene {\n  if (!overlays || overlays.length === 0) return scene;\n  const compiled = compileOverlays(overlays);\n  const { elements, viewBox } = layoutOverlays(compiled, scene, theme);\n  return { ...scene, elements: [...scene.elements, ...elements], viewBox };\n}\n", "/**\n * @file scene/build.ts \u2014 Scene-element construction helpers.\n *\n * A `Pen` is bound once to a theme and produces SceneElements, removing the\n * `type` discriminant and the repeated `fontFamily: typography.fontFamily`\n * plumbing from every call site. Shapes take explicit colours (which vary per\n * element); only the font family \u2014 the one token that is invariant per theme \u2014\n * is defaulted. Output is identical to the equivalent object literals.\n */\n\nimport type {\n  SceneElement,\n  SceneText,\n  SceneRect,\n  SceneCircle,\n  ScenePath,\n  SceneGroup,\n  SceneIcon,\n  Rect,\n  Point,\n  Color,\n  FontWeight,\n  TextAnchor,\n  ResolvedTheme,\n} from '../contracts/index.js';\nimport type { ResolvedIcon } from '../contracts/icons.js';\nimport type { RenderedConnectorAnimation } from '../contracts/animations.js';\n\nexport interface TextOpts {\n  weight?: FontWeight;\n  anchor?: TextAnchor;\n  opacity?: number;\n}\n\nexport interface RectOpts {\n  rx?: number;\n  fillOpacity?: number;\n  opacity?: number;\n}\n\nexport interface PathOpts {\n  fill?: Color;\n  dash?: string;\n  markerEnd?: string;\n  markerStart?: string;\n  animated?: RenderedConnectorAnimation;\n  opacity?: number;\n}\n\nexport interface GroupOpts {\n  id?: string;\n  transform?: string;\n  opacity?: number;\n}\n\nexport interface IconOpts {\n  /** CSS color token for monochrome tint (e.g. \"#1e293b\"). Ignored for brand icons. */\n  color?: string;\n  opacity?: number;\n}\n\nexport interface Pen {\n  /** Text at (x, y) with the theme font family; size + fill are explicit. */\n  text(\n    content: string,\n    x: number,\n    y: number,\n    size: number,\n    fill: Color,\n    opts?: TextOpts,\n  ): SceneText;\n  rect(bounds: Rect, fill: Color, stroke: Color, strokeWidth: number, opts?: RectOpts): SceneRect;\n  circle(\n    center: Point,\n    radius: number,\n    fill: Color,\n    stroke: Color,\n    strokeWidth: number,\n    opts?: { opacity?: number },\n  ): SceneCircle;\n  path(d: string, stroke: Color, strokeWidth: number, opts?: PathOpts): ScenePath;\n  group(children: readonly SceneElement[], opts?: GroupOpts): SceneGroup;\n  /**\n   * Place a resolved icon at (x, y) fitting into a `size \u00D7 size` box.\n   *\n   * This is the P6 seam: Bjarne's layout engine calls this after resolving\n   * an icon token from a node IR (FlowNode.icon, MindNode.icon, etc.).\n   * The renderer centers and scales the icon's viewBox into the target box,\n   * applies palette tinting for monochrome icons, and namespaces brand IDs.\n   */\n  icon(resolvedIcon: ResolvedIcon, x: number, y: number, size: number, opts?: IconOpts): SceneIcon;\n}\n\n/** Create a Pen bound to a theme's font family. */\nexport function pen(theme: ResolvedTheme): Pen {\n  const fontFamily = theme.typography.fontFamily;\n  return {\n    text(content, x, y, size, fill, opts = {}) {\n      return {\n        type: 'text',\n        content,\n        position: { x, y },\n        fontSize: size,\n        fontFamily,\n        fill,\n        ...(opts.weight !== undefined ? { fontWeight: opts.weight } : {}),\n        ...(opts.anchor !== undefined ? { anchor: opts.anchor } : {}),\n        ...(opts.opacity !== undefined ? { opacity: opts.opacity } : {}),\n      };\n    },\n    rect(bounds, fill, stroke, strokeWidth, opts = {}) {\n      return {\n        type: 'rect',\n        bounds,\n        fill,\n        stroke,\n        strokeWidth,\n        ...(opts.rx !== undefined ? { rx: opts.rx } : {}),\n        ...(opts.fillOpacity !== undefined ? { fillOpacity: opts.fillOpacity } : {}),\n        ...(opts.opacity !== undefined ? { opacity: opts.opacity } : {}),\n      };\n    },\n    circle(center, radius, fill, stroke, strokeWidth, opts = {}) {\n      return {\n        type: 'circle',\n        center,\n        radius,\n        fill,\n        stroke,\n        strokeWidth,\n        ...(opts.opacity !== undefined ? { opacity: opts.opacity } : {}),\n      };\n    },\n    path(d, stroke, strokeWidth, opts = {}) {\n      return {\n        type: 'path',\n        d,\n        stroke,\n        strokeWidth,\n        ...(opts.fill !== undefined ? { fill: opts.fill } : {}),\n        ...(opts.dash !== undefined ? { strokeDasharray: opts.dash } : {}),\n        ...(opts.markerEnd !== undefined ? { markerEnd: opts.markerEnd } : {}),\n        ...(opts.markerStart !== undefined ? { markerStart: opts.markerStart } : {}),\n        ...(opts.animated !== undefined ? { animated: opts.animated } : {}),\n        ...(opts.opacity !== undefined ? { opacity: opts.opacity } : {}),\n      };\n    },\n    group(children, opts = {}) {\n      return {\n        type: 'group',\n        children,\n        ...(opts.id !== undefined ? { id: opts.id } : {}),\n        ...(opts.transform !== undefined ? { transform: opts.transform } : {}),\n        ...(opts.opacity !== undefined ? { opacity: opts.opacity } : {}),\n      };\n    },\n    icon(resolvedIcon, x, y, size, opts = {}) {\n      return {\n        type: 'icon' as const,\n        icon: resolvedIcon,\n        x,\n        y,\n        size,\n        ...(opts.color !== undefined ? { color: opts.color } : {}),\n        ...(opts.opacity !== undefined ? { opacity: opts.opacity } : {}),\n      };\n    },\n  };\n}\n", "/**\n * @file text/metrics.ts \u2014 Deterministic text-width measurement.\n *\n * General utility (any diagram). Uses a hardcoded per-character advance-width\n * table derived from DejaVu Sans (fraction of the em square), so measurements\n * are byte-identical across platforms \u2014 no font parser, no system locale.\n *\n * Ported from packages/core/src/fonts/metrics.ts.\n */\n\n/**\n * Advance widths as a fraction of the em square for DejaVu Sans Regular.\n * Key is the Unicode code point (decimal). ASCII printable range plus a few\n * extras; everything else uses DEFAULT_ADVANCE.\n */\nconst ADVANCE: Record<number, number> = {\n  32: 0.2793,\n  33: 0.2793,\n  34: 0.3574,\n  35: 0.5576,\n  36: 0.5576,\n  37: 0.8906,\n  38: 0.6699,\n  39: 0.1914,\n  40: 0.334,\n  41: 0.334,\n  42: 0.3906,\n  43: 0.5859,\n  44: 0.2793,\n  45: 0.334,\n  46: 0.2793,\n  47: 0.3125,\n  48: 0.5576,\n  49: 0.5576,\n  50: 0.5576,\n  51: 0.5576,\n  52: 0.5576,\n  53: 0.5576,\n  54: 0.5576,\n  55: 0.5576,\n  56: 0.5576,\n  57: 0.5576,\n  58: 0.2793,\n  59: 0.2793,\n  60: 0.5859,\n  61: 0.5859,\n  62: 0.5859,\n  63: 0.5576,\n  64: 1.0186,\n  65: 0.6699,\n  66: 0.6699,\n  67: 0.7227,\n  68: 0.7227,\n  69: 0.6699,\n  70: 0.6133,\n  71: 0.7793,\n  72: 0.7227,\n  73: 0.2783,\n  74: 0.5,\n  75: 0.6699,\n  76: 0.5576,\n  77: 0.8359,\n  78: 0.7227,\n  79: 0.7793,\n  80: 0.6133,\n  81: 0.7793,\n  82: 0.7227,\n  83: 0.6133,\n  84: 0.6133,\n  85: 0.7227,\n  86: 0.6699,\n  87: 0.9453,\n  88: 0.6699,\n  89: 0.6699,\n  90: 0.6133,\n  91: 0.2793,\n  92: 0.3125,\n  93: 0.2793,\n  94: 0.5859,\n  95: 0.5576,\n  96: 0.334,\n  97: 0.5576,\n  98: 0.5576,\n  99: 0.5,\n  100: 0.5576,\n  101: 0.5576,\n  102: 0.2793,\n  103: 0.5576,\n  104: 0.5576,\n  105: 0.2217,\n  106: 0.2217,\n  107: 0.5,\n  108: 0.2217,\n  109: 0.8359,\n  110: 0.5576,\n  111: 0.5576,\n  112: 0.5576,\n  113: 0.5576,\n  114: 0.334,\n  115: 0.5,\n  116: 0.334,\n  117: 0.5576,\n  118: 0.5,\n  119: 0.7227,\n  120: 0.5,\n  121: 0.5,\n  122: 0.5,\n  123: 0.334,\n  124: 0.2598,\n  125: 0.334,\n  126: 0.5859,\n};\n\n/** Fallback advance width for characters not in the table (em fraction). */\nconst DEFAULT_ADVANCE = 0.5576;\n\n/** Line-height multiplier (leading). */\nconst LINE_HEIGHT_FACTOR = 1.2;\n\n/**\n * Measure the rendered width/height of `text` at `fontSizePx` pixels.\n */\nexport function measureText(text: string, fontSizePx: number): { width: number; height: number } {\n  let totalEm = 0;\n  for (let i = 0; i < text.length; i++) {\n    const cp = text.codePointAt(i) ?? 32;\n    totalEm += ADVANCE[cp] ?? DEFAULT_ADVANCE;\n  }\n  return {\n    width: totalEm * fontSizePx,\n    height: fontSizePx * LINE_HEIGHT_FACTOR,\n  };\n}\n\n/** Convert point size to CSS pixels (at 96 dpi; 1pt = 96/72 px). */\nexport function ptToPx(pt: number): number {\n  return pt * (96 / 72);\n}\n", "/**\n * @file text/wrap.ts \u2014 Deterministic text wrapping and truncation.\n *\n * General utility (any diagram). Uses the embedded font metrics from\n * ./metrics.js. Same input always yields same output.\n *\n * Ported from packages/core/src/text-wrap.ts.\n */\n\nimport { measureText } from './metrics.js';\n\nconst ELLIPSIS = '\u2026';\n\nexport interface WrappedText {\n  lines: string[];\n}\n\n/**\n * Wrap text to fit maxWidth (px) at fontSizePx, with at most maxLines lines.\n * Breaks at word boundaries; truncates the last visible line with an ellipsis.\n */\nexport function wrapText(\n  text: string,\n  fontSizePx: number,\n  maxWidth: number,\n  maxLines: number,\n): WrappedText {\n  if (!text || maxLines <= 0 || maxWidth <= 0) return { lines: [] };\n\n  const words = text.split(/\\s+/).filter(Boolean);\n  if (words.length === 0) return { lines: [] };\n\n  const lines: string[] = [];\n  let current = '';\n\n  for (let wi = 0; wi < words.length; wi++) {\n    const word = words[wi]!;\n    const candidate = current ? `${current} ${word}` : word;\n\n    if (measureText(candidate, fontSizePx).width <= maxWidth) {\n      current = candidate;\n    } else {\n      if (current) {\n        if (lines.length === maxLines - 1) {\n          const remaining = words.slice(wi).join(' ');\n          const full = current ? `${current} ${remaining}` : remaining;\n          lines.push(truncateText(full, fontSizePx, maxWidth));\n          return { lines };\n        }\n        lines.push(current);\n        current = word;\n      } else {\n        if (lines.length === maxLines - 1) {\n          lines.push(truncateText(word, fontSizePx, maxWidth));\n          return { lines };\n        }\n        lines.push(truncateText(word, fontSizePx, maxWidth));\n        current = '';\n      }\n    }\n  }\n\n  if (current) {\n    if (lines.length < maxLines) {\n      lines.push(current);\n    } else {\n      const last = lines[lines.length - 1] ?? '';\n      lines[lines.length - 1] = truncateText(`${last} ${current}`, fontSizePx, maxWidth);\n    }\n  }\n\n  return { lines };\n}\n\n/**\n * Truncate text to fit maxWidth (px) at fontSizePx, appending an ellipsis if cut.\n */\nexport function truncateText(text: string, fontSizePx: number, maxWidth: number): string {\n  if (measureText(text, fontSizePx).width <= maxWidth) return text;\n\n  const ellipsisWidth = measureText(ELLIPSIS, fontSizePx).width;\n  const budget = maxWidth - ellipsisWidth;\n  if (budget <= 0) return ELLIPSIS;\n\n  let lo = 0;\n  let hi = text.length;\n  while (lo < hi) {\n    const mid = Math.floor((lo + hi + 1) / 2);\n    if (measureText(text.slice(0, mid), fontSizePx).width <= budget) {\n      lo = mid;\n    } else {\n      hi = mid - 1;\n    }\n  }\n\n  return text.slice(0, lo) + ELLIPSIS;\n}\n", "/**\n * @file util/round.ts \u2014 Deterministic round-half-up helpers.\n *\n * Layout coordinates round half up (toward +\u221E) so output is locale- and\n * platform-stable. Shared by every layout engine; never use Math.round (which\n * rounds half to even in some runtimes) for scene geometry.\n */\n\n/** Round half up to the nearest integer. */\nexport function rhuInt(v: number): number {\n  return Math.floor(v + 0.5);\n}\n\n/** Round half up to `decimals` places (default 2) \u2014 for sub-pixel path data. */\nexport function rhu(v: number, decimals = 2): number {\n  const f = 10 ** decimals;\n  return Math.floor(v * f + 0.5) / f;\n}\n", "/**\n * @file text/formatted.ts \u2014 Unified multi-line and two-tier text formatting across Triton.\n *\n * Supports:\n * - Semantic two-tier hierarchy: \"Title :: Subtitle\" (bold title + muted subtitle)\n * - Explicit line breaks: \"<br>\", \"<br/>\", \"<br />\", \"\\n\", \"\\\\n\"\n * - Automatic word-boundary wrapping for lines exceeding width threshold\n * - Deterministic font measurement and vertical baseline placement\n */\n\nimport { measureText } from './metrics.js';\nimport { wrapText } from './wrap.js';\nimport type { SceneElement } from '../contracts/index.js';\nimport type { pen } from '../scene/build.js';\nimport { rhu } from '../util/round.js';\n\nexport interface FormattedTextLines {\n  title?: string | undefined;\n  subtitle?: string | undefined;\n  titleLines?: string[] | undefined;\n  subtitleLines?: string[] | undefined;\n  lines: string[];\n  maxLineWidth: number;\n  lineCount: number;\n}\n\nexport interface RenderFormattedTextOpts {\n  align?: 'start' | 'middle' | 'end';\n  paddingLeft?: number;\n  paddingRight?: number;\n  defaultBold?: boolean;\n  opacity?: number;\n}\n\nexport function measureFormattedText(\n  rawText: string,\n  font: number,\n  smallFont: number,\n  maxAutoWrapWidth = 260,\n  maxWrapLines = 6,\n): FormattedTextLines {\n  const sepIdx = rawText.indexOf('::');\n  if (sepIdx !== -1) {\n    const rawTitle = rawText.slice(0, sepIdx).trim();\n    const rawSubtitle = rawText.slice(sepIdx + 2).trim();\n\n    const titleNorm = rawTitle.replace(/<br\\s*\\/?>/gi, '\\n').replace(/\\\\n/g, '\\n');\n    const subNorm = rawSubtitle.replace(/<br\\s*\\/?>/gi, '\\n').replace(/\\\\n/g, '\\n');\n\n    const titleRawLines = titleNorm\n      .split(/\\r?\\n/)\n      .map((l) => l.trim())\n      .filter(Boolean);\n    const subtitleRawLines = subNorm\n      .split(/\\r?\\n/)\n      .map((l) => l.trim())\n      .filter(Boolean);\n\n    const titleLines: string[] = [];\n    for (const r of titleRawLines) {\n      if (measureText(r, font).width > maxAutoWrapWidth) {\n        const wrapped = wrapText(r, font, maxAutoWrapWidth, maxWrapLines);\n        titleLines.push(...wrapped.lines);\n      } else {\n        titleLines.push(r);\n      }\n    }\n\n    const subtitleLines: string[] = [];\n    for (const r of subtitleRawLines) {\n      if (measureText(r, smallFont).width > maxAutoWrapWidth) {\n        const wrapped = wrapText(r, smallFont, maxAutoWrapWidth, maxWrapLines);\n        subtitleLines.push(...wrapped.lines);\n      } else {\n        subtitleLines.push(r);\n      }\n    }\n\n    let titleMaxW = 0;\n    for (const t of titleLines) {\n      titleMaxW = Math.max(titleMaxW, measureText(t, font).width * 1.05);\n    }\n    let subMaxW = 0;\n    for (const s of subtitleLines) {\n      subMaxW = Math.max(subMaxW, measureText(s, smallFont).width);\n    }\n\n    const firstTitle = titleLines[0];\n    const firstSub = subtitleLines.length > 0 ? subtitleLines.join(' ') : undefined;\n\n    return {\n      title: firstTitle,\n      subtitle: firstSub,\n      titleLines: titleLines.length > 0 ? titleLines : undefined,\n      subtitleLines: subtitleLines.length > 0 ? subtitleLines : undefined,\n      lines: [...titleLines, ...subtitleLines],\n      maxLineWidth: Math.max(titleMaxW, subMaxW),\n      lineCount: titleLines.length + subtitleLines.length,\n    };\n  }\n\n  const normalized = rawText.replace(/<br\\s*\\/?>/gi, '\\n').replace(/\\\\n/g, '\\n');\n  const rawLines = normalized\n    .split(/\\r?\\n/)\n    .map((l) => l.trim())\n    .filter(Boolean);\n\n  const lines: string[] = [];\n  for (const r of rawLines) {\n    if (measureText(r, font).width > maxAutoWrapWidth) {\n      const wrapped = wrapText(r, font, maxAutoWrapWidth, maxWrapLines);\n      lines.push(...wrapped.lines);\n    } else {\n      lines.push(r);\n    }\n  }\n\n  const finalLines = lines.length > 0 ? lines : [rawText.replace(/<br\\s*\\/?>/gi, ' ').trim()];\n  const maxLineWidth = finalLines.reduce((m, l) => Math.max(m, measureText(l, font).width), 0);\n\n  return {\n    lines: finalLines,\n    maxLineWidth,\n    lineCount: finalLines.length,\n  };\n}\n\nexport function renderFormattedText(\n  p: ReturnType<typeof pen>,\n  itemInfo: FormattedTextLines,\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n  font: number,\n  smallFont: number,\n  textColor: string,\n  mutedColor: string,\n  opts: RenderFormattedTextOpts = {},\n): SceneElement[] {\n  const elements: SceneElement[] = [];\n  const align = opts.align ?? 'start';\n  const paddingLeft = opts.paddingLeft ?? 0;\n  const paddingRight = opts.paddingRight ?? 0;\n  const defaultBold = opts.defaultBold ?? false;\n  const opacity = opts.opacity;\n\n  const targetX =\n    align === 'middle'\n      ? rhu(x + w / 2)\n      : align === 'end'\n        ? rhu(x + w - paddingRight)\n        : rhu(x + paddingLeft);\n\n  if (itemInfo.titleLines !== undefined) {\n    const titleLines = itemInfo.titleLines;\n    const subLines = itemInfo.subtitleLines ?? [];\n    const titleLH = font * 1.25;\n    const subLH = smallFont * 1.25;\n    const totalH = titleLines.length * titleLH + subLines.length * subLH;\n    const startY = y + (h - totalH) / 2 + font * 0.85;\n\n    let curY = startY;\n    for (let ti = 0; ti < titleLines.length; ti++) {\n      elements.push(\n        p.text(titleLines[ti]!, targetX, rhu(curY), font, textColor, {\n          weight: 'bold',\n          anchor: align,\n          ...(opacity !== undefined ? { opacity } : {}),\n        }),\n      );\n      curY += titleLH;\n    }\n\n    for (let si = 0; si < subLines.length; si++) {\n      elements.push(\n        p.text(subLines[si]!, targetX, rhu(curY), smallFont, mutedColor, {\n          anchor: align,\n          ...(opacity !== undefined ? { opacity } : {}),\n        }),\n      );\n      curY += subLH;\n    }\n\n    return elements;\n  }\n\n  const lines = itemInfo.lines;\n  const count = lines.length;\n  const lineH = font * 1.25;\n\n  if (count === 1) {\n    const textY = rhu(y + h / 2 + font * 0.34);\n    elements.push(\n      p.text(lines[0]!, targetX, textY, font, textColor, {\n        ...(defaultBold ? { weight: 'bold' } : {}),\n        anchor: align,\n        ...(opacity !== undefined ? { opacity } : {}),\n      }),\n    );\n    return elements;\n  }\n\n  const startY = y + (h - (count - 1) * lineH) / 2 + font * 0.34;\n\n  for (let li = 0; li < count; li++) {\n    const lineY = rhu(startY + li * lineH);\n    elements.push(\n      p.text(lines[li]!, targetX, lineY, font, textColor, {\n        ...(defaultBold ? { weight: 'bold' } : {}),\n        anchor: align,\n        ...(opacity !== undefined ? { opacity } : {}),\n      }),\n    );\n  }\n\n  return elements;\n}\n", "import type { FlowDocument, FlowNode, FlowEdge, FlowDirection } from './ir.js';\nimport type {\n  Scene,\n  SceneElement,\n  Rect,\n  Point,\n  LayoutResult,\n  NodeAnchorRegistry,\n  NodeAnchor,\n  OccupiedPort,\n  LayoutOptions,\n} from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport type { CardinalSide, RouteStyle } from '../../../contracts/index.js';\nimport { getRouter } from '../../../routing/registry.js';\nimport { defaultRouter } from '../../../routing/router.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { pen } from '../../../scene/build.js';\nimport { resolveIcon } from '../../../icons/resolver.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { measureFormattedText, renderFormattedText } from '../../../text/formatted.js';\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst NODE_W = 120;\nconst NODE_H = 40;\nconst ARROW_MARKER_ID = 'triton-arrow';\n\n// Card node geometry (Leslie's contract: unit=8px baseline)\nconst CARD_PAD = 8; // outer padding on all sides\nconst CARD_ICON_BOX = 40; // icon region square side (unit*5)\nconst CARD_ICON_GAP = 12; // horizontal gap between icon and text (unit*1.5)\nconst CARD_MIN_W = 192; // minimum card width (unit*24)\nconst CARD_MAX_W = 400; // maximum card width (unit*50)\nconst CARD_MAX_BODY_LINES = 3;\n\nconst MAX_AUTO_WRAP_WIDTH = 260; // px threshold for auto-wrapping long un-broken text\n\n// \u2500\u2500\u2500 Label Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Split a flowchart node label on explicit newlines (<br>, <br/>, \\n)\n * and wrap any lines exceeding MAX_AUTO_WRAP_WIDTH to prevent horizontal overflow.\n */\nexport function splitAndWrapLabel(label: string, fontSize: number): string[] {\n  if (!label) return [''];\n  const normalized = label.replace(/<br\\s*\\/?>/gi, '\\n').replace(/\\\\n/g, '\\n');\n  const rawLines = normalized.split(/\\r?\\n/).map((l) => l.trim());\n\n  const finalLines: string[] = [];\n  for (const rawLine of rawLines) {\n    if (!rawLine) continue;\n    const measured = measureText(rawLine, fontSize).width;\n    if (measured > MAX_AUTO_WRAP_WIDTH) {\n      const wrapped = wrapText(rawLine, fontSize, MAX_AUTO_WRAP_WIDTH, 10);\n      finalLines.push(...wrapped.lines);\n    } else {\n      finalLines.push(rawLine);\n    }\n  }\n\n  return finalLines.length > 0 ? finalLines : [''];\n}\n\n// \u2500\u2500\u2500 Card Node Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Split a card node label into title and body at `::` or the first `\\n` boundary.\n * Handles `::`, actual newline characters and the two-char `\\n` escape sequence.\n * Title = first line / pre-`::`; body = everything after (empty string if no separator).\n */\nfunction splitCardLabel(label: string): { title: string; body: string } {\n  const sepIdx = label.indexOf('::');\n  if (sepIdx !== -1) {\n    return { title: label.slice(0, sepIdx).trim(), body: label.slice(sepIdx + 2).trim() };\n  }\n  const idx = label.search(/\\\\n|\\n/);\n  if (idx === -1) return { title: label.trim(), body: '' };\n  const sep = label[idx] === '\\n' ? 1 : 2; // actual newline=1, backslash-n escape=2\n  return { title: label.slice(0, idx).trim(), body: label.slice(idx + sep).trim() };\n}\n\n/**\n * Measure the bounding box a card node requires based on its title/body content.\n * Width is clamped to [CARD_MIN_W, CARD_MAX_W]; height is content-driven.\n */\nfunction measureCardNode(\n  node: FlowNode,\n  typography: ResolvedTheme['typography'],\n): { width: number; height: number } {\n  const { title, body } = splitCardLabel(node.label);\n\n  // Title width: bold renders ~10% wider than regular\n  const titleW = measureText(title, typography.baseFontSize).width * 1.1;\n  const titleLH = typography.baseFontSize * 1.2;\n\n  // Right-region max width at CARD_MAX_W (used to measure body at maximum possible size)\n  const maxRightW = CARD_MAX_W - CARD_ICON_BOX - CARD_ICON_GAP - 2 * CARD_PAD;\n\n  let bodyH = 0;\n  let bodyW = 0;\n  if (body) {\n    const wrapped = wrapText(body, typography.smallFontSize, maxRightW, CARD_MAX_BODY_LINES);\n    bodyH = wrapped.lines.length * typography.smallFontSize * 1.2;\n    bodyW = wrapped.lines.reduce(\n      (mx, l) => Math.max(mx, measureText(l, typography.smallFontSize).width),\n      0,\n    );\n  }\n\n  const textW = Math.max(titleW, bodyW);\n  const width = Math.min(\n    CARD_MAX_W,\n    Math.max(CARD_MIN_W, CARD_ICON_BOX + CARD_ICON_GAP + textW + 2 * CARD_PAD),\n  );\n  const textH = body ? titleLH + bodyH : titleLH;\n  const height = Math.max(CARD_ICON_BOX, textH) + 2 * CARD_PAD;\n\n  return { width, height };\n}\n\n/**\n * Measure the bounding box a node requires based on its shape and label content.\n * Content-driven for all shapes; ensures text fits without overflow.\n */\nexport function measureNode(\n  node: FlowNode,\n  typography: ResolvedTheme['typography'],\n): { width: number; height: number } {\n  if (node.shape === 'card') {\n    return measureCardNode(node, typography);\n  }\n\n  const fontSize = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  let totalTextHeight: number;\n  let maxLineWidth: number;\n\n  if (node.label.includes('::')) {\n    const info = measureFormattedText(node.label, fontSize, smallFont);\n    const titleLinesCount = info.titleLines?.length ?? 1;\n    const subLinesCount = info.subtitleLines?.length ?? 0;\n    totalTextHeight = titleLinesCount * fontSize * 1.25 + subLinesCount * smallFont * 1.25;\n    maxLineWidth = info.maxLineWidth;\n  } else {\n    const lines = splitAndWrapLabel(node.label, fontSize);\n    const lineH = fontSize * 1.2;\n    totalTextHeight = lines.length * lineH;\n    maxLineWidth = lines.reduce((max, l) => Math.max(max, measureText(l, fontSize).width), 0);\n  }\n\n  const iconPad = node.icon ? 36 : 0;\n\n  const padX = 24;\n  const padY = 16;\n\n  switch (node.shape) {\n    case 'diamond': {\n      const textW = Math.max(80, maxLineWidth + padX + iconPad);\n      const textH = Math.max(24, totalTextHeight + padY);\n      const width = Math.max(NODE_W, Math.ceil((textW + textH) * 1.05 + 16));\n      const height = Math.max(NODE_H, Math.ceil((textW + textH) * 0.7 + 10));\n      return { width, height };\n    }\n    case 'circle': {\n      const diag = Math.sqrt(Math.pow(maxLineWidth + iconPad, 2) + Math.pow(totalTextHeight, 2));\n      const diam = Math.max(NODE_H, Math.ceil(diag + 24));\n      return { width: diam, height: diam };\n    }\n    case 'stadium': {\n      const height = Math.max(NODE_H, Math.ceil(totalTextHeight + padY));\n      const width = Math.max(NODE_W, Math.ceil(maxLineWidth + height * 0.8 + 16 + iconPad));\n      return { width, height };\n    }\n    case 'subroutine': {\n      const height = Math.max(NODE_H, Math.ceil(totalTextHeight + padY));\n      const width = Math.max(NODE_W, Math.ceil(maxLineWidth + 36 + iconPad));\n      return { width, height };\n    }\n    case 'cylinder': {\n      const height = Math.max(48, Math.ceil(totalTextHeight + 24));\n      const width = Math.max(NODE_W, Math.ceil(maxLineWidth + padX + iconPad));\n      return { width, height };\n    }\n    case 'hexagon': {\n      const height = Math.max(NODE_H, Math.ceil(totalTextHeight + padY));\n      const width = Math.max(NODE_W, Math.ceil(maxLineWidth + height * 0.6 + 16 + iconPad));\n      return { width, height };\n    }\n    case 'parallelogram':\n    case 'parallelogram-alt':\n    case 'asymmetric': {\n      const height = Math.max(NODE_H, Math.ceil(totalTextHeight + padY));\n      const width = Math.max(NODE_W, Math.ceil(maxLineWidth + 32 + iconPad));\n      return { width, height };\n    }\n    case 'rect':\n    case 'rounded-rect':\n    default: {\n      const height = Math.max(NODE_H, Math.ceil(totalTextHeight + padY));\n      const width = Math.max(NODE_W, Math.ceil(maxLineWidth + padX + iconPad));\n      return { width, height };\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Public Entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layoutFlowchart(\n  ir: FlowDocument,\n  theme: ResolvedTheme,\n  options?: LayoutOptions,\n): LayoutResult {\n  const { spacing, palette, typography, edges: edgeTheme } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const isLR = ir.direction === 'LR' || ir.direction === 'RL';\n  const isReverse = ir.direction === 'RL' || ir.direction === 'BT';\n\n  // \u2500\u2500 Layer assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const layers = assignLayers(ir.nodes, ir.edges);\n  const byLayer = groupByLayer(ir.nodes, layers);\n\n  // \u2500\u2500 Phase 3: Crossing minimisation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Back-edges computed once; reused by both layout phases and the edge-drawing\n  // loop below (avoids a second DFS).\n  const backEdges = findBackEdges(ir.nodes, ir.edges);\n  const orderedByLayer = minimizeCrossings(byLayer, ir.edges, backEdges);\n\n  // \u2500\u2500 Phase 4: Brandes\u2013K\u00F6pf coordinate assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const colGap = spacing.nodeGap;\n  const rowGap = spacing.nodeGap;\n\n  let maxNodesInLayer = 0;\n  for (const [, nodes] of orderedByLayer) maxNodesInLayer = Math.max(maxNodesInLayer, nodes.length);\n\n  // Per-node sizes: content-driven for all node shapes.\n  const nodeSizeMap = new Map<string, { width: number; height: number }>();\n  for (const node of ir.nodes) {\n    nodeSizeMap.set(node.id, measureNode(node, typography));\n  }\n\n  const nodePos = assignCoordinatesBK(\n    orderedByLayer,\n    ir.edges,\n    backEdges,\n    isLR,\n    isReverse,\n    maxNodesInLayer,\n    NODE_W,\n    NODE_H,\n    colGap,\n    rowGap,\n    margin,\n    nodeSizeMap,\n  );\n\n  // \u2500\u2500 Build scene elements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const elements: SceneElement[] = [];\n\n  // Title\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(ir.metadata.title, margin, margin - 8, typography.titleFontSize, palette.text, {\n        weight: 'bold',\n      }),\n    );\n  }\n\n  // Subgraph backgrounds (drawn first \u2014 behind nodes)\n  let sgMinX = Infinity;\n  let sgMaxX = -Infinity;\n  let sgMinY = Infinity;\n  let sgMaxY = -Infinity;\n\n  for (const sg of ir.subgraphs) {\n    const sgRects = sg.nodeIds\n      .map((id) => nodePos.get(id))\n      .filter((r): r is Rect => r !== undefined);\n    if (sgRects.length === 0) continue;\n    const pad = 12;\n    const minX = Math.min(...sgRects.map((r) => r.x)) - pad;\n    const minY = Math.min(...sgRects.map((r) => r.y)) - pad - 20;\n    const maxX = Math.max(...sgRects.map((r) => r.x + r.width)) + pad;\n    const maxY = Math.max(...sgRects.map((r) => r.y + r.height)) + pad;\n    sgMinX = Math.min(sgMinX, minX);\n    sgMaxX = Math.max(sgMaxX, maxX);\n    sgMinY = Math.min(sgMinY, minY);\n    sgMaxY = Math.max(sgMaxY, maxY);\n    elements.push(\n      p.rect(\n        { x: minX, y: minY, width: maxX - minX, height: maxY - minY },\n        palette.surface,\n        palette.border,\n        1,\n        { rx: 6, opacity: 0.6 },\n      ),\n    );\n    elements.push(\n      p.text(sg.label, minX + 8, minY + 14, typography.smallFontSize, palette.textMuted),\n    );\n  }\n\n  // Edges (drawn before nodes so nodes appear on top).\n  //\n  // Back-edges (the cycle-closing edges identified by `findBackEdges`, the same\n  // set excluded from layer ranks) and self-loops are routed specially so they\n  // read as \"feedback\" instead of cutting straight back through the node column.\n  // Every OTHER (forward / acyclic) edge takes the unchanged orthogonal-router\n  // path below, so acyclic diagrams render byte-identically.\n  // (backEdges was computed in the layout phase above \u2014 reused here.)\n  let bowMinX = Infinity;\n  let bowMaxX = -Infinity;\n  let bowMinY = Infinity;\n  let bowMaxY = -Infinity;\n  let gutterLaneIdx = 0;\n\n  // \u2500\u2500 Multi-Port Distribution Pre-Pass \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  interface EdgeWallInfo {\n    fromWall: CardinalSide;\n    toWall: CardinalSide;\n    fromPeerCoord: number;\n    toPeerCoord: number;\n  }\n  const nodeLayerMap = new Map<string, number>();\n  for (const [l, nodes] of orderedByLayer) {\n    for (const n of nodes) nodeLayerMap.set(n.id, l);\n  }\n\n  const edgeWalls = new Map<number, EdgeWallInfo>();\n  for (let ei = 0; ei < ir.edges.length; ei++) {\n    if (backEdges.has(ei)) continue;\n    const edge = ir.edges[ei]!;\n    if (edge.from === edge.to) continue;\n    const fromRect = nodePos.get(edge.from);\n    const toRect = nodePos.get(edge.to);\n    if (!fromRect || !toRect) continue;\n    const fromNode = ir.nodes.find((n) => n.id === edge.from);\n    const toNode = ir.nodes.find((n) => n.id === edge.to);\n\n    const fromL = nodeLayerMap.get(edge.from) ?? 0;\n    const toL = nodeLayerMap.get(edge.to) ?? 0;\n    const isBypassSkip = toL >= fromL + 2 && fromNode?.shape !== 'diamond';\n\n    const defaultExitWall = isBypassSkip ? (isLR ? 'N' : 'W') : undefined;\n\n    const fA = edge.exitWall\n      ? wallAnchor(fromRect, edge.exitWall)\n      : defaultExitWall\n        ? wallAnchor(fromRect, defaultExitWall)\n        : edgeAnchor(fromRect, ir.direction, 'exit', toRect, fromNode?.shape);\n    const tA = edge.entryWall\n      ? wallAnchor(toRect, edge.entryWall)\n      : edgeAnchor(toRect, ir.direction, 'enter', fromRect, toNode?.shape);\n\n    const fromWall = fA.portDir as CardinalSide;\n    const toWall = tA.portDir as CardinalSide;\n    const toPeerCoord =\n      fromWall === 'N' || fromWall === 'S'\n        ? toRect.x + toRect.width / 2\n        : toRect.y + toRect.height / 2;\n    const fromPeerCoord =\n      toWall === 'N' || toWall === 'S'\n        ? fromRect.x + fromRect.width / 2\n        : fromRect.y + fromRect.height / 2;\n    edgeWalls.set(ei, { fromWall, toWall, fromPeerCoord, toPeerCoord });\n  }\n\n  interface WallPortEntry {\n    ei: number;\n    role: 'out' | 'in';\n    peerCoord: number;\n  }\n  const wallPorts = new Map<string, WallPortEntry[]>();\n  for (const [ei, ew] of edgeWalls) {\n    const edge = ir.edges[ei]!;\n    const outKey = `${edge.from}:${ew.fromWall}`;\n    const inKey = `${edge.to}:${ew.toWall}`;\n    if (!wallPorts.has(outKey)) wallPorts.set(outKey, []);\n    if (!wallPorts.has(inKey)) wallPorts.set(inKey, []);\n    wallPorts.get(outKey)!.push({ ei, role: 'out', peerCoord: ew.toPeerCoord });\n    wallPorts.get(inKey)!.push({ ei, role: 'in', peerCoord: ew.fromPeerCoord });\n  }\n\n  for (const [, list] of wallPorts) {\n    list.sort((a, b) => {\n      if (Math.abs(a.peerCoord - b.peerCoord) > 0.5) return a.peerCoord - b.peerCoord;\n      return a.role === 'out' ? -1 : 1;\n    });\n  }\n\n  for (let ei = 0; ei < ir.edges.length; ei++) {\n    const edge = ir.edges[ei]!;\n    const fromRect = nodePos.get(edge.from);\n    const toRect = nodePos.get(edge.to);\n    if (!fromRect || !toRect) continue;\n\n    const dash = edge.style === 'dotted' ? '6 3' : edge.style === 'dashed' ? '8 4' : undefined;\n    const sw = edge.style === 'thick' ? edgeTheme.strokeWidth * 2 : edgeTheme.strokeWidth;\n    const color = edge.style === 'dotted' ? palette.textMuted : palette.primary;\n\n    // Self-loop (A \u2192 A): a small loop off one side, never a zero-length line.\n    if (edge.from === edge.to) {\n      const loop = selfLoopRoute(fromRect, isLR);\n      elements.push(\n        p.path(loop.path, color, sw, {\n          ...(edge.animation && edge.animation !== 'none' ? { animated: edge.animation } : {}),\n          ...(dash !== undefined ? { dash } : {}),\n          markerEnd: ARROW_MARKER_ID,\n        }),\n      );\n      bowMaxX = Math.max(bowMaxX, loop.maxX);\n      bowMaxY = Math.max(bowMaxY, loop.maxY);\n      if (edge.label) {\n        elements.push(\n          p.text(\n            edge.label,\n            loop.labelPos.x,\n            loop.labelPos.y - 4,\n            edgeTheme.labelFontSize,\n            palette.textMuted,\n            { anchor: 'middle' },\n          ),\n        );\n      }\n      continue;\n    }\n\n    // Back-edge (feedback): bow out to one side around the intervening nodes.\n    if (backEdges.has(ei)) {\n      const allRects = [...nodePos.values()];\n      const obstacles: Rect[] = [];\n      for (const [id, r] of nodePos) {\n        if (id !== edge.from && id !== edge.to) {\n          obstacles.push(r);\n        }\n      }\n      const bow = backEdgeRoute(fromRect, toRect, isLR, allRects, obstacles, gutterLaneIdx);\n      if (bow.usedGutter) gutterLaneIdx++;\n      elements.push(\n        p.path(bow.path, color, sw, {\n          ...(edge.animation && edge.animation !== 'none' ? { animated: edge.animation } : {}),\n          ...(dash !== undefined ? { dash } : {}),\n          markerEnd: ARROW_MARKER_ID,\n        }),\n      );\n      bowMinX = Math.min(bowMinX, bow.minX);\n      bowMaxX = Math.max(bowMaxX, bow.maxX);\n      bowMinY = Math.min(bowMinY, bow.minY);\n      bowMaxY = Math.max(bowMaxY, bow.maxY);\n      if (edge.label) {\n        const w = measureText(edge.label, edgeTheme.labelFontSize).width + 8;\n        elements.push(\n          p.rect(\n            { x: bow.labelPos.x - w / 2, y: bow.labelPos.y - 12, width: w, height: 16 },\n            palette.background,\n            palette.background,\n            0,\n            { rx: 3 },\n          ),\n        );\n        elements.push(\n          p.text(\n            edge.label,\n            bow.labelPos.x,\n            bow.labelPos.y - 2,\n            edgeTheme.labelFontSize,\n            palette.textMuted,\n            { anchor: 'middle' },\n          ),\n        );\n      }\n      continue;\n    }\n\n    const fromNode = ir.nodes.find((n) => n.id === edge.from);\n    const toNode = ir.nodes.find((n) => n.id === edge.to);\n\n    const ew = edgeWalls.get(ei);\n    const outList = ew ? wallPorts.get(`${edge.from}:${ew.fromWall}`) : undefined;\n    const inList = ew ? wallPorts.get(`${edge.to}:${ew.toWall}`) : undefined;\n    const outIdx =\n      outList && outList.length > 1\n        ? Math.max(\n            0,\n            outList.findIndex((x) => x.ei === ei && x.role === 'out'),\n          )\n        : 0;\n    const outTot = outList ? outList.length : 1;\n    const inIdx =\n      inList && inList.length > 1\n        ? Math.max(\n            0,\n            inList.findIndex((x) => x.ei === ei && x.role === 'in'),\n          )\n        : 0;\n    const inTot = inList ? inList.length : 1;\n\n    const fromAnchor = edge.exitWall\n      ? wallAnchor(fromRect, edge.exitWall, outIdx, outTot)\n      : ew\n        ? wallAnchor(fromRect, ew.fromWall, outIdx, outTot)\n        : edgeAnchor(fromRect, ir.direction, 'exit', toRect, fromNode?.shape, outIdx, outTot);\n    const toAnchor = edge.entryWall\n      ? wallAnchor(toRect, edge.entryWall, inIdx, inTot)\n      : ew\n        ? wallAnchor(toRect, ew.toWall, inIdx, inTot)\n        : edgeAnchor(toRect, ir.direction, 'enter', fromRect, toNode?.shape, inIdx, inTot);\n\n    const obstacles: Rect[] = [];\n    for (const [id, r] of nodePos) {\n      if (id !== edge.from && id !== edge.to) {\n        obstacles.push(r);\n      }\n    }\n\n    const style: RouteStyle = edge.routing ?? 'orthogonal';\n    const router = getRouter(style) ?? defaultRouter;\n    const route = router.route({\n      from: fromAnchor.point,\n      to: toAnchor.point,\n      style,\n      curveStyle: 'linear',\n      obstacles,\n      padding: 8,\n      fromDir: fromAnchor.portDir,\n      toDir: toAnchor.portDir,\n    });\n\n    elements.push(\n      p.path(route.path, color, sw, {\n        ...(edge.animation && edge.animation !== 'none' ? { animated: edge.animation } : {}),\n        ...(dash !== undefined ? { dash } : {}),\n        markerEnd: ARROW_MARKER_ID,\n      }),\n    );\n\n    if (edge.label) {\n      const lp = route.labelPosition;\n      const w = measureText(edge.label, edgeTheme.labelFontSize).width + 8;\n      elements.push(\n        p.rect(\n          { x: lp.x - w / 2, y: lp.y - 12, width: w, height: 16 },\n          palette.background,\n          palette.background,\n          0,\n          { rx: 3 },\n        ),\n      );\n      elements.push(\n        p.text(edge.label, lp.x, lp.y - 2, edgeTheme.labelFontSize, palette.textMuted, {\n          anchor: 'middle',\n        }),\n      );\n    }\n  }\n\n  // Nodes\n  const icons = options?.icons;\n  for (const node of ir.nodes) {\n    const r = nodePos.get(node.id);\n    if (!r) continue;\n\n    const nodeElements: SceneElement[] = [];\n    const isFocal = node.classes?.includes('focal') || node.status === 'active';\n    const fill = isFocal ? palette.primary + '22' : nodeStatusFill(node, palette);\n    const stroke = isFocal ? palette.primary : palette.border;\n    const sw = isFocal ? Math.max(edgeTheme.strokeWidth * 1.5, 2) : edgeTheme.strokeWidth;\n\n    if (node.shape === 'card') {\n      // \u2500\u2500 Card two-region composition \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      // Background chrome: palette.surface + fillOpacity + border + rx:6\n      nodeElements.push(p.rect(r, fill, stroke, sw, { rx: 6, fillOpacity: 0.85 }));\n\n      const { title, body } = splitCardLabel(node.label);\n      const iconX = r.x + CARD_PAD;\n      const iconY = r.y + (r.height - CARD_ICON_BOX) / 2;\n      const textX = r.x + CARD_PAD + CARD_ICON_BOX + CARD_ICON_GAP;\n      const rightW = r.width - 2 * CARD_PAD - CARD_ICON_BOX - CARD_ICON_GAP;\n\n      // LEFT: icon region \u2014 vertically centered, 32px glyph within 40px box\n      if (node.icon !== undefined && icons !== undefined) {\n        const resolved = resolveIcon(node.icon, icons);\n        if (resolved.ok) {\n          const glyphSize = CARD_ICON_BOX - 8; // 32px\n          const gx = iconX + (CARD_ICON_BOX - glyphSize) / 2;\n          const gy = iconY + (CARD_ICON_BOX - glyphSize) / 2;\n          nodeElements.push(p.icon(resolved.value, gx, gy, glyphSize, { color: palette.primary }));\n        }\n      }\n\n      // RIGHT: title + optional body\n      const bodyText = body ? body.replace(/\\\\n|\\n/g, ' ').trim() : '';\n      const wrapped = bodyText\n        ? wrapText(bodyText, typography.smallFontSize, rightW, CARD_MAX_BODY_LINES)\n        : { lines: [] };\n      const hasBody = wrapped.lines.length > 0;\n\n      // Title baseline: top-aligned when body present, vertically centered otherwise\n      const titleBaseY = hasBody\n        ? r.y + CARD_PAD + typography.baseFontSize * 0.85\n        : r.y + r.height / 2 + typography.baseFontSize * 0.35;\n\n      nodeElements.push(\n        p.text(title, textX, titleBaseY, typography.baseFontSize, palette.text, { weight: 'bold' }),\n      );\n\n      if (hasBody) {\n        const titleLH = typography.baseFontSize * 1.2;\n        let bodyY = r.y + CARD_PAD + titleLH + typography.smallFontSize * 0.85;\n        for (const line of wrapped.lines) {\n          nodeElements.push(\n            p.text(line, textX, bodyY, typography.smallFontSize, palette.textMuted),\n          );\n          bodyY += typography.smallFontSize * 1.2;\n        }\n      }\n    } else {\n      // \u2500\u2500 Default single-region composition (all non-card shapes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      nodeElements.push(...renderNodeShape(node, r, fill, stroke, sw, theme));\n\n      let textRegionX = r.x;\n      let textRegionW = r.width;\n\n      // Generic icon placement (P6 behaviour for non-card nodes with @icon)\n      if (node.icon !== undefined && icons !== undefined) {\n        const resolved = resolveIcon(node.icon, icons);\n        if (resolved.ok) {\n          const iconSize = Math.min(28, r.height - 8);\n          const ix = r.x + 8;\n          const iy = r.y + (r.height - iconSize) / 2;\n          nodeElements.push(p.icon(resolved.value, ix, iy, iconSize, { color: palette.text }));\n          textRegionX = ix + iconSize;\n          textRegionW = r.width - (iconSize + 8);\n        }\n      }\n\n      if (node.label.includes('::')) {\n        const info = measureFormattedText(\n          node.label,\n          typography.baseFontSize,\n          typography.smallFontSize,\n          textRegionW - 16,\n        );\n        nodeElements.push(\n          ...renderFormattedText(\n            p,\n            info,\n            textRegionX,\n            r.y,\n            textRegionW,\n            r.height,\n            typography.baseFontSize,\n            typography.smallFontSize,\n            palette.text,\n            palette.textMuted,\n            { align: 'middle', defaultBold: true },\n          ),\n        );\n      } else {\n        const lines = splitAndWrapLabel(node.label, typography.baseFontSize);\n        const totalLines = lines.length;\n        const lineH = typography.baseFontSize * 1.2;\n        const textCenterX = textRegionX + textRegionW / 2;\n\n        for (let i = 0; i < totalLines; i++) {\n          const lineY =\n            r.y +\n            r.height / 2 -\n            ((totalLines - 1) * lineH) / 2 +\n            i * lineH +\n            typography.baseFontSize * 0.35;\n\n          nodeElements.push(\n            p.text(lines[i]!, textCenterX, lineY, typography.baseFontSize, palette.text, {\n              anchor: 'middle',\n            }),\n          );\n        }\n      }\n    }\n\n    elements.push(p.group(nodeElements, { id: node.id }));\n  }\n\n  // \u2500\u2500 Compute viewBox \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allRects = [...nodePos.values()];\n  const nodeMinX = allRects.length > 0 ? Math.min(...allRects.map((r) => r.x)) : margin;\n  const nodeRight = allRects.length > 0 ? Math.max(...allRects.map((r) => r.x + r.width)) : margin;\n  const nodeMinY = allRects.length > 0 ? Math.min(...allRects.map((r) => r.y)) : margin;\n  const nodeBottom =\n    allRects.length > 0 ? Math.max(...allRects.map((r) => r.y + r.height)) : margin;\n\n  let minBoundX = nodeMinX;\n  if (Number.isFinite(bowMinX)) minBoundX = Math.min(minBoundX, bowMinX);\n  if (Number.isFinite(sgMinX)) minBoundX = Math.min(minBoundX, sgMinX);\n\n  let minBoundY = nodeMinY;\n  if (Number.isFinite(bowMinY)) minBoundY = Math.min(minBoundY, bowMinY);\n  if (Number.isFinite(sgMinY)) minBoundY = Math.min(minBoundY, sgMinY);\n\n  let maxBoundX = nodeRight;\n  if (Number.isFinite(bowMaxX)) maxBoundX = Math.max(maxBoundX, bowMaxX);\n  if (Number.isFinite(sgMaxX)) maxBoundX = Math.max(maxBoundX, sgMaxX);\n\n  let maxBoundY = nodeBottom;\n  if (Number.isFinite(bowMaxY)) maxBoundY = Math.max(maxBoundY, bowMaxY);\n  if (Number.isFinite(sgMaxY)) maxBoundY = Math.max(maxBoundY, sgMaxY);\n\n  const left = minBoundX < margin ? minBoundX - margin : 0;\n  const top = minBoundY < margin ? minBoundY - margin : 0;\n\n  const right = maxBoundX + margin;\n  const bottom = maxBoundY + margin;\n  const titleOffset = ir.metadata.title ? typography.titleFontSize + 12 : 0;\n\n  let scene: Scene = {\n    viewBox: { x: left, y: top, width: right - left, height: bottom - top + titleOffset },\n    background: palette.background,\n    elements,\n    defs: [arrowMarkerDef(palette.primary, edgeTheme.arrowSize)],\n  };\n\n  // \u2500\u2500 Overlays \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  scene = applyOverlays(scene, ir.overlays, theme);\n\n  // \u2500\u2500 Build anchor registry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const anchors: Record<string, NodeAnchor> = {};\n  for (const [id, rect] of nodePos) {\n    anchors[id] = {\n      bounds: rect,\n      ports: {\n        N: { x: rect.x + rect.width / 2, y: rect.y },\n        S: { x: rect.x + rect.width / 2, y: rect.y + rect.height },\n        E: { x: rect.x + rect.width, y: rect.y + rect.height / 2 },\n        W: { x: rect.x, y: rect.y + rect.height / 2 },\n      },\n    };\n  }\n\n  // \u2500\u2500 Occupied ports: record which wall each edge exits/enters \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const occupiedPorts: OccupiedPort[] = [];\n  for (const edge of ir.edges) {\n    const fromRect = nodePos.get(edge.from);\n    const toRect = nodePos.get(edge.to);\n    if (!fromRect || !toRect) continue;\n    const fromNode = ir.nodes.find((n) => n.id === edge.from);\n    const toNode = ir.nodes.find((n) => n.id === edge.to);\n    const fromAnch = edgeAnchor(fromRect, ir.direction, 'exit', toRect, fromNode?.shape);\n    const toAnch = edgeAnchor(toRect, ir.direction, 'enter', fromRect, toNode?.shape);\n    occupiedPorts.push({\n      nodeKey: edge.from,\n      wall: fromAnch.portDir as CardinalSide,\n      t: wallT(fromRect, fromAnch.portDir as CardinalSide, fromAnch.point),\n      source: 'intra',\n    });\n    occupiedPorts.push({\n      nodeKey: edge.to,\n      wall: toAnch.portDir as CardinalSide,\n      t: wallT(toRect, toAnch.portDir as CardinalSide, toAnch.point),\n      source: 'intra',\n    });\n  }\n\n  return { scene, anchors, occupiedPorts };\n}\n\n// \u2500\u2500\u2500 Layer Assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Identify back-edges (the edges that close a cycle) via an iterative DFS.\n *\n * Removing a DFS's back-edge set always yields a DAG, so the longest-path\n * layering below is guaranteed to terminate on ANY graph. The back-edges are\n * still drawn in their original direction by the edge loop in\n * {@link layoutFlowchart}; they are only excluded from rank assignment.\n *\n * Returns a set of indices into `edges`. Deterministic: nodes and edges are\n * visited in their given order. Iterative (explicit stack) to stay safe on\n * deep graphs.\n */\nfunction findBackEdges(nodes: readonly FlowNode[], edges: readonly FlowEdge[]): Set<number> {\n  const adj = new Map<string, Array<{ to: string; idx: number }>>();\n  for (const n of nodes) adj.set(n.id, []);\n  edges.forEach((e, idx) => {\n    adj.get(e.from)?.push({ to: e.to, idx });\n  });\n\n  const WHITE = 0,\n    GRAY = 1,\n    BLACK = 2;\n  const color = new Map<string, number>();\n  for (const n of nodes) color.set(n.id, WHITE);\n\n  const backEdges = new Set<number>();\n\n  for (const start of nodes) {\n    if (color.get(start.id) !== WHITE) continue;\n    const stack: Array<{ id: string; i: number }> = [{ id: start.id, i: 0 }];\n    color.set(start.id, GRAY);\n\n    while (stack.length > 0) {\n      const frame = stack[stack.length - 1]!;\n      const neighbors = adj.get(frame.id)!;\n      if (frame.i < neighbors.length) {\n        const { to, idx } = neighbors[frame.i]!;\n        frame.i++;\n        const c = color.get(to);\n        // GRAY target (incl. a self-loop, where target === current) closes a cycle.\n        if (c === GRAY) {\n          backEdges.add(idx);\n        } else if (c === WHITE) {\n          color.set(to, GRAY);\n          stack.push({ id: to, i: 0 });\n        }\n        // BLACK target \u2192 forward/cross edge: keep it.\n      } else {\n        color.set(frame.id, BLACK);\n        stack.pop();\n      }\n    }\n  }\n\n  return backEdges;\n}\n\nfunction assignLayers(nodes: readonly FlowNode[], edges: readonly FlowEdge[]): Map<string, number> {\n  // Cycle breaking: drop back-edges so layering runs on a DAG and terminates.\n  // (Back-edges are still rendered by the edge loop \u2014 only excluded from ranks.)\n  const backEdges = findBackEdges(nodes, edges);\n  const forwardEdges = edges.filter((_, i) => !backEdges.has(i));\n\n  // Solid edges define primary structural hierarchy; dotted/dashed edges serve as lateral/reference links\n  const solidEdges = forwardEdges.filter((e) => e.style !== 'dotted' && e.style !== 'dashed');\n  const dottedEdges = forwardEdges.filter((e) => e.style === 'dotted' || e.style === 'dashed');\n\n  const solidPreds = new Map<string, Set<string>>();\n  for (const n of nodes) solidPreds.set(n.id, new Set());\n  for (const e of solidEdges) solidPreds.get(e.to)?.add(e.from);\n\n  const layers = new Map<string, number>();\n  const queue: Array<{ id: string; layer: number }> = [];\n\n  // Roots: nodes with no solid predecessors\n  for (const n of nodes) {\n    if ((solidPreds.get(n.id)?.size ?? 0) === 0) {\n      queue.push({ id: n.id, layer: 0 });\n    }\n  }\n\n  while (queue.length > 0) {\n    const item = queue.shift()!;\n    const current = layers.get(item.id) ?? -1;\n    if (item.layer <= current) continue;\n    layers.set(item.id, item.layer);\n    for (const e of solidEdges) {\n      if (e.from === item.id) queue.push({ id: e.to, layer: item.layer + 1 });\n    }\n  }\n\n  // Nodes with ONLY dotted/dashed incoming edges advance to follow their source layer\n  for (const e of dottedEdges) {\n    if ((solidPreds.get(e.to)?.size ?? 0) === 0) {\n      const srcLayer = layers.get(e.from) ?? 0;\n      const cur = layers.get(e.to) ?? 0;\n      if (cur < srcLayer + 1) {\n        layers.set(e.to, srcLayer + 1);\n        for (const f of solidEdges) {\n          if (f.from === e.to) queue.push({ id: f.to, layer: srcLayer + 2 });\n        }\n      }\n    }\n  }\n\n  // Assign any remaining unvisited nodes to layer 0\n  for (const n of nodes) {\n    if (!layers.has(n.id)) layers.set(n.id, 0);\n  }\n\n  return layers;\n}\n\nfunction groupByLayer(\n  nodes: readonly FlowNode[],\n  layers: Map<string, number>,\n): Map<number, FlowNode[]> {\n  const groups = new Map<number, FlowNode[]>();\n  for (const node of nodes) {\n    const l = layers.get(node.id) ?? 0;\n    if (!groups.has(l)) groups.set(l, []);\n    groups.get(l)!.push(node);\n  }\n  return new Map([...groups.entries()].sort(([a], [b]) => a - b));\n}\n\n// \u2500\u2500\u2500 Phase 3: Barycentric Crossing Minimisation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Reorder nodes within each layer to reduce edge crossings using the\n * barycentric heuristic with bi-directional sweeps (Sugiyama Phase 3).\n *\n * - Back-edges and self-loops are excluded from barycenter computation.\n * - Nodes without neighbors in the reference layer keep their current relative\n *   order (their current position index is used as the barycenter).\n * - Tie-breaking uses the original insertion index (deterministic / stable).\n * - At most MAX_PASSES (4) bi-directional passes \u2014 provably terminates.\n */\nfunction minimizeCrossings(\n  byLayer: Map<number, FlowNode[]>,\n  edges: readonly FlowEdge[],\n  backEdgeSet: Set<number>,\n): Map<number, FlowNode[]> {\n  // Build forward-edge predecessor and successor maps.\n  const pred = new Map<string, string[]>();\n  const succ = new Map<string, string[]>();\n  for (const [, nodes] of byLayer) {\n    for (const n of nodes) {\n      pred.set(n.id, []);\n      succ.set(n.id, []);\n    }\n  }\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    pred.get(e.to)?.push(e.from);\n    succ.get(e.from)?.push(e.to);\n  });\n\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n\n  // Original insertion index \u2014 stable tie-break preserved across all passes.\n  const origOrder = new Map<string, number>();\n  for (const [, nodes] of byLayer) nodes.forEach((n, i) => origOrder.set(n.id, i));\n\n  // Working layer arrays starting from insertion order.\n  const order = new Map<number, FlowNode[]>();\n  for (const k of layerKeys) order.set(k, [...byLayer.get(k)!]);\n\n  // Position of each node in its current layer (rebuilt after every reorder).\n  const posInLayer = new Map<string, number>();\n  function rebuildPos(): void {\n    for (const [, nodes] of order) nodes.forEach((n, i) => posInLayer.set(n.id, i));\n  }\n  rebuildPos();\n\n  function reorderLayer(layerIdx: number, neighborMap: Map<string, string[]>): void {\n    const curr = order.get(layerIdx)!;\n    const bary = curr.map((node, i) => {\n      const nbrs = neighborMap.get(node.id) ?? [];\n      if (nbrs.length === 0) {\n        // No anchoring neighbors: use current position so relative order is kept.\n        return { node, b: i, orig: origOrder.get(node.id) ?? i };\n      }\n      const sum = nbrs.reduce((s, nid) => s + (posInLayer.get(nid) ?? 0), 0);\n      return { node, b: sum / nbrs.length, orig: origOrder.get(node.id) ?? i };\n    });\n    // Stable sort: primary = barycenter, secondary = original insertion order.\n    bary.sort((a, b) => (a.b !== b.b ? a.b - b.b : a.orig - b.orig));\n    order.set(\n      layerIdx,\n      bary.map((e) => e.node),\n    );\n    rebuildPos();\n  }\n\n  const MAX_PASSES = 4;\n  for (let pass = 0; pass < MAX_PASSES; pass++) {\n    if (pass % 2 === 0) {\n      // Downward sweep: reorder each layer using predecessor positions.\n      for (let li = 1; li < layerKeys.length; li++) reorderLayer(layerKeys[li]!, pred);\n    } else {\n      // Upward sweep: reorder each layer using successor positions.\n      for (let li = layerKeys.length - 2; li >= 0; li--) reorderLayer(layerKeys[li]!, succ);\n    }\n  }\n\n  return order;\n}\n\n// \u2500\u2500\u2500 Phase 4: Simplified Brandes\u2013K\u00F6pf Coordinate Assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Assign cross-axis coordinates (x for TB, y for LR) using a two-pass\n * simplified Brandes\u2013K\u00F6pf style approach (Sugiyama Phase 4).\n *\n * Each pass places every layer as a uniform block:\n *   - Each node's \"preference\" is the MEAN cross-axis position of its\n *     forward-edge neighbors in the adjacent layer (mean gives a centred\n *     result, matching what dagre does with weighted edges).\n *   - Nodes with no neighbors fall back to the same centering formula the\n *     old code used (keeps root/leaf layers stable when no anchor exists).\n *   - The block's start is max(margin, medianOfPrefs \u2212 \u00BD\u00B7totalSpan) so the\n *     whole layer is centred on its collective preference, clamped to margin.\n *\n * Pass 1 (top-down) aligns each layer with its predecessors.\n * Pass 2 (bottom-up) aligns each layer with its successors.\n * Final positions = average of the two passes.\n *\n * Both passes independently produce non-overlapping layouts (uniform step\n * \u2265 crossSize + gap), and the average of two such arrangements with the same\n * step is also non-overlapping \u2014 so no extra collision check is needed.\n *\n * Back-edges and self-loops are excluded from preference computation.\n */\nfunction assignCoordinatesBK(\n  byLayer: Map<number, FlowNode[]>,\n  edges: readonly FlowEdge[],\n  backEdgeSet: Set<number>,\n  isLR: boolean,\n  isReverse: boolean,\n  maxNodesInLayer: number,\n  nodeW: number,\n  nodeH: number,\n  colGap: number,\n  rowGap: number,\n  margin: number,\n  nodeSizes?: Map<string, { width: number; height: number }>,\n): Map<string, Rect> {\n  // Per-node dimension helpers with fallback to uniform defaults.\n  const getW = (id: string) => nodeSizes?.get(id)?.width ?? nodeW;\n  const getH = (id: string) => nodeSizes?.get(id)?.height ?? nodeH;\n\n  // Build node -> layer index map\n  const nodeLayer = new Map<string, number>();\n  for (const [l, nodes] of byLayer) {\n    for (const n of nodes) nodeLayer.set(n.id, l);\n  }\n\n  // Forward-edge predecessor and successor maps (strictly cross-layer)\n  const predMap = new Map<string, string[]>();\n  const succMap = new Map<string, string[]>();\n  for (const [, nodes] of byLayer) {\n    for (const n of nodes) {\n      predMap.set(n.id, []);\n      succMap.set(n.id, []);\n    }\n  }\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    const fromL = nodeLayer.get(e.from);\n    const toL = nodeLayer.get(e.to);\n    if (fromL !== undefined && toL !== undefined && fromL < toL) {\n      predMap.get(e.to)?.push(e.from);\n      succMap.get(e.from)?.push(e.to);\n    }\n  });\n\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n  const numLayers = layerKeys.length;\n\n  // Cross-axis = x for TB layout, y for LR layout.\n  // Compute the GLOBAL maximum cross-size across all nodes. This single step\n  // is used for within-layer spacing so that nodes of different widths never\n  // overlap. Nodes narrower than the slot are centred within it.\n  // DISCLOSED: in mixed diagrams (cards + small nodes in the same layer), small\n  // nodes receive extra cross-axis spacing equal to the slot overshoot. This is\n  // visually acceptable and guarantees no overlaps without restructuring BK.\n  const crossGap = isLR ? rowGap : colGap;\n  const mainGap = isLR ? colGap : rowGap;\n\n  let globalCrossSize = isLR ? nodeH : nodeW;\n  for (const [, nodes] of byLayer) {\n    for (const n of nodes) {\n      const cs = isLR ? getH(n.id) : getW(n.id);\n      if (cs > globalCrossSize) globalCrossSize = cs;\n    }\n  }\n  const crossStep = globalCrossSize + crossGap;\n\n  // Per-layer max main size \u2014 used for cumulative layer positions.\n  const layerMainSizes: number[] = layerKeys.map((lk) => {\n    const nodes = byLayer.get(lk)!;\n    let mx = isLR ? nodeW : nodeH;\n    for (const n of nodes) {\n      const ms = isLR ? getW(n.id) : getH(n.id);\n      if (ms > mx) mx = ms;\n    }\n    return mx;\n  });\n\n  // Cumulative layer main-axis positions (forward order: layer 0 first).\n  const fwdMainPos: number[] = [];\n  let cumMain = margin;\n  for (let li = 0; li < numLayers; li++) {\n    fwdMainPos.push(cumMain);\n    cumMain += layerMainSizes[li]! + mainGap;\n  }\n\n  /**\n   * Run one coordinate pass (top-down or bottom-up).\n   * Returns a map of node id \u2192 cross-axis SLOT left-edge position.\n   * (Individual nodes may be narrower; they are centred within their slot\n   *  in the final rect-emission loop below.)\n   */\n  function onePass(topDown: boolean, fallbackPositions?: Map<string, number>): Map<string, number> {\n    const crossPos = new Map<string, number>();\n    const neighborMap = topDown ? predMap : succMap;\n    const indices = topDown\n      ? Array.from({ length: numLayers }, (_, i) => i)\n      : Array.from({ length: numLayers }, (_, i) => numLayers - 1 - i);\n\n    for (const li of indices) {\n      const layerIdx = layerKeys[li]!;\n      const nodes = byLayer.get(layerIdx)!;\n      const count = nodes.length;\n      if (count === 0) continue;\n\n      // Default (centering) start \u2014 same formula as the old algorithm so that\n      // layers with no anchoring neighbors fall back to a centred arrangement.\n      const centeredStart = margin + ((maxNodesInLayer - count) * crossStep) / 2;\n\n      // Compute preference for each node: mean of neighbor cross-axis positions.\n      const pref: number[] = nodes.map((node, i) => {\n        const nbrs = neighborMap.get(node.id) ?? [];\n        if (nbrs.length === 0) {\n          if (fallbackPositions && fallbackPositions.has(node.id)) {\n            return fallbackPositions.get(node.id)!;\n          }\n          return centeredStart + i * crossStep;\n        }\n        if (topDown && nbrs.length === 1) {\n          const p = nbrs[0]!;\n          const siblings = (succMap.get(p) ?? []).filter((sid) => nodes.some((n) => n.id === sid));\n          if (siblings.length > 1) {\n            const sIdx = siblings.indexOf(node.id);\n            const pPos = crossPos.get(p) ?? centeredStart;\n            return pPos + (sIdx - (siblings.length - 1) / 2) * crossStep;\n          }\n        }\n        const nbrPos = nbrs\n          .map((nid) => crossPos.get(nid))\n          .filter((p): p is number => p !== undefined);\n        return nbrPos.reduce((s, p) => s + p, 0) / nbrPos.length;\n      });\n\n      // Place nodes at their natural preferred positions with minimum crossStep separation\n      const pos = [...pref];\n      pos[0] = Math.max(margin, pos[0]!);\n      for (let i = 1; i < count; i++) {\n        pos[i] = Math.max(pos[i]!, pos[i - 1]! + crossStep);\n      }\n      for (let i = count - 2; i >= 0; i--) {\n        const maxAllowed = pos[i + 1]! - crossStep;\n        if (pos[i]! > maxAllowed) pos[i] = maxAllowed;\n      }\n      const minX = Math.min(...pos);\n      const shift = minX < margin ? margin - minX : 0;\n      for (let i = 0; i < count; i++) {\n        crossPos.set(nodes[i]!.id, pos[i]! + shift);\n      }\n    }\n    return crossPos;\n  }\n\n  const pass2 = onePass(false); // successor-aligned   (bottom-up)\n  const pass1 = onePass(true, pass2); // predecessor-aligned (top-down, roots use pass2 fallback)\n\n  // Average the two passes and emit Rect entries.\n  // Each node is centred within its cross-axis slot and within its layer band.\n  const nodePos = new Map<string, Rect>();\n  for (let li = 0; li < numLayers; li++) {\n    const layerIdx = layerKeys[li]!;\n    const nodes = byLayer.get(layerIdx)!;\n    const layerMainSz = layerMainSizes[li]!;\n\n    // Main-axis position: for isReverse, the layer drawn \"first\" (index 0)\n    // maps to the farthest forward position; assign in reverse order.\n    const mainPos = isReverse ? fwdMainPos[numLayers - 1 - li]! : fwdMainPos[li]!;\n\n    for (const node of nodes) {\n      const c1 = pass1.get(node.id) ?? margin;\n      const c2 = pass2.get(node.id) ?? margin;\n      const preds = predMap.get(node.id) ?? [];\n\n      const slotLeft = preds.length === 0 ? c2 : c1;\n\n      const nw = getW(node.id);\n      const nh = getH(node.id);\n\n      // Centre the node within its cross slot and within the layer's main band.\n      const crossOffset = (globalCrossSize - (isLR ? nh : nw)) / 2;\n      const mainOffset = (layerMainSz - (isLR ? nw : nh)) / 2;\n\n      nodePos.set(node.id, {\n        x: isLR ? mainPos + mainOffset : slotLeft + crossOffset,\n        y: isLR ? slotLeft + crossOffset : mainPos + mainOffset,\n        width: nw,\n        height: nh,\n      });\n    }\n  }\n\n  // Normalize cross-axis and main-axis coordinates so the bounding box starts at margin.\n  if (nodePos.size > 0) {\n    const minCross = Math.min(...[...nodePos.values()].map((r) => (isLR ? r.y : r.x)));\n    const crossShift = margin - minCross;\n    const minMain = Math.min(...[...nodePos.values()].map((r) => (isLR ? r.x : r.y)));\n    const mainShift = margin - minMain;\n\n    if (crossShift !== 0 || mainShift !== 0) {\n      const shiftX = isLR ? mainShift : crossShift;\n      const shiftY = isLR ? crossShift : mainShift;\n      for (const [id, r] of nodePos) {\n        nodePos.set(id, {\n          x: r.x + shiftX,\n          y: r.y + shiftY,\n          width: r.width,\n          height: r.height,\n        });\n      }\n    }\n  }\n\n  return nodePos;\n}\n\n// \u2500\u2500\u2500 Node Shape Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderNodeShape(\n  node: FlowNode,\n  r: Rect,\n  fill: string,\n  stroke: string,\n  sw: number,\n  theme?: ResolvedTheme,\n): SceneElement[] {\n  const { x, y, width: w, height: h } = r;\n  const stdRadius = theme?.nodes?.standard.cornerRadius ?? 6;\n  const stdSw = theme?.nodes?.standard.borderWidth ?? sw;\n  const leafRadius = theme?.nodes?.leaf.cornerRadius ?? h / 2;\n  const leafSw = theme?.nodes?.leaf.borderWidth ?? sw;\n  const dsSw = theme?.nodes?.datastore.borderWidth ?? sw;\n\n  switch (node.shape) {\n    case 'diamond': {\n      const cx = x + w / 2,\n        cy = y + h / 2;\n      return [\n        {\n          type: 'path',\n          d: `M ${cx} ${y} L ${x + w} ${cy} L ${cx} ${y + h} L ${x} ${cy} Z`,\n          fill,\n          stroke,\n          strokeWidth: stdSw,\n        },\n      ];\n    }\n    case 'circle':\n      return [\n        {\n          type: 'circle',\n          center: { x: x + w / 2, y: y + h / 2 },\n          radius: Math.min(w, h) / 2,\n          fill,\n          stroke,\n          strokeWidth: stdSw,\n        },\n      ];\n    case 'rounded-rect':\n      return [{ type: 'rect', bounds: r, fill, stroke, strokeWidth: stdSw, rx: stdRadius }];\n    case 'stadium':\n      return [\n        {\n          type: 'rect',\n          bounds: r,\n          fill,\n          stroke,\n          strokeWidth: leafSw,\n          rx: Math.min(h / 2, leafRadius),\n        },\n      ];\n    case 'subroutine':\n      return [\n        { type: 'rect', bounds: r, fill, stroke, strokeWidth: stdSw, rx: 2 },\n        {\n          type: 'path',\n          d: `M ${x + 8} ${y} L ${x + 8} ${y + h} M ${x + w - 8} ${y} L ${x + w - 8} ${y + h}`,\n          fill: 'none',\n          stroke,\n          strokeWidth: stdSw * 0.7,\n        },\n      ];\n    case 'cylinder': {\n      const ry = Math.min(10, Math.max(4, h * 0.15));\n      const dBody = `M ${x} ${y + ry} A ${w / 2} ${ry} 0 0 1 ${x + w} ${y + ry} L ${x + w} ${y + h - ry} A ${w / 2} ${ry} 0 0 1 ${x} ${y + h - ry} Z`;\n      const dRim = `M ${x} ${y + ry} A ${w / 2} ${ry} 0 0 0 ${x + w} ${y + ry}`;\n      return [\n        { type: 'path', d: dBody, fill, stroke, strokeWidth: dsSw },\n        { type: 'path', d: dRim, fill: 'none', stroke, strokeWidth: dsSw },\n      ];\n    }\n    case 'hexagon': {\n      const chamfer = Math.min(w * 0.15, h * 0.4);\n      const d = `M ${x + chamfer} ${y} L ${x + w - chamfer} ${y} L ${x + w} ${y + h / 2} L ${x + w - chamfer} ${y + h} L ${x + chamfer} ${y + h} L ${x} ${y + h / 2} Z`;\n      return [{ type: 'path', d, fill, stroke, strokeWidth: stdSw }];\n    }\n    case 'parallelogram': {\n      const slant = Math.min(w * 0.2, 16);\n      const d = `M ${x + slant} ${y} L ${x + w} ${y} L ${x + w - slant} ${y + h} L ${x} ${y + h} Z`;\n      return [{ type: 'path', d, fill, stroke, strokeWidth: stdSw }];\n    }\n    case 'parallelogram-alt': {\n      const slant = Math.min(w * 0.2, 16);\n      const d = `M ${x} ${y} L ${x + w - slant} ${y} L ${x + w} ${y + h} L ${x + slant} ${y + h} Z`;\n      return [{ type: 'path', d, fill, stroke, strokeWidth: stdSw }];\n    }\n    case 'asymmetric': {\n      const point = Math.min(w * 0.15, 14);\n      const d = `M ${x} ${y} L ${x + w - point} ${y} L ${x + w} ${y + h / 2} L ${x + w - point} ${y + h} L ${x} ${y + h} Z`;\n      return [{ type: 'path', d, fill, stroke, strokeWidth: stdSw }];\n    }\n    case 'card':\n      return [{ type: 'rect', bounds: r, fill, stroke, strokeWidth: stdSw, rx: stdRadius }];\n    default:\n      return [{ type: 'rect', bounds: r, fill, stroke, strokeWidth: stdSw, rx: stdRadius }];\n  }\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Pick the best connection point on a node's boundary.\n *\n * Instead of always using the flow-direction side (right for LR),\n * we compare the relative position of the peer node. If the peer is\n * significantly off-axis (more than half the node height/width away),\n * we exit/enter from the perpendicular side closest to the peer.\n */\ntype AnchorResult = { point: Point; portDir: import('../../../contracts/index.js').PortDirection };\n\n/**\n * Anchor on an explicitly requested wall (from a wall hint). Overrides the\n * auto-derivation in `edgeAnchor` \u2014 the port sits at the midpoint of the named\n * side with the matching port direction.\n */\nfunction wallAnchor(\n  r: Rect,\n  wall: import('../../../contracts/index.js').CardinalSide,\n  portIndex: number = 0,\n  portTotal: number = 1,\n): AnchorResult {\n  const t = portTotal <= 1 ? 0.5 : (portIndex + 1) / (portTotal + 1);\n  switch (wall) {\n    case 'N':\n      return { point: { x: r.x + t * r.width, y: r.y }, portDir: 'N' };\n    case 'S':\n      return { point: { x: r.x + t * r.width, y: r.y + r.height }, portDir: 'S' };\n    case 'E':\n      return { point: { x: r.x + r.width, y: r.y + t * r.height }, portDir: 'E' };\n    case 'W':\n      return { point: { x: r.x, y: r.y + t * r.height }, portDir: 'W' };\n  }\n}\n\nfunction edgeAnchor(\n  r: Rect,\n  dir: FlowDirection,\n  role: 'exit' | 'enter',\n  peer: Rect,\n  nodeShape?: string,\n  portIndex: number = 0,\n  portTotal: number = 1,\n): AnchorResult {\n  const cx = r.x + r.width / 2;\n  const cy = r.y + r.height / 2;\n  const pcx = peer.x + peer.width / 2;\n  const pcy = peer.y + peer.height / 2;\n\n  const dx = pcx - cx;\n  const dy = pcy - cy;\n\n  const isLR = dir === 'LR' || dir === 'RL';\n  const t = portTotal <= 1 ? 0.5 : (portIndex + 1) / (portTotal + 1);\n\n  const getPort = (wall: 'N' | 'S' | 'E' | 'W'): AnchorResult => {\n    switch (wall) {\n      case 'N':\n        return { point: { x: r.x + t * r.width, y: r.y }, portDir: 'N' };\n      case 'S':\n        return { point: { x: r.x + t * r.width, y: r.y + r.height }, portDir: 'S' };\n      case 'E':\n        return { point: { x: r.x + r.width, y: r.y + t * r.height }, portDir: 'E' };\n      case 'W':\n        return { point: { x: r.x, y: r.y + t * r.height }, portDir: 'W' };\n    }\n  };\n\n  if (isLR) {\n    if (nodeShape === 'diamond') {\n      if (role === 'exit') {\n        if (dy < -1) return getPort('N');\n        if (dy > 1) return getPort('S');\n        return getPort('E');\n      } else {\n        if (dx < -r.width) {\n          if (peer.y + peer.height <= r.y) return getPort('N');\n          if (peer.y >= r.y + r.height) return getPort('S');\n          return getPort('W');\n        }\n        if (dy < -1) return getPort('N');\n        if (dy > 1) return getPort('S');\n        return getPort('W');\n      }\n    }\n\n    const offAxis = Math.abs(dy);\n    const onAxis = Math.abs(dx);\n\n    if (offAxis > onAxis && offAxis > r.height / 2) {\n      return dy > 0 ? getPort('S') : getPort('N');\n    }\n\n    return dx > 0 ? getPort('E') : getPort('W');\n  } else {\n    if (nodeShape === 'diamond') {\n      if (role === 'exit') {\n        if (dx < -1) return getPort('W');\n        if (dx > 1) return getPort('E');\n        return getPort('S');\n      } else {\n        if (dy < -r.height) {\n          if (peer.x + peer.width <= r.x) return getPort('W');\n          if (peer.x >= r.x + r.width) return getPort('E');\n          return getPort('N');\n        }\n        if (dx < -1) return getPort('W');\n        if (dx > 1) return getPort('E');\n        return getPort('N');\n      }\n    }\n\n    // In TB layout: vertical flow is primary. Forward edges between different layers\n    // (peer is below source) MUST exit South and enter North.\n    // Lateral ports ('E' / 'W') are reserved for nodes on the same layer (|dy| <= r.height)\n    // or when the peer is strictly lateral.\n    const sameLayer = Math.abs(dy) <= r.height;\n    if ((sameLayer && Math.abs(dx) > r.width / 2) || Math.abs(dx) > Math.abs(dy) * 2) {\n      return dx > 0 ? getPort('E') : getPort('W');\n    }\n\n    return dy > 0 ? getPort('S') : getPort('N');\n  }\n}\n\n/** Feedback / self-loop route result: a path plus its extent and label anchor. */\ninterface EdgeRoute {\n  path: string;\n  labelPos: Point;\n  minX: number;\n  maxX: number;\n  minY: number;\n  maxY: number;\n  usedGutter?: boolean;\n}\n\nfunction curveCollides(p0: Point, p1: Point, p2: Point, p3: Point, obs: Rect[]): boolean {\n  for (let t = 0.05; t <= 0.95; t += 0.05) {\n    const it = 1 - t;\n    const x =\n      it * it * it * p0.x + 3 * it * it * t * p1.x + 3 * it * t * t * p2.x + t * t * t * p3.x;\n    const y =\n      it * it * it * p0.y + 3 * it * it * t * p1.y + 3 * it * t * t * p2.y + t * t * t * p3.y;\n    for (const r of obs) {\n      if (x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\nfunction backEdgeFilletV(\n  start: Point,\n  end: Point,\n  gutterX: number,\n  isWest: boolean,\n): { path: string; labelPos: Point } {\n  const R = Math.min(8, Math.abs(end.y - start.y) / 4);\n  const signY = end.y > start.y ? 1 : -1;\n  const gTurn1X = isWest ? gutterX + R : gutterX - R;\n  const gTurn2X = isWest ? gutterX + R : gutterX - R;\n  const path = `M ${start.x} ${start.y} L ${gTurn1X} ${start.y} C ${gutterX} ${start.y}, ${gutterX} ${start.y + signY * R}, ${gutterX} ${start.y + signY * R} L ${gutterX} ${end.y - signY * R} C ${gutterX} ${end.y}, ${gTurn2X} ${end.y}, ${gTurn2X} ${end.y} L ${end.x} ${end.y}`;\n  const labelPos: Point = { x: gutterX, y: (start.y + end.y) / 2 };\n  return { path, labelPos };\n}\n\nfunction backEdgeFilletH(\n  start: Point,\n  end: Point,\n  gutterY: number,\n  isNorth: boolean,\n): { path: string; labelPos: Point } {\n  const R = Math.min(8, Math.abs(end.x - start.x) / 4);\n  const signX = end.x > start.x ? 1 : -1;\n  const gTurn1Y = isNorth ? gutterY + R : gutterY - R;\n  const gTurn2Y = isNorth ? gutterY + R : gutterY - R;\n  const path = `M ${start.x} ${start.y} L ${start.x} ${gTurn1Y} C ${start.x} ${gutterY}, ${start.x + signX * R} ${gutterY}, ${start.x + signX * R} ${gutterY} L ${end.x - signX * R} ${gutterY} C ${end.x} ${gutterY}, ${end.x} ${gTurn2Y}, ${end.x} ${gTurn2Y} L ${end.x} ${end.y}`;\n  const labelPos: Point = { x: (start.x + end.x) / 2, y: gutterY };\n  return { path, labelPos };\n}\n\n/**\n * Back-edge (\"feedback\") route. A back-edge runs against the layer flow (a lower\n * layer back up to an ancestor); drawn like a forward edge it slices straight\n * through the intervening node column. Instead we route it around intervening nodes\n * or through the outside gutter with a clean orthogonal/fillet path.\n */\nfunction backEdgeRoute(\n  from: Rect,\n  to: Rect,\n  isLR: boolean,\n  allRects?: Rect[],\n  obstacles?: Rect[],\n  laneIndex: number = 0,\n): EdgeRoute {\n  const laneOffset = laneIndex * 16;\n  const allR = allRects && allRects.length > 0 ? allRects : [from, to];\n  const obs = obstacles ?? [];\n\n  if (isLR) {\n    const minY = Math.min(...allR.map((r) => r.y));\n    const maxY = Math.max(...allR.map((r) => r.y + r.height));\n    const midY = (minY + maxY) / 2;\n    const edgeMidY = (from.y + from.height / 2 + to.y + to.height / 2) / 2;\n\n    const s_start: Point = { x: from.x + from.width / 2, y: from.y + from.height };\n    const s_end: Point = { x: to.x + to.width / 2, y: to.y + to.height };\n    const s_gutter = maxY + 32 + laneOffset;\n\n    const n_start: Point = { x: from.x + from.width / 2, y: from.y };\n    const n_end: Point = { x: to.x + to.width / 2, y: to.y };\n    const n_gutter = minY - 32 - laneOffset;\n\n    const useNorth = edgeMidY < midY;\n    const chosenGutter = useNorth ? n_gutter : s_gutter;\n    const startPt = useNorth ? n_start : s_start;\n    const endPt = useNorth ? n_end : s_end;\n    const fillet = backEdgeFilletH(startPt, endPt, chosenGutter, useNorth);\n\n    return {\n      path: fillet.path,\n      labelPos: fillet.labelPos,\n      minX: Math.min(startPt.x, endPt.x),\n      maxX: Math.max(startPt.x, endPt.x),\n      minY: Math.min(startPt.y, endPt.y, chosenGutter),\n      maxY: Math.max(startPt.y, endPt.y, chosenGutter),\n      usedGutter: true,\n    };\n  }\n\n  // Vertical flow \u2192 corridor or gutter routing\n  const minX = Math.min(...allR.map((r) => r.x));\n  const maxX = Math.max(...allR.map((r) => r.x + r.width));\n  const midX = (minX + maxX) / 2;\n  const edgeMidX = (from.x + from.width / 2 + to.x + to.width / 2) / 2;\n\n  // Check if there is an unobstructed lateral corridor directly between from and to\n  const targetIsWest = to.x + to.width <= from.x - 24;\n  const targetIsEast = from.x + from.width <= to.x - 24;\n\n  function segmentIntersectsRect(p1: Point, p2: Point, r: Rect): boolean {\n    const minX = Math.min(p1.x, p2.x);\n    const maxX = Math.max(p1.x, p2.x);\n    const minY = Math.min(p1.y, p2.y);\n    const maxY = Math.max(p1.y, p2.y);\n\n    if (maxX <= r.x || minX >= r.x + r.width || maxY <= r.y || minY >= r.y + r.height) {\n      return false;\n    }\n    if (Math.abs(p1.x - p2.x) < 1e-3) {\n      return p1.x > r.x && p1.x < r.x + r.width && minY < r.y + r.height && maxY > r.y;\n    }\n    if (Math.abs(p1.y - p2.y) < 1e-3) {\n      return p1.y > r.y && p1.y < r.y + r.height && minX < r.x + r.width && maxX > r.x;\n    }\n    return true;\n  }\n\n  function pathIntersectsObstacles(points: readonly Point[], obs: readonly Rect[]): boolean {\n    for (const r of obs) {\n      for (let i = 0; i < points.length - 1; i++) {\n        if (segmentIntersectsRect(points[i]!, points[i + 1]!, r)) return true;\n      }\n    }\n    return false;\n  }\n\n  if (targetIsWest) {\n    const cStartX = from.x;\n    const cStartY = from.y + from.height * 0.35;\n    const cEndX = to.x + to.width;\n    const cEndY = to.y + to.height * 0.65;\n    const xMin = cEndX + 10;\n    const xMax = cStartX - 10;\n    if (xMax >= xMin) {\n      // Try mid, close-to-from, and close-to-to candidates\n      const candidates = [(xMin + xMax) / 2, xMax - 8, xMin + 8];\n      for (const midXCandidate of candidates) {\n        const testPoints = [\n          { x: cStartX, y: cStartY },\n          { x: midXCandidate, y: cStartY },\n          { x: midXCandidate, y: cEndY },\n          { x: cEndX, y: cEndY },\n        ];\n        if (!pathIntersectsObstacles(testPoints, obs)) {\n          const R = 8;\n          const path = `M ${cStartX} ${cStartY} L ${midXCandidate + R} ${cStartY} C ${midXCandidate} ${cStartY}, ${midXCandidate} ${cStartY - R}, ${midXCandidate} ${cStartY - R} L ${midXCandidate} ${cEndY + R} C ${midXCandidate} ${cEndY}, ${midXCandidate - R} ${cEndY}, ${midXCandidate - R} ${cEndY} L ${cEndX} ${cEndY}`;\n          return {\n            path,\n            labelPos: { x: (cEndX + midXCandidate) / 2, y: cEndY },\n            minX: cEndX,\n            maxX: cStartX,\n            minY: Math.min(cStartY, cEndY),\n            maxY: Math.max(cStartY, cEndY),\n            usedGutter: false,\n          };\n        }\n      }\n    }\n  } else if (targetIsEast) {\n    const cStartX = from.x + from.width;\n    const cStartY = from.y + from.height * 0.35;\n    const cEndX = to.x;\n    const cEndY = to.y + to.height * 0.65;\n    const xMin = cStartX + 10;\n    const xMax = cEndX - 10;\n    if (xMax >= xMin) {\n      const candidates = [(xMin + xMax) / 2, xMin + 8, xMax - 8];\n      for (const midXCandidate of candidates) {\n        const testPoints = [\n          { x: cStartX, y: cStartY },\n          { x: midXCandidate, y: cStartY },\n          { x: midXCandidate, y: cEndY },\n          { x: cEndX, y: cEndY },\n        ];\n        if (!pathIntersectsObstacles(testPoints, obs)) {\n          const R = 8;\n          const path = `M ${cStartX} ${cStartY} L ${midXCandidate - R} ${cStartY} C ${midXCandidate} ${cStartY}, ${midXCandidate} ${cStartY - R}, ${midXCandidate} ${cStartY - R} L ${midXCandidate} ${cEndY + R} C ${midXCandidate} ${cEndY}, ${midXCandidate + R} ${cEndY}, ${midXCandidate + R} ${cEndY} L ${cEndX} ${cEndY}`;\n          return {\n            path,\n            labelPos: { x: (cStartX + midXCandidate) / 2, y: cStartY },\n            minX: cStartX,\n            maxX: cEndX,\n            minY: Math.min(cStartY, cEndY),\n            maxY: Math.max(cStartY, cEndY),\n            usedGutter: false,\n          };\n        }\n      }\n    }\n  }\n\n  // Fallback: outside gutter routing with clean fillets\n  const useWest = edgeMidX <= midX;\n  const w_start: Point = { x: from.x, y: from.y + from.height / 2 };\n  const w_end: Point = { x: to.x, y: to.y + to.height / 2 };\n  const w_gutter = minX - 32 - laneOffset;\n\n  const e_start: Point = { x: from.x + from.width, y: from.y + from.height / 2 };\n  const e_end: Point = { x: to.x + to.width, y: to.y + to.height / 2 };\n  const e_gutter = maxX + 32 + laneOffset;\n\n  const chosenGutter = useWest ? w_gutter : e_gutter;\n  const startPt = useWest ? w_start : e_start;\n  const endPt = useWest ? w_end : e_end;\n  const fillet = backEdgeFilletV(startPt, endPt, chosenGutter, useWest);\n\n  return {\n    path: fillet.path,\n    labelPos: fillet.labelPos,\n    minX: Math.min(startPt.x, endPt.x, chosenGutter),\n    maxX: Math.max(startPt.x, endPt.x, chosenGutter),\n    minY: Math.min(startPt.y, endPt.y),\n    maxY: Math.max(startPt.y, endPt.y),\n    usedGutter: true,\n  };\n}\n\n/**\n * Self-loop (A \u2192 A) route. A small cubic loop hung off one side of the node\n * (East for vertical flow, South for horizontal flow) so it never degenerates\n * into a zero-length line drawn through the node. The arrowhead re-enters the\n * same wall a little below/right of where it left.\n */\nfunction selfLoopRoute(r: Rect, isLR: boolean): EdgeRoute {\n  const loop = 28;\n  if (isLR) {\n    // Loop hangs below the node (South wall).\n    const x1 = r.x + r.width * 0.35;\n    const x2 = r.x + r.width * 0.65;\n    const sy = r.y + r.height;\n    return {\n      path: `M ${x1} ${sy} C ${x1 - loop} ${sy + loop}, ${x2 + loop} ${sy + loop}, ${x2} ${sy}`,\n      labelPos: { x: r.x + r.width / 2, y: sy + loop + 4 },\n      minX: x1 - loop,\n      maxX: x2 + loop,\n      minY: sy,\n      maxY: sy + loop,\n    };\n  }\n  // Loop sits to the right of the node (East wall).\n  const y1 = r.y + r.height * 0.3;\n  const y2 = r.y + r.height * 0.7;\n  const ex = r.x + r.width;\n  return {\n    path: `M ${ex} ${y1} C ${ex + loop} ${y1 - loop}, ${ex + loop} ${y2 + loop}, ${ex} ${y2}`,\n    labelPos: { x: ex + loop, y: r.y + r.height / 2 },\n    minX: ex,\n    maxX: ex + loop,\n    minY: y1 - loop,\n    maxY: y2 + loop,\n  };\n}\n\nfunction nodeStatusFill(node: FlowNode, palette: ResolvedTheme['palette']): string {\n  switch (node.status) {\n    case 'active':\n      return palette.primary + '22';\n    case 'success':\n      return palette.success + '22';\n    case 'warning':\n      return palette.warning + '22';\n    case 'error':\n      return palette.error + '22';\n    case 'muted':\n      return palette.surface;\n    default:\n      return palette.surface;\n  }\n}\n\nfunction arrowMarkerDef(color: string, size: number): string {\n  const s = size;\n  return `<marker id=\"${ARROW_MARKER_ID}\" markerWidth=\"${s}\" markerHeight=\"${s * 0.7}\" refX=\"${s - 1}\" refY=\"${s * 0.35}\" orient=\"auto\"><polygon points=\"0 0, ${s} ${s * 0.35}, 0 ${s * 0.7}\" fill=\"${color}\" /></marker>`;\n}\n\n/**\n * Fractional position of a point along a node wall.\n * N/S walls: fraction of width (0=left, 1=right).\n * E/W walls: fraction of height (0=top, 1=bottom).\n */\nfunction wallT(bounds: Rect, wall: CardinalSide, pt: Point): number {\n  switch (wall) {\n    case 'N':\n    case 'S':\n      return bounds.width > 0 ? Math.max(0, Math.min(1, (pt.x - bounds.x) / bounds.width)) : 0.5;\n    case 'E':\n    case 'W':\n      return bounds.height > 0 ? Math.max(0, Math.min(1, (pt.y - bounds.y) / bounds.height)) : 0.5;\n  }\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function sanitizeId(raw) {\n    let id = raw\n      .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')\n      .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n      .toLowerCase()\n      .replace(/[_\\s]+/g, '-')\n      .replace(/[^a-z0-9-]/g, '')\n      .replace(/-+/g, '-')\n      .replace(/^-|-$/g, '');\n    if (!id || /^[0-9]/.test(id)) id = 'n' + id;\n    return id;\n  }\n\n  function stripQuotes(text) {\n    if (text.length >= 2 && text[0] === '\"' && text[text.length - 1] === '\"') {\n      return text.slice(1, -1);\n    }\n    return text;\n  }\n\n  const nodeMap  = new Map();\n  const edges    = [];\n  const overlays = [];\n  const idCounts = new Map();\n\n  function registerNode(rawId, label, shape) {\n    const id = sanitizeId(rawId);\n    if (!nodeMap.has(id)) {\n      nodeMap.set(id, { id, label: label || rawId, shape: shape || 'rect', status: 'default' });\n    } else if (label !== null && label !== undefined) {\n      const n = nodeMap.get(id);\n      n.label = label;\n      if (shape) n.shape = shape;\n    }\n    return id;\n  }\n\n  function addEdge(from, to, label, style, ann, edgeProps) {\n    const e = { from, to, label: label || undefined, style: style || 'solid' };\n    if (edgeProps) {\n      if (edgeProps.bidirectional) e.bidirectional = true;\n      if (edgeProps.undirected)    e.undirected    = true;\n      if (edgeProps.endMarker)     e.endMarker     = edgeProps.endMarker;\n    }\n    if (ann) {\n      if (ann.animation) e.animation = ann.animation;\n      if (ann.routing)   e.routing   = ann.routing;\n      if (ann.exitWall)  e.exitWall  = ann.exitWall;\n      if (ann.entryWall) e.entryWall = ann.entryWall;\n    }\n    edges.push(e);\n  }\n\n  function reset() {\n    nodeMap.clear();\n    edges.length = 0;\n    overlays.length = 0;\n    idCounts.clear();\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"---\";\n  var peg$c1 = \"flowchart\";\n  var peg$c2 = \"graph\";\n  var peg$c3 = \"TD\";\n  var peg$c4 = \"TB\";\n  var peg$c5 = \"BT\";\n  var peg$c6 = \"LR\";\n  var peg$c7 = \"RL\";\n  var peg$c8 = \";\";\n  var peg$c9 = \"end\";\n  var peg$c10 = \"%%\";\n  var peg$c11 = \"subgraph\";\n  var peg$c12 = \"[\";\n  var peg$c13 = \"]\";\n  var peg$c14 = \"@\";\n  var peg$c15 = \"|\";\n  var peg$c16 = \"<-~->\";\n  var peg$c17 = \"<-_->\";\n  var peg$c18 = \"<-.->\";\n  var peg$c19 = \"<==>\";\n  var peg$c20 = \"<-->\";\n  var peg$c21 = \"-~->\";\n  var peg$c22 = \"-_->\";\n  var peg$c23 = \"-..->\";\n  var peg$c24 = \"-.->\";\n  var peg$c25 = \"===>\";\n  var peg$c26 = \"==>\";\n  var peg$c27 = \"--->\";\n  var peg$c28 = \"-->\";\n  var peg$c29 = \"--x\";\n  var peg$c30 = \"--o\";\n  var peg$c31 = \"-~-\";\n  var peg$c32 = \"-_-\";\n  var peg$c33 = \"-.-\";\n  var peg$c34 = \"===\";\n  var peg$c35 = \"anim:\";\n  var peg$c36 = \"march\";\n  var peg$c37 = \"particle\";\n  var peg$c38 = \"draw\";\n  var peg$c39 = \"pulse\";\n  var peg$c40 = \"glow\";\n  var peg$c41 = \"comet\";\n  var peg$c42 = \"stream\";\n  var peg$c43 = \"flow\";\n  var peg$c44 = \"colorcycle\";\n  var peg$c45 = \"none\";\n  var peg$c46 = \"{\";\n  var peg$c47 = \"anim\";\n  var peg$c48 = \":\";\n  var peg$c49 = \"}\";\n  var peg$c50 = \"straight\";\n  var peg$c51 = \"orthogonal\";\n  var peg$c52 = \"bezier\";\n  var peg$c53 = \"polyline\";\n  var peg$c54 = \":::\";\n  var peg$c55 = \"\\\"\";\n  var peg$c56 = \"((\";\n  var peg$c57 = \"))\";\n  var peg$c58 = \"([\";\n  var peg$c59 = \"])\";\n  var peg$c60 = \"[[\";\n  var peg$c61 = \"]]\";\n  var peg$c62 = \"[(\";\n  var peg$c63 = \")]\";\n  var peg$c64 = \"{{\";\n  var peg$c65 = \"}}\";\n  var peg$c66 = \"[/\";\n  var peg$c67 = \"/]\";\n  var peg$c68 = \"[\\\\\";\n  var peg$c69 = \"\\\\]\";\n  var peg$c70 = \">\";\n  var peg$c71 = \"(\";\n  var peg$c72 = \")\";\n  var peg$c73 = \"style\";\n  var peg$c74 = \"classDef\";\n  var peg$c75 = \"class\";\n  var peg$c76 = \"click\";\n  var peg$c77 = \"note\";\n  var peg$c78 = \"callout\";\n  var peg$c79 = \"at\";\n  var peg$c80 = \"offset\";\n  var peg$c81 = \",\";\n  var peg$c82 = \"-\";\n  var peg$c83 = \"legend\";\n  var peg$c84 = \"bottom-right\";\n  var peg$c85 = \"bottom-left\";\n  var peg$c86 = \"top-right\";\n  var peg$c87 = \"top-left\";\n  var peg$c88 = \"\\r\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[a-zA-Z_]/;\n  var peg$r2 = /^[a-zA-Z0-9_]/;\n  var peg$r3 = /^[^\\]]/;\n  var peg$r4 = /^[^\\n%]/;\n  var peg$r5 = /^[^|]/;\n  var peg$r6 = /^[a-zA-Z0-9_\\-]/;\n  var peg$r7 = /^[ENSW]/;\n  var peg$r8 = /^[a-z]/;\n  var peg$r9 = /^[a-z0-9\\-]/;\n  var peg$r10 = /^[^\"]/;\n  var peg$r11 = /^[^ \\t\\r\\n@[\\](){};]/;\n  var peg$r12 = /^[^)]/;\n  var peg$r13 = /^[^}]/;\n  var peg$r14 = /^[^\\/]/;\n  var peg$r15 = /^[^\\\\]/;\n  var peg$r16 = /^[^\\n;]/;\n  var peg$r17 = /^[0-9]/;\n  var peg$r18 = /^[^:\\n]/;\n  var peg$r19 = /^[ \\t]/;\n  var peg$r20 = /^[\\n\\r]/;\n\n  var peg$e0 = peg$literalExpectation(\"---\", false);\n  var peg$e1 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e2 = peg$literalExpectation(\"flowchart\", false);\n  var peg$e3 = peg$literalExpectation(\"graph\", false);\n  var peg$e4 = peg$literalExpectation(\"TD\", false);\n  var peg$e5 = peg$literalExpectation(\"TB\", false);\n  var peg$e6 = peg$literalExpectation(\"BT\", false);\n  var peg$e7 = peg$literalExpectation(\"LR\", false);\n  var peg$e8 = peg$literalExpectation(\"RL\", false);\n  var peg$e9 = peg$literalExpectation(\";\", false);\n  var peg$e10 = peg$literalExpectation(\"end\", false);\n  var peg$e11 = peg$anyExpectation();\n  var peg$e12 = peg$literalExpectation(\"%%\", false);\n  var peg$e13 = peg$literalExpectation(\"subgraph\", false);\n  var peg$e14 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], \"_\"], false, false);\n  var peg$e15 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e16 = peg$literalExpectation(\"[\", false);\n  var peg$e17 = peg$classExpectation([\"]\"], true, false);\n  var peg$e18 = peg$literalExpectation(\"]\", false);\n  var peg$e19 = peg$classExpectation([\"\\n\", \"%\"], true, false);\n  var peg$e20 = peg$literalExpectation(\"@\", false);\n  var peg$e21 = peg$literalExpectation(\"|\", false);\n  var peg$e22 = peg$classExpectation([\"|\"], true, false);\n  var peg$e23 = peg$literalExpectation(\"<-~->\", false);\n  var peg$e24 = peg$literalExpectation(\"<-_->\", false);\n  var peg$e25 = peg$literalExpectation(\"<-.->\", false);\n  var peg$e26 = peg$literalExpectation(\"<==>\", false);\n  var peg$e27 = peg$literalExpectation(\"<-->\", false);\n  var peg$e28 = peg$literalExpectation(\"-~->\", false);\n  var peg$e29 = peg$literalExpectation(\"-_->\", false);\n  var peg$e30 = peg$literalExpectation(\"-..->\", false);\n  var peg$e31 = peg$literalExpectation(\"-.->\", false);\n  var peg$e32 = peg$literalExpectation(\"===>\", false);\n  var peg$e33 = peg$literalExpectation(\"==>\", false);\n  var peg$e34 = peg$literalExpectation(\"--->\", false);\n  var peg$e35 = peg$literalExpectation(\"-->\", false);\n  var peg$e36 = peg$literalExpectation(\"--x\", false);\n  var peg$e37 = peg$literalExpectation(\"--o\", false);\n  var peg$e38 = peg$literalExpectation(\"-~-\", false);\n  var peg$e39 = peg$literalExpectation(\"-_-\", false);\n  var peg$e40 = peg$literalExpectation(\"-.-\", false);\n  var peg$e41 = peg$literalExpectation(\"===\", false);\n  var peg$e42 = peg$literalExpectation(\"anim:\", false);\n  var peg$e43 = peg$literalExpectation(\"march\", false);\n  var peg$e44 = peg$literalExpectation(\"particle\", false);\n  var peg$e45 = peg$literalExpectation(\"draw\", false);\n  var peg$e46 = peg$literalExpectation(\"pulse\", false);\n  var peg$e47 = peg$literalExpectation(\"glow\", false);\n  var peg$e48 = peg$literalExpectation(\"comet\", false);\n  var peg$e49 = peg$literalExpectation(\"stream\", false);\n  var peg$e50 = peg$literalExpectation(\"flow\", false);\n  var peg$e51 = peg$literalExpectation(\"colorcycle\", false);\n  var peg$e52 = peg$literalExpectation(\"none\", false);\n  var peg$e53 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e54 = peg$literalExpectation(\"{\", false);\n  var peg$e55 = peg$literalExpectation(\"anim\", false);\n  var peg$e56 = peg$literalExpectation(\":\", false);\n  var peg$e57 = peg$literalExpectation(\"}\", false);\n  var peg$e58 = peg$literalExpectation(\"straight\", false);\n  var peg$e59 = peg$literalExpectation(\"orthogonal\", false);\n  var peg$e60 = peg$literalExpectation(\"bezier\", false);\n  var peg$e61 = peg$literalExpectation(\"polyline\", false);\n  var peg$e62 = peg$classExpectation([\"E\", \"N\", \"S\", \"W\"], false, false);\n  var peg$e63 = peg$literalExpectation(\":::\", false);\n  var peg$e64 = peg$classExpectation([[\"a\", \"z\"]], false, false);\n  var peg$e65 = peg$classExpectation([[\"a\", \"z\"], [\"0\", \"9\"], \"-\"], false, false);\n  var peg$e66 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e67 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e68 = peg$classExpectation([\" \", \"\\t\", \"\\r\", \"\\n\", \"@\", \"[\", \"]\", \"(\", \")\", \"{\", \"}\", \";\"], true, false);\n  var peg$e69 = peg$literalExpectation(\"((\", false);\n  var peg$e70 = peg$classExpectation([\")\"], true, false);\n  var peg$e71 = peg$literalExpectation(\"))\", false);\n  var peg$e72 = peg$literalExpectation(\"([\", false);\n  var peg$e73 = peg$literalExpectation(\"])\", false);\n  var peg$e74 = peg$literalExpectation(\"[[\", false);\n  var peg$e75 = peg$literalExpectation(\"]]\", false);\n  var peg$e76 = peg$literalExpectation(\"[(\", false);\n  var peg$e77 = peg$literalExpectation(\")]\", false);\n  var peg$e78 = peg$literalExpectation(\"{{\", false);\n  var peg$e79 = peg$classExpectation([\"}\"], true, false);\n  var peg$e80 = peg$literalExpectation(\"}}\", false);\n  var peg$e81 = peg$literalExpectation(\"[/\", false);\n  var peg$e82 = peg$classExpectation([\"/\"], true, false);\n  var peg$e83 = peg$literalExpectation(\"/]\", false);\n  var peg$e84 = peg$literalExpectation(\"[\\\\\", false);\n  var peg$e85 = peg$classExpectation([\"\\\\\"], true, false);\n  var peg$e86 = peg$literalExpectation(\"\\\\]\", false);\n  var peg$e87 = peg$literalExpectation(\">\", false);\n  var peg$e88 = peg$literalExpectation(\"(\", false);\n  var peg$e89 = peg$literalExpectation(\")\", false);\n  var peg$e90 = peg$literalExpectation(\"style\", false);\n  var peg$e91 = peg$classExpectation([\"\\n\", \";\"], true, false);\n  var peg$e92 = peg$literalExpectation(\"classDef\", false);\n  var peg$e93 = peg$literalExpectation(\"class\", false);\n  var peg$e94 = peg$literalExpectation(\"click\", false);\n  var peg$e95 = peg$literalExpectation(\"note\", false);\n  var peg$e96 = peg$literalExpectation(\"callout\", false);\n  var peg$e97 = peg$literalExpectation(\"at\", false);\n  var peg$e98 = peg$literalExpectation(\"offset\", false);\n  var peg$e99 = peg$literalExpectation(\",\", false);\n  var peg$e100 = peg$literalExpectation(\"-\", false);\n  var peg$e101 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e102 = peg$literalExpectation(\"legend\", false);\n  var peg$e103 = peg$literalExpectation(\"bottom-right\", false);\n  var peg$e104 = peg$literalExpectation(\"bottom-left\", false);\n  var peg$e105 = peg$literalExpectation(\"top-right\", false);\n  var peg$e106 = peg$literalExpectation(\"top-left\", false);\n  var peg$e107 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e108 = peg$otherExpectation(\"optional whitespace\");\n  var peg$e109 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e110 = peg$otherExpectation(\"required whitespace\");\n  var peg$e111 = peg$otherExpectation(\"newline\");\n  var peg$e112 = peg$literalExpectation(\"\\r\\n\", false);\n  var peg$e113 = peg$classExpectation([\"\\n\", \"\\r\"], false, false);\n\n  var peg$f0 = function(frontmatter, header, statements) {\n      return {\n        version:   '1.0',\n        metadata:  frontmatter || {},\n        direction: header.direction,\n        flow: { nodes: [...nodeMap.values()], edges },\n        overlays,\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {};\n      for (const line of lines) {\n        const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/);\n        if (m) meta[m[1]] = m[2];\n      }\n      return meta;\n    };\n  var peg$f3 = function(dir) { return { direction: dir }; };\n  var peg$f4 = function(stmts) { return stmts.filter(Boolean); };\n  var peg$f5 = function(stmt) {\n      return stmt;\n    };\n  var peg$f6 = function() { return null; };\n  var peg$f7 = function(id, label, body) {\n      return { type: 'subgraph', id, label: label || id, body };\n    };\n  var peg$f8 = function(text) { return stripQuotes(text.trim()); };\n  var peg$f9 = function(label) { return stripQuotes(label.trim()); };\n  var peg$f10 = function(head, edge, target, anns, props) {\n      const ann = props ? { ...props[1] } : {};\n      for (const annotation of anns) Object.assign(ann, annotation[2]);\n      return { edge, target, ann };\n    };\n  var peg$f11 = function(head, rest) {\n      let prev = head;\n      for (const { edge, target, ann } of rest) {\n        addEdge(prev.id, target.id, edge.label, edge.style, ann, edge);\n        prev = target;\n      }\n      return { type: 'chain' };\n    };\n  var peg$f12 = function(op, label) { return { ...op, label: label || undefined }; };\n  var peg$f13 = function(text) { return text.trim(); };\n  var peg$f14 = function() { return { style: 'wavy',   bidirectional: true  }; };\n  var peg$f15 = function() { return { style: 'dashed', bidirectional: true  }; };\n  var peg$f16 = function() { return { style: 'dotted', bidirectional: true  }; };\n  var peg$f17 = function() { return { style: 'thick',  bidirectional: true  }; };\n  var peg$f18 = function() { return { style: 'solid',  bidirectional: true  }; };\n  var peg$f19 = function() { return { style: 'wavy'   }; };\n  var peg$f20 = function() { return { style: 'dashed' }; };\n  var peg$f21 = function() { return { style: 'dotted' }; };\n  var peg$f22 = function() { return { style: 'dotted' }; };\n  var peg$f23 = function() { return { style: 'thick'  }; };\n  var peg$f24 = function() { return { style: 'thick'  }; };\n  var peg$f25 = function() { return { style: 'solid'  }; };\n  var peg$f26 = function() { return { style: 'solid'  }; };\n  var peg$f27 = function() { return { style: 'solid', endMarker: 'cross'  }; };\n  var peg$f28 = function() { return { style: 'solid', endMarker: 'circle' }; };\n  var peg$f29 = function() { return { style: 'wavy',   undirected: true }; };\n  var peg$f30 = function() { return { style: 'dashed', undirected: true }; };\n  var peg$f31 = function() { return { style: 'dotted', undirected: true }; };\n  var peg$f32 = function() { return { style: 'thick',  undirected: true }; };\n  var peg$f33 = function() { return { style: 'solid',  undirected: true }; };\n  var peg$f34 = function(value) { return { animation: value }; };\n  var peg$f35 = function(value) { return value; };\n  var peg$f36 = function(value) { return { animation: value }; };\n  var peg$f37 = function(route, walls) { return { routing: route, ...(walls ? walls[1] : {}) }; };\n  var peg$f38 = function(walls) { return walls; };\n  var peg$f39 = function() { return 'straight'; };\n  var peg$f40 = function() { return 'orthogonal'; };\n  var peg$f41 = function() { return 'bezier'; };\n  var peg$f42 = function() { return 'polyline'; };\n  var peg$f43 = function(exit, entry) { return { exitWall: exit, entryWall: entry }; };\n  var peg$f44 = function(exit) { return { exitWall: exit }; };\n  var peg$f45 = function(w) { return w; };\n  var peg$f46 = function(id, shape, c) { return c; };\n  var peg$f47 = function(id, shape, cls) {\n      const registeredId = registerNode(id, shape ? shape.label : null, shape ? shape.shape : null);\n      if (cls) {\n        const node = nodeMap.get(registeredId);\n        if (node) {\n          node.classes = node.classes || [];\n          node.classes.push(cls);\n          if (cls === 'focal') node.status = 'active';\n        }\n      }\n      return { id: registeredId };\n    };\n  var peg$f48 = function(ref, key, value) { return { key, value }; };\n  var peg$f49 = function(ref, anns) {\n      if (anns.length > 0) {\n        const node = nodeMap.get(ref.id);\n        if (node) {\n          for (const ann of anns) {\n            if (ann.key === 'shape')    node.shape = ann.value;\n            if (ann.key === 'icon')     node.iconToken = ann.value;\n          }\n        }\n      }\n      return { type: 'node', ...ref };\n    };\n  var peg$f50 = function(val) { return val; };\n  var peg$f51 = function(id) { return id; };\n  var peg$f52 = function(text) { return { shape: 'circle',           label: stripQuotes(text.trim()) }; };\n  var peg$f53 = function(text) { return { shape: 'stadium',          label: stripQuotes(text.trim()) }; };\n  var peg$f54 = function(text) { return { shape: 'subroutine',       label: stripQuotes(text.trim()) }; };\n  var peg$f55 = function(text) { return { shape: 'cylinder',         label: stripQuotes(text.trim()) }; };\n  var peg$f56 = function(text) { return { shape: 'hexagon',          label: stripQuotes(text.trim()) }; };\n  var peg$f57 = function(text) { return { shape: 'parallelogram',    label: stripQuotes(text.trim()) }; };\n  var peg$f58 = function(text) { return { shape: 'parallelogram-alt',label: stripQuotes(text.trim()) }; };\n  var peg$f59 = function(text) { return { shape: 'asymmetric',       label: stripQuotes(text.trim()) }; };\n  var peg$f60 = function(text) { return { shape: 'rect',             label: stripQuotes(text.trim()) }; };\n  var peg$f61 = function(text) { return { shape: 'diamond',          label: stripQuotes(text.trim()) }; };\n  var peg$f62 = function(text) { return { shape: 'rounded-rect',     label: stripQuotes(text.trim()) }; };\n  var peg$f63 = function(content) { return { type: 'style',    raw: content }; };\n  var peg$f64 = function(content) { return { type: 'class', raw: content }; };\n  var peg$f65 = function(content) { return { type: 'click',    raw: content }; };\n  var peg$f66 = function(kind, text, t) { return t; };\n  var peg$f67 = function(kind, text, target, offset) {\n      const note = { type: kind, text, target, offset: offset || undefined };\n      overlays.push(note);\n      return note;\n    };\n  var peg$f68 = function(dx, dy) { return { dx, dy }; };\n  var peg$f69 = function(sign, digits) { return parseInt((sign || '') + digits, 10); };\n  var peg$f70 = function(corner, t) { return t; };\n  var peg$f71 = function(corner, title, entries) {\n      const legend = { type: 'legend', corner, title: title || undefined, entries };\n      overlays.push(legend);\n      return legend;\n    };\n  var peg$f72 = function(key, value) { return { key: key.trim(), value: value.trim() }; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = peg$parseHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parse_();\n      s5 = peg$parseStatements();\n      s6 = peg$parse_();\n      peg$savedPos = s0;\n      s0 = peg$f0(s1, s3, s5);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s7 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c0) {\n            s7 = peg$c0;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s4 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHeader() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 9) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 9;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c2) {\n        s1 = peg$c2;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseDirection();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDirection() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c3) {\n      s0 = peg$c3;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 2) === peg$c4) {\n        s0 = peg$c4;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c5) {\n          s0 = peg$c5;\n          peg$currPos += 2;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 2) === peg$c6) {\n            s0 = peg$c6;\n            peg$currPos += 2;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c7) {\n              s0 = peg$c7;\n              peg$currPos += 2;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatements() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseStatement();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseBlankLine();\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseStatement();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseBlankLine();\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f4(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseNoteDirective();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseLegendBlock();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseSubgraphBlock();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseEdgeChain();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseNodeDecl();\n            if (s2 === peg$FAILED) {\n              s2 = peg$parseStyleDirective();\n              if (s2 === peg$FAILED) {\n                s2 = peg$parseClassDirective();\n                if (s2 === peg$FAILED) {\n                  s2 = peg$parseClickDirective();\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseComment();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseNL();\n      if (s5 === peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 59) {\n          s5 = peg$c8;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s5 === peg$FAILED) {\n          s5 = peg$currPos;\n          peg$silentFails++;\n          if (input.substr(peg$currPos, 3) === peg$c9) {\n            s6 = peg$c9;\n            peg$currPos += 3;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e10); }\n          }\n          peg$silentFails--;\n          if (s6 !== peg$FAILED) {\n            peg$currPos = s5;\n            s5 = undefined;\n          } else {\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = peg$currPos;\n            peg$silentFails++;\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e11); }\n            }\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          }\n        }\n      }\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f5(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseComment();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseNL();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f6();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c10) {\n      s1 = peg$c10;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSubgraphBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c11) {\n      s1 = peg$c11;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseSubgraphId();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parse_();\n          s5 = peg$parseSubgraphLabel();\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parse_();\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseStatements();\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parse_();\n              if (input.substr(peg$currPos, 3) === peg$c9) {\n                s10 = peg$c9;\n                peg$currPos += 3;\n              } else {\n                s10 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e10); }\n              }\n              if (s10 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f7(s3, s5, s8);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSubgraphId() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSubgraphLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s1 = peg$c12;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r3.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 93) {\n        s3 = peg$c13;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r4.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = input.charAt(peg$currPos);\n          if (peg$r4.test(s3)) {\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e19); }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f9(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeChain() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNodeRef();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      s5 = peg$parseEdgeOp();\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseNodeRef();\n        if (s7 !== peg$FAILED) {\n          s8 = [];\n          s9 = peg$currPos;\n          s10 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 64) {\n            s11 = peg$c14;\n            peg$currPos++;\n          } else {\n            s11 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e20); }\n          }\n          if (s11 !== peg$FAILED) {\n            s12 = peg$parseEdgeAnnotation();\n            if (s12 !== peg$FAILED) {\n              s10 = [s10, s11, s12];\n              s9 = s10;\n            } else {\n              peg$currPos = s9;\n              s9 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s9;\n            s9 = peg$FAILED;\n          }\n          while (s9 !== peg$FAILED) {\n            s8.push(s9);\n            s9 = peg$currPos;\n            s10 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 64) {\n              s11 = peg$c14;\n              peg$currPos++;\n            } else {\n              s11 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e20); }\n            }\n            if (s11 !== peg$FAILED) {\n              s12 = peg$parseEdgeAnnotation();\n              if (s12 !== peg$FAILED) {\n                s10 = [s10, s11, s12];\n                s9 = s10;\n              } else {\n                peg$currPos = s9;\n                s9 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s9;\n              s9 = peg$FAILED;\n            }\n          }\n          s9 = peg$currPos;\n          s10 = peg$parse_();\n          s11 = peg$parseAnimationProperties();\n          if (s11 !== peg$FAILED) {\n            s10 = [s10, s11];\n            s9 = s10;\n          } else {\n            peg$currPos = s9;\n            s9 = peg$FAILED;\n          }\n          if (s9 === peg$FAILED) {\n            s9 = null;\n          }\n          peg$savedPos = s3;\n          s3 = peg$f10(s1, s5, s7, s8, s9);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parse_();\n          s5 = peg$parseEdgeOp();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parse_();\n            s7 = peg$parseNodeRef();\n            if (s7 !== peg$FAILED) {\n              s8 = [];\n              s9 = peg$currPos;\n              s10 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s11 = peg$c14;\n                peg$currPos++;\n              } else {\n                s11 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e20); }\n              }\n              if (s11 !== peg$FAILED) {\n                s12 = peg$parseEdgeAnnotation();\n                if (s12 !== peg$FAILED) {\n                  s10 = [s10, s11, s12];\n                  s9 = s10;\n                } else {\n                  peg$currPos = s9;\n                  s9 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s9;\n                s9 = peg$FAILED;\n              }\n              while (s9 !== peg$FAILED) {\n                s8.push(s9);\n                s9 = peg$currPos;\n                s10 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 64) {\n                  s11 = peg$c14;\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e20); }\n                }\n                if (s11 !== peg$FAILED) {\n                  s12 = peg$parseEdgeAnnotation();\n                  if (s12 !== peg$FAILED) {\n                    s10 = [s10, s11, s12];\n                    s9 = s10;\n                  } else {\n                    peg$currPos = s9;\n                    s9 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s9;\n                  s9 = peg$FAILED;\n                }\n              }\n              s9 = peg$currPos;\n              s10 = peg$parse_();\n              s11 = peg$parseAnimationProperties();\n              if (s11 !== peg$FAILED) {\n                s10 = [s10, s11];\n                s9 = s10;\n              } else {\n                peg$currPos = s9;\n                s9 = peg$FAILED;\n              }\n              if (s9 === peg$FAILED) {\n                s9 = null;\n              }\n              peg$savedPos = s3;\n              s3 = peg$f10(s1, s5, s7, s8, s9);\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f11(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeOp() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseEdgeArrow();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseEdgeLabel();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f12(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 124) {\n      s1 = peg$c15;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r5.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r5.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e22); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 124) {\n          s3 = peg$c15;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f13(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeArrow() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c16) {\n      s1 = peg$c16;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f14();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 5) === peg$c17) {\n        s1 = peg$c17;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e24); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f15();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 5) === peg$c18) {\n          s1 = peg$c18;\n          peg$currPos += 5;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e25); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f16();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 4) === peg$c19) {\n            s1 = peg$c19;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e26); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f17();\n          }\n          s0 = s1;\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.substr(peg$currPos, 4) === peg$c20) {\n              s1 = peg$c20;\n              peg$currPos += 4;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e27); }\n            }\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$f18();\n            }\n            s0 = s1;\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 4) === peg$c21) {\n                s1 = peg$c21;\n                peg$currPos += 4;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e28); }\n              }\n              if (s1 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$f19();\n              }\n              s0 = s1;\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 4) === peg$c22) {\n                  s1 = peg$c22;\n                  peg$currPos += 4;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e29); }\n                }\n                if (s1 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s1 = peg$f20();\n                }\n                s0 = s1;\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.substr(peg$currPos, 5) === peg$c23) {\n                    s1 = peg$c23;\n                    peg$currPos += 5;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e30); }\n                  }\n                  if (s1 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$f21();\n                  }\n                  s0 = s1;\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    if (input.substr(peg$currPos, 4) === peg$c24) {\n                      s1 = peg$c24;\n                      peg$currPos += 4;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n                    }\n                    if (s1 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$f22();\n                    }\n                    s0 = s1;\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      if (input.substr(peg$currPos, 4) === peg$c25) {\n                        s1 = peg$c25;\n                        peg$currPos += 4;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n                      }\n                      if (s1 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s1 = peg$f23();\n                      }\n                      s0 = s1;\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        if (input.substr(peg$currPos, 3) === peg$c26) {\n                          s1 = peg$c26;\n                          peg$currPos += 3;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n                        }\n                        if (s1 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$f24();\n                        }\n                        s0 = s1;\n                        if (s0 === peg$FAILED) {\n                          s0 = peg$currPos;\n                          if (input.substr(peg$currPos, 4) === peg$c27) {\n                            s1 = peg$c27;\n                            peg$currPos += 4;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e34); }\n                          }\n                          if (s1 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s1 = peg$f25();\n                          }\n                          s0 = s1;\n                          if (s0 === peg$FAILED) {\n                            s0 = peg$currPos;\n                            if (input.substr(peg$currPos, 3) === peg$c28) {\n                              s1 = peg$c28;\n                              peg$currPos += 3;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e35); }\n                            }\n                            if (s1 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$f26();\n                            }\n                            s0 = s1;\n                            if (s0 === peg$FAILED) {\n                              s0 = peg$currPos;\n                              if (input.substr(peg$currPos, 3) === peg$c29) {\n                                s1 = peg$c29;\n                                peg$currPos += 3;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e36); }\n                              }\n                              if (s1 !== peg$FAILED) {\n                                peg$savedPos = s0;\n                                s1 = peg$f27();\n                              }\n                              s0 = s1;\n                              if (s0 === peg$FAILED) {\n                                s0 = peg$currPos;\n                                if (input.substr(peg$currPos, 3) === peg$c30) {\n                                  s1 = peg$c30;\n                                  peg$currPos += 3;\n                                } else {\n                                  s1 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e37); }\n                                }\n                                if (s1 !== peg$FAILED) {\n                                  peg$savedPos = s0;\n                                  s1 = peg$f28();\n                                }\n                                s0 = s1;\n                                if (s0 === peg$FAILED) {\n                                  s0 = peg$currPos;\n                                  if (input.substr(peg$currPos, 3) === peg$c31) {\n                                    s1 = peg$c31;\n                                    peg$currPos += 3;\n                                  } else {\n                                    s1 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e38); }\n                                  }\n                                  if (s1 !== peg$FAILED) {\n                                    peg$savedPos = s0;\n                                    s1 = peg$f29();\n                                  }\n                                  s0 = s1;\n                                  if (s0 === peg$FAILED) {\n                                    s0 = peg$currPos;\n                                    if (input.substr(peg$currPos, 3) === peg$c32) {\n                                      s1 = peg$c32;\n                                      peg$currPos += 3;\n                                    } else {\n                                      s1 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n                                    }\n                                    if (s1 !== peg$FAILED) {\n                                      peg$savedPos = s0;\n                                      s1 = peg$f30();\n                                    }\n                                    s0 = s1;\n                                    if (s0 === peg$FAILED) {\n                                      s0 = peg$currPos;\n                                      if (input.substr(peg$currPos, 3) === peg$c33) {\n                                        s1 = peg$c33;\n                                        peg$currPos += 3;\n                                      } else {\n                                        s1 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e40); }\n                                      }\n                                      if (s1 !== peg$FAILED) {\n                                        peg$savedPos = s0;\n                                        s1 = peg$f31();\n                                      }\n                                      s0 = s1;\n                                      if (s0 === peg$FAILED) {\n                                        s0 = peg$currPos;\n                                        if (input.substr(peg$currPos, 3) === peg$c34) {\n                                          s1 = peg$c34;\n                                          peg$currPos += 3;\n                                        } else {\n                                          s1 = peg$FAILED;\n                                          if (peg$silentFails === 0) { peg$fail(peg$e41); }\n                                        }\n                                        if (s1 !== peg$FAILED) {\n                                          peg$savedPos = s0;\n                                          s1 = peg$f32();\n                                        }\n                                        s0 = s1;\n                                        if (s0 === peg$FAILED) {\n                                          s0 = peg$currPos;\n                                          if (input.substr(peg$currPos, 3) === peg$c0) {\n                                            s1 = peg$c0;\n                                            peg$currPos += 3;\n                                          } else {\n                                            s1 = peg$FAILED;\n                                            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                                          }\n                                          if (s1 !== peg$FAILED) {\n                                            peg$savedPos = s0;\n                                            s1 = peg$f33();\n                                          }\n                                          s0 = s1;\n                                        }\n                                      }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeAnnotation() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c35) {\n      s1 = peg$c35;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e42); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseAnimationValue();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f34(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseRouteAnnotation();\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnimationValue() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c36) {\n      s1 = peg$c36;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e43); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 8) === peg$c37) {\n        s1 = peg$c37;\n        peg$currPos += 8;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e44); }\n      }\n      if (s1 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c38) {\n          s1 = peg$c38;\n          peg$currPos += 4;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e45); }\n        }\n        if (s1 === peg$FAILED) {\n          if (input.substr(peg$currPos, 5) === peg$c39) {\n            s1 = peg$c39;\n            peg$currPos += 5;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e46); }\n          }\n          if (s1 === peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c40) {\n              s1 = peg$c40;\n              peg$currPos += 4;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e47); }\n            }\n            if (s1 === peg$FAILED) {\n              if (input.substr(peg$currPos, 5) === peg$c41) {\n                s1 = peg$c41;\n                peg$currPos += 5;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e48); }\n              }\n              if (s1 === peg$FAILED) {\n                if (input.substr(peg$currPos, 6) === peg$c42) {\n                  s1 = peg$c42;\n                  peg$currPos += 6;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e49); }\n                }\n                if (s1 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 4) === peg$c43) {\n                    s1 = peg$c43;\n                    peg$currPos += 4;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e50); }\n                  }\n                  if (s1 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 10) === peg$c44) {\n                      s1 = peg$c44;\n                      peg$currPos += 10;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e51); }\n                    }\n                    if (s1 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 4) === peg$c45) {\n                        s1 = peg$c45;\n                        peg$currPos += 4;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e52); }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = input.charAt(peg$currPos);\n      if (peg$r6.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e53); }\n      }\n      peg$silentFails--;\n      if (s3 === peg$FAILED) {\n        s2 = undefined;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f35(s1);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnimationProperties() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 123) {\n      s1 = peg$c46;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e54); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.substr(peg$currPos, 4) === peg$c47) {\n        s3 = peg$c47;\n        peg$currPos += 4;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e55); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s5 = peg$c48;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e56); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          s7 = peg$parseAnimationValue();\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 125) {\n              s9 = peg$c49;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e57); }\n            }\n            if (s9 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f36(s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRouteAnnotation() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parseRouteWord();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c48;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e56); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseWallPair();\n        if (s4 !== peg$FAILED) {\n          s3 = [s3, s4];\n          s2 = s3;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f37(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWallPair();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f38(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRouteWord() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c50) {\n      s1 = peg$c50;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e58); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f39();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 10) === peg$c51) {\n        s1 = peg$c51;\n        peg$currPos += 10;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e59); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f40();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 6) === peg$c52) {\n          s1 = peg$c52;\n          peg$currPos += 6;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e60); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f41();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 8) === peg$c53) {\n            s1 = peg$c53;\n            peg$currPos += 8;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e61); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f42();\n          }\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWallPair() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseWall();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseWall();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f43(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWall();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f44(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseWall() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = input.charAt(peg$currPos);\n    if (peg$r7.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e62); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f45(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNodeRef() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNodeId();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parseShape();\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$currPos;\n      if (input.substr(peg$currPos, 3) === peg$c54) {\n        s5 = peg$c54;\n        peg$currPos += 3;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e63); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$currPos;\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r6.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e53); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r6.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e53); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = input.substring(s6, peg$currPos);\n        } else {\n          s6 = s7;\n        }\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s4;\n          s4 = peg$f46(s1, s3, s6);\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f47(s1, s3, s4);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNodeRef();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 64) {\n        s5 = peg$c14;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$currPos;\n        s7 = peg$currPos;\n        s8 = input.charAt(peg$currPos);\n        if (peg$r8.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e64); }\n        }\n        if (s8 !== peg$FAILED) {\n          s9 = [];\n          s10 = input.charAt(peg$currPos);\n          if (peg$r9.test(s10)) {\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e65); }\n          }\n          while (s10 !== peg$FAILED) {\n            s9.push(s10);\n            s10 = input.charAt(peg$currPos);\n            if (peg$r9.test(s10)) {\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e65); }\n            }\n          }\n          s8 = [s8, s9];\n          s7 = s8;\n        } else {\n          peg$currPos = s7;\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = input.substring(s6, peg$currPos);\n        } else {\n          s6 = s7;\n        }\n        if (s6 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s7 = peg$c48;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e56); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseAnnotationValue();\n            if (s8 !== peg$FAILED) {\n              peg$savedPos = s3;\n              s3 = peg$f48(s1, s6, s8);\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$currPos;\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 64) {\n          s5 = peg$c14;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e20); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = peg$currPos;\n          s8 = input.charAt(peg$currPos);\n          if (peg$r8.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e64); }\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = [];\n            s10 = input.charAt(peg$currPos);\n            if (peg$r9.test(s10)) {\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e65); }\n            }\n            while (s10 !== peg$FAILED) {\n              s9.push(s10);\n              s10 = input.charAt(peg$currPos);\n              if (peg$r9.test(s10)) {\n                peg$currPos++;\n              } else {\n                s10 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e65); }\n              }\n            }\n            s8 = [s8, s9];\n            s7 = s8;\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            s6 = input.substring(s6, peg$currPos);\n          } else {\n            s6 = s7;\n          }\n          if (s6 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 58) {\n              s7 = peg$c48;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e56); }\n            }\n            if (s7 !== peg$FAILED) {\n              s8 = peg$parseAnnotationValue();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s3;\n                s3 = peg$f48(s1, s6, s8);\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      s3 = peg$currPos;\n      peg$silentFails++;\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      s6 = peg$parseEdgeArrow();\n      if (s6 !== peg$FAILED) {\n        s5 = [s5, s6];\n        s4 = s5;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s4 === peg$FAILED) {\n        s3 = undefined;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f49(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnnotationValue() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c55;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e66); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r10.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e67); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r10.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e67); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c55;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e66); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f50(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = input.charAt(peg$currPos);\n      if (peg$r11.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e68); }\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = input.charAt(peg$currPos);\n          if (peg$r11.test(s2)) {\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e68); }\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeId() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c9) {\n      s3 = peg$c9;\n      peg$currPos += 3;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      peg$silentFails++;\n      s5 = input.charAt(peg$currPos);\n      if (peg$r2.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      peg$silentFails--;\n      if (s5 === peg$FAILED) {\n        s4 = undefined;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$currPos;\n      if (input.substr(peg$currPos, 8) === peg$c11) {\n        s4 = peg$c11;\n        peg$currPos += 8;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = input.charAt(peg$currPos);\n        if (peg$r2.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s3 === peg$FAILED) {\n        s2 = undefined;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = peg$currPos;\n        s5 = input.charAt(peg$currPos);\n        if (peg$r1.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r2.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = input.charAt(peg$currPos);\n            if (peg$r2.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e15); }\n            }\n          }\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f51(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseShape() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c56) {\n      s1 = peg$c56;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e69); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r12.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e70); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r12.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e70); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c57) {\n          s3 = peg$c57;\n          peg$currPos += 2;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e71); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f52(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c58) {\n        s1 = peg$c58;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e72); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r3.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e17); }\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        if (input.substr(peg$currPos, 2) === peg$c59) {\n          s3 = peg$c59;\n          peg$currPos += 2;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e73); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f53(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 2) === peg$c60) {\n          s1 = peg$c60;\n          peg$currPos += 2;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e74); }\n        }\n        if (s1 !== peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = [];\n          s4 = input.charAt(peg$currPos);\n          if (peg$r3.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e17); }\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = input.charAt(peg$currPos);\n            if (peg$r3.test(s4)) {\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e17); }\n            }\n          }\n          s2 = input.substring(s2, peg$currPos);\n          if (input.substr(peg$currPos, 2) === peg$c61) {\n            s3 = peg$c61;\n            peg$currPos += 2;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e75); }\n          }\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f54(s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 2) === peg$c62) {\n            s1 = peg$c62;\n            peg$currPos += 2;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e76); }\n          }\n          if (s1 !== peg$FAILED) {\n            s2 = peg$currPos;\n            s3 = [];\n            s4 = input.charAt(peg$currPos);\n            if (peg$r12.test(s4)) {\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e70); }\n            }\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = input.charAt(peg$currPos);\n              if (peg$r12.test(s4)) {\n                peg$currPos++;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e70); }\n              }\n            }\n            s2 = input.substring(s2, peg$currPos);\n            if (input.substr(peg$currPos, 2) === peg$c63) {\n              s3 = peg$c63;\n              peg$currPos += 2;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e77); }\n            }\n            if (s3 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f55(s2);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.substr(peg$currPos, 2) === peg$c64) {\n              s1 = peg$c64;\n              peg$currPos += 2;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e78); }\n            }\n            if (s1 !== peg$FAILED) {\n              s2 = peg$currPos;\n              s3 = [];\n              s4 = input.charAt(peg$currPos);\n              if (peg$r13.test(s4)) {\n                peg$currPos++;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e79); }\n              }\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                s4 = input.charAt(peg$currPos);\n                if (peg$r13.test(s4)) {\n                  peg$currPos++;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e79); }\n                }\n              }\n              s2 = input.substring(s2, peg$currPos);\n              if (input.substr(peg$currPos, 2) === peg$c65) {\n                s3 = peg$c65;\n                peg$currPos += 2;\n              } else {\n                s3 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e80); }\n              }\n              if (s3 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f56(s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 2) === peg$c66) {\n                s1 = peg$c66;\n                peg$currPos += 2;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e81); }\n              }\n              if (s1 !== peg$FAILED) {\n                s2 = peg$currPos;\n                s3 = [];\n                s4 = input.charAt(peg$currPos);\n                if (peg$r14.test(s4)) {\n                  peg$currPos++;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e82); }\n                }\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  s4 = input.charAt(peg$currPos);\n                  if (peg$r14.test(s4)) {\n                    peg$currPos++;\n                  } else {\n                    s4 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e82); }\n                  }\n                }\n                s2 = input.substring(s2, peg$currPos);\n                if (input.substr(peg$currPos, 2) === peg$c67) {\n                  s3 = peg$c67;\n                  peg$currPos += 2;\n                } else {\n                  s3 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e83); }\n                }\n                if (s3 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f57(s2);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 2) === peg$c68) {\n                  s1 = peg$c68;\n                  peg$currPos += 2;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e84); }\n                }\n                if (s1 !== peg$FAILED) {\n                  s2 = peg$currPos;\n                  s3 = [];\n                  s4 = input.charAt(peg$currPos);\n                  if (peg$r15.test(s4)) {\n                    peg$currPos++;\n                  } else {\n                    s4 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e85); }\n                  }\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    s4 = input.charAt(peg$currPos);\n                    if (peg$r15.test(s4)) {\n                      peg$currPos++;\n                    } else {\n                      s4 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e85); }\n                    }\n                  }\n                  s2 = input.substring(s2, peg$currPos);\n                  if (input.substr(peg$currPos, 2) === peg$c69) {\n                    s3 = peg$c69;\n                    peg$currPos += 2;\n                  } else {\n                    s3 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e86); }\n                  }\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f58(s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.charCodeAt(peg$currPos) === 62) {\n                    s1 = peg$c70;\n                    peg$currPos++;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e87); }\n                  }\n                  if (s1 !== peg$FAILED) {\n                    s2 = peg$currPos;\n                    s3 = [];\n                    s4 = input.charAt(peg$currPos);\n                    if (peg$r3.test(s4)) {\n                      peg$currPos++;\n                    } else {\n                      s4 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                    }\n                    while (s4 !== peg$FAILED) {\n                      s3.push(s4);\n                      s4 = input.charAt(peg$currPos);\n                      if (peg$r3.test(s4)) {\n                        peg$currPos++;\n                      } else {\n                        s4 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                      }\n                    }\n                    s2 = input.substring(s2, peg$currPos);\n                    if (input.charCodeAt(peg$currPos) === 93) {\n                      s3 = peg$c13;\n                      peg$currPos++;\n                    } else {\n                      s3 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                    }\n                    if (s3 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f59(s2);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    if (input.charCodeAt(peg$currPos) === 91) {\n                      s1 = peg$c12;\n                      peg$currPos++;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                    }\n                    if (s1 !== peg$FAILED) {\n                      s2 = peg$currPos;\n                      s3 = [];\n                      s4 = input.charAt(peg$currPos);\n                      if (peg$r3.test(s4)) {\n                        peg$currPos++;\n                      } else {\n                        s4 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                      }\n                      while (s4 !== peg$FAILED) {\n                        s3.push(s4);\n                        s4 = input.charAt(peg$currPos);\n                        if (peg$r3.test(s4)) {\n                          peg$currPos++;\n                        } else {\n                          s4 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                        }\n                      }\n                      s2 = input.substring(s2, peg$currPos);\n                      if (input.charCodeAt(peg$currPos) === 93) {\n                        s3 = peg$c13;\n                        peg$currPos++;\n                      } else {\n                        s3 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                      }\n                      if (s3 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s0 = peg$f60(s2);\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      if (input.charCodeAt(peg$currPos) === 123) {\n                        s1 = peg$c46;\n                        peg$currPos++;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e54); }\n                      }\n                      if (s1 !== peg$FAILED) {\n                        s2 = peg$currPos;\n                        s3 = [];\n                        s4 = input.charAt(peg$currPos);\n                        if (peg$r13.test(s4)) {\n                          peg$currPos++;\n                        } else {\n                          s4 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e79); }\n                        }\n                        while (s4 !== peg$FAILED) {\n                          s3.push(s4);\n                          s4 = input.charAt(peg$currPos);\n                          if (peg$r13.test(s4)) {\n                            peg$currPos++;\n                          } else {\n                            s4 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e79); }\n                          }\n                        }\n                        s2 = input.substring(s2, peg$currPos);\n                        if (input.charCodeAt(peg$currPos) === 125) {\n                          s3 = peg$c49;\n                          peg$currPos++;\n                        } else {\n                          s3 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e57); }\n                        }\n                        if (s3 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s0 = peg$f61(s2);\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        if (input.charCodeAt(peg$currPos) === 40) {\n                          s1 = peg$c71;\n                          peg$currPos++;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e88); }\n                        }\n                        if (s1 !== peg$FAILED) {\n                          s2 = peg$currPos;\n                          s3 = [];\n                          s4 = input.charAt(peg$currPos);\n                          if (peg$r12.test(s4)) {\n                            peg$currPos++;\n                          } else {\n                            s4 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e70); }\n                          }\n                          while (s4 !== peg$FAILED) {\n                            s3.push(s4);\n                            s4 = input.charAt(peg$currPos);\n                            if (peg$r12.test(s4)) {\n                              peg$currPos++;\n                            } else {\n                              s4 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e70); }\n                            }\n                          }\n                          s2 = input.substring(s2, peg$currPos);\n                          if (input.charCodeAt(peg$currPos) === 41) {\n                            s3 = peg$c72;\n                            peg$currPos++;\n                          } else {\n                            s3 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e89); }\n                          }\n                          if (s3 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s0 = peg$f62(s2);\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStyleDirective() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c73) {\n      s1 = peg$c73;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e90); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = input.charAt(peg$currPos);\n        if (peg$r16.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e91); }\n        }\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = input.charAt(peg$currPos);\n            if (peg$r16.test(s5)) {\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e91); }\n            }\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f63(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseClassDirective() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c74) {\n      s1 = peg$c74;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e92); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c75) {\n        s1 = peg$c75;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e93); }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = input.charAt(peg$currPos);\n        if (peg$r16.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e91); }\n        }\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = input.charAt(peg$currPos);\n            if (peg$r16.test(s5)) {\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e91); }\n            }\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f64(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseClickDirective() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c76) {\n      s1 = peg$c76;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e94); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = input.charAt(peg$currPos);\n        if (peg$r16.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e91); }\n        }\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = input.charAt(peg$currPos);\n            if (peg$r16.test(s5)) {\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e91); }\n            }\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f65(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteDirective() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c77) {\n      s1 = peg$c77;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e95); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 7) === peg$c78) {\n        s1 = peg$c78;\n        peg$currPos += 7;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e96); }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 34) {\n          s3 = peg$c55;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e66); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = peg$currPos;\n          s5 = [];\n          s6 = input.charAt(peg$currPos);\n          if (peg$r10.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e67); }\n          }\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r10.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e67); }\n            }\n          }\n          s4 = input.substring(s4, peg$currPos);\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s5 = peg$c55;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e66); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parse__();\n            if (s6 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 2) === peg$c79) {\n                s7 = peg$c79;\n                peg$currPos += 2;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e97); }\n              }\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parse__();\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$currPos;\n                  if (input.charCodeAt(peg$currPos) === 34) {\n                    s10 = peg$c55;\n                    peg$currPos++;\n                  } else {\n                    s10 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e66); }\n                  }\n                  if (s10 !== peg$FAILED) {\n                    s11 = peg$currPos;\n                    s12 = [];\n                    s13 = input.charAt(peg$currPos);\n                    if (peg$r10.test(s13)) {\n                      peg$currPos++;\n                    } else {\n                      s13 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e67); }\n                    }\n                    while (s13 !== peg$FAILED) {\n                      s12.push(s13);\n                      s13 = input.charAt(peg$currPos);\n                      if (peg$r10.test(s13)) {\n                        peg$currPos++;\n                      } else {\n                        s13 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e67); }\n                      }\n                    }\n                    s11 = input.substring(s11, peg$currPos);\n                    if (input.charCodeAt(peg$currPos) === 34) {\n                      s12 = peg$c55;\n                      peg$currPos++;\n                    } else {\n                      s12 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e66); }\n                    }\n                    if (s12 !== peg$FAILED) {\n                      peg$savedPos = s9;\n                      s9 = peg$f66(s1, s4, s11);\n                    } else {\n                      peg$currPos = s9;\n                      s9 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s9;\n                    s9 = peg$FAILED;\n                  }\n                  if (s9 === peg$FAILED) {\n                    s9 = peg$currPos;\n                    s10 = peg$currPos;\n                    s11 = input.charAt(peg$currPos);\n                    if (peg$r1.test(s11)) {\n                      peg$currPos++;\n                    } else {\n                      s11 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n                    }\n                    if (s11 !== peg$FAILED) {\n                      s12 = [];\n                      s13 = input.charAt(peg$currPos);\n                      if (peg$r2.test(s13)) {\n                        peg$currPos++;\n                      } else {\n                        s13 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                      }\n                      while (s13 !== peg$FAILED) {\n                        s12.push(s13);\n                        s13 = input.charAt(peg$currPos);\n                        if (peg$r2.test(s13)) {\n                          peg$currPos++;\n                        } else {\n                          s13 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                        }\n                      }\n                      s11 = [s11, s12];\n                      s10 = s11;\n                    } else {\n                      peg$currPos = s10;\n                      s10 = peg$FAILED;\n                    }\n                    if (s10 !== peg$FAILED) {\n                      s9 = input.substring(s9, peg$currPos);\n                    } else {\n                      s9 = s10;\n                    }\n                  }\n                  if (s9 !== peg$FAILED) {\n                    s10 = peg$parseNoteOffset();\n                    if (s10 === peg$FAILED) {\n                      s10 = null;\n                    }\n                    peg$savedPos = s0;\n                    s0 = peg$f67(s1, s4, s9, s10);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteOffset() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parse__();\n    if (s1 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c80) {\n        s2 = peg$c80;\n        peg$currPos += 6;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e98); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseSignedInt();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s6 = peg$c81;\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e99); }\n            }\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse_();\n              s8 = peg$parseSignedInt();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f68(s4, s8);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSignedInt() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s1 = peg$c82;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e100); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r17.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e101); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r17.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e101); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f69(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 6) === peg$c83) {\n      s1 = peg$c83;\n      peg$currPos += 6;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e102); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse__();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseLegendCorner();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$currPos;\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s6 = peg$c55;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e66); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$currPos;\n            s8 = [];\n            s9 = input.charAt(peg$currPos);\n            if (peg$r10.test(s9)) {\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e67); }\n            }\n            while (s9 !== peg$FAILED) {\n              s8.push(s9);\n              s9 = input.charAt(peg$currPos);\n              if (peg$r10.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e67); }\n              }\n            }\n            s7 = input.substring(s7, peg$currPos);\n            if (input.charCodeAt(peg$currPos) === 34) {\n              s8 = peg$c55;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e66); }\n            }\n            if (s8 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f70(s3, s7);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          if (s4 === peg$FAILED) {\n            s4 = null;\n          }\n          s5 = peg$parse_();\n          s6 = peg$parseNL();\n          if (s6 !== peg$FAILED) {\n            s7 = [];\n            s8 = peg$parseLegendEntryLine();\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = peg$parseLegendEntryLine();\n            }\n            s8 = peg$parse_();\n            if (input.substr(peg$currPos, 3) === peg$c9) {\n              s9 = peg$c9;\n              peg$currPos += 3;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n            if (s9 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f71(s3, s4, s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendCorner() {\n    var s0;\n\n    if (input.substr(peg$currPos, 12) === peg$c84) {\n      s0 = peg$c84;\n      peg$currPos += 12;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e103); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 11) === peg$c85) {\n        s0 = peg$c85;\n        peg$currPos += 11;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e104); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 9) === peg$c86) {\n          s0 = peg$c86;\n          peg$currPos += 9;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e105); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 8) === peg$c87) {\n            s0 = peg$c87;\n            peg$currPos += 8;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e106); }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendEntryLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    s3 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c9) {\n      s4 = peg$c9;\n      peg$currPos += 3;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = input.charAt(peg$currPos);\n      if (peg$r2.test(s6)) {\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s3;\n      s3 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r18.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e107); }\n      }\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = input.charAt(peg$currPos);\n          if (peg$r18.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e107); }\n          }\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = input.substring(s3, peg$currPos);\n      } else {\n        s3 = s4;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s4 = peg$c48;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e56); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseNL();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f72(s3, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r19.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e109); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r19.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e109); }\n      }\n    }\n    peg$silentFails--;\n    s1 = peg$FAILED;\n    if (peg$silentFails === 0) { peg$fail(peg$e108); }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r19.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e109); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r19.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e109); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e110); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1;\n\n    peg$silentFails++;\n    if (input.substr(peg$currPos, 2) === peg$c88) {\n      s0 = peg$c88;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e112); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.charAt(peg$currPos);\n      if (peg$r20.test(s0)) {\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e113); }\n      }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e111); }\n    }\n\n    return s0;\n  }\n\n\n  reset();\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult, LayoutOptions } from '../../../contracts/index.js';\nimport type { FlowDocument, FlowNode } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { parseIconRef } from '../../../icons/resolver.js';\nimport { layoutFlowchart } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type {\n  FlowDocument,\n  FlowNode,\n  FlowEdge,\n  FlowSubgraph,\n  FlowDirection,\n  NodeShape,\n  NodeStatus,\n  EdgeStyle,\n  EdgeEndMarker,\n} from './ir.js';\n\nexport const flowchart: DiagramModule<FlowDocument> = {\n  parseMermaid(input: string): FlowDocument {\n    const raw = parser.parse(input) as any;\n    const nodes: FlowNode[] = (raw.flow.nodes as any[]).map((n: any): FlowNode => {\n      const base: FlowNode = {\n        id: n.id,\n        label: n.label,\n        shape: n.shape || 'rect',\n        status: n.status || 'default',\n        ...(n.subgraph !== undefined ? { subgraph: n.subgraph as string } : {}),\n      };\n      if (n.iconToken !== undefined) {\n        const result = parseIconRef(String(n.iconToken));\n        if (!result.ok) {\n          throw new Error(\n            `Flowchart parse error: invalid @icon value \"${n.iconToken}\": ${result.error.message}`,\n          );\n        }\n        return { ...base, icon: result.value };\n      }\n      return base;\n    });\n    return {\n      version: raw.version,\n      metadata: raw.metadata ?? {},\n      direction: raw.direction,\n      nodes,\n      edges: raw.flow.edges,\n      subgraphs: raw.subgraphs ?? [],\n      overlays: raw.overlays?.length > 0 ? raw.overlays : undefined,\n    };\n  },\n\n  parseYaml(input: string): FlowDocument {\n    // TODO: replace with schema validation\n    return JSON.parse(input) as FlowDocument;\n  },\n\n  layout(ir: FlowDocument, theme: ResolvedTheme, options?: LayoutOptions): LayoutResult {\n    return layoutFlowchart(ir, theme, options);\n  },\n};\n", "/**\n * @file time/dates.ts \u2014 Deterministic date arithmetic.\n *\n * General utility for any time-based diagram (timeline, gantt, roadmap).\n * All functions are pure: no system clock, no locale. The day-ordinal\n * representation (integer days since 2000-01-01 = day 0) underpins every\n * time\u2192coordinate calculation.\n *\n * Ported from packages/core/src/layout/dates.ts.\n */\n\n/** An IR date string: \"2026\", \"2026-06\", \"2026-06-09\", \"2026-Q2\", \"2026-H1\". */\nexport type IRDate = string;\n\n/** Axis granularity. */\nexport type AxisUnit = 'day' | 'week' | 'month' | 'quarter' | 'half' | 'year';\n\nexport type DatePrecision = 'day' | 'month' | 'year' | 'quarter' | 'half';\n\nexport interface ParsedDate {\n  precision: DatePrecision;\n  year: number;\n  /** 1-12; present for precision month/day */\n  month?: number;\n  /** 1-31; present for precision day */\n  day?: number;\n  /** 1-4; present for precision quarter */\n  quarter?: number;\n  /** 1-2; present for precision half */\n  half?: number;\n}\n\n// \u2500\u2500\u2500 Calendar helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function isLeapYear(year: number): boolean {\n  return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n}\n\nexport function daysInMonth(year: number, month: number): number {\n  const table = [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n  return table[month - 1] ?? 30;\n}\n\nfunction daysInYear(year: number): number {\n  return isLeapYear(year) ? 366 : 365;\n}\n\n// \u2500\u2500\u2500 Day ordinal (days since 2000-01-01 = 0) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function dateToOrdinal(year: number, month: number, day: number): number {\n  let ord = 0;\n  if (year >= 2000) {\n    for (let y = 2000; y < year; y++) ord += daysInYear(y);\n  } else {\n    for (let y = year; y < 2000; y++) ord -= daysInYear(y);\n  }\n  for (let m = 1; m < month; m++) ord += daysInMonth(year, m);\n  ord += day - 1;\n  return ord;\n}\n\nexport function ordinalToDate(ord: number): [number, number, number] {\n  let year = 2000;\n  let remaining = ord;\n  if (remaining >= 0) {\n    while (remaining >= daysInYear(year)) {\n      remaining -= daysInYear(year);\n      year += 1;\n    }\n  } else {\n    while (remaining < 0) {\n      year -= 1;\n      remaining += daysInYear(year);\n    }\n  }\n  let month = 1;\n  while (month <= 12 && remaining >= daysInMonth(year, month)) {\n    remaining -= daysInMonth(year, month);\n    month += 1;\n  }\n  return [year, month, remaining + 1];\n}\n\n// \u2500\u2500\u2500 IRDate parsing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Parse an IRDate into a structured form.\n * Supports: ISO day (2026-06-09), ISO month (2026-06), year (2026),\n * quarter (2026-Q2), half (2026-H1).\n */\nexport function parseIRDate(s: IRDate): ParsedDate {\n  const dayM = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\n  if (dayM) return { precision: 'day', year: +dayM[1]!, month: +dayM[2]!, day: +dayM[3]! };\n\n  const monthM = /^(\\d{4})-(\\d{2})$/.exec(s);\n  if (monthM) return { precision: 'month', year: +monthM[1]!, month: +monthM[2]! };\n\n  const quarterM = /^(\\d{4})-Q([1-4])$/.exec(s);\n  if (quarterM) return { precision: 'quarter', year: +quarterM[1]!, quarter: +quarterM[2]! };\n\n  const halfM = /^(\\d{4})-H([12])$/.exec(s);\n  if (halfM) return { precision: 'half', year: +halfM[1]!, half: +halfM[2]! };\n\n  const yearM = /^(\\d{4})$/.exec(s);\n  if (yearM) return { precision: 'year', year: +yearM[1]! };\n\n  throw new Error(`Unsupported IRDate format: \"${s}\"`);\n}\n\n// \u2500\u2500\u2500 Date coercion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Coerce a parsed date to its period-start day (left-edge rule). */\nexport function coerceLeft(parsed: ParsedDate): [number, number, number] {\n  switch (parsed.precision) {\n    case 'day':\n      return [parsed.year, parsed.month!, parsed.day!];\n    case 'month':\n      return [parsed.year, parsed.month!, 1];\n    case 'year':\n      return [parsed.year, 1, 1];\n    case 'quarter':\n      return [parsed.year, (parsed.quarter! - 1) * 3 + 1, 1];\n    case 'half':\n      return [parsed.year, parsed.half! === 1 ? 1 : 7, 1];\n  }\n}\n\n/** Coerce a parsed date to its period-end day (right-edge rule). */\nexport function coerceRight(parsed: ParsedDate): [number, number, number] {\n  switch (parsed.precision) {\n    case 'day':\n      return [parsed.year, parsed.month!, parsed.day!];\n    case 'month':\n      return [parsed.year, parsed.month!, daysInMonth(parsed.year, parsed.month!)];\n    case 'year':\n      return [parsed.year, 12, 31];\n    case 'quarter': {\n      const lastMonth = parsed.quarter! * 3;\n      return [parsed.year, lastMonth, daysInMonth(parsed.year, lastMonth)];\n    }\n    case 'half': {\n      const lastMonth = parsed.half! === 1 ? 6 : 12;\n      return [parsed.year, lastMonth, daysInMonth(parsed.year, lastMonth)];\n    }\n  }\n}\n\n/** Parse an IRDate and coerce it to its period-start ordinal. */\nexport function parseAndCoerceLeft(s: IRDate): number {\n  const [y, m, d] = coerceLeft(parseIRDate(s));\n  return dateToOrdinal(y, m, d);\n}\n\n/** Parse an IRDate and coerce it to its period-end ordinal. */\nexport function parseAndCoerceRight(s: IRDate): number {\n  const [y, m, d] = coerceRight(parseIRDate(s));\n  return dateToOrdinal(y, m, d);\n}\n\n// \u2500\u2500\u2500 Axis unit inference \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Infer the axis unit from the span in days (first-match rule). */\nexport function inferAxisUnit(spanDays: number): AxisUnit {\n  if (spanDays <= 14) return 'day';\n  if (spanDays <= 91) return 'week';\n  if (spanDays <= 548) return 'month';\n  if (spanDays <= 1461) return 'quarter';\n  if (spanDays <= 2922) return 'half';\n  return 'year';\n}\n\n// \u2500\u2500\u2500 Tick enumeration \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface TickDate {\n  year: number;\n  month: number;\n  day: number;\n  ordinal: number;\n}\n\n/** Advance a (year, month, day) by one axis-unit period; returns next period start. */\nfunction advancePeriod(\n  year: number,\n  month: number,\n  day: number,\n  unit: AxisUnit,\n): [number, number, number] {\n  switch (unit) {\n    case 'day':\n      return ordinalToDate(dateToOrdinal(year, month, day) + 1);\n    case 'week':\n      return ordinalToDate(dateToOrdinal(year, month, day) + 7);\n    case 'month': {\n      let m = month + 1,\n        y = year;\n      if (m > 12) {\n        m = 1;\n        y += 1;\n      }\n      return [y, m, 1];\n    }\n    case 'quarter': {\n      let m = month + 3,\n        y = year;\n      if (m > 12) {\n        m = m - 12;\n        y += 1;\n      }\n      return [y, m, 1];\n    }\n    case 'half': {\n      let m = month + 6,\n        y = year;\n      if (m > 12) {\n        m = m - 12;\n        y += 1;\n      }\n      return [y, m, 1];\n    }\n    case 'year':\n      return [year + 1, 1, 1];\n  }\n}\n\n/** Snap a date to the start of its containing axis-unit period. */\nfunction snapToPeriodStart(\n  year: number,\n  month: number,\n  _day: number,\n  unit: AxisUnit,\n): [number, number, number] {\n  switch (unit) {\n    case 'day':\n      return [year, month, _day];\n    case 'week': {\n      const o = dateToOrdinal(year, month, _day);\n      const jsEpoch = 946684800000; // 2000-01-01 UTC ms\n      const ms = jsEpoch + o * 86400000;\n      const jsDay = new Date(ms).getUTCDay(); // 0=Sun..6=Sat\n      const daysToMonday = jsDay === 0 ? 6 : jsDay - 1;\n      return ordinalToDate(o - daysToMonday);\n    }\n    case 'month':\n      return [year, month, 1];\n    case 'quarter': {\n      const q = Math.floor((month - 1) / 3);\n      return [year, q * 3 + 1, 1];\n    }\n    case 'half':\n      return [year, month <= 6 ? 1 : 7, 1];\n    case 'year':\n      return [year, 1, 1];\n  }\n}\n\n/** Enumerate all period-start tick dates within [tsOrd, teOrd] (inclusive). */\nexport function enumTicks(tsOrd: number, teOrd: number, unit: AxisUnit): TickDate[] {\n  const ticks: TickDate[] = [];\n  const [sy, sm, sd] = ordinalToDate(tsOrd);\n  let [cy, cm, cd] = snapToPeriodStart(sy, sm, sd, unit);\n  let curOrd = dateToOrdinal(cy, cm, cd);\n\n  if (curOrd < tsOrd) {\n    [cy, cm, cd] = advancePeriod(cy, cm, cd, unit);\n    curOrd = dateToOrdinal(cy, cm, cd);\n  }\n\n  let safety = 0;\n  while (curOrd <= teOrd && safety < 2000) {\n    ticks.push({ year: cy, month: cm, day: cd, ordinal: curOrd });\n    [cy, cm, cd] = advancePeriod(cy, cm, cd, unit);\n    curOrd = dateToOrdinal(cy, cm, cd);\n    safety += 1;\n  }\n  return ticks;\n}\n\n// \u2500\u2500\u2500 Date label formatting \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst MONTH_ABBR = [\n  'Jan',\n  'Feb',\n  'Mar',\n  'Apr',\n  'May',\n  'Jun',\n  'Jul',\n  'Aug',\n  'Sep',\n  'Oct',\n  'Nov',\n  'Dec',\n];\nconst MONTH_FULL = [\n  'January',\n  'February',\n  'March',\n  'April',\n  'May',\n  'June',\n  'July',\n  'August',\n  'September',\n  'October',\n  'November',\n  'December',\n];\n\nfunction ordinalSuffix(n: number): string {\n  const abs = Math.abs(n);\n  const mod100 = abs % 100;\n  if (mod100 >= 11 && mod100 <= 13) return `${n}th`;\n  switch (abs % 10) {\n    case 1:\n      return `${n}st`;\n    case 2:\n      return `${n}nd`;\n    case 3:\n      return `${n}rd`;\n    default:\n      return `${n}th`;\n  }\n}\n\n/** Format an axis tick label according to the axis unit. */\nexport function formatTickLabel(tick: TickDate, unit: AxisUnit, tickIndex: number): string {\n  switch (unit) {\n    case 'day':\n      if (tickIndex % 7 === 0) return MONTH_ABBR[tick.month - 1] ?? '';\n      return String(tick.day);\n    case 'week':\n      if (tickIndex % 4 === 0) return MONTH_ABBR[tick.month - 1] ?? '';\n      return String(tick.day);\n    case 'month':\n      if (tick.month === 1 || tickIndex === 0) return String(tick.year);\n      return MONTH_ABBR[tick.month - 1] ?? '';\n    case 'quarter': {\n      const q = Math.ceil(tick.month / 3);\n      if (q === 1 || tickIndex === 0) return `Q${q} ${tick.year}`;\n      return `Q${q}`;\n    }\n    case 'half': {\n      const h = tick.month <= 6 ? 1 : 2;\n      if (h === 1 || tickIndex === 0) return `H${h} ${tick.year}`;\n      return `H${h}`;\n    }\n    case 'year':\n      return String(tick.year);\n  }\n}\n\n/** Format a concrete day date as the milestone label style: \"15th May 2021\". */\nexport function formatMilestoneDate(year: number, month: number, day: number): string {\n  return `${ordinalSuffix(day)} ${MONTH_FULL[month - 1] ?? ''} ${year}`;\n}\n\n// \u2500\u2500\u2500 Entry-date convenience helpers (shared by timeline layouts) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Day-ordinal of a date's period START (e.g. \"2026-Q2\" \u2192 1 Apr 2026). 0 on parse error. */\nexport function startOrdinal(date: IRDate): number {\n  try {\n    const [y, m, d] = coerceLeft(parseIRDate(date));\n    return dateToOrdinal(y, m, d);\n  } catch {\n    return 0;\n  }\n}\n\n/** Day-ordinal of a date's period END (e.g. \"2026-Q2\" \u2192 1 Jul 2026). 0 on parse error. */\nexport function endOrdinal(date: IRDate): number {\n  try {\n    const [y, m, d] = coerceRight(parseIRDate(date));\n    return dateToOrdinal(y, m, d);\n  } catch {\n    return 0;\n  }\n}\n\n/** Label style for {@link formatDate}. 'axis' shows \"Jun 9\" for days; 'full' shows \"9th June 2026\". */\nexport type DateLabelStyle = 'axis' | 'full';\n\n/**\n * Precision-aware human label for an IR date. Consolidates the per-layout\n * formatters: months \u2192 \"Jun 2026\", quarters \u2192 \"Q2 2026\", halves \u2192 \"H1 2026\",\n * years \u2192 \"2026\"; days depend on {@link DateLabelStyle}.\n */\nexport function formatDate(date: IRDate, style: DateLabelStyle = 'axis'): string {\n  try {\n    const p = parseIRDate(date);\n    switch (p.precision) {\n      case 'day':\n        return style === 'full'\n          ? formatMilestoneDate(p.year, p.month ?? 1, p.day ?? 1)\n          : `${MONTH_ABBR[(p.month ?? 1) - 1] ?? ''} ${p.day ?? 1}`;\n      case 'month':\n        return `${MONTH_ABBR[(p.month ?? 1) - 1] ?? ''} ${p.year}`;\n      case 'quarter':\n        return `Q${p.quarter ?? ''} ${p.year}`;\n      case 'half':\n        return `H${p.half ?? ''} ${p.year}`;\n      case 'year':\n        return String(p.year);\n    }\n  } catch {\n    /* fall through to raw */\n  }\n  return date;\n}\n", "/**\n * @file palette/categorical.ts \u2014 Shared categorical hue cycle.\n *\n * A fixed, deterministic sequence of visually-separable hues for diagrams that\n * colour items by index rather than by semantic status (narrative spines,\n * section bands, pie/chart slices). Index wraps with modulo so any count works.\n *\n * This is intentionally NOT a theme token: it is decorative, diagram-driven\n * colour, independent of the active theme's semantic palette.\n */\n\nimport type { ResolvedTheme } from '../contracts/theme.js';\n\n/** Eight distinct hues, ordered for maximum adjacent contrast. */\nexport const CATEGORICAL_HUES: readonly string[] = [\n  '#7C3AED',\n  '#0EA5A8',\n  '#D97706',\n  '#5B4FCF',\n  '#DB2777',\n  '#2563EB',\n  '#16A34A',\n  '#CA8A04',\n];\n\n/** Monochromatic greyscale hues for light ink-on-paper / minimal presets. */\nexport const MONOCHROME_LIGHT_HUES: readonly string[] = [\n  '#525252',\n  '#737373',\n  '#404040',\n  '#8A8A8A',\n  '#262626',\n  '#5E5E5E',\n];\n\n/** Monochromatic greyscale hues for dark minimal / bw-dark presets. */\nexport const MONOCHROME_DARK_HUES: readonly string[] = [\n  '#D4D4D4',\n  '#A3A3A3',\n  '#E5E5E5',\n  '#8B8B8B',\n  '#FAFAFA',\n  '#B8B8B8',\n];\n\n/** Hue at `index`, wrapping the cycle. Respects monochromatic theme presets when passed. */\nexport function categoricalHue(index: number, theme?: ResolvedTheme): string {\n  if (theme) {\n    if (theme.name === 'bw-dark') {\n      const n = MONOCHROME_DARK_HUES.length;\n      return MONOCHROME_DARK_HUES[((index % n) + n) % n]!;\n    }\n    if (theme.name === 'bw-light' || theme.name === 'minimal') {\n      const n = MONOCHROME_LIGHT_HUES.length;\n      return MONOCHROME_LIGHT_HUES[((index % n) + n) % n]!;\n    }\n  }\n  const n = CATEGORICAL_HUES.length;\n  return CATEGORICAL_HUES[((index % n) + n) % n]!;\n}\n", "/**\n * @file diagrams/timeline/shared.ts \u2014 Helpers shared across timeline layouts.\n *\n * These are specific to the timeline diagram family (vertical-spine, serpentine,\n * roadmap, columns, horizontal) but common to all of them \u2014 so they live here\n * rather than being copy-pasted per layout. Cross-diagram utilities (rounding,\n * dates, text metrics) live in the top-level general modules instead.\n */\n\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport type { TimelineDocument } from './ir.js';\nimport { startOrdinal } from '../../../time/dates.js';\n\n/**\n * Map a timeline activity status to the theme's semantic palette.\n *   done \u2192 success, active \u2192 primary, blocked \u2192 error, else \u2192 secondary.\n * Reads only shared palette tokens so every theme restyles consistently.\n */\nexport function statusColor(palette: ResolvedTheme['palette'], status?: string): string {\n  switch (status) {\n    case 'done':\n      return palette.success;\n    case 'active':\n      return palette.primary;\n    case 'blocked':\n      return palette.error;\n    default:\n      return palette.secondary;\n  }\n}\n\n/** A milestone or activity, normalized for layouts that treat both uniformly. */\nexport interface TimelineEntry {\n  readonly id: string;\n  readonly label: string;\n  readonly kind: 'milestone' | 'activity';\n  /** Period-start date string (milestone.date or activity.start). */\n  readonly date: string;\n  /** Activity end date, when present. */\n  readonly end?: string;\n  /** Day-ordinal of the start date, for ordering. */\n  readonly ord: number;\n  readonly status?: string;\n  readonly description?: string;\n  readonly icon?: string;\n}\n\n/**\n * Merge milestones + activities into one list keyed by start date, sorted by\n * (ordinal, id) for stable, deterministic placement. Used by the layouts that\n * lay both kinds along a single track (spine, serpentine).\n */\nexport function collectEntries(ir: TimelineDocument): TimelineEntry[] {\n  const entries: (TimelineEntry & { _idx: number })[] = [];\n  let counter = 0;\n  for (const m of ir.milestones) {\n    entries.push({\n      id: m.id,\n      label: m.label,\n      kind: 'milestone',\n      date: m.date,\n      ord: startOrdinal(m.date),\n      ...(m.icon ? { icon: m.icon } : {}),\n      ...(m.description ? { description: m.description } : {}),\n      _idx: counter++,\n    });\n  }\n  for (const a of ir.activities) {\n    entries.push({\n      id: a.id,\n      label: a.label,\n      kind: 'activity',\n      date: a.start,\n      ord: startOrdinal(a.start),\n      ...(a.end ? { end: a.end } : {}),\n      ...(a.status ? { status: a.status } : {}),\n      ...(a.description ? { description: a.description } : {}),\n      _idx: counter++,\n    });\n  }\n  entries.sort((p, q) => p.ord - q.ord || p._idx - q._idx);\n  return entries;\n}\n", "/**\n * @file diagrams/timeline/vertical-spine.ts \u2014 Vertical central-spine layout.\n *\n * Time axis runs TOP (earliest) \u2192 BOTTOM (latest). A central vertical spine\n * line sits at canvas mid-x. Entries (milestones + activities, keyed by their\n * start date) are sorted by (ordinal, id) and placed down the spine, alternating\n * RIGHT (even index) / LEFT (odd index). Each entry draws a node marker on the\n * spine, a horizontal connector, and a content card (date + title + description).\n *\n * Uses the GENERAL utilities: time/dates (ordinals, parsing, formatting) and\n * text/metrics + text/wrap (card sizing). Styling reads only the shared theme\n * tokens (palette/typography/spacing) \u2014 status maps to the semantic palette\n * (done\u2192success, active\u2192primary, blocked\u2192error, default\u2192secondary).\n *\n * Determinism: round-half-up coordinates, stable (ordinal, id) sort, no clock.\n */\n\nimport type { TimelineDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhuInt } from '../../../util/round.js';\nimport { pen } from '../../../scene/build.js';\nimport {\n  measureFormattedText,\n  renderFormattedText,\n  type FormattedTextLines,\n} from '../../../text/formatted.js';\nimport { formatDate } from '../../../time/dates.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { collectEntries } from './shared.js';\n\ninterface SpineEntry {\n  id: string;\n  label: string;\n  dateStr: string;\n  ord: number;\n  description?: string;\n  type: 'milestone' | 'activity';\n  statusHint?: string;\n  dotColor: string;\n}\n\n/** Human date string, precision-aware (milestone style: full day dates). */\nconst formatEntryDate = (date: string): string => formatDate(date, 'full');\n\nexport function layoutVerticalSpine(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const margin = spacing.diagramMargin;\n\n  // \u2500\u2500 Build unified entry list (sorted by ordinal, id) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const entries: SpineEntry[] = collectEntries(ir).map((e) => ({\n    id: e.id,\n    label: e.label,\n    dateStr: formatEntryDate(e.date),\n    ord: e.ord,\n    ...(e.description ? { description: e.description } : {}),\n    type: e.kind,\n    ...(e.status ? { statusHint: e.status } : {}),\n    dotColor: palette.primary,\n  }));\n\n  // Assign colours after ordering: active/blocked keep semantic colour,\n  // everything else cycles a categorical palette so each entry is distinct.\n  entries.forEach((e, i) => {\n    e.dotColor =\n      e.statusHint === 'active'\n        ? palette.primary\n        : e.statusHint === 'blocked'\n          ? palette.error\n          : categoricalHue(i, theme);\n  });\n\n  // \u2500\u2500 Geometry constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const cardW = 260;\n  const cardPad = 12;\n  const spineGap = 48; // gap between spine and nearest card edge\n  const rowGap = 22;\n  const dotR = 7;\n  const innerW = cardW - 2 * cardPad;\n  const titleSize = typography.baseFontSize;\n  const dateSize = typography.smallFontSize;\n  const descSize = typography.smallFontSize;\n  const titleLH = rhuInt(titleSize * 1.3);\n  const lineLH = rhuInt(descSize * 1.35);\n\n  const spineX = rhuInt(margin + cardW + spineGap);\n  const leftCardR = spineX - spineGap; // right edge of left-column cards\n  const rightCardL = spineX + spineGap; // left edge of right-column cards\n  const totalW = rhuInt(rightCardL + cardW + margin);\n\n  const subtitle = typeof ir.metadata.subtitle === 'string' ? ir.metadata.subtitle : undefined;\n  const headerH = ir.metadata.title\n    ? typography.titleFontSize + (subtitle ? typography.baseFontSize + 10 : 0) + 24\n    : 0;\n  let y = margin + headerH + 8;\n  const startY = y;\n  // Pre-compute each entry's wrapped text + card height\n  interface Placed extends SpineEntry {\n    labelInfo: FormattedTextLines;\n    descInfo?: FormattedTextLines | undefined;\n    cardH: number;\n  }\n  const placed: Placed[] = entries.map((e) => {\n    const labelInfo = measureFormattedText(e.label, titleSize, dateSize, innerW, 4);\n    const descInfo = e.description\n      ? measureFormattedText(e.description, descSize, descSize, innerW, 4)\n      : undefined;\n    const labelH = labelInfo.lineCount * titleLH;\n    const descH = descInfo ? 4 + descInfo.lineCount * lineLH : 0;\n    const cardH = rhuInt(cardPad + dateSize * 1.3 + 4 + labelH + descH + cardPad);\n    return { ...e, labelInfo, descInfo, cardH };\n  });\n\n  const elements: SceneElement[] = [];\n  const p = pen(theme);\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        rhuInt(totalW / 2),\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n    if (subtitle) {\n      elements.push(\n        p.text(\n          subtitle,\n          rhuInt(totalW / 2),\n          margin + typography.titleFontSize + typography.baseFontSize + 8,\n          typography.baseFontSize,\n          palette.textMuted,\n          { anchor: 'middle' },\n        ),\n      );\n    }\n  }\n\n  // \u2500\u2500 Place entries down the spine \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let lastNodeY = startY;\n  placed.forEach((e, i) => {\n    const onRight = i % 2 === 0;\n    const nodeY = rhuInt(y + e.cardH / 2);\n    const cardX = onRight ? rightCardL : leftCardR - cardW;\n    const cardY = rhuInt(y);\n\n    // Connector (spine \u2192 card)\n    const connX2 = onRight ? rightCardL : leftCardR;\n    elements.push(p.path(`M ${spineX} ${nodeY} L ${connX2} ${nodeY}`, palette.border, 1.5));\n\n    // Card background\n    elements.push(\n      p.rect(\n        { x: cardX, y: cardY, width: cardW, height: e.cardH },\n        palette.surface,\n        palette.border,\n        1,\n        { rx: 8 },\n      ),\n    );\n    // Status accent stripe on the spine-facing edge\n    const stripeX = onRight ? cardX : cardX + cardW - 3;\n    elements.push(\n      p.rect({ x: stripeX, y: cardY, width: 3, height: e.cardH }, e.dotColor, e.dotColor, 0),\n    );\n\n    // Card text\n    const textX = cardX + cardPad;\n    let ty = cardY + cardPad + dateSize;\n    elements.push(\n      p.text(e.dateStr, textX, ty, dateSize, e.dotColor, { weight: 'bold', anchor: 'start' }),\n    );\n    ty += 4;\n    const labelH = e.labelInfo.lineCount * titleLH;\n    elements.push(\n      ...renderFormattedText(\n        p,\n        e.labelInfo,\n        textX,\n        ty - 4,\n        innerW,\n        labelH + 4,\n        titleSize,\n        dateSize,\n        palette.text,\n        palette.textMuted,\n        { align: 'start', defaultBold: true },\n      ),\n    );\n    ty += labelH;\n    if (e.descInfo) {\n      ty += 2;\n      const descH = e.descInfo.lineCount * lineLH;\n      elements.push(\n        ...renderFormattedText(\n          p,\n          e.descInfo,\n          textX,\n          ty - 4,\n          innerW,\n          descH + 4,\n          descSize,\n          descSize,\n          palette.textMuted,\n          palette.textMuted,\n          { align: 'start' },\n        ),\n      );\n    }\n\n    // Node marker on spine (diamond for milestone, circle for activity)\n    if (e.type === 'milestone') {\n      const r = dotR + 1;\n      elements.push(\n        p.path(\n          `M ${spineX} ${nodeY - r} L ${spineX + r} ${nodeY} L ${spineX} ${nodeY + r} L ${spineX - r} ${nodeY} Z`,\n          palette.background,\n          2,\n          { fill: e.dotColor },\n        ),\n      );\n    } else {\n      elements.push(p.circle({ x: spineX, y: nodeY }, dotR, e.dotColor, palette.background, 2));\n    }\n\n    lastNodeY = nodeY;\n    y += e.cardH + rowGap;\n  });\n\n  // \u2500\u2500 Spine line (drawn under everything via unshift) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.unshift(p.path(`M ${spineX} ${startY} L ${spineX} ${lastNodeY}`, palette.border, 2.5));\n\n  const totalH = rhuInt(y - rowGap + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "/**\n * @file diagrams/timeline/serpentine.ts \u2014 Serpentine (boustrophedon) layout.\n *\n * A single winding track runs left\u2192right, U-turns down, right\u2192left, U-turns, \u2026\n * Entries (milestones + activities, by start date) are placed at uniform\n * arc-length positions t_i = (i + 0.5) / n along the path. A play cap marks the\n * start, a target/bullseye cap the end. Labels sit above/below each node by row\n * parity.\n *\n * Built on the GENERAL time/dates module. Uses only shared theme tokens.\n * v3 fidelity notes vs core: solid track (v3 scene has no stroke gradients) and\n * inline play/target caps (no icon registry yet).\n *\n * Determinism: round-half-up, stable (ordinal, id) sort, no clock.\n */\n\nimport type { TimelineDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\nimport { pen } from '../../../scene/build.js';\nimport { statusColor, collectEntries } from './shared.js';\n\ninterface Geo {\n  xl: number;\n  xr: number;\n  pathStartY: number;\n  nRows: number;\n  rowSpacing: number;\n  turnRadius: number;\n  rowWidth: number;\n  totalLength: number;\n}\n\n/** Point (x,y) at arc-length s along the boustrophedon path. */\nfunction pathPointAtS(s: number, geo: Geo): { x: number; y: number } {\n  const { xl, xr, pathStartY, nRows, rowSpacing, turnRadius: r, rowWidth } = geo;\n  const L_turn = Math.PI * r;\n  let remaining = Math.max(0, Math.min(s, geo.totalLength));\n\n  for (let row = 0; row < nRows; row++) {\n    const y_row = pathStartY + row * rowSpacing;\n    if (remaining <= rowWidth + 1e-9) {\n      const t = Math.min(remaining, rowWidth);\n      return row % 2 === 0 ? { x: rhu(xl + t), y: rhu(y_row) } : { x: rhu(xr - t), y: rhu(y_row) };\n    }\n    remaining -= rowWidth;\n    if (row < nRows - 1) {\n      if (remaining <= L_turn + 1e-9) {\n        const alpha = Math.min(remaining, L_turn) / r;\n        return row % 2 === 0\n          ? { x: rhu(xr + r * Math.sin(alpha)), y: rhu(y_row + r * (1 - Math.cos(alpha))) }\n          : { x: rhu(xl - r * Math.sin(alpha)), y: rhu(y_row + r * (1 - Math.cos(alpha))) };\n      }\n      remaining -= L_turn;\n    }\n  }\n  const lastRow = nRows - 1;\n  const y_last = rhu(pathStartY + lastRow * rowSpacing);\n  return lastRow % 2 === 0 ? { x: rhu(xr), y: y_last } : { x: rhu(xl), y: y_last };\n}\n\n/** SVG path d for the full boustrophedon, smooth arc U-turns. */\nfunction buildPathD(geo: Geo): string {\n  const { xl, xr, pathStartY, nRows, rowSpacing, turnRadius: r } = geo;\n  const parts: string[] = [];\n  for (let row = 0; row < nRows; row++) {\n    const y = rhu(pathStartY + row * rowSpacing);\n    const y_next = rhu(pathStartY + (row + 1) * rowSpacing);\n    if (row === 0) parts.push(`M ${xl} ${y}`);\n    if (row % 2 === 0) {\n      parts.push(`L ${xr} ${y}`);\n      if (row < nRows - 1) parts.push(`A ${r} ${r} 0 1 1 ${xr} ${y_next}`);\n    } else {\n      parts.push(`L ${xl} ${y}`);\n      if (row < nRows - 1) parts.push(`A ${r} ${r} 0 1 0 ${xl} ${y_next}`);\n    }\n  }\n  return parts.join(' ');\n}\n\ninterface SerpEntry {\n  id: string;\n  label: string;\n  ord: number;\n  color: string;\n}\n\nexport function layoutSerpentine(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography } = theme;\n  const p = pen(theme);\n\n  // \u2500\u2500 Entries \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const entries: SerpEntry[] = collectEntries(ir).map((e) => ({\n    id: e.id,\n    label: e.label,\n    ord: e.ord,\n    color: e.kind === 'milestone' ? palette.primary : statusColor(palette, e.status),\n  }));\n  const n = entries.length;\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const W = 1040;\n  const turnRadius = 80;\n  const rowSpacing = 160;\n  const trackWidth = 14;\n  const nodeR = 10;\n  const badgeR = 22;\n  const PATH_XL = rhu(turnRadius + 10);\n  const PATH_XR = rhu(W - turnRadius - 10);\n  const ROW_W = rhu(PATH_XR - PATH_XL);\n\n  const nRows = Math.max(2, Math.ceil(n / 3));\n  const headerH = ir.metadata.title ? typography.titleFontSize + 28 : 0;\n  const TOP_PAD = 64;\n  const BOTTOM_PAD = 64;\n  const pathStartY = rhu(headerH + TOP_PAD);\n  const L_turn = rhu(Math.PI * turnRadius);\n  const totalLength = rhu(nRows * ROW_W + (nRows - 1) * L_turn);\n  const pathEndY = rhu(pathStartY + (nRows - 1) * rowSpacing);\n  const canvasH = rhuInt(pathEndY + BOTTOM_PAD);\n\n  const geo: Geo = {\n    xl: PATH_XL,\n    xr: PATH_XR,\n    pathStartY,\n    nRows,\n    rowSpacing,\n    turnRadius,\n    rowWidth: ROW_W,\n    totalLength,\n  };\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        rhu(W / 2),\n        rhuInt(typography.titleFontSize + 8),\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Track \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const pathD = buildPathD(geo);\n  const pathStart = pathPointAtS(0, geo);\n  const pathEnd = pathPointAtS(totalLength, geo);\n\n  elements.push(p.path(pathD, palette.primary, trackWidth, { fill: 'none' }));\n\n  // \u2500\u2500 Nodes + labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function rowForS(s: number): number {\n    let remaining = Math.max(0, s);\n    for (let row = 0; row < nRows; row++) {\n      if (remaining <= ROW_W + 1e-9) return row;\n      remaining -= ROW_W;\n      if (row < nRows - 1) {\n        if (remaining <= L_turn + 1e-9) return row;\n        remaining -= L_turn;\n      }\n    }\n    return nRows - 1;\n  }\n\n  const labelFontSize = typography.smallFontSize;\n  for (let i = 0; i < n; i++) {\n    const s = rhu(((i + 0.5) / n) * totalLength);\n    const pt = pathPointAtS(s, geo);\n    const e = entries[i]!;\n\n    elements.push(p.circle({ x: pt.x, y: pt.y }, nodeR, palette.background, e.color, 3));\n\n    const isEvenRow = rowForS(s) % 2 === 0;\n    const labelY = isEvenRow ? rhu(pt.y + nodeR + 6 + labelFontSize * 0.9) : rhu(pt.y - nodeR - 8);\n    const labelText = e.label.length > 18 ? `${e.label.slice(0, 16)}\u2026` : e.label;\n    elements.push(\n      p.text(labelText, pt.x, labelY, labelFontSize, palette.text, { anchor: 'middle' }),\n    );\n  }\n\n  // \u2500\u2500 Start cap (play triangle) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(\n    p.circle({ x: pathStart.x, y: pathStart.y }, badgeR, palette.primary, palette.primary, 2),\n  );\n  {\n    const cx = pathStart.x,\n      cy = pathStart.y,\n      t = badgeR * 0.5;\n    elements.push(\n      p.path(\n        `M ${rhu(cx - t * 0.5)} ${rhu(cy - t)} L ${rhu(cx + t)} ${rhu(cy)} L ${rhu(cx - t * 0.5)} ${rhu(cy + t)} Z`,\n        palette.background,\n        0,\n        { fill: palette.background },\n      ),\n    );\n  }\n\n  // \u2500\u2500 End cap (target / bullseye) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(\n    p.circle({ x: pathEnd.x, y: pathEnd.y }, badgeR, palette.primary, palette.primary, 2),\n  );\n  elements.push(\n    p.circle({ x: pathEnd.x, y: pathEnd.y }, rhu(badgeR * 0.62), 'none', palette.background, 2.5),\n  );\n  elements.push(\n    p.circle(\n      { x: pathEnd.x, y: pathEnd.y },\n      rhu(badgeR * 0.28),\n      palette.background,\n      palette.background,\n      0,\n    ),\n  );\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: W, height: canvasH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "/**\n * @file diagrams/timeline/roadmap.ts \u2014 Roadmap infographic layout.\n *\n * Four horizontal zones (top\u2192bottom):\n *   1. Header     \u2014 title.\n *   2. Callouts   \u2014 milestone labels + (date), leader line + dot down to band.\n *   3. Phase band \u2014 activity pills from dateX(start)\u2192dateX(end), status-coloured,\n *                   lane-packed so overlapping ranges stack instead of collide.\n *   4. Date axis  \u2014 baseline with date labels at milestone x positions.\n *\n * Built on the GENERAL time/dates + text/metrics modules. Linear date mapping\n * (no axis breaks in v1). Uses only shared theme tokens.\n */\n\nimport type { TimelineDocument, Activity, Milestone } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhuInt } from '../../../util/round.js';\nimport { pen } from '../../../scene/build.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { truncateText } from '../../../text/wrap.js';\nimport { startOrdinal, endOrdinal, formatDate } from '../../../time/dates.js';\nimport { statusColor } from './shared.js';\n\nconst leftOrd = startOrdinal;\nconst rightOrd = endOrdinal;\nconst fmtDate = (date: string): string => formatDate(date, 'axis');\n\ninterface Pill {\n  label: string;\n  startOrd: number;\n  endOrd: number;\n  color: string;\n  lane: number;\n}\n\nexport function layoutRoadmap(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const draw = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  // \u2500\u2500 Time range \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const acts = ir.activities as readonly Activity[];\n  const miles = ir.milestones as readonly Milestone[];\n  const allOrds: number[] = [];\n  for (const a of acts) {\n    allOrds.push(leftOrd(a.start), rightOrd(a.end ?? a.start));\n  }\n  for (const m of miles) allOrds.push(leftOrd(m.date));\n  if (allOrds.length === 0) allOrds.push(0, 1);\n  const minOrd = Math.min(...allOrds);\n  const maxOrd = Math.max(...allOrds);\n  const span = Math.max(1, maxOrd - minOrd);\n\n  // \u2500\u2500 Canvas + axis geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const W = 1040;\n  const axisLeft = margin + 10;\n  const axisRight = W - margin - 10;\n  const axisW = axisRight - axisLeft;\n  const dateX = (ord: number): number => rhuInt(axisLeft + ((ord - minOrd) / span) * axisW);\n\n  // \u2500\u2500 Lane-pack activities (avoid overlap) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const sorted = [...acts].sort((a, b) => leftOrd(a.start) - leftOrd(b.start));\n  const laneEnds: number[] = [];\n  const pills: Pill[] = sorted.map((a) => {\n    const s = leftOrd(a.start);\n    const e = Math.max(rightOrd(a.end ?? a.start), s + Math.round(span / 30)); // min visible width\n    let lane = laneEnds.findIndex((end) => s >= end);\n    if (lane === -1) {\n      lane = laneEnds.length;\n      laneEnds.push(e);\n    } else laneEnds[lane] = e;\n    return { label: a.label, startOrd: s, endOrd: e, color: statusColor(palette, a.status), lane };\n  });\n  const numLanes = Math.max(1, laneEnds.length);\n\n  // \u2500\u2500 Vertical zones \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const headerH = ir.metadata.title ? typography.titleFontSize + 20 : 8;\n  const calloutH = miles.length ? 56 : 12;\n  const laneH = 34;\n  const lanePad = 6;\n  const bandTop = margin + headerH + calloutH;\n  const bandH = numLanes * laneH + (numLanes - 1) * lanePad;\n  const bandBot = bandTop + bandH;\n  const axisY = bandBot + 26;\n  const totalH = rhuInt(axisY + typography.smallFontSize + margin);\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(\n      draw.text(\n        ir.metadata.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'start' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Band background \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(\n    draw.rect(\n      { x: axisLeft, y: bandTop, width: axisW, height: bandH },\n      palette.surface,\n      palette.border,\n      1,\n      { rx: 6 },\n    ),\n  );\n\n  // \u2500\u2500 Activity pills \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const pillFont = typography.smallFontSize;\n  for (const p of pills) {\n    const x1 = dateX(p.startOrd),\n      x2 = dateX(p.endOrd);\n    const px = x1,\n      pw = Math.max(14, x2 - x1);\n    const py = bandTop + p.lane * (laneH + lanePad);\n    elements.push(\n      draw.rect({ x: px, y: py, width: pw, height: laneH }, p.color, p.color, 0, { rx: 6 }),\n    );\n    const label = truncateText(p.label, pillFont, pw - 12);\n    if (label && measureText(label, pillFont).width <= pw - 8) {\n      elements.push(\n        draw.text(\n          label,\n          px + pw / 2,\n          py + laneH / 2 + pillFont * 0.35,\n          pillFont,\n          palette.background,\n          { weight: 'bold', anchor: 'middle' },\n        ),\n      );\n    }\n  }\n\n  // \u2500\u2500 Milestone callouts (above band) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const m of miles) {\n    const mx = dateX(leftOrd(m.date));\n    const labelY = margin + headerH + typography.baseFontSize;\n    elements.push(\n      draw.text(m.label, mx, labelY, typography.baseFontSize, palette.text, {\n        weight: 'bold',\n        anchor: 'middle',\n      }),\n    );\n    elements.push(\n      draw.text(\n        `(${fmtDate(m.date)})`,\n        mx,\n        labelY + typography.smallFontSize + 2,\n        typography.smallFontSize,\n        palette.textMuted,\n        { anchor: 'middle' },\n      ),\n    );\n    // leader line down to band top + dot\n    elements.push(\n      draw.path(\n        `M ${mx} ${labelY + typography.smallFontSize + 6} L ${mx} ${bandTop}`,\n        palette.border,\n        1,\n      ),\n    );\n    elements.push(draw.circle({ x: mx, y: bandTop }, 4, palette.primary, palette.background, 1.5));\n  }\n\n  // \u2500\u2500 Date axis \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(draw.path(`M ${axisLeft} ${axisY} L ${axisRight} ${axisY}`, palette.border, 1.5));\n  const axisDates = new Set<string>();\n  for (const m of miles) axisDates.add(m.date);\n  for (const a of acts) {\n    axisDates.add(a.start);\n    if (a.end) axisDates.add(a.end);\n  }\n  for (const d of axisDates) {\n    const x = dateX(leftOrd(d));\n    elements.push(draw.path(`M ${x} ${axisY - 3} L ${x} ${axisY + 3}`, palette.border, 1));\n    elements.push(\n      draw.text(\n        fmtDate(d),\n        x,\n        axisY + typography.smallFontSize + 2,\n        typography.smallFontSize,\n        palette.textMuted,\n        { anchor: 'middle' },\n      ),\n    );\n  }\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: W, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "import type { Color } from '../contracts/primitives.js';\nimport type { ResolvedTheme } from '../contracts/theme.js';\n\nfunction parseHex(c: Color): [number, number, number] | null {\n  const s = c.trim();\n  const m3 = s.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);\n  if (m3)\n    return [\n      parseInt(m3[1]! + m3[1]!, 16),\n      parseInt(m3[2]! + m3[2]!, 16),\n      parseInt(m3[3]! + m3[3]!, 16),\n    ];\n  const m6 = s.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n  if (m6) return [parseInt(m6[1]!, 16), parseInt(m6[2]!, 16), parseInt(m6[3]!, 16)];\n  return null;\n}\n\nexport function relativeLuminance(color: Color): number | undefined {\n  const rgb = parseHex(color);\n  if (!rgb) return undefined;\n  const linear = (v: number): number => {\n    const s = v / 255;\n    return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;\n  };\n  return 0.2126 * linear(rgb[0]) + 0.7152 * linear(rgb[1]) + 0.0722 * linear(rgb[2]);\n}\n\nexport function contrastRatio(a: Color, b: Color): number {\n  const la = relativeLuminance(a),\n    lb = relativeLuminance(b);\n  if (la === undefined || lb === undefined) return 1;\n  const hi = Math.max(la, lb),\n    lo = Math.min(la, lb);\n  return (hi + 0.05) / (lo + 0.05);\n}\n\nexport function bestContrast(fill: Color, candidates: readonly Color[], fallback: Color): Color {\n  let best = fallback,\n    score = contrastRatio(fallback, fill);\n  for (const c of candidates) {\n    if (relativeLuminance(c) === undefined) continue;\n    const next = contrastRatio(c, fill);\n    if (next > score) {\n      best = c;\n      score = next;\n    }\n  }\n  return best;\n}\n\nexport function readableText(fill: Color, theme: ResolvedTheme): Color {\n  // Pick the most-contrasting NEUTRAL theme token for text drawn on `fill`.\n  // Considering the full neutral set (not just text+background) keeps labels\n  // readable even when a token is blank \u2014 e.g. the VS Code extension forces a\n  // preset but overrides palette.background to '' for a transparent canvas,\n  // which would otherwise leave only the (light) text token and yield white\n  // labels on light fills. bestContrast skips unparseable/blank candidates.\n  const p = theme.palette;\n  return bestContrast(fill, [p.text, p.background, p.surface, p.textMuted, p.border], p.text);\n}\n\nexport function isDarkTheme(theme: ResolvedTheme): boolean {\n  const lum = relativeLuminance(theme.palette.background);\n  return lum !== undefined ? lum < 0.2 : false;\n}\n", "/**\n * @file diagrams/timeline/timeline-columns.ts \u2014 Mermaid-faithful section columns.\n *\n * Colored SECTION header bands across the top; under each, PERIOD columns (one\n * per distinct date) tinted to the section colour; under each period, EVENT\n * boxes stacked vertically. A horizontal axis line separates headers from events.\n *\n * v3 data model note: core links events\u2192sections via track===sectionId, but v3\n * keeps sections separate (with date ranges). We reconstruct membership by\n * date-containment: each entry joins the latest section whose start \u2264 entry date.\n *\n * Self-contained 8-hue palette (the Mermaid look) \u2014 a layout-local constant,\n * not a theme token. Built on GENERAL time/dates + text/wrap modules.\n */\n\nimport type { TimelineDocument, Activity, Milestone, Section } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhuInt } from '../../../util/round.js';\nimport { pen } from '../../../scene/build.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { startOrdinal, formatDate } from '../../../time/dates.js';\n\nimport { isDarkTheme } from '../../../theme/contrast.js';\n\ninterface SectionColors {\n  header: string;\n  period: string;\n  event: string;\n  headerText: string;\n  eventText: string;\n  eventBorder: string;\n}\n\nconst SECTION_PALETTE: SectionColors[] = [\n  {\n    header: '#5368D4',\n    period: '#3F52B5',\n    event: '#EEF0FC',\n    headerText: '#FFFFFF',\n    eventText: '#1E2D8A',\n    eventBorder: '#BBBFEA',\n  },\n  {\n    header: '#E07825',\n    period: '#C46010',\n    event: '#FEF1E4',\n    headerText: '#FFFFFF',\n    eventText: '#7A3A00',\n    eventBorder: '#E8C09A',\n  },\n  {\n    header: '#27A565',\n    period: '#1A8A50',\n    event: '#E4F7EF',\n    headerText: '#FFFFFF',\n    eventText: '#0B4D2C',\n    eventBorder: '#A8DFC5',\n  },\n  {\n    header: '#9B3A9A',\n    period: '#7E2480',\n    event: '#F6E8F6',\n    headerText: '#FFFFFF',\n    eventText: '#520050',\n    eventBorder: '#D8A8D8',\n  },\n  {\n    header: '#1FA8C0',\n    period: '#1288A0',\n    event: '#E0F4F8',\n    headerText: '#FFFFFF',\n    eventText: '#084E60',\n    eventBorder: '#A0D8E4',\n  },\n  {\n    header: '#B03068',\n    period: '#901848',\n    event: '#F8E0EA',\n    headerText: '#FFFFFF',\n    eventText: '#580028',\n    eventBorder: '#E0A8C0',\n  },\n  {\n    header: '#7A8000',\n    period: '#606400',\n    event: '#F0F0D0',\n    headerText: '#FFFFFF',\n    eventText: '#3A3C00',\n    eventBorder: '#C8C880',\n  },\n  {\n    header: '#2E6098',\n    period: '#1E4878',\n    event: '#D8E8F5',\n    headerText: '#FFFFFF',\n    eventText: '#102840',\n    eventBorder: '#90B8D8',\n  },\n];\n\nconst SECTION_HDR_H = 38;\nconst PERIOD_HDR_H = 30;\nconst EVENT_BOX_H = 38;\nconst EVENT_BOX_GAP = 4;\nconst EVENT_AREA_PAD = 8;\nconst COL_PAD_H = 5;\nconst MIN_COL_W = 120;\nconst MARGIN = 32;\n\nconst leftOrd = startOrdinal;\nconst fmtPeriod = (date: string): string => formatDate(date, 'axis');\n\ninterface Period {\n  date: string;\n  ord: number;\n  events: string[];\n}\ninterface Sec {\n  label: string;\n  startOrd: number;\n  periods: Period[];\n}\n\nexport function layoutTimelineColumns(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography } = theme;\n  const dark = isDarkTheme(theme);\n  const getSectionColors = (idx: number): SectionColors => {\n    const raw = SECTION_PALETTE[idx % SECTION_PALETTE.length]!;\n    if (dark) {\n      return {\n        header: raw.header,\n        period: raw.period,\n        event: palette.surface,\n        headerText: '#FFFFFF',\n        eventText: palette.text,\n        eventBorder: palette.border,\n      };\n    }\n    return raw;\n  };\n\n  // \u2500\u2500 Reconstruct section \u2192 period \u2192 event tree \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const irSections = (ir.sections ?? []) as readonly Section[];\n  const baseSecs: Sec[] = (\n    irSections.length\n      ? irSections.map((s) => ({\n          label: s.label,\n          startOrd: leftOrd(s.start),\n          periods: [] as Period[],\n        }))\n      : [{ label: ir.metadata.title ?? 'Timeline', startOrd: -Infinity, periods: [] as Period[] }]\n  ).sort((a, b) => a.startOrd - b.startOrd);\n\n  const assignSection = (ord: number): Sec => {\n    let chosen = baseSecs[0]!;\n    for (const s of baseSecs) if (s.startOrd <= ord) chosen = s;\n    return chosen;\n  };\n\n  // entries (milestones + activities) keyed by their start date\n  interface Entry {\n    date: string;\n    label: string;\n  }\n  const entries: Entry[] = [];\n  for (const m of ir.milestones as readonly Milestone[])\n    entries.push({ date: m.date, label: m.label });\n  for (const a of ir.activities as readonly Activity[])\n    entries.push({ date: a.start, label: a.label });\n\n  for (const e of entries) {\n    const ord = leftOrd(e.date);\n    const sec = assignSection(ord);\n    let period = sec.periods.find((p) => p.date === e.date);\n    if (!period) {\n      period = { date: e.date, ord, events: [] };\n      sec.periods.push(period);\n    }\n    period.events.push(e.label);\n  }\n  // sort periods within each section by ordinal; drop empty sections\n  const sections = baseSecs.filter((s) => s.periods.length > 0);\n  for (const s of sections) s.periods.sort((a, b) => a.ord - b.ord);\n\n  const totalPeriods = sections.reduce((n, s) => n + s.periods.length, 0);\n  const maxEvents = sections.reduce(\n    (m, s) =>\n      Math.max(\n        m,\n        s.periods.reduce((p, per) => Math.max(p, per.events.length), 0),\n      ),\n    0,\n  );\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const colW = MIN_COL_W;\n  const canvasW = rhuInt(Math.max(totalPeriods, 1) * colW + MARGIN * 2);\n  const titleH = ir.metadata.title ? typography.titleFontSize + 18 : 8;\n  const eventAreaH = rhuInt(\n    EVENT_AREA_PAD +\n      maxEvents * EVENT_BOX_H +\n      Math.max(0, maxEvents - 1) * EVENT_BOX_GAP +\n      EVENT_AREA_PAD,\n  );\n\n  const sectionBandTopY = MARGIN + titleH;\n  const periodHdrTopY = sectionBandTopY + SECTION_HDR_H;\n  const periodHdrBotY = periodHdrTopY + PERIOD_HDR_H;\n  const AXIS_GAP = 16; // clear space between headers and axis line\n  const axisLineY = periodHdrBotY + AXIS_GAP;\n  const eventsTopY = axisLineY + EVENT_AREA_PAD;\n  const canvasH = rhuInt(axisLineY + eventAreaH + MARGIN);\n\n  const elements: SceneElement[] = [];\n  const p = pen(theme);\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        rhuInt(canvasW / 2),\n        MARGIN + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Section bands + period columns + events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const eventFont = typography.smallFontSize;\n  let cursorX = MARGIN;\n  sections.forEach((section, si) => {\n    const colors = getSectionColors(si);\n    const sectionW = rhuInt(colW * section.periods.length);\n\n    // Section header band\n    elements.push(\n      p.rect(\n        { x: cursorX, y: sectionBandTopY, width: sectionW, height: SECTION_HDR_H },\n        colors.header,\n        colors.header,\n        0,\n      ),\n    );\n    elements.push(\n      p.text(\n        section.label,\n        cursorX + sectionW / 2,\n        sectionBandTopY + SECTION_HDR_H / 2 + eventFont * 0.35,\n        typography.baseFontSize,\n        colors.headerText,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n\n    // Period columns\n    section.periods.forEach((period, pi) => {\n      const px = cursorX + pi * colW;\n\n      // Period header box (touches neighbours; thin divider drawn between columns)\n      elements.push(\n        p.rect(\n          { x: px, y: periodHdrTopY, width: colW, height: PERIOD_HDR_H },\n          colors.period,\n          colors.period,\n          0,\n        ),\n      );\n      if (pi > 0) {\n        elements.push(\n          p.path(\n            `M ${px} ${periodHdrTopY} L ${px} ${periodHdrTopY + PERIOD_HDR_H}`,\n            colors.header,\n            1,\n          ),\n        );\n      }\n      elements.push(\n        p.text(\n          fmtPeriod(period.date),\n          px + colW / 2,\n          periodHdrTopY + PERIOD_HDR_H / 2 + eventFont * 0.35,\n          eventFont,\n          colors.headerText,\n          { weight: 'bold', anchor: 'middle' },\n        ),\n      );\n\n      // Event boxes\n      period.events.forEach((label, ei) => {\n        const ey = eventsTopY + ei * (EVENT_BOX_H + EVENT_BOX_GAP);\n        elements.push(\n          p.rect(\n            { x: px + COL_PAD_H, y: ey, width: colW - 2 * COL_PAD_H, height: EVENT_BOX_H },\n            colors.event,\n            colors.eventBorder,\n            1,\n            { rx: 5 },\n          ),\n        );\n        const lines = wrapText(label, eventFont, colW - 2 * COL_PAD_H - 8, 2).lines;\n        const lineH = rhuInt(eventFont * 1.25);\n        const startY = ey + EVENT_BOX_H / 2 - ((lines.length - 1) * lineH) / 2 + eventFont * 0.35;\n        lines.forEach((ln, li) => {\n          elements.push(\n            p.text(ln, px + colW / 2, startY + li * lineH, eventFont, colors.eventText, {\n              anchor: 'middle',\n            }),\n          );\n        });\n      });\n    });\n\n    cursorX += sectionW;\n  });\n\n  // \u2500\u2500 Axis line with arrowhead \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const axisEndX = cursorX;\n  elements.push(\n    p.path(`M ${MARGIN} ${axisLineY} L ${axisEndX} ${axisLineY}`, palette.textMuted, 2),\n  );\n  elements.push(\n    p.path(\n      `M ${axisEndX} ${axisLineY} L ${axisEndX - 8} ${axisLineY - 4} L ${axisEndX - 8} ${axisLineY + 4} Z`,\n      palette.textMuted,\n      0,\n      { fill: palette.textMuted },\n    ),\n  );\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: canvasW, height: canvasH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "/**\n * @file diagrams/timeline/numbered.ts \u2014 Horizontal numbered-circle infographic.\n *\n * The \"our-timeline\" T1 look: a straight horizontal axis through evenly spaced\n * large numbered circles (01, 02, 03\u2026). Each node's date + title callout\n * alternates ABOVE / BELOW the axis, connected by a short vertical edging line.\n * Highlighted (active) nodes are filled; the rest are hollow rings.\n *\n * Built on the shared kernel (collectEntries, formatDate, pen, util/round).\n * Deterministic; no clock.\n */\n\nimport type { TimelineDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport { formatDate } from '../../../time/dates.js';\nimport { collectEntries } from './shared.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutNumbered(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const entries = collectEntries(ir);\n  const n = Math.max(entries.length, 1);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const circleR = 34;\n  const numFont = rhuInt(typography.titleFontSize + 2);\n  const dateFont = typography.smallFontSize;\n  const titleFont = typography.baseFontSize;\n  const innerW = 150; // max wrapped title width\n  const titleLH = rhuInt(titleFont * 1.3);\n  const dateGap = 6;\n  const calloutGap = circleR + 14; // clearance from circle to first callout line\n\n  // Pre-wrap titles to size the callout stacks.\n  const placed = entries.map((e) => ({\n    ...e,\n    dateStr: formatDate(e.date, 'full'),\n    titleLines: wrapText(e.label, titleFont, innerW, 2).lines,\n  }));\n  const maxTitleLines = Math.max(1, ...placed.map((e) => e.titleLines.length));\n  const calloutH = calloutGap + dateFont + dateGap + maxTitleLines * titleLH + 10;\n\n  const subtitle = typeof ir.metadata.subtitle === 'string' ? ir.metadata.subtitle : undefined;\n  const headerH = ir.metadata.title\n    ? typography.titleFontSize + (subtitle ? typography.baseFontSize + 10 : 0) + 22\n    : 0;\n\n  const axisY = margin + headerH + calloutH + circleR;\n  const pitch = Math.max(innerW + 30, circleR * 2 + 60);\n  const leftX = margin + 24;\n  const nodeX = (i: number): number => leftX + i * pitch + circleR;\n  const totalW = rhuInt(nodeX(n - 1) + circleR + 24 + margin);\n  const totalH = rhuInt(axisY + circleR + calloutH + margin);\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Document title (centered) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        rhuInt(totalW / 2),\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n    if (subtitle) {\n      elements.push(\n        p.text(\n          subtitle,\n          rhuInt(totalW / 2),\n          margin + typography.titleFontSize + typography.baseFontSize + 8,\n          typography.baseFontSize,\n          palette.textMuted,\n          { anchor: 'middle' },\n        ),\n      );\n    }\n  }\n\n  // \u2500\u2500 Weaving spine: a continuous horizontal line that arcs AROUND each node, \u2500\n  //    alternating over/under (opposite the callout side) \u2014 the \"edging line\".\n  const arcR = circleR + 5;\n  let spine = `M ${rhu(margin)} ${rhu(axisY)}`;\n  const apexes: Array<{ x: number; y: number }> = [];\n  placed.forEach((_e, i) => {\n    const x = nodeX(i);\n    const lineAbove = i % 2 === 0; // weave starts ABOVE on the first node\n    const sweep = lineAbove ? 1 : 0; // 1 = arc up/over, 0 = arc down/under\n    spine += ` L ${rhu(x - arcR)} ${rhu(axisY)} A ${arcR} ${arcR} 0 0 ${sweep} ${rhu(x + arcR)} ${rhu(axisY)}`;\n    apexes.push({ x, y: lineAbove ? axisY - arcR : axisY + arcR });\n  });\n  spine += ` L ${rhu(totalW - margin)} ${rhu(axisY)}`;\n  elements.push(p.path(spine, palette.border, 2));\n\n  // Dot at each arc apex (the spine's min/max around each node).\n  for (const a of apexes)\n    elements.push(\n      p.circle({ x: rhu(a.x), y: rhu(a.y) }, 4, palette.primary, palette.background, 1.5),\n    );\n\n  // \u2500\u2500 Nodes + alternating callouts \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  placed.forEach((e, i) => {\n    const x = nodeX(i);\n    const above = i % 2 === 1; // node 2 (index 1) callout goes up, like the reference\n    const filled = e.status === 'active';\n    const numColor = filled ? '#FFFFFF' : palette.primary;\n\n    // Circle node (drawn over the spine).\n    elements.push(\n      p.circle(\n        { x: rhu(x), y: rhu(axisY) },\n        circleR,\n        filled ? palette.primary : palette.background,\n        palette.primary,\n        3,\n      ),\n    );\n    elements.push(\n      p.text(\n        String(i + 1).padStart(2, '0'),\n        rhu(x),\n        rhu(axisY + numFont * 0.35),\n        numFont,\n        numColor,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n\n    // Callout: date (near) + title (far), stacked away from the axis.\n    if (above) {\n      const dateY = axisY - calloutGap;\n      elements.push(\n        p.text(e.dateStr, rhu(x), rhu(dateY), dateFont, palette.textMuted, { anchor: 'middle' }),\n      );\n      let ty = dateY - dateFont - dateGap;\n      for (let li = e.titleLines.length - 1; li >= 0; li--) {\n        elements.push(\n          p.text(e.titleLines[li]!, rhu(x), rhu(ty), titleFont, palette.primary, {\n            weight: 'bold',\n            anchor: 'middle',\n          }),\n        );\n        ty -= titleLH;\n      }\n    } else {\n      const dateY = axisY + calloutGap;\n      elements.push(\n        p.text(e.dateStr, rhu(x), rhu(dateY), dateFont, palette.textMuted, { anchor: 'middle' }),\n      );\n      let ty = dateY + titleLH;\n      for (const ln of e.titleLines) {\n        elements.push(\n          p.text(ln, rhu(x), rhu(ty), titleFont, palette.primary, {\n            weight: 'bold',\n            anchor: 'middle',\n          }),\n        );\n        ty += titleLH;\n      }\n    }\n  });\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "/**\n * @file diagrams/timeline/wave.ts \u2014 Wave / Undulating-Ribbon infographic timeline.\n *\n * A continuous, organic sinusoidal wave ribbon with alternating peaks and\n * valleys. Each node is an organic teardrop/map-pin merged seamlessly into the\n * ribbon, containing an inner white medallion with an icon glyph or step index.\n * The ribbon and pins transition through a multi-hue spectral gradient.\n *\n * Deterministic; no clock; full theme and overlay support.\n */\n\nimport type { TimelineDocument } from \"./ir.js\";\nimport type { Scene, SceneElement, LayoutResult, LayoutOptions, Color } from \"../../../contracts/index.js\";\nimport type { ResolvedTheme } from \"../../../contracts/index.js\";\nimport { pen } from \"../../../scene/build.js\";\nimport { applyOverlays } from \"../../../overlay/apply.js\";\nimport { wrapText } from \"../../../text/wrap.js\";\nimport { formatDate } from \"../../../time/dates.js\";\nimport { collectEntries, statusColor, type TimelineEntry } from \"./shared.js\";\nimport { rhu, rhuInt } from \"../../../util/round.js\";\nimport { relativeLuminance } from \"../../../theme/contrast.js\";\nimport { parseIconRef, resolveIcon } from \"../../../icons/resolver.js\";\n\nconst SPECTRAL_PALETTE: readonly Color[] = [\n  \"#00C49F\", // Teal\n  \"#82CA9D\", // Lime\n  \"#FFBB28\", // Yellow / Warm Gold\n  \"#FF8042\", // Orange\n  \"#FF4877\", // Magenta / Pink\n  \"#A855F7\", // Purple\n  \"#3B82F6\", // Blue\n  \"#06B6D4\", // Cyan\n];\n\nconst LIGHT_PALETTE: readonly Color[] = [\n  \"#0284C7\", // Sky Blue\n  \"#6366F1\", // Indigo\n  \"#8B5CF6\", // Violet\n  \"#EC4899\", // Pink\n  \"#F59E0B\", // Amber\n  \"#10B981\", // Emerald\n  \"#14B8A6\", // Teal\n];\n\nfunction resolveNodeColor(\n  i: number,\n  n: number,\n  theme: ResolvedTheme,\n  entry: TimelineEntry,\n): Color {\n  if (entry.status && entry.status !== \"default\") {\n    return statusColor(theme.palette, entry.status);\n  }\n  const isMono =\n    theme.name === \"minimal\" ||\n    theme.name.startsWith(\"bw-\") ||\n    theme.name === \"executive\";\n  if (isMono) {\n    return i % 2 === 0 ? theme.palette.primary : theme.palette.secondary;\n  }\n  const lum = relativeLuminance(theme.palette.background);\n  const isDark = lum !== undefined ? lum < 0.5 : false;\n  const base = isDark ? SPECTRAL_PALETTE : LIGHT_PALETTE;\n  return base[i % base.length]!;\n}\n\nfunction valleyPinPath(cx: number, cy: number, r: number, cusp: number): string {\n  const tipY = cy + r + cusp;\n  return `M ${rhu(cx - r)} ${rhu(cy)} A ${r} ${r} 0 1 1 ${rhu(cx + r)} ${rhu(cy)} Q ${rhu(cx + r * 0.85)} ${rhu(cy + r * 0.65)} ${rhu(cx)} ${rhu(tipY)} Q ${rhu(cx - r * 0.85)} ${rhu(cy + r * 0.65)} ${rhu(cx - r)} ${rhu(cy)} Z`;\n}\n\nfunction peakPinPath(cx: number, cy: number, r: number): string {\n  return `M ${rhu(cx - r)} ${rhu(cy)} A ${r} ${r} 0 1 1 ${rhu(cx + r)} ${rhu(cy)} A ${r} ${r} 0 1 1 ${rhu(cx - r)} ${rhu(cy)} Z`;\n}\n\nexport function layoutWave(\n  ir: TimelineDocument,\n  theme: ResolvedTheme,\n  options?: LayoutOptions,\n): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin + 20;\n  const elements: SceneElement[] = [];\n\n  const entries = collectEntries(ir);\n  const n = Math.max(entries.length, 1);\n\n  // \u2500\u2500 Geometry Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const circleR = 26;\n  const innerR = 17;\n  const pinCusp = 14;\n  const ribbonWidth = 26;\n  const amplitude = 38;\n  const pitch = Math.max(160, rhuInt(typography.baseFontSize * 12));\n  const innerW = pitch - 20;\n\n  const titleFont = typography.baseFontSize;\n  const titleLH = rhuInt(titleFont * 1.3);\n  const dateFont = typography.smallFontSize;\n  const dateLH = rhuInt(dateFont * 1.3);\n\n  // Precompute colors for each node\n  const colors: Color[] = entries.map((e, i) => resolveNodeColor(i, n, theme, e));\n\n  // Precompute labels and height needs\n  const placed = entries.map((e) => {\n    const isSyntheticDate =\n      /^(?:date-|step-|activity-|milestone-|\\d+$)/i.test(e.date) || e.ord === 0;\n    const dateStr = !isSyntheticDate ? formatDate(e.date, 'axis') : undefined;\n    const titleLines = wrapText(e.label, titleFont, innerW, 2).lines;\n    const descLines = e.description ? wrapText(e.description, dateFont, innerW, 2).lines : [];\n    return {\n      ...e,\n      dateStr,\n      titleLines,\n      descLines,\n    };\n  });\n\n  const maxTitleLines = Math.max(1, ...placed.map((e) => e.titleLines.length));\n  const maxDescLines = Math.max(0, ...placed.map((e) => e.descLines.length));\n  const hasDates = placed.some((e) => e.dateStr !== undefined);\n\n  const labelStackH =\n    (hasDates ? dateLH + 4 : 0) +\n    maxTitleLines * titleLH +\n    (maxDescLines > 0 ? maxDescLines * dateLH + 4 : 0);\n\n  // Header geometry\n  const subtitle = typeof ir.metadata.subtitle === \"string\" ? ir.metadata.subtitle : undefined;\n  const title = ir.metadata.title;\n  const headerH = title\n    ? typography.titleFontSize + 8 + (subtitle ? typography.baseFontSize + 8 : 0) + 28\n    : 0;\n\n  // Vertical anchors\n  const y_center = margin + headerH + circleR + amplitude;\n  const y_peak = y_center - amplitude;\n  const y_valley = y_center + amplitude;\n\n  const leftX = margin + circleR + 10;\n  const nodeX = (i: number): number => leftX + i * pitch;\n  const nodeY = (i: number): number => (i % 2 === 0 ? y_valley : y_peak);\n\n  const totalW = rhuInt(nodeX(n - 1) + circleR + margin + 16);\n  const labelTopY = y_valley + circleR + pinCusp + 22;\n  const totalH = rhuInt(labelTopY + labelStackH + margin);\n\n  // \u2500\u2500 1. Header (Title & Subtitle) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (title) {\n    const titleY = margin + typography.titleFontSize;\n    elements.push(\n      p.text(title, totalW / 2, titleY, typography.titleFontSize + 6, palette.text, {\n        anchor: \"middle\",\n        weight: \"bold\",\n      }),\n    );\n    if (subtitle) {\n      elements.push(\n        p.text(subtitle, totalW / 2, titleY + typography.baseFontSize + 10, typography.baseFontSize, palette.textMuted, {\n          anchor: \"middle\",\n        }),\n      );\n    }\n  }\n\n  // Node coordinate array\n  const pts: { x: number; y: number }[] = Array.from({ length: n }, (_, i) => ({\n    x: nodeX(i),\n    y: nodeY(i),\n  }));\n\n  // \u2500\u2500 2. Continuous Wave Ribbon \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const defs: string[] = [];\n  if (n > 1) {\n    const gradId = \"triton-wave-ribbon-grad\";\n    const stops = colors\n      .map((c, idx) => {\n        const pct = rhu((idx / (n - 1)) * 100);\n        return `<stop offset=\"${pct}%\" stop-color=\"${c}\" />`;\n      })\n      .join(\"\");\n    defs.push(\n      `<linearGradient id=\"${gradId}\" gradientUnits=\"userSpaceOnUse\" x1=\"${rhu(pts[0]!.x)}\" y1=\"0\" x2=\"${rhu(pts[n - 1]!.x)}\" y2=\"0\">${stops}</linearGradient>`,\n    );\n\n    let d = `M ${rhu(pts[0]!.x)} ${rhu(pts[0]!.y)}`;\n    for (let i = 0; i < n - 1; i++) {\n      const p0 = pts[i]!;\n      const p1 = pts[i + 1]!;\n      const dx = p1.x - p0.x;\n      const cp1x = rhu(p0.x + dx * 0.5);\n      const cp1y = rhu(p0.y);\n      const cp2x = rhu(p1.x - dx * 0.5);\n      const cp2y = rhu(p1.y);\n      d += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${rhu(p1.x)} ${rhu(p1.y)}`;\n    }\n\n    elements.push(\n      p.path(d, `url(#${gradId})`, ribbonWidth),\n    );\n  }\n\n  // \u2500\u2500 3. Pins, Inner Medallions, Glyphs, and Labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n\n  for (let i = 0; i < n; i++) {\n    const pt = pts[i]!;\n    const color = colors[i]!;\n    const entry = placed[i]!;\n    const isValley = i % 2 === 0;\n\n    // Teardrop / Disc Pin Shape\n    const pinD = isValley\n      ? valleyPinPath(pt.x, pt.y, circleR, pinCusp)\n      : peakPinPath(pt.x, pt.y, circleR);\n\n    elements.push(p.path(pinD, color, 1, { fill: color }));\n\n    // Inner White Medallion Disc\n    elements.push(p.circle({ x: pt.x, y: pt.y }, innerR, \"#FFFFFF\", \"#FFFFFF\", 0));\n\n    // Glyph / Icon / Step Number inside Medallion\n    let renderedIcon = false;\n    if (entry.icon && options?.icons) {\n      const ref = parseIconRef(entry.icon);\n      if (ref.ok) {\n        const resolved = resolveIcon(ref.value, options.icons);\n        if (resolved.ok) {\n          const iconSize = 18;\n          elements.push(\n            p.icon(resolved.value, rhu(pt.x - iconSize / 2), rhu(pt.y - iconSize / 2), iconSize),\n          );\n          renderedIcon = true;\n        }\n      }\n    }\n\n    if (!renderedIcon) {\n      const stepNumber = String(i + 1).padStart(2, \"0\");\n      elements.push(\n        p.text(stepNumber, pt.x, pt.y + 4.5, 12, \"#1E293B\", {\n          anchor: \"middle\",\n          weight: \"bold\",\n        }),\n      );\n    }\n\n    // Node Labels (placed below the wave ribbon)\n    let curY = labelTopY;\n\n    if (entry.dateStr) {\n      elements.push(\n        p.text(entry.dateStr, pt.x, curY, dateFont, palette.textMuted, {\n          anchor: \"middle\",\n        }),\n      );\n      curY += dateLH + 2;\n    }\n\n    for (let li = 0; li < entry.titleLines.length; li++) {\n      const lineText = entry.titleLines[li] ?? \"\";\n      elements.push(\n        p.text(lineText, pt.x, curY + li * titleLH, titleFont, palette.text, {\n          anchor: \"middle\",\n          weight: \"bold\",\n        }),\n      );\n    }\n    curY += entry.titleLines.length * titleLH;\n\n    for (let li = 0; li < entry.descLines.length; li++) {\n      const lineText = entry.descLines[li] ?? \"\";\n      elements.push(\n        p.text(lineText, pt.x, curY + li * dateLH, dateFont, palette.textMuted, {\n          anchor: \"middle\",\n        }),\n      );\n    }\n\n    // Anchor registry\n    anchors[entry.id] = {\n      bounds: {\n        x: pt.x - circleR,\n        y: pt.y - circleR,\n        width: circleR * 2,\n        height: isValley ? circleR * 2 + pinCusp : circleR * 2,\n      },\n    };\n  }\n\n  // \u2500\u2500 4. Overlays & Final Scene \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const baseScene: Scene = {\n    viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n    background: palette.background,\n    elements,\n    ...(defs.length > 0 ? { defs } : {}),\n  };\n\n  const finalScene = applyOverlays(baseScene, (ir as any).overlays, theme);\n\n  return { scene: finalScene, anchors };\n}\n", "import type { TimelineDocument, Activity, Milestone, Section, Track } from './ir.js';\nimport type { Scene, SceneElement, Rect, Point, LayoutResult, LayoutOptions } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { pen } from '../../../scene/build.js';\nimport { parseIRDate, coerceLeft, dateToOrdinal } from '../../../time/dates.js';\nimport { layoutVerticalSpine } from './vertical-spine.js';\nimport { layoutSerpentine } from './serpentine.js';\nimport { layoutRoadmap } from './roadmap.js';\nimport { layoutTimelineColumns } from './timeline-columns.js';\nimport { layoutNumbered } from './numbered.js';\nimport { layoutWave } from './wave.js';\n\n// \u2500\u2500\u2500 Public Entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layoutTimeline(\n  ir: TimelineDocument,\n  theme: ResolvedTheme,\n  options?: LayoutOptions,\n): LayoutResult {\n  switch (ir.layout) {\n    case 'vertical-spine':\n      return layoutVerticalSpine(ir, theme);\n    case 'serpentine':\n      return layoutSerpentine(ir, theme);\n    case 'roadmap':\n      return layoutRoadmap(ir, theme);\n    case 'timeline-columns':\n      return layoutTimelineColumns(ir, theme);\n    case 'numbered':\n      return layoutNumbered(ir, theme);\n    case 'wave':\n    case 'undulating':\n      return layoutWave(ir, theme, options);\n    case 'horizontal':\n    default:\n      return layoutHorizontal(ir, theme);\n  }\n}\n\n// \u2500\u2500\u2500 Horizontal Layout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction layoutHorizontal(ir: TimelineDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const elements: SceneElement[] = [];\n\n  const charWidth = typography.smallFontSize * 0.6;\n  const minBarW = 60;\n  const barPadding = 16;\n  const slotGap = 24; // minimum gap between date slots\n  const staggerGap = 8; // gap between staggered bars at same date\n  const trackHeight = 36;\n  const trackPad = 8;\n  const milestoneR = 8;\n\n  const trackOrder = ir.tracks.map((t) => t.id);\n  const trackIndex = new Map(trackOrder.map((id, i) => [id, i]));\n\n  // \u2500\u2500 Pass 1: Measure \u2014 how much width does each date slot need? \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  // Collect all unique dates sorted by numeric value\n  const dateMap = buildDateMap([\n    ...ir.milestones.map((m) => m.date),\n    ...ir.activities.flatMap((a) => [a.start, ...(a.end ? [a.end] : [])]),\n    ...(ir.sections?.flatMap((s) => [s.start, s.end]) ?? []),\n  ]);\n\n  const sortedDates = [\n    ...new Set([\n      ...ir.milestones.map((m) => m.date),\n      ...ir.activities.map((a) => a.start),\n      ...ir.activities.filter((a) => a.end).map((a) => a.end!),\n      ...(ir.sections?.flatMap((s) => [s.start, s.end]) ?? []),\n    ]),\n  ].sort((a, b) => dateMap.toNum(a) - dateMap.toNum(b));\n\n  // Compute bar width for a single activity\n  function actBarWidth(act: Activity): number {\n    const textW = act.label.length * charWidth + barPadding;\n    return Math.max(textW, minBarW);\n  }\n\n  // Group activities by start date (across all tracks at each date)\n  const activitiesAtDate = new Map<string, Activity[]>();\n  for (const act of ir.activities) {\n    if (!activitiesAtDate.has(act.start)) activitiesAtDate.set(act.start, []);\n    activitiesAtDate.get(act.start)!.push(act);\n  }\n\n  // For each date, compute total width needed (widest track group)\n  const slotWidth = new Map<string, number>();\n  for (const date of sortedDates) {\n    const acts = activitiesAtDate.get(date);\n    if (!acts || acts.length === 0) {\n      slotWidth.set(date, 0);\n      continue;\n    }\n\n    // Group by track within this date \u2014 bars on different tracks don't compete horizontally\n    const byTrack = new Map<string, Activity[]>();\n    for (const a of acts) {\n      if (!byTrack.has(a.track)) byTrack.set(a.track, []);\n      byTrack.get(a.track)!.push(a);\n    }\n\n    // The widest track group determines the slot width\n    let widest = 0;\n    for (const [, trackActs] of byTrack) {\n      let w = 0;\n      for (let i = 0; i < trackActs.length; i++) {\n        if (i > 0) w += staggerGap;\n        w += actBarWidth(trackActs[i]!);\n      }\n      widest = Math.max(widest, w);\n    }\n    slotWidth.set(date, widest);\n  }\n\n  // \u2500\u2500 Pass 2: Position \u2014 assign x coordinates respecting content widths \u2500\u2500\u2500\u2500\u2500\n\n  const axisLeft = margin + 20;\n  const dateX = new Map<string, number>();\n\n  // Walk left to right: each date gets x = max(proportional, previous + previous_width + gap)\n  // range is in day-ordinals; ~80px per year keeps the prior visual density.\n  const totalProportionalW = Math.max(400, (dateMap.range / 365) * 80);\n  let cursor = axisLeft;\n\n  for (let i = 0; i < sortedDates.length; i++) {\n    const date = sortedDates[i]!;\n    const proportionalX =\n      axisLeft + ((dateMap.toNum(date) - dateMap.min) / (dateMap.range || 1)) * totalProportionalW;\n    const x = Math.max(proportionalX, cursor);\n    dateX.set(date, x);\n    cursor = x + (slotWidth.get(date) ?? 0) + slotGap;\n  }\n\n  const axisRight = cursor - slotGap + margin;\n  const axisY = margin + (ir.metadata.title ? typography.titleFontSize + 16 : 0) + 60;\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Section backgrounds (positioned from child date extents) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.sections) {\n    const bgHeight = 50 + trackOrder.length * (trackHeight + trackPad) + 40;\n    for (const sec of ir.sections) {\n      const sx = dateX.get(sec.start) ?? axisLeft;\n      const endDateX = dateX.get(sec.end) ?? sx;\n      const endSlotW = slotWidth.get(sec.end) ?? 0;\n      const ex = endDateX + Math.max(endSlotW, 20);\n      elements.push(\n        p.rect(\n          { x: sx - 8, y: axisY - 50, width: ex - sx + 16, height: bgHeight },\n          palette.primary + '0A',\n          palette.primary + '33',\n          1,\n          { rx: 4 },\n        ),\n      );\n      elements.push(\n        p.text(sec.label, sx - 2, axisY - 36, typography.smallFontSize, palette.primary, {\n          weight: 'bold',\n        }),\n      );\n    }\n  }\n\n  // \u2500\u2500 Axis line \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(p.path(`M ${axisLeft} ${axisY} L ${axisRight} ${axisY}`, palette.border, 2));\n\n  // \u2500\u2500 Track labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Suppress the label for an implicit single \"default\" track \u2014 it's noise, not\n  // an authored lane name.\n  const showTrackLabels = !(trackOrder.length === 1 && trackOrder[0] === 'default');\n  if (showTrackLabels) {\n    for (let i = 0; i < trackOrder.length; i++) {\n      const track = ir.tracks.find((t) => t.id === trackOrder[i]);\n      if (!track) continue;\n      const laneY = axisY + milestoneR + trackPad + i * (trackHeight + trackPad);\n      elements.push(\n        p.text(\n          track.label,\n          margin,\n          laneY + trackHeight / 2 + typography.smallFontSize * 0.4,\n          typography.smallFontSize,\n          palette.textMuted,\n        ),\n      );\n    }\n  }\n\n  // \u2500\u2500 Activities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Track the running offset within each (track, date) group\n  const slotCursor = new Map<string, number>();\n\n  for (const act of ir.activities) {\n    const tIdx = trackIndex.get(act.track) ?? 0;\n    const laneY = axisY + milestoneR + trackPad + tIdx * (trackHeight + trackPad);\n    const sx = dateX.get(act.start) ?? axisLeft;\n\n    const barW = act.end\n      ? Math.max((dateX.get(act.end) ?? sx) - sx, actBarWidth(act))\n      : actBarWidth(act);\n\n    // Stagger: accumulate previous bars' widths within this (track, date)\n    const groupKey = `${act.track}:${act.start}`;\n    const offset = slotCursor.get(groupKey) ?? 0;\n    slotCursor.set(groupKey, offset + barW + staggerGap);\n\n    const barX = sx + offset;\n    const barH = trackHeight - 4;\n    const barY = laneY + 2;\n\n    const fill = activityFill(act, palette);\n    elements.push(\n      p.rect({ x: barX, y: barY, width: barW, height: barH }, fill, palette.border, 1, { rx: 4 }),\n    );\n    elements.push(\n      p.text(\n        act.label,\n        barX + barW / 2,\n        barY + barH / 2 + typography.smallFontSize * 0.4,\n        typography.smallFontSize,\n        palette.text,\n        { anchor: 'middle' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Milestones \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const ms of ir.milestones) {\n    const mx = dateX.get(ms.date) ?? axisLeft;\n    const my = axisY;\n    const r = milestoneR;\n\n    elements.push(\n      p.path(\n        `M ${mx} ${my - r} L ${mx + r} ${my} L ${mx} ${my + r} L ${mx - r} ${my} Z`,\n        palette.background,\n        1,\n        { fill: palette.primary },\n      ),\n    );\n    elements.push(\n      p.text(ms.date, mx, my - r - 6, typography.smallFontSize, palette.textMuted, {\n        anchor: 'middle',\n      }),\n    );\n    elements.push(\n      p.text(\n        ms.label,\n        mx,\n        my + r + typography.baseFontSize + 2,\n        typography.baseFontSize,\n        palette.text,\n        { anchor: 'middle' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 ViewBox \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const numTracks = Math.max(trackOrder.length, 1);\n  const totalH =\n    axisY +\n    milestoneR +\n    trackPad +\n    numTracks * (trackHeight + trackPad) +\n    typography.baseFontSize +\n    20 +\n    margin;\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: axisRight + margin, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n\n// \u2500\u2500\u2500 Date Mapping \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface DateMapping {\n  toNum: (date: string) => number;\n  min: number;\n  max: number;\n  range: number;\n}\n\n/** Day-ordinal of a date's period start, or NaN when it isn't a real date. */\nfunction tryOrdinal(date: string): number {\n  try {\n    const [y, m, d] = coerceLeft(parseIRDate(date));\n    return dateToOrdinal(y, m, d);\n  } catch {\n    return NaN;\n  }\n}\n\n/**\n * Map IR dates to the shared day-ordinal axis (days since 2000-01-01). When no\n * value parses as a date, fall back to a sequential index so plain-label\n * timelines still lay out left\u2192right.\n */\nfunction buildDateMap(dates: string[]): DateMapping {\n  const unique = [...new Set(dates)];\n  const ords = unique.map(tryOrdinal);\n  const valid = ords.filter((n) => !isNaN(n));\n\n  if (valid.length > 0) {\n    const min = Math.min(...valid);\n    const max = Math.max(...valid);\n    const range = max - min || 1;\n    return {\n      toNum: (d) => {\n        const n = tryOrdinal(d);\n        return isNaN(n) ? min : n;\n      },\n      min,\n      max,\n      range,\n    };\n  }\n\n  // Sequential fallback: map to index\n  const order = new Map(unique.map((d, i) => [d, i]));\n  return {\n    toNum: (d) => order.get(d) ?? 0,\n    min: 0,\n    max: unique.length - 1,\n    range: unique.length,\n  };\n}\n\nfunction activityFill(act: Activity, palette: ResolvedTheme['palette']): string {\n  switch (act.status) {\n    case 'active':\n      return palette.primary + '33';\n    case 'done':\n      return palette.success + '33';\n    case 'blocked':\n      return palette.error + '33';\n    default:\n      return palette.surface;\n  }\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function slugify(text) {\n    return text\n      .toLowerCase()\n      .replace(/[^a-z0-9]+/g, '-')\n      .replace(/^-|-$/g, '') || '';\n  }\n\n  const tracks     = new Map();\n  const activities = [];\n  const milestones = [];\n  const sections   = [];\n  const overlays   = [];\n  let actCounter  = 0;\n  let msCounter   = 0;\n  let secCounter  = 0;\n  let currentSec  = null;\n\n  function ensureTrack(id) {\n    if (!id) id = 'default';\n    if (!tracks.has(id)) tracks.set(id, { id, label: id.charAt(0).toUpperCase() + id.slice(1) });\n    return id;\n  }\n\n  function addActivity(start, end, label, status, trackId, description) {\n    actCounter++;\n    activities.push({\n      id: slugify(label) || `activity-${actCounter}`,\n      label, track: ensureTrack(trackId),\n      start, end: end || undefined,\n      status: status || 'default',\n      ...(description ? { description } : {}),\n    });\n  }\n\n  function addMilestone(date, label, trackId, description) {\n    msCounter++;\n    milestones.push({\n      id: slugify(label) || `milestone-${msCounter}`,\n      label, date,\n      track: trackId ? ensureTrack(trackId) : undefined,\n      ...(description ? { description } : {}),\n    });\n  }\n\n  function openSection(label) {\n    secCounter++;\n    currentSec = { id: slugify(label) || `section-${secCounter}`, label, start: null, end: null };\n  }\n\n  function updateSectionDate(date) {\n    if (currentSec) {\n      if (!currentSec.start) currentSec.start = date;\n      currentSec.end = date;\n    }\n  }\n\n  function closeSection() {\n    if (currentSec && currentSec.start) {\n      sections.push(currentSec);\n    }\n    currentSec = null;\n  }\n\n  function reset() {\n    tracks.clear();\n    activities.length = 0;\n    milestones.length = 0;\n    sections.length   = 0;\n    overlays.length   = 0;\n    actCounter  = 0;\n    msCounter   = 0;\n    secCounter  = 0;\n    currentSec  = null;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"timeline\";\n  var peg$c1 = \"title\";\n  var peg$c2 = \"subtitle\";\n  var peg$c3 = \"theme\";\n  var peg$c4 = \"layout\";\n  var peg$c5 = \"axisUnit\";\n  var peg$c6 = \"---\";\n  var peg$c7 = \"section\";\n  var peg$c8 = \":\";\n  var peg$c9 = \"--\";\n  var peg$c10 = \"@\";\n  var peg$c11 = \"|\";\n  var peg$c12 = \"milestone\";\n  var peg$c13 = \"active\";\n  var peg$c14 = \"done\";\n  var peg$c15 = \"blocked\";\n  var peg$c16 = \"default\";\n  var peg$c17 = \"note\";\n  var peg$c18 = \"callout\";\n  var peg$c19 = \"\\\"\";\n  var peg$c20 = \"at\";\n  var peg$c21 = \"offset\";\n  var peg$c22 = \",\";\n  var peg$c23 = \"-\";\n  var peg$c24 = \"legend\";\n  var peg$c25 = \"end\";\n  var peg$c26 = \"bottom-right\";\n  var peg$c27 = \"bottom-left\";\n  var peg$c28 = \"top-right\";\n  var peg$c29 = \"top-left\";\n  var peg$c30 = \"%%\";\n  var peg$c31 = \"\\r\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^:\\n@|]/;\n  var peg$r2 = /^[a-zA-Z0-9_\\-\\/.]/;\n  var peg$r3 = /^[a-zA-Z_]/;\n  var peg$r4 = /^[a-zA-Z0-9_\\-]/;\n  var peg$r5 = /^[^\"]/;\n  var peg$r6 = /^[0-9]/;\n  var peg$r7 = /^[a-zA-Z0-9_]/;\n  var peg$r8 = /^[^:\\n]/;\n  var peg$r9 = /^[ \\t]/;\n  var peg$r10 = /^[\\n\\r]/;\n\n  var peg$e0 = peg$literalExpectation(\"timeline\", false);\n  var peg$e1 = peg$literalExpectation(\"title\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"subtitle\", false);\n  var peg$e4 = peg$literalExpectation(\"theme\", false);\n  var peg$e5 = peg$literalExpectation(\"layout\", false);\n  var peg$e6 = peg$literalExpectation(\"axisUnit\", false);\n  var peg$e7 = peg$literalExpectation(\"---\", false);\n  var peg$e8 = peg$literalExpectation(\"section\", false);\n  var peg$e9 = peg$literalExpectation(\":\", false);\n  var peg$e10 = peg$literalExpectation(\"--\", false);\n  var peg$e11 = peg$literalExpectation(\"@\", false);\n  var peg$e12 = peg$literalExpectation(\"|\", false);\n  var peg$e13 = peg$classExpectation([\":\", \"\\n\", \"@\", \"|\"], true, false);\n  var peg$e14 = peg$literalExpectation(\"milestone\", false);\n  var peg$e15 = peg$literalExpectation(\"active\", false);\n  var peg$e16 = peg$literalExpectation(\"done\", false);\n  var peg$e17 = peg$literalExpectation(\"blocked\", false);\n  var peg$e18 = peg$literalExpectation(\"default\", false);\n  var peg$e19 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\", \"/\", \".\"], false, false);\n  var peg$e20 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], \"_\"], false, false);\n  var peg$e21 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e22 = peg$literalExpectation(\"note\", false);\n  var peg$e23 = peg$literalExpectation(\"callout\", false);\n  var peg$e24 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e25 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e26 = peg$literalExpectation(\"at\", false);\n  var peg$e27 = peg$literalExpectation(\"offset\", false);\n  var peg$e28 = peg$literalExpectation(\",\", false);\n  var peg$e29 = peg$literalExpectation(\"-\", false);\n  var peg$e30 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e31 = peg$literalExpectation(\"legend\", false);\n  var peg$e32 = peg$literalExpectation(\"end\", false);\n  var peg$e33 = peg$literalExpectation(\"bottom-right\", false);\n  var peg$e34 = peg$literalExpectation(\"bottom-left\", false);\n  var peg$e35 = peg$literalExpectation(\"top-right\", false);\n  var peg$e36 = peg$literalExpectation(\"top-left\", false);\n  var peg$e37 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e38 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e39 = peg$literalExpectation(\"%%\", false);\n  var peg$e40 = peg$anyExpectation();\n  var peg$e41 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e42 = peg$literalExpectation(\"\\r\\n\", false);\n  var peg$e43 = peg$classExpectation([\"\\n\", \"\\r\"], false, false);\n\n  var peg$f0 = function(fm, header, directives, body) {\n      closeSection();\n      const titleDir = directives.find(d => d && d.key === 'title');\n      const subtitleDir = directives.find(d => d && d.key === 'subtitle');\n      const themeDir = directives.find(d => d && d.key === 'theme');\n      const layoutDir = directives.find(d => d && d.key === 'layout');\n      return {\n        version:  '1.0',\n        metadata: {\n          ...(fm || {}),\n          ...(titleDir ? { title: titleDir.value } : {}),\n          ...(subtitleDir ? { subtitle: subtitleDir.value } : {}),\n          ...(themeDir ? { theme: themeDir.value } : {}),\n        },\n        layout:   layoutDir ? layoutDir.value : 'horizontal',\n        tracks:   tracks.size > 0 ? [...tracks.values()] : [{ id: 'default', label: 'Default' }],\n        activities, milestones,\n        sections: sections.length > 0 ? sections : undefined,\n        overlays,\n      };\n    };\n  var peg$f1 = function() { return 'timeline'; };\n  var peg$f2 = function(value) { return { key: 'title', value: value.trim().replace(/^[\"']|[\"']$/g, '') }; };\n  var peg$f3 = function(value) { return { key: 'subtitle', value: value.trim().replace(/^[\"']|[\"']$/g, '') }; };\n  var peg$f4 = function(value) { return { key: 'theme', value: value.trim().replace(/^[\"']|[\"']$/g, '') }; };\n  var peg$f5 = function() { return ext; };\n  var peg$f6 = function(key, value) { return { key, value: value.trim() }; };\n  var peg$f7 = function() { return ext; };\n  var peg$f8 = function(line) { return line; };\n  var peg$f9 = function(lines) {\n      const meta = {};\n      for (const line of lines) {\n        const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/);\n        if (m) meta[m[1]] = m[2];\n      }\n      return meta;\n    };\n  var peg$f10 = function(items) { return items.filter(Boolean); };\n  var peg$f11 = function(label) {\n      closeSection();\n      openSection(label.trim());\n      return null;\n    };\n  var peg$f12 = function(entry) { return entry; };\n  var peg$f13 = function(date, label) {\n      addActivity(date, null, label, 'default', null);\n      updateSectionDate(date);\n      return { type: 'activity', label };\n    };\n  var peg$f14 = function(text) { return text.trim(); };\n  var peg$f15 = function() { return ext; };\n  var peg$f16 = function(entry) { return entry; };\n  var peg$f17 = function(start, end, label, s) { return s; };\n  var peg$f18 = function(start, end, label, status, id) { return id; };\n  var peg$f19 = function(start, end, label, status, track, d) { return d; };\n  var peg$f20 = function(start, end, label, status, track, desc) {\n      addActivity(start, end, label, status, track, desc);\n      updateSectionDate(start);\n      updateSectionDate(end);\n      return { type: 'activity', label };\n    };\n  var peg$f21 = function(date, label, kind, id) { return id; };\n  var peg$f22 = function(date, label, kind, track, d) { return d; };\n  var peg$f23 = function(date, label, kind, track, desc) {\n      if (kind === 'milestone') addMilestone(date, label, track, desc);\n      else addActivity(date, null, label, kind, track, desc);\n      updateSectionDate(date);\n      return { type: kind === 'milestone' ? 'milestone' : 'activity', label };\n    };\n  var peg$f24 = function(text) { return text.trim(); };\n  var peg$f25 = function(text) { return text.trim(); };\n  var peg$f26 = function(kind, text, t) { return t; };\n  var peg$f27 = function(kind, text, target, offset) {\n      const note = { type: kind, text, target, offset: offset || undefined };\n      overlays.push(note);\n      return note;\n    };\n  var peg$f28 = function(dx, dy) { return { dx, dy }; };\n  var peg$f29 = function(sign, digits) { return parseInt((sign || '') + digits, 10); };\n  var peg$f30 = function(corner, t) { return t; };\n  var peg$f31 = function(corner, title, entries) {\n      const legend = { type: 'legend', corner, title: title || undefined, entries };\n      overlays.push(legend);\n      return legend;\n    };\n  var peg$f32 = function(key, value) { return { key: key.trim(), value: value.trim() }; };\n  var peg$f33 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parseExtFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = peg$parseHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parse_();\n      s5 = [];\n      s6 = peg$parseDirective();\n      while (s6 !== peg$FAILED) {\n        s5.push(s6);\n        s6 = peg$parseDirective();\n      }\n      s6 = peg$parse_();\n      s7 = peg$parseBody();\n      s8 = peg$parse_();\n      peg$savedPos = s0;\n      s0 = peg$f0(s1, s3, s5, s7);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHeader() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f1();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDirective() {\n    var s0;\n\n    s0 = peg$parseExtDirective();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseMermaidDirective();\n    }\n\n    return s0;\n  }\n\n  function peg$parseMermaidDirective() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 5) === peg$c1) {\n      s2 = peg$c1;\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.substr(peg$currPos, 8) === peg$c2) {\n        s2 = peg$c2;\n        peg$currPos += 8;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$currPos;\n          s5 = [];\n          s6 = input.charAt(peg$currPos);\n          if (peg$r0.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s6 !== peg$FAILED) {\n            while (s6 !== peg$FAILED) {\n              s5.push(s6);\n              s6 = input.charAt(peg$currPos);\n              if (peg$r0.test(s6)) {\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n          } else {\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s4 = input.substring(s4, peg$currPos);\n          } else {\n            s4 = s5;\n          }\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parse_();\n            s6 = peg$parseLineEnd();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f3(s4);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parse_();\n        if (input.substr(peg$currPos, 5) === peg$c3) {\n          s2 = peg$c3;\n          peg$currPos += 5;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parse__();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$currPos;\n            s5 = [];\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            if (s6 !== peg$FAILED) {\n              while (s6 !== peg$FAILED) {\n                s5.push(s6);\n                s6 = input.charAt(peg$currPos);\n                if (peg$r0.test(s6)) {\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e2); }\n                }\n              }\n            } else {\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              s4 = input.substring(s4, peg$currPos);\n            } else {\n              s4 = s5;\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parse_();\n              s6 = peg$parseLineEnd();\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f4(s4);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtDirective() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    peg$savedPos = peg$currPos;\n    s1 = peg$f5();\n    if (s1) {\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.substr(peg$currPos, 6) === peg$c4) {\n        s3 = peg$c4;\n        peg$currPos += 6;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s3 === peg$FAILED) {\n        if (input.substr(peg$currPos, 8) === peg$c5) {\n          s3 = peg$c5;\n          peg$currPos += 8;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse__();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parse_();\n            s7 = peg$parseLineEnd();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f6(s3, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    peg$savedPos = peg$currPos;\n    s1 = peg$f7();\n    if (s1) {\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c6) {\n        s2 = peg$c6;\n        peg$currPos += 3;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseNL();\n        if (s3 !== peg$FAILED) {\n          s4 = [];\n          s5 = peg$currPos;\n          s6 = peg$currPos;\n          peg$silentFails++;\n          s7 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c6) {\n            s8 = peg$c6;\n            peg$currPos += 3;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parseNL();\n            if (s9 !== peg$FAILED) {\n              s8 = [s8, s9];\n              s7 = s8;\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s7 === peg$FAILED) {\n            s6 = undefined;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$currPos;\n            s8 = [];\n            s9 = input.charAt(peg$currPos);\n            if (peg$r0.test(s9)) {\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s9 !== peg$FAILED) {\n              s8.push(s9);\n              s9 = input.charAt(peg$currPos);\n              if (peg$r0.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s7 = input.substring(s7, peg$currPos);\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              peg$savedPos = s5;\n              s5 = peg$f8(s7);\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = peg$currPos;\n            s6 = peg$currPos;\n            peg$silentFails++;\n            s7 = peg$currPos;\n            if (input.substr(peg$currPos, 3) === peg$c6) {\n              s8 = peg$c6;\n              peg$currPos += 3;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parseNL();\n              if (s9 !== peg$FAILED) {\n                s8 = [s8, s9];\n                s7 = s8;\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n            peg$silentFails--;\n            if (s7 === peg$FAILED) {\n              s6 = undefined;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n            if (s6 !== peg$FAILED) {\n              s7 = peg$currPos;\n              s8 = [];\n              s9 = input.charAt(peg$currPos);\n              if (peg$r0.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n              while (s9 !== peg$FAILED) {\n                s8.push(s9);\n                s9 = input.charAt(peg$currPos);\n                if (peg$r0.test(s9)) {\n                  peg$currPos++;\n                } else {\n                  s9 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e2); }\n                }\n              }\n              s7 = input.substring(s7, peg$currPos);\n              s8 = peg$parseNL();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s5;\n                s5 = peg$f8(s7);\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          }\n          if (input.substr(peg$currPos, 3) === peg$c6) {\n            s5 = peg$c6;\n            peg$currPos += 3;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseNL();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f9(s4);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBody() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseNoteDirective();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseLegendBlock();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseSectionHeader();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseEntry();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseNoteDirective();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseLegendBlock();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseSectionHeader();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseEntry();\n            if (s2 === peg$FAILED) {\n              s2 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f10(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseSectionHeader() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 7) === peg$c7) {\n      s2 = peg$c7;\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f11(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEntry() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseExtEntry();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseMermaidEntry();\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseComment();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f12(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMermaidEntry() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseDateToken();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c8;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseMermaidLabel();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f13(s1, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMermaidLabel() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r0.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f14(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseExtEntry() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    peg$savedPos = peg$currPos;\n    s1 = peg$f15();\n    if (s1) {\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseExtRangeActivity();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseExtPointEntry();\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f16(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtRangeActivity() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16;\n\n    s0 = peg$currPos;\n    s1 = peg$parseDateToken();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.substr(peg$currPos, 2) === peg$c9) {\n        s3 = peg$c9;\n        peg$currPos += 2;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseDateToken();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s7 = peg$c8;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseExtLabel();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s12 = peg$c8;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e9); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseExtStatus();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s10;\n                  s10 = peg$f17(s1, s5, s9, s14);\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              s11 = peg$currPos;\n              s12 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s13 = peg$c10;\n                peg$currPos++;\n              } else {\n                s13 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e11); }\n              }\n              if (s13 !== peg$FAILED) {\n                s14 = peg$parseIdentifier();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s11;\n                  s11 = peg$f18(s1, s5, s9, s10, s14);\n                } else {\n                  peg$currPos = s11;\n                  s11 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s11;\n                s11 = peg$FAILED;\n              }\n              if (s11 === peg$FAILED) {\n                s11 = null;\n              }\n              s12 = peg$currPos;\n              s13 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 124) {\n                s14 = peg$c11;\n                peg$currPos++;\n              } else {\n                s14 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e12); }\n              }\n              if (s14 !== peg$FAILED) {\n                s15 = peg$parse_();\n                s16 = peg$parseDescText();\n                if (s16 !== peg$FAILED) {\n                  peg$savedPos = s12;\n                  s12 = peg$f19(s1, s5, s9, s10, s11, s16);\n                } else {\n                  peg$currPos = s12;\n                  s12 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s12;\n                s12 = peg$FAILED;\n              }\n              if (s12 === peg$FAILED) {\n                s12 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f20(s1, s5, s9, s10, s11, s12);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtPointEntry() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14;\n\n    s0 = peg$currPos;\n    s1 = peg$parseDateToken();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c8;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseExtLabel();\n        if (s5 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s6 = peg$c8;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            s8 = peg$parseExtEntryKind();\n            if (s8 !== peg$FAILED) {\n              s9 = peg$currPos;\n              s10 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s11 = peg$c10;\n                peg$currPos++;\n              } else {\n                s11 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e11); }\n              }\n              if (s11 !== peg$FAILED) {\n                s12 = peg$parseIdentifier();\n                if (s12 !== peg$FAILED) {\n                  peg$savedPos = s9;\n                  s9 = peg$f21(s1, s5, s8, s12);\n                } else {\n                  peg$currPos = s9;\n                  s9 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s9;\n                s9 = peg$FAILED;\n              }\n              if (s9 === peg$FAILED) {\n                s9 = null;\n              }\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 124) {\n                s12 = peg$c11;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e12); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseDescText();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s10;\n                  s10 = peg$f22(s1, s5, s8, s9, s14);\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f23(s1, s5, s8, s9, s10);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtLabel() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r1.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f24(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseDescText() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r0.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f25(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseExtEntryKind() {\n    var s0;\n\n    if (input.substr(peg$currPos, 9) === peg$c12) {\n      s0 = peg$c12;\n      peg$currPos += 9;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseExtStatus();\n    }\n\n    return s0;\n  }\n\n  function peg$parseExtStatus() {\n    var s0;\n\n    if (input.substr(peg$currPos, 6) === peg$c13) {\n      s0 = peg$c13;\n      peg$currPos += 6;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c14) {\n        s0 = peg$c14;\n        peg$currPos += 4;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 7) === peg$c15) {\n          s0 = peg$c15;\n          peg$currPos += 7;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 7) === peg$c16) {\n            s0 = peg$c16;\n            peg$currPos += 7;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e18); }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseDateToken() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e19); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdentifier() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r4.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r4.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteDirective() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 4) === peg$c17) {\n      s2 = peg$c17;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s2 === peg$FAILED) {\n      if (input.substr(peg$currPos, 7) === peg$c18) {\n        s2 = peg$c18;\n        peg$currPos += 7;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 34) {\n          s4 = peg$c19;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r5.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e25); }\n          }\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = input.charAt(peg$currPos);\n            if (peg$r5.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e25); }\n            }\n          }\n          s5 = input.substring(s5, peg$currPos);\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s6 = peg$c19;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e24); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse__();\n            if (s7 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 2) === peg$c20) {\n                s8 = peg$c20;\n                peg$currPos += 2;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e26); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parse__();\n                if (s9 !== peg$FAILED) {\n                  s10 = peg$currPos;\n                  if (input.charCodeAt(peg$currPos) === 34) {\n                    s11 = peg$c19;\n                    peg$currPos++;\n                  } else {\n                    s11 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e24); }\n                  }\n                  if (s11 !== peg$FAILED) {\n                    s12 = peg$currPos;\n                    s13 = [];\n                    s14 = input.charAt(peg$currPos);\n                    if (peg$r5.test(s14)) {\n                      peg$currPos++;\n                    } else {\n                      s14 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n                    }\n                    while (s14 !== peg$FAILED) {\n                      s13.push(s14);\n                      s14 = input.charAt(peg$currPos);\n                      if (peg$r5.test(s14)) {\n                        peg$currPos++;\n                      } else {\n                        s14 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n                      }\n                    }\n                    s12 = input.substring(s12, peg$currPos);\n                    if (input.charCodeAt(peg$currPos) === 34) {\n                      s13 = peg$c19;\n                      peg$currPos++;\n                    } else {\n                      s13 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n                    }\n                    if (s13 !== peg$FAILED) {\n                      peg$savedPos = s10;\n                      s10 = peg$f26(s2, s5, s12);\n                    } else {\n                      peg$currPos = s10;\n                      s10 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s10;\n                    s10 = peg$FAILED;\n                  }\n                  if (s10 === peg$FAILED) {\n                    s10 = peg$currPos;\n                    s11 = [];\n                    s12 = input.charAt(peg$currPos);\n                    if (peg$r2.test(s12)) {\n                      peg$currPos++;\n                    } else {\n                      s12 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                    }\n                    if (s12 !== peg$FAILED) {\n                      while (s12 !== peg$FAILED) {\n                        s11.push(s12);\n                        s12 = input.charAt(peg$currPos);\n                        if (peg$r2.test(s12)) {\n                          peg$currPos++;\n                        } else {\n                          s12 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                        }\n                      }\n                    } else {\n                      s11 = peg$FAILED;\n                    }\n                    if (s11 !== peg$FAILED) {\n                      s10 = input.substring(s10, peg$currPos);\n                    } else {\n                      s10 = s11;\n                    }\n                  }\n                  if (s10 !== peg$FAILED) {\n                    s11 = peg$parseNoteOffset();\n                    if (s11 === peg$FAILED) {\n                      s11 = null;\n                    }\n                    s12 = peg$parse_();\n                    s13 = peg$parseComment();\n                    if (s13 === peg$FAILED) {\n                      s13 = null;\n                    }\n                    s14 = peg$parseLineEnd();\n                    if (s14 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f27(s2, s5, s10, s11);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteOffset() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parse__();\n    if (s1 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c21) {\n        s2 = peg$c21;\n        peg$currPos += 6;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e27); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseSignedInt();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s6 = peg$c22;\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e28); }\n            }\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse_();\n              s8 = peg$parseSignedInt();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f28(s4, s8);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSignedInt() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s1 = peg$c23;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r6.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e30); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r6.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e30); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f29(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 6) === peg$c24) {\n      s2 = peg$c24;\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseLegendCornerToken();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 34) {\n            s7 = peg$c19;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e24); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$currPos;\n            s9 = [];\n            s10 = input.charAt(peg$currPos);\n            if (peg$r5.test(s10)) {\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e25); }\n            }\n            while (s10 !== peg$FAILED) {\n              s9.push(s10);\n              s10 = input.charAt(peg$currPos);\n              if (peg$r5.test(s10)) {\n                peg$currPos++;\n              } else {\n                s10 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e25); }\n              }\n            }\n            s8 = input.substring(s8, peg$currPos);\n            if (input.charCodeAt(peg$currPos) === 34) {\n              s9 = peg$c19;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e24); }\n            }\n            if (s9 !== peg$FAILED) {\n              peg$savedPos = s5;\n              s5 = peg$f30(s4, s8);\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parse_();\n          s7 = peg$parseLineEnd();\n          if (s7 !== peg$FAILED) {\n            s8 = [];\n            s9 = peg$parseLegendEntryLine();\n            while (s9 !== peg$FAILED) {\n              s8.push(s9);\n              s9 = peg$parseLegendEntryLine();\n            }\n            s9 = peg$parse_();\n            if (input.substr(peg$currPos, 3) === peg$c25) {\n              s10 = peg$c25;\n              peg$currPos += 3;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e32); }\n            }\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseLineEnd();\n              if (s12 === peg$FAILED) {\n                s12 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f31(s4, s5, s8);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendCornerToken() {\n    var s0;\n\n    if (input.substr(peg$currPos, 12) === peg$c26) {\n      s0 = peg$c26;\n      peg$currPos += 12;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e33); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 11) === peg$c27) {\n        s0 = peg$c27;\n        peg$currPos += 11;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e34); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 9) === peg$c28) {\n          s0 = peg$c28;\n          peg$currPos += 9;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e35); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 8) === peg$c29) {\n            s0 = peg$c29;\n            peg$currPos += 8;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e36); }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLegendEntryLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    s3 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c25) {\n      s4 = peg$c25;\n      peg$currPos += 3;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = input.charAt(peg$currPos);\n      if (peg$r7.test(s6)) {\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e37); }\n      }\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s3;\n      s3 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r8.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e38); }\n      }\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = input.charAt(peg$currPos);\n          if (peg$r8.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e38); }\n          }\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = input.substring(s3, peg$currPos);\n      } else {\n        s3 = s4;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s4 = peg$c8;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseLineEnd();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f32(s3, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseComment();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseNL();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f33();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c30) {\n      s1 = peg$c30;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1;\n\n    s0 = peg$parseNL();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e40); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r9.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r9.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e41); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r9.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r9.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e41); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c31) {\n      s0 = peg$c31;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e42); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.charAt(peg$currPos);\n      if (peg$r10.test(s0)) {\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e43); }\n      }\n    }\n\n    return s0;\n  }\n\n\n  reset();\n  const ext = options.extensions !== false;\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult, LayoutOptions } from '../../../contracts/index.js';\nimport type { TimelineDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutTimeline } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type {\n  TimelineDocument,\n  Track,\n  Activity,\n  Milestone,\n  Section,\n  TimelineLayout,\n  ActivityStatus,\n} from './ir.js';\n\n/** Parse in strict Mermaid-compatible mode \u2014 extension syntax throws. */\nexport function parseMermaidStrict(input: string): TimelineDocument {\n  return parser.parse(input, { extensions: false }) as TimelineDocument;\n}\n\nexport const timeline: DiagramModule<TimelineDocument> = {\n  parseMermaid(input: string): TimelineDocument {\n    const raw = parser.parse(input, { extensions: true }) as any;\n    return {\n      ...raw,\n      overlays: raw.overlays?.length > 0 ? raw.overlays : undefined,\n    };\n  },\n\n  parseYaml(input: string): TimelineDocument {\n    // TODO: replace with schema validation\n    return JSON.parse(input) as TimelineDocument;\n  },\n\n  layout(ir: TimelineDocument, theme: ResolvedTheme, options?: LayoutOptions): LayoutResult {\n    return layoutTimeline(ir, theme, options);\n  },\n};\n", "const HASH_OFFSET = 0x811c9dc5;\nconst HASH_PRIME = 0x01000193;\n\nexport function crossLinkMarkerId(baseId: string, color: string): string {\n  return `${baseId}-${colorToken(color)}`;\n}\n\nfunction colorToken(color: string): string {\n  const normalized = color.trim().toLowerCase();\n  const hex = normalized.match(/^#([0-9a-f]+)$/);\n  if (hex) return hex[1]!;\n\n  let hash = HASH_OFFSET;\n  for (let i = 0; i < normalized.length; i++) {\n    hash ^= normalized.charCodeAt(i);\n    hash = Math.imul(hash, HASH_PRIME) >>> 0;\n  }\n  return `c${hash.toString(36)}`;\n}\n", "/**\n * Cross-Link Rendering\n *\n * Converts resolved cross-links into SceneElements (paths + labels)\n * that are layered on top of the poster's cell elements.\n *\n * Routes use the orthogonal router with port-direction hints from the\n * resolved link's fromSide/toSide.\n */\n\nimport type { SceneElement } from '../contracts/scene.js';\nimport {\n  isRenderedConnectorAnimation,\n  type ResolvedCrossLink,\n  type CrossLinkEdgeStyle,\n  type RenderedConnectorAnimation,\n} from '../contracts/crosslink.js';\nimport type { CardinalSide, NodeAnchorRegistry } from '../contracts/anchors.js';\nimport type { PortDirection, RouteStyle } from '../contracts/routing.js';\nimport type { Point, Rect } from '../contracts/primitives.js';\nimport type { ResolvedTheme } from '../contracts/theme.js';\nimport { getRouter } from '../routing/registry.js';\nimport { defaultRouter, createRouter } from '../routing/router.js';\nimport { crossLinkMarkerId } from './markers.js';\nimport { rhu } from '../util/round.js';\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface CrossLinkRenderResult {\n  /** SVG defs needed (e.g. arrowhead markers for cross-links). */\n  readonly defs: string[];\n  /** Scene elements: paths, labels, grouped per link. */\n  readonly elements: SceneElement[];\n}\n\nconst CROSSLINK_ARROW_ID = 'triton-crosslink-arrow';\nconst CROSSLINK_ARROW_BOTH_ID = 'triton-crosslink-arrow-both';\n\n/**\n * Render resolved cross-links into scene elements.\n *\n * @param resolved \u2014 links with resolved port positions in poster space\n * @param theme   \u2014 for styling (colours, fonts, stroke widths)\n * @param anchors \u2014 full anchor registry for obstacle avoidance\n * @param occupiedRects \u2014 bounding boxes of existing text/elements that labels must avoid\n * @param routingObstacles \u2014 additional thin obstacles (cell borders) for the router to avoid\n */\n/**\n * Amount (px) by which intermediate-cell rectangles are shrunk on each side\n * before being used as routing obstacles. Must match the router\u2019s padding\n * so that effective corridor width (gap + 2\u00D7SHRINK \u2212 2\u00D7padding) leaves room.\n */\nconst CELL_SHRINK = 12;\n\nexport function renderCrossLinks(\n  resolved: readonly ResolvedCrossLink[],\n  theme: ResolvedTheme,\n  anchors?: NodeAnchorRegistry,\n  occupiedRects?: readonly Rect[],\n  routingObstacles?: readonly Rect[],\n  cellRects?: ReadonlyMap<string, Rect>,\n): CrossLinkRenderResult {\n  const { palette, typography, edges: edgeTheme } = theme;\n  const elements: SceneElement[] = [];\n  const defs: string[] = [];\n  const arrowMarkerColors = new Map<string, string>();\n  const biArrowMarkerColors = new Map<string, string>();\n\n  // Extract obstacles from the anchor registry (all node bounds)\n  // Note: cell borders are handled separately in post-route nudging, not as generic obstacles\n  const obstacles: Rect[] = [];\n  if (anchors) {\n    for (const anchor of Object.values(anchors)) {\n      obstacles.push(anchor.bounds);\n    }\n  }\n\n  // Assign distinct colours to explicit links\n  const categoricalPalette = [\n    '#E11D48',\n    '#16A34A',\n    '#9333EA',\n    '#0891B2',\n    '#CA8A04',\n    '#DC2626',\n    '#2563EB',\n    '#7C3AED',\n  ];\n  let explicitColorIdx = 0;\n\n  // Collect labels for de-collision pass after all routes are computed\n  const pendingLabels: Array<{\n    content: string;\n    x: number;\n    y: number;\n    fontSize: number;\n    fontFamily: string;\n    fill: string;\n    anchor: 'middle';\n    fontWeight: 'bold';\n  }> = [];\n\n  // Phase 1: Compute all routes\n  const pendingRoutes: PendingRoute[] = [];\n\n  for (const rLink of resolved) {\n    const { link, fromPort, toPort, fromSide, toSide } = rLink;\n\n    const isMono = theme.name.startsWith('bw-') || theme.name.includes('mono');\n    let color: string;\n    const explicitColor = typeof link.props?.color === 'string' ? link.props.color : undefined;\n    if (explicitColor) {\n      color = explicitColor;\n    } else if (isMono) {\n      color = palette.primary;\n    } else {\n      color = categoricalPalette[explicitColorIdx % categoricalPalette.length]!;\n      explicitColorIdx++;\n    }\n\n    const fromDir = sideToPortDir(fromSide);\n    const toDir = sideToPortDir(toSide);\n    const routeStyle: RouteStyle = link.routing ?? 'orthogonal';\n    const router = getRouter(routeStyle) ?? createRouter(routeStyle);\n    const tension = link.props?.tension as number | undefined;\n\n    // Build per-link obstacles: all node bounds + shrunken intermediate-cell\n    // rects. Intermediate cells (neither source nor target) are shrunk inward\n    // by CELL_SHRINK so routes travel through inter-cell corridors instead of\n    // cutting through other cells\u2019 content areas. Source/target cells are\n    // excluded so routes can freely exit/enter through their own cell\u2019s space.\n    let linkObstacles: Rect[] = obstacles;\n    if (cellRects) {\n      const srcId = link.from.cellPath.join('.');\n      const dstId = link.to.cellPath.join('.');\n      const extra: Rect[] = [];\n      for (const [cellId, r] of cellRects) {\n        if (cellId === srcId || cellId === dstId) continue;\n        const sw = r.width - 2 * CELL_SHRINK;\n        const sh = r.height - 2 * CELL_SHRINK;\n        if (sw > 0 && sh > 0) {\n          extra.push({ x: r.x + CELL_SHRINK, y: r.y + CELL_SHRINK, width: sw, height: sh });\n        }\n      }\n      if (extra.length > 0) linkObstacles = [...obstacles, ...extra];\n    }\n    if (occupiedRects && occupiedRects.length > 0) {\n      linkObstacles = [...linkObstacles, ...occupiedRects];\n    }\n\n    const route = router.route({\n      from: fromPort,\n      to: toPort,\n      style: routeStyle,\n      obstacles: linkObstacles,\n      padding: 12,\n      fromDir,\n      toDir,\n      ...(tension != null ? { tension } : {}),\n    });\n\n    const dash = edgeStyleToDash(link.style);\n    // Animation: explicit DSL value only. All styles are STATIC by default.\n    // Motion requires explicit @anim:<name> or { anim: <name> }.\n    const animation: RenderedConnectorAnimation | undefined =\n      link.animation === 'none'\n        ? undefined\n        : isRenderedConnectorAnimation(link.animation)\n          ? link.animation\n          : undefined;\n    let markerEnd: string | undefined;\n    let markerStart: string | undefined;\n    if (link.direction === 'directed') {\n      markerEnd = crossLinkMarkerId(CROSSLINK_ARROW_ID, color);\n      arrowMarkerColors.set(markerEnd, color);\n    } else if (link.direction === 'bidirectional') {\n      markerEnd = crossLinkMarkerId(CROSSLINK_ARROW_ID, color);\n      markerStart = crossLinkMarkerId(CROSSLINK_ARROW_BOTH_ID, color);\n      arrowMarkerColors.set(markerEnd, color);\n      biArrowMarkerColors.set(markerStart, color);\n    }\n\n    const strokeWidth =\n      link.style === 'thick' ? (edgeTheme.strokeWidth + 0.5) * 2 : edgeTheme.strokeWidth + 0.5;\n    const isWavy = link.style === 'wavy';\n    const wavyAmplitude = (link.props?.amplitude as number | undefined) ?? 3;\n    const wavyWavelength = (link.props?.wavelength as number | undefined) ?? 12;\n\n    pendingRoutes.push({\n      points: route.points,\n      routePath: routeStyle !== 'orthogonal' ? route.path : undefined,\n      routing: routeStyle,\n      fromDir,\n      toDir,\n      color,\n      dash,\n      strokeWidth,\n      isWavy,\n      wavyAmplitude,\n      wavyWavelength,\n      animation,\n      markerEnd,\n      markerStart,\n      label: link.label,\n    });\n  }\n\n  // Phase 2: Deflect straight routes that cross other routes\n  deflectCrossingStraightRoutes(pendingRoutes, obstacles);\n\n  // Phase 3: Nudge segments away from cell borders (orthogonal routes only)\n  if (routingObstacles && routingObstacles.length > 0) {\n    const orthoRoutes = pendingRoutes.filter((r) => r.routing === 'orthogonal');\n    nudgeOffBorders(orthoRoutes, routingObstacles);\n  }\n\n  // Phase 4a: Bezier separation \u2014 fan apart or fall back crossing beziers to orthogonal\n  // Runs BEFORE channel separation so any new orthogonal routes get included.\n  const CHANNEL_GAP = 12;\n  separateBezierCurves(\n    pendingRoutes.filter((r) => r.routing === 'bezier'),\n    CHANNEL_GAP,\n    obstacles,\n    pendingRoutes,\n  );\n\n  // Phase 4b: Channel separation \u2014 offset overlapping parallel segments (all orthogonal, including fallbacks)\n  separateOverlappingChannels(\n    pendingRoutes.filter((r) => r.routing === 'orthogonal'),\n    CHANNEL_GAP,\n  );\n\n  // \u2500\u2500\u2500 Label position staggering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Routes sharing the same corridor (same dominant-segment axis + close coord)\n  // would all land their labels at the same midpoint.  Distribute positions\n  // evenly along the route: 1/(n+1), 2/(n+1), \u2026, n/(n+1).\n  const CORRIDOR_TOL = 20; // px \u2014 routes within this band share a corridor\n  const labelFractions = new Array<number>(pendingRoutes.length).fill(0.5);\n  const labeledIndices = pendingRoutes.map((pr, i) => (pr.label ? i : -1)).filter((i) => i >= 0);\n  const staggerAssigned = new Set<number>();\n\n  for (const i of labeledIndices) {\n    if (staggerAssigned.has(i)) continue;\n    const infoI = dominantSegmentInfo(pendingRoutes[i]!.points);\n    const group = [i];\n    for (const j of labeledIndices) {\n      if (j === i || staggerAssigned.has(j)) continue;\n      const infoJ = dominantSegmentInfo(pendingRoutes[j]!.points);\n      if (infoI.axis === infoJ.axis && Math.abs(infoI.coord - infoJ.coord) < CORRIDOR_TOL) {\n        group.push(j);\n      }\n    }\n    if (group.length > 1) {\n      group.sort((a, b) => a - b); // consistent ordering by route index\n      const n = group.length;\n      group.forEach((idx, k) => {\n        labelFractions[idx] = (k + 1) / (n + 1);\n      });\n      group.forEach((idx) => staggerAssigned.add(idx));\n    }\n  }\n\n  // Phase 5: Emit path elements and collect labels\n  for (let prIdx = 0; prIdx < pendingRoutes.length; prIdx++) {\n    const pr = pendingRoutes[prIdx]!;\n    // Bezier/straight routes use the router's SVG path; orthogonal rebuilds from points\n    let path =\n      pr.routePath ?? pr.points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n\n    // Wavy style: displace path geometry with a sine wave\n    if (pr.isWavy) {\n      path = wavifyPath([...pr.points], pr.wavyAmplitude, pr.wavyWavelength);\n    }\n\n    const pathEl: SceneElement = {\n      type: 'path',\n      d: path,\n      stroke: pr.color,\n      strokeWidth: pr.strokeWidth,\n      ...(pr.dash ? { strokeDasharray: pr.dash } : {}),\n      ...(pr.animation ? { animated: pr.animation } : {}),\n      ...(pr.markerEnd ? { markerEnd: pr.markerEnd } : {}),\n      ...(pr.markerStart ? { markerStart: pr.markerStart } : {}),\n    };\n    elements.push(pathEl);\n\n    if (pr.label) {\n      const labelPos = pointAtFraction(pr.points, labelFractions[prIdx] ?? 0.5);\n      pendingLabels.push({\n        content: pr.label,\n        x: labelPos.x,\n        y: labelPos.y - 6,\n        fontSize: edgeTheme.labelFontSize,\n        fontFamily: typography.fontFamily,\n        fill: pr.color,\n        anchor: 'middle' as const,\n        fontWeight: 'bold' as const,\n      });\n    }\n  }\n\n  // \u2500\u2500\u2500 Label de-collision pass \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Estimate label bounding boxes, resolve overlaps against fixed rects + siblings\n  const CHAR_WIDTH_FACTOR = 0.65; // approximate character width / font size\n  const LABEL_PAD = 4;\n\n  // Fixed obstacles: node bounds + caller-provided occupied rects (cell titles, poster title)\n  const fixedRects: Rect[] = [...obstacles, ...(occupiedRects ?? [])];\n\n  // Estimate bounding rect for each label (centered at anchor='middle')\n  const labelRects: Rect[] = pendingLabels.map((l) => {\n    const w = l.content.length * l.fontSize * CHAR_WIDTH_FACTOR + LABEL_PAD * 2;\n    const h = l.fontSize + LABEL_PAD * 2;\n    return { x: l.x - w / 2, y: l.y - h + LABEL_PAD, width: w, height: h };\n  });\n\n  // Iteratively push overlapping labels vertically\n  deCollideLabels(labelRects, fixedRects);\n\n  // Emit labels at de-collided positions\n  for (let i = 0; i < pendingLabels.length; i++) {\n    const l = pendingLabels[i]!;\n    const r = labelRects[i]!;\n    // Recover center position from adjusted rect\n    const finalX = r.x + r.width / 2;\n    const finalY = r.y + r.height - LABEL_PAD;\n    elements.push({\n      type: 'rect',\n      bounds: {\n        x: r.x,\n        y: r.y,\n        width: r.width,\n        height: r.height,\n      },\n      fill: palette.background,\n      stroke: 'none',\n      strokeWidth: 0,\n      rx: 3,\n    });\n    elements.push({\n      type: 'text',\n      content: l.content,\n      position: { x: finalX, y: finalY },\n      fontSize: l.fontSize,\n      fontFamily: l.fontFamily,\n      fill: l.fill,\n      anchor: l.anchor,\n      fontWeight: l.fontWeight,\n    });\n  }\n\n  // Build defs\n  const s = edgeTheme.arrowSize;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n  for (const [id, color] of arrowMarkerColors) {\n    defs.push(\n      `<marker id=\"${id}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${color}\" /></marker>`,\n    );\n  }\n  for (const [id, color] of biArrowMarkerColors) {\n    defs.push(\n      `<marker id=\"${id}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"1\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"${s} 0, 0 ${sMidY}, ${s} ${sH}\" fill=\"${color}\" /></marker>`,\n    );\n  }\n\n  return { defs, elements };\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction sideToPortDir(side: CardinalSide): PortDirection {\n  return side; // CardinalSide and PortDirection use same values\n}\n\nfunction edgeStyleToDash(style: CrossLinkEdgeStyle): string | undefined {\n  switch (style) {\n    case 'dotted':\n      return '4 3';\n    case 'dashed':\n      return '8 4';\n    case 'solid':\n      return undefined;\n    case 'thick':\n      return undefined; // thick uses stroke-width bump, not dasharray\n    case 'wavy':\n      return undefined; // wavy uses path displacement, not dasharray\n  }\n}\n\n/** Find the midpoint of the longest segment in a polyline. */\nfunction longestSegmentMidpoint(points: readonly Point[]): Point {\n  let bestLen = 0;\n  let bestMid: Point = points[0]!;\n  for (let i = 0; i < points.length - 1; i++) {\n    const a = points[i]!,\n      b = points[i + 1]!;\n    const len = Math.abs(b.x - a.x) + Math.abs(b.y - a.y); // Manhattan length for ortho\n    if (len > bestLen) {\n      bestLen = len;\n      bestMid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n    }\n  }\n  return bestMid;\n}\n\n/**\n * Returns the axis ('h'|'v') and fixed coordinate of the longest segment\n * in a polyline \u2014 used to group routes sharing the same corridor.\n */\nfunction dominantSegmentInfo(points: readonly Point[]): { axis: 'h' | 'v'; coord: number } {\n  let bestLen = 0,\n    axis: 'h' | 'v' = 'h',\n    coord = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    const a = points[i]!,\n      b = points[i + 1]!;\n    const dx = Math.abs(b.x - a.x),\n      dy = Math.abs(b.y - a.y);\n    const len = dx + dy;\n    if (len > bestLen) {\n      bestLen = len;\n      if (dy > dx) {\n        axis = 'v';\n        coord = (a.x + b.x) / 2;\n      } else {\n        axis = 'h';\n        coord = (a.y + b.y) / 2;\n      }\n    }\n  }\n  return { axis, coord };\n}\n\n/**\n * Returns the point at fraction t (0..1) of total Euclidean path length.\n */\nfunction pointAtFraction(points: readonly Point[], t: number): Point {\n  if (points.length === 0) return { x: 0, y: 0 };\n  if (points.length === 1) return points[0]!;\n  const lengths: number[] = [];\n  let total = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    const a = points[i]!,\n      b = points[i + 1]!;\n    const len = Math.hypot(b.x - a.x, b.y - a.y);\n    lengths.push(len);\n    total += len;\n  }\n  if (total === 0) return points[0]!;\n  const target = total * Math.min(Math.max(t, 0), 1);\n  let acc = 0;\n  for (let i = 0; i < lengths.length; i++) {\n    const l = lengths[i]!;\n    if (acc + l >= target) {\n      const frac = l > 0 ? (target - acc) / l : 0;\n      const a = points[i]!,\n        b = points[i + 1]!;\n      return { x: a.x + (b.x - a.x) * frac, y: a.y + (b.y - a.y) * frac };\n    }\n    acc += l;\n  }\n  return points[points.length - 1]!;\n}\n\n/**\n * De-collide label rectangles by pushing them away from fixed obstacles and\n * from each other in the direction of minimum overlap (MTV approach).\n * Horizontal push is used when horizontal overlap is smaller than vertical \u2014\n * this avoids vertical stacking when labels share the same route corridor.\n * Mutates labelRects in place.\n */\nfunction deCollideLabels(\n  labelRects: Array<{ x: number; y: number; width: number; height: number }>,\n  fixedRects: readonly Rect[],\n): void {\n  const MAX_PASSES = 20;\n  const NUDGE = 2;\n\n  for (let pass = 0; pass < MAX_PASSES; pass++) {\n    let moved = false;\n\n    // Push labels away from fixed rects\n    for (const lr of labelRects) {\n      for (const fr of fixedRects) {\n        if (!rectsOverlap(lr, fr)) continue;\n        const ox = Math.min(lr.x + lr.width, fr.x + fr.width) - Math.max(lr.x, fr.x);\n        const oy = Math.min(lr.y + lr.height, fr.y + fr.height) - Math.max(lr.y, fr.y);\n        if (ox <= oy) {\n          // Horizontal push \u2014 less movement\n          const lCX = lr.x + lr.width / 2;\n          const fCX = fr.x + fr.width / 2;\n          lr.x = lCX <= fCX ? fr.x - lr.width - NUDGE : fr.x + fr.width + NUDGE;\n        } else {\n          // Vertical push\n          const lCY = lr.y + lr.height / 2;\n          const fCY = fr.y + fr.height / 2;\n          lr.y = lCY <= fCY ? fr.y - lr.height - NUDGE : fr.y + fr.height + NUDGE;\n        }\n        moved = true;\n      }\n    }\n\n    // Push labels away from each other\n    for (let i = 0; i < labelRects.length; i++) {\n      for (let j = i + 1; j < labelRects.length; j++) {\n        const a = labelRects[i]!,\n          b = labelRects[j]!;\n        if (!rectsOverlap(a, b)) continue;\n        const ox = Math.min(a.x + a.width, b.x + b.width) - Math.max(a.x, b.x);\n        const oy = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);\n        if (ox <= oy) {\n          // Push horizontally \u2014 shared-corridor case\n          const aCX = a.x + a.width / 2;\n          const bCX = b.x + b.width / 2;\n          if (aCX <= bCX) {\n            a.x -= ox / 2;\n            b.x += ox / 2;\n          } else {\n            a.x += ox / 2;\n            b.x -= ox / 2;\n          }\n        } else {\n          // Push vertically\n          const aCY = a.y + a.height / 2;\n          const bCY = b.y + b.height / 2;\n          if (aCY <= bCY) {\n            const overlap = a.y + a.height - b.y;\n            a.y -= (overlap + NUDGE) / 2;\n            b.y += (overlap + NUDGE) / 2;\n          } else {\n            const overlap = b.y + b.height - a.y;\n            b.y -= (overlap + NUDGE) / 2;\n            a.y += (overlap + NUDGE) / 2;\n          }\n        }\n        moved = true;\n      }\n    }\n\n    if (!moved) break;\n  }\n}\n\nfunction rectsOverlap(a: Rect, b: Rect): boolean {\n  return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n\n// \u2500\u2500\u2500 Straight Route Crossing Deflection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Post-route pass: detect straight routes whose segments cross other routes,\n * and deflect them by inserting a perpendicular waypoint.\n *\n * This handles the case where a straight line doesn't hit any node bounding box\n * but still visually crosses other connector paths.\n */\nfunction deflectCrossingStraightRoutes(routes: PendingRoute[], obstacles: readonly Rect[]): void {\n  const straightRoutes = routes.filter((r) => r.routing === 'straight');\n  if (straightRoutes.length === 0) return;\n\n  // Collect all segments from OTHER routes for crossing checks.\n  // For bezier routes, sample the curve into a polyline (control points aren't line segments).\n  const BEZIER_SAMPLES = 16;\n  const otherSegments: Array<[Point, Point]> = [];\n  for (const r of routes) {\n    if (r.routing === 'bezier') {\n      const pts = r.points;\n      if (pts.length >= 4) {\n        const samples = sampleBezierToPolyline(pts[0]!, pts[1]!, pts[2]!, pts[3]!, BEZIER_SAMPLES);\n        for (let i = 0; i < samples.length - 1; i++) {\n          otherSegments.push([samples[i]!, samples[i + 1]!]);\n        }\n      }\n    } else {\n      const pts = r.points;\n      for (let i = 0; i < pts.length - 1; i++) {\n        otherSegments.push([pts[i]!, pts[i + 1]!]);\n      }\n    }\n  }\n\n  for (const sr of straightRoutes) {\n    const pts = sr.points as Point[];\n    if (pts.length !== 2) continue;\n\n    const from = pts[0]!,\n      to = pts[1]!;\n    const dx = to.x - from.x,\n      dy = to.y - from.y;\n    const len = Math.sqrt(dx * dx + dy * dy);\n    if (len < 30) continue;\n\n    // Check if this straight line crosses any other route segment\n    const segsExcludingSelf = otherSegments.filter(([a, b]) => !(a === from && b === to));\n    const originalCrossings = segsExcludingSelf.filter(([a, b]) =>\n      straightSegmentsIntersect(from, to, a, b),\n    ).length;\n    if (originalCrossings === 0) continue;\n\n    // Try perpendicular waypoints at increasing offsets\n    const perpX = -dy / len,\n      perpY = dx / len;\n    const mid: Point = { x: (from.x + to.x) / 2, y: (from.y + to.y) / 2 };\n\n    let bestWp: Point | null = null;\n    let bestCrossings = Infinity;\n\n    for (let offset = len * 0.08; offset <= len * 0.5; offset += len * 0.06) {\n      for (const sign of [1, -1]) {\n        const wp: Point = { x: mid.x + perpX * offset * sign, y: mid.y + perpY * offset * sign };\n\n        let hitsNode = false;\n        for (const obs of obstacles) {\n          if (segIntersectsRectInterior(from, wp, obs) || segIntersectsRectInterior(wp, to, obs)) {\n            hitsNode = true;\n            break;\n          }\n        }\n        if (hitsNode) continue;\n\n        let crossings = 0;\n        for (const [a, b] of segsExcludingSelf) {\n          if (straightSegmentsIntersect(from, wp, a, b)) crossings++;\n          if (straightSegmentsIntersect(wp, to, a, b)) crossings++;\n        }\n        if (crossings < bestCrossings) {\n          bestCrossings = crossings;\n          bestWp = wp;\n          if (crossings === 0) break;\n        }\n      }\n      if (bestCrossings === 0) break;\n    }\n\n    if (bestWp && bestCrossings < originalCrossings) {\n      (sr.points as Point[]).splice(1, 0, bestWp);\n      sr.routePath = sr.points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n    } else {\n      // Deflection failed \u2014 fall back to orthogonal routing for this link.\n      // This prevents ugly diagonal lines that cross everything.\n      const orthoRouter = createRouter('orthogonal');\n      const route = orthoRouter.route({\n        from,\n        to,\n        style: 'orthogonal',\n        obstacles,\n        padding: 12,\n        ...(sr.fromDir ? { fromDir: sr.fromDir } : {}),\n        ...(sr.toDir ? { toDir: sr.toDir } : {}),\n      });\n      (sr as any).points = [...route.points];\n      sr.routePath = undefined; // let Phase 5 rebuild from points\n      sr.routing = 'orthogonal' as RouteStyle; // so post-route passes treat it correctly\n    }\n  }\n}\n\n/** Sample a cubic bezier [from, cp1, cp2, to] into a polyline of n+1 points. */\nfunction sampleBezierToPolyline(p0: Point, p1: Point, p2: Point, p3: Point, n: number): Point[] {\n  const pts: Point[] = [];\n  for (let i = 0; i <= n; i++) {\n    const t = i / n;\n    const u = 1 - t;\n    pts.push({\n      x: u * u * u * p0.x + 3 * u * u * t * p1.x + 3 * u * t * t * p2.x + t * t * t * p3.x,\n      y: u * u * u * p0.y + 3 * u * u * t * p1.y + 3 * u * t * t * p2.y + t * t * t * p3.y,\n    });\n  }\n  return pts;\n}\n\n/** Check if two segments properly cross (not just touch). */\nfunction straightSegmentsIntersect(p1: Point, p2: Point, p3: Point, p4: Point): boolean {\n  const d1 = crossProduct(p3, p4, p1);\n  const d2 = crossProduct(p3, p4, p2);\n  const d3 = crossProduct(p1, p2, p3);\n  const d4 = crossProduct(p1, p2, p4);\n  return ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0));\n}\n\nfunction crossProduct(a: Point, b: Point, c: Point): number {\n  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\n/** Check if a line segment crosses the interior of a rectangle (Liang-Barsky). */\nfunction segIntersectsRectInterior(p1: Point, p2: Point, r: Rect): boolean {\n  const dx = p2.x - p1.x,\n    dy = p2.y - p1.y;\n  let tmin = 0,\n    tmax = 1;\n  const edges = [\n    { p: -dx, q: p1.x - r.x },\n    { p: dx, q: r.x + r.width - p1.x },\n    { p: -dy, q: p1.y - r.y },\n    { p: dy, q: r.y + r.height - p1.y },\n  ];\n  for (const { p, q } of edges) {\n    if (Math.abs(p) < 1e-10) {\n      if (q <= 0) return false;\n    } else {\n      const t = q / p;\n      if (p < 0) tmin = Math.max(tmin, t);\n      else tmax = Math.min(tmax, t);\n      if (tmin >= tmax) return false;\n    }\n  }\n  return tmin < tmax;\n}\n\n// \u2500\u2500\u2500 Bezier Separation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Fan apart bezier curves that share endpoints or cross each other.\n *\n * The BezierRouter stores points as [from, cp1, cp2, to].\n *\n * Phase A: Shared-endpoint fan-out \u2014 when multiple curves converge on\n *   the same endpoint, offset each curve's nearby control point perpendicular\n *   to the from\u2192to axis so they fan apart.\n *\n * Phase B: Crossing resolution \u2014 for every pair of bezier curves, sample both\n *   and detect segment crossings. If they cross, offset both curves' control\n *   points to opposite sides of their respective from\u2192to axes.\n */\nfunction separateBezierCurves(\n  routes: PendingRoute[],\n  gap: number,\n  obstacles: readonly Rect[],\n  allRoutes: PendingRoute[],\n): void {\n  if (routes.length < 2) return;\n\n  const PROXIMITY = 20;\n\n  // \u2500\u2500 Phase A: shared-endpoint fan-out \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  type EndGroup = { routes: PendingRoute[]; end: 'from' | 'to' };\n  const groups: EndGroup[] = [];\n\n  const fromGroups = clusterByEndpoint(routes, 'from', PROXIMITY);\n  for (const cluster of fromGroups) {\n    if (cluster.length > 1) groups.push({ routes: cluster, end: 'from' });\n  }\n\n  const toGroups = clusterByEndpoint(routes, 'to', PROXIMITY);\n  for (const cluster of toGroups) {\n    if (cluster.length > 1) groups.push({ routes: cluster, end: 'to' });\n  }\n\n  for (const group of groups) {\n    const n = group.routes.length;\n    for (let i = 0; i < n; i++) {\n      const pr = group.routes[i]!;\n      const pts = pr.points as Point[];\n      if (pts.length < 4) continue;\n\n      const from = pts[0]!,\n        to = pts[pts.length - 1]!;\n      const dx = to.x - from.x,\n        dy = to.y - from.y;\n      const len = Math.sqrt(dx * dx + dy * dy);\n      if (len < 1) continue;\n\n      const perpX = -dy / len,\n        perpY = dx / len;\n      const offset = (i - (n - 1) / 2) * gap;\n\n      if (group.end === 'from') {\n        pts[1] = { x: pts[1]!.x + perpX * offset, y: pts[1]!.y + perpY * offset };\n      } else {\n        pts[pts.length - 2] = {\n          x: pts[pts.length - 2]!.x + perpX * offset,\n          y: pts[pts.length - 2]!.y + perpY * offset,\n        };\n      }\n\n      rebuildBezierPath(pr);\n    }\n  }\n\n  // \u2500\u2500 Phase B: crossing resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // When two beziers cross, try offsetting one curve perpendicular to\n  // separate them. If no offset resolves the crossing (e.g. endpoints form\n  // an X pattern), fall back one curve to orthogonal routing.\n\n  const SAMPLES = 40;\n\n  for (let i = 0; i < routes.length; i++) {\n    for (let j = i + 1; j < routes.length; j++) {\n      const ri = routes[i]!,\n        rj = routes[j]!;\n      const ptsI = ri.points as Point[];\n      const ptsJ = rj.points as Point[];\n      if (ptsI.length < 4 || ptsJ.length < 4) continue;\n\n      const sampI = sampleBezierCurve(ptsI[0]!, ptsI[1]!, ptsI[2]!, ptsI[3]!, SAMPLES);\n      const sampJ = sampleBezierCurve(ptsJ[0]!, ptsJ[1]!, ptsJ[2]!, ptsJ[3]!, SAMPLES);\n      if (!polylinesIntersect(sampI, sampJ)) continue;\n\n      // Compute perpendicular for each curve\n      const perpOf = (pts: Point[]) => {\n        const dx = pts[3]!.x - pts[0]!.x,\n          dy = pts[3]!.y - pts[0]!.y;\n        const len = Math.sqrt(dx * dx + dy * dy);\n        return len < 1 ? null : { px: -dy / len, py: dx / len, len };\n      };\n      const pI = perpOf(ptsI),\n        pJ = perpOf(ptsJ);\n      if (!pI || !pJ) continue;\n\n      const origI1 = { ...ptsI[1]! },\n        origI2 = { ...ptsI[2]! };\n      const origJ1 = { ...ptsJ[1]! },\n        origJ2 = { ...ptsJ[2]! };\n\n      // Try offsetting one curve at a time, in both directions\n      type Solution = { moveRoute: 'I' | 'J'; off: number; px: number; py: number };\n      let best: Solution | null = null;\n      const stepSize = Math.max(gap * 3, 15);\n\n      for (const moveRoute of ['I', 'J'] as const) {\n        const p = moveRoute === 'I' ? pI : pJ;\n        const pts = moveRoute === 'I' ? ptsI : ptsJ;\n        const orig1 = moveRoute === 'I' ? origI1 : origJ1;\n        const orig2 = moveRoute === 'I' ? origI2 : origJ2;\n        const otherPts = moveRoute === 'I' ? ptsJ : ptsI;\n\n        for (const sign of [1, -1]) {\n          for (let step = 1; step <= 8; step++) {\n            const off = sign * step * stepSize;\n            pts[1] = { x: orig1.x + p.px * off, y: orig1.y + p.py * off };\n            pts[2] = { x: orig2.x + p.px * off, y: orig2.y + p.py * off };\n\n            const sA = sampleBezierCurve(pts[0]!, pts[1]!, pts[2]!, pts[3]!, SAMPLES);\n            const sB = sampleBezierCurve(\n              otherPts[0]!,\n              otherPts[1]!,\n              otherPts[2]!,\n              otherPts[3]!,\n              SAMPLES,\n            );\n\n            if (!polylinesIntersect(sA, sB)) {\n              if (!best || Math.abs(off) < Math.abs(best.off)) {\n                best = { moveRoute, off, px: p.px, py: p.py };\n              }\n              break;\n            }\n          }\n          // Reset\n          pts[1] = { ...orig1 };\n          pts[2] = { ...orig2 };\n        }\n      }\n\n      if (best) {\n        // Apply smallest offset that resolves\n        const pts = best.moveRoute === 'I' ? ptsI : ptsJ;\n        const orig1 = best.moveRoute === 'I' ? origI1 : origJ1;\n        const orig2 = best.moveRoute === 'I' ? origI2 : origJ2;\n        pts[1] = { x: orig1.x + best.px * best.off, y: orig1.y + best.py * best.off };\n        pts[2] = { x: orig2.x + best.px * best.off, y: orig2.y + best.py * best.off };\n        rebuildBezierPath(ri);\n        rebuildBezierPath(rj);\n      } else {\n        // No offset resolves \u2014 endpoints form an X pattern (interleaved on\n        // parallel lines). Swap the ports on the shared node so both routes\n        // stay on the same side, then re-route as orthogonal.\n        swapInterleavedPortsAndReroute(ri, rj, obstacles);\n      }\n    }\n  }\n}\n\n/**\n * Detect interleaved endpoints and swap ports on the shared line to\n * un-interleave them. Then re-route both as orthogonal.\n *\n * Before: A.from(399,388) A.to(471,597)  B.from(367,597) B.to(439,388)\n *   y=388: A=399(left) B=439(right)  y=597: B=367(left) A=471(right) \u2192 interleaved\n * After swap on y=388: A.from\u2194B.to \u2192 A(439,388) B(399,388)\n *   y=388: B=399(left) A=439(right)  y=597: B=367(left) A=471(right) \u2192 consistent\n */\nfunction swapInterleavedPortsAndReroute(\n  ri: PendingRoute,\n  rj: PendingRoute,\n  obstacles: readonly Rect[],\n): void {\n  const fromI = ri.points[0]!,\n    toI = ri.points[ri.points.length - 1]!;\n  const fromJ = rj.points[0]!,\n    toJ = rj.points[rj.points.length - 1]!;\n\n  const TOLERANCE = 15;\n\n  // Check all pairings of endpoints that share a horizontal or vertical line\n  // and swap to un-interleave.\n  const pairs: Array<{\n    endI: 'from' | 'to';\n    ptI: Point;\n    endJ: 'from' | 'to';\n    ptJ: Point;\n    axis: 'x' | 'y';\n  }> = [];\n\n  // fromI near toJ? (same horizontal/vertical line)\n  if (Math.abs(fromI.y - toJ.y) < TOLERANCE)\n    pairs.push({ endI: 'from', ptI: fromI, endJ: 'to', ptJ: toJ, axis: 'x' });\n  if (Math.abs(fromI.x - toJ.x) < TOLERANCE)\n    pairs.push({ endI: 'from', ptI: fromI, endJ: 'to', ptJ: toJ, axis: 'y' });\n  // toI near fromJ?\n  if (Math.abs(toI.y - fromJ.y) < TOLERANCE)\n    pairs.push({ endI: 'to', ptI: toI, endJ: 'from', ptJ: fromJ, axis: 'x' });\n  if (Math.abs(toI.x - fromJ.x) < TOLERANCE)\n    pairs.push({ endI: 'to', ptI: toI, endJ: 'from', ptJ: fromJ, axis: 'y' });\n\n  // For each pair on a shared line, check if swapping un-interleaves\n  for (const pair of pairs) {\n    // Get the OTHER endpoints (the ones NOT on this shared line)\n    const otherI = pair.endI === 'from' ? toI : fromI;\n    const otherJ = pair.endJ === 'from' ? toJ : fromJ;\n\n    // Check interleaving on the shared axis\n    const coord = pair.axis; // 'x' means compare x-values on a shared y-line\n    const iOnShared = pair.ptI[coord];\n    const jOnShared = pair.ptJ[coord];\n    const iOther = otherI[coord];\n    const jOther = otherJ[coord];\n\n    // Interleaved = one is left/above on shared line but right/below on the other\n    const iLeftOnShared = iOnShared < jOnShared;\n    const iLeftOnOther = iOther < jOther;\n    if (iLeftOnShared === iLeftOnOther) continue; // Not interleaved, skip\n\n    // SWAP: exchange the positions on the shared line\n    const newPtI = { ...pair.ptJ }; // I takes J's position\n    const newPtJ = { ...pair.ptI }; // J takes I's position\n    // Keep the shared-line coordinate averaged (same y for horizontal line)\n    if (pair.axis === 'x') {\n      const avgY = (pair.ptI.y + pair.ptJ.y) / 2;\n      newPtI.y = avgY;\n      newPtJ.y = avgY;\n    } else {\n      const avgX = (pair.ptI.x + pair.ptJ.x) / 2;\n      newPtI.x = avgX;\n      newPtJ.x = avgX;\n    }\n\n    // Build new from/to for each route\n    const newFromI = pair.endI === 'from' ? newPtI : fromI;\n    const newToI = pair.endI === 'to' ? newPtI : toI;\n    const newFromJ = pair.endJ === 'from' ? newPtJ : fromJ;\n    const newToJ = pair.endJ === 'to' ? newPtJ : toJ;\n\n    // Re-route both as orthogonal and check crossing\n    const orthoRouter = createRouter('orthogonal');\n    const routeI = orthoRouter.route({\n      from: newFromI,\n      to: newToI,\n      style: 'orthogonal',\n      obstacles,\n      padding: 12,\n    });\n    const routeJ = orthoRouter.route({\n      from: newFromJ,\n      to: newToJ,\n      style: 'orthogonal',\n      obstacles,\n      padding: 12,\n    });\n\n    const polyI = routeI.points as Point[];\n    const polyJ = routeJ.points as Point[];\n    let crosses = false;\n    for (let a = 0; a < polyI.length - 1 && !crosses; a++)\n      for (let b = 0; b < polyJ.length - 1 && !crosses; b++)\n        if (straightSegmentsIntersect(polyI[a]!, polyI[a + 1]!, polyJ[b]!, polyJ[b + 1]!))\n          crosses = true;\n\n    if (!crosses) {\n      // Apply\n      (ri as any).points = [...routeI.points];\n      ri.routePath = undefined;\n      ri.routing = 'orthogonal' as RouteStyle;\n\n      (rj as any).points = [...routeJ.points];\n      rj.routePath = undefined;\n      rj.routing = 'orthogonal' as RouteStyle;\n      return;\n    }\n  }\n\n  // Fallback: just convert both to orthogonal with natural ports\n  convertToOrthogonal(ri, obstacles);\n  convertToOrthogonal(rj, obstacles);\n}\n\n/** Convert a PendingRoute to orthogonal routing. */\nfunction convertToOrthogonal(target: PendingRoute, obstacles: readonly Rect[]): void {\n  const from = target.points[0]!,\n    to = target.points[target.points.length - 1]!;\n  const orthoRouter = createRouter('orthogonal');\n  const route = orthoRouter.route({\n    from,\n    to,\n    style: 'orthogonal',\n    obstacles,\n    padding: 12,\n  });\n  (target as any).points = [...route.points];\n  target.routePath = undefined;\n  target.routing = 'orthogonal' as RouteStyle;\n}\n\n/** Rebuild the routePath string from [from, cp1, cp2, to] points. */\nfunction rebuildBezierPath(pr: PendingRoute): void {\n  const pts = pr.points;\n  pr.routePath = `M ${pts[0]!.x} ${pts[0]!.y} C ${pts[1]!.x} ${pts[1]!.y} ${pts[2]!.x} ${pts[2]!.y} ${pts[3]!.x} ${pts[3]!.y}`;\n}\n\n/** Offset both control points of a bezier curve perpendicular to its from\u2192to axis. */\nfunction offsetBezierPerp(pts: Point[], offset: number): void {\n  const from = pts[0]!,\n    to = pts[3]!;\n  const dx = to.x - from.x,\n    dy = to.y - from.y;\n  const len = Math.sqrt(dx * dx + dy * dy);\n  if (len < 1) return;\n\n  const perpX = -dy / len,\n    perpY = dx / len;\n  pts[1] = { x: pts[1]!.x + perpX * offset, y: pts[1]!.y + perpY * offset };\n  pts[2] = { x: pts[2]!.x + perpX * offset, y: pts[2]!.y + perpY * offset };\n}\n\n/** Sample a cubic bezier into a polyline of N+1 points. */\nfunction sampleBezierCurve(p0: Point, p1: Point, p2: Point, p3: Point, n: number): Point[] {\n  const pts: Point[] = [];\n  for (let i = 0; i <= n; i++) {\n    const t = i / n;\n    const u = 1 - t;\n    pts.push({\n      x: u * u * u * p0.x + 3 * u * u * t * p1.x + 3 * u * t * t * p2.x + t * t * t * p3.x,\n      y: u * u * u * p0.y + 3 * u * u * t * p1.y + 3 * u * t * t * p2.y + t * t * t * p3.y,\n    });\n  }\n  return pts;\n}\n\n/** Check if two polylines have any crossing segments. */\nfunction polylinesIntersect(a: Point[], b: Point[]): boolean {\n  for (let i = 0; i < a.length - 1; i++) {\n    for (let j = 0; j < b.length - 1; j++) {\n      if (segmentsIntersect(a[i]!, a[i + 1]!, b[j]!, b[j + 1]!)) return true;\n    }\n  }\n  return false;\n}\n\n/** Check if two line segments p1-p2 and p3-p4 intersect (proper crossing only). */\nfunction segmentsIntersect(p1: Point, p2: Point, p3: Point, p4: Point): boolean {\n  const d1 = cross(p3, p4, p1);\n  const d2 = cross(p3, p4, p2);\n  const d3 = cross(p1, p2, p3);\n  const d4 = cross(p1, p2, p4);\n  if (((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0))) {\n    return true;\n  }\n  return false;\n}\n\nfunction cross(a: Point, b: Point, c: Point): number {\n  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\n/** Cluster bezier routes by proximity of their from or to endpoint. */\nfunction clusterByEndpoint(\n  routes: PendingRoute[],\n  end: 'from' | 'to',\n  proximity: number,\n): PendingRoute[][] {\n  const clusters: PendingRoute[][] = [];\n  const assigned = new Set<PendingRoute>();\n\n  for (let i = 0; i < routes.length; i++) {\n    const ri = routes[i]!;\n    if (assigned.has(ri)) continue;\n\n    const pi = end === 'from' ? ri.points[0]! : ri.points[ri.points.length - 1]!;\n    const cluster: PendingRoute[] = [ri];\n    assigned.add(ri);\n\n    for (let j = i + 1; j < routes.length; j++) {\n      const rj = routes[j]!;\n      if (assigned.has(rj)) continue;\n\n      const pj = end === 'from' ? rj.points[0]! : rj.points[rj.points.length - 1]!;\n      const dx = pi.x - pj.x,\n        dy = pi.y - pj.y;\n      if (Math.sqrt(dx * dx + dy * dy) < proximity) {\n        cluster.push(rj);\n        assigned.add(rj);\n      }\n    }\n\n    clusters.push(cluster);\n  }\n\n  return clusters;\n}\n\n// \u2500\u2500\u2500 Border Nudging \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Nudge segments that run parallel along cell borders (walls) away from them.\n * A horizontal segment at y \u2248 border.y is shifted vertically.\n * A vertical segment at x \u2248 border.x is shifted horizontally.\n * Only affects \"running along\" \u2014 perpendicular crossings are fine.\n */\nfunction nudgeOffBorders(routes: PendingRoute[], borders: readonly Rect[]): void {\n  const TOLERANCE = 3; // within 3px of a border edge\n  const NUDGE = 8; // push 8px away\n\n  // Extract unique horizontal border Y values and vertical border X values\n  const hBorderYs: number[] = []; // horizontal borders (wide, thin height)\n  const vBorderXs: number[] = []; // vertical borders (tall, thin width)\n\n  for (const b of borders) {\n    if (b.width > b.height) {\n      // Horizontal border \u2014 center Y\n      hBorderYs.push(b.y + b.height / 2);\n    } else {\n      // Vertical border \u2014 center X\n      vBorderXs.push(b.x + b.width / 2);\n    }\n  }\n\n  const minBorderX = vBorderXs.length > 0 ? Math.min(...vBorderXs) : -Infinity;\n  const maxBorderX = vBorderXs.length > 0 ? Math.max(...vBorderXs) : Infinity;\n  const minBorderY = hBorderYs.length > 0 ? Math.min(...hBorderYs) : -Infinity;\n  const maxBorderY = hBorderYs.length > 0 ? Math.max(...hBorderYs) : Infinity;\n\n  for (const route of routes) {\n    const pts = route.points as Point[];\n    for (let i = 0; i < pts.length - 1; i++) {\n      const a = pts[i]!,\n        b = pts[i + 1]!;\n      const dx = Math.abs(b.x - a.x),\n        dy = Math.abs(b.y - a.y);\n\n      if (dy < 1 && dx > 1) {\n        // Horizontal segment \u2014 check against horizontal borders\n        for (const borderY of hBorderYs) {\n          if (Math.abs(a.y - borderY) < TOLERANCE) {\n            let nudgeDir: number;\n            if (Math.abs(borderY - minBorderY) < TOLERANCE) {\n              nudgeDir = NUDGE;\n            } else if (Math.abs(borderY - maxBorderY) < TOLERANCE) {\n              nudgeDir = -NUDGE;\n            } else {\n              const routeMinY = Math.min(...pts.map((p) => p.y));\n              const routeMaxY = Math.max(...pts.map((p) => p.y));\n              const routeMidY = (routeMinY + routeMaxY) / 2;\n              nudgeDir = a.y < routeMidY ? -NUDGE : NUDGE;\n            }\n            pts[i] = { x: a.x, y: a.y + nudgeDir };\n            pts[i + 1] = { x: b.x, y: b.y + nudgeDir };\n            // Also adjust adjacent vertical segment endpoints\n            if (i > 0 && Math.abs(pts[i - 1]!.x - a.x) < 1) {\n              pts[i - 1] = { ...pts[i - 1]!, y: pts[i - 1]!.y }; // keep as-is, the vertex moved\n            }\n            break;\n          }\n        }\n      } else if (dx < 1 && dy > 1) {\n        // Vertical segment \u2014 check against vertical borders\n        for (const borderX of vBorderXs) {\n          if (Math.abs(a.x - borderX) < TOLERANCE) {\n            let nudgeDir: number;\n            if (Math.abs(borderX - minBorderX) < TOLERANCE) {\n              nudgeDir = NUDGE;\n            } else if (Math.abs(borderX - maxBorderX) < TOLERANCE) {\n              nudgeDir = -NUDGE;\n            } else {\n              const routeMinX = Math.min(...pts.map((p) => p.x));\n              const routeMaxX = Math.max(...pts.map((p) => p.x));\n              const routeMidX = (routeMinX + routeMaxX) / 2;\n              nudgeDir = a.x < routeMidX ? -NUDGE : NUDGE;\n            }\n            pts[i] = { x: a.x + nudgeDir, y: a.y };\n            pts[i + 1] = { x: b.x + nudgeDir, y: b.y };\n            break;\n          }\n        }\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Channel Separation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface PendingRoute {\n  points: readonly Point[];\n  routePath: string | undefined;\n  routing: RouteStyle;\n  fromDir: PortDirection | undefined;\n  toDir: PortDirection | undefined;\n  color: string;\n  dash: string | undefined;\n  strokeWidth: number;\n  isWavy: boolean;\n  wavyAmplitude: number;\n  wavyWavelength: number;\n  animation: RenderedConnectorAnimation | undefined;\n  markerEnd: string | undefined;\n  markerStart: string | undefined;\n  label: string | undefined;\n}\n\n/**\n * Detect overlapping parallel segments across all routes and offset them\n * so they don't visually merge. Mutates route points in place.\n */\nfunction separateOverlappingChannels(routes: PendingRoute[], gap: number): void {\n  // Collect all segments tagged by route index and segment index\n  interface Segment {\n    routeIdx: number;\n    segIdx: number;\n    isVertical: boolean;\n    coord: number;\n    min: number;\n    max: number;\n  }\n  const segments: Segment[] = [];\n\n  for (let r = 0; r < routes.length; r++) {\n    const pts = routes[r]!.points;\n    for (let s = 0; s < pts.length - 1; s++) {\n      const a = pts[s]!,\n        b = pts[s + 1]!;\n      const dx = Math.abs(b.x - a.x),\n        dy = Math.abs(b.y - a.y);\n      if (dx < 1 && dy > 1) {\n        // Vertical segment\n        segments.push({\n          routeIdx: r,\n          segIdx: s,\n          isVertical: true,\n          coord: a.x,\n          min: Math.min(a.y, b.y),\n          max: Math.max(a.y, b.y),\n        });\n      } else if (dy < 1 && dx > 1) {\n        // Horizontal segment\n        segments.push({\n          routeIdx: r,\n          segIdx: s,\n          isVertical: false,\n          coord: a.y,\n          min: Math.min(a.x, b.x),\n          max: Math.max(a.x, b.x),\n        });\n      }\n    }\n  }\n\n  // Group segments that share the same axis, similar coord, and overlapping range\n  const COORD_TOLERANCE = 10;\n  const processed = new Set<number>();\n\n  for (let i = 0; i < segments.length; i++) {\n    if (processed.has(i)) continue;\n    const group = [i];\n    const si = segments[i]!;\n\n    for (let j = i + 1; j < segments.length; j++) {\n      if (processed.has(j)) continue;\n      const sj = segments[j]!;\n      if (si.isVertical !== sj.isVertical) continue;\n      if (Math.abs(si.coord - sj.coord) > COORD_TOLERANCE) continue;\n      // Check range overlap\n      if (si.max <= sj.min || sj.max <= si.min) continue;\n      group.push(j);\n    }\n\n    if (group.length < 2) continue;\n\n    // Offset each segment in the group\n    const n = group.length;\n    for (let k = 0; k < n; k++) {\n      const offset = (k - (n - 1) / 2) * gap;\n      const seg = segments[group[k]!]!;\n      processed.add(group[k]!);\n\n      // Mutate the points in the route\n      const pts = routes[seg.routeIdx]!.points as Point[];\n      if (seg.isVertical) {\n        // Offset x coordinate of both endpoints of this segment\n        pts[seg.segIdx] = { x: pts[seg.segIdx]!.x + offset, y: pts[seg.segIdx]!.y };\n        pts[seg.segIdx + 1] = { x: pts[seg.segIdx + 1]!.x + offset, y: pts[seg.segIdx + 1]!.y };\n      } else {\n        // Offset y coordinate\n        pts[seg.segIdx] = { x: pts[seg.segIdx]!.x, y: pts[seg.segIdx]!.y + offset };\n        pts[seg.segIdx + 1] = { x: pts[seg.segIdx + 1]!.x, y: pts[seg.segIdx + 1]!.y + offset };\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Wavy Path Generation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Replace a polyline route with a sine-wave displaced version.\n *\n * Algorithm (fully deterministic):\n * 1. Compute cumulative arc-length at each original vertex.\n * 2. Re-sample the polyline at uniform intervals of \u03BB/4.\n * 3. At each sample, compute the local tangent and its perpendicular normal.\n * 4. Displace the sample along the normal by A\u00B7sin(2\u03C0\u00B7s/\u03BB) where s is the\n *    cumulative arc-length.  The first/last two samples are forced onto the\n *    route axis, while endpoints and 90\u00B0 corners ramp amplitude over one\n *    wavelength so arrowhead tips and kinks stay clean.\n * 5. Fit smooth cubic B\u00E9ziers through displaced samples (Catmull-Rom-to-B\u00E9zier).\n *\n * Returns an SVG path `d` string.  Same input \u2192 same output (no randomness).\n */\nexport function wavifyPath(\n  points: readonly Point[],\n  amplitude: number,\n  wavelength: number,\n): string {\n  if (points.length < 2) {\n    return points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n  }\n\n  const sampleInterval = wavelength / 4;\n\n  // \u2500\u2500 Step 1: cumulative arc-lengths at original vertices \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const arcLen: number[] = [0];\n  for (let i = 1; i < points.length; i++) {\n    const a = points[i - 1]!,\n      b = points[i]!;\n    const dx = b.x - a.x,\n      dy = b.y - a.y;\n    arcLen.push(arcLen[i - 1]! + Math.sqrt(dx * dx + dy * dy));\n  }\n  const totalLen = arcLen[arcLen.length - 1]!;\n  if (totalLen < 1) {\n    return `M ${points[0]!.x} ${points[0]!.y}`;\n  }\n\n  // \u2500\u2500 Step 2: re-sample at uniform intervals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Include start and end explicitly.\n  const sampleCount = Math.max(2, Math.ceil(totalLen / sampleInterval) + 1);\n  const samples: Point[] = [];\n  const sampleArcLens: number[] = [];\n\n  // Find polyline point at given arc-length parameter\n  function polylineAt(s: number): { pt: Point; tangentX: number; tangentY: number } {\n    s = Math.max(0, Math.min(s, totalLen));\n    for (let i = 1; i < points.length; i++) {\n      if (arcLen[i]! >= s - 1e-9) {\n        const segStart = arcLen[i - 1]!;\n        const segEnd = arcLen[i]!;\n        const segLen = segEnd - segStart;\n        const t = segLen < 1e-9 ? 0 : (s - segStart) / segLen;\n        const a = points[i - 1]!,\n          b = points[i]!;\n        const pt = { x: a.x + t * (b.x - a.x), y: a.y + t * (b.y - a.y) };\n        const dx = b.x - a.x,\n          dy = b.y - a.y;\n        const len = Math.sqrt(dx * dx + dy * dy);\n        const tx = len > 1e-9 ? dx / len : 1;\n        const ty = len > 1e-9 ? dy / len : 0;\n        return { pt, tangentX: tx, tangentY: ty };\n      }\n    }\n    const last = points[points.length - 1]!,\n      prev = points[points.length - 2]!;\n    const dx = last.x - prev.x,\n      dy = last.y - prev.y;\n    const len = Math.sqrt(dx * dx + dy * dy);\n    return { pt: last, tangentX: len > 1e-9 ? dx / len : 1, tangentY: len > 1e-9 ? dy / len : 0 };\n  }\n\n  // Build corner-proximity map: ramp amplitude to 0 at each 90\u00B0 bend\n  // A \"corner\" is any vertex where the turning angle > 45\u00B0.\n  const cornerArcLens: number[] = [];\n  for (let i = 1; i < points.length - 1; i++) {\n    const a = points[i - 1]!,\n      b = points[i]!,\n      c = points[i + 1]!;\n    const d1x = b.x - a.x,\n      d1y = b.y - a.y;\n    const d2x = c.x - b.x,\n      d2y = c.y - b.y;\n    const len1 = Math.sqrt(d1x * d1x + d1y * d1y);\n    const len2 = Math.sqrt(d2x * d2x + d2y * d2y);\n    if (len1 < 1e-9 || len2 < 1e-9) continue;\n    const dot = (d1x / len1) * (d2x / len2) + (d1y / len1) * (d2y / len2);\n    if (dot < 0.7) {\n      // angle > ~45\u00B0\n      cornerArcLens.push(arcLen[i]!);\n    }\n  }\n\n  function cornerAmplitudeFactor(s: number): number {\n    let minDist = Infinity;\n    for (const cs of cornerArcLens) {\n      minDist = Math.min(minDist, Math.abs(s - cs));\n    }\n    if (minDist >= wavelength) return 1;\n    return minDist / wavelength; // ramp 0..1 over one wavelength from corner\n  }\n\n  function endpointAmplitudeFactor(s: number): number {\n    const endpointDist = Math.min(s, totalLen - s);\n    // Keep the first/last interior samples flat so Catmull-Rom endpoint handles\n    // align with the route direction used by SVG marker orientation.\n    return Math.max(\n      0,\n      Math.min(1, (endpointDist - sampleInterval) / (wavelength - sampleInterval)),\n    );\n  }\n\n  for (let k = 0; k < sampleCount; k++) {\n    const s = (k / (sampleCount - 1)) * totalLen;\n    const { pt, tangentX, tangentY } = polylineAt(s);\n    // Normal: perpendicular to tangent (rotate 90\u00B0)\n    const nx = -tangentY;\n    const ny = tangentX;\n    const phase = (2 * Math.PI * s) / wavelength;\n    const cornerFactor = cornerAmplitudeFactor(s);\n    const factor = Math.min(cornerFactor, endpointAmplitudeFactor(s));\n    const endpointStub = k <= 1 || k >= sampleCount - 2;\n    const displacement = endpointStub ? 0 : amplitude * factor * Math.sin(phase);\n    samples.push({ x: pt.x + nx * displacement, y: pt.y + ny * displacement });\n    sampleArcLens.push(s);\n  }\n\n  // \u2500\u2500 Step 5: Catmull-Rom to cubic B\u00E9zier \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // For each interior sample i, compute Catmull-Rom tangents and emit a\n  // cubic B\u00E9zier from samples[i-1] to samples[i].\n  const tension = 0.5; // standard Catmull-Rom tension\n  let d = `M ${f(samples[0]!.x)} ${f(samples[0]!.y)}`;\n\n  for (let i = 1; i < samples.length; i++) {\n    const p0 = samples[Math.max(0, i - 2)]!;\n    const p1 = samples[i - 1]!;\n    const p2 = samples[i]!;\n    const p3 = samples[Math.min(samples.length - 1, i + 1)]!;\n\n    const cp1x = p1.x + ((p2.x - p0.x) * tension) / 3;\n    const cp1y = p1.y + ((p2.y - p0.y) * tension) / 3;\n    const cp2x = p2.x - ((p3.x - p1.x) * tension) / 3;\n    const cp2y = p2.y - ((p3.y - p1.y) * tension) / 3;\n\n    d += ` C ${f(cp1x)} ${f(cp1y)} ${f(cp2x)} ${f(cp2y)} ${f(p2.x)} ${f(p2.y)}`;\n  }\n\n  return d;\n}\n\n/** Format a number to 2 decimal places for SVG path output. */\nfunction f(n: number): string {\n  return Math.round(n * 100) / 100 + '';\n}\n", "/**\n * Cross-Link Engine v3 \u2014 Global Cost-Function Routing\n *\n * Passes:\n *   0. Port assign   Global: shared-endpoint t values sorted by angular order\n *   1. Sort          Axis-aligned first; longest within group\n *   2. Route         Greedy: search collapsed by phase-0 hints for shared ports\n *   3. Repair        Find crossing pairs, re-route lower-priority links\n *   4. Channel sep   Spread parallel overlapping segments\n *   5. Labels        Stagger + de-collision\n *   6. Emit          SVG path strings (L for orthogonal, C for bezier)\n *\n * Cost function:\n *   W_CROSS  \u00D7 crossings          \u2014 H/V decomposition for orthogonal pairs\n *   W_INTER  \u00D7 cross-link port conflict\n *   W_SIDE   \u00D7 wrong-side wall\n *   W_INTRA  \u00D7 intra-diagram port conflict (softer \u2014 can be overridden)\n *   W_BEND   \u00D7 excess bends\n *   W_LEN    \u00D7 path length\n *   W_ALIGN  \u00D7 short jog segments (orthogonal only)\n *\n * Crossing detection:\n *   Orthogonal \u2194 orthogonal: H/V decomposition, O(1) per segment pair\n *   Mixed/bezier: sampled polyline + AABB prefilter + segment intersection\n */\n\nimport type { SceneElement } from '../contracts/scene.js';\nimport {\n  isRenderedConnectorAnimation,\n  type CrossLink,\n  type RenderedConnectorAnimation,\n} from '../contracts/crosslink.js';\nimport type { CardinalSide, NodeAnchorRegistry, OccupiedPort } from '../contracts/anchors.js';\nimport type { PortDirection } from '../contracts/routing.js';\nimport type { Point, Rect } from '../contracts/primitives.js';\nimport type { ResolvedTheme } from '../contracts/theme.js';\nimport { createRouter, countRouteCollisions } from '../routing/router.js';\nimport { wavifyPath } from './render.js';\nimport { crossLinkMarkerId } from './markers.js';\nimport { rhu } from '../util/round.js';\n\nexport interface CrossLinkRenderResult {\n  readonly defs: string[];\n  readonly elements: SceneElement[];\n}\n\n// \u2500\u2500\u2500 Cost weights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst W_CROSS = 10_000; // per crossing with a committed route\nconst W_INTER = 3_000; // port conflict with another cross-link (same wall+pos)\nconst W_SIDE = 800; // wrong-side wall (not facing the target)\nconst W_INTRA = 500; // port conflict with an intra-diagram edge\nconst W_BEND = 50; // per excess bend\nconst W_LEN = 1; // per pixel of path length\nconst W_ALIGN = 400; // per short jog segment (orthogonal only)\n\nconst SNAP_THRESHOLD = 14; // snap near-aligned E/W (or N/S) port pairs\nconst CONFLICT_RADIUS = 28; // pixel radius for port conflict detection\nconst CELL_SHRINK = 12; // px to shrink intermediate cell rects\nconst CHANNEL_GAP = 12; // gap between overlapping parallel segments\nconst ROUTE_PADDING = 12; // obstacle clearance during routing\n\n/** Fractional wall positions tried per candidate (0 = wall start, 1 = wall end). */\nconst WALL_TS: readonly number[] = [0.1, 0.25, 0.5, 0.75, 0.9];\n\n/**\n * Pre-assigned port constraints produced by Pass 0 (shared-endpoint ordering).\n * Any field present collapses the corresponding search dimension in findBestRoute.\n */\ninterface PortHint {\n  readonly srcWall?: CardinalSide;\n  readonly srcT?: number;\n  readonly dstWall?: CardinalSide;\n  readonly dstT?: number;\n}\n\nconst ARROW_ID = 'triton-crosslink-arrow';\nconst BI_ARROW_ID = 'triton-crosslink-arrow-both';\n\n// \u2500\u2500\u2500 Internal geometry types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A horizontal segment for H/V crossing detection. */\ninterface HSegment {\n  readonly y: number;\n  readonly x1: number;\n  readonly x2: number;\n}\n/** A vertical segment for H/V crossing detection. */\ninterface VSegment {\n  readonly x: number;\n  readonly y1: number;\n  readonly y2: number;\n}\n\n// \u2500\u2500\u2500 Internal route types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface CommittedRoute {\n  readonly linkIdx: number;\n  readonly srcKey: string;\n  readonly dstKey: string;\n  readonly srcWall: CardinalSide;\n  readonly srcT: number;\n  readonly srcPort: Point;\n  readonly dstWall: CardinalSide;\n  readonly dstT: number;\n  readonly dstPort: Point;\n  /** Actual curve points (sampled for bezier, vertices for orthogonal/straight). */\n  readonly points: readonly Point[];\n  /** Raw router output \u2014 [from, cp1, cp2, to] for bezier, equals points otherwise. */\n  readonly rawPts: readonly Point[];\n  readonly isBezier: boolean;\n  /** Pre-computed H/V decomposition (empty arrays for non-orthogonal). */\n  readonly hSegs: readonly HSegment[];\n  readonly vSegs: readonly VSegment[];\n}\n\ninterface WorkingRoute {\n  points: Point[];\n  isBezier?: true;\n  color: string;\n  dash?: string;\n  strokeWidth?: number;\n  isWavy?: boolean;\n  wavyAmplitude?: number;\n  wavyWavelength?: number;\n  animation?: RenderedConnectorAnimation;\n  markerEnd?: string;\n  markerStart?: string;\n  label?: string;\n  labelPlacement?: 'path-midpoint';\n}\n\n// \u2500\u2500\u2500 Entry point \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function routeAndRenderCrossLinks3(\n  links: readonly CrossLink[],\n  theme: ResolvedTheme,\n  anchors: NodeAnchorRegistry,\n  intraPorts?: readonly OccupiedPort[],\n  occupiedRects?: readonly Rect[],\n  routingObstacles?: readonly Rect[],\n  cellRects?: ReadonlyMap<string, Rect>,\n): CrossLinkRenderResult {\n  const { palette, typography, edges: edgeTheme } = theme;\n  const elements: SceneElement[] = [];\n  const defs: string[] = [];\n\n  // \u2500\u2500 Colour assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const PALETTE = [\n    '#E11D48',\n    '#16A34A',\n    '#9333EA',\n    '#0891B2',\n    '#CA8A04',\n    '#DC2626',\n    '#2563EB',\n    '#7C3AED',\n  ];\n  let explicitColorIdx = 0;\n\n  const allNodeBounds: Rect[] = Object.values(anchors).map((a) => a.bounds);\n\n  const addrKey = (addr: { cellPath: readonly string[]; nodeId: string }): string =>\n    [...addr.cellPath, addr.nodeId].join('.');\n\n  function centerOf(key: string): Point {\n    const a = anchors[key];\n    return a\n      ? { x: a.bounds.x + a.bounds.width / 2, y: a.bounds.y + a.bounds.height / 2 }\n      : { x: 0, y: 0 };\n  }\n\n  // \u2500\u2500 Pass 1: Sort links axis-aligned first \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const resolvable = links.filter((l) => anchors[addrKey(l.from)] && anchors[addrKey(l.to)]);\n\n  // \u2500\u2500 Pass 0: Pre-assign ports at shared endpoints \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // For every (node, wall) that has 2+ links, sort arrivals/departures by the\n  // angular position of the other endpoint and assign evenly-spaced t values.\n  // This guarantees a non-crossing fan at the shared node before routing starts.\n  const portHints = preAssignSharedPorts(resolvable, anchors);\n\n  const sortedLinks = [...resolvable]\n    .sort((a, b) => {\n      const ca = centerOf(addrKey(a.from)),\n        cb = centerOf(addrKey(a.to));\n      const cc = centerOf(addrKey(b.from)),\n        cd = centerOf(addrKey(b.to));\n      const axA = Math.abs(cb.x - ca.x),\n        ayA = Math.abs(cb.y - ca.y);\n      const axB = Math.abs(cd.x - cc.x),\n        ayB = Math.abs(cd.y - cc.y);\n      const sA = Math.min(axA, ayA) / (Math.max(axA, ayA) + 1);\n      const sB = Math.min(axB, ayB) / (Math.max(axB, ayB) + 1);\n      if (Math.abs(sA - sB) > 0.05) return sA - sB;\n      return Math.hypot(cb.x - ca.x, cb.y - ca.y) - Math.hypot(cd.x - cc.x, cd.y - cc.y);\n    })\n    .reverse();\n\n  // \u2500\u2500 Pass 2: Greedy routing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const committed: CommittedRoute[] = [];\n  const workingByOriginalIdx = new Map<number, WorkingRoute>();\n\n  for (let si = 0; si < sortedLinks.length; si++) {\n    const link = sortedLinks[si]!;\n    const rIdx = resolvable.indexOf(link);\n    const hint = rIdx >= 0 ? portHints.get(rIdx) : undefined;\n    const best = findBestRoute(\n      si,\n      link,\n      anchors,\n      allNodeBounds,\n      cellRects,\n      committed,\n      intraPorts ?? [],\n      hint,\n      occupiedRects,\n    );\n    if (!best) continue;\n    if (countRouteCollisions(best.committed.points, allNodeBounds) > 0) {\n      console.warn(\n        `[routing] No clear route for cross-link between ${addrKey(link.from)} and ${addrKey(link.to)}: route intersects obstacles.`,\n      );\n    }\n    committed.push(best.committed);\n\n    let color: string;\n    const explicitColor = typeof link.props?.color === 'string' ? link.props.color : undefined;\n    const isMono = theme.name.startsWith('bw-') || theme.name.includes('mono');\n    if (explicitColor) {\n      color = explicitColor;\n    } else if (isMono) {\n      color = palette.primary;\n    } else {\n      color = PALETTE[explicitColorIdx % PALETTE.length]!;\n      explicitColorIdx++;\n    }\n\n    const dash = edgeStyleToDash(link.style);\n    // Animation: explicit DSL value only. All styles are STATIC by default.\n    const animation: RenderedConnectorAnimation | undefined =\n      link.animation === 'none'\n        ? undefined\n        : isRenderedConnectorAnimation(link.animation)\n          ? link.animation\n          : undefined;\n\n    let markerEnd: string | undefined;\n    let markerStart: string | undefined;\n    if (link.direction === 'directed') {\n      markerEnd = crossLinkMarkerId(ARROW_ID, color);\n    } else if (link.direction === 'bidirectional') {\n      markerEnd = crossLinkMarkerId(ARROW_ID, color);\n      markerStart = crossLinkMarkerId(BI_ARROW_ID, color);\n    }\n\n    const strokeWidth = link.style === 'thick' ? (edgeTheme.strokeWidth + 0.5) * 2 : undefined;\n    const isWavy = link.style === 'wavy';\n    const wavyAmp = (link.props?.amplitude as number | undefined) ?? 3;\n    const wavyLambda = (link.props?.wavelength as number | undefined) ?? 12;\n\n    const origIdx = links.indexOf(link);\n    workingByOriginalIdx.set(origIdx >= 0 ? origIdx : workingByOriginalIdx.size, {\n      points: [...best.rawPts],\n      ...(best.committed.isBezier ? { isBezier: true as const } : {}),\n      color,\n      ...(dash ? { dash } : {}),\n      ...(strokeWidth ? { strokeWidth } : {}),\n      ...(isWavy ? { isWavy: true, wavyAmplitude: wavyAmp, wavyWavelength: wavyLambda } : {}),\n      ...(animation ? { animation } : {}),\n      ...(markerEnd ? { markerEnd } : {}),\n      ...(markerStart ? { markerStart } : {}),\n      ...(link.label ? { label: link.label } : {}),\n      ...(link.props?.labelPlacement === 'path-midpoint'\n        ? { labelPlacement: 'path-midpoint' as const }\n        : {}),\n    });\n  }\n\n  // \u2500\u2500 Pass 3: Crossing repair \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  repairCrossings(\n    committed,\n    sortedLinks,\n    anchors,\n    allNodeBounds,\n    cellRects,\n    intraPorts ?? [],\n    workingByOriginalIdx,\n    links,\n    portHints,\n    resolvable,\n    occupiedRects,\n  );\n\n  // Reconstruct workingRoutes in original link order\n  const workingRoutes: WorkingRoute[] = [];\n  for (let i = 0; i < links.length; i++) {\n    const wr = workingByOriginalIdx.get(i);\n    if (wr) workingRoutes.push(wr);\n  }\n\n  // \u2500\u2500 Pass 4: Border nudging \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (routingObstacles && routingObstacles.length > 0) {\n    nudgeOffBorders(workingRoutes, routingObstacles);\n  }\n\n  // \u2500\u2500 Pass 4b: Channel separation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  separateChannels(workingRoutes);\n\n  // \u2500\u2500 Pass 5: Label staggering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const CORRIDOR_TOL = 20;\n  const labelFractions = new Array<number>(workingRoutes.length).fill(0.5);\n  const labeledIdxs = workingRoutes.map((r, i) => (r.label ? i : -1)).filter((i) => i >= 0);\n  const staggered = new Set<number>();\n\n  for (const i of labeledIdxs) {\n    if (staggered.has(i)) continue;\n    const wrI = workingRoutes[i]!;\n    const ptsI = sampledPts(wrI);\n    const infoI = dominantSegment(ptsI);\n    const group = [i];\n    for (const j of labeledIdxs) {\n      if (j === i || staggered.has(j)) continue;\n      const wrJ = workingRoutes[j]!;\n      const ptsJ = sampledPts(wrJ);\n      const infoJ = dominantSegment(ptsJ);\n      if (infoI.axis === infoJ.axis && Math.abs(infoI.coord - infoJ.coord) < CORRIDOR_TOL) {\n        group.push(j);\n      }\n    }\n    if (group.length > 1) {\n      group.sort((a, b) => a - b);\n      group.forEach((idx, k) => {\n        labelFractions[idx] = (k + 1) / (group.length + 1);\n      });\n      group.forEach((idx) => staggered.add(idx));\n    }\n  }\n\n  // \u2500\u2500 Pass 6: Emit SVG elements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const arrowMarkerColors = new Map<string, string>();\n  const biArrowMarkerColors = new Map<string, string>();\n\n  const pendingLabels: Array<{\n    content: string;\n    x: number;\n    y: number;\n    fontSize: number;\n    fontFamily: string;\n    fill: string;\n  }> = [];\n\n  for (let i = 0; i < workingRoutes.length; i++) {\n    const wr = workingRoutes[i]!;\n    let path = wr.isBezier\n      ? `M ${wr.points[0]!.x} ${wr.points[0]!.y} C ${wr.points[1]!.x} ${wr.points[1]!.y} ${wr.points[2]!.x} ${wr.points[2]!.y} ${wr.points[3]!.x} ${wr.points[3]!.y}`\n      : wr.points.map((p, pi) => `${pi === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ');\n\n    if (wr.isWavy) {\n      path = wavifyPath([...wr.points], wr.wavyAmplitude ?? 3, wr.wavyWavelength ?? 12);\n    }\n\n    if (wr.markerEnd) arrowMarkerColors.set(wr.markerEnd, wr.color);\n    if (wr.markerStart) biArrowMarkerColors.set(wr.markerStart, wr.color);\n\n    elements.push({\n      type: 'path',\n      d: path,\n      stroke: wr.color,\n      strokeWidth: wr.strokeWidth ?? edgeTheme.strokeWidth + 0.5,\n      ...(wr.dash ? { strokeDasharray: wr.dash } : {}),\n      ...(wr.animation ? { animated: wr.animation } : {}),\n      ...(wr.markerEnd ? { markerEnd: wr.markerEnd } : {}),\n      ...(wr.markerStart ? { markerStart: wr.markerStart } : {}),\n    });\n\n    if (wr.label) {\n      const pts = sampledPts(wr);\n      // Staggered labels (parallel links sharing a corridor) keep their\n      // length-fraction offset so they don't stack. Otherwise anchor the label\n      // on the route's longest HORIZONTAL run \u2014 labels are horizontal text and\n      // read best along a horizontal segment, and this avoids parking them on a\n      // short/outboard vertical channel that may sit at the diagram edge.\n      const labelPos =\n        staggered.has(i) || wr.isBezier || wr.labelPlacement === 'path-midpoint'\n          ? pointAtFrac(pts, labelFractions[i] ?? 0.5)\n          : labelAnchor(pts);\n      pendingLabels.push({\n        content: wr.label,\n        x: labelPos.x,\n        y: labelPos.y - 6,\n        fontSize: edgeTheme.labelFontSize,\n        fontFamily: typography.fontFamily,\n        fill: wr.color,\n      });\n    }\n  }\n\n  // Label de-collision\n  const CHAR_W = 0.65;\n  const LABEL_PAD = 4;\n  const fixedRects: Rect[] = [...allNodeBounds, ...(occupiedRects ?? [])];\n  const labelRects = pendingLabels.map((l) => ({\n    x: l.x - (l.content.length * l.fontSize * CHAR_W) / 2 - LABEL_PAD,\n    y: l.y - l.fontSize,\n    width: l.content.length * l.fontSize * CHAR_W + LABEL_PAD * 2,\n    height: l.fontSize + LABEL_PAD * 2,\n  }));\n  deCollideLabels(labelRects, fixedRects);\n\n  for (let i = 0; i < pendingLabels.length; i++) {\n    const l = pendingLabels[i]!;\n    const r = labelRects[i]!;\n    elements.push({\n      type: 'rect',\n      bounds: {\n        x: r.x,\n        y: r.y,\n        width: r.width,\n        height: r.height,\n      },\n      fill: palette.background,\n      stroke: 'none',\n      strokeWidth: 0,\n      rx: 3,\n    });\n    elements.push({\n      type: 'text',\n      content: l.content,\n      position: { x: r.x + r.width / 2, y: r.y + r.height - LABEL_PAD },\n      fontSize: l.fontSize,\n      fontFamily: typography.fontFamily,\n      fill: l.fill,\n      anchor: 'middle',\n      fontWeight: 'bold',\n    });\n  }\n\n  const s = edgeTheme.arrowSize;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n  for (const [id, color] of arrowMarkerColors) {\n    defs.push(\n      `<marker id=\"${id}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\">` +\n        `<polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${color}\" /></marker>`,\n    );\n  }\n  for (const [id, color] of biArrowMarkerColors) {\n    defs.push(\n      `<marker id=\"${id}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"1\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\">` +\n        `<polygon points=\"${s} 0, 0 ${sMidY}, ${s} ${sH}\" fill=\"${color}\" /></marker>`,\n    );\n  }\n\n  return { defs, elements };\n}\n\n// \u2500\u2500\u2500 Route finding (shared by greedy pass and repair pass) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction findBestRoute(\n  linkIdx: number,\n  link: CrossLink,\n  anchors: NodeAnchorRegistry,\n  allNodeBounds: Rect[],\n  cellRects: ReadonlyMap<string, Rect> | undefined,\n  committed: readonly CommittedRoute[],\n  intraPorts: readonly OccupiedPort[],\n  portHint?: PortHint,\n  occupiedRects?: readonly Rect[],\n): { committed: CommittedRoute; rawPts: readonly Point[] } | null {\n  const addrKey = (addr: { cellPath: readonly string[]; nodeId: string }): string =>\n    [...addr.cellPath, addr.nodeId].join('.');\n\n  const srcKey = addrKey(link.from);\n  const dstKey = addrKey(link.to);\n  const srcAnchor = anchors[srcKey];\n  const dstAnchor = anchors[dstKey];\n  if (!srcAnchor || !dstAnchor) return null;\n\n  const srcCenter: Point = {\n    x: srcAnchor.bounds.x + srcAnchor.bounds.width / 2,\n    y: srcAnchor.bounds.y + srcAnchor.bounds.height / 2,\n  };\n  const dstCenter: Point = {\n    x: dstAnchor.bounds.x + dstAnchor.bounds.width / 2,\n    y: dstAnchor.bounds.y + dstAnchor.bounds.height / 2,\n  };\n\n  // Build per-link obstacle list.\n  // Nodes inside the source/dest cells must NOT be obstacles \u2014 they are the\n  // \"interior terrain\" of the endpoint cells.  Without this exclusion the\n  // router sees sibling nodes (e.g. Gateway next to the target Order Service)\n  // as hard obstacles and produces large detours to reach the destination port.\n  const srcCellId = link.from.cellPath.join('.');\n  const dstCellId = link.to.cellPath.join('.');\n  const sameSourceCell = (key: string): boolean =>\n    srcCellId.length > 0 && key.startsWith(srcCellId + '.');\n  const sameTargetCell = (key: string): boolean =>\n    dstCellId.length > 0 && key.startsWith(dstCellId + '.');\n  const linkObstacles: Rect[] = Object.entries(anchors)\n    .filter(([key]) => key !== srcKey && key !== dstKey)\n    .map(([key, a]) => {\n      if (sameSourceCell(key) || sameTargetCell(key)) {\n        const pad = 2;\n        return {\n          x: a.bounds.x + pad,\n          y: a.bounds.y + pad,\n          width: Math.max(0, a.bounds.width - 2 * pad),\n          height: Math.max(0, a.bounds.height - 2 * pad),\n        };\n      }\n      return a.bounds;\n    });\n  if (cellRects) {\n    for (const [cellId, r] of cellRects) {\n      if (cellId === srcCellId || cellId === dstCellId) continue;\n      const sw = r.width - 2 * CELL_SHRINK;\n      const sh = r.height - 2 * CELL_SHRINK;\n      if (sw > 0 && sh > 0) {\n        linkObstacles.push({ x: r.x + CELL_SHRINK, y: r.y + CELL_SHRINK, width: sw, height: sh });\n      }\n    }\n  }\n  if (occupiedRects && occupiedRects.length > 0) {\n    linkObstacles.push(...occupiedRects);\n  }\n\n  const routeStyle = link.routing ?? 'orthogonal';\n  const isStraight = routeStyle === 'straight';\n  const sides: CardinalSide[] = ['N', 'S', 'E', 'W'];\n  // Collapse search dimensions. Precedence: explicit user exit/entry walls win,\n  // then phase-0 shared-port fan hints, then full 4-wall search.\n  const srcWalls: CardinalSide[] = link.exitWall\n    ? [link.exitWall]\n    : portHint?.srcWall\n      ? [portHint.srcWall]\n      : isStraight\n        ? [idealSrcWall(srcCenter, dstCenter)]\n        : sides;\n  const dstWalls: CardinalSide[] = link.entryWall\n    ? [link.entryWall]\n    : portHint?.dstWall\n      ? [portHint.dstWall]\n      : isStraight\n        ? [idealDstWall(srcCenter, dstCenter)]\n        : sides;\n  // Honor a phase-0 fan t whenever one was assigned. Pinned walls always get a\n  // fan slot (centre when alone, evenly spread when several share the wall), so\n  // this is what centres the port on the wall.\n  const srcTs: readonly number[] =\n    portHint?.srcT !== undefined ? [portHint.srcT] : isStraight ? [0.5] : WALL_TS;\n  const dstTs: readonly number[] =\n    portHint?.dstT !== undefined ? [portHint.dstT] : isStraight ? [0.5] : WALL_TS;\n\n  let gridMinX = Infinity,\n    gridMaxX = -Infinity,\n    gridMinY = Infinity,\n    gridMaxY = -Infinity;\n  if (cellRects && cellRects.size > 0) {\n    for (const r of cellRects.values()) {\n      if (r.x < gridMinX) gridMinX = r.x;\n      if (r.x + r.width > gridMaxX) gridMaxX = r.x + r.width;\n      if (r.y < gridMinY) gridMinY = r.y;\n      if (r.y + r.height > gridMaxY) gridMaxY = r.y + r.height;\n    }\n  }\n  const hasGridBounds = gridMinX < gridMaxX;\n\n  let bestScore = Infinity;\n  let bestCommitted!: CommittedRoute;\n  let bestRawPts!: readonly Point[];\n\n  for (const ss of srcWalls) {\n    for (const ds of dstWalls) {\n      for (const srcT of srcTs) {\n        for (const dstT of dstTs) {\n          let sp = wallPoint(srcAnchor.bounds, ss, srcT);\n          let dp = wallPoint(dstAnchor.bounds, ds, dstT);\n\n          // Snap near-aligned pairs to exact alignment (eliminates jog segments)\n          const snapped = snapAlignment(ss, sp, ds, dp);\n          sp = snapped.srcPort;\n          dp = snapped.dstPort;\n\n          const router = createRouter(routeStyle);\n          const routePadding =\n            typeof link.props?.routePadding === 'number' ? link.props.routePadding : ROUTE_PADDING;\n          const routeObstacles = [\n            ...linkObstacles,\n            ...forcedAwayEndpointObstacles(\n              link,\n              ss,\n              ds,\n              srcCenter,\n              dstCenter,\n              anchors,\n              cellRects,\n              srcKey,\n              dstKey,\n              srcCellId,\n              dstCellId,\n              sameSourceCell,\n              sameTargetCell,\n            ),\n          ];\n          const route = router.route({\n            from: sp,\n            to: dp,\n            style: routeStyle,\n            obstacles: routeObstacles,\n            padding: routePadding,\n            fromDir: ss as PortDirection,\n            toDir: ds as PortDirection,\n            noWarn: true,\n          } as any);\n          const rawPts = route.points as Point[];\n\n          const isBez = routeStyle === 'bezier' && rawPts.length === 4;\n          const pts: readonly Point[] = isBez\n            ? sampleCubicBezier(rawPts[0]!, rawPts[1]!, rawPts[2]!, rawPts[3]!, 12)\n            : rawPts;\n\n          const { hSegs, vSegs } = decomposeHV(pts, routeStyle);\n\n          // \u2500\u2500 Unified cost function \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n          const collisions = countRouteCollisions(pts, routeObstacles);\n          const marginPenalty =\n            hasGridBounds &&\n            pts.some(\n              (p) =>\n                p.x < gridMinX - 1 ||\n                p.x > gridMaxX + 1 ||\n                p.y < gridMinY - 1 ||\n                p.y > gridMaxY + 1,\n            )\n              ? 50_000\n              : 0;\n          const score =\n            collisions * 100000 +\n            marginPenalty +\n            sidePenalty(ss, ds, srcCenter, dstCenter) +\n            crossingScore(pts, hSegs, vSegs, isBez, committed) +\n            portConflictScore(\n              srcKey,\n              ss,\n              sp,\n              srcT,\n              dstKey,\n              ds,\n              dp,\n              dstT,\n              committed,\n              intraPorts,\n              anchors,\n            ) +\n            (isBez ? 0 : Math.max(0, rawPts.length - 2) * W_BEND) +\n            pathLen(pts) * W_LEN +\n            (isBez ? 0 : alignPenalty(rawPts));\n\n          if (score < bestScore) {\n            bestScore = score;\n            bestRawPts = rawPts;\n            bestCommitted = {\n              linkIdx,\n              srcKey,\n              dstKey,\n              srcWall: ss,\n              srcT,\n              srcPort: sp,\n              dstWall: ds,\n              dstT,\n              dstPort: dp,\n              points: pts,\n              rawPts,\n              isBezier: isBez,\n              hSegs,\n              vSegs,\n            };\n          }\n        }\n      }\n    }\n  }\n\n  return bestScore < Infinity ? { committed: bestCommitted, rawPts: bestRawPts } : null;\n}\n\nfunction forcedAwayEndpointObstacles(\n  link: CrossLink,\n  srcWall: CardinalSide,\n  dstWall: CardinalSide,\n  srcCenter: Point,\n  dstCenter: Point,\n  anchors: NodeAnchorRegistry,\n  cellRects: ReadonlyMap<string, Rect> | undefined,\n  srcKey: string,\n  dstKey: string,\n  srcCellId: string,\n  dstCellId: string,\n  sameSourceCell: (key: string) => boolean,\n  sameTargetCell: (key: string) => boolean,\n): Rect[] {\n  const exitAway = link.exitWall !== undefined && wallFacesAway(srcWall, srcCenter, dstCenter);\n  const entryAway = link.entryWall !== undefined && wallFacesAway(dstWall, dstCenter, srcCenter);\n  const rects: Rect[] = [anchors[srcKey]?.bounds, anchors[dstKey]?.bounds].filter(\n    (r): r is Rect => r !== undefined,\n  );\n\n  if (exitAway || entryAway) {\n    for (const [key, anchor] of Object.entries(anchors)) {\n      if (sameSourceCell(key) || sameTargetCell(key)) rects.push(anchor.bounds);\n    }\n    const srcCell = cellRects?.get(srcCellId);\n    const dstCell = cellRects?.get(dstCellId);\n    if (srcCell) rects.push(srcCell);\n    if (dstCell) rects.push(dstCell);\n  }\n\n  return rects;\n}\n\nfunction wallFacesAway(wall: CardinalSide, fromCenter: Point, toCenter: Point): boolean {\n  const nx = wall === 'E' ? 1 : wall === 'W' ? -1 : 0;\n  const ny = wall === 'S' ? 1 : wall === 'N' ? -1 : 0;\n  const vx = toCenter.x - fromCenter.x;\n  const vy = toCenter.y - fromCenter.y;\n  return vx * nx + vy * ny < 0;\n}\n\n// \u2500\u2500\u2500 Pass 3: Crossing repair \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction repairCrossings(\n  committed: CommittedRoute[],\n  sortedLinks: readonly CrossLink[],\n  anchors: NodeAnchorRegistry,\n  allNodeBounds: Rect[],\n  cellRects: ReadonlyMap<string, Rect> | undefined,\n  intraPorts: readonly OccupiedPort[],\n  workingByOrigIdx: Map<number, WorkingRoute>,\n  links: readonly CrossLink[],\n  portHints: ReadonlyMap<number, PortHint>,\n  resolvable: readonly CrossLink[],\n  occupiedRects?: readonly Rect[],\n): void {\n  // One repair pass: for each crossing pair (i committed before j), try re-routing j\n  for (let j = 1; j < committed.length; j++) {\n    const crJ = committed[j]!;\n\n    // Count crossings between j and any earlier route\n    let jCrossings = 0;\n    for (let i = 0; i < j; i++) {\n      jCrossings += countCrossingsBetween(committed[i]!, crJ);\n    }\n    if (jCrossings === 0) continue;\n\n    // Attempt re-route of j with all other routes committed except j itself\n    const committedWithoutJ = committed.filter((_, k) => k !== j);\n    const link = sortedLinks[crJ.linkIdx];\n    if (!link) continue;\n\n    const rIdx = resolvable.indexOf(link);\n    const hint = rIdx >= 0 ? portHints.get(rIdx) : undefined;\n    const result = findBestRoute(\n      crJ.linkIdx,\n      link,\n      anchors,\n      allNodeBounds,\n      cellRects,\n      committedWithoutJ,\n      intraPorts,\n      hint,\n      occupiedRects,\n    );\n    if (!result) continue;\n\n    // Accept only if new route has fewer crossings with earlier routes\n    let newCrossings = 0;\n    for (let i = 0; i < j; i++) {\n      newCrossings += countCrossingsBetween(committed[i]!, result.committed);\n    }\n    if (newCrossings >= jCrossings) continue;\n\n    committed[j] = result.committed;\n    const origIdx = links.indexOf(link);\n    const wr = workingByOrigIdx.get(origIdx >= 0 ? origIdx : -1);\n    if (wr) {\n      wr.points = [...result.rawPts];\n      if (result.committed.isBezier) {\n        (wr as { isBezier?: true }).isBezier = true;\n      } else {\n        delete (wr as { isBezier?: true }).isBezier;\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 H/V crossing detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Decompose a polyline into horizontal and vertical segments for fast\n * crossing detection. Only meaningful for orthogonal routes.\n */\nfunction decomposeHV(\n  pts: readonly Point[],\n  style: string,\n): { hSegs: HSegment[]; vSegs: VSegment[] } {\n  const hSegs: HSegment[] = [];\n  const vSegs: VSegment[] = [];\n  if (style !== 'orthogonal') return { hSegs, vSegs };\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!,\n      b = pts[i + 1]!;\n    if (Math.abs(b.y - a.y) < 0.5 && Math.abs(b.x - a.x) > 0.5) {\n      hSegs.push({ y: (a.y + b.y) / 2, x1: Math.min(a.x, b.x), x2: Math.max(a.x, b.x) });\n    } else if (Math.abs(b.x - a.x) < 0.5 && Math.abs(b.y - a.y) > 0.5) {\n      vSegs.push({ x: (a.x + b.x) / 2, y1: Math.min(a.y, b.y), y2: Math.max(a.y, b.y) });\n    }\n  }\n  return { hSegs, vSegs };\n}\n\n/** Count H/V crossings between two sets of decomposed segments. */\nfunction countHVCrossings(\n  aH: readonly HSegment[],\n  aV: readonly VSegment[],\n  bH: readonly HSegment[],\n  bV: readonly VSegment[],\n): number {\n  let n = 0;\n  for (const h of aH) for (const v of bV) if (hvCross(h, v)) n++;\n  for (const v of aV) for (const h of bH) if (hvCross(h, v)) n++;\n  return n;\n}\n\n/** True iff a horizontal and a vertical segment properly intersect (not touch). */\nfunction hvCross(h: HSegment, v: VSegment): boolean {\n  return v.x > h.x1 && v.x < h.x2 && h.y > v.y1 && h.y < v.y2;\n}\n\n/** Count crossings between two polylines using AABB prefilter + proper intersection. */\nfunction countPolylineCrossings(a: readonly Point[], b: readonly Point[]): number {\n  let n = 0;\n  for (let i = 0; i < a.length - 1; i++) {\n    const a1 = a[i]!,\n      a2 = a[i + 1]!;\n    const axMin = Math.min(a1.x, a2.x),\n      axMax = Math.max(a1.x, a2.x);\n    const ayMin = Math.min(a1.y, a2.y),\n      ayMax = Math.max(a1.y, a2.y);\n    for (let j = 0; j < b.length - 1; j++) {\n      const b1 = b[j]!,\n        b2 = b[j + 1]!;\n      // AABB prefilter\n      if (axMax < Math.min(b1.x, b2.x) || axMin > Math.max(b1.x, b2.x)) continue;\n      if (ayMax < Math.min(b1.y, b2.y) || ayMin > Math.max(b1.y, b2.y)) continue;\n      if (properlyCross(a1, a2, b1, b2)) n++;\n    }\n  }\n  return n;\n}\n\n/** Count crossings between a candidate and a single committed route. */\nfunction countCrossingsBetween(a: CommittedRoute, b: CommittedRoute): number {\n  if (!a.isBezier && !b.isBezier) {\n    return countHVCrossings(a.hSegs, a.vSegs, b.hSegs, b.vSegs);\n  }\n  return countPolylineCrossings(a.points, b.points);\n}\n\n/** Total crossing score for a candidate against all committed routes. */\nfunction crossingScore(\n  pts: readonly Point[],\n  hSegs: readonly HSegment[],\n  vSegs: readonly VSegment[],\n  isBezier: boolean,\n  committed: readonly CommittedRoute[],\n): number {\n  let crossings = 0;\n  for (const cr of committed) {\n    if (!isBezier && !cr.isBezier) {\n      crossings += countHVCrossings(hSegs, vSegs, cr.hSegs, cr.vSegs);\n    } else {\n      crossings += countPolylineCrossings(pts, cr.points);\n    }\n  }\n  return crossings * W_CROSS;\n}\n\n// \u2500\u2500\u2500 Cost function components \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Side preference penalty.\n * Ideal source wall faces the target; ideal destination wall faces back.\n * Each step away from ideal costs W_SIDE.\n */\nfunction sidePenalty(\n  srcWall: CardinalSide,\n  dstWall: CardinalSide,\n  srcCenter: Point,\n  dstCenter: Point,\n): number {\n  const dx = dstCenter.x - srcCenter.x;\n  const dy = dstCenter.y - srcCenter.y;\n  const absX = Math.abs(dx),\n    absY = Math.abs(dy);\n\n  const idealSrc: CardinalSide = absX >= absY ? (dx >= 0 ? 'E' : 'W') : dy >= 0 ? 'S' : 'N';\n  const idealDst: CardinalSide = absX >= absY ? (dx >= 0 ? 'W' : 'E') : dy >= 0 ? 'N' : 'S';\n\n  return sideSteps(srcWall, idealSrc) * W_SIDE + sideSteps(dstWall, idealDst) * W_SIDE;\n}\n\nfunction sideSteps(wall: CardinalSide, ideal: CardinalSide): number {\n  if (wall === ideal) return 0;\n  const opp: Record<CardinalSide, CardinalSide> = { N: 'S', S: 'N', E: 'W', W: 'E' };\n  return opp[wall] === ideal ? 2 : 1;\n}\n\n/**\n * Two-tier port conflict penalty.\n * W_INTER for cross-link vs cross-link conflicts (strongly discouraged).\n * W_INTRA for cross-link vs intra-diagram edge (softer, can be overridden).\n */\nfunction portConflictScore(\n  srcKey: string,\n  srcWall: CardinalSide,\n  srcPt: Point,\n  _srcT: number,\n  dstKey: string,\n  dstWall: CardinalSide,\n  dstPt: Point,\n  _dstT: number,\n  committed: readonly CommittedRoute[],\n  intraPorts: readonly OccupiedPort[],\n  anchors: NodeAnchorRegistry,\n): number {\n  let penalty = 0;\n\n  // Cross-link vs cross-link (W_INTER)\n  for (const cr of committed) {\n    for (const [key, wall, pt] of [\n      [cr.srcKey, cr.srcWall, cr.srcPort] as const,\n      [cr.dstKey, cr.dstWall, cr.dstPort] as const,\n    ]) {\n      if (key === srcKey && wall === srcWall) {\n        const d = Math.hypot(srcPt.x - pt.x, srcPt.y - pt.y);\n        if (d < CONFLICT_RADIUS) penalty += W_INTER * (1 - d / CONFLICT_RADIUS);\n      }\n      if (key === dstKey && wall === dstWall) {\n        const d = Math.hypot(dstPt.x - pt.x, dstPt.y - pt.y);\n        if (d < CONFLICT_RADIUS) penalty += W_INTER * (1 - d / CONFLICT_RADIUS);\n      }\n    }\n  }\n\n  // Cross-link vs intra-diagram (W_INTRA)\n  for (const ip of intraPorts) {\n    const anchor = anchors[ip.nodeKey];\n    if (!anchor) continue;\n    const ipPt = wallPoint(anchor.bounds, ip.wall, ip.t);\n    if (ip.nodeKey === srcKey && ip.wall === srcWall) {\n      const d = Math.hypot(srcPt.x - ipPt.x, srcPt.y - ipPt.y);\n      if (d < CONFLICT_RADIUS) penalty += W_INTRA * (1 - d / CONFLICT_RADIUS);\n    }\n    if (ip.nodeKey === dstKey && ip.wall === dstWall) {\n      const d = Math.hypot(dstPt.x - ipPt.x, dstPt.y - ipPt.y);\n      if (d < CONFLICT_RADIUS) penalty += W_INTRA * (1 - d / CONFLICT_RADIUS);\n    }\n  }\n\n  return penalty;\n}\n\n/** Flat penalty per short jog segment (orthogonal only). */\nfunction alignPenalty(pts: readonly Point[]): number {\n  let p = 0;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!,\n      b = pts[i + 1]!;\n    if (Math.hypot(b.x - a.x, b.y - a.y) < SNAP_THRESHOLD) p += W_ALIGN;\n  }\n  return p;\n}\n\n// \u2500\u2500\u2500 Port alignment snap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction snapAlignment(\n  ss: CardinalSide,\n  sp: Point,\n  ds: CardinalSide,\n  dp: Point,\n): { srcPort: Point; dstPort: Point } {\n  const sH = ss === 'E' || ss === 'W',\n    dH = ds === 'E' || ds === 'W';\n  if (sH && dH && Math.abs(sp.y - dp.y) < SNAP_THRESHOLD) {\n    const avgY = (sp.y + dp.y) / 2;\n    return { srcPort: { x: sp.x, y: avgY }, dstPort: { x: dp.x, y: avgY } };\n  }\n  const sV = ss === 'N' || ss === 'S',\n    dV = ds === 'N' || ds === 'S';\n  if (sV && dV && Math.abs(sp.x - dp.x) < SNAP_THRESHOLD) {\n    const avgX = (sp.x + dp.x) / 2;\n    return { srcPort: { x: avgX, y: sp.y }, dstPort: { x: avgX, y: dp.y } };\n  }\n  return { srcPort: sp, dstPort: dp };\n}\n\n// \u2500\u2500\u2500 Pass 0: Shared-endpoint port pre-assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * For every (node, wall) pair that has 2+ cross-links touching it, assign\n * evenly-spaced t values sorted by the angular position of the OTHER endpoint\n * along the wall's tangent direction.\n *\n * Invariant: if two routes share a node wall, their t values are ordered the\n * same way as the spatial positions of their other endpoints \u2014 so the routes\n * form a non-crossing fan at the shared node, eliminating the need for repair.\n */\nfunction preAssignSharedPorts(\n  links: readonly CrossLink[],\n  anchors: NodeAnchorRegistry,\n): Map<number, PortHint> {\n  const key = (addr: { cellPath: readonly string[]; nodeId: string }) =>\n    [...addr.cellPath, addr.nodeId].join('.');\n\n  // Step 1: determine ideal wall for each endpoint\n  const walls: Array<{ srcWall: CardinalSide; dstWall: CardinalSide }> = links.map((link) => {\n    const sa = anchors[key(link.from)];\n    const da = anchors[key(link.to)];\n    if (!sa || !da) return { srcWall: 'E' as CardinalSide, dstWall: 'W' as CardinalSide };\n    const sc = rectCenter(sa.bounds),\n      dc = rectCenter(da.bounds);\n    return {\n      srcWall: link.exitWall ?? idealSrcWall(sc, dc),\n      dstWall: link.entryWall ?? idealDstWall(sc, dc),\n    };\n  });\n\n  // Step 2: group by (nodeKey, wall)\n  type Entry = { linkIdx: number; isSource: boolean; tangentKey: number };\n  const groups = new Map<string, Entry[]>();\n\n  for (let i = 0; i < links.length; i++) {\n    const link = links[i]!;\n    const srcKey = key(link.from);\n    const dstKey = key(link.to);\n    const sa = anchors[srcKey];\n    const da = anchors[dstKey];\n    if (!sa || !da) continue;\n\n    const { srcWall, dstWall } = walls[i]!;\n    const sc = rectCenter(sa.bounds),\n      dc = rectCenter(da.bounds);\n\n    // tangent key = position of the OTHER endpoint along the wall's tangent axis\n    // N/S walls run horizontally \u2192 sort by x; E/W walls run vertically \u2192 sort by y\n    const srcTK = srcWall === 'N' || srcWall === 'S' ? dc.x : dc.y;\n    const dstTK = dstWall === 'N' || dstWall === 'S' ? sc.x : sc.y;\n\n    const sg = `${srcKey}:${srcWall}`;\n    const dg = `${dstKey}:${dstWall}`;\n    if (!groups.has(sg)) groups.set(sg, []);\n    if (!groups.has(dg)) groups.set(dg, []);\n    groups.get(sg)!.push({ linkIdx: i, isSource: true, tangentKey: srcTK });\n    groups.get(dg)!.push({ linkIdx: i, isSource: false, tangentKey: dstTK });\n  }\n\n  // Step 3: assign evenly-spaced t values along each wall.\n  //   - Groups with 2+ members always fan (non-crossing arrival/departure order).\n  //   - A single link that is USER-PINNED to a wall still gets a slot so it\n  //     lands at the wall midpoint (1/(1+1)); this is the fan formula degenerating\n  //     to centre, NOT a hardcoded 0.5. Two pinned links \u2192 1/3, 2/3, and so on.\n  //   - A single AUTO link keeps its cost-search freedom (no hint emitted).\n  const result = new Map<number, PortHint>();\n\n  for (const [groupKey, members] of groups) {\n    const wall = groupKey.split(':').at(-1) as CardinalSide;\n    const pinnedHere = members.filter((m) => {\n      const l = links[m.linkIdx]!;\n      return m.isSource ? l.exitWall === wall : l.entryWall === wall;\n    });\n\n    // Which members actually get fanned on this wall.\n    // If any link is pinned here, only the pinned links share the wall slots\n    // (auto links keep searching). Otherwise fan the whole group when 2+.\n    const fanned = pinnedHere.length > 0 ? pinnedHere : members;\n    if (fanned.length < 2 && pinnedHere.length === 0) continue;\n\n    fanned.sort((a, b) => a.tangentKey - b.tangentKey);\n    const n = fanned.length;\n\n    for (let k = 0; k < n; k++) {\n      const { linkIdx, isSource } = fanned[k]!;\n      const t = (k + 1) / (n + 1);\n      const ex = result.get(linkIdx) ?? {};\n      result.set(\n        linkIdx,\n        isSource ? { ...ex, srcWall: wall, srcT: t } : { ...ex, dstWall: wall, dstT: t },\n      );\n    }\n  }\n\n  return result;\n}\n\n/** Centre of a bounding rect. */\nfunction rectCenter(r: Rect): Point {\n  return { x: r.x + r.width / 2, y: r.y + r.height / 2 };\n}\n\n/** Ideal exit wall on the source node when routing toward dst. */\nfunction idealSrcWall(sc: Point, dc: Point): CardinalSide {\n  const dx = dc.x - sc.x,\n    dy = dc.y - sc.y;\n  return Math.abs(dx) >= Math.abs(dy) ? (dx >= 0 ? 'E' : 'W') : dy >= 0 ? 'S' : 'N';\n}\n\n/** Ideal entry wall on the destination node (opposite of idealSrcWall). */\nfunction idealDstWall(sc: Point, dc: Point): CardinalSide {\n  const opp: Record<CardinalSide, CardinalSide> = { N: 'S', S: 'N', E: 'W', W: 'E' };\n  return opp[idealSrcWall(sc, dc)];\n}\n\n// \u2500\u2500\u2500 Geometry helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Point at fraction t (0=wall start, 1=wall end) along a node wall.\n * N/S: t=0 is left edge, t=1 is right edge.\n * E/W: t=0 is top edge, t=1 is bottom edge.\n */\nfunction wallPoint(bounds: Rect, wall: CardinalSide, t: number): Point {\n  const { x, y, width: w, height: h } = bounds;\n  switch (wall) {\n    case 'N':\n      return { x: x + w * t, y };\n    case 'S':\n      return { x: x + w * t, y: y + h };\n    case 'W':\n      return { x, y: y + h * t };\n    case 'E':\n      return { x: x + w, y: y + h * t };\n  }\n}\n\n/** Sample n+1 points along a cubic bezier. */\nfunction sampleCubicBezier(p0: Point, p1: Point, p2: Point, p3: Point, n: number): Point[] {\n  const pts: Point[] = [];\n  for (let i = 0; i <= n; i++) {\n    const t = i / n,\n      t2 = t * t,\n      t3 = t2 * t;\n    const mt = 1 - t,\n      mt2 = mt * mt,\n      mt3 = mt2 * mt;\n    pts.push({\n      x: mt3 * p0.x + 3 * mt2 * t * p1.x + 3 * mt * t2 * p2.x + t3 * p3.x,\n      y: mt3 * p0.y + 3 * mt2 * t * p1.y + 3 * mt * t2 * p2.y + t3 * p3.y,\n    });\n  }\n  return pts;\n}\n\n/** For bezier WorkingRoute: return sampled curve pts; otherwise return raw pts. */\nfunction sampledPts(wr: WorkingRoute): Point[] {\n  if (wr.isBezier && wr.points.length === 4) {\n    return sampleCubicBezier(wr.points[0]!, wr.points[1]!, wr.points[2]!, wr.points[3]!, 12);\n  }\n  return wr.points;\n}\n\n/** True iff two line segments properly cross (not merely touch). */\nfunction properlyCross(p1: Point, p2: Point, p3: Point, p4: Point): boolean {\n  const d1 = cross2(p3, p4, p1),\n    d2 = cross2(p3, p4, p2);\n  const d3 = cross2(p1, p2, p3),\n    d4 = cross2(p1, p2, p4);\n  return ((d1 > 0 && d2 < 0) || (d1 < 0 && d2 > 0)) && ((d3 > 0 && d4 < 0) || (d3 < 0 && d4 > 0));\n}\n\nfunction cross2(a: Point, b: Point, c: Point): number {\n  return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);\n}\n\nfunction pathLen(pts: readonly Point[]): number {\n  let len = 0;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!,\n      b = pts[i + 1]!;\n    len += Math.hypot(b.x - a.x, b.y - a.y);\n  }\n  return len;\n}\n\nfunction pointAtFrac(pts: readonly Point[], t: number): Point {\n  if (pts.length === 0) return { x: 0, y: 0 };\n  if (pts.length === 1) return pts[0]!;\n  const lens: number[] = [];\n  let total = 0;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const l = Math.hypot(pts[i + 1]!.x - pts[i]!.x, pts[i + 1]!.y - pts[i]!.y);\n    lens.push(l);\n    total += l;\n  }\n  if (total === 0) return pts[0]!;\n  let acc = 0;\n  const target = total * Math.min(Math.max(t, 0), 1);\n  for (let i = 0; i < lens.length; i++) {\n    const l = lens[i]!;\n    if (acc + l >= target) {\n      const frac = l > 0 ? (target - acc) / l : 0;\n      const a = pts[i]!,\n        b = pts[i + 1]!;\n      return { x: a.x + (b.x - a.x) * frac, y: a.y + (b.y - a.y) * frac };\n    }\n    acc += l;\n  }\n  return pts[pts.length - 1]!;\n}\n\nfunction dominantSegment(pts: readonly Point[]): { axis: 'h' | 'v'; coord: number } {\n  let bestLen = 0,\n    axis: 'h' | 'v' = 'h',\n    coord = 0;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!,\n      b = pts[i + 1]!;\n    const dx = Math.abs(b.x - a.x),\n      dy = Math.abs(b.y - a.y);\n    const len = dx + dy;\n    if (len > bestLen) {\n      bestLen = len;\n      if (dy > dx) {\n        axis = 'v';\n        coord = (a.x + b.x) / 2;\n      } else {\n        axis = 'h';\n        coord = (a.y + b.y) / 2;\n      }\n    }\n  }\n  return { axis, coord };\n}\n\n/**\n * Pick the anchor point for an edge label. Prefers the midpoint of the longest\n * HORIZONTAL segment (labels are horizontal text and read best along a\n * horizontal run), and only falls back to the longest segment overall when the\n * route has no meaningful horizontal segment (e.g. a pure vertical link).\n */\nfunction labelAnchor(pts: readonly Point[]): Point {\n  if (pts.length === 0) return { x: 0, y: 0 };\n  if (pts.length === 1) return pts[0]!;\n  let bestH = -1;\n  let hMid: Point | null = null;\n  let bestAny = -1;\n  let anyMid: Point = pts[0]!;\n  for (let i = 0; i < pts.length - 1; i++) {\n    const a = pts[i]!,\n      b = pts[i + 1]!;\n    const dx = Math.abs(b.x - a.x),\n      dy = Math.abs(b.y - a.y);\n    const len = Math.hypot(dx, dy);\n    if (len > bestAny) {\n      bestAny = len;\n      anyMid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n    }\n    if (dx > dy && dx > bestH) {\n      bestH = dx;\n      hMid = { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 };\n    }\n  }\n  return hMid ?? anyMid;\n}\n\nfunction edgeStyleToDash(style: string | undefined): string | undefined {\n  if (style === 'dotted') return '4 3';\n  if (style === 'dashed') return '8 4';\n  // 'solid', 'thick', 'wavy', undefined \u2192 no dasharray\n  return undefined;\n}\n\n// \u2500\u2500\u2500 Post-route: border nudging \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction nudgeOffBorders(routes: WorkingRoute[], borders: readonly Rect[]): void {\n  const TOLERANCE = 3,\n    NUDGE = 8;\n  const hBorderYs = borders.filter((b) => b.width > b.height).map((b) => b.y + b.height / 2);\n  const vBorderXs = borders.filter((b) => b.height >= b.width).map((b) => b.x + b.width / 2);\n  const minBorderX = vBorderXs.length > 0 ? Math.min(...vBorderXs) : -Infinity;\n  const maxBorderX = vBorderXs.length > 0 ? Math.max(...vBorderXs) : Infinity;\n  const minBorderY = hBorderYs.length > 0 ? Math.min(...hBorderYs) : -Infinity;\n  const maxBorderY = hBorderYs.length > 0 ? Math.max(...hBorderYs) : Infinity;\n\n  for (const route of routes) {\n    if (route.isBezier) continue;\n    const pts = route.points;\n    for (let i = 0; i < pts.length - 1; i++) {\n      const a = pts[i]!,\n        b = pts[i + 1]!;\n      if (Math.abs(b.y - a.y) < 1 && Math.abs(b.x - a.x) > 1) {\n        for (const borderY of hBorderYs) {\n          if (Math.abs(a.y - borderY) < TOLERANCE) {\n            let nd: number;\n            if (Math.abs(borderY - minBorderY) < TOLERANCE) {\n              nd = NUDGE;\n            } else if (Math.abs(borderY - maxBorderY) < TOLERANCE) {\n              nd = -NUDGE;\n            } else {\n              const midY =\n                (Math.min(...pts.map((p) => p.y)) + Math.max(...pts.map((p) => p.y))) / 2;\n              nd = a.y < midY ? -NUDGE : NUDGE;\n            }\n            pts[i] = { x: a.x, y: a.y + nd };\n            pts[i + 1] = { x: b.x, y: b.y + nd };\n            break;\n          }\n        }\n      } else if (Math.abs(b.x - a.x) < 1 && Math.abs(b.y - a.y) > 1) {\n        for (const borderX of vBorderXs) {\n          if (Math.abs(a.x - borderX) < TOLERANCE) {\n            let nd: number;\n            if (Math.abs(borderX - minBorderX) < TOLERANCE) {\n              nd = NUDGE;\n            } else if (Math.abs(borderX - maxBorderX) < TOLERANCE) {\n              nd = -NUDGE;\n            } else {\n              const midX =\n                (Math.min(...pts.map((p) => p.x)) + Math.max(...pts.map((p) => p.x))) / 2;\n              nd = a.x < midX ? -NUDGE : NUDGE;\n            }\n            pts[i] = { x: a.x + nd, y: a.y };\n            pts[i + 1] = { x: b.x + nd, y: b.y };\n            break;\n          }\n        }\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Post-route: channel separation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction separateChannels(routes: WorkingRoute[]): void {\n  interface Seg {\n    ri: number;\n    si: number;\n    isV: boolean;\n    coord: number;\n    lo: number;\n    hi: number;\n  }\n  const segs: Seg[] = [];\n  for (let ri = 0; ri < routes.length; ri++) {\n    if (routes[ri]!.isBezier) continue;\n    const pts = routes[ri]!.points;\n    for (let si = 1; si < pts.length - 2; si++) {\n      const a = pts[si]!,\n        b = pts[si + 1]!;\n      const dx = Math.abs(b.x - a.x),\n        dy = Math.abs(b.y - a.y);\n      if (dx < 1 && dy > 1) {\n        segs.push({\n          ri,\n          si,\n          isV: true,\n          coord: (a.x + b.x) / 2,\n          lo: Math.min(a.y, b.y),\n          hi: Math.max(a.y, b.y),\n        });\n      } else if (dy < 1 && dx > 1) {\n        segs.push({\n          ri,\n          si,\n          isV: false,\n          coord: (a.y + b.y) / 2,\n          lo: Math.min(a.x, b.x),\n          hi: Math.max(a.x, b.x),\n        });\n      }\n    }\n  }\n\n  const COORD_TOL = 10;\n  const used = new Set<number>();\n  for (let i = 0; i < segs.length; i++) {\n    if (used.has(i)) continue;\n    const si = segs[i]!;\n    const group = [i];\n    for (let j = i + 1; j < segs.length; j++) {\n      if (used.has(j)) continue;\n      const sj = segs[j]!;\n      if (sj.isV !== si.isV) continue;\n      if (Math.abs(sj.coord - si.coord) > COORD_TOL) continue;\n      if (sj.hi - si.lo > 8 && si.hi - sj.lo > 8) {\n        group.push(j);\n        used.add(j);\n      }\n    }\n    used.add(i);\n    if (group.length < 2) continue;\n    const n = group.length;\n    for (let k = 0; k < n; k++) {\n      const seg = segs[group[k]!]!;\n      const offset = (k - (n - 1) / 2) * CHANNEL_GAP;\n      const pts = routes[seg.ri]!.points;\n      if (seg.isV) {\n        pts[seg.si] = { x: pts[seg.si]!.x + offset, y: pts[seg.si]!.y };\n        pts[seg.si + 1] = { x: pts[seg.si + 1]!.x + offset, y: pts[seg.si + 1]!.y };\n      } else {\n        pts[seg.si] = { x: pts[seg.si]!.x, y: pts[seg.si]!.y + offset };\n        pts[seg.si + 1] = { x: pts[seg.si + 1]!.x, y: pts[seg.si + 1]!.y + offset };\n      }\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Label de-collision \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction deCollideLabels(\n  labelRects: Array<{ x: number; y: number; width: number; height: number }>,\n  fixedRects: readonly Rect[],\n): void {\n  const MAX_PASSES = 20,\n    NUDGE = 2;\n  for (let pass = 0; pass < MAX_PASSES; pass++) {\n    let moved = false;\n    for (const lr of labelRects) {\n      for (const fr of fixedRects) {\n        if (!rectsOverlap(lr, fr)) continue;\n        const ox = Math.min(lr.x + lr.width, fr.x + fr.width) - Math.max(lr.x, fr.x);\n        const oy = Math.min(lr.y + lr.height, fr.y + fr.height) - Math.max(lr.y, fr.y);\n        if (ox <= oy) {\n          lr.x =\n            lr.x + lr.width / 2 <= fr.x + fr.width / 2\n              ? fr.x - lr.width - NUDGE\n              : fr.x + fr.width + NUDGE;\n        } else {\n          lr.y =\n            lr.y + lr.height / 2 <= fr.y + fr.height / 2\n              ? fr.y - lr.height - NUDGE\n              : fr.y + fr.height + NUDGE;\n        }\n        moved = true;\n      }\n    }\n    for (let i = 0; i < labelRects.length; i++) {\n      for (let j = i + 1; j < labelRects.length; j++) {\n        const a = labelRects[i]!,\n          b = labelRects[j]!;\n        if (!rectsOverlap(a, b)) continue;\n        const oy = Math.min(a.y + a.height, b.y + b.height) - Math.max(a.y, b.y);\n        if (a.y + a.height / 2 <= b.y + b.height / 2) {\n          a.y -= oy / 2 + NUDGE;\n          b.y += oy / 2 + NUDGE;\n        } else {\n          a.y += oy / 2 + NUDGE;\n          b.y -= oy / 2 + NUDGE;\n        }\n        moved = true;\n      }\n    }\n    if (!moved) break;\n  }\n}\n\nfunction rectsOverlap(a: Rect, b: Rect): boolean {\n  return a.x < b.x + b.width && a.x + a.width > b.x && a.y < b.y + b.height && a.y + a.height > b.y;\n}\n", "/**\n * Diagram-agnostic post-layout connector stage.\n *\n * This is the neutral seam over the existing cross-link routing/rendering\n * engine. Callers lower their own semantics to local endpoint keys; poster uses\n * its NodeAddress adapter, while single diagrams can use plain keys like `c3`.\n */\n\nimport type { SceneElement } from '../contracts/scene.js';\nimport type { CardinalSide, NodeAnchorRegistry, OccupiedPort } from '../contracts/anchors.js';\nimport type {\n  CrossLink,\n  CrossLinkAnimation,\n  CrossLinkDirection,\n  CrossLinkEdgeStyle,\n  NodeAddress,\n} from '../contracts/crosslink.js';\nimport type { Rect } from '../contracts/primitives.js';\nimport type { CurveStyle, RouteStyle } from '../contracts/routing.js';\nimport type { ResolvedTheme } from '../contracts/theme.js';\nimport { routeAndRenderCrossLinks3 } from './engine3.js';\n\nexport interface NormalizedConnectorSpec {\n  readonly fromKey: string;\n  readonly toKey: string;\n  readonly direction: CrossLinkDirection;\n  readonly style: CrossLinkEdgeStyle;\n  readonly label?: string;\n  readonly routing?: RouteStyle;\n  readonly curveStyle?: CurveStyle;\n  readonly exitWall?: CardinalSide;\n  readonly entryWall?: CardinalSide;\n  readonly animation?: CrossLinkAnimation;\n  readonly props?: Readonly<Record<string, string | number>>;\n  /**\n   * Optional blocked-container IDs for endpoint-aware obstacle exclusion.\n   * Poster passes cell paths here; local DS diagrams normally omit them.\n   */\n  readonly fromContainerKey?: string;\n  readonly toContainerKey?: string;\n}\n\nexport interface ConnectorDiagnostic {\n  readonly connectorIndex: number;\n  readonly message: string;\n}\n\nexport interface ConnectorExtents {\n  readonly minX: number;\n  readonly minY: number;\n  readonly maxX: number;\n  readonly maxY: number;\n}\n\nexport interface ConnectorStageInput {\n  readonly elements?: readonly SceneElement[];\n  readonly layerBuckets?: Readonly<Record<string, readonly SceneElement[]>>;\n  readonly anchors: NodeAnchorRegistry;\n  readonly connectors: readonly NormalizedConnectorSpec[];\n  readonly theme: ResolvedTheme;\n  readonly occupiedPorts?: readonly OccupiedPort[];\n  readonly occupiedTextRects?: readonly Rect[];\n  readonly routingObstacles?: readonly Rect[];\n  readonly containerObstacles?: ReadonlyMap<string, Rect>;\n}\n\nexport interface ConnectorStageResult {\n  readonly pathElements: SceneElement[];\n  readonly labelElements: SceneElement[];\n  readonly elements: SceneElement[];\n  readonly defs: string[];\n  readonly diagnostics: ConnectorDiagnostic[];\n  readonly extents: ConnectorExtents;\n}\n\nexport function routeConnectors(input: ConnectorStageInput): ConnectorStageResult {\n  const diagnostics = connectorDiagnostics(input.connectors, input.anchors);\n  const resolvable = input.connectors.filter(\n    (spec) => input.anchors[spec.fromKey] !== undefined && input.anchors[spec.toKey] !== undefined,\n  );\n\n  const links = resolvable.map(specToCrossLink);\n  const rendered =\n    links.length > 0\n      ? routeAndRenderCrossLinks3(\n          links,\n          input.theme,\n          input.anchors,\n          input.occupiedPorts,\n          input.occupiedTextRects,\n          input.routingObstacles,\n          input.containerObstacles,\n        )\n      : { defs: [], elements: [] };\n\n  const pathElements = rendered.elements.filter((e) => e.type !== 'text');\n  const labelElements = rendered.elements.filter((e) => e.type === 'text');\n\n  return {\n    pathElements,\n    labelElements,\n    elements: rendered.elements,\n    defs: rendered.defs,\n    diagnostics,\n    extents: connectorExtents(rendered.elements),\n  };\n}\n\nexport function crossLinksToConnectorSpecs(\n  links: readonly CrossLink[],\n  defaults?: { curveStyle?: CurveStyle },\n): NormalizedConnectorSpec[] {\n  return links.map((link) => {\n    const fromKey = addressToKey(link.from);\n    const toKey = addressToKey(link.to);\n    const curveStyle = link.curveStyle ?? defaults?.curveStyle;\n    return {\n      fromKey,\n      toKey,\n      direction: link.direction,\n      style: link.style,\n      ...(link.label !== undefined ? { label: link.label } : {}),\n      ...(link.routing !== undefined ? { routing: link.routing } : {}),\n      ...(curveStyle !== undefined ? { curveStyle } : {}),\n      ...(link.exitWall !== undefined ? { exitWall: link.exitWall } : {}),\n      ...(link.entryWall !== undefined ? { entryWall: link.entryWall } : {}),\n      ...(link.animation !== undefined ? { animation: link.animation } : {}),\n      ...(link.props !== undefined ? { props: link.props } : {}),\n      ...(link.from.cellPath.length > 0 ? { fromContainerKey: link.from.cellPath.join('.') } : {}),\n      ...(link.to.cellPath.length > 0 ? { toContainerKey: link.to.cellPath.join('.') } : {}),\n    };\n  });\n}\n\nfunction connectorDiagnostics(\n  connectors: readonly NormalizedConnectorSpec[],\n  anchors: NodeAnchorRegistry,\n): ConnectorDiagnostic[] {\n  const diagnostics: ConnectorDiagnostic[] = [];\n  for (let i = 0; i < connectors.length; i++) {\n    const spec = connectors[i]!;\n    if (!anchors[spec.fromKey]) {\n      diagnostics.push({\n        connectorIndex: i,\n        message: `Cannot resolve source: \"${spec.fromKey}\" not found in anchor registry`,\n      });\n    }\n    if (!anchors[spec.toKey]) {\n      diagnostics.push({\n        connectorIndex: i,\n        message: `Cannot resolve target: \"${spec.toKey}\" not found in anchor registry`,\n      });\n    }\n  }\n  return diagnostics;\n}\n\nfunction specToCrossLink(spec: NormalizedConnectorSpec): CrossLink {\n  return {\n    from: keyToAddress(spec.fromKey, spec.fromContainerKey),\n    to: keyToAddress(spec.toKey, spec.toContainerKey),\n    direction: spec.direction,\n    style: spec.style,\n    ...(spec.label !== undefined ? { label: spec.label } : {}),\n    ...(spec.routing !== undefined ? { routing: spec.routing } : {}),\n    ...(spec.curveStyle !== undefined ? { curveStyle: spec.curveStyle } : {}),\n    ...(spec.exitWall !== undefined ? { exitWall: spec.exitWall } : {}),\n    ...(spec.entryWall !== undefined ? { entryWall: spec.entryWall } : {}),\n    ...(spec.animation !== undefined ? { animation: spec.animation } : {}),\n    ...(spec.props !== undefined ? { props: spec.props } : {}),\n  };\n}\n\nfunction keyToAddress(key: string, containerKey?: string): NodeAddress {\n  if (containerKey && key.startsWith(`${containerKey}.`)) {\n    return {\n      cellPath: containerKey.split('.'),\n      nodeId: key.slice(containerKey.length + 1),\n    };\n  }\n  return { cellPath: [], nodeId: key };\n}\n\nfunction addressToKey(addr: NodeAddress): string {\n  return [...addr.cellPath, addr.nodeId].join('.');\n}\n\nfunction connectorExtents(elements: readonly SceneElement[]): ConnectorExtents {\n  if (elements.length === 0) {\n    return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n  }\n\n  let minX = Infinity;\n  let minY = Infinity;\n  let maxX = -Infinity;\n  let maxY = -Infinity;\n\n  for (const el of elements) {\n    if (el.type === 'path') {\n      const nums: number[] = [];\n      for (const m of el.d.matchAll(/-?\\d+(?:\\.\\d+)?/g)) {\n        const n = parseFloat(m[0]);\n        if (!Number.isNaN(n)) nums.push(n);\n      }\n      for (let i = 0; i + 1 < nums.length; i += 2) {\n        minX = Math.min(minX, nums[i]!);\n        minY = Math.min(minY, nums[i + 1]!);\n        maxX = Math.max(maxX, nums[i]!);\n        maxY = Math.max(maxY, nums[i + 1]!);\n      }\n    } else if (el.type === 'text') {\n      const approxW = el.content.length * (el.fontSize ?? 12) * 0.65;\n      const left =\n        el.anchor === 'middle'\n          ? el.position.x - approxW / 2\n          : el.anchor === 'end'\n            ? el.position.x - approxW\n            : el.position.x;\n      const top = el.position.y - (el.fontSize ?? 12);\n      minX = Math.min(minX, left);\n      minY = Math.min(minY, top);\n      maxX = Math.max(maxX, left + approxW);\n      maxY = Math.max(maxY, el.position.y + (el.fontSize ?? 12));\n    }\n  }\n\n  if (!Number.isFinite(minX)) return { minX: 0, minY: 0, maxX: 0, maxY: 0 };\n  return { minX, minY, maxX, maxY };\n}\n", "/**\n * @file diagrams/struct/shared.ts \u2014 Shared helpers for the strip/memory family.\n */\n\nexport const ARROW_ID = 'struct-arrow';\n\n/** A small filled arrowhead marker def in the given colour.\n *\n * markerUnits=\"userSpaceOnUse\" keeps the arrowhead a CONSTANT pixel size\n * regardless of the edge's strokeWidth. Dimensions are scaled to match the\n * visual size of the old strokeWidth-relative marker on a 1.5-width edge\n * (8 sw-units \u00D7 1.5 = 12 px). Active edges (sw=2.5) now get the same\n * arrowhead size instead of the previous ~1.67\u00D7 balloon.\n */\nexport function arrowDef(color: string, size?: number): string {\n  const s = size != null ? size * 1.5 : 12;\n  const sMidY = s / 2;\n  const sRefX = s * (10 / 12);\n  return `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${s}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><path d=\"M0 0 L${s} ${sMidY} L0 ${s} z\" fill=\"${color}\" /></marker>`;\n}\n\n/** Tokens on the keyword line and directive lines, trimmed and split. */\nexport function lines(input: string): string[] {\n  return input\n    .split(/\\r?\\n/)\n    .map((l) => l.trim())\n    .filter(Boolean);\n}\n\n/**\n * Split a directive line into bare tokens and double-quoted tokens.\n *\n * Quoted tokens support only `\\\"` and `\\\\` escapes and cannot span lines.\n * Full-line comment handling remains centralized before diagram parsers run;\n * this tokenizer intentionally does not strip inline `%%` text.\n */\nexport function tokenizeDirective(line: string): string[] {\n  const tokens: string[] = [];\n  let i = 0;\n\n  while (i < line.length) {\n    while (i < line.length && /\\s/.test(line[i]!)) i++;\n    if (i >= line.length) break;\n\n    if (line[i] === '\"') {\n      i++;\n      let value = '';\n      while (i < line.length) {\n        const ch = line[i]!;\n        if (ch === '\"') {\n          i++;\n          break;\n        }\n        if (ch === '\\\\') {\n          const next = line[i + 1];\n          if (next === '\"' || next === '\\\\') {\n            value += next;\n            i += 2;\n            continue;\n          }\n        }\n        value += ch;\n        i++;\n      }\n      if (line[i - 1] !== '\"') throw new Error(`Unterminated quoted string: ${line}`);\n      tokens.push(value);\n      continue;\n    }\n\n    const start = i;\n    while (i < line.length && !/\\s/.test(line[i]!)) i++;\n    tokens.push(line.slice(start, i));\n  }\n\n  return tokens;\n}\n", "/**\n * @file diagrams/struct/array.ts \u2014 Contiguous array (cell strip + pointers).\n *\n * Value-driven mini-syntax:\n *   array 5 8 13 21 34        // cells on the header line, or:\n *   array\n *     title nums\n *     cells 5 8 ... 34\n *     axis vertical\n *     index bottom reverse\n *     ptr i -> 2 \"slow pointer\"\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n  Rect,\n  TextAnchor,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines, tokenizeDirective } from './shared.js';\n\nexport type ArrayAxis = 'horizontal' | 'vertical';\nexport type ArrayIndexSide = 'before' | 'after';\nexport type ArrayIndexOrder = 'normal' | 'reverse';\n\nexport interface ArrayIndexConfig {\n  readonly show: boolean;\n  readonly side: ArrayIndexSide;\n  readonly order: ArrayIndexOrder;\n  readonly range?: { readonly start: number; readonly end: number };\n  readonly pad?: number;\n}\n\nexport interface ArrayValueCell {\n  readonly kind: 'value';\n  readonly value: string;\n}\n\nexport interface ArrayGapCell {\n  readonly kind: 'gap';\n}\n\nexport type ArrayCell = ArrayValueCell | ArrayGapCell;\n\nexport interface ArrayPointerTarget {\n  readonly raw: string;\n  readonly value?: number;\n  readonly anchor?: string;\n}\n\nexport interface ArrayPointer {\n  readonly id: string;\n  readonly label?: string;\n  readonly target: ArrayPointerTarget;\n}\n\nexport interface ArrayDoc {\n  readonly title?: string;\n  readonly axis: ArrayAxis;\n  readonly index: ArrayIndexConfig;\n  readonly cells: readonly ArrayCell[];\n  readonly ptrs: readonly ArrayPointer[];\n  /** Logical indices of cells to render with an accent highlight fill. */\n  readonly highlights?: readonly number[];\n  /** Contiguous range [start, end] (inclusive logical indices) to highlight. */\n  readonly window?: { readonly start: number; readonly end: number };\n}\n\ninterface ArrayIndexMetadata {\n  readonly physicalToLogical: readonly (number | null)[];\n  readonly physicalLabels: readonly (string | null)[];\n  readonly indexToPhysical: ReadonlyMap<number, number>;\n  readonly nonGapPhysicals: readonly number[];\n  readonly gapPhysical?: number;\n}\n\ninterface ResolvedPointer {\n  readonly ptr: ArrayPointer;\n  readonly physical: number;\n}\n\ninterface LabelLaneInput {\n  readonly ptrIndex: number;\n  readonly start: number;\n  readonly end: number;\n}\n\nfunction formatIndex(n: number, pad?: number): string {\n  if (pad === undefined || pad <= 0) return String(n);\n  if (n < 0) {\n    return '-' + String(Math.abs(n)).padStart(pad, '0');\n  }\n  return String(n).padStart(pad, '0');\n}\n\nfunction parse(input: string): ArrayDoc {\n  let title: string | undefined;\n  let cells: ArrayCell[] = [];\n  let axis: ArrayAxis = 'horizontal';\n  let indexShow = false;\n  let indexSide: ArrayIndexSide = 'before';\n  let indexOrder: ArrayIndexOrder = 'normal';\n  let indexRange: { start: number; end: number } | undefined;\n  let indexPad: number | undefined;\n  const ptrs: ArrayPointer[] = [];\n  let highlights: number[] | undefined;\n  let win: { start: number; end: number } | undefined;\n\n  for (const line of lines(input)) {\n    const t = tokenizeDirective(line);\n    if (t.length === 0) continue;\n\n    if (t[0] === 'array') {\n      if (t.length > 1) cells = parseCells(t.slice(1));\n      continue;\n    }\n\n    if (t[0] === 'title') {\n      title = t.slice(1).join(' ');\n      continue;\n    }\n\n    if (t[0] === 'cells') {\n      cells = parseCells(t.slice(1));\n      continue;\n    }\n\n    if (t[0] === 'axis') {\n      if (t[1] === 'vertical' || t[1] === 'horizontal') axis = t[1];\n      continue;\n    }\n\n    if (t[0] === 'index') {\n      indexShow = true;\n      for (let i = 1; i < t.length; i++) {\n        const mod = t[i]!;\n        if (mod === 'bottom' || mod === 'after') {\n          indexSide = 'after';\n        } else if (mod === 'top' || mod === 'before') {\n          indexSide = 'before';\n        } else if (mod === 'reverse') {\n          indexOrder = 'reverse';\n        } else if (mod === 'normal') {\n          indexOrder = 'normal';\n        } else if (mod === 'range') {\n          const next = t[i + 1];\n          if (next) {\n            const m = next.match(/^(-?\\d+)\\.\\.(-?\\d+)$/);\n            if (m) {\n              indexRange = { start: Number(m[1]), end: Number(m[2]) };\n              i++;\n            }\n          }\n        } else if (mod === 'pad') {\n          const next = t[i + 1];\n          if (next && /^\\d+$/.test(next)) {\n            indexPad = Number(next);\n            i++;\n          }\n        } else {\n          const mRange = mod.match(/^(-?\\d+)\\.\\.(-?\\d+)$/);\n          if (mRange) {\n            indexRange = { start: Number(mRange[1]), end: Number(mRange[2]) };\n            continue;\n          }\n          const mPad = mod.match(/^pad(\\d+)$/);\n          if (mPad) {\n            indexPad = Number(mPad[1]);\n            continue;\n          }\n        }\n      }\n      continue;\n    }\n\n    if (t[0] === 'range') {\n      indexShow = true;\n      const token = t[1] === 'range' ? t[2] : t[1];\n      if (token) {\n        const m = token.match(/^(-?\\d+)\\.\\.(-?\\d+)$/);\n        if (m) indexRange = { start: Number(m[1]), end: Number(m[2]) };\n      } else if (t.length >= 3 && /^-?\\d+$/.test(t[1]!) && /^-?\\d+$/.test(t[2]!)) {\n        indexRange = { start: Number(t[1]), end: Number(t[2]) };\n      }\n      continue;\n    }\n\n    if (t[0] === 'pad' && t[1] && /^\\d+$/.test(t[1])) {\n      indexPad = Number(t[1]);\n      continue;\n    }\n\n    if (t[0] === 'highlight') {\n      highlights = t\n        .slice(1)\n        .map(Number)\n        .filter((n) => !isNaN(n) && Number.isInteger(n));\n      continue;\n    }\n\n    if (t[0] === 'window' && t[1]) {\n      const m = t[1].match(/^(-?\\d+)(?:-|\\.\\.)(-?\\d+)$/);\n      if (m) win = { start: Number(m[1]), end: Number(m[2]) };\n      continue;\n    }\n\n    if (t[0] === 'ptr' && t.length >= 4 && t[2] === '->') {\n      ptrs.push({\n        id: t[1]!,\n        target: parsePointerTarget(t[3]!),\n        ...(t[4] !== undefined ? { label: t[4] } : {}),\n      });\n    }\n  }\n\n  return {\n    ...(title !== undefined ? { title } : {}),\n    axis,\n    index: {\n      show: indexShow,\n      side: indexSide,\n      order: indexOrder,\n      ...(indexRange !== undefined ? { range: indexRange } : {}),\n      ...(indexPad !== undefined ? { pad: indexPad } : {}),\n    },\n    cells,\n    ptrs,\n    ...(highlights !== undefined && highlights.length > 0 ? { highlights } : {}),\n    ...(win !== undefined ? { window: win } : {}),\n  };\n}\n\nfunction parseCells(tokens: readonly string[]): ArrayCell[] {\n  const cells = tokens.map((token) =>\n    token === '...' ? ({ kind: 'gap' } as const) : ({ kind: 'value', value: token } as const),\n  );\n  const gapPositions = cells.map((cell, i) => (cell.kind === 'gap' ? i : -1)).filter((i) => i >= 0);\n\n  if (gapPositions.length > 1) throw new Error('Array cells may contain at most one ... gap');\n  if (gapPositions.length === 1) {\n    const gap = gapPositions[0]!;\n    if (gap === 0 || gap === cells.length - 1)\n      throw new Error('Array ... gap must be between concrete cells');\n  }\n\n  return cells;\n}\n\nfunction parsePointerTarget(raw: string): ArrayPointerTarget {\n  if (/^-?\\d+$/.test(raw)) return { raw, value: Number(raw) };\n  if (/^c-?\\d+$/.test(raw) || raw === 'cfirst' || raw === 'clast' || raw === 'cgap')\n    return { raw, anchor: raw };\n  return { raw, anchor: raw };\n}\n\nfunction metadataFor(doc: ArrayDoc): ArrayIndexMetadata {\n  const physicalToLogical = new Array<number | null>(doc.cells.length).fill(null);\n  const physicalLabels = new Array<string | null>(doc.cells.length).fill(null);\n  const indexToPhysical = new Map<number, number>();\n  const nonGapPhysicals: number[] = [];\n  let gapPhysical: number | undefined;\n\n  doc.cells.forEach((cell, physical) => {\n    if (cell.kind === 'gap') {\n      gapPhysical = physical;\n    } else {\n      nonGapPhysicals.push(physical);\n    }\n  });\n\n  const logicalCount = nonGapPhysicals.length;\n  const range = doc.index.range;\n  const pad = doc.index.pad;\n\n  if (range) {\n    const { start, end } = range;\n    if (start > end) {\n      throw new Error(`Array index range start (${start}) cannot be greater than end (${end})`);\n    }\n\n    if (gapPhysical !== undefined) {\n      const beforeGapCount = gapPhysical;\n      const afterGapCount = doc.cells.length - 1 - gapPhysical;\n      const concreteCount = beforeGapCount + afterGapCount;\n      const rangeSpan = end - start + 1;\n\n      if (rangeSpan < concreteCount + 1) {\n        throw new Error(\n          `Array index range ${start}..${end} is too small for ${concreteCount} concrete cells and gap`,\n        );\n      }\n\n      if (doc.index.order === 'reverse') {\n        // Cells before gap count down from end\n        for (let p = 0; p < beforeGapCount; p++) {\n          const logical = end - p;\n          physicalToLogical[p] = logical;\n          indexToPhysical.set(logical, p);\n          physicalLabels[p] = formatIndex(logical, pad);\n        }\n\n        // Gap cell\n        const gapHigh = end - beforeGapCount;\n        const gapLow = start + afterGapCount;\n        const gapLabel =\n          gapHigh === gapLow\n            ? formatIndex(gapHigh, pad)\n            : `${formatIndex(gapHigh, pad)}-${formatIndex(gapLow, pad)}`;\n        physicalLabels[gapPhysical] = gapLabel;\n\n        // Cells after gap count down to start\n        for (let p = gapPhysical + 1; p < doc.cells.length; p++) {\n          const k = doc.cells.length - 1 - p;\n          const logical = start + k;\n          physicalToLogical[p] = logical;\n          indexToPhysical.set(logical, p);\n          physicalLabels[p] = formatIndex(logical, pad);\n        }\n      } else {\n        // Normal order: cells before gap count up from start\n        for (let p = 0; p < beforeGapCount; p++) {\n          const logical = start + p;\n          physicalToLogical[p] = logical;\n          indexToPhysical.set(logical, p);\n          physicalLabels[p] = formatIndex(logical, pad);\n        }\n\n        // Gap cell\n        const gapStart = start + beforeGapCount;\n        const gapEnd = end - afterGapCount;\n        const gapLabel =\n          gapStart === gapEnd\n            ? formatIndex(gapStart, pad)\n            : `${formatIndex(gapStart, pad)}-${formatIndex(gapEnd, pad)}`;\n        physicalLabels[gapPhysical] = gapLabel;\n\n        // Cells after gap count up to end\n        for (let p = gapPhysical + 1; p < doc.cells.length; p++) {\n          const k = doc.cells.length - 1 - p;\n          const logical = end - k;\n          physicalToLogical[p] = logical;\n          indexToPhysical.set(logical, p);\n          physicalLabels[p] = formatIndex(logical, pad);\n        }\n      }\n    } else {\n      // No gap\n      const rangeSpan = end - start + 1;\n      if (rangeSpan < doc.cells.length) {\n        throw new Error(\n          `Array index range ${start}..${end} is too small for ${doc.cells.length} cells`,\n        );\n      }\n\n      if (doc.index.order === 'reverse') {\n        doc.cells.forEach((_, physical) => {\n          const logical = end - physical;\n          physicalToLogical[physical] = logical;\n          indexToPhysical.set(logical, physical);\n          physicalLabels[physical] = formatIndex(logical, pad);\n        });\n      } else {\n        doc.cells.forEach((_, physical) => {\n          const logical = start + physical;\n          physicalToLogical[physical] = logical;\n          indexToPhysical.set(logical, physical);\n          physicalLabels[physical] = formatIndex(logical, pad);\n        });\n      }\n    }\n  } else {\n    // Existing behavior (no range)\n    nonGapPhysicals.forEach((physical, rank) => {\n      const logical = doc.index.order === 'reverse' ? logicalCount - 1 - rank : rank;\n      physicalToLogical[physical] = logical;\n      indexToPhysical.set(logical, physical);\n      physicalLabels[physical] = formatIndex(logical, pad);\n    });\n  }\n\n  return {\n    physicalToLogical,\n    physicalLabels,\n    indexToPhysical,\n    nonGapPhysicals,\n    ...(gapPhysical !== undefined ? { gapPhysical } : {}),\n  };\n}\n\nexport function resolveArrayElementAnchorId(\n  doc: ArrayDoc,\n  elementIndex: number,\n): string | undefined {\n  const meta = metadataFor(normalizeArrayDoc(doc));\n  const logicalCount = meta.nonGapPhysicals.length;\n\n  if (elementIndex < 0) {\n    const fromEnd = Math.abs(elementIndex);\n    if (fromEnd < 1 || fromEnd > logicalCount) return undefined;\n    if (fromEnd === 1) return meta.nonGapPhysicals.length > 0 ? 'clast' : undefined;\n    const targetPhysical = meta.nonGapPhysicals[meta.nonGapPhysicals.length - fromEnd]!;\n    const logical = meta.physicalToLogical[targetPhysical];\n    return logical !== null && logical !== undefined ? `c${logical}` : `c${logicalCount - fromEnd}`;\n  }\n\n  if (doc.cells[elementIndex]?.kind === 'gap') return 'cgap';\n  return meta.indexToPhysical.has(elementIndex) ? `c${elementIndex}` : undefined;\n}\n\nexport function layoutArray(inputDoc: ArrayDoc, theme: ResolvedTheme): LayoutResult {\n  const doc = normalizeArrayDoc(inputDoc);\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n  const cellH = 40;\n  const meta = metadataFor(doc);\n  const cellW = Math.max(\n    40,\n    ...doc.cells.map((c) => measureText(c.kind === 'gap' ? '\u2026' : c.value, font).width + 24),\n    ...(doc.index.show\n      ? meta.physicalLabels\n          .filter((l): l is string => Boolean(l))\n          .map((l) => measureText(l, smallFont).width + 16)\n      : []),\n  );\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const indexBand = doc.index.show ? smallFont + 12 : 0;\n  const arrowLen = 30;\n  const labelGap = 6;\n  const indexPad = 6;\n  const horizontal = doc.axis === 'horizontal';\n  const resolvedPtrs = doc.ptrs\n    .map((ptr): ResolvedPointer | null => {\n      const physical = resolvePointerPhysical(ptr.target, doc, meta);\n      return physical === undefined ? null : { ptr, physical };\n    })\n    .filter((ptr): ptr is ResolvedPointer => ptr !== null);\n\n  const labelFont = font;\n  const labelLaneGap = labelFont + 8;\n  const pointerSide: ArrayIndexSide = doc.index.side === 'before' ? 'after' : 'before';\n  const horizontalLanes = horizontal\n    ? assignHorizontalPointerLanes(resolvedPtrs, doc, meta, cellW, labelFont)\n    : [];\n  const pointerLaneCount = Math.max(0, ...horizontalLanes.map((l) => l + 1));\n  const pointerBand =\n    resolvedPtrs.length === 0\n      ? 0\n      : horizontal\n        ? arrowLen + labelGap + labelFont + Math.max(0, pointerLaneCount - 1) * labelLaneGap + 4\n        : arrowLen + labelGap + maxPointerLabelWidth(resolvedPtrs, labelFont) + 8;\n\n  const topBand = horizontal\n    ? (doc.index.show && doc.index.side === 'before' ? indexBand : 0) +\n      (pointerSide === 'before' ? pointerBand : 0)\n    : 0;\n  const maxIndexLabelW =\n    doc.index.show && !horizontal\n      ? Math.max(\n          smallFont * 2,\n          ...meta.physicalLabels\n            .filter((l): l is string => Boolean(l))\n            .map((l) => measureText(l, smallFont).width),\n        )\n      : smallFont * 2;\n  const leftBand = !horizontal\n    ? (doc.index.show && doc.index.side === 'before' ? maxIndexLabelW + indexPad : 0) +\n      (pointerSide === 'before' ? pointerBand : 0)\n    : 0;\n  const origin = {\n    x: leftBand,\n    y: titleH + topBand,\n  };\n  const slots = buildSlots(doc.cells.length, origin, cellW, cellH, doc.axis);\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        origin.x,\n        typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  doc.cells.forEach((cell, physical) => {\n    const slot = slots[physical]!;\n    if (cell.kind === 'gap') {\n      elements.push(p.rect(slot, palette.surface, palette.border, 1.5, { rx: 3, opacity: 0.45 }));\n      elements.push(\n        p.text('\u2026', slot.x + cellW / 2, slot.y + cellH / 2 + 5, font, palette.textMuted, {\n          anchor: 'middle',\n          weight: 'bold',\n        }),\n      );\n    } else {\n      const logicalMaybe = meta.physicalToLogical[physical];\n      const logical: number | null = logicalMaybe ?? null;\n      const isHighlit =\n        logical !== null &&\n        ((doc.highlights?.includes(logical) ?? false) ||\n          (doc.window !== undefined && logical >= doc.window.start && logical <= doc.window.end));\n\n      if (isHighlit) {\n        elements.push(\n          p.rect(slot, palette.primary, palette.primary, 2, { rx: 3, fillOpacity: 0.22 }),\n        );\n      } else {\n        elements.push(p.rect(slot, palette.surface, palette.border, 1.5, { rx: 3 }));\n      }\n      elements.push(\n        p.text(\n          cell.value,\n          slot.x + cellW / 2,\n          slot.y + cellH / 2 + 5,\n          font,\n          isHighlit ? palette.primary : palette.text,\n          { anchor: 'middle', weight: 'bold' },\n        ),\n      );\n    }\n\n    if (doc.index.show) {\n      const label = meta.physicalLabels[physical];\n      if (label !== null && label !== undefined) {\n        elements.push(\n          renderIndexText(\n            p,\n            theme,\n            label,\n            slot,\n            cellW,\n            cellH,\n            doc.axis,\n            doc.index.side,\n            indexPad,\n          ),\n        );\n      }\n    }\n  });\n\n  if (horizontal) {\n    renderHorizontalPointers(\n      elements,\n      p,\n      theme,\n      resolvedPtrs,\n      slots,\n      pointerSide,\n      horizontalLanes,\n      arrowLen,\n      labelGap,\n      labelLaneGap,\n    );\n  } else {\n    renderVerticalPointers(\n      elements,\n      p,\n      theme,\n      resolvedPtrs,\n      slots,\n      doc.index.side,\n      arrowLen,\n      labelGap,\n    );\n  }\n\n  const anchors: Record<string, { bounds: Rect }> = {};\n  meta.indexToPhysical.forEach((physical, logical) => {\n    anchors[`c${logical}`] = { bounds: slots[physical]! };\n  });\n  if (meta.nonGapPhysicals.length > 0) {\n    anchors.cfirst = { bounds: slots[meta.nonGapPhysicals[0]!]! };\n    anchors.clast = { bounds: slots[meta.nonGapPhysicals[meta.nonGapPhysicals.length - 1]!]! };\n  }\n  if (meta.gapPhysical !== undefined) {\n    anchors.cgap = { bounds: slots[meta.gapPhysical]! };\n  }\n\n  const contentBounds = boundsForElements(elements);\n  const dx = margin - contentBounds.x;\n  const dy = margin - contentBounds.y;\n  const shiftedElements = translateElements(elements, dx, dy);\n  const shiftedAnchors = translateAnchors(anchors, dx, dy);\n  const scene: Scene = {\n    viewBox: {\n      x: 0,\n      y: 0,\n      width: rhu(contentBounds.width + margin * 2),\n      height: rhu(contentBounds.height + margin * 2),\n    },\n    background: palette.background,\n    elements: shiftedElements,\n    defs: [arrowDef(palette.primary, theme.edges?.arrowSize)],\n  };\n  return { scene, anchors: shiftedAnchors as NodeAnchorRegistry };\n}\n\nfunction normalizeArrayDoc(doc: ArrayDoc | any): ArrayDoc {\n  const cells: ArrayCell[] = (doc.cells ?? []).map((cell: string | ArrayCell) =>\n    typeof cell === 'string'\n      ? cell === '...'\n        ? { kind: 'gap' }\n        : { kind: 'value', value: cell }\n      : cell,\n  );\n  const index: ArrayIndexConfig =\n    typeof doc.index === 'boolean'\n      ? { show: doc.index, side: 'before' as const, order: 'normal' as const }\n      : {\n          show: Boolean(doc.index?.show),\n          side: doc.index?.side === 'after' ? ('after' as const) : ('before' as const),\n          order: doc.index?.order === 'reverse' ? ('reverse' as const) : ('normal' as const),\n          ...(doc.index?.range !== undefined ? { range: doc.index.range } : {}),\n          ...(doc.index?.pad !== undefined ? { pad: doc.index.pad } : {}),\n        };\n  return {\n    ...(doc.title !== undefined ? { title: doc.title } : {}),\n    axis: doc.axis === 'vertical' ? 'vertical' : 'horizontal',\n    index,\n    cells,\n    ptrs: (doc.ptrs ?? []).map((ptr: any) => {\n      if ('idx' in ptr)\n        return { id: ptr.name ?? ptr.id, target: { raw: String(ptr.idx), value: Number(ptr.idx) } };\n      return ptr;\n    }),\n    ...(Array.isArray(doc.highlights) && doc.highlights.length > 0\n      ? { highlights: doc.highlights as number[] }\n      : {}),\n    ...(doc.window !== undefined ? { window: doc.window as { start: number; end: number } } : {}),\n  };\n}\n\nfunction buildSlots(\n  count: number,\n  origin: { x: number; y: number },\n  cellW: number,\n  cellH: number,\n  axis: ArrayAxis,\n): Rect[] {\n  return Array.from({ length: count }, (_, i) => ({\n    x: origin.x + (axis === 'horizontal' ? i * cellW : 0),\n    y: origin.y + (axis === 'horizontal' ? 0 : i * cellH),\n    width: cellW,\n    height: cellH,\n  }));\n}\n\nfunction resolvePointerPhysical(\n  target: ArrayPointerTarget,\n  doc: ArrayDoc,\n  meta: ArrayIndexMetadata,\n): number | undefined {\n  if (target.value !== undefined) {\n    const physical = meta.indexToPhysical.get(target.value);\n    if (physical !== undefined) return physical;\n    if (doc.cells[target.value]?.kind === 'gap') return meta.gapPhysical;\n    return undefined;\n  }\n\n  if (!target.anchor) return undefined;\n  if (target.anchor === 'cfirst') return meta.nonGapPhysicals[0];\n  if (target.anchor === 'clast') return meta.nonGapPhysicals[meta.nonGapPhysicals.length - 1];\n  if (target.anchor === 'cgap') return meta.gapPhysical;\n  const cMatch = target.anchor.match(/^c(\\d+)$/);\n  if (cMatch) return meta.indexToPhysical.get(Number(cMatch[1]));\n  return undefined;\n}\n\nfunction renderIndexText(\n  p: ReturnType<typeof pen>,\n  theme: ResolvedTheme,\n  value: string,\n  slot: Rect,\n  cellW: number,\n  cellH: number,\n  axis: ArrayAxis,\n  side: ArrayIndexSide,\n  indexPad: number,\n): SceneElement {\n  const { palette, typography } = theme;\n  if (axis === 'horizontal') {\n    const x = slot.x + cellW / 2;\n    const y = side === 'before' ? slot.y - 6 : slot.y + cellH + typography.smallFontSize + 4;\n    return p.text(value, x, y, typography.smallFontSize, palette.textMuted, { anchor: 'middle' });\n  }\n\n  const centerY = slot.y + cellH / 2;\n  const x = side === 'before' ? slot.x - indexPad : slot.x + cellW + indexPad;\n  const anchor: TextAnchor = side === 'before' ? 'end' : 'start';\n  return p.text(value, x, centerY + 4, typography.smallFontSize, palette.textMuted, { anchor });\n}\n\nfunction assignHorizontalPointerLanes(\n  ptrs: readonly ResolvedPointer[],\n  doc: ArrayDoc,\n  meta: ArrayIndexMetadata,\n  cellW: number,\n  font: number,\n): number[] {\n  const intervals: LabelLaneInput[] = ptrs.map((ptr, ptrIndex) => {\n    const cx = slotCenterX(ptr.physical, cellW);\n    const text = pointerLabel(ptr.ptr);\n    const width = measureText(text, font).width + 8;\n    return { ptrIndex, start: cx - width / 2, end: cx + width / 2 };\n  });\n  void doc;\n  void meta;\n  return colorIntervals(intervals);\n}\n\nfunction colorIntervals(intervals: readonly LabelLaneInput[]): number[] {\n  const lanes: number[] = new Array(intervals.length).fill(0);\n  const laneEnds: number[] = [];\n  const sorted = [...intervals].sort((a, b) => a.start - b.start || a.end - b.end);\n\n  for (const interval of sorted) {\n    let lane = 0;\n    while (laneEnds[lane] !== undefined && interval.start < laneEnds[lane]!) lane++;\n    lanes[interval.ptrIndex] = lane;\n    laneEnds[lane] = interval.end;\n  }\n\n  return lanes;\n}\n\nfunction slotCenterX(physical: number, cellW: number): number {\n  return physical * cellW + cellW / 2;\n}\n\nfunction renderHorizontalPointers(\n  elements: SceneElement[],\n  p: ReturnType<typeof pen>,\n  theme: ResolvedTheme,\n  ptrs: readonly ResolvedPointer[],\n  slots: readonly Rect[],\n  side: ArrayIndexSide,\n  lanes: readonly number[],\n  arrowLen: number,\n  labelGap: number,\n  laneGap: number,\n): void {\n  const s = side === 'after' ? 1 : -1;\n  const { palette, typography } = theme;\n  const targetCounts = countByPointerPhysical(ptrs);\n  const seen = new Map<number, number>();\n\n  ptrs.forEach((ptr, i) => {\n    const slot = slots[ptr.physical]!;\n    const count = targetCounts.get(ptr.physical) ?? 1;\n    const ordinal = seen.get(ptr.physical) ?? 0;\n    seen.set(ptr.physical, ordinal + 1);\n    const attachX = slot.x + slot.width / 2 + centeredLaneOffset(ordinal, count, slot.width);\n    const edgeY = s > 0 ? slot.y + slot.height : slot.y;\n    const lane = lanes[i] ?? 0;\n    const tipY = edgeY;\n    const tailY = edgeY + s * (arrowLen + lane * laneGap);\n    const labelY = tailY + s * (labelGap + (s > 0 ? typography.baseFontSize : 0));\n\n    elements.push(\n      p.path(\n        `M ${rhu(attachX)} ${rhu(tailY)} L ${rhu(attachX)} ${rhu(tipY)}`,\n        palette.primary,\n        1.5,\n        { markerEnd: ARROW_ID },\n      ),\n    );\n    elements.push(\n      p.text(pointerLabel(ptr.ptr), attachX, labelY, typography.baseFontSize, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n  });\n}\n\nfunction renderVerticalPointers(\n  elements: SceneElement[],\n  p: ReturnType<typeof pen>,\n  theme: ResolvedTheme,\n  ptrs: readonly ResolvedPointer[],\n  slots: readonly Rect[],\n  indexSide: ArrayIndexSide,\n  arrowLen: number,\n  labelGap: number,\n): void {\n  const s = indexSide === 'before' ? 1 : -1;\n  const { palette, typography } = theme;\n  const columnGap = labelGap + 6;\n  const groups = new Map<string, number[]>();\n\n  for (const ptr of ptrs) {\n    const key = `${ptr.physical}:${s}`;\n    const widths = groups.get(key) ?? [];\n    widths.push(measureText(pointerLabel(ptr.ptr), typography.baseFontSize).width);\n    groups.set(key, widths);\n  }\n\n  const seen = new Map<string, number>();\n  ptrs.forEach((ptr) => {\n    const slot = slots[ptr.physical]!;\n    const key = `${ptr.physical}:${s}`;\n    const widths = groups.get(key) ?? [];\n    const lane = seen.get(key) ?? 0;\n    seen.set(key, lane + 1);\n    const attachY = slot.y + slot.height / 2 + centeredLaneOffset(lane, widths.length, slot.height);\n    const edgeX = s > 0 ? slot.x + slot.width : slot.x;\n    const outward = precedingLaneWidth(widths, lane, columnGap);\n    const tailX = edgeX + s * (arrowLen + outward);\n    const labelX = tailX + s * labelGap;\n    const anchor: TextAnchor = s > 0 ? 'start' : 'end';\n\n    elements.push(\n      p.path(\n        `M ${rhu(tailX)} ${rhu(attachY)} L ${rhu(edgeX)} ${rhu(attachY)}`,\n        palette.primary,\n        1.5,\n        { markerEnd: ARROW_ID },\n      ),\n    );\n    elements.push(\n      p.text(pointerLabel(ptr.ptr), labelX, attachY + 4, typography.baseFontSize, palette.primary, {\n        anchor,\n        weight: 'bold',\n      }),\n    );\n  });\n}\n\nfunction maxPointerLabelWidth(ptrs: readonly ResolvedPointer[], font: number): number {\n  return Math.max(0, ...ptrs.map((ptr) => measureText(pointerLabel(ptr.ptr), font).width));\n}\n\nfunction countByPointerPhysical(ptrs: readonly ResolvedPointer[]): Map<number, number> {\n  const counts = new Map<number, number>();\n  for (const ptr of ptrs) counts.set(ptr.physical, (counts.get(ptr.physical) ?? 0) + 1);\n  return counts;\n}\n\nfunction centeredLaneOffset(lane: number, count: number, span: number): number {\n  if (count <= 1) return 0;\n  const gap = Math.min(12, span / Math.max(2, count + 1));\n  return (lane - (count - 1) / 2) * gap;\n}\n\nfunction precedingLaneWidth(widths: readonly number[], lane: number, gap: number): number {\n  let offset = 0;\n  for (let i = 0; i < lane; i++) offset += (widths[i] ?? 0) + gap;\n  return offset;\n}\n\nfunction boundsForElements(elements: readonly SceneElement[]): Rect {\n  const bounds = elements.map(boundsForElement).filter((b): b is Rect => b !== undefined);\n  if (bounds.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n  const minX = Math.min(...bounds.map((b) => b.x));\n  const minY = Math.min(...bounds.map((b) => b.y));\n  const maxX = Math.max(...bounds.map((b) => b.x + b.width));\n  const maxY = Math.max(...bounds.map((b) => b.y + b.height));\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction boundsForElement(element: SceneElement): Rect | undefined {\n  switch (element.type) {\n    case 'rect':\n      return element.bounds;\n    case 'circle':\n      return {\n        x: element.center.x - element.radius,\n        y: element.center.y - element.radius,\n        width: element.radius * 2,\n        height: element.radius * 2,\n      };\n    case 'path':\n      return boundsForPath(element.d, element.strokeWidth);\n    case 'text':\n      return boundsForText(element);\n    case 'group':\n      return boundsForElements(element.children);\n  }\n}\n\nfunction boundsForText(text: Extract<SceneElement, { type: 'text' }>): Rect {\n  const measured = measureText(text.content, text.fontSize);\n  const x =\n    text.anchor === 'middle'\n      ? text.position.x - measured.width / 2\n      : text.anchor === 'end'\n        ? text.position.x - measured.width\n        : text.position.x;\n  return {\n    x,\n    y: text.position.y - text.fontSize,\n    width: measured.width,\n    height: text.fontSize * 1.25,\n  };\n}\n\nfunction boundsForPath(d: string, strokeWidth: number): Rect {\n  const nums = [...d.matchAll(/-?\\d+(?:\\.\\d+)?/g)].map((match) => Number(match[0]));\n  if (nums.length < 2) return { x: 0, y: 0, width: 0, height: 0 };\n  const xs = nums.filter((_, i) => i % 2 === 0);\n  const ys = nums.filter((_, i) => i % 2 === 1);\n  const pad = strokeWidth / 2;\n  const minX = Math.min(...xs) - pad;\n  const minY = Math.min(...ys) - pad;\n  const maxX = Math.max(...xs) + pad;\n  const maxY = Math.max(...ys) + pad;\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction translateElements(\n  elements: readonly SceneElement[],\n  dx: number,\n  dy: number,\n): SceneElement[] {\n  return elements.map((element) => translateElement(element, dx, dy));\n}\n\nfunction translateElement(element: SceneElement, dx: number, dy: number): SceneElement {\n  switch (element.type) {\n    case 'rect':\n      return { ...element, bounds: translateRect(element.bounds, dx, dy) };\n    case 'circle':\n      return {\n        ...element,\n        center: { x: rhu(element.center.x + dx), y: rhu(element.center.y + dy) },\n      };\n    case 'path':\n      return { ...element, d: translatePathD(element.d, dx, dy) };\n    case 'text':\n      return {\n        ...element,\n        position: { x: rhu(element.position.x + dx), y: rhu(element.position.y + dy) },\n      };\n    case 'group':\n      return { ...element, children: translateElements(element.children, dx, dy) };\n    case 'icon':\n      return { ...element, x: rhu(element.x + dx), y: rhu(element.y + dy) };\n  }\n}\n\nfunction translateAnchors(\n  anchors: Record<string, { bounds: Rect }>,\n  dx: number,\n  dy: number,\n): Record<string, { bounds: Rect }> {\n  return Object.fromEntries(\n    Object.entries(anchors).map(([key, anchor]) => [\n      key,\n      { bounds: translateRect(anchor.bounds, dx, dy) },\n    ]),\n  );\n}\n\nfunction translateRect(rect: Rect, dx: number, dy: number): Rect {\n  return { x: rhu(rect.x + dx), y: rhu(rect.y + dy), width: rect.width, height: rect.height };\n}\n\nfunction translatePathD(d: string, dx: number, dy: number): string {\n  let i = 0;\n  return d.replace(/-?\\d+(?:\\.\\d+)?/g, (value) => {\n    const delta = i++ % 2 === 0 ? dx : dy;\n    return String(rhu(Number(value) + delta));\n  });\n}\n\nfunction pointerLabel(ptr: ArrayPointer): string {\n  return ptr.label ?? ptr.id;\n}\n\nexport const array: DiagramModule<\n  ArrayDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    const parsed = JSON.parse(input);\n    return {\n      version: parsed.version ?? '1.0',\n      metadata: parsed.metadata ?? {},\n      ...normalizeArrayDoc(parsed),\n    };\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutArray(ir, theme);\n  },\n};\n", "import type {\n  PosterDocument,\n  PosterCell,\n  CellContent,\n  PosterNote,\n  NotePosition,\n  PosterScaleMode,\n} from './ir.js';\nimport type {\n  Scene,\n  SceneElement,\n  Rect,\n  LayoutResult,\n  NodeAnchor,\n  NodeAnchorRegistry,\n  OccupiedPort,\n} from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport type { RevealStep } from '../../../contracts/reveal.js';\nimport { getModule } from '../../../frontend/registry.js';\nimport { getThemePreset } from '../../../theme/preset.js';\nimport { crossLinksToConnectorSpecs, routeConnectors } from '../../../crosslink/connectors.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { resolveArrayElementAnchorId } from '../ds/struct/array.js';\nimport type { NodeAddress, CrossLink } from '../../../contracts/crosslink.js';\n\n// \u2500\u2500\u2500 Public Entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layoutPoster(ir: PosterDocument, theme: ResolvedTheme): LayoutResult {\n  const { spacing, palette, typography } = theme;\n  const { grid, cells } = ir;\n\n  const unit = spacing.unit;\n  const gap = grid.gap !== undefined ? grid.gap : spacing.nodeGap / 2;\n  const padding = spacing.diagramMargin;\n  const headerH = ir.metadata.title ? typography.titleFontSize + unit * 2 : 0;\n  const MIN_CELL_W = unit * 20;\n  const MIN_CELL_H = unit * 15;\n  const MAX_CELL_W = unit * 42;\n  const MIN_EMBED_SCALE = 0.65; // minimum scale \u2014 cells expand to ensure readability\n\n  const scaleConfig = resolveScaleConfig(\n    grid.scale,\n    ir.metadata.scale,\n    ir.metadata.uniform_scale ?? ir.metadata['uniform-scale'],\n  );\n\n  const targetScale =\n    scaleConfig.mode === 'natural'\n      ? 1.0\n      : scaleConfig.mode === 'fixed'\n        ? (scaleConfig.fixedScale ?? 1.0)\n        : MIN_EMBED_SCALE;\n\n  // \u2500\u2500 Assign row/col to cells that don't specify them \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const positioned = assignPositions(cells, grid.columns);\n\n  // \u2500\u2500 Layout each child into a LayoutResult (per-cell theme) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Child layouts are synchronous (every Triton layout engine is), so a plain\n  // map suffices \u2014 no Promise.all needed.\n  const cellResults = positioned.map((cell) => {\n    const cellTheme = cell.theme ? getThemePreset(cell.theme) : theme;\n    return { cell, cellTheme, result: layoutCellContent(cell.content, cellTheme) };\n  });\n  const cellResultById = new Map(\n    cellResults.map(({ cell, result }) => [cell.id ?? '', { cell, result }]),\n  );\n\n  const numRows = grid.rows ?? Math.max(...positioned.map((c) => (c.row ?? 0) + (c.rowSpan ?? 1)));\n\n  // Column widths: ensure child content is readable at targetScale\n  // Readability takes priority over MAX_CELL_W\n  const colWidths = new Array<number>(grid.columns).fill(MIN_CELL_W);\n  for (const { cell, result } of cellResults) {\n    if ((cell.colSpan ?? 1) === 1) {\n      const col = cell.col ?? 0;\n      const inset = unit / 2;\n      // Cell must be wide enough that child fits at targetScale\n      const scaleForCol = cell.content.kind === 'diagram' ? targetScale : 1.0;\n      const needed = result.scene.viewBox.width * scaleForCol + inset * 2;\n      colWidths[col] = Math.max(colWidths[col]!, needed);\n    }\n  }\n\n  // Row heights: proportional to column width, respecting targetScale\n  const rowHeights = new Array<number>(numRows).fill(MIN_CELL_H);\n  for (const { cell, cellTheme, result } of cellResults) {\n    if ((cell.rowSpan ?? 1) === 1) {\n      const row = cell.row ?? 0;\n      const col = cell.col ?? 0;\n      const cellTitleH = cell.title ? reservedTitleHeight(cellTheme, cell.title) : 0;\n      const inset = unit / 2;\n      const colW = colWidths[col] ?? MIN_CELL_W;\n      const contentW = colW - inset * 2;\n      const scale = Math.min(contentW / Math.max(result.scene.viewBox.width, 1), 1);\n      // If scale < MIN_EMBED_SCALE, the column already expanded; recompute\n      const effectiveScale =\n        scaleConfig.mode === 'natural'\n          ? 1.0\n          : scaleConfig.mode === 'fixed'\n            ? (scaleConfig.fixedScale ?? 1.0)\n            : Math.max(scale, MIN_EMBED_SCALE);\n      const captionH = cell.caption ? reservedCaptionHeight(cellTheme) : 0;\n      const neededH =\n        result.scene.viewBox.height * effectiveScale + cellTitleH + captionH + inset * 2;\n      rowHeights[row] = Math.max(rowHeights[row]!, neededH);\n    }\n  }\n\n  // \u2500\u2500 Compute homologated scale across cells \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let globalScale: number | undefined;\n  if (scaleConfig.mode === 'fixed') {\n    globalScale = scaleConfig.fixedScale;\n  } else if (scaleConfig.mode === 'natural') {\n    const diagramScales: number[] = [];\n    for (const { cell, cellTheme, result } of cellResults) {\n      if (cell.content.kind !== 'diagram') continue;\n      const col = cell.col ?? 0;\n      const row = cell.row ?? 0;\n      const colSpan = cell.colSpan ?? 1;\n      const rowSpan = cell.rowSpan ?? 1;\n      const cellW = sumWithGaps(colWidths, col, col + colSpan, gap) - gap;\n      const cellH = sumWithGaps(rowHeights, row, row + rowSpan, gap) - gap;\n      const reservedTop = cell.title ? reservedTitleHeight(cellTheme, cell.title) : 0;\n      const captionH = cell.caption ? reservedCaptionHeight(cellTheme) : 0;\n      const inset = unit / 2;\n      const contentW = cellW - inset * 2;\n      const contentH = cellH - reservedTop - captionH - inset * 2;\n      const sx = contentW / Math.max(result.scene.viewBox.width, 1);\n      const sy = contentH / Math.max(result.scene.viewBox.height, 1);\n      diagramScales.push(Math.min(sx, sy, 1.0));\n    }\n    globalScale = diagramScales.length > 0 ? Math.min(1.0, ...diagramScales) : 1.0;\n  } else if (scaleConfig.mode === 'uniform') {\n    const diagramScales: number[] = [];\n    for (const { cell, cellTheme, result } of cellResults) {\n      if (cell.content.kind !== 'diagram') continue;\n      const col = cell.col ?? 0;\n      const row = cell.row ?? 0;\n      const colSpan = cell.colSpan ?? 1;\n      const rowSpan = cell.rowSpan ?? 1;\n      const cellW = sumWithGaps(colWidths, col, col + colSpan, gap) - gap;\n      const cellH = sumWithGaps(rowHeights, row, row + rowSpan, gap) - gap;\n      const reservedTop = cell.title ? reservedTitleHeight(cellTheme, cell.title) : 0;\n      const captionH = cell.caption ? reservedCaptionHeight(cellTheme) : 0;\n      const inset = unit / 2;\n      const contentW = cellW - inset * 2;\n      const contentH = cellH - reservedTop - captionH - inset * 2;\n      const sx = contentW / Math.max(result.scene.viewBox.width, 1);\n      const sy = contentH / Math.max(result.scene.viewBox.height, 1);\n      diagramScales.push(Math.min(sx, sy, 1.0));\n    }\n    globalScale = diagramScales.length > 0 ? Math.min(...diagramScales) : undefined;\n  }\n\n  // \u2500\u2500 Build elements \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Layers assembled in painter's order (back\u2192front):\n  //   headerElements \u2014 poster title text\n  //   cellBg         \u2014 cell chrome rects\n  //   linkPaths      \u2014 cross-link routes (behind node content so routes that\n  //                    pass through a cell render behind its nodes)\n  //   cellContent    \u2014 cell titles + embedded node scenes\n  //   linkLabels     \u2014 cross-link label text (topmost, always readable)\n  const headerElements: SceneElement[] = [];\n  const cellBg: SceneElement[] = [];\n  const cellContent: SceneElement[] = [];\n  const revealSteps: RevealStep[] = [];\n  // Track text bounding rects so cross-link labels can avoid them\n  const textOccupied: Array<{ x: number; y: number; width: number; height: number }> = [];\n  // Track cell border edges as thin obstacles so connectors don't run along cell walls\n  const cellBorders: Array<{ x: number; y: number; width: number; height: number }> = [];\n  // Full cell bounding boxes keyed by cell ID \u2014 used by the cross-link router\n  // to treat intermediate cells as blocked zones (routes must use corridors).\n  const cellRects = new Map<string, { x: number; y: number; width: number; height: number }>();\n  // Occupied ports from all child diagram layout passes (intra-diagram edges).\n  const allOccupiedPorts: OccupiedPort[] = [];\n\n  if (ir.metadata.title) {\n    headerElements.push({\n      type: 'text',\n      content: ir.metadata.title,\n      position: { x: padding, y: padding + typography.titleFontSize },\n      fontSize: typography.titleFontSize + 2,\n      fontFamily: typography.fontFamily,\n      fontWeight: 'bold',\n      fill: palette.text,\n    });\n    // Estimate title bounding rect\n    const titleW = ir.metadata.title.length * (typography.titleFontSize + 2) * 0.6;\n    const titleH = typography.titleFontSize + 2;\n    textOccupied.push({ x: padding, y: padding, width: titleW, height: titleH + 4 });\n  }\n\n  // \u2500\u2500 Build anchor registry (hierarchical, path-prefixed) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const mergedAnchors: Record<string, NodeAnchor> = {};\n\n  for (const { cell, cellTheme, result } of cellResults) {\n    const cellPalette = cellTheme.palette;\n    const col = cell.col ?? 0;\n    const row = cell.row ?? 0;\n    const colSpan = cell.colSpan ?? 1;\n    const rowSpan = cell.rowSpan ?? 1;\n    const cellId = cell.id ?? cellAddressFromPosition(row, col);\n\n    const cellX = padding + sumWithGaps(colWidths, 0, col, gap);\n    const cellY = padding + headerH + sumWithGaps(rowHeights, 0, row, gap);\n    const cellW = sumWithGaps(colWidths, col, col + colSpan, gap) - gap;\n    const cellH = sumWithGaps(rowHeights, row, row + rowSpan, gap) - gap;\n\n    // Cell chrome \u2014 background layer (connectors route behind this).\n    // Uses the CELL's theme so a dark-themed cell shows a dark panel.\n    cellBg.push({\n      type: 'rect',\n      bounds: { x: cellX, y: cellY, width: cellW, height: cellH },\n      fill: cellPalette.background,\n      stroke: cellPalette.border,\n      strokeWidth: 1,\n      rx: 6,\n    });\n\n    // Record cell edges as thin obstacles (4px) so connectors avoid running along borders\n    const borderThick = 4;\n    cellBorders.push(\n      { x: cellX, y: cellY - borderThick / 2, width: cellW, height: borderThick }, // top edge\n      { x: cellX, y: cellY + cellH - borderThick / 2, width: cellW, height: borderThick }, // bottom edge\n      { x: cellX - borderThick / 2, y: cellY, width: borderThick, height: cellH }, // left edge\n      { x: cellX + cellW - borderThick / 2, y: cellY, width: borderThick, height: cellH }, // right edge\n    );\n    // Record the full cell bounding box for corridor-based cross-link routing.\n    cellRects.set(cellId, { x: cellX, y: cellY, width: cellW, height: cellH });\n\n    const reservedTop = cell.title ? reservedTitleHeight(cellTheme, cell.title) : 0;\n    if (cell.title) {\n      const t = buildCellTitle(cell.title, cellX, cellY, cellW, cellTheme);\n      cellContent.push(...t.elements);\n      textOccupied.push(t.occupied);\n    }\n\n    // Embed child scene \u2014 content layer (above cross-link paths)\n    const inset = unit / 2;\n    const captionH = cell.caption ? reservedCaptionHeight(cellTheme) : 0;\n    const contentRect: Rect = {\n      x: cellX + inset,\n      y: cellY + reservedTop + inset,\n      width: cellW - inset * 2,\n      height: cellH - reservedTop - captionH - inset * 2,\n    };\n\n    const scaleX = contentRect.width / Math.max(result.scene.viewBox.width, 1);\n    const scaleY = contentRect.height / Math.max(result.scene.viewBox.height, 1);\n    const localScale = Math.min(scaleX, scaleY, 1);\n    const scale =\n      cell.content.kind === 'diagram' && globalScale !== undefined ? globalScale : localScale;\n    const offsetX = contentRect.x + (contentRect.width - result.scene.viewBox.width * scale) / 2;\n    const offsetY = contentRect.y + (contentRect.height - result.scene.viewBox.height * scale) / 2;\n\n    let childScene = result.scene;\n    if (result.reveal?.steps.length) {\n      const prefixIds = (ids: readonly string[]) => ids.map((id) => `${cellId}.${id}`);\n      const prefixGroups = (element: SceneElement): SceneElement =>\n        element.type === 'group'\n          ? {\n              ...element,\n              ...(element.id ? { id: `${cellId}.${element.id}` } : {}),\n              children: element.children.map(prefixGroups),\n            }\n          : element;\n      childScene = { ...result.scene, elements: result.scene.elements.map(prefixGroups) };\n      for (const step of result.reveal.steps) {\n        revealSteps.push({\n          ...step,\n          index: revealSteps.length + 1,\n          enter: prefixIds(step.enter),\n          ...(step.emphasize ? { emphasize: prefixIds(step.emphasize) } : {}),\n          ...(step.exit ? { exit: prefixIds(step.exit) } : {}),\n        });\n      }\n    }\n    cellContent.push(embedScene(childScene, contentRect, scale));\n\n    // Caption \u2014 muted text below the sub-diagram\n    if (cell.caption) {\n      const captionY = cellY + cellH - inset / 2;\n      cellContent.push({\n        type: 'text',\n        content: cell.caption,\n        position: { x: cellX + cellW / 2, y: captionY },\n        fontSize: cellTheme.typography.smallFontSize,\n        fontFamily: cellTheme.typography.fontFamily,\n        fill: cellTheme.palette.textMuted,\n        anchor: 'middle',\n      });\n    }\n\n    // Notes \u2014 freeform annotation overlays on top of the sub-diagram\n    if (cell.notes && cell.notes.length > 0) {\n      for (const note of cell.notes) {\n        cellContent.push(...buildNoteOverlay(note, contentRect, cellTheme));\n      }\n    }\n\n    // Transform child anchors to poster coordinates and merge\n    for (const [nodeId, anchor] of Object.entries(result.anchors)) {\n      const prefixedId = `${cellId}.${nodeId}`;\n      const transformed: NodeAnchor = {\n        bounds: {\n          x: anchor.bounds.x * scale + offsetX,\n          y: anchor.bounds.y * scale + offsetY,\n          width: anchor.bounds.width * scale,\n          height: anchor.bounds.height * scale,\n        },\n        ...(anchor.ports\n          ? {\n              ports: Object.fromEntries(\n                Object.entries(anchor.ports).map(([side, pt]) => [\n                  side,\n                  { x: pt!.x * scale + offsetX, y: pt!.y * scale + offsetY },\n                ]),\n              ),\n            }\n          : {}),\n      };\n      mergedAnchors[prefixedId] = transformed;\n    }\n\n    // Collect occupied ports from child layout (t values are coordinate-invariant).\n    for (const op of result.occupiedPorts ?? []) {\n      allOccupiedPorts.push({ ...op, nodeKey: `${cellId}.${op.nodeKey}` });\n    }\n\n    // Collect chrome rects (e.g. internal header bars) and transform them to\n    // poster coordinates so the cross-link label de-collision pass can avoid them.\n    for (const cr of result.chromeRects ?? []) {\n      textOccupied.push({\n        x: cr.x * scale + offsetX,\n        y: cr.y * scale + offsetY,\n        width: cr.width * scale,\n        height: cr.height * scale,\n      });\n    }\n  }\n\n  const totalW = padding * 2 + sumWithGaps(colWidths, 0, grid.columns, gap) - gap;\n  const totalH = padding * 2 + headerH + sumWithGaps(rowHeights, 0, numRows, gap) - gap;\n\n  // Collect defs from all child scenes (e.g. arrow markers)\n  const allDefs: string[] = [];\n  const seenDefs = new Set<string>();\n  for (const { result } of cellResults) {\n    if (result.scene.defs) {\n      for (const def of result.scene.defs) {\n        if (!seenDefs.has(def)) {\n          seenDefs.add(def);\n          allDefs.push(def);\n        }\n      }\n    }\n  }\n\n  // \u2500\u2500\u2500 Cross-Link Resolution & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const links = normalizeElementIndexLinks(ir.links ?? [], cellResultById);\n\n  // Start with the grid dimensions; cross-link rendering may expand these.\n  let finalW = totalW;\n  let finalH = totalH;\n\n  if (links.length > 0) {\n    const connectorSpecs = crossLinksToConnectorSpecs(\n      links.map((link) => {\n        const explicitCurve =\n          link.curveStyle ??\n          (typeof link.props?.curveStyle === 'string'\n            ? (link.props.curveStyle as import('../../../contracts/routing.js').CurveStyle)\n            : undefined);\n        return explicitCurve ? link : { ...link, curveStyle: 'cardinal' as const };\n      }),\n    );\n    const connectorResult = routeConnectors({\n      anchors: mergedAnchors,\n      connectors: connectorSpecs,\n      theme,\n      occupiedPorts: allOccupiedPorts,\n      occupiedTextRects: textOccupied,\n      routingObstacles: cellBorders,\n      containerObstacles: cellRects,\n    });\n    const linkDefs = connectorResult.defs;\n    const linkElements = connectorResult.elements;\n\n    // Add link defs\n    for (const def of linkDefs) {\n      if (!seenDefs.has(def)) {\n        seenDefs.add(def);\n        allDefs.push(def);\n      }\n    }\n\n    // Split link elements: paths go behind cell content, labels and badges go on top.\n    const linkPaths = linkElements.filter((e) => e.type === 'path');\n    const linkLabels = linkElements.filter((e) => e.type !== 'path');\n\n    // Expand the viewBox to include all cross-link route and label extents.\n    const ext = connectorResult.extents;\n    if (ext.maxX > finalW) finalW = ext.maxX + padding;\n    if (ext.maxY > finalH) finalH = ext.maxY + padding;\n\n    // Assemble in painter's order (back \u2192 front):\n    //   header \u2192 cell backgrounds \u2192 link routes \u2192 cell content \u2192 link labels\n    const elements: SceneElement[] = [\n      ...headerElements,\n      ...cellBg,\n      ...linkPaths,\n      ...cellContent,\n      ...linkLabels,\n    ];\n\n    return {\n      scene: {\n        viewBox: { x: 0, y: 0, width: finalW, height: finalH },\n        background: palette.background,\n        elements,\n        ...(allDefs.length > 0 ? { defs: allDefs } : {}),\n      },\n      anchors: mergedAnchors,\n      ...(revealSteps.length > 0 ? { reveal: { steps: revealSteps } } : {}),\n    };\n  }\n\n  // No cross-links (or none resolved): flat assembly without link layers.\n  const elements: SceneElement[] = [...headerElements, ...cellBg, ...cellContent];\n\n  return {\n    scene: {\n      viewBox: { x: 0, y: 0, width: finalW, height: finalH },\n      background: palette.background,\n      elements,\n      ...(allDefs.length > 0 ? { defs: allDefs } : {}),\n    },\n    anchors: mergedAnchors,\n    ...(revealSteps.length > 0 ? { reveal: { steps: revealSteps } } : {}),\n  };\n}\n\nfunction normalizeElementIndexLinks(\n  links: readonly CrossLink[],\n  cellResultById: ReadonlyMap<string, { cell: PosterCell; result: LayoutResult }>,\n): CrossLink[] {\n  return links.map((link) => ({\n    ...link,\n    from: normalizeElementIndexAddress(link.from, cellResultById),\n    to: normalizeElementIndexAddress(link.to, cellResultById),\n  }));\n}\n\nfunction normalizeElementIndexAddress(\n  address: NodeAddress,\n  cellResultById: ReadonlyMap<string, { cell: PosterCell; result: LayoutResult }>,\n): NodeAddress {\n  if (address.elementIndex === undefined) return address;\n\n  const cellId = address.cellPath.join('.');\n  const cellResult = cellResultById.get(cellId);\n  const content = cellResult?.cell.content;\n  const arrayNodeId =\n    content?.kind === 'diagram' && content.diagramKind === 'array'\n      ? resolveArrayElementAnchorId(content.doc as any, address.elementIndex)\n      : fallbackElementAnchorId(cellResult?.result.anchors ?? {}, address.elementIndex);\n\n  return {\n    ...address,\n    nodeId: arrayNodeId ?? `__missing_element_${address.elementIndex}`,\n  };\n}\n\nfunction fallbackElementAnchorId(\n  anchors: NodeAnchorRegistry,\n  elementIndex: number,\n): string | undefined {\n  if (elementIndex < 0) {\n    if (elementIndex === -1 && anchors.clast) return 'clast';\n    return undefined;\n  }\n  return anchors[`c${elementIndex}`] ? `c${elementIndex}` : undefined;\n}\n\n/**\n * Compute the rightmost and bottommost extents across all cross-link\n * scene elements (paths and text labels).\n *\n * For paths: extract all numeric coordinates from the SVG path `d` string.\n *   Taking the max of all numbers over-approximates bezier control-point\n *   extents, but that is safe (never under-estimates) and keeps the logic\n *   simple without a full bezier bounding-box solver.\n *\n * For text: use the anchor position plus an estimated character-width.\n */\nfunction crossLinkExtents(elements: readonly SceneElement[]): { maxX: number; maxY: number } {\n  let maxX = 0;\n  let maxY = 0;\n\n  for (const el of elements) {\n    if (el.type === 'path') {\n      // Extract all numbers from the path d string in adjacent x,y pairs.\n      // This works exactly for M/L commands and safely over-approximates C.\n      const nums: number[] = [];\n      for (const m of el.d.matchAll(/[-\\d.]+/g)) {\n        const n = parseFloat(m[0]);\n        if (!isNaN(n)) nums.push(n);\n      }\n      for (let i = 0; i + 1 < nums.length; i += 2) {\n        maxX = Math.max(maxX, nums[i]!);\n        maxY = Math.max(maxY, nums[i + 1]!);\n      }\n    } else if (el.type === 'text') {\n      const approxW = el.content.length * (el.fontSize ?? 12) * 0.65;\n      const right = el.anchor === 'middle' ? el.position.x + approxW / 2 : el.position.x + approxW;\n      maxX = Math.max(maxX, right);\n      maxY = Math.max(maxY, el.position.y + (el.fontSize ?? 12));\n    }\n  }\n\n  return { maxX, maxY };\n}\n\n// \u2500\u2500\u2500 Cell Content Dispatch \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction layoutCellContent(content: CellContent, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const unit = spacing.unit;\n  const pad = spacing.nodePadding;\n\n  switch (content.kind) {\n    case 'diagram': {\n      const module = getModule(content.diagramKind);\n      if (!module) {\n        const w = unit * 20;\n        const h = typography.baseFontSize + pad * 2;\n        return {\n          scene: {\n            viewBox: { x: 0, y: 0, width: w, height: h },\n            elements: [\n              {\n                type: 'text',\n                content: `[${content.diagramKind}]`,\n                position: { x: pad, y: pad + typography.baseFontSize * 0.8 },\n                fontSize: typography.baseFontSize,\n                fontFamily: typography.fontFamily,\n                fill: palette.textMuted,\n              },\n            ],\n          },\n          anchors: {},\n        };\n      }\n      return module.layout(content.doc, theme);\n    }\n    case 'text': {\n      // Approximate width: ~8px per character at baseFontSize, with min/max\n      const estCharW = typography.baseFontSize * 0.6;\n      const textW = Math.max(\n        unit * 10,\n        Math.min(unit * 30, content.text.length * estCharW + pad * 2),\n      );\n      const textH = typography.baseFontSize * typography.lineHeight + pad * 2;\n      return {\n        scene: {\n          viewBox: { x: 0, y: 0, width: textW, height: textH },\n          elements: [\n            {\n              type: 'text',\n              content: content.text,\n              position: { x: pad, y: pad + typography.baseFontSize * 0.8 },\n              fontSize: typography.baseFontSize,\n              fontFamily: typography.fontFamily,\n              fill: palette.text,\n            },\n          ],\n        },\n        anchors: {},\n      };\n    }\n    case 'stat': {\n      const valueFontSize = typography.titleFontSize * 1.5;\n      const cellW = Math.max(unit * 10, valueFontSize * 3);\n      const centerX = cellW / 2;\n\n      const valueY = pad + valueFontSize * 0.8;\n      const labelGap = unit;\n      const labelY = valueY + labelGap + typography.smallFontSize * 0.8;\n      const cellH = content.label\n        ? valueY + labelGap + typography.smallFontSize + pad\n        : valueY + pad;\n\n      const els: SceneElement[] = [\n        {\n          type: 'text',\n          content: content.value,\n          position: { x: centerX, y: valueY },\n          fontSize: valueFontSize,\n          fontFamily: typography.fontFamily,\n          fontWeight: 'bold',\n          fill: palette.primary,\n          anchor: 'middle',\n        },\n      ];\n      if (content.label) {\n        els.push({\n          type: 'text',\n          content: content.label,\n          position: { x: centerX, y: labelY },\n          fontSize: typography.smallFontSize,\n          fontFamily: typography.fontFamily,\n          fill: palette.textMuted,\n          anchor: 'middle',\n        });\n      }\n      return {\n        scene: { viewBox: { x: 0, y: 0, width: cellW, height: cellH }, elements: els },\n        anchors: {},\n      };\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Scale Mode Resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type ScaleModeType = 'contain' | 'uniform' | 'natural' | 'fixed';\n\nexport interface ResolvedScaleConfig {\n  mode: ScaleModeType;\n  fixedScale?: number;\n}\n\nexport function resolveScaleConfig(\n  gridScale?: PosterScaleMode | string,\n  metaScale?: unknown,\n  metaUniformScale?: unknown,\n): ResolvedScaleConfig {\n  const raw = gridScale ?? metaScale ?? (metaUniformScale ? 'uniform' : undefined);\n  if (\n    raw === undefined ||\n    raw === null ||\n    raw === '' ||\n    raw === 'contain' ||\n    raw === 'none' ||\n    raw === 'false'\n  ) {\n    return { mode: 'contain' };\n  }\n  if (typeof raw === 'number') {\n    return raw === 1 ? { mode: 'natural' } : { mode: 'fixed', fixedScale: raw };\n  }\n  if (typeof raw === 'boolean') {\n    return raw ? { mode: 'uniform' } : { mode: 'contain' };\n  }\n  const str = String(raw).trim().toLowerCase();\n  if (str === 'natural' || str === '1' || str === '1.0' || str === '100%') {\n    return { mode: 'natural' };\n  }\n  if (str === 'uniform' || str === 'homologate' || str === 'true' || str === 'same') {\n    return { mode: 'uniform' };\n  }\n  if (str === 'contain' || str === 'independent' || str === 'fit') {\n    return { mode: 'contain' };\n  }\n  const parsedNum = parseFloat(str.endsWith('%') ? str.slice(0, -1) : str);\n  if (!isNaN(parsedNum) && parsedNum > 0) {\n    const val = str.endsWith('%') ? parsedNum / 100 : parsedNum;\n    return val === 1 ? { mode: 'natural' } : { mode: 'fixed', fixedScale: val };\n  }\n  return { mode: 'contain' };\n}\n\n// \u2500\u2500\u2500 Scene Embedding \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction embedScene(scene: Scene, into: Rect, overrideScale?: number): SceneElement {\n  const scaleX = into.width / Math.max(scene.viewBox.width, 1);\n  const scaleY = into.height / Math.max(scene.viewBox.height, 1);\n  const scale = overrideScale !== undefined ? overrideScale : Math.min(scaleX, scaleY, 1);\n\n  // Centre within the cell\n  const offsetX = into.x + (into.width - scene.viewBox.width * scale) / 2;\n  const offsetY = into.y + (into.height - scene.viewBox.height * scale) / 2;\n\n  return {\n    type: 'group',\n    transform: `translate(${offsetX}, ${offsetY}) scale(${scale})`,\n    children: scene.elements as SceneElement[],\n  };\n}\n\n// \u2500\u2500\u2500 Cell Title (theme.panel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Parse a cell title into constituent lines, supporting `::` subtitle syntax\n * (Primary Title :: Subtitle) and `<br/>`, `\\n`, `\\n` line breaks.\n */\nexport function parseCellTitle(raw: string): Array<{ text: string; isSubtitle: boolean }> {\n  const sepIdx = raw.indexOf('::');\n  if (sepIdx !== -1) {\n    return [\n      { text: raw.slice(0, sepIdx).trim(), isSubtitle: false },\n      { text: raw.slice(sepIdx + 2).trim(), isSubtitle: true },\n    ];\n  }\n  const parts = raw\n    .split(/<br\\s*\\/?>|\\n|\\\\n/g)\n    .map((s) => s.trim())\n    .filter(Boolean);\n  if (parts.length > 1) {\n    return parts.map((p, i) => ({ text: p, isSubtitle: i > 0 }));\n  }\n  return [{ text: raw.trim(), isSubtitle: false }];\n}\n\n/**\n * Interior height a cell must reserve at its top for the title, given the\n * theme's panel placement and title line count. 'above' titles live outside the frame (0 reserved);\n * 'on-border' titles straddle the edge (half reserved); 'inside' titles sit\n * fully within the frame (full reserved).\n */\nfunction reservedTitleHeight(theme: ResolvedTheme, title?: string): number {\n  const { spacing, panel } = theme;\n  const boxH = titleBoxHeight(theme, title);\n  switch (panel.titlePosition) {\n    case 'above':\n      return 0;\n    case 'on-border':\n      return boxH / 2 + spacing.unit * 0.5;\n    case 'inside':\n    default:\n      return boxH + spacing.unit * 0.5;\n  }\n}\n\nfunction titleBoxHeight(theme: ResolvedTheme, title?: string): number {\n  const fs = theme.typography.baseFontSize;\n  const padY = theme.panel.titleChrome === 'none' ? 0 : theme.spacing.unit * 0.4;\n  if (!title) return fs + padY * 2;\n  const lines = parseCellTitle(title);\n  if (lines.length <= 1) return fs + padY * 2;\n  const subtitleFs = theme.typography.smallFontSize;\n  return fs + (lines.length - 1) * (subtitleFs * 1.35) + padY * 2;\n}\n\n/** Height reserved at the bottom of a cell for a caption line. */\nfunction reservedCaptionHeight(theme: ResolvedTheme): number {\n  return theme.typography.smallFontSize + theme.spacing.unit;\n}\n\n/**\n * Build a freeform note overlay anchored to a content rect.\n * Positions: top-left/right, bottom-left/right, center.\n * Renders as a semi-transparent pill behind the text.\n */\nfunction buildNoteOverlay(note: PosterNote, rect: Rect, theme: ResolvedTheme): SceneElement[] {\n  const { palette, typography, spacing } = theme;\n  const fs = typography.smallFontSize;\n  const pad = spacing.unit * 0.5;\n  const textW = note.text.length * fs * 0.62 + pad * 2;\n  const boxH = fs + pad * 2;\n  const pos = note.position ?? 'top-right';\n\n  let bx: number, by: number;\n  switch (pos) {\n    case 'top-left':\n      bx = rect.x + spacing.unit * 0.5;\n      by = rect.y + spacing.unit * 0.5;\n      break;\n    case 'top-right':\n      bx = rect.x + rect.width - textW - spacing.unit * 0.5;\n      by = rect.y + spacing.unit * 0.5;\n      break;\n    case 'bottom-left':\n      bx = rect.x + spacing.unit * 0.5;\n      by = rect.y + rect.height - boxH - spacing.unit * 0.5;\n      break;\n    case 'bottom-right':\n      bx = rect.x + rect.width - textW - spacing.unit * 0.5;\n      by = rect.y + rect.height - boxH - spacing.unit * 0.5;\n      break;\n    case 'center':\n      bx = rect.x + (rect.width - textW) / 2;\n      by = rect.y + (rect.height - boxH) / 2;\n      break;\n    default:\n      bx = rect.x + rect.width - textW - spacing.unit * 0.5;\n      by = rect.y + spacing.unit * 0.5;\n  }\n\n  return [\n    {\n      type: 'rect',\n      bounds: { x: bx, y: by, width: textW, height: boxH },\n      fill: palette.surface,\n      stroke: palette.primary,\n      strokeWidth: 1,\n      rx: boxH / 2,\n      fillOpacity: 0.88,\n    },\n    {\n      type: 'text',\n      content: note.text,\n      position: { x: bx + textW / 2, y: by + pad + fs * 0.8 },\n      fontSize: fs,\n      fontFamily: typography.fontFamily,\n      fontWeight: 'bold',\n      fill: palette.primary,\n      anchor: 'middle',\n    },\n  ];\n}\n\n/**\n * Build the SceneElements for a cell title (optional chrome rect + text),\n * honouring the theme's panel alignment / vertical position / chrome.\n * Supports multi-line and `::` subtitle hierarchy.\n */\nfunction buildCellTitle(\n  title: string,\n  cellX: number,\n  cellY: number,\n  cellW: number,\n  theme: ResolvedTheme,\n): { elements: SceneElement[]; occupied: Rect } {\n  const { palette, typography, panel, spacing } = theme;\n  const unit = spacing.unit;\n  const fs = typography.baseFontSize;\n  const smallFs = typography.smallFontSize;\n\n  const padX = panel.titleChrome === 'none' ? 0 : unit * 0.75;\n  const padY = panel.titleChrome === 'none' ? 0 : unit * 0.4;\n  const lines = parseCellTitle(title);\n\n  // Measure max width across all title lines\n  const maxTw = Math.max(\n    ...lines.map((l) => measureText(l.text, l.isSubtitle ? smallFs : fs).width),\n  );\n  const boxW = maxTw + padX * 2;\n  const lineSpacing = smallFs * 1.35;\n  const boxH = lines.length <= 1 ? fs + padY * 2 : fs + (lines.length - 1) * lineSpacing + padY * 2;\n  const wall = unit; // inset of the title from the left/right wall\n\n  // Horizontal: box origin + text anchor point.\n  let boxX: number;\n  let anchorX: number;\n  let anchor: 'start' | 'middle' | 'end';\n  if (panel.titleAlign === 'center') {\n    boxX = cellX + cellW / 2 - boxW / 2;\n    anchorX = cellX + cellW / 2;\n    anchor = 'middle';\n  } else if (panel.titleAlign === 'right') {\n    boxX = cellX + cellW - wall - boxW;\n    anchorX = boxX + boxW - padX;\n    anchor = 'end';\n  } else {\n    boxX = cellX + wall;\n    anchorX = boxX + padX;\n    anchor = 'start';\n  }\n\n  // Vertical: top of the chrome box relative to the cell's top edge.\n  let boxTop: number;\n  if (panel.titlePosition === 'on-border') {\n    boxTop = cellY - boxH / 2;\n  } else if (panel.titlePosition === 'above') {\n    boxTop = cellY - boxH - unit * 0.25;\n  } else {\n    boxTop = cellY + unit * 0.5;\n  }\n\n  const elements: SceneElement[] = [];\n  if (panel.titleChrome !== 'none') {\n    const rx = panel.titleChrome === 'pill' ? boxH / 2 : Math.min(6, boxH / 3);\n    elements.push({\n      type: 'rect',\n      bounds: { x: boxX, y: boxTop, width: boxW, height: boxH },\n      fill: palette.surface,\n      stroke: palette.border,\n      strokeWidth: 1,\n      rx,\n    });\n  }\n\n  for (let i = 0; i < lines.length; i++) {\n    const line = lines[i]!;\n    const lineFs = line.isSubtitle ? smallFs : fs;\n    const lineBaselineY = boxTop + padY + fs * 0.8 + i * lineSpacing;\n    elements.push({\n      type: 'text',\n      content: line.text,\n      position: { x: anchorX, y: lineBaselineY },\n      fontSize: lineFs,\n      fontFamily: typography.fontFamily,\n      fontWeight: line.isSubtitle ? 'normal' : 'bold',\n      fill: line.isSubtitle ? palette.textMuted : palette.text,\n      anchor,\n    });\n  }\n\n  const occX = anchor === 'start' ? cellX : boxX;\n  const occW = anchor === 'start' ? boxW + (boxX - cellX) : boxW;\n  const occY = Math.min(cellY, boxTop);\n  const occH = boxH + (boxTop - occY);\n  return { elements, occupied: { x: occX, y: occY, width: occW, height: occH } };\n}\n\n// \u2500\u2500\u2500 Grid Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Grid placement: assigns row/col to each cell, reserving spanned cells so\n *  later cells skip slots already covered by a colSpan/rowSpan. Exported for tests. */\nexport function assignPositions(cells: readonly PosterCell[], columns: number): PosterCell[] {\n  const occupied = new Set<string>();\n  const key = (r: number, c: number): string => `${r},${c}`;\n  const mark = (r: number, c: number, rs: number, cs: number): void => {\n    for (let rr = r; rr < r + rs; rr++)\n      for (let cc = c; cc < c + cs; cc++) occupied.add(key(rr, cc));\n  };\n  const fits = (r: number, c: number, rs: number, cs: number): boolean => {\n    if (c + cs > columns) return false;\n    for (let rr = r; rr < r + rs; rr++)\n      for (let cc = c; cc < c + cs; cc++) if (occupied.has(key(rr, cc))) return false;\n    return true;\n  };\n\n  let row = 0,\n    col = 0;\n  return cells.map((cell) => {\n    const cs = Math.min(cell.colSpan ?? 1, columns);\n    const rs = cell.rowSpan ?? 1;\n    // Explicitly placed cells are honoured as-is, but still reserve their footprint.\n    if (cell.row !== undefined && cell.col !== undefined) {\n      mark(cell.row, cell.col, rs, cs);\n      return cell;\n    }\n    // Scan row-major for the first free slot whose full span fits.\n    while (!fits(row, col, rs, cs)) {\n      col++;\n      if (col >= columns) {\n        col = 0;\n        row++;\n      }\n    }\n    const assigned = { ...cell, row, col };\n    mark(row, col, rs, cs);\n    col += cs;\n    if (col >= columns) {\n      col = 0;\n      row++;\n    }\n    return assigned;\n  });\n}\n\n/** Sum widths/heights from index `start` (inclusive) to `end` (exclusive) with gaps. */\nfunction sumWithGaps(sizes: number[], start: number, end: number, gap: number): number {\n  let total = 0;\n  for (let i = start; i < end; i++) total += (sizes[i] ?? 0) + gap;\n  return total;\n}\n\n/**\n * Generate an Excel-style cell address from row/col indices.\n * col 0 \u2192 \"A\", col 1 \u2192 \"B\", ..., col 25 \u2192 \"Z\", col 26 \u2192 \"AA\"\n * Row is 1-indexed in the output: row 0 \u2192 \"1\".\n */\nfunction cellAddressFromPosition(row: number, col: number): string {\n  let addr = '';\n  let c = col;\n  do {\n    addr = String.fromCharCode(65 + (c % 26)) + addr;\n    c = Math.floor(c / 26) - 1;\n  } while (c >= 0);\n  return `${addr}${row + 1}`;\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  const cells = [];\n  const links = [];\n  let cellCounter = 0;\n\n  function slugify(text) {\n    if (!text) return '';\n    return text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || '';\n  }\n\n  function addCell(explicitId, title, kind, rawContent, span, theme) {\n    cellCounter++;\n    const id = explicitId || slugify(title) || `cell-${cellCounter}`;\n    cells.push({ id, explicitId: explicitId || undefined, title: title || undefined, kind, rawContent: rawContent.trim(), span, theme: theme || undefined });\n  }\n\n  function addLink(from, arrow, to, label, props) {\n    links.push({ from, ...arrow, to, label: label || undefined, ...(props ? props : {}) });\n  }\n\n  function reset() {\n    cells.length = 0;\n    links.length = 0;\n    cellCounter = 0;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"---\";\n  var peg$c1 = \"poster\";\n  var peg$c2 = \"columns\";\n  var peg$c3 = \"rows\";\n  var peg$c4 = \"gap\";\n  var peg$c5 = \"scale\";\n  var peg$c6 = \"uniform-scale\";\n  var peg$c7 = \"uniform_scale\";\n  var peg$c8 = \"cell\";\n  var peg$c9 = \"::\";\n  var peg$c10 = \"@theme\";\n  var peg$c11 = \"end\";\n  var peg$c12 = \"[\";\n  var peg$c13 = \"x\";\n  var peg$c14 = \"]\";\n  var peg$c15 = \"link\";\n  var peg$c16 = \"@\";\n  var peg$c17 = \"anim:\";\n  var peg$c18 = \":\";\n  var peg$c19 = \"march\";\n  var peg$c20 = \"particle\";\n  var peg$c21 = \"draw\";\n  var peg$c22 = \"pulse\";\n  var peg$c23 = \"glow\";\n  var peg$c24 = \"comet\";\n  var peg$c25 = \"stream\";\n  var peg$c26 = \"flow\";\n  var peg$c27 = \"colorcycle\";\n  var peg$c28 = \"none\";\n  var peg$c29 = \"straight\";\n  var peg$c30 = \"orthogonal\";\n  var peg$c31 = \"bezier\";\n  var peg$c32 = \"polyline\";\n  var peg$c33 = \"{\";\n  var peg$c34 = \",\";\n  var peg$c35 = \"}\";\n  var peg$c36 = \".\";\n  var peg$c37 = \"<-~->\";\n  var peg$c38 = \"<-_->\";\n  var peg$c39 = \"<-.->\";\n  var peg$c40 = \"<==>\";\n  var peg$c41 = \"<-->\";\n  var peg$c42 = \"-~->\";\n  var peg$c43 = \"-_->\";\n  var peg$c44 = \"-..->\";\n  var peg$c45 = \"-.->\";\n  var peg$c46 = \"===>\";\n  var peg$c47 = \"==>\";\n  var peg$c48 = \"--->\";\n  var peg$c49 = \"-->\";\n  var peg$c50 = \"-~-\";\n  var peg$c51 = \"-_-\";\n  var peg$c52 = \"-.-\";\n  var peg$c53 = \"===\";\n  var peg$c54 = \"\\\"\";\n  var peg$c55 = \"%%\";\n  var peg$c56 = \"\\r\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[ENSW]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[a-zA-Z_]/;\n  var peg$r4 = /^[a-zA-Z0-9_\\-]/;\n  var peg$r5 = /^[^\"]/;\n  var peg$r6 = /^[+\\-]/;\n  var peg$r7 = /^[ \\t]/;\n  var peg$r8 = /^[\\n\\r]/;\n\n  var peg$e0 = peg$literalExpectation(\"---\", false);\n  var peg$e1 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e2 = peg$literalExpectation(\"poster\", false);\n  var peg$e3 = peg$literalExpectation(\"columns\", false);\n  var peg$e4 = peg$literalExpectation(\"rows\", false);\n  var peg$e5 = peg$literalExpectation(\"gap\", false);\n  var peg$e6 = peg$literalExpectation(\"scale\", false);\n  var peg$e7 = peg$literalExpectation(\"uniform-scale\", false);\n  var peg$e8 = peg$literalExpectation(\"uniform_scale\", false);\n  var peg$e9 = peg$literalExpectation(\"cell\", false);\n  var peg$e10 = peg$literalExpectation(\"::\", false);\n  var peg$e11 = peg$literalExpectation(\"@theme\", false);\n  var peg$e12 = peg$literalExpectation(\"end\", false);\n  var peg$e13 = peg$literalExpectation(\"[\", false);\n  var peg$e14 = peg$literalExpectation(\"x\", false);\n  var peg$e15 = peg$literalExpectation(\"]\", false);\n  var peg$e16 = peg$literalExpectation(\"link\", false);\n  var peg$e17 = peg$literalExpectation(\"@\", false);\n  var peg$e18 = peg$anyExpectation();\n  var peg$e19 = peg$literalExpectation(\"anim:\", false);\n  var peg$e20 = peg$literalExpectation(\":\", false);\n  var peg$e21 = peg$literalExpectation(\"march\", false);\n  var peg$e22 = peg$literalExpectation(\"particle\", false);\n  var peg$e23 = peg$literalExpectation(\"draw\", false);\n  var peg$e24 = peg$literalExpectation(\"pulse\", false);\n  var peg$e25 = peg$literalExpectation(\"glow\", false);\n  var peg$e26 = peg$literalExpectation(\"comet\", false);\n  var peg$e27 = peg$literalExpectation(\"stream\", false);\n  var peg$e28 = peg$literalExpectation(\"flow\", false);\n  var peg$e29 = peg$literalExpectation(\"colorcycle\", false);\n  var peg$e30 = peg$literalExpectation(\"none\", false);\n  var peg$e31 = peg$literalExpectation(\"straight\", false);\n  var peg$e32 = peg$literalExpectation(\"orthogonal\", false);\n  var peg$e33 = peg$literalExpectation(\"bezier\", false);\n  var peg$e34 = peg$literalExpectation(\"polyline\", false);\n  var peg$e35 = peg$classExpectation([\"E\", \"N\", \"S\", \"W\"], false, false);\n  var peg$e36 = peg$literalExpectation(\"{\", false);\n  var peg$e37 = peg$literalExpectation(\",\", false);\n  var peg$e38 = peg$literalExpectation(\"}\", false);\n  var peg$e39 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e40 = peg$literalExpectation(\".\", false);\n  var peg$e41 = peg$literalExpectation(\"<-~->\", false);\n  var peg$e42 = peg$literalExpectation(\"<-_->\", false);\n  var peg$e43 = peg$literalExpectation(\"<-.->\", false);\n  var peg$e44 = peg$literalExpectation(\"<==>\", false);\n  var peg$e45 = peg$literalExpectation(\"<-->\", false);\n  var peg$e46 = peg$literalExpectation(\"-~->\", false);\n  var peg$e47 = peg$literalExpectation(\"-_->\", false);\n  var peg$e48 = peg$literalExpectation(\"-..->\", false);\n  var peg$e49 = peg$literalExpectation(\"-.->\", false);\n  var peg$e50 = peg$literalExpectation(\"===>\", false);\n  var peg$e51 = peg$literalExpectation(\"==>\", false);\n  var peg$e52 = peg$literalExpectation(\"--->\", false);\n  var peg$e53 = peg$literalExpectation(\"-->\", false);\n  var peg$e54 = peg$literalExpectation(\"-~-\", false);\n  var peg$e55 = peg$literalExpectation(\"-_-\", false);\n  var peg$e56 = peg$literalExpectation(\"-.-\", false);\n  var peg$e57 = peg$literalExpectation(\"===\", false);\n  var peg$e58 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], \"_\"], false, false);\n  var peg$e59 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e60 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e61 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e62 = peg$classExpectation([\"+\", \"-\"], false, false);\n  var peg$e63 = peg$literalExpectation(\"%%\", false);\n  var peg$e64 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e65 = peg$literalExpectation(\"\\r\\n\", false);\n  var peg$e66 = peg$classExpectation([\"\\n\", \"\\r\"], false, false);\n\n  var peg$f0 = function(frontmatter, header, directives, body) {\n      const columns = (directives.find(d => d.key === 'columns') || {}).value || 2;\n      const rowsDirective = directives.find(d => d.key === 'rows');\n      const gapDirective = directives.find(d => d.key === 'gap');\n      const scaleDirective = directives.find(d => d.key === 'scale' || d.key === 'uniform-scale' || d.key === 'uniform_scale');\n      return {\n        version: '1.0',\n        metadata: { ...(frontmatter || {}), title: header.title || undefined },\n        grid: {\n          columns: parseInt(columns, 10),\n          ...(rowsDirective ? { rows: parseInt(rowsDirective.value, 10) } : {}),\n          ...(gapDirective ? { gap: parseFloat(gapDirective.value) } : {}),\n          ...(scaleDirective ? { scale: scaleDirective.value } : {}),\n        },\n        cells,\n        ...(links.length > 0 ? { links } : {}),\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {};\n      for (const line of lines) {\n        const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/);\n        if (m) meta[m[1]] = m[2];\n      }\n      return meta;\n    };\n  var peg$f3 = function(title) { return { title: title ? title[1] : null }; };\n  var peg$f4 = function(key, value) { return { key, value: value.trim() }; };\n  var peg$f5 = function(items) { return items.filter(Boolean); };\n  var peg$f6 = function(ids, span, kind) { return kind; };\n  var peg$f7 = function(ids, span, explicitKind, t) { return t; };\n  var peg$f8 = function(ids, span, explicitKind, theme, content) {\n      addCell(ids.id, ids.title, explicitKind || null, content, span || undefined, theme || undefined);\n      return { type: 'cell' };\n    };\n  var peg$f9 = function(id, title) { return { id, title }; };\n  var peg$f10 = function(id) { return { id, title: null }; };\n  var peg$f11 = function(title) { return { id: null, title }; };\n  var peg$f12 = function() { return { id: null, title: null }; };\n  var peg$f13 = function(cols, rows) { return { colSpan: cols, rowSpan: rows }; };\n  var peg$f14 = function(cols) { return { colSpan: cols, rowSpan: 1   }; };\n  var peg$f15 = function(from, arrow, to, preAnns, label, postAnns, block) {\n      // Start with props from { } block (lower precedence)\n      const result = {};\n      if (block) {\n        const b = block[1];\n        if (b.route) { result.routing = b.route; delete b.route; }\n        if (b.anim)  { result.animation = b.anim;  delete b.anim;  }\n        if (b.curveStyle) { result.curveStyle = b.curveStyle; delete b.curveStyle; }\n        if (b.curve)      { result.curveStyle = b.curve;      delete b.curve;      }\n        if (Object.keys(b).length > 0) result.props = b;\n      }\n      // Apply @ annotations last \u2014 @ WINS on conflict (superset rule \u00A74.3)\n      const allAnns = [...preAnns, ...postAnns];\n      for (const ann of allAnns) {\n        Object.assign(result, ann[2]);\n      }\n      addLink(from, arrow, to, label ? label[1] : null, Object.keys(result).length > 0 ? result : null);\n      return { type: 'link' };\n    };\n  var peg$f16 = function(value) { return { animation: value }; };\n  var peg$f17 = function(route, walls) {\n      return { routing: route, ...(walls ? walls[1] : {}) };\n    };\n  var peg$f18 = function(walls) { return walls; };\n  var peg$f19 = function(route, walls) {\n      return { routing: route, ...(walls ? walls[1] : {}) };\n    };\n  var peg$f20 = function(walls) { return walls; };\n  var peg$f21 = function() { return 'straight'; };\n  var peg$f22 = function() { return 'orthogonal'; };\n  var peg$f23 = function() { return 'bezier'; };\n  var peg$f24 = function() { return 'polyline'; };\n  var peg$f25 = function(exit, entry) { return { exitWall: exit, entryWall: entry }; };\n  var peg$f26 = function(exit) { return { exitWall: exit }; };\n  var peg$f27 = function(w) { return w; };\n  var peg$f28 = function(first, rest) {\n      const result = {};\n      result[first.key] = first.value;\n      for (const r of rest) { result[r[3].key] = r[3].value; }\n      return result;\n    };\n  var peg$f29 = function(key, value) { return { key, value }; };\n  var peg$f30 = function(num) { return parseFloat(num); };\n  var peg$f31 = function() { return { direction: 'bidirectional', style: 'wavy'   }; };\n  var peg$f32 = function() { return { direction: 'bidirectional', style: 'dashed' }; };\n  var peg$f33 = function() { return { direction: 'bidirectional', style: 'dotted' }; };\n  var peg$f34 = function() { return { direction: 'bidirectional', style: 'thick'  }; };\n  var peg$f35 = function() { return { direction: 'bidirectional', style: 'solid'  }; };\n  var peg$f36 = function() { return { direction: 'directed', style: 'wavy'   }; };\n  var peg$f37 = function() { return { direction: 'directed', style: 'dashed' }; };\n  var peg$f38 = function() { return { direction: 'directed', style: 'dotted' }; };\n  var peg$f39 = function() { return { direction: 'directed', style: 'dotted' }; };\n  var peg$f40 = function() { return { direction: 'directed', style: 'thick'  }; };\n  var peg$f41 = function() { return { direction: 'directed', style: 'thick'  }; };\n  var peg$f42 = function() { return { direction: 'directed', style: 'solid'  }; };\n  var peg$f43 = function() { return { direction: 'directed', style: 'solid'  }; };\n  var peg$f44 = function() { return { direction: 'undirected', style: 'wavy'   }; };\n  var peg$f45 = function() { return { direction: 'undirected', style: 'dashed' }; };\n  var peg$f46 = function() { return { direction: 'undirected', style: 'dotted' }; };\n  var peg$f47 = function() { return { direction: 'undirected', style: 'thick'  }; };\n  var peg$f48 = function() { return { direction: 'undirected', style: 'solid'  }; };\n  var peg$f49 = function(cell, index) { return { cellPath: [cell], nodeId: \"\", elementIndex: index }; };\n  var peg$f50 = function(cell, node) { return { cellPath: [cell], nodeId: node }; };\n  var peg$f51 = function(line) { return line; };\n  var peg$f52 = function(lines) { return lines.join('\\n'); };\n  var peg$f53 = function(text) { return text; };\n  var peg$f54 = function(digits) { return parseInt(digits, 10); };\n  var peg$f55 = function(sign, digits) { return parseInt((sign || \"\") + digits, 10); };\n  var peg$f56 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = peg$parsePosterHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parse_();\n      s5 = [];\n      s6 = peg$parseGridDirective();\n      while (s6 !== peg$FAILED) {\n        s5.push(s6);\n        s6 = peg$parseGridDirective();\n      }\n      s6 = peg$parse_();\n      s7 = peg$parseBodyItems();\n      s8 = peg$parse_();\n      peg$savedPos = s0;\n      s0 = peg$f0(s1, s3, s5, s7);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s7 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c0) {\n            s7 = peg$c0;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s4 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePosterHeader() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 6) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 6;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      s4 = peg$parseQuotedString();\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$parse_();\n      s4 = peg$parseNL();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f3(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseGridDirective() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 7) === peg$c2) {\n      s2 = peg$c2;\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c3) {\n        s2 = peg$c3;\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s2 === peg$FAILED) {\n        if (input.substr(peg$currPos, 3) === peg$c4) {\n          s2 = peg$c4;\n          peg$currPos += 3;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s2 === peg$FAILED) {\n          if (input.substr(peg$currPos, 5) === peg$c5) {\n            s2 = peg$c5;\n            peg$currPos += 5;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s2 === peg$FAILED) {\n            if (input.substr(peg$currPos, 13) === peg$c6) {\n              s2 = peg$c6;\n              peg$currPos += 13;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s2 === peg$FAILED) {\n              if (input.substr(peg$currPos, 13) === peg$c7) {\n                s2 = peg$c7;\n                peg$currPos += 13;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f4(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBodyItems() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseCellBlock();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseLinkDecl();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseBlankLine();\n      }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseCellBlock();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseLinkDecl();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseBlankLine();\n        }\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f5(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCellBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 4) === peg$c8) {\n      s2 = peg$c8;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseCellIdTitle();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseCellSpan();\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.substr(peg$currPos, 2) === peg$c9) {\n          s7 = peg$c9;\n          peg$currPos += 2;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseIdentifier();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s5;\n            s5 = peg$f6(s3, s4, s9);\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$currPos;\n        s7 = peg$parse_();\n        if (input.substr(peg$currPos, 6) === peg$c10) {\n          s8 = peg$c10;\n          peg$currPos += 6;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parse__();\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parseIdentifier();\n            if (s10 !== peg$FAILED) {\n              peg$savedPos = s6;\n              s6 = peg$f7(s3, s4, s5, s10);\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        if (s6 === peg$FAILED) {\n          s6 = null;\n        }\n        s7 = peg$parse_();\n        s8 = peg$parseNL();\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parseCellContent();\n          s10 = peg$parse_();\n          if (input.substr(peg$currPos, 3) === peg$c11) {\n            s11 = peg$c11;\n            peg$currPos += 3;\n          } else {\n            s11 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s11 !== peg$FAILED) {\n            s12 = peg$parse_();\n            s13 = peg$parseNL();\n            if (s13 === peg$FAILED) {\n              s13 = null;\n            }\n            peg$savedPos = s0;\n            s0 = peg$f8(s3, s4, s5, s6, s9);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCellIdTitle() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse__();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseIdentifier();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseQuotedString();\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f9(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse__();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseIdentifier();\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f10(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parse__();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$parseQuotedString();\n          if (s2 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f11(s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = '';\n          peg$savedPos = s0;\n          s1 = peg$f12();\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCellSpan() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s2 = peg$c12;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseInteger();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 120) {\n          s6 = peg$c13;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parse_();\n          s8 = peg$parseInteger();\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 93) {\n              s10 = peg$c14;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e15); }\n            }\n            if (s10 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f13(s4, s8);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s2 = peg$c12;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse_();\n        s4 = peg$parseInteger();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s6 = peg$c14;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f14(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLinkDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 4) === peg$c15) {\n      s2 = peg$c15;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseNodeRef();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseArrow();\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse__();\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parseNodeRef();\n                if (s8 !== peg$FAILED) {\n                  s9 = [];\n                  s10 = peg$currPos;\n                  s11 = peg$parse_();\n                  if (input.charCodeAt(peg$currPos) === 64) {\n                    s12 = peg$c16;\n                    peg$currPos++;\n                  } else {\n                    s12 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                  }\n                  if (s12 !== peg$FAILED) {\n                    s13 = peg$parseAnnotation();\n                    if (s13 !== peg$FAILED) {\n                      s11 = [s11, s12, s13];\n                      s10 = s11;\n                    } else {\n                      peg$currPos = s10;\n                      s10 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s10;\n                    s10 = peg$FAILED;\n                  }\n                  while (s10 !== peg$FAILED) {\n                    s9.push(s10);\n                    s10 = peg$currPos;\n                    s11 = peg$parse_();\n                    if (input.charCodeAt(peg$currPos) === 64) {\n                      s12 = peg$c16;\n                      peg$currPos++;\n                    } else {\n                      s12 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                    }\n                    if (s12 !== peg$FAILED) {\n                      s13 = peg$parseAnnotation();\n                      if (s13 !== peg$FAILED) {\n                        s11 = [s11, s12, s13];\n                        s10 = s11;\n                      } else {\n                        peg$currPos = s10;\n                        s10 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s10;\n                      s10 = peg$FAILED;\n                    }\n                  }\n                  s10 = peg$currPos;\n                  s11 = peg$parse_();\n                  s12 = peg$parseQuotedString();\n                  if (s12 !== peg$FAILED) {\n                    s11 = [s11, s12];\n                    s10 = s11;\n                  } else {\n                    peg$currPos = s10;\n                    s10 = peg$FAILED;\n                  }\n                  if (s10 === peg$FAILED) {\n                    s10 = null;\n                  }\n                  s11 = [];\n                  s12 = peg$currPos;\n                  s13 = peg$parse_();\n                  if (input.charCodeAt(peg$currPos) === 64) {\n                    s14 = peg$c16;\n                    peg$currPos++;\n                  } else {\n                    s14 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                  }\n                  if (s14 !== peg$FAILED) {\n                    s15 = peg$parseAnnotation();\n                    if (s15 !== peg$FAILED) {\n                      s13 = [s13, s14, s15];\n                      s12 = s13;\n                    } else {\n                      peg$currPos = s12;\n                      s12 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s12;\n                    s12 = peg$FAILED;\n                  }\n                  while (s12 !== peg$FAILED) {\n                    s11.push(s12);\n                    s12 = peg$currPos;\n                    s13 = peg$parse_();\n                    if (input.charCodeAt(peg$currPos) === 64) {\n                      s14 = peg$c16;\n                      peg$currPos++;\n                    } else {\n                      s14 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                    }\n                    if (s14 !== peg$FAILED) {\n                      s15 = peg$parseAnnotation();\n                      if (s15 !== peg$FAILED) {\n                        s13 = [s13, s14, s15];\n                        s12 = s13;\n                      } else {\n                        peg$currPos = s12;\n                        s12 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s12;\n                      s12 = peg$FAILED;\n                    }\n                  }\n                  s12 = peg$currPos;\n                  s13 = peg$parse_();\n                  s14 = peg$parsePropBlock();\n                  if (s14 !== peg$FAILED) {\n                    s13 = [s13, s14];\n                    s12 = s13;\n                  } else {\n                    peg$currPos = s12;\n                    s12 = peg$FAILED;\n                  }\n                  if (s12 === peg$FAILED) {\n                    s12 = null;\n                  }\n                  s13 = peg$parse_();\n                  s14 = peg$parseNL();\n                  if (s14 === peg$FAILED) {\n                    s14 = peg$currPos;\n                    peg$silentFails++;\n                    if (input.length > peg$currPos) {\n                      s15 = input.charAt(peg$currPos);\n                      peg$currPos++;\n                    } else {\n                      s15 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                    }\n                    peg$silentFails--;\n                    if (s15 === peg$FAILED) {\n                      s14 = undefined;\n                    } else {\n                      peg$currPos = s14;\n                      s14 = peg$FAILED;\n                    }\n                  }\n                  if (s14 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f15(s4, s6, s8, s9, s10, s11, s12);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnnotation() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c17) {\n      s1 = peg$c17;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseAnimValue();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f16(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseRouteWord();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s3 = peg$c18;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e20); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseWallPair();\n          if (s4 !== peg$FAILED) {\n            s3 = [s3, s4];\n            s2 = s3;\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n        if (s2 === peg$FAILED) {\n          s2 = null;\n        }\n        peg$savedPos = s0;\n        s0 = peg$f17(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseWallPair();\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f18(s1);\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnimValue() {\n    var s0;\n\n    if (input.substr(peg$currPos, 5) === peg$c19) {\n      s0 = peg$c19;\n      peg$currPos += 5;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 8) === peg$c20) {\n        s0 = peg$c20;\n        peg$currPos += 8;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c21) {\n          s0 = peg$c21;\n          peg$currPos += 4;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e23); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 5) === peg$c22) {\n            s0 = peg$c22;\n            peg$currPos += 5;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e24); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c23) {\n              s0 = peg$c23;\n              peg$currPos += 4;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e25); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 5) === peg$c24) {\n                s0 = peg$c24;\n                peg$currPos += 5;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e26); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 6) === peg$c25) {\n                  s0 = peg$c25;\n                  peg$currPos += 6;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e27); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 4) === peg$c26) {\n                    s0 = peg$c26;\n                    peg$currPos += 4;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e28); }\n                  }\n                  if (s0 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 10) === peg$c27) {\n                      s0 = peg$c27;\n                      peg$currPos += 10;\n                    } else {\n                      s0 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n                    }\n                    if (s0 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 4) === peg$c28) {\n                        s0 = peg$c28;\n                        peg$currPos += 4;\n                      } else {\n                        s0 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e30); }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRouteAnnotation() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parseRouteWord();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c18;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseWallPair();\n        if (s4 !== peg$FAILED) {\n          s3 = [s3, s4];\n          s2 = s3;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f19(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWallPair();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f20(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRouteWord() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 8) === peg$c29) {\n      s1 = peg$c29;\n      peg$currPos += 8;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f21();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 10) === peg$c30) {\n        s1 = peg$c30;\n        peg$currPos += 10;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f22();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 6) === peg$c31) {\n          s1 = peg$c31;\n          peg$currPos += 6;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f23();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 8) === peg$c32) {\n            s1 = peg$c32;\n            peg$currPos += 8;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e34); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f24();\n          }\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWallPair() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseWall();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseWall();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f25(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWall();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f26(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseWall() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = input.charAt(peg$currPos);\n    if (peg$r1.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f27(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parsePropBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 123) {\n      s1 = peg$c33;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e36); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parsePropEntry();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s7 = peg$c34;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e37); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parsePropEntry();\n          if (s9 !== peg$FAILED) {\n            s6 = [s6, s7, s8, s9];\n            s5 = s6;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c34;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e37); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parsePropEntry();\n            if (s9 !== peg$FAILED) {\n              s6 = [s6, s7, s8, s9];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        }\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 125) {\n          s6 = peg$c35;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e38); }\n        }\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f28(s3, s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropEntry() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdentifier();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c18;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parsePropValue();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f29(s1, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropValue() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r2.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s5 = peg$c36;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e40); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = input.charAt(peg$currPos);\n        if (peg$r2.test(s7)) {\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n        if (s7 !== peg$FAILED) {\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = input.charAt(peg$currPos);\n            if (peg$r2.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e39); }\n            }\n          }\n        } else {\n          s6 = peg$FAILED;\n        }\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f30(s1);\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseQuotedString();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseIdentifier();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseArrow() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c37) {\n      s1 = peg$c37;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f31();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 5) === peg$c38) {\n        s1 = peg$c38;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f32();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 5) === peg$c39) {\n          s1 = peg$c39;\n          peg$currPos += 5;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e43); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f33();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 4) === peg$c40) {\n            s1 = peg$c40;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e44); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f34();\n          }\n          s0 = s1;\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.substr(peg$currPos, 4) === peg$c41) {\n              s1 = peg$c41;\n              peg$currPos += 4;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e45); }\n            }\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$f35();\n            }\n            s0 = s1;\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 4) === peg$c42) {\n                s1 = peg$c42;\n                peg$currPos += 4;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e46); }\n              }\n              if (s1 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s1 = peg$f36();\n              }\n              s0 = s1;\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 4) === peg$c43) {\n                  s1 = peg$c43;\n                  peg$currPos += 4;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e47); }\n                }\n                if (s1 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s1 = peg$f37();\n                }\n                s0 = s1;\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.substr(peg$currPos, 5) === peg$c44) {\n                    s1 = peg$c44;\n                    peg$currPos += 5;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e48); }\n                  }\n                  if (s1 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s1 = peg$f38();\n                  }\n                  s0 = s1;\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    if (input.substr(peg$currPos, 4) === peg$c45) {\n                      s1 = peg$c45;\n                      peg$currPos += 4;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e49); }\n                    }\n                    if (s1 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$f39();\n                    }\n                    s0 = s1;\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      if (input.substr(peg$currPos, 4) === peg$c46) {\n                        s1 = peg$c46;\n                        peg$currPos += 4;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e50); }\n                      }\n                      if (s1 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s1 = peg$f40();\n                      }\n                      s0 = s1;\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        if (input.substr(peg$currPos, 3) === peg$c47) {\n                          s1 = peg$c47;\n                          peg$currPos += 3;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e51); }\n                        }\n                        if (s1 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s1 = peg$f41();\n                        }\n                        s0 = s1;\n                        if (s0 === peg$FAILED) {\n                          s0 = peg$currPos;\n                          if (input.substr(peg$currPos, 4) === peg$c48) {\n                            s1 = peg$c48;\n                            peg$currPos += 4;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e52); }\n                          }\n                          if (s1 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s1 = peg$f42();\n                          }\n                          s0 = s1;\n                          if (s0 === peg$FAILED) {\n                            s0 = peg$currPos;\n                            if (input.substr(peg$currPos, 3) === peg$c49) {\n                              s1 = peg$c49;\n                              peg$currPos += 3;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e53); }\n                            }\n                            if (s1 !== peg$FAILED) {\n                              peg$savedPos = s0;\n                              s1 = peg$f43();\n                            }\n                            s0 = s1;\n                            if (s0 === peg$FAILED) {\n                              s0 = peg$currPos;\n                              if (input.substr(peg$currPos, 3) === peg$c50) {\n                                s1 = peg$c50;\n                                peg$currPos += 3;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e54); }\n                              }\n                              if (s1 !== peg$FAILED) {\n                                peg$savedPos = s0;\n                                s1 = peg$f44();\n                              }\n                              s0 = s1;\n                              if (s0 === peg$FAILED) {\n                                s0 = peg$currPos;\n                                if (input.substr(peg$currPos, 3) === peg$c51) {\n                                  s1 = peg$c51;\n                                  peg$currPos += 3;\n                                } else {\n                                  s1 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e55); }\n                                }\n                                if (s1 !== peg$FAILED) {\n                                  peg$savedPos = s0;\n                                  s1 = peg$f45();\n                                }\n                                s0 = s1;\n                                if (s0 === peg$FAILED) {\n                                  s0 = peg$currPos;\n                                  if (input.substr(peg$currPos, 3) === peg$c52) {\n                                    s1 = peg$c52;\n                                    peg$currPos += 3;\n                                  } else {\n                                    s1 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e56); }\n                                  }\n                                  if (s1 !== peg$FAILED) {\n                                    peg$savedPos = s0;\n                                    s1 = peg$f46();\n                                  }\n                                  s0 = s1;\n                                  if (s0 === peg$FAILED) {\n                                    s0 = peg$currPos;\n                                    if (input.substr(peg$currPos, 3) === peg$c53) {\n                                      s1 = peg$c53;\n                                      peg$currPos += 3;\n                                    } else {\n                                      s1 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e57); }\n                                    }\n                                    if (s1 !== peg$FAILED) {\n                                      peg$savedPos = s0;\n                                      s1 = peg$f47();\n                                    }\n                                    s0 = s1;\n                                    if (s0 === peg$FAILED) {\n                                      s0 = peg$currPos;\n                                      if (input.substr(peg$currPos, 3) === peg$c0) {\n                                        s1 = peg$c0;\n                                        peg$currPos += 3;\n                                      } else {\n                                        s1 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                                      }\n                                      if (s1 !== peg$FAILED) {\n                                        peg$savedPos = s0;\n                                        s1 = peg$f48();\n                                      }\n                                      s0 = s1;\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeRef() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdentifier();\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s2 = peg$c12;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseSignedInteger();\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s4 = peg$c14;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f49(s1, s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseIdentifier();\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 46) {\n          s2 = peg$c36;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e40); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseIdentifier();\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f50(s1, s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdentifier() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e58); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r4.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e59); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r4.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e59); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCellContent() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$currPos;\n    s3 = peg$currPos;\n    peg$silentFails++;\n    s4 = peg$currPos;\n    s5 = peg$parse_();\n    if (input.substr(peg$currPos, 3) === peg$c11) {\n      s6 = peg$c11;\n      peg$currPos += 3;\n    } else {\n      s6 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s6 !== peg$FAILED) {\n      s7 = peg$parse_();\n      s8 = peg$parseNL();\n      if (s8 === peg$FAILED) {\n        s8 = peg$currPos;\n        peg$silentFails++;\n        if (input.length > peg$currPos) {\n          s9 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s9 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n        peg$silentFails--;\n        if (s9 === peg$FAILED) {\n          s8 = undefined;\n        } else {\n          peg$currPos = s8;\n          s8 = peg$FAILED;\n        }\n      }\n      if (s8 !== peg$FAILED) {\n        s5 = [s5, s6, s7, s8];\n        s4 = s5;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s4;\n      s4 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s4 === peg$FAILED) {\n      s3 = undefined;\n    } else {\n      peg$currPos = s3;\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      s5 = [];\n      s6 = input.charAt(peg$currPos);\n      if (peg$r0.test(s6)) {\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      while (s6 !== peg$FAILED) {\n        s5.push(s6);\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n      s4 = input.substring(s4, peg$currPos);\n      s5 = peg$parseNL();\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s2;\n        s2 = peg$f51(s4);\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      peg$silentFails++;\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      if (input.substr(peg$currPos, 3) === peg$c11) {\n        s6 = peg$c11;\n        peg$currPos += 3;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = peg$parse_();\n        s8 = peg$parseNL();\n        if (s8 === peg$FAILED) {\n          s8 = peg$currPos;\n          peg$silentFails++;\n          if (input.length > peg$currPos) {\n            s9 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e18); }\n          }\n          peg$silentFails--;\n          if (s9 === peg$FAILED) {\n            s8 = undefined;\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n        }\n        if (s8 !== peg$FAILED) {\n          s5 = [s5, s6, s7, s8];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s4 === peg$FAILED) {\n        s3 = undefined;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = input.charAt(peg$currPos);\n          if (peg$r0.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n        }\n        s4 = input.substring(s4, peg$currPos);\n        s5 = peg$parseNL();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s2;\n          s2 = peg$f51(s4);\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f52(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseQuotedString() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c54;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e60); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r5.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e61); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r5.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e61); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c54;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e60); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f53(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInteger() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r2.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r2.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f54(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseSignedInteger() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = input.charAt(peg$currPos);\n    if (peg$r6.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e62); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r2.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f55(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseComment();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseNL();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f56();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c55) {\n      s1 = peg$c55;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e63); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r7.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e64); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r7.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e64); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r7.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e64); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r7.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e64); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c56) {\n      s0 = peg$c56;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e65); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.charAt(peg$currPos);\n      if (peg$r8.test(s0)) {\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e66); }\n      }\n    }\n\n    return s0;\n  }\n\n\n  reset();\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type {\n  DiagramModule,\n  LayoutResult,\n  LayoutOptions,\n  DiagramKind,\n} from '../../../contracts/index.js';\nimport type { PosterNote, NotePosition } from './ir.js';\nimport type { PosterDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport type { CrossLink } from '../../../contracts/crosslink.js';\nimport { layoutPoster } from './layout.js';\nimport { getModule } from '../../../frontend/registry.js';\nimport { matchMermaid } from '../../../frontend/detect.js';\nimport * as parser from './parser.js';\n\nexport type {\n  PosterDocument,\n  PosterCell,\n  PosterGrid,\n  PosterScaleMode,\n  CellContent,\n  DiagramCell,\n  TextCell,\n  StatCell,\n} from './ir.js';\n\nexport const poster: DiagramModule<PosterDocument> = {\n  parseMermaid(input: string): PosterDocument {\n    const raw = parser.parse(input) as any;\n    const cells = raw.cells.map((c: any) => {\n      const { rawContent, caption, notes } = extractCellAnnotations(c.rawContent as string);\n      const content = parseCell({ ...c, rawContent });\n      return {\n        id: c.id,\n        title: c.title,\n        content,\n        colSpan: c.span?.colSpan,\n        rowSpan: c.span?.rowSpan,\n        theme: c.theme,\n        ...(caption ? { caption } : {}),\n        ...(notes.length > 0 ? { notes } : {}),\n      };\n    });\n\n    const explicitLinks: CrossLink[] = raw.links ?? [];\n\n    const allLinks = [...explicitLinks];\n\n    return {\n      version: raw.version ?? '1.0',\n      metadata: { ...raw.metadata },\n      grid: raw.grid,\n      cells,\n      ...(allLinks.length > 0 ? { links: allLinks } : {}),\n    };\n  },\n\n  parseYaml(input: string): PosterDocument {\n    return JSON.parse(input) as PosterDocument;\n  },\n\n  layout(ir: PosterDocument, theme: ResolvedTheme, options?: LayoutOptions): LayoutResult {\n    return layoutPoster(ir, theme);\n  },\n};\n\nconst DEFAULT_HEADERS: Partial<Record<DiagramKind, string>> = {\n  block: 'block-beta\\n',\n  packet: 'packet-beta\\n',\n  architecture: 'architecture-beta\\n',\n  flowchart: 'flowchart TD\\n',\n  sequence: 'sequenceDiagram\\n',\n  state: 'stateDiagram-v2\\n',\n  class: 'classDiagram\\n',\n  er: 'erDiagram\\n',\n  gitgraph: 'gitGraph\\n',\n  gantt: 'gantt\\n',\n  journey: 'journey\\n',\n  pie: 'pie\\n',\n  quadrant: 'quadrantChart\\n',\n  requirement: 'requirementDiagram\\n',\n  c4: 'C4Context\\n',\n  sankey: 'sankey-beta\\n',\n  timeline: 'timeline\\n',\n  mindmap: 'mindmap\\n',\n  kanban: 'kanban\\n',\n  xychart: 'xychart-beta\\n',\n  radar: 'radar-beta\\n',\n  tree: 'tree\\n',\n  plan: 'plan\\n',\n  list: 'list\\n',\n  fishbone: 'fishbone\\n',\n  pyramid: 'pyramid\\n',\n  loop: 'loop\\n',\n  topology: 'topology\\n',\n  bplustree: 'bplustree\\n',\n  'b+tree': 'bplustree\\n',\n  btree: 'btree\\n',\n  merkletree: 'merkletree\\n',\n  lsmtree: 'lsmtree\\n',\n  behaviortree: 'behaviortree\\n',\n  quadtree: 'quadtree\\n',\n  treap: 'treap\\n',\n  '234tree': '234tree\\n',\n  '2-3-4tree': '234tree\\n',\n};\n\nfunction canonicalDiagramKind(rawKind: string): DiagramKind | undefined {\n  if (!rawKind) return undefined;\n  const k = rawKind.trim();\n  const lower = k.toLowerCase();\n\n  // Exact canonical match first\n  if (getModule(lower as DiagramKind)) return lower as DiagramKind;\n\n  // Direct match using detect's matchMermaid (handles C4Context, stateDiagram, packet, block, etc.)\n  const matched = matchMermaid(k) ?? matchMermaid(lower);\n  if (matched && getModule(matched)) return matched;\n\n  // Specific common aliases\n  if (lower === 'flow') return 'flowchart';\n  if (lower.startsWith('block')) return 'block';\n  if (lower.startsWith('packet')) return 'packet';\n  if (lower.startsWith('arch')) return 'architecture';\n  if (lower.startsWith('seq')) return 'sequence';\n  if (lower.startsWith('state')) return 'state';\n  if (lower.startsWith('class')) return 'class';\n  if (lower.startsWith('er')) return 'er';\n  if (lower.startsWith('git')) return 'gitgraph';\n  if (lower.startsWith('quadtree')) return 'quadtree';\n  if (lower.startsWith('quad')) return 'quadrant';\n  if (lower.startsWith('req')) return 'requirement';\n  if (lower.startsWith('sankey')) return 'sankey';\n  if (lower.startsWith('radar')) return 'radar';\n  if (lower.startsWith('xychart')) return 'xychart';\n  if (lower.startsWith('mind')) return 'mindmap';\n  if (lower.startsWith('time')) return 'timeline';\n  if (lower.startsWith('bplus') || lower === 'b+tree') return 'bplustree';\n  if (lower.startsWith('btree')) return 'btree';\n  if (lower.startsWith('merkle')) return 'merkletree';\n  if (lower.startsWith('lsm')) return 'lsmtree';\n  if (lower.startsWith('behavior')) return 'behaviortree';\n  if (lower.startsWith('treap')) return 'treap';\n  if (lower.startsWith('234') || lower.startsWith('2-3-4')) return '234tree';\n  if (lower.startsWith('kan')) return 'kanban';\n\n  return undefined;\n}\n\nfunction ensureDiagramHeader(kind: DiagramKind, rawContent: string): string {\n  const trimmed = rawContent.trimStart();\n  if (!trimmed) return rawContent;\n\n  // If the body already starts with a recognized keyword that matches this kind, keep as is\n  const detected = matchMermaid(trimmed);\n  if (detected === kind) return rawContent;\n\n  const defaultHeader = DEFAULT_HEADERS[kind];\n  if (defaultHeader) {\n    return defaultHeader + rawContent;\n  }\n\n  // Data structure types (array, avl, queue, stack, etc.)\n  if (!trimmed.startsWith(kind)) {\n    return `${kind} ${rawContent}`;\n  }\n\n  return rawContent;\n}\n\nfunction parseCell(raw: any): import('./ir.js').CellContent {\n  const kind: string | null | undefined = raw.kind;\n  const inferredKind = inferCellKind(raw.rawContent);\n  let rawKind = (kind || inferredKind || '').trim();\n\n  // If inferred as text and no explicit :: kind, check if an explicit id matches a diagram kind (e.g. `cell packet-beta` or `cell flow`)\n  if ((!rawKind || rawKind === 'text') && !kind && raw.explicitId) {\n    const fromId = canonicalDiagramKind(raw.explicitId);\n    if (fromId) {\n      rawKind = fromId;\n    }\n  }\n\n  // Poster-specific primitives (no diagram module needed)\n  if (rawKind === 'stat') {\n    const [value, label] = raw.rawContent.split('|').map((s: string) => s.trim());\n    return { kind: 'stat', value: value ?? '', label };\n  }\n  if (rawKind === 'text') {\n    return { kind: 'text', text: raw.rawContent.trim() };\n  }\n\n  // Normalise aliases / variants to canonical DiagramKind\n  const diagramKind = canonicalDiagramKind(rawKind);\n\n  const module = diagramKind ? getModule(diagramKind) : undefined;\n  if (!module || !diagramKind) {\n    // Unknown diagram kind \u2014 degrade to text\n    return { kind: 'text', text: raw.rawContent.trim() };\n  }\n\n  // Ensure appropriate header keyword if missing when explicit :: kind is declared\n  const preparedContent = ensureDiagramHeader(diagramKind, raw.rawContent);\n\n  // Ensure trailing newline \u2014 sub-parsers (PEG grammars) require it\n  const content = preparedContent.endsWith('\\n') ? preparedContent : preparedContent + '\\n';\n  return { kind: 'diagram', diagramKind, doc: module.parseMermaid(content) };\n}\n\nfunction inferCellKind(rawContent: string): string | null {\n  const trimmed = rawContent.trimStart();\n  if (!trimmed.trim()) return 'text';\n\n  const diagramKind = matchMermaid(trimmed);\n  if (diagramKind) return diagramKind;\n\n  if (trimmed.includes('|')) return 'stat';\n  return 'text';\n}\n\n// \u2500\u2500\u2500 Cell Annotation Extraction \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst CAPTION_RE = /^[ \\t]*caption[ \\t]+\"([^\"]*)\"[ \\t]*$/;\nconst NOTE_RE =\n  /^[ \\t]*note[ \\t]+\"([^\"]*)\"(?:[ \\t]+at[ \\t]+(top-left|top-right|bottom-left|bottom-right|center))?[ \\t]*$/;\n\n/**\n * Strip `caption \"...\"` and `note \"...\" [at position]` directives from\n * a cell's raw content and return them as structured fields.\n */\nfunction extractCellAnnotations(rawContent: string): {\n  rawContent: string;\n  caption: string | undefined;\n  notes: PosterNote[];\n} {\n  const inputLines = rawContent.split('\\n');\n  const outLines: string[] = [];\n  let caption: string | undefined;\n  const notes: PosterNote[] = [];\n\n  for (const line of inputLines) {\n    const cm = line.match(CAPTION_RE);\n    if (cm) {\n      caption = cm[1];\n      continue;\n    }\n    const nm = line.match(NOTE_RE);\n    if (nm) {\n      notes.push({ text: nm[1]!, ...(nm[2] ? { position: nm[2] as NotePosition } : {}) });\n      continue;\n    }\n    outLines.push(line);\n  }\n\n  return { rawContent: outLines.join('\\n'), caption, notes };\n}\n", "/**\n * @file diagrams/pie/layout.ts \u2014 Proportional pie chart.\n *\n * Sectors sized by value share, coloured from the shared categorical hue\n * cycle, with a value/percentage legend to the right. Reads only shared theme\n * tokens; geometry rounds half-up for deterministic output.\n */\n\nimport type { PieDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\nimport { readableText } from '../../../theme/contrast.js';\n\nfunction fmtNum(n: number): string {\n  return Number.isInteger(n) ? String(n) : String(Math.round(n * 100) / 100);\n}\n\nexport function layoutPie(ir: PieDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const titleH = ir.metadata.title ? typography.titleFontSize + 20 : 0;\n  const slices = ir.slices;\n  const total = slices.reduce((s, x) => s + x.value, 0) || 1;\n\n  const R = 110;\n  const cx = margin + R;\n  const cy = margin + titleH + R;\n\n  // \u2500\u2500 Legend measurement \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const legendFont = typography.smallFontSize;\n  const legendLabels = slices.map((s) => (ir.showData ? `${s.label} [${s.value}]` : s.label));\n  const legendTextW = legendLabels.reduce(\n    (m, l) => Math.max(m, measureText(l, legendFont).width),\n    0,\n  );\n  const swatch = 10;\n  const legendGap = 8;\n  const legendX = cx + R + 36;\n  const rowH = 20;\n  const legendTop = cy - (slices.length * rowH) / 2;\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Title \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (ir.metadata.title) {\n    const totalWEst = legendX + legendTextW + swatch + legendGap + margin;\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        rhuInt(totalWEst / 2),\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Slices \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let a0 = -Math.PI / 2; // start at top\n  slices.forEach((s, i) => {\n    const frac = s.value / total;\n    const a1 = a0 + frac * Math.PI * 2;\n    const color = categoricalHue(i, theme);\n\n    if (slices.length === 1) {\n      elements.push(p.circle({ x: cx, y: cy }, R, color, palette.background, 1));\n    } else {\n      const x0 = rhu(cx + R * Math.cos(a0)),\n        y0 = rhu(cy + R * Math.sin(a0));\n      const x1 = rhu(cx + R * Math.cos(a1)),\n        y1 = rhu(cy + R * Math.sin(a1));\n      const large = frac > 0.5 ? 1 : 0;\n      const d = `M ${rhu(cx)} ${rhu(cy)} L ${x0} ${y0} A ${R} ${R} 0 ${large} 1 ${x1} ${y1} Z`;\n      elements.push(p.path(d, palette.background, 1, { fill: color }));\n    }\n\n    // Percentage label inside the slice (skip slivers).\n    const pct = frac * 100;\n    if (pct >= 4) {\n      const am = (a0 + a1) / 2;\n      const lr = R * 0.62;\n      elements.push(\n        p.text(\n          `${pct.toFixed(0)}%`,\n          rhu(cx + lr * Math.cos(am)),\n          rhu(cy + lr * Math.sin(am) + typography.smallFontSize * 0.35),\n          typography.smallFontSize,\n          readableText(color, theme),\n          { weight: 'bold', anchor: 'middle' },\n        ),\n      );\n    }\n    a0 = a1;\n  });\n\n  // \u2500\u2500 Legend \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  slices.forEach((s, i) => {\n    const ly = legendTop + i * rowH;\n    const swatchColor = categoricalHue(i, theme);\n    elements.push(\n      p.rect(\n        { x: legendX, y: ly, width: swatch, height: swatch },\n        swatchColor,\n        swatchColor,\n        0,\n        { rx: 2 },\n      ),\n    );\n    elements.push(\n      p.text(\n        legendLabels[i]!,\n        legendX + swatch + legendGap,\n        ly + swatch - 2,\n        legendFont,\n        palette.text,\n      ),\n    );\n  });\n\n  const totalW = rhuInt(legendX + legendTextW + swatch + legendGap + margin);\n  const totalH = rhuInt(Math.max(cy + R, legendTop + slices.length * rowH) + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"---\";\n  var peg$c1 = \"pie\";\n  var peg$c2 = \"showdata\";\n  var peg$c3 = \"title\";\n  var peg$c4 = \":\";\n  var peg$c5 = \"\\r\";\n  var peg$c6 = \"\\n\";\n  var peg$c7 = \"\\\"\";\n  var peg$c8 = \"-\";\n  var peg$c9 = \".\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"---\", false);\n  var peg$e1 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e2 = peg$literalExpectation(\"pie\", true);\n  var peg$e3 = peg$literalExpectation(\"showData\", true);\n  var peg$e4 = peg$literalExpectation(\"title\", true);\n  var peg$e5 = peg$literalExpectation(\":\", false);\n  var peg$e6 = peg$literalExpectation(\"\\r\", false);\n  var peg$e7 = peg$literalExpectation(\"\\n\", false);\n  var peg$e8 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e9 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e10 = peg$literalExpectation(\"-\", false);\n  var peg$e11 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e12 = peg$literalExpectation(\".\", false);\n  var peg$e13 = peg$anyExpectation();\n  var peg$e14 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, head, rows) {\n      const slices = rows.filter(Boolean);\n      return {\n        version: '1.0',\n        metadata: { ...(fm || {}), ...(head.title ? { title: head.title } : {}) },\n        slices,\n        ...(head.showData ? { showData: true } : {}),\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(sd, r) { return r; };\n  var peg$f4 = function(sd, t) {\n      return { showData: !!sd, title: t ? t.trim() : null };\n    };\n  var peg$f5 = function(label, value) { return { label, value }; };\n  var peg$f6 = function() { return null; };\n  var peg$f7 = function(s) { return s; };\n  var peg$f8 = function(n) { return parseFloat(n); };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = peg$parseHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = [];\n      s5 = peg$parseRow();\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = peg$parseRow();\n      }\n      s5 = peg$parse_();\n      peg$savedPos = s0;\n      s0 = peg$f0(s1, s3, s4);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s7 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c0) {\n            s7 = peg$c0;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s4 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHeader() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = input.substr(peg$currPos, 3);\n    if (s1.toLowerCase() === peg$c1) {\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      s4 = input.substr(peg$currPos, 8);\n      if (s4.toLowerCase() === peg$c2) {\n        peg$currPos += 8;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      s5 = input.substr(peg$currPos, 5);\n      if (s5.toLowerCase() === peg$c3) {\n        peg$currPos += 5;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseRestOfLine();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f3(s2, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f4(s2, s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRow() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseQuoted();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c4;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseNum();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parse_();\n          s8 = peg$parseLineEnd();\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5(s2, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s2 = peg$c5;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s3 = peg$c6;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f6();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c7;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c7;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f7(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c8;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r2.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r2.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c9;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r2.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r2.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e11); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f8(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { PieDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutPie } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { PieDocument, PieSlice } from './ir.js';\n\nexport const pie: DiagramModule<PieDocument> = {\n  parseMermaid(input: string): PieDocument {\n    return parser.parse(input) as PieDocument;\n  },\n\n  parseYaml(input: string): PieDocument {\n    return JSON.parse(input) as PieDocument;\n  },\n\n  layout(ir: PieDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutPie(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/xychart/layout.ts \u2014 Cartesian bar + line chart.\n *\n * Categorical x-axis, numeric y-axis with gridlines and ticks. Bar series are\n * grouped per category; line series are drawn as polylines with dots on top.\n * Series colours come from the shared categorical hue cycle.\n */\n\nimport type { XYChartDocument, XYSeries } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\n/** Pick ~5 \"nice\" tick values spanning [min, max]. */\nfunction niceTicks(min: number, max: number): number[] {\n  const span = max - min || 1;\n  const rawStep = span / 5;\n  const mag = Math.pow(10, Math.floor(Math.log10(rawStep)));\n  const norm = rawStep / mag;\n  const step = (norm >= 5 ? 5 : norm >= 2 ? 2 : 1) * mag;\n  const ticks: number[] = [];\n  for (let v = Math.ceil(min / step) * step; v <= max + 1e-9; v += step)\n    ticks.push(Math.round(v * 1e6) / 1e6);\n  return ticks;\n}\n\nfunction fmtTick(n: number): string {\n  if (Math.abs(n) >= 1000) return `${n / 1000}k`;\n  return String(n);\n}\n\nexport function layoutXYChart(ir: XYChartDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const cats = ir.categories;\n  const nCats = Math.max(cats.length, 1);\n  const series = ir.series;\n  const barSeries = series.filter((s) => s.kind === 'bar');\n  const lineSeries = series.filter((s) => s.kind === 'line');\n\n  // \u2500\u2500 Y range \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allVals = series.flatMap((s) => s.values as number[]);\n  const dataMin = allVals.length ? Math.min(...allVals) : 0;\n  const dataMax = allVals.length ? Math.max(...allVals) : 1;\n  const yMin = ir.yMin ?? Math.min(0, dataMin);\n  const yMax = ir.yMax ?? (dataMax > 0 ? dataMax * 1.1 : 1);\n  const ticks = niceTicks(yMin, yMax);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 18 : 0;\n  const tickFont = typography.smallFontSize;\n  const tickW = Math.max(...ticks.map((t) => measureText(fmtTick(t), tickFont).width), 0);\n  const yLabelW = ir.yLabel ? typography.baseFontSize + 6 : 0;\n\n  const plotLeft = margin + yLabelW + tickW + 10;\n  const plotTop = margin + titleH;\n  const plotH = 360;\n  const plotBottom = plotTop + plotH;\n  const bandW = 78;\n  const plotW = bandW * nCats;\n  const plotRight = plotLeft + plotW;\n\n  const yToPx = (v: number): number => rhu(plotBottom - ((v - yMin) / (yMax - yMin || 1)) * plotH);\n  const catX = (i: number): number => plotLeft + (i + 0.5) * bandW;\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Gridlines + y ticks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const t of ticks) {\n    const y = yToPx(t);\n    elements.push(\n      p.path(`M ${plotLeft} ${y} L ${plotRight} ${y}`, palette.border, 1, { opacity: 0.5 }),\n    );\n    elements.push(\n      p.text(fmtTick(t), plotLeft - 8, y + tickFont * 0.35, tickFont, palette.textMuted, {\n        anchor: 'end',\n      }),\n    );\n  }\n\n  // \u2500\u2500 Axes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(p.path(`M ${plotLeft} ${plotTop} L ${plotLeft} ${plotBottom}`, palette.text, 1.5));\n  elements.push(\n    p.path(`M ${plotLeft} ${plotBottom} L ${plotRight} ${plotBottom}`, palette.text, 1.5),\n  );\n\n  if (ir.yLabel) {\n    const ly = rhuInt(plotTop + plotH / 2);\n    const lx = margin + typography.baseFontSize;\n    elements.push(\n      p.text(ir.yLabel, lx, ly, typography.baseFontSize, palette.textMuted, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n    // rotate via group transform\n    const last = elements.pop()!;\n    elements.push(p.group([last], { transform: `rotate(-90 ${lx} ${ly})` }));\n  }\n\n  // \u2500\u2500 Bars (grouped per category) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const nBars = Math.max(barSeries.length, 1);\n  const groupW = bandW * 0.62;\n  const barW = groupW / nBars;\n  barSeries.forEach((s, si) => {\n    const color = categoricalHue(si, theme);\n    (s.values as number[]).forEach((v, i) => {\n      const x = catX(i) - groupW / 2 + si * barW;\n      const y = yToPx(v);\n      const h = yToPx(yMin) - y;\n      if (h > 0)\n        elements.push(\n          p.rect({ x: rhu(x), y, width: rhu(barW - 2), height: rhu(h) }, color, color, 0, {\n            rx: 2,\n          }),\n        );\n    });\n  });\n\n  // \u2500\u2500 Lines (drawn on top) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  lineSeries.forEach((s, si) => {\n    const color = categoricalHue(barSeries.length + si, theme);\n    const pts = (s.values as number[]).map((v, i) => `${rhu(catX(i))} ${yToPx(v)}`);\n    if (pts.length) {\n      elements.push(p.path(`M ${pts.join(' L ')}`, color, 2.5));\n      (s.values as number[]).forEach((v, i) => {\n        elements.push(\n          p.circle({ x: rhu(catX(i)), y: yToPx(v) }, 4, color, palette.background, 1.5),\n        );\n      });\n    }\n  });\n\n  // \u2500\u2500 X category labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  cats.forEach((c, i) => {\n    elements.push(\n      p.text(c, rhu(catX(i)), plotBottom + tickFont + 8, tickFont, palette.textMuted, {\n        anchor: 'middle',\n      }),\n    );\n  });\n\n  const totalW = rhuInt(plotRight + margin);\n  const totalH = rhuInt(plotBottom + tickFont + 16 + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"xychart-beta\";\n  var peg$c1 = \"horizontal\";\n  var peg$c2 = \"vertical\";\n  var peg$c3 = \"---\";\n  var peg$c4 = \"title\";\n  var peg$c5 = \"x-axis\";\n  var peg$c6 = \"[\";\n  var peg$c7 = \",\";\n  var peg$c8 = \"]\";\n  var peg$c9 = \"y-axis\";\n  var peg$c10 = \"-->\";\n  var peg$c11 = \"bar\";\n  var peg$c12 = \"line\";\n  var peg$c13 = \"\\\"\";\n  var peg$c14 = \"-\";\n  var peg$c15 = \".\";\n  var peg$c16 = \"\\r\";\n  var peg$c17 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^,\\]\\n]/;\n  var peg$r2 = /^[^\"]/;\n  var peg$r3 = /^[0-9]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"xychart-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"horizontal\", true);\n  var peg$e2 = peg$literalExpectation(\"vertical\", true);\n  var peg$e3 = peg$literalExpectation(\"---\", false);\n  var peg$e4 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e5 = peg$literalExpectation(\"title\", true);\n  var peg$e6 = peg$literalExpectation(\"x-axis\", true);\n  var peg$e7 = peg$literalExpectation(\"[\", false);\n  var peg$e8 = peg$literalExpectation(\",\", false);\n  var peg$e9 = peg$literalExpectation(\"]\", false);\n  var peg$e10 = peg$literalExpectation(\"y-axis\", true);\n  var peg$e11 = peg$literalExpectation(\"-->\", false);\n  var peg$e12 = peg$literalExpectation(\"bar\", true);\n  var peg$e13 = peg$literalExpectation(\"line\", true);\n  var peg$e14 = peg$classExpectation([\",\", \"]\", \"\\n\"], true, false);\n  var peg$e15 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e16 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e17 = peg$literalExpectation(\"-\", false);\n  var peg$e18 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e19 = peg$literalExpectation(\".\", false);\n  var peg$e20 = peg$literalExpectation(\"\\r\", false);\n  var peg$e21 = peg$literalExpectation(\"\\n\", false);\n  var peg$e22 = peg$anyExpectation();\n  var peg$e23 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      let title;\n      let categories = [];\n      let yLabel, yMin, yMax;\n      const series = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'title') title = s.v;\n        else if (s.t === 'x')     categories = s.cats;\n        else if (s.t === 'y')   { yLabel = s.label; yMin = s.min; yMax = s.max; }\n        else if (s.t === 'series') series.push({ kind: s.kind, values: s.values });\n      }\n      return {\n        version: '1.0',\n        metadata: { ...(fm || {}), ...(title ? { title } : {}) },\n        categories,\n        ...(yLabel !== undefined ? { yLabel } : {}),\n        ...(yMin !== undefined ? { yMin } : {}),\n        ...(yMax !== undefined ? { yMax } : {}),\n        series,\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: typeof v === 'string' ? v.trim() : v }; };\n  var peg$f4 = function(first, i) { return i; };\n  var peg$f5 = function(first, rest) {\n      return { t: 'x', cats: [first, ...rest] };\n    };\n  var peg$f6 = function(q) { return q; };\n  var peg$f7 = function(label, a, b) { return { min: a, max: b }; };\n  var peg$f8 = function(label, range) {\n      return { t: 'y', label: label || undefined, min: range ? range.min : undefined, max: range ? range.max : undefined };\n    };\n  var peg$f9 = function(kind, first, n) { return n; };\n  var peg$f10 = function(kind, first, rest) {\n      return { t: 'series', kind: kind.toLowerCase(), values: [first, ...rest] };\n    };\n  var peg$f11 = function(s) { return s.trim(); };\n  var peg$f12 = function(n) { return parseFloat(n); };\n  var peg$f13 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 12);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 12;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      s6 = input.substr(peg$currPos, 10);\n      if (s6.toLowerCase() === peg$c1) {\n        peg$currPos += 10;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s6 === peg$FAILED) {\n        s6 = input.substr(peg$currPos, 8);\n        if (s6.toLowerCase() === peg$c2) {\n          peg$currPos += 8;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n      if (s6 !== peg$FAILED) {\n        s5 = [s5, s6];\n        s4 = s5;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = peg$parseStatement();\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = peg$parseStatement();\n        }\n        s7 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s6);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c3) {\n      s1 = peg$c3;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c3) {\n          s7 = peg$c3;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e4); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c3) {\n            s7 = peg$c3;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e4); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c3) {\n          s4 = peg$c3;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitle();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseXAxis();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseYAxis();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseSeries();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitle() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c4) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseQuoted();\n      if (s4 === peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseXAxis() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c5) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s4 = peg$c6;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseAxisItem();\n        if (s6 !== peg$FAILED) {\n          s7 = [];\n          s8 = peg$currPos;\n          s9 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s10 = peg$c7;\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n          if (s10 !== peg$FAILED) {\n            s11 = peg$parse_();\n            s12 = peg$parseAxisItem();\n            if (s12 !== peg$FAILED) {\n              peg$savedPos = s8;\n              s8 = peg$f4(s6, s12);\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$currPos;\n            s9 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s10 = peg$c7;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseAxisItem();\n              if (s12 !== peg$FAILED) {\n                peg$savedPos = s8;\n                s8 = peg$f4(s6, s12);\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          }\n          s8 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s9 = peg$c8;\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parse_();\n            s11 = peg$parseLineEnd();\n            if (s11 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f5(s6, s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseYAxis() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c9) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      s5 = peg$parseQuoted();\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s3;\n        s3 = peg$f6(s5);\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      s6 = peg$parseNum();\n      if (s6 !== peg$FAILED) {\n        s7 = peg$parse_();\n        if (input.substr(peg$currPos, 3) === peg$c10) {\n          s8 = peg$c10;\n          peg$currPos += 3;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parse_();\n          s10 = peg$parseNum();\n          if (s10 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f7(s3, s6, s10);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parse_();\n      s6 = peg$parseLineEnd();\n      if (s6 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s3, s4);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSeries() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c11) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 4);\n      if (s2.toLowerCase() === peg$c12) {\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s4 = peg$c6;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseNum();\n        if (s6 !== peg$FAILED) {\n          s7 = [];\n          s8 = peg$currPos;\n          s9 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s10 = peg$c7;\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n          if (s10 !== peg$FAILED) {\n            s11 = peg$parse_();\n            s12 = peg$parseNum();\n            if (s12 !== peg$FAILED) {\n              peg$savedPos = s8;\n              s8 = peg$f9(s2, s6, s12);\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$currPos;\n            s9 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s10 = peg$c7;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseNum();\n              if (s12 !== peg$FAILED) {\n                peg$savedPos = s8;\n                s8 = peg$f9(s2, s6, s12);\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n          }\n          s8 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s9 = peg$c8;\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parse_();\n            s11 = peg$parseLineEnd();\n            if (s11 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f10(s2, s6, s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAxisItem() {\n    var s0, s1, s2;\n\n    s0 = peg$parseQuoted();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = input.charAt(peg$currPos);\n      if (peg$r1.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = input.charAt(peg$currPos);\n          if (peg$r1.test(s2)) {\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c13;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c13;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f11(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c14;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r3.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r3.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c15;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r3.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r3.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e18); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f12(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c16;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c17;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c16;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c17;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f13();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c16;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c17;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { XYChartDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutXYChart } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { XYChartDocument, XYSeries, XYSeriesKind } from './ir.js';\n\nexport const xychart: DiagramModule<XYChartDocument> = {\n  parseMermaid(input: string): XYChartDocument {\n    return parser.parse(input) as XYChartDocument;\n  },\n\n  parseYaml(input: string): XYChartDocument {\n    return JSON.parse(input) as XYChartDocument;\n  },\n\n  layout(ir: XYChartDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutXYChart(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/quadrant/layout.ts \u2014 Four-quadrant scatter.\n *\n * A square plot split into four tinted quadrants with crossed axes, quadrant\n * captions, edge axis labels, and positioned points (normalized 0..1). Quadrant\n * tints come from the shared categorical hue cycle at low opacity.\n */\n\nimport type { QuadrantDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutQuadrant(ir: QuadrantDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 18 : 0;\n\n  const side = 460;\n  const axisPad = 30; // room for edge axis labels\n  const plotLeft = margin + axisPad;\n  const plotTop = margin + titleH;\n  const plotRight = plotLeft + side;\n  const plotBot = plotTop + side;\n  const midX = rhuInt((plotLeft + plotRight) / 2);\n  const midY = rhuInt((plotTop + plotBot) / 2);\n  const half = side / 2;\n\n  const px = (x: number): number => rhu(plotLeft + x * side);\n  const py = (y: number): number => rhu(plotBot - y * side);\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(\n      p.text(\n        title,\n        rhuInt((plotLeft + plotRight) / 2),\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Quadrant tints (q1 TR, q2 TL, q3 BL, q4 BR) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const quads: Array<{ x: number; y: number; hue: number }> = [\n    { x: midX, y: plotTop, hue: 0 }, // q1 top-right\n    { x: plotLeft, y: plotTop, hue: 1 }, // q2 top-left\n    { x: plotLeft, y: midY, hue: 2 }, // q3 bottom-left\n    { x: midX, y: midY, hue: 3 }, // q4 bottom-right\n  ];\n  quads.forEach((q, i) => {\n    const qColor = categoricalHue(q.hue, theme);\n    elements.push(\n      p.rect(\n        { x: q.x, y: q.y, width: half, height: half },\n        qColor,\n        qColor,\n        0,\n        { opacity: 0.12 },\n      ),\n    );\n    const label = ir.quadrants[i];\n    if (label) {\n      elements.push(\n        p.text(\n          label,\n          rhuInt(q.x + half / 2),\n          q.y + typography.baseFontSize + 12,\n          typography.baseFontSize,\n          qColor,\n          { weight: 'bold', anchor: 'middle' },\n        ),\n      );\n    }\n  });\n\n  // \u2500\u2500 Plot border + crossing axes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(\n    p.rect({ x: plotLeft, y: plotTop, width: side, height: side }, 'none', palette.border, 1.5),\n  );\n  elements.push(\n    p.path(`M ${midX} ${plotTop} L ${midX} ${plotBot}`, palette.border, 1, { dash: '4 4' }),\n  );\n  elements.push(\n    p.path(`M ${plotLeft} ${midY} L ${plotRight} ${midY}`, palette.border, 1, { dash: '4 4' }),\n  );\n\n  // \u2500\u2500 Points \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const dotFont = typography.smallFontSize;\n  for (const pt of ir.points) {\n    const x = px(pt.x),\n      y = py(pt.y);\n    elements.push(p.circle({ x, y }, 5, palette.primary, palette.background, 1.5));\n    elements.push(p.text(pt.label, x + 9, y + dotFont * 0.35, dotFont, palette.text));\n  }\n\n  // \u2500\u2500 Edge axis labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const axFont = typography.smallFontSize;\n  const xY = plotBot + axFont + 8;\n  if (ir.xAxisLeft)\n    elements.push(\n      p.text(ir.xAxisLeft, plotLeft, xY, axFont, palette.textMuted, { anchor: 'start' }),\n    );\n  if (ir.xAxisRight)\n    elements.push(\n      p.text(ir.xAxisRight, plotRight, xY, axFont, palette.textMuted, { anchor: 'end' }),\n    );\n\n  const yLx = margin + axFont;\n  if (ir.yAxisBottom) {\n    const yy = plotBot;\n    elements.push(\n      p.group([p.text(ir.yAxisBottom, yLx, yy, axFont, palette.textMuted, { anchor: 'start' })], {\n        transform: `rotate(-90 ${yLx} ${yy})`,\n      }),\n    );\n  }\n  if (ir.yAxisTop) {\n    const yy = plotTop;\n    elements.push(\n      p.group([p.text(ir.yAxisTop, yLx, yy, axFont, palette.textMuted, { anchor: 'end' })], {\n        transform: `rotate(-90 ${yLx} ${yy})`,\n      }),\n    );\n  }\n\n  const totalW = rhuInt(plotRight + margin);\n  const totalH = rhuInt(plotBot + axFont + 16 + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"quadrantchart\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"title\";\n  var peg$c3 = \"x-axis\";\n  var peg$c4 = \"-->\";\n  var peg$c5 = \"y-axis\";\n  var peg$c6 = \"quadrant-\";\n  var peg$c7 = \":\";\n  var peg$c8 = \"[\";\n  var peg$c9 = \",\";\n  var peg$c10 = \"]\";\n  var peg$c11 = \"-\";\n  var peg$c12 = \".\";\n  var peg$c13 = \"\\r\";\n  var peg$c14 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[1-4]/;\n  var peg$r2 = /^[^:\\n]/;\n  var peg$r3 = /^[0-9]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"quadrantChart\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"title\", true);\n  var peg$e4 = peg$literalExpectation(\"x-axis\", true);\n  var peg$e5 = peg$literalExpectation(\"-->\", false);\n  var peg$e6 = peg$literalExpectation(\"y-axis\", true);\n  var peg$e7 = peg$literalExpectation(\"quadrant-\", true);\n  var peg$e8 = peg$classExpectation([[\"1\", \"4\"]], false, false);\n  var peg$e9 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e10 = peg$literalExpectation(\":\", false);\n  var peg$e11 = peg$literalExpectation(\"[\", false);\n  var peg$e12 = peg$literalExpectation(\",\", false);\n  var peg$e13 = peg$literalExpectation(\"]\", false);\n  var peg$e14 = peg$literalExpectation(\"-\", false);\n  var peg$e15 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e16 = peg$literalExpectation(\".\", false);\n  var peg$e17 = peg$literalExpectation(\"\\r\", false);\n  var peg$e18 = peg$literalExpectation(\"\\n\", false);\n  var peg$e19 = peg$anyExpectation();\n  var peg$e20 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      let title, xl, xr, yb, yt;\n      const quadrants = [undefined, undefined, undefined, undefined];\n      const points = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'title') title = s.v;\n        else if (s.t === 'x') { xl = s.left; xr = s.right; }\n        else if (s.t === 'y') { yb = s.left; yt = s.right; }\n        else if (s.t === 'q') quadrants[s.n - 1] = s.label;\n        else if (s.t === 'p') points.push({ label: s.label, x: s.x, y: s.y });\n      }\n      return {\n        version: '1.0',\n        metadata: { ...(fm || {}), ...(title ? { title } : {}) },\n        ...(xl !== undefined ? { xAxisLeft: xl } : {}),\n        ...(xr !== undefined ? { xAxisRight: xr } : {}),\n        ...(yb !== undefined ? { yAxisBottom: yb } : {}),\n        ...(yt !== undefined ? { yAxisTop: yt } : {}),\n        quadrants,\n        points,\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f4 = function(left, r) { return r.trim(); };\n  var peg$f5 = function(left, right) {\n      return { t: 'x', left: left.trim(), right: right || undefined };\n    };\n  var peg$f6 = function(left, r) { return r.trim(); };\n  var peg$f7 = function(left, right) {\n      return { t: 'y', left: left.trim(), right: right || undefined };\n    };\n  var peg$f8 = function(n, label) { return { t: 'q', n: parseInt(n, 10), label: label.trim() }; };\n  var peg$f9 = function(label, x, y) {\n      return { t: 'p', label: label.trim(), x, y };\n    };\n  var peg$f10 = function(n) { return parseFloat(n); };\n  var peg$f11 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 13);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 13;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitle();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseXAxis();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseYAxis();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseQuadrant();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parsePoint();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitle() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseRestOfLine();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseXAxis() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseAxisText();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.substr(peg$currPos, 3) === peg$c4) {\n          s7 = peg$c4;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseRestOfLine();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s5;\n            s5 = peg$f4(s4, s9);\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parseLineEnd();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f5(s4, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseYAxis() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c5) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseAxisText();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.substr(peg$currPos, 3) === peg$c4) {\n          s7 = peg$c4;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseRestOfLine();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s5;\n            s5 = peg$f6(s4, s9);\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parseLineEnd();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f7(s4, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuadrant() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 9);\n    if (s2.toLowerCase() === peg$c6) {\n      peg$currPos += 9;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = input.charAt(peg$currPos);\n      if (peg$r1.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseRestOfLine();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f8(s3, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePoint() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r2.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c7;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 91) {\n          s6 = peg$c8;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parse_();\n          s8 = peg$parseNum();\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s10 = peg$c9;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e12); }\n            }\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseNum();\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 93) {\n                  s14 = peg$c10;\n                  peg$currPos++;\n                } else {\n                  s14 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e13); }\n                }\n                if (s14 !== peg$FAILED) {\n                  s15 = peg$parse_();\n                  s16 = peg$parseLineEnd();\n                  if (s16 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f9(s2, s8, s12);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAxisText() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$currPos;\n    s3 = peg$currPos;\n    peg$silentFails++;\n    if (input.substr(peg$currPos, 3) === peg$c4) {\n      s4 = peg$c4;\n      peg$currPos += 3;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    peg$silentFails--;\n    if (s4 === peg$FAILED) {\n      s3 = undefined;\n    } else {\n      peg$currPos = s3;\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = input.charAt(peg$currPos);\n      if (peg$r0.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$currPos;\n        s3 = peg$currPos;\n        peg$silentFails++;\n        if (input.substr(peg$currPos, 3) === peg$c4) {\n          s4 = peg$c4;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        peg$silentFails--;\n        if (s4 === peg$FAILED) {\n          s3 = undefined;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = input.charAt(peg$currPos);\n          if (peg$r0.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s4 !== peg$FAILED) {\n            s3 = [s3, s4];\n            s2 = s3;\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c11;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r3.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r3.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c12;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r3.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r3.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e15); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f10(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c13;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c14;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c13;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c14;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f11();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c13;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c14;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { QuadrantDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutQuadrant } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { QuadrantDocument, QuadrantPoint } from './ir.js';\n\nexport const quadrant: DiagramModule<QuadrantDocument> = {\n  parseMermaid(input: string): QuadrantDocument {\n    return parser.parse(input) as QuadrantDocument;\n  },\n\n  parseYaml(input: string): QuadrantDocument {\n    return JSON.parse(input) as QuadrantDocument;\n  },\n\n  layout(ir: QuadrantDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutQuadrant(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/radar/layout.ts \u2014 Multi-axis radar (spider) chart.\n *\n * Equiangular spokes (one per axis) from a shared centre, concentric grid\n * rings, and one filled polygon per curve. Curve colours come from the shared\n * categorical hue cycle; a legend lists each curve.\n */\n\nimport type { RadarDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutRadar(ir: RadarDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const axes = ir.axes;\n  const n = Math.max(axes.length, 1);\n  const allVals = ir.curves.flatMap((c) => c.values as number[]);\n  const min = ir.min ?? 0;\n  const max = ir.max ?? (allVals.length ? Math.max(...allVals) : 1);\n  const span = max - min || 1;\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 18 : 0;\n\n  const R = 180;\n  const labelPad = 90; // room for axis labels around the ring\n  const cx = margin + labelPad + R;\n  const cy = margin + titleH + labelPad + R;\n\n  // Angle for axis i: start at top (-90\u00B0), clockwise.\n  const angle = (i: number): number => -Math.PI / 2 + (i / n) * Math.PI * 2;\n  const ptAt = (i: number, frac: number): { x: number; y: number } => ({\n    x: cx + Math.cos(angle(i)) * R * frac,\n    y: cy + Math.sin(angle(i)) * R * frac,\n  });\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(\n      p.text(\n        title,\n        rhuInt(cx),\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Grid rings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const rings = 4;\n  for (let r = 1; r <= rings; r++) {\n    const frac = r / rings;\n    const d = axes\n      .map((_, i) => {\n        const pt = ptAt(i, frac);\n        return `${rhu(pt.x)} ${rhu(pt.y)}`;\n      })\n      .join(' L ');\n    elements.push(p.path(`M ${d} Z`, palette.border, 1, { opacity: 0.5 }));\n  }\n\n  // \u2500\u2500 Spokes + axis labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  axes.forEach((ax, i) => {\n    const outer = ptAt(i, 1);\n    elements.push(\n      p.path(`M ${rhu(cx)} ${rhu(cy)} L ${rhu(outer.x)} ${rhu(outer.y)}`, palette.border, 1, {\n        opacity: 0.6,\n      }),\n    );\n    const lp = ptAt(i, 1.12);\n    const a = angle(i);\n    const anchor = Math.abs(Math.cos(a)) < 0.3 ? 'middle' : Math.cos(a) > 0 ? 'start' : 'end';\n    elements.push(\n      p.text(\n        ax.label,\n        rhu(lp.x),\n        rhu(lp.y + typography.smallFontSize * 0.35),\n        typography.smallFontSize,\n        palette.text,\n        { anchor },\n      ),\n    );\n  });\n\n  // \u2500\u2500 Curves \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.curves.forEach((curve, ci) => {\n    const color = categoricalHue(ci, theme);\n    const pts = axes.map((_, i) => {\n      const v = curve.values[i] ?? min;\n      const frac = Math.max(0, Math.min(1, (v - min) / span));\n      const pt = ptAt(i, frac);\n      return `${rhu(pt.x)} ${rhu(pt.y)}`;\n    });\n    if (pts.length) {\n      elements.push(p.path(`M ${pts.join(' L ')} Z`, color, 2, { fill: color, opacity: 0.18 }));\n      elements.push(p.path(`M ${pts.join(' L ')} Z`, color, 2));\n    }\n  });\n\n  // \u2500\u2500 Legend \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const legendFont = typography.baseFontSize;\n  const swatch = 12;\n  const legendX = cx + R + labelPad - 30;\n  const legendTop = margin + titleH;\n  let legendW = 0;\n  ir.curves.forEach((curve, ci) => {\n    const ly = legendTop + ci * (legendFont + 10);\n    const swatchColor = categoricalHue(ci, theme);\n    elements.push(\n      p.rect(\n        { x: legendX, y: ly, width: swatch, height: swatch },\n        swatchColor,\n        swatchColor,\n        0,\n        { rx: 2 },\n      ),\n    );\n    elements.push(\n      p.text(curve.label, legendX + swatch + 8, ly + swatch - 2, legendFont, palette.text),\n    );\n    legendW = Math.max(legendW, swatch + 8 + measureText(curve.label, legendFont).width);\n  });\n\n  const ringRight = cx + R + labelPad;\n  const totalW = rhuInt(Math.max(ringRight, legendX + legendW) + margin);\n  const totalH = rhuInt(cy + R + labelPad + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"radar-beta\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"title\";\n  var peg$c3 = \"axis\";\n  var peg$c4 = \",\";\n  var peg$c5 = \"curve\";\n  var peg$c6 = \"{\";\n  var peg$c7 = \"}\";\n  var peg$c8 = \"max\";\n  var peg$c9 = \"min\";\n  var peg$c10 = \"[\";\n  var peg$c11 = \"]\";\n  var peg$c12 = \"\\\"\";\n  var peg$c13 = \"-\";\n  var peg$c14 = \".\";\n  var peg$c15 = \"\\r\";\n  var peg$c16 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\\]\\n]/;\n  var peg$r2 = /^[a-zA-Z0-9_]/;\n  var peg$r3 = /^[^\"]/;\n  var peg$r4 = /^[0-9]/;\n  var peg$r5 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"radar-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"title\", true);\n  var peg$e4 = peg$literalExpectation(\"axis\", true);\n  var peg$e5 = peg$literalExpectation(\",\", false);\n  var peg$e6 = peg$literalExpectation(\"curve\", true);\n  var peg$e7 = peg$literalExpectation(\"{\", false);\n  var peg$e8 = peg$literalExpectation(\"}\", false);\n  var peg$e9 = peg$literalExpectation(\"max\", true);\n  var peg$e10 = peg$literalExpectation(\"min\", true);\n  var peg$e11 = peg$literalExpectation(\"[\", false);\n  var peg$e12 = peg$literalExpectation(\"]\", false);\n  var peg$e13 = peg$classExpectation([\"]\", \"\\n\"], true, false);\n  var peg$e14 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e15 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e16 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e17 = peg$literalExpectation(\"-\", false);\n  var peg$e18 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e19 = peg$literalExpectation(\".\", false);\n  var peg$e20 = peg$literalExpectation(\"\\r\", false);\n  var peg$e21 = peg$literalExpectation(\"\\n\", false);\n  var peg$e22 = peg$anyExpectation();\n  var peg$e23 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      let title, min, max;\n      const axes = [];\n      const curves = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'title') title = s.v;\n        else if (s.t === 'axis')  axes.push(...s.items);\n        else if (s.t === 'curve') curves.push({ id: s.id, label: s.label, values: s.values });\n        else if (s.t === 'max')   max = s.v;\n        else if (s.t === 'min')   min = s.v;\n      }\n      return {\n        version: '1.0',\n        metadata: { ...(fm || {}), ...(title ? { title } : {}) },\n        axes,\n        curves,\n        ...(min !== undefined ? { min } : {}),\n        ...(max !== undefined ? { max } : {}),\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f4 = function(first, a) { return a; };\n  var peg$f5 = function(first, rest) {\n      return { t: 'axis', items: [first, ...rest] };\n    };\n  var peg$f6 = function(id, label, first, n) { return n; };\n  var peg$f7 = function(id, label, first, rest) {\n      return { t: 'curve', id, label: label != null ? label : id, values: [first, ...rest] };\n    };\n  var peg$f8 = function(n) { return { t: 'max', v: n }; };\n  var peg$f9 = function(n) { return { t: 'min', v: n }; };\n  var peg$f10 = function(id, label) { return { id, label: label != null ? label : id }; };\n  var peg$f11 = function(q) { return q; };\n  var peg$f12 = function(s) { return s.trim(); };\n  var peg$f13 = function(s) { return s; };\n  var peg$f14 = function(n) { return parseFloat(n); };\n  var peg$f15 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 10);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 10;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitle();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseAxisLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseCurveLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseMaxLine();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseMinLine();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitle() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseRestOfLine();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAxisLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 4);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseAxisDef();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$currPos;\n        s7 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s8 = peg$c4;\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parse_();\n          s10 = peg$parseAxisDef();\n          if (s10 !== peg$FAILED) {\n            peg$savedPos = s6;\n            s6 = peg$f4(s4, s10);\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$currPos;\n          s7 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s8 = peg$c4;\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parse_();\n            s10 = peg$parseAxisDef();\n            if (s10 !== peg$FAILED) {\n              peg$savedPos = s6;\n              s6 = peg$f4(s4, s10);\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        }\n        s6 = peg$parse_();\n        s7 = peg$parseLineEnd();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f5(s4, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCurveLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c5) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseIdent();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLabelBracket();\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 123) {\n          s7 = peg$c6;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseNum();\n          if (s9 !== peg$FAILED) {\n            s10 = [];\n            s11 = peg$currPos;\n            s12 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s13 = peg$c4;\n              peg$currPos++;\n            } else {\n              s13 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e5); }\n            }\n            if (s13 !== peg$FAILED) {\n              s14 = peg$parse_();\n              s15 = peg$parseNum();\n              if (s15 !== peg$FAILED) {\n                peg$savedPos = s11;\n                s11 = peg$f6(s4, s5, s9, s15);\n              } else {\n                peg$currPos = s11;\n                s11 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s11;\n              s11 = peg$FAILED;\n            }\n            while (s11 !== peg$FAILED) {\n              s10.push(s11);\n              s11 = peg$currPos;\n              s12 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s13 = peg$c4;\n                peg$currPos++;\n              } else {\n                s13 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e5); }\n              }\n              if (s13 !== peg$FAILED) {\n                s14 = peg$parse_();\n                s15 = peg$parseNum();\n                if (s15 !== peg$FAILED) {\n                  peg$savedPos = s11;\n                  s11 = peg$f6(s4, s5, s9, s15);\n                } else {\n                  peg$currPos = s11;\n                  s11 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s11;\n                s11 = peg$FAILED;\n              }\n            }\n            s11 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 125) {\n              s12 = peg$c7;\n              peg$currPos++;\n            } else {\n              s12 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s12 !== peg$FAILED) {\n              s13 = peg$parse_();\n              s14 = peg$parseLineEnd();\n              if (s14 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f7(s4, s5, s9, s10);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMaxLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseNum();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f8(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMinLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c9) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseNum();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f9(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAxisDef() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseLabelBracket();\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f10(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLabelBracket() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s1 = peg$c10;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parseQuoted();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 93) {\n          s5 = peg$c11;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e12); }\n        }\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f11(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s1 = peg$c10;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parse_();\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = input.charAt(peg$currPos);\n        if (peg$r1.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = input.charAt(peg$currPos);\n            if (peg$r1.test(s5)) {\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e13); }\n            }\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s3 = input.substring(s3, peg$currPos);\n        } else {\n          s3 = s4;\n        }\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s4 = peg$c11;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f12(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c12;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r3.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f13(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c13;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r4.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r4.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c14;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r4.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r4.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e18); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f14(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c15;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c16;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c15;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c16;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f15();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c15;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c16;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r5.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { RadarDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutRadar } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { RadarDocument, RadarAxis, RadarCurve } from './ir.js';\n\nexport const radar: DiagramModule<RadarDocument> = {\n  parseMermaid(input: string): RadarDocument {\n    return parser.parse(input) as RadarDocument;\n  },\n\n  parseYaml(input: string): RadarDocument {\n    return JSON.parse(input) as RadarDocument;\n  },\n\n  layout(ir: RadarDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutRadar(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/gantt/layout.ts \u2014 Classic Gantt chart.\n *\n * One row per task, grouped under section bands, against a date grid. Bars span\n * start\u2192end on a day-ordinal axis (shared time/dates utilities); status maps to\n * the semantic palette; zero-duration tasks render as milestone diamonds.\n */\n\nimport type { GanttDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { statusColor } from '../timeline/shared.js';\nimport { startOrdinal, inferAxisUnit, enumTicks, formatTickLabel } from '../../../time/dates.js';\nimport { truncateText } from '../../../text/wrap.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutGantt(ir: GanttDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  // \u2500\u2500 Date range \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const ords: number[] = [];\n  for (const sec of ir.sections)\n    for (const t of sec.tasks) {\n      ords.push(startOrdinal(t.start), startOrdinal(t.end));\n    }\n  if (ords.length === 0) ords.push(0, 30);\n  const minOrd = Math.min(...ords);\n  const maxOrd = Math.max(...ords);\n  const span = Math.max(1, maxOrd - minOrd);\n  const unit = inferAxisUnit(span);\n  const ticks = enumTicks(minOrd, maxOrd, unit);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 18 : 0;\n  const leftColW = 230;\n  const gridLeft = margin + leftColW;\n  const gridW = 720;\n  const gridRight = gridLeft + gridW;\n  const axisH = 26;\n  const rowH = 26;\n  const rowGap = 4;\n  const secHdrH = 26;\n\n  const gridTop = margin + titleH + axisH;\n  const dateX = (ord: number): number => rhu(gridLeft + ((ord - minOrd) / span) * gridW);\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Compute total height first (for full-height gridlines) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let rowCount = 0;\n  for (const sec of ir.sections) rowCount += 1 + sec.tasks.length;\n  const bodyH = rowCount * (rowH + rowGap);\n  const gridBottom = gridTop + bodyH;\n\n  // \u2500\u2500 Date gridlines + axis labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ticks.forEach((t, i) => {\n    const x = dateX(t.ordinal);\n    elements.push(\n      p.path(`M ${x} ${gridTop} L ${x} ${gridBottom}`, palette.border, 1, { opacity: 0.4 }),\n    );\n    elements.push(\n      p.text(\n        formatTickLabel(t, unit, i),\n        x,\n        margin + titleH + axisH - 8,\n        typography.smallFontSize,\n        palette.textMuted,\n        { anchor: 'middle' },\n      ),\n    );\n  });\n  // axis baseline\n  elements.push(p.path(`M ${gridLeft} ${gridTop} L ${gridRight} ${gridTop}`, palette.border, 1.5));\n\n  // \u2500\u2500 Rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let y = gridTop;\n  for (const sec of ir.sections) {\n    // Section header band\n    elements.push(\n      p.rect(\n        { x: margin, y, width: leftColW + gridW, height: secHdrH },\n        palette.surface,\n        palette.surface,\n        0,\n      ),\n    );\n    elements.push(\n      p.text(\n        sec.label,\n        margin + 6,\n        y + secHdrH / 2 + typography.baseFontSize * 0.35,\n        typography.baseFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n    y += secHdrH + rowGap;\n\n    for (const task of sec.tasks) {\n      const x0 = dateX(startOrdinal(task.start));\n      const color = statusColor(palette, task.status === 'crit' ? 'blocked' : task.status);\n\n      // Task name (left column)\n      elements.push(\n        p.text(\n          truncateText(task.label, typography.smallFontSize, leftColW - 12),\n          margin + 4,\n          y + rowH / 2 + typography.smallFontSize * 0.35,\n          typography.smallFontSize,\n          palette.text,\n        ),\n      );\n\n      if (task.isMilestone) {\n        const cx = x0,\n          cy = y + rowH / 2,\n          r = 8;\n        elements.push(\n          p.path(\n            `M ${cx} ${cy - r} L ${cx + r} ${cy} L ${cx} ${cy + r} L ${cx - r} ${cy} Z`,\n            palette.background,\n            1.5,\n            { fill: color },\n          ),\n        );\n      } else {\n        const x1 = dateX(startOrdinal(task.end));\n        const barW = Math.max(4, x1 - x0);\n        elements.push(\n          p.rect({ x: x0, y: y + 4, width: rhu(barW), height: rowH - 8 }, color, color, 0, {\n            rx: 3,\n          }),\n        );\n      }\n      y += rowH + rowGap;\n    }\n  }\n\n  const totalW = rhuInt(gridRight + margin);\n  const totalH = rhuInt(gridBottom + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"gantt\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"title\";\n  var peg$c3 = \"dateformat\";\n  var peg$c4 = \"excludes\";\n  var peg$c5 = \"axisformat\";\n  var peg$c6 = \"todaymarker\";\n  var peg$c7 = \"tickinterval\";\n  var peg$c8 = \"section\";\n  var peg$c9 = \":\";\n  var peg$c10 = \"\\r\";\n  var peg$c11 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^:\\n]/;\n  var peg$r2 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"gantt\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"title\", true);\n  var peg$e4 = peg$literalExpectation(\"dateFormat\", true);\n  var peg$e5 = peg$literalExpectation(\"excludes\", true);\n  var peg$e6 = peg$literalExpectation(\"axisFormat\", true);\n  var peg$e7 = peg$literalExpectation(\"todayMarker\", true);\n  var peg$e8 = peg$literalExpectation(\"tickInterval\", true);\n  var peg$e9 = peg$literalExpectation(\"section\", true);\n  var peg$e10 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e11 = peg$literalExpectation(\":\", false);\n  var peg$e12 = peg$literalExpectation(\"\\r\", false);\n  var peg$e13 = peg$literalExpectation(\"\\n\", false);\n  var peg$e14 = peg$anyExpectation();\n  var peg$e15 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, lines) {\n      let title, dateFormat;\n      const sections = [];\n      for (const l of lines.filter(Boolean)) {\n        if      (l.t === 'title')      title = l.v;\n        else if (l.t === 'dateFormat') dateFormat = l.v;\n        else if (l.t === 'section')    sections.push({ label: l.label, tasks: [] });\n        else if (l.t === 'task') {\n          if (sections.length === 0) sections.push({ label: '', tasks: [] });\n          sections[sections.length - 1].tasks.push({ name: l.name, meta: l.meta });\n        }\n      }\n      return {\n        version: '1.0',\n        metadata: { ...(fm || {}), ...(title ? { title } : {}) },\n        dateFormat: dateFormat || 'YYYY-MM-DD',\n        sections,\n      };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {};\n      for (const line of lines) {\n        const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/);\n        if (m) meta[m[1]] = m[2];\n      }\n      return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f4 = function(v) { return { t: 'dateFormat', v: v.trim() }; };\n  var peg$f5 = function() { return null; };\n  var peg$f6 = function(label) { return { t: 'section', label: label.trim() }; };\n  var peg$f7 = function(name, meta) { return { t: 'task', name: name.trim(), meta: meta.trim() }; };\n  var peg$f8 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 5);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 5;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseLine();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseLine();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLine() {\n    var s0;\n\n    s0 = peg$parseTitleLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseDateFormatLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseExcludesLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseSectionLine();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseTaskLine();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDateFormatLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 10);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 10;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f4(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseExcludesLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 8);\n    if (s2.toLowerCase() === peg$c4) {\n      peg$currPos += 8;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 10);\n      if (s2.toLowerCase() === peg$c5) {\n        peg$currPos += 10;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 11);\n        if (s2.toLowerCase() === peg$c6) {\n          peg$currPos += 11;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = input.substr(peg$currPos, 12);\n          if (s2.toLowerCase() === peg$c7) {\n            peg$currPos += 12;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5();\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSectionLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTaskLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r1.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c9;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f7(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c10;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c11;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f8();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c10;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c10;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r2.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r2.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r2.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r2.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { GanttDocument, GanttSection, GanttTask, GanttStatus } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutGantt } from './layout.js';\nimport { parseIRDate, coerceLeft, dateToOrdinal, ordinalToDate } from '../../../time/dates.js';\nimport * as parser from './parser.js';\n\nexport type { GanttDocument, GanttSection, GanttTask, GanttStatus } from './ir.js';\n\ninterface RawTask {\n  name: string;\n  meta: string;\n}\ninterface RawSection {\n  label: string;\n  tasks: RawTask[];\n}\ninterface RawDoc {\n  version: string;\n  metadata: GanttDocument['metadata'];\n  dateFormat: string;\n  sections: RawSection[];\n}\n\nconst STATUS_FLAGS = new Set(['done', 'active', 'crit', 'milestone']);\n\nfunction isoFromOrdinal(ord: number): string {\n  const [y, m, d] = ordinalToDate(ord);\n  return `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`;\n}\n\nfunction durationDays(token: string): number {\n  const m = token.match(/^(\\d+(?:\\.\\d+)?)\\s*([dwhm]?)/i);\n  if (!m) return 1;\n  const n = parseFloat(m[1]!);\n  switch ((m[2] || 'd').toLowerCase()) {\n    case 'w':\n      return n * 7;\n    case 'h':\n      return Math.max(1, Math.round(n / 24));\n    default:\n      return n; // days\n  }\n}\n\nfunction dateOrdinal(date: string): number {\n  try {\n    const [y, m, d] = coerceLeft(parseIRDate(date));\n    return dateToOrdinal(y, m, d);\n  } catch {\n    return 0;\n  }\n}\n\n/** Resolve one raw task's metadata into a concrete GanttTask. */\nfunction resolveTask(raw: RawTask, endById: Map<string, number>): GanttTask {\n  const tokens = raw.meta\n    .split(',')\n    .map((t) => t.trim())\n    .filter(Boolean);\n  const flags: string[] = [];\n  const rest: string[] = [];\n  for (const tok of tokens) {\n    if (STATUS_FLAGS.has(tok.toLowerCase())) flags.push(tok.toLowerCase());\n    else rest.push(tok);\n  }\n\n  // rest is [id?, start, duration]; id present when 3+ tokens remain.\n  let id: string | undefined;\n  let startTok: string;\n  let durTok: string;\n  if (rest.length >= 3) {\n    id = rest[0];\n    startTok = rest[1]!;\n    durTok = rest[2]!;\n  } else {\n    startTok = rest[0] ?? '';\n    durTok = rest[1] ?? '0d';\n  }\n\n  const startOrd = /^after\\s+/i.test(startTok)\n    ? (endById.get(startTok.replace(/^after\\s+/i, '').trim()) ?? 0)\n    : dateOrdinal(startTok);\n\n  const isMilestone = flags.includes('milestone') || durationDays(durTok) === 0;\n  const endOrd = isMilestone ? startOrd : startOrd + durationDays(durTok);\n  if (id) endById.set(id, endOrd);\n\n  const status: GanttStatus = flags.includes('done')\n    ? 'done'\n    : flags.includes('active')\n      ? 'active'\n      : flags.includes('crit')\n        ? 'crit'\n        : 'default';\n\n  return {\n    ...(id ? { id } : {}),\n    label: raw.name,\n    status,\n    start: isoFromOrdinal(startOrd),\n    end: isoFromOrdinal(endOrd),\n    isMilestone,\n  };\n}\n\nexport const gantt: DiagramModule<GanttDocument> = {\n  parseMermaid(input: string): GanttDocument {\n    const raw = parser.parse(input) as RawDoc;\n    const endById = new Map<string, number>();\n    const sections: GanttSection[] = raw.sections.map((sec) => ({\n      label: sec.label,\n      tasks: sec.tasks.map((t) => resolveTask(t, endById)),\n    }));\n    return { version: raw.version, metadata: raw.metadata, sections };\n  },\n\n  parseYaml(input: string): GanttDocument {\n    return JSON.parse(input) as GanttDocument;\n  },\n\n  layout(ir: GanttDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutGantt(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/journey/layout.ts \u2014 User-journey satisfaction map.\n *\n * Tasks are placed left\u2192right; vertical position encodes the satisfaction\n * score (1 low \u2026 5 high). A path connects consecutive task nodes; section\n * bands span their tasks. Node colour maps the score onto the semantic palette\n * (low \u2192 error, high \u2192 success).\n */\n\nimport type { JourneyDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\nimport { readableText } from '../../../theme/contrast.js';\n\nconst SCORE_MIN = 1;\nconst SCORE_MAX = 5;\n\nexport function layoutJourney(ir: JourneyDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const scoreColor = (s: number): string => {\n    if (s <= 1.5) return palette.error;\n    if (s <= 2.5) return palette.warning;\n    if (s <= 3.5) return palette.secondary;\n    if (s <= 4.5) return palette.primary;\n    return palette.success;\n  };\n\n  // Flatten tasks (keep section spans).\n  interface Flat {\n    label: string;\n    score: number;\n    actors: readonly string[];\n    section: number;\n  }\n  const flat: Flat[] = [];\n  ir.sections.forEach((sec, si) =>\n    sec.tasks.forEach((t) =>\n      flat.push({ label: t.label, score: t.score, actors: t.actors, section: si }),\n    ),\n  );\n  const n = Math.max(flat.length, 1);\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n\n  const sectionBandH = 30;\n  const plotLeft = margin + 30;\n  const plotTop = margin + titleH + sectionBandH + 16;\n  const plotH = 240;\n  const plotBottom = plotTop + plotH;\n  const step = 150;\n  const plotW = step * n;\n  const plotRight = plotLeft + plotW;\n\n  const taskX = (i: number): number => plotLeft + (i + 0.5) * step;\n  const scoreY = (s: number): number =>\n    rhu(\n      plotBottom -\n        ((Math.max(SCORE_MIN, Math.min(SCORE_MAX, s)) - SCORE_MIN) / (SCORE_MAX - SCORE_MIN)) *\n          plotH,\n    );\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Satisfaction gridlines (1..5) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (let s = SCORE_MIN; s <= SCORE_MAX; s++) {\n    const y = scoreY(s);\n    elements.push(\n      p.path(`M ${plotLeft} ${y} L ${plotRight} ${y}`, palette.border, 1, { opacity: 0.4 }),\n    );\n    elements.push(\n      p.text(\n        String(s),\n        plotLeft - 10,\n        y + typography.smallFontSize * 0.35,\n        typography.smallFontSize,\n        palette.textMuted,\n        { anchor: 'end' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Section bands \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.sections.forEach((sec, si) => {\n    const idxs = flat\n      .map((f, i) => ({ f, i }))\n      .filter(({ f }) => f.section === si)\n      .map(({ i }) => i);\n    if (idxs.length === 0) return;\n    const x0 = taskX(idxs[0]!) - step / 2;\n    const x1 = taskX(idxs[idxs.length - 1]!) + step / 2;\n    const hue = categoricalHue(si, theme);\n    elements.push(\n      p.rect(\n        { x: rhu(x0), y: margin + titleH, width: rhu(x1 - x0 - 6), height: sectionBandH },\n        hue,\n        hue,\n        0,\n        { rx: 6 },\n      ),\n    );\n    elements.push(\n      p.text(\n        sec.label,\n        rhuInt((x0 + x1) / 2 - 3),\n        margin + titleH + sectionBandH / 2 + typography.baseFontSize * 0.35,\n        typography.baseFontSize,\n        readableText(hue, theme),\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n  });\n\n  // \u2500\u2500 Journey path \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const nodePts = flat.map((f, i) => ({ x: rhu(taskX(i)), y: scoreY(f.score) }));\n  if (nodePts.length > 1) {\n    elements.push(\n      p.path(`M ${nodePts.map((pt) => `${pt.x} ${pt.y}`).join(' L ')}`, palette.textMuted, 2, {\n        opacity: 0.6,\n      }),\n    );\n  }\n\n  // \u2500\u2500 Task nodes + labels + actors \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  flat.forEach((f, i) => {\n    const x = rhu(taskX(i)),\n      y = scoreY(f.score);\n    const color = scoreColor(f.score);\n    elements.push(p.circle({ x, y }, 16, color, palette.background, 2));\n    elements.push(\n      p.text(\n        String(f.score),\n        x,\n        y + typography.baseFontSize * 0.35,\n        typography.baseFontSize,\n        readableText(color, theme),\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n    elements.push(\n      p.text(\n        f.label,\n        x,\n        plotBottom + typography.smallFontSize + 10,\n        typography.smallFontSize,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n    f.actors.forEach((a, ai) => {\n      elements.push(\n        p.text(\n          a,\n          x,\n          plotBottom + typography.smallFontSize + 10 + (ai + 1) * (typography.smallFontSize + 4),\n          typography.smallFontSize,\n          palette.textMuted,\n          { anchor: 'middle' },\n        ),\n      );\n    });\n  });\n\n  const maxActors = Math.max(1, ...flat.map((f) => f.actors.length));\n  const totalW = rhuInt(plotRight + margin);\n  const totalH = rhuInt(\n    plotBottom +\n      typography.smallFontSize +\n      10 +\n      (maxActors + 1) * (typography.smallFontSize + 4) +\n      margin,\n  );\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"journey\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"title\";\n  var peg$c3 = \"section\";\n  var peg$c4 = \":\";\n  var peg$c5 = \",\";\n  var peg$c6 = \"-\";\n  var peg$c7 = \".\";\n  var peg$c8 = \"\\r\";\n  var peg$c9 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^:\\n]/;\n  var peg$r2 = /^[^,\\n]/;\n  var peg$r3 = /^[0-9]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"journey\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"title\", true);\n  var peg$e4 = peg$literalExpectation(\"section\", true);\n  var peg$e5 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e6 = peg$literalExpectation(\":\", false);\n  var peg$e7 = peg$literalExpectation(\",\", false);\n  var peg$e8 = peg$classExpectation([\",\", \"\\n\"], true, false);\n  var peg$e9 = peg$literalExpectation(\"-\", false);\n  var peg$e10 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e11 = peg$literalExpectation(\".\", false);\n  var peg$e12 = peg$literalExpectation(\"\\r\", false);\n  var peg$e13 = peg$literalExpectation(\"\\n\", false);\n  var peg$e14 = peg$anyExpectation();\n  var peg$e15 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      let title;\n      const sections = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'title') title = s.v;\n        else if (s.t === 'section') sections.push({ label: s.label, tasks: [] });\n        else if (s.t === 'task') {\n          if (sections.length === 0) sections.push({ label: '', tasks: [] });\n          sections[sections.length - 1].tasks.push({ label: s.label, score: s.score, actors: s.actors });\n        }\n      }\n      return { version: '1.0', metadata: { ...(fm || {}), ...(title ? { title } : {}) }, sections };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f4 = function(label) { return { t: 'section', label: label.trim() }; };\n  var peg$f5 = function(label, score, actors) {\n      return { t: 'task', label: label.trim(), score, actors };\n    };\n  var peg$f6 = function(first, a) { return a; };\n  var peg$f7 = function(first, rest) { return [first, ...rest].filter(Boolean); };\n  var peg$f8 = function(a) { return a.trim(); };\n  var peg$f9 = function(n) { return parseFloat(n); };\n  var peg$f10 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 7);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 7;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitle();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseSection();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseTask();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseBlankLine();\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitle() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseRestOfLine();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSection() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseRestOfLine();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f4(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTask() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r1.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c4;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseNum();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s7 = peg$c4;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseActors();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$parse_();\n              s11 = peg$parseLineEnd();\n              if (s11 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f5(s2, s5, s9);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseActors() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseActor();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 44) {\n        s5 = peg$c5;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseActor();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f6(s1, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$currPos;\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s5 = peg$c5;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          s7 = peg$parseActor();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s3 = peg$f6(s1, s7);\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      peg$savedPos = s0;\n      s0 = peg$f7(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseActor() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r2.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r2.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f8(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r3.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r3.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c7;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r3.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r3.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f9(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c8;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c9;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c8;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c9;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f10();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c8;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c9;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { JourneyDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutJourney } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { JourneyDocument, JourneySection, JourneyTask } from './ir.js';\n\nexport const journey: DiagramModule<JourneyDocument> = {\n  parseMermaid(input: string): JourneyDocument {\n    return parser.parse(input) as JourneyDocument;\n  },\n\n  parseYaml(input: string): JourneyDocument {\n    return JSON.parse(input) as JourneyDocument;\n  },\n\n  layout(ir: JourneyDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutJourney(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/kanban/layout.ts \u2014 Column-of-cards board.\n *\n * Each column is a coloured header (from the categorical hue cycle) above a\n * vertical stack of wrapped card tiles. Columns are laid left\u2192right at a fixed\n * width; the board height follows the tallest column.\n */\n\nimport type { KanbanDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureFormattedText, renderFormattedText } from '../../../text/formatted.js';\nimport { rhuInt } from '../../../util/round.js';\n\nexport function layoutKanban(ir: KanbanDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const colW = 210;\n  const colGap = 18;\n  const headerH = 38;\n  const cardPad = 10;\n  const cardGap = 10;\n  const cardFont = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n  const lineH = rhuInt(cardFont * 1.3);\n  const cardInnerW = colW - cardPad * 2;\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n  const boardTop = margin + titleH;\n\n  // Pre-wrap cards to compute heights.\n  const columns = ir.columns.map((col) => ({\n    label: col.label,\n    cards: col.cards.map((c) => {\n      const info = measureFormattedText(c.text, cardFont, smallFont, cardInnerW - 2, 6);\n      const h = Math.max(cardPad * 2 + info.lineCount * lineH, 36);\n      return { info, h };\n    }),\n  }));\n\n  const elements: SceneElement[] = [];\n\n  if (title) {\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  let maxColH = 0;\n  columns.forEach((col, ci) => {\n    const x = margin + ci * (colW + colGap);\n    const hue = categoricalHue(ci, theme);\n\n    // Column header\n    elements.push(p.rect({ x, y: boardTop, width: colW, height: headerH }, hue, hue, 0, { rx: 6 }));\n    elements.push(\n      p.text(\n        `${col.label}  (${col.cards.length})`,\n        rhuInt(x + colW / 2),\n        boardTop + headerH / 2 + cardFont * 0.35,\n        typography.baseFontSize,\n        '#FFFFFF',\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n\n    // Cards\n    let cy = boardTop + headerH + cardGap;\n    for (const card of col.cards) {\n      elements.push(\n        p.rect({ x, y: cy, width: colW, height: card.h }, palette.surface, hue, 1, { rx: 6 }),\n      );\n      elements.push(\n        ...renderFormattedText(\n          p,\n          card.info,\n          x,\n          cy,\n          colW,\n          card.h,\n          cardFont,\n          smallFont,\n          palette.text,\n          palette.textMuted,\n          { align: 'start', paddingLeft: cardPad, paddingRight: cardPad },\n        ),\n      );\n      cy += card.h + cardGap;\n    }\n    maxColH = Math.max(maxColH, cy - boardTop);\n  });\n\n  const totalW = rhuInt(margin + columns.length * colW + (columns.length - 1) * colGap + margin);\n  const totalH = rhuInt(boardTop + maxColH + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"kanban\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"[\";\n  var peg$c3 = \"]\";\n  var peg$c4 = \"\\r\";\n  var peg$c5 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\\]\\n]/;\n  var peg$r2 = /^[a-zA-Z0-9_\\-]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"kanban\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"[\", false);\n  var peg$e4 = peg$classExpectation([\"]\", \"\\n\"], true, false);\n  var peg$e5 = peg$literalExpectation(\"]\", false);\n  var peg$e6 = peg$classExpectation([[\"a\", \"z\"], [\"A\", \"Z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e7 = peg$literalExpectation(\"\\r\", false);\n  var peg$e8 = peg$literalExpectation(\"\\n\", false);\n  var peg$e9 = peg$anyExpectation();\n  var peg$e10 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, rows) {\n      const columns = [];\n      for (const r of rows.filter(Boolean)) {\n        if (r.t === 'col') columns.push({ label: r.label, cards: [] });\n        else if (r.t === 'card') {\n          if (columns.length === 0) columns.push({ label: '', cards: [] });\n          columns[columns.length - 1].cards.push({ ...(r.id ? { id: r.id } : {}), text: r.text });\n        }\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, columns };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(id, text) { return { t: 'card', id: id || undefined, text: text.trim() }; };\n  var peg$f4 = function(label) { return { t: 'col', label: label.trim() }; };\n  var peg$f5 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 6);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 6;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseRow();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseRow();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRow() {\n    var s0;\n\n    s0 = peg$parseCard();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseColumn();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlankLine();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCard() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s3 = peg$c2;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      s5 = [];\n      s6 = input.charAt(peg$currPos);\n      if (peg$r1.test(s6)) {\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s6 !== peg$FAILED) {\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = input.charAt(peg$currPos);\n          if (peg$r1.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e4); }\n          }\n        }\n      } else {\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s4 = input.substring(s4, peg$currPos);\n      } else {\n        s4 = s5;\n      }\n      if (s4 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 93) {\n          s5 = peg$c3;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseLineEnd();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s2, s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseColumn() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r0.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r0.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = input.substring(s2, peg$currPos);\n    } else {\n      s2 = s3;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f4(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c4;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c5;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f5();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c4;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { KanbanDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutKanban } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { KanbanDocument, KanbanColumn, KanbanCard } from './ir.js';\n\nexport const kanban: DiagramModule<KanbanDocument> = {\n  parseMermaid(input: string): KanbanDocument {\n    return parser.parse(input) as KanbanDocument;\n  },\n\n  parseYaml(input: string): KanbanDocument {\n    return JSON.parse(input) as KanbanDocument;\n  },\n\n  layout(ir: KanbanDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutKanban(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/sequence/layout.ts \u2014 UML sequence diagram.\n *\n * Participants become equally-spaced columns with dashed lifelines. Events are\n * walked top\u2192down assigning rows: messages draw arrows (with autonumber, self\n * loops, activation bars), fragments draw labeled boxes with else dividers, and\n * notes draw boxes over participants. Deterministic; no clock.\n */\n\nimport type { SequenceDocument, SeqMessage, SeqNote } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { readableText } from '../../../theme/contrast.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'seq-arrow';\nconst OPEN_ID = 'seq-open';\n\nexport function layoutSequence(ir: SequenceDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const parts = ir.participants;\n  const idx = new Map(parts.map((pt, i) => [pt.id, i]));\n\n  // \u2500\u2500 Column geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const headFont = typography.baseFontSize;\n  const headPadX = 14;\n  const headH = 34;\n  const colW = Math.max(\n    110,\n    ...parts.map(\n      (pt) => measureText(pt.label, headFont).width + headPadX * 2 + (pt.isActor ? 8 : 0),\n    ),\n  );\n  const colGap = 60;\n  const colPitch = colW + colGap;\n  const colX = (i: number): number => margin + i * colPitch + colW / 2;\n  const partX = (id: string): number => colX(idx.get(id) ?? 0);\n\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n  const headTop = margin + titleH;\n  const bodyTop = headTop + headH + 26;\n  const rowGap = 46;\n\n  const elements: SceneElement[] = [];\n  const lifelineEls: SceneElement[] = [];\n\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Walk events to assign rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  interface Frag {\n    type: string;\n    label: string;\n    top: number;\n    left: number;\n    right: number;\n    elses: Array<{ y: number; label: string }>;\n  }\n  const fragStack: Frag[] = [];\n  const fragBoxes: Frag[] = [];\n  const activations = new Map<string, number[]>(); // id \u2192 stack of start-Y\n  const actBars: Array<{ x: number; y0: number; y1: number }> = [];\n\n  let y = bodyTop;\n  let msgNo = 0;\n  const minX = colX(0);\n  const maxX = colX(Math.max(parts.length - 1, 0));\n\n  const pushAct = (id: string): void => {\n    (activations.get(id) ?? activations.set(id, []).get(id)!).push(y);\n  };\n  const popAct = (id: string): void => {\n    const st = activations.get(id);\n    if (st && st.length) {\n      const y0 = st.pop()!;\n      actBars.push({ x: partX(id), y0, y1: y });\n    }\n  };\n\n  for (const ev of ir.events) {\n    if (ev.kind === 'message') {\n      const m = ev as SeqMessage;\n      const x1 = partX(m.from),\n        x2 = partX(m.to);\n      const self = m.from === m.to;\n      const label = ir.autonumber ? `${++msgNo}. ${m.text}` : m.text;\n      const dash = m.line === 'dashed' ? '5 4' : undefined;\n      const markerEnd =\n        m.head === 'arrow'\n          ? ARROW_ID\n          : m.head === 'open' || m.head === 'async'\n            ? OPEN_ID\n            : undefined;\n\n      if (m.activateTarget) pushAct(m.to);\n\n      if (self) {\n        const r = 26;\n        elements.push(p.text(label, x1 + 12, y - 6, typography.smallFontSize, palette.text));\n        elements.push(\n          p.path(\n            `M ${x1} ${rhu(y)} L ${x1 + r} ${rhu(y)} L ${x1 + r} ${rhu(y + 22)} L ${x1} ${rhu(y + 22)}`,\n            palette.text,\n            1.3,\n            { ...(dash ? { dash } : {}), ...(markerEnd ? { markerEnd } : {}) },\n          ),\n        );\n        y += 22 + rowGap;\n      } else {\n        const dir = x2 >= x1 ? 1 : -1;\n        elements.push(\n          p.text(label, rhuInt((x1 + x2) / 2), y - 7, typography.smallFontSize, palette.text, {\n            anchor: 'middle',\n          }),\n        );\n        if (m.head === 'cross') {\n          elements.push(\n            p.path(\n              `M ${rhu(x1)} ${rhu(y)} L ${rhu(x2 - dir * 6)} ${rhu(y)}`,\n              palette.text,\n              1.3,\n              dash ? { dash } : {},\n            ),\n          );\n          const cxp = x2 - dir * 6;\n          elements.push(\n            p.path(\n              `M ${rhu(cxp - 5)} ${rhu(y - 5)} L ${rhu(cxp + 5)} ${rhu(y + 5)} M ${rhu(cxp - 5)} ${rhu(y + 5)} L ${rhu(cxp + 5)} ${rhu(y - 5)}`,\n              palette.text,\n              1.5,\n            ),\n          );\n        } else {\n          elements.push(\n            p.path(`M ${rhu(x1)} ${rhu(y)} L ${rhu(x2)} ${rhu(y)}`, palette.text, 1.3, {\n              ...(dash ? { dash } : {}),\n              ...(markerEnd ? { markerEnd } : {}),\n            }),\n          );\n        }\n        y += rowGap;\n      }\n\n      if (m.deactivateSource) popAct(m.from);\n    } else if (ev.kind === 'note') {\n      const note = ev as SeqNote;\n      const xs = note.participants.map(partX);\n      const c = xs.reduce((s, v) => s + v, 0) / xs.length;\n      const w = Math.max(\n        measureText(note.text, typography.smallFontSize).width + 24,\n        Math.max(...xs) - Math.min(...xs) + colW * 0.8,\n      );\n      const nx = rhu(c - w / 2);\n      elements.push(\n        p.rect(\n          { x: nx, y: rhu(y - 6), width: rhu(w), height: 30 },\n          palette.warning + '22',\n          palette.warning,\n          1,\n          { rx: 4 },\n        ),\n      );\n      elements.push(\n        p.text(note.text, rhuInt(c), y + 13, typography.smallFontSize, palette.text, {\n          anchor: 'middle',\n        }),\n      );\n      y += 30 + rowGap - 10;\n    } else if (ev.kind === 'frag-start') {\n      fragStack.push({\n        type: ev.type,\n        label: ev.label,\n        top: y - 24,\n        left: minX,\n        right: maxX,\n        elses: [],\n      });\n      y += 14;\n    } else if (ev.kind === 'frag-else') {\n      const f = fragStack[fragStack.length - 1];\n      if (f) f.elses.push({ y: y - 18, label: ev.label });\n      y += 10;\n    } else if (ev.kind === 'frag-end') {\n      const f = fragStack.pop();\n      if (f) {\n        f.right = maxX;\n        fragBoxes.push({\n          ...f,\n          top: f.top,\n          left: minX - colW / 2 - 16,\n          right: maxX + colW / 2 + 16,\n        });\n      }\n      y += 6;\n    }\n  }\n  // Close any unclosed activations.\n  for (const [id, st] of activations)\n    while (st.length) {\n      const y0 = st.pop()!;\n      actBars.push({ x: partX(id), y0, y1: y });\n    }\n\n  const bodyBottom = y + 6;\n\n  // \u2500\u2500 Fragment boxes (behind messages) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const fragEls: SceneElement[] = [];\n  for (const f of fragBoxes) {\n    const top = f.top,\n      left = f.left,\n      right = f.right;\n    fragEls.push(\n      p.rect(\n        { x: rhu(left), y: rhu(top), width: rhu(right - left), height: rhu(bodyBottom - top) },\n        'none',\n        palette.border,\n        1.5,\n        { rx: 4 },\n      ),\n    );\n    // label tab\n    const tabW = measureText(f.type.toUpperCase(), typography.smallFontSize).width + 16;\n    const tabFill = palette.surface;\n    const tabTextColor = readableText(tabFill, theme);\n    fragEls.push(\n      p.rect(\n        { x: rhu(left), y: rhu(top), width: rhu(tabW), height: 18 },\n        tabFill,\n        palette.border,\n        1.5,\n        { rx: 3 },\n      ),\n    );\n    fragEls.push(\n      p.text(\n        f.type.toUpperCase(),\n        rhu(left + 8),\n        rhu(top + 13),\n        typography.smallFontSize,\n        tabTextColor,\n        { weight: 'bold' },\n      ),\n    );\n    if (f.label)\n      fragEls.push(\n        p.text(\n          `[${f.label}]`,\n          rhu(left + tabW + 8),\n          rhu(top + 13),\n          typography.smallFontSize,\n          palette.text,\n          { weight: 'bold' },\n        ),\n      );\n    for (const e of f.elses) {\n      fragEls.push(\n        p.path(`M ${rhu(left)} ${rhu(e.y)} L ${rhu(right)} ${rhu(e.y)}`, palette.border, 1.2, {\n          dash: '5 4',\n        }),\n      );\n      if (e.label)\n        fragEls.push(\n          p.text(\n            `[${e.label}]`,\n            rhu(left + 8),\n            rhu(e.y + 13),\n            typography.smallFontSize,\n            palette.text,\n          ),\n        );\n    }\n  }\n\n  // \u2500\u2500 Activation bars \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const actEls: SceneElement[] = actBars.map((b) =>\n    p.rect(\n      { x: rhu(b.x - 5), y: rhu(b.y0), width: 10, height: rhu(Math.max(8, b.y1 - b.y0)) },\n      palette.surface,\n      palette.primary,\n      1,\n      { rx: 1 },\n    ),\n  );\n\n  // \u2500\u2500 Lifelines + participant headers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  parts.forEach((pt, i) => {\n    const x = colX(i);\n    lifelineEls.push(\n      p.path(\n        `M ${rhu(x)} ${rhu(headTop + headH)} L ${rhu(x)} ${rhu(bodyBottom)}`,\n        palette.border,\n        1.5,\n        { dash: '4 4' },\n      ),\n    );\n    const hx = rhu(x - colW / 2);\n    const fill = pt.isActor ? palette.primary : palette.surface;\n    const txtFill = pt.isActor ? readableText(palette.primary, theme) : palette.text;\n    elements.push(\n      p.rect(\n        { x: hx, y: rhu(headTop), width: rhu(colW), height: headH },\n        fill,\n        palette.border,\n        1.5,\n        { rx: 6 },\n      ),\n    );\n    elements.push(\n      p.text(pt.label, rhuInt(x), headTop + headH / 2 + headFont * 0.35, headFont, txtFill, {\n        weight: 'bold',\n        anchor: 'middle',\n      }),\n    );\n  });\n\n  // Paint order: lifelines, fragments, activation bars, then messages/headers (already in elements).\n  const ordered: SceneElement[] = [...lifelineEls, ...fragEls, ...actEls, ...elements];\n\n  const totalW = rhuInt(maxX + colW / 2 + margin);\n  const totalH = rhuInt(bodyBottom + margin);\n\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n  const openW = s + 1;\n  const openH = rhu(s * 0.8);\n  const openMidY = rhu(openH / 2);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.text}\" /></marker>`,\n    `<marker id=\"${OPEN_ID}\" markerWidth=\"${openW}\" markerHeight=\"${openH}\" refX=\"${s}\" refY=\"${openMidY}\" orient=\"auto\"><polyline points=\"0 0, ${s} ${openMidY}, 0 ${openH}\" fill=\"none\" stroke=\"${palette.text}\" stroke-width=\"1.3\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements: ordered,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function arrowStyle(a) {\n    const line = a.startsWith('--') ? 'dashed' : 'solid';\n    let head = 'open';\n    if (a.endsWith('x')) head = 'cross';\n    else if (a.endsWith(')')) head = 'async';\n    else if (a.endsWith('>>')) head = 'arrow';\n    else if (a.endsWith('>')) head = 'open';\n    return { line, head };\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"sequencediagram\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"autonumber\";\n  var peg$c3 = \"participant\";\n  var peg$c4 = \"actor\";\n  var peg$c5 = \"as\";\n  var peg$c6 = \"note\";\n  var peg$c7 = \":\";\n  var peg$c8 = \"over\";\n  var peg$c9 = \"left of\";\n  var peg$c10 = \"right of\";\n  var peg$c11 = \",\";\n  var peg$c12 = \"alt\";\n  var peg$c13 = \"opt\";\n  var peg$c14 = \"loop\";\n  var peg$c15 = \"par\";\n  var peg$c16 = \"critical\";\n  var peg$c17 = \"break\";\n  var peg$c18 = \"else\";\n  var peg$c19 = \"and\";\n  var peg$c20 = \"end\";\n  var peg$c21 = \"activate\";\n  var peg$c22 = \"deactivate\";\n  var peg$c23 = \"-->>\";\n  var peg$c24 = \"->>\";\n  var peg$c25 = \"--x\";\n  var peg$c26 = \"-x\";\n  var peg$c27 = \"--)\";\n  var peg$c28 = \"-)\";\n  var peg$c29 = \"-->\";\n  var peg$c30 = \"->\";\n  var peg$c31 = \"\\r\";\n  var peg$c32 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[+\\-]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"sequenceDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"autonumber\", true);\n  var peg$e4 = peg$literalExpectation(\"participant\", true);\n  var peg$e5 = peg$literalExpectation(\"actor\", true);\n  var peg$e6 = peg$literalExpectation(\"as\", true);\n  var peg$e7 = peg$literalExpectation(\"Note\", true);\n  var peg$e8 = peg$literalExpectation(\":\", false);\n  var peg$e9 = peg$literalExpectation(\"over\", true);\n  var peg$e10 = peg$literalExpectation(\"left of\", true);\n  var peg$e11 = peg$literalExpectation(\"right of\", true);\n  var peg$e12 = peg$literalExpectation(\",\", false);\n  var peg$e13 = peg$literalExpectation(\"alt\", true);\n  var peg$e14 = peg$literalExpectation(\"opt\", true);\n  var peg$e15 = peg$literalExpectation(\"loop\", true);\n  var peg$e16 = peg$literalExpectation(\"par\", true);\n  var peg$e17 = peg$literalExpectation(\"critical\", true);\n  var peg$e18 = peg$literalExpectation(\"break\", true);\n  var peg$e19 = peg$literalExpectation(\"else\", true);\n  var peg$e20 = peg$literalExpectation(\"and\", true);\n  var peg$e21 = peg$literalExpectation(\"end\", true);\n  var peg$e22 = peg$literalExpectation(\"activate\", true);\n  var peg$e23 = peg$literalExpectation(\"deactivate\", true);\n  var peg$e24 = peg$classExpectation([\"+\", \"-\"], false, false);\n  var peg$e25 = peg$literalExpectation(\"-->>\", false);\n  var peg$e26 = peg$literalExpectation(\"->>\", false);\n  var peg$e27 = peg$literalExpectation(\"--x\", false);\n  var peg$e28 = peg$literalExpectation(\"-x\", false);\n  var peg$e29 = peg$literalExpectation(\"--)\", false);\n  var peg$e30 = peg$literalExpectation(\"-)\", false);\n  var peg$e31 = peg$literalExpectation(\"-->\", false);\n  var peg$e32 = peg$literalExpectation(\"->\", false);\n  var peg$e33 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e34 = peg$literalExpectation(\"\\r\", false);\n  var peg$e35 = peg$literalExpectation(\"\\n\", false);\n  var peg$e36 = peg$anyExpectation();\n  var peg$e37 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const participants = [];\n      const events = [];\n      let autonumber = false;\n      const ensure = (id, label, isActor) => {\n        let pp = participants.find(x => x.id === id);\n        if (!pp) { pp = { id, label: label || id, isActor: !!isActor }; participants.push(pp); }\n        else if (label) pp.label = label;\n        return pp;\n      };\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'autonumber') autonumber = true;\n        else if (s.t === 'participant') ensure(s.id, s.label, s.isActor);\n        else if (s.t === 'message') { ensure(s.from); ensure(s.to); events.push(s.ev); }\n        else if (s.t === 'note') { for (const id of s.ev.participants) ensure(id); events.push(s.ev); }\n        else if (s.t === 'event') events.push(s.ev);\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, participants, events, autonumber };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {};\n      for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; }\n      return meta;\n    };\n  var peg$f3 = function() { return { t: 'autonumber' }; };\n  var peg$f4 = function(kw, id, l) { return l.trim(); };\n  var peg$f5 = function(kw, id, label) {\n      return { t: 'participant', id, label: label || undefined, isActor: kw.toLowerCase() === 'actor' };\n    };\n  var peg$f6 = function(placement, ids, text) {\n      return { t: 'note', ev: { kind: 'note', placement, participants: ids, text: text.trim() } };\n    };\n  var peg$f7 = function() { return 'over'; };\n  var peg$f8 = function() { return 'left'; };\n  var peg$f9 = function() { return 'right'; };\n  var peg$f10 = function(first, i) { return i; };\n  var peg$f11 = function(first, rest) { return [first, ...rest]; };\n  var peg$f12 = function(type, l) { return l.trim(); };\n  var peg$f13 = function(type, label) {\n      return { t: 'event', ev: { kind: 'frag-start', type: type.toLowerCase(), label: label || '' } };\n    };\n  var peg$f14 = function(l) { return l.trim(); };\n  var peg$f15 = function(label) {\n      return { t: 'event', ev: { kind: 'frag-else', label: label || '' } };\n    };\n  var peg$f16 = function() { return { t: 'event', ev: { kind: 'frag-end' } }; };\n  var peg$f17 = function() {\n      // Explicit activate/deactivate statements are ignored; inline +/- is used.\n      return { t: 'ignore' };\n    };\n  var peg$f18 = function(from, arrow, act, to, text) {\n      const { line, head } = arrowStyle(arrow);\n      return { t: 'message', from, to, ev: {\n        kind: 'message', from, to, text: text.trim(), line, head,\n        ...(act === '+' ? { activateTarget: true } : {}),\n        ...(act === '-' ? { deactivateSource: true } : {}),\n      } };\n    };\n  var peg$f19 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 15);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 15;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseAutoNumber();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseParticipantDecl();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseNoteStmt();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseFragEnd();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseFragElse();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseFragStart();\n              if (s0 === peg$FAILED) {\n                s0 = peg$parseActivateStmt();\n                if (s0 === peg$FAILED) {\n                  s0 = peg$parseMessage();\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$parseBlankLine();\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAutoNumber() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 10);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 10;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse__();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$currPos;\n        s6 = [];\n        s7 = input.charAt(peg$currPos);\n        if (peg$r0.test(s7)) {\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n        s5 = input.substring(s5, peg$currPos);\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f3();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseParticipantDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 11);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 11;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 5);\n      if (s2.toLowerCase() === peg$c4) {\n        peg$currPos += 5;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          s7 = input.substr(peg$currPos, 2);\n          if (s7.toLowerCase() === peg$c5) {\n            peg$currPos += 2;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse__();\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parseRestOfLine();\n              if (s9 !== peg$FAILED) {\n                peg$savedPos = s5;\n                s5 = peg$f4(s2, s4, s9);\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5(s2, s4, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteStmt() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 4);\n    if (s2.toLowerCase() === peg$c6) {\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseNotePlacement();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseNoteIds();\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s8 = peg$c7;\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parse_();\n                s10 = peg$parseRestOfLine();\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$parseLineEnd();\n                  if (s11 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f6(s4, s6, s10);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNotePlacement() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = input.substr(peg$currPos, 4);\n    if (s1.toLowerCase() === peg$c8) {\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f7();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = input.substr(peg$currPos, 7);\n      if (s1.toLowerCase() === peg$c9) {\n        peg$currPos += 7;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f8();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = input.substr(peg$currPos, 8);\n        if (s1.toLowerCase() === peg$c10) {\n          peg$currPos += 8;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f9();\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteIds() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 44) {\n        s5 = peg$c11;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseIdent();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f10(s1, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$currPos;\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s5 = peg$c11;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e12); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          s7 = peg$parseIdent();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s3 = peg$f10(s1, s7);\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      peg$savedPos = s0;\n      s0 = peg$f11(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFragStart() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c12) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 3);\n      if (s2.toLowerCase() === peg$c13) {\n        peg$currPos += 3;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 4);\n        if (s2.toLowerCase() === peg$c14) {\n          peg$currPos += 4;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = input.substr(peg$currPos, 3);\n          if (s2.toLowerCase() === peg$c15) {\n            peg$currPos += 3;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          if (s2 === peg$FAILED) {\n            s2 = input.substr(peg$currPos, 8);\n            if (s2.toLowerCase() === peg$c16) {\n              peg$currPos += 8;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e17); }\n            }\n            if (s2 === peg$FAILED) {\n              s2 = input.substr(peg$currPos, 5);\n              if (s2.toLowerCase() === peg$c17) {\n                peg$currPos += 5;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e18); }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse__();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseRestOfLine();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f12(s2, s5);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f13(s2, s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFragElse() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 4);\n    if (s2.toLowerCase() === peg$c18) {\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 3);\n      if (s2.toLowerCase() === peg$c19) {\n        peg$currPos += 3;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse__();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseRestOfLine();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f14(s5);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f15(s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFragEnd() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 3);\n    if (s2.toLowerCase() === peg$c20) {\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f16();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseActivateStmt() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 8);\n    if (s2.toLowerCase() === peg$c21) {\n      peg$currPos += 8;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 10);\n      if (s2.toLowerCase() === peg$c22) {\n        peg$currPos += 10;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f17();\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMessage() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseArrow();\n      if (s4 !== peg$FAILED) {\n        s5 = input.charAt(peg$currPos);\n        if (peg$r1.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        s6 = peg$parse_();\n        s7 = peg$parseIdent();\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s9 = peg$c7;\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parse_();\n            s11 = peg$parseRestOfLine();\n            if (s11 !== peg$FAILED) {\n              s12 = peg$parseLineEnd();\n              if (s12 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f18(s2, s4, s5, s7, s11);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseArrow() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c23) {\n      s1 = peg$c23;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c24) {\n        s1 = peg$c24;\n        peg$currPos += 3;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      if (s1 === peg$FAILED) {\n        if (input.substr(peg$currPos, 3) === peg$c25) {\n          s1 = peg$c25;\n          peg$currPos += 3;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e27); }\n        }\n        if (s1 === peg$FAILED) {\n          if (input.substr(peg$currPos, 2) === peg$c26) {\n            s1 = peg$c26;\n            peg$currPos += 2;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e28); }\n          }\n          if (s1 === peg$FAILED) {\n            if (input.substr(peg$currPos, 3) === peg$c27) {\n              s1 = peg$c27;\n              peg$currPos += 3;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e29); }\n            }\n            if (s1 === peg$FAILED) {\n              if (input.substr(peg$currPos, 2) === peg$c28) {\n                s1 = peg$c28;\n                peg$currPos += 2;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e30); }\n              }\n              if (s1 === peg$FAILED) {\n                if (input.substr(peg$currPos, 3) === peg$c29) {\n                  s1 = peg$c29;\n                  peg$currPos += 3;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e31); }\n                }\n                if (s1 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 2) === peg$c30) {\n                    s1 = peg$c30;\n                    peg$currPos += 2;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e32); }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e33); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c31;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c32;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f19();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c31;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c32;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c31;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c32;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e36); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e37); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e37); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e37); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e37); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { SequenceDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutSequence } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { SequenceDocument, SeqParticipant, SeqMessage, SeqNote, SeqEvent } from './ir.js';\n\nexport const sequence: DiagramModule<SequenceDocument> = {\n  parseMermaid(input: string): SequenceDocument {\n    return parser.parse(input) as SequenceDocument;\n  },\n\n  parseYaml(input: string): SequenceDocument {\n    return JSON.parse(input) as SequenceDocument;\n  },\n\n  layout(ir: SequenceDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutSequence(ir, theme);\n  },\n};\n", "/**\n * @file graph/connect.ts \u2014 Edge endpoint helpers for node-link layouts.\n */\n\nexport interface BoxLike {\n  readonly x: number;\n  readonly y: number;\n  readonly width: number;\n  readonly height: number;\n}\n\n/**\n * The point on a box's border along the ray from its centre toward (tx, ty).\n * Used to clip connector lines to node boundaries.\n */\nexport function borderPoint(box: BoxLike, tx: number, ty: number): { x: number; y: number } {\n  const cx = box.x + box.width / 2;\n  const cy = box.y + box.height / 2;\n  const dx = tx - cx;\n  const dy = ty - cy;\n  if (dx === 0 && dy === 0) return { x: cx, y: cy };\n  const hw = box.width / 2;\n  const hh = box.height / 2;\n  const scale = 1 / Math.max(Math.abs(dx) / hw, Math.abs(dy) / hh);\n  return { x: cx + dx * scale, y: cy + dy * scale };\n}\n\nexport type Side = 'left' | 'right' | 'top' | 'bottom';\n\n/** The midpoint of one side of a box \u2014 an explicit anchor for slot pointers. */\nexport function slotAnchor(box: BoxLike, side: Side): { x: number; y: number } {\n  const cx = box.x + box.width / 2;\n  const cy = box.y + box.height / 2;\n  switch (side) {\n    case 'left':\n      return { x: box.x, y: cy };\n    case 'right':\n      return { x: box.x + box.width, y: cy };\n    case 'top':\n      return { x: cx, y: box.y };\n    case 'bottom':\n      return { x: cx, y: box.y + box.height };\n  }\n}\n\n/**\n * A slot-aware connector: clips both ends to the box borders along the line\n * joining their centres. Works for cells in a strip, nodes in a tree, or\n * panels in a poster (the same router the cross-link feature uses).\n */\nexport function connectSlots(\n  from: BoxLike,\n  to: BoxLike,\n): {\n  start: { x: number; y: number };\n  end: { x: number; y: number };\n} {\n  const fc = { x: from.x + from.width / 2, y: from.y + from.height / 2 };\n  const tc = { x: to.x + to.width / 2, y: to.y + to.height / 2 };\n  return {\n    start: borderPoint(from, tc.x, tc.y),\n    end: borderPoint(to, fc.x, fc.y),\n  };\n}\n", "/**\n * @file graph/layered.ts \u2014 Sugiyama layered graph placement kernel.\n *\n * Implements the full Sugiyama framework, with Phase 3 and Phase 4 ported\n * faithfully from dagre (https://github.com/dagrejs/dagre):\n *   1. Longest-path layer assignment\n *   2a. DFS back-edge detection (proper cycle identification)\n *   2b. Dummy node insertion for skip edges (spans > 1 layer)\n *   3. Dagre-faithful crossing minimisation \u2014 DFS initOrder, bi-directional\n *      barycenter sweeps with biasRight, dagre's sort() with unsortable-node\n *      interleaving, BIT-based cross-count feedback loop; keeps best ordering seen\n *   4. Dagre-faithful Brandes\u2013K\u00F6pf coordinate assignment \u2014 type-1 conflict\n *      detection, vertical alignment with NO isDummy guard (real\u2194dummy blocks),\n *      horizontal compaction (block graph, two-pass), 4 sweep directions,\n *      smallest-width selection, balance; plus our obstacle-aware dummy snap\n *   5. Dummy node removal + bend point extraction (edgeBends on LayeredResult)\n *\n * Shared by the node-link / UML diagram layouts (class, state, er, c4,\n * architecture, requirement, ds) so they all inherit crossing minimisation\n * and improved coordinate assignment automatically. Edge routing is left to\n * callers (they connect the returned boxes via the routing module).\n *\n * Deterministic: stable insertion order within a layer, no clock, no randomness.\n * Termination guaranteed: crossing-min loop exits after 4 non-improving sweeps.\n */\n\nimport { orthogonalRouter } from '../routing/router.js';\nimport { borderPoint } from './connect.js';\nimport type { Rect, PortDirection } from '../contracts/index.js';\n\nexport interface GraphNode {\n  readonly id: string;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport interface GraphEdge {\n  readonly from: string;\n  readonly to: string;\n}\n\n/** Internal dummy node inserted for skip edges (spans > 1 layer). */\ninterface DummyNode extends GraphNode {\n  readonly isDummy: true;\n  readonly originalEdgeIndex: number;\n  readonly segmentIndex: number;\n}\n\nfunction makeDummy(edgeIdx: number, segIdx: number): DummyNode {\n  return {\n    id: `__dummy_${edgeIdx}_${segIdx}`,\n    width: 0,\n    height: 0,\n    isDummy: true,\n    originalEdgeIndex: edgeIdx,\n    segmentIndex: segIdx,\n  };\n}\n\nexport interface NodeBox {\n  readonly id: string;\n  readonly x: number;\n  readonly y: number;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport interface LayeredOptions {\n  /** Primary flow direction. 'TB' stacks layers top\u2192bottom; 'LR' left\u2192right. */\n  readonly direction?: 'TB' | 'LR';\n  /** Gap between consecutive layers (px). */\n  readonly layerGap?: number;\n  /** Gap between sibling nodes within a layer (px). */\n  readonly nodeGap?: number;\n  /** Outer margin (px). */\n  readonly margin?: number;\n}\n\nexport interface LayeredResult {\n  readonly boxes: Map<string, NodeBox>;\n  readonly width: number;\n  readonly height: number;\n  /** Bend points for original skip edges (those that spanned > 1 layer).\n   *  Key = index into the original `edges` array passed to `layeredLayout`.\n   *  Value = ordered list of bend points in layout coordinates (no yOff applied). */\n  readonly edgeBends: Map<number, Array<{ x: number; y: number }>>;\n  /**\n   * Per-dummy node x values from each of the 4 BK sweeps, BEFORE balance.\n   * Key = dummy node id. Value = [ul_x, ur_x, dl_x, dr_x].\n   * Only populated for dummy nodes that belong to skip-edge chains.\n   * Used by the skip-routing optimizer in layout.ts as seed candidates.\n   */\n  readonly dummySweepXs: Map<string, number[]>;\n  /**\n   * Map from original edge index \u2192 ordered dummy node ids forming the skip chain.\n   * Empty for direct (non-skip) edges.\n   */\n  readonly dummyChainIds: Map<number, string[]>;\n}\n\n// \u2500\u2500\u2500 Phase 1: Layer Assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Assign each node a layer via longest-path; cycles are broken by a pass cap. */\nfunction assignLayers(\n  nodes: readonly GraphNode[],\n  edges: readonly GraphEdge[],\n  backEdgeSet?: Set<number>,\n): Map<string, number> {\n  const layer = new Map<string, number>();\n  for (const n of nodes) layer.set(n.id, 0);\n  const present = (id: string): boolean => layer.has(id);\n  // Relax edges up to N passes (caps cycles).\n  for (let pass = 0; pass < nodes.length; pass++) {\n    let changed = false;\n    for (let i = 0; i < edges.length; i++) {\n      if (backEdgeSet?.has(i)) continue;\n      const e = edges[i]!;\n      if (!present(e.from) || !present(e.to)) continue;\n      const want = layer.get(e.from)! + 1;\n      if (layer.get(e.to)! < want) {\n        layer.set(e.to, want);\n        changed = true;\n      }\n    }\n    if (!changed) break;\n  }\n  return layer;\n}\n\n// \u2500\u2500\u2500 Phase 2a: DFS Back-Edge Detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Identify back-edges using DFS: an edge u\u2192v is a back-edge when v is already\n * on the DFS stack (i.e. v is an ancestor of u). This correctly handles cycles\n * regardless of layer assignment, and correctly classifies self-loops (u\u2192u).\n *\n * Uses an iterative DFS to avoid call-stack overflow on deep graphs.\n * Returns a set of indices into `edges`.\n */\nfunction detectBackEdges(nodes: readonly GraphNode[], edges: readonly GraphEdge[]): Set<number> {\n  // Build adjacency list: node id \u2192 [{to, edgeIdx}]\n  const adj = new Map<string, Array<{ to: string; edgeIdx: number }>>();\n  for (const n of nodes) adj.set(n.id, []);\n  edges.forEach((e, i) => {\n    const list = adj.get(e.from);\n    if (list) list.push({ to: e.to, edgeIdx: i });\n  });\n\n  const visited = new Set<string>();\n  const onStack = new Set<string>();\n  const backEdges = new Set<number>();\n\n  for (const startNode of nodes) {\n    if (visited.has(startNode.id)) continue;\n\n    // Iterative DFS: each stack frame tracks [nodeId, neighborIndex].\n    const stack: Array<{ id: string; adjIdx: number }> = [];\n    visited.add(startNode.id);\n    onStack.add(startNode.id);\n    stack.push({ id: startNode.id, adjIdx: 0 });\n\n    while (stack.length > 0) {\n      const frame = stack[stack.length - 1]!;\n      const neighbors = adj.get(frame.id) ?? [];\n\n      if (frame.adjIdx >= neighbors.length) {\n        onStack.delete(frame.id);\n        stack.pop();\n      } else {\n        const { to, edgeIdx } = neighbors[frame.adjIdx]!;\n        frame.adjIdx++;\n\n        if (onStack.has(to)) {\n          backEdges.add(edgeIdx); // back edge (cycle or self-loop)\n        } else if (!visited.has(to)) {\n          visited.add(to);\n          onStack.add(to);\n          stack.push({ id: to, adjIdx: 0 });\n        }\n      }\n    }\n  }\n\n  return backEdges;\n}\n\n// \u2500\u2500\u2500 Phase 2b: Dummy Node Insertion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * For every forward edge u\u2192v spanning more than 1 layer, replace it with a\n * chain of virtual edges through dummy nodes inserted at each intermediate layer.\n *\n * Back edges are kept as-is (they are not expanded).\n *\n * Returns:\n *  - newNodes: original nodes + all dummy nodes\n *  - newEdges: replacement edge array (back edges preserved, skip edges replaced\n *    by chains of adjacent-layer segment edges)\n *  - newBackEdgeSet: back-edge indices in the newEdges array\n *  - dummyChains: original edge index \u2192 ordered list of dummy node ids\n *\n * The caller-supplied `layer` Map is mutated to include dummy node layer entries.\n */\nfunction insertDummyNodes(\n  nodes: readonly GraphNode[],\n  edges: readonly GraphEdge[],\n  layer: Map<string, number>,\n  backEdgeSet: Set<number>,\n): {\n  newNodes: GraphNode[];\n  newEdges: GraphEdge[];\n  newBackEdgeSet: Set<number>;\n  dummyChains: Map<number, string[]>;\n} {\n  const newNodes: GraphNode[] = [...nodes];\n  const newEdges: GraphEdge[] = [];\n  const newBackEdgeSet = new Set<number>();\n  const dummyChains = new Map<number, string[]>();\n\n  for (let i = 0; i < edges.length; i++) {\n    const e = edges[i]!;\n\n    if (backEdgeSet.has(i)) {\n      // Keep back edges as-is, recording new index.\n      newBackEdgeSet.add(newEdges.length);\n      newEdges.push(e);\n      continue;\n    }\n\n    const lu = layer.get(e.from) ?? 0;\n    const lv = layer.get(e.to) ?? 0;\n    const span = lv - lu;\n\n    if (span <= 1) {\n      // Adjacent-layer or same-layer forward edge: no expansion needed.\n      newEdges.push(e);\n      continue;\n    }\n\n    // Skip edge: create (span-1) dummy nodes at layers lu+1 \u2026 lv-1.\n    const dummies: string[] = [];\n    for (let seg = 0; seg < span - 1; seg++) {\n      const d = makeDummy(i, seg);\n      newNodes.push(d);\n      layer.set(d.id, lu + 1 + seg);\n      dummies.push(d.id);\n    }\n    dummyChains.set(i, dummies);\n\n    // Replace original edge with a chain: u \u2192 d0 \u2192 d1 \u2192 \u2026 \u2192 v\n    const chain = [e.from, ...dummies, e.to];\n    for (let s = 0; s < chain.length - 1; s++) {\n      newEdges.push({ from: chain[s]!, to: chain[s + 1]! });\n    }\n  }\n\n  return { newNodes, newEdges, newBackEdgeSet, dummyChains };\n}\n\n// \u2500\u2500\u2500 Phase 3 Helper: BIT-Based Crossing Count \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Count weighted edge crossings across all adjacent layer pairs.\n * Uses the O(E log N) BIT algorithm from Barth et al., \"Bilayer Cross Counting.\"\n * All edge weights are uniform (1). Back-edges and self-loops are excluded.\n */\nfunction crossCount(\n  byLayer: Map<number, GraphNode[]>,\n  edges: readonly GraphEdge[],\n  backEdgeSet: Set<number>,\n): number {\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n\n  const succList = new Map<string, string[]>();\n  for (const [, ns] of byLayer) for (const n of ns) succList.set(n.id, []);\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    succList.get(e.from)?.push(e.to);\n  });\n\n  let cc = 0;\n  for (let i = 1; i < layerKeys.length; i++) {\n    cc += bilayerCrossCount(byLayer.get(layerKeys[i - 1]!)!, byLayer.get(layerKeys[i]!)!, succList);\n  }\n  return cc;\n}\n\nfunction bilayerCrossCount(\n  northLayer: GraphNode[],\n  southLayer: GraphNode[],\n  succList: Map<string, string[]>,\n): number {\n  if (southLayer.length === 0) return 0;\n\n  const southPos = new Map<string, number>();\n  southLayer.forEach((n, i) => southPos.set(n.id, i));\n\n  const positions: number[] = northLayer.flatMap((n) =>\n    (succList.get(n.id) ?? [])\n      .filter((sid) => southPos.has(sid))\n      .map((sid) => southPos.get(sid)!)\n      .sort((a, b) => a - b),\n  );\n  if (positions.length === 0) return 0;\n\n  let firstIndex = 1;\n  while (firstIndex < southLayer.length) firstIndex <<= 1;\n  const treeSize = 2 * firstIndex - 1;\n  firstIndex -= 1;\n  const tree = new Array<number>(treeSize).fill(0);\n\n  let cc = 0;\n  for (const pos of positions) {\n    let idx = pos + firstIndex;\n    tree[idx] = (tree[idx] ?? 0) + 1;\n    let weightSum = 0;\n    while (idx > 0) {\n      if (idx % 2 === 1) weightSum += tree[idx + 1]!;\n      idx = (idx - 1) >> 1;\n      tree[idx] = (tree[idx] ?? 0) + 1;\n    }\n    cc += weightSum;\n  }\n  return cc;\n}\n\n// \u2500\u2500\u2500 Phase 3: Barycentric Crossing Minimisation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Reorder nodes within each layer to reduce edge crossings (Sugiyama Phase 3).\n * Uses the barycentric heuristic with bi-directional sweeps.\n *\n * - Back-edges and self-loops are excluded from barycenter computation.\n * - Nodes without neighbours in the reference layer keep their current relative\n *   order (their current position index is used as the barycenter).\n * - Tie-breaking uses the original insertion index \u2014 deterministic and stable.\n * - Sweeps continue until no strict improvement for 4 consecutive passes\n *   (measured via BIT-based cross-count); best ordering is returned.\n */\n/**\n * Port of dagre's order() \u2014 barycentric crossing minimisation.\n *\n * Uses DFS-based initOrder (from dagre's init-order.ts) then bi-directional\n * barycenter sweeps with dagre's sort logic: nodes without neighbours in the\n * reference layer (\"unsortable\") are re-inserted at their original index rather\n * than being sorted with an arbitrary barycenter value.\n */\nfunction minimizeCrossings(\n  byLayer: Map<number, GraphNode[]>,\n  edges: readonly GraphEdge[],\n  backEdgeSet: Set<number>,\n): Map<number, GraphNode[]> {\n  const predIds = new Map<string, string[]>();\n  const succIds = new Map<string, string[]>();\n  for (const [, ns] of byLayer) {\n    for (const n of ns) {\n      predIds.set(n.id, []);\n      succIds.set(n.id, []);\n    }\n  }\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    predIds.get(e.to)?.push(e.from);\n    succIds.get(e.from)?.push(e.to);\n  });\n\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n\n  const nodeById2 = new Map<string, GraphNode>();\n  const nodeLayer2 = new Map<string, number>();\n  for (const [lk, ns] of byLayer)\n    for (const n of ns) {\n      nodeById2.set(n.id, n);\n      nodeLayer2.set(n.id, lk);\n    }\n\n  // initOrder: DFS-based initial ordering (port of dagre's init-order.ts).\n  // Nodes visited first via DFS end up earlier in their layer, correlating\n  // initial order with edge directions and reducing starting crossings.\n  function initOrder(): Map<number, GraphNode[]> {\n    const visited = new Set<string>();\n    const layers = new Map<number, GraphNode[]>();\n    for (const k of layerKeys) layers.set(k, []);\n\n    function dfs(v: string): void {\n      if (visited.has(v)) return;\n      visited.add(v);\n      const lk = nodeLayer2.get(v);\n      if (lk !== undefined) layers.get(lk)?.push(nodeById2.get(v)!);\n      for (const w of succIds.get(v) ?? []) dfs(w);\n    }\n\n    // Visit all nodes sorted by layer (ascending) so DFS starts from roots first.\n    const allNodes = [...nodeById2.keys()].sort(\n      (a, b) => (nodeLayer2.get(a) ?? 0) - (nodeLayer2.get(b) ?? 0),\n    );\n    for (const v of allNodes) dfs(v);\n    return layers;\n  }\n\n  const order = initOrder();\n  const posInLayer = new Map<string, number>();\n  function rebuildPos(): void {\n    for (const [, ns] of order) ns.forEach((n, i) => posInLayer.set(n.id, i));\n  }\n  rebuildPos();\n\n  // Port of dagre's sort() \u2014 separates sortable (have barycenter) from unsortable\n  // (no neighbours) entries, then interleaves unsortable nodes at their original\n  // positions rather than lumping them at arbitrary barycenters.\n  function sortLayer(\n    layerIdx: number,\n    neighborMap: Map<string, string[]>,\n    biasRight: boolean,\n  ): void {\n    const curr = order.get(layerIdx)!;\n\n    const entries = curr.map((node, origIdx) => {\n      const nbrs = (neighborMap.get(node.id) ?? []).filter((w) => posInLayer.has(w));\n      if (nbrs.length === 0) return { node, barycenter: undefined as number | undefined, origIdx };\n      const sum = nbrs.reduce((s, nid) => s + posInLayer.get(nid)!, 0);\n      return { node, barycenter: sum / nbrs.length, origIdx };\n    });\n\n    const sortable = entries.filter((e) => e.barycenter !== undefined);\n    const unsortable = entries\n      .filter((e) => e.barycenter === undefined)\n      .sort((a, b) => b.origIdx - a.origIdx); // descending \u2192 pop from end gives ascending\n\n    sortable.sort((a, b) => {\n      if (a.barycenter! !== b.barycenter!) return a.barycenter! - b.barycenter!;\n      return biasRight ? b.origIdx - a.origIdx : a.origIdx - b.origIdx;\n    });\n\n    const result: GraphNode[] = [];\n    let vsIndex = 0;\n\n    // Re-insert unsortable nodes at their original position indices (dagre's consumeUnsortable).\n    function consumeUnsortable(): void {\n      while (unsortable.length && unsortable[unsortable.length - 1]!.origIdx <= vsIndex) {\n        result.push(unsortable.pop()!.node);\n        vsIndex++;\n      }\n    }\n\n    consumeUnsortable();\n    for (const entry of sortable) {\n      result.push(entry.node);\n      vsIndex++;\n      consumeUnsortable();\n    }\n\n    order.set(layerIdx, result);\n    rebuildPos();\n  }\n\n  let bestCC = crossCount(order, edges, backEdgeSet);\n  const best = new Map<number, GraphNode[]>();\n  for (const [k, v] of order) best.set(k, [...v]);\n\n  for (let pass = 0, lastBest = 0; lastBest < 4; pass++, lastBest++) {\n    const biasRight = pass % 4 >= 2;\n    if (pass % 2 === 0) {\n      // Down sweep: fix each layer using its predecessors.\n      for (let li = 1; li < layerKeys.length; li++) sortLayer(layerKeys[li]!, predIds, biasRight);\n    } else {\n      // Up sweep: fix each layer using its successors.\n      for (let li = layerKeys.length - 2; li >= 0; li--)\n        sortLayer(layerKeys[li]!, succIds, biasRight);\n    }\n    const cc = crossCount(order, edges, backEdgeSet);\n    if (cc < bestCC) {\n      lastBest = 0;\n      bestCC = cc;\n      for (const [k, v] of order) best.set(k, [...v]);\n    } else if (cc === bestCC) {\n      for (const [k, v] of order) best.set(k, [...v]);\n    }\n  }\n\n  return best;\n}\n\n// \u2500\u2500\u2500 Phase 4: Full Brandes\u2013K\u00F6pf Coordinate Assignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Assign cross-axis positions using the full Brandes\u2013K\u00F6pf algorithm adapted for\n * Triton's data structures (Map<number, GraphNode[]>, no Graph object).\n *\n * Steps: (1) type-1 conflict detection, (2) vertical alignment (block chains),\n * (3) horizontal compaction (block graph, two-pass min then compact) \u2014 run for\n * 4 sweep directions (ul, ur, dl, dr). Then (4) pick tightest layout, (5) align\n * all 4 to share its min/max, (6) balance each node as median of 4 aligned values.\n */\nfunction assignCoordinatesBK4(\n  byLayer: Map<number, GraphNode[]>,\n  edges: readonly GraphEdge[],\n  backEdgeSet: Set<number>,\n  isLR: boolean,\n  nodeGap: number,\n  layerGap: number,\n  margin: number,\n): { boxes: Map<string, NodeBox>; dummySweepXs: Map<string, number[]> } {\n  const cross = (n: GraphNode) => (isLR ? n.height : n.width);\n  const along = (n: GraphNode) => (isLR ? n.width : n.height);\n  const isDummy = (id: string) => id.startsWith('__dummy_');\n\n  const nodeById = new Map<string, GraphNode>();\n  for (const [, ns] of byLayer) for (const n of ns) nodeById.set(n.id, n);\n\n  // Minimum centre-to-centre separation between adjacent nodes in a layer.\n  // Zero-width dummy nodes are invisible waypoints; they impose no gap on\n  // neighbouring real nodes so that real nodes can align freely.\n  function sep(a: string, b: string): number {\n    if (isDummy(a) || isDummy(b)) return 0;\n    const an = nodeById.get(a)!;\n    const bn = nodeById.get(b)!;\n    return cross(an) / 2 + nodeGap + cross(bn) / 2;\n  }\n\n  const layerKeys = [...byLayer.keys()].sort((a, b) => a - b);\n  const numLayers = layerKeys.length;\n  const baseLayers: string[][] = layerKeys.map((lk) => byLayer.get(lk)!.map((n) => n.id));\n\n  // Map each node id \u2192 its layer position index (0-based).\n  const nodeLayerIdx = new Map<string, number>();\n  for (let li = 0; li < numLayers; li++) {\n    for (const id of baseLayers[li]!) nodeLayerIdx.set(id, li);\n  }\n\n  const predMap = new Map<string, string[]>();\n  const succMap = new Map<string, string[]>();\n  for (const [, ns] of byLayer)\n    for (const n of ns) {\n      predMap.set(n.id, []);\n      succMap.set(n.id, []);\n    }\n  edges.forEach((e, i) => {\n    if (backEdgeSet.has(i) || e.from === e.to) return;\n    predMap.get(e.to)?.push(e.from);\n    succMap.get(e.from)?.push(e.to);\n  });\n\n  // \u2500\u2500 BK Step 1: Type-1 Conflict Detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // A type-1 conflict: a non-inner edge crosses an inner segment (dummy\u2192dummy).\n  const conflicts = new Set<string>();\n  const ck = (u: string, v: string) => (u < v ? `${u}\\0${v}` : `${v}\\0${u}`);\n  const addConflict = (u: string, v: string) => conflicts.add(ck(u, v));\n  const hasConflict = (u: string, v: string) => conflicts.has(ck(u, v));\n\n  for (let li = 1; li < numLayers; li++) {\n    const prevLayer = baseLayers[li - 1]!;\n    const layer = baseLayers[li]!;\n\n    const prevPos = new Map<string, number>();\n    prevLayer.forEach((id, i) => prevPos.set(id, i));\n\n    let k0 = 0;\n    let scanPos = 0;\n    const lastNode = layer[layer.length - 1];\n\n    layer.forEach((v, i) => {\n      let innerPredPos: number | undefined;\n      if (isDummy(v)) {\n        for (const u of predMap.get(v) ?? []) {\n          if (isDummy(u) && prevPos.has(u)) {\n            innerPredPos = prevPos.get(u)!;\n            break;\n          }\n        }\n      }\n      const k1 = innerPredPos !== undefined ? innerPredPos : prevLayer.length;\n\n      if (innerPredPos !== undefined || v === lastNode) {\n        for (let si = scanPos; si <= i; si++) {\n          const sn = layer[si]!;\n          for (const u of predMap.get(sn) ?? []) {\n            if (!prevPos.has(u)) continue;\n            const uPos = prevPos.get(u)!;\n            if ((uPos < k0 || uPos > k1) && !(isDummy(u) && isDummy(sn))) {\n              addConflict(u, sn);\n            }\n          }\n        }\n        scanPos = i + 1;\n        k0 = k1;\n      }\n    });\n  }\n\n  // \u2500\u2500 BK Step 2: Vertical Alignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // \u2500\u2500 BK Step 2: Vertical Alignment (port of dagre's bk.ts verticalAlignment) \u2500\u2500\n  // Dagre has NO isDummy guard here \u2014 real\u2194dummy alignment is intentional:\n  // it forms the block chains that make skip-edge segments travel in straight lines.\n  function verticalAlignment(\n    sweepLayers: readonly string[][],\n    neighborFn: (v: string) => string[],\n  ): { root: Map<string, string>; align: Map<string, string> } {\n    const root = new Map<string, string>();\n    const align = new Map<string, string>();\n    const pos = new Map<string, number>();\n\n    for (const layer of sweepLayers) {\n      layer.forEach((v, i) => {\n        root.set(v, v);\n        align.set(v, v);\n        pos.set(v, i);\n      });\n    }\n\n    for (const layer of sweepLayers) {\n      let prevIdx = -1;\n      for (const v of layer) {\n        // All nodes participate \u2014 dummies form blocks with real nodes to straighten skip edges.\n        const wsRaw = neighborFn(v);\n        if (!wsRaw.length) continue;\n\n        const ws = wsRaw.filter((w) => pos.has(w)).sort((a, b) => pos.get(a)! - pos.get(b)!);\n        if (ws.length === 0) continue;\n\n        const mp = (ws.length - 1) / 2;\n        for (let mi = Math.floor(mp), mEnd = Math.ceil(mp); mi <= mEnd; mi++) {\n          const w = ws[mi]!;\n          const wPos = pos.get(w)!;\n          if (align.get(v) === v && prevIdx < wPos && !hasConflict(v, w)) {\n            align.set(w, v);\n            root.set(v, root.get(w)!);\n            align.set(v, root.get(v)!);\n            prevIdx = wPos;\n          }\n        }\n      }\n    }\n    return { root, align };\n  }\n\n  // \u2500\u2500 BK Step 3: Horizontal Compaction \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  function horizontalCompaction(\n    sweepLayers: readonly string[][],\n    root: Map<string, string>,\n  ): Map<string, number> {\n    const blockSucc = new Map<string, Map<string, number>>();\n    const blockPred = new Map<string, Map<string, number>>();\n\n    function ensureBlock(r: string): void {\n      if (!blockSucc.has(r)) {\n        blockSucc.set(r, new Map());\n        blockPred.set(r, new Map());\n      }\n    }\n\n    for (const layer of sweepLayers) {\n      let prevId: string | undefined;\n      for (const v of layer) {\n        const rv = root.get(v)!;\n        ensureBlock(rv);\n        if (prevId !== undefined) {\n          const rp = root.get(prevId)!;\n          if (rp !== rv) {\n            const w = sep(prevId, v);\n            const curW = blockSucc.get(rp)!.get(rv) ?? 0;\n            if (w > curW) {\n              blockSucc.get(rp)!.set(rv, w);\n              blockPred.get(rv)!.set(rp, w);\n            }\n          }\n        }\n        prevId = v;\n      }\n    }\n\n    const xs = new Map<string, number>();\n\n    function iterate(\n      applyFn: (elem: string) => void,\n      nextFn: (elem: string) => Iterable<string>,\n    ): void {\n      const stack = [...blockSucc.keys()];\n      const visited = new Set<string>();\n      while (stack.length > 0) {\n        const elem = stack[stack.length - 1]!;\n        if (visited.has(elem)) {\n          stack.pop();\n          applyFn(elem);\n        } else {\n          visited.add(elem);\n          for (const nxt of nextFn(elem)) stack.push(nxt);\n        }\n      }\n    }\n\n    // Pass 1: assign minimum coordinates.\n    iterate(\n      (elem) => {\n        let max = 0;\n        for (const [from, w] of blockPred.get(elem) ?? new Map())\n          max = Math.max(max, (xs.get(from) ?? 0) + w);\n        xs.set(elem, max);\n      },\n      (elem) => blockPred.get(elem)?.keys() ?? [],\n    );\n\n    // Pass 2: compact rightward (remove slack).\n    iterate(\n      (elem) => {\n        const succs = blockSucc.get(elem);\n        if (succs && succs.size > 0) {\n          let min = Infinity;\n          for (const [to, w] of succs) min = Math.min(min, (xs.get(to) ?? 0) - w);\n          if (min !== Infinity) xs.set(elem, Math.max(xs.get(elem) ?? 0, min));\n        }\n      },\n      (elem) => blockSucc.get(elem)?.keys() ?? [],\n    );\n\n    // Propagate block-root coordinates to all member nodes.\n    for (const layer of sweepLayers) {\n      for (const v of layer) xs.set(v, xs.get(root.get(v)!)!);\n    }\n    return xs;\n  }\n\n  // \u2500\u2500 BK Step 4: Run 4 independent sweeps \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const xss = new Map<string, Map<string, number>>();\n\n  for (const vert of ['u', 'd'] as const) {\n    const vertLayers = vert === 'u' ? baseLayers : [...baseLayers].reverse();\n    for (const horiz of ['l', 'r'] as const) {\n      const sweepLayers =\n        horiz === 'r' ? vertLayers.map((layer) => [...layer].reverse()) : vertLayers;\n      const neighborFn =\n        vert === 'u' ? (v: string) => predMap.get(v) ?? [] : (v: string) => succMap.get(v) ?? [];\n\n      const { root } = verticalAlignment(sweepLayers, neighborFn);\n      let xs = horizontalCompaction(sweepLayers, root);\n\n      if (horiz === 'r') {\n        // RL compaction works in a reversed coordinate space; negate to restore.\n        const neg = new Map<string, number>();\n        for (const [k, v] of xs) neg.set(k, -v);\n        xs = neg;\n      }\n      xss.set(vert + horiz, xs);\n    }\n  }\n\n  // Capture pre-balance x values for every dummy node across the 4 sweeps.\n  // Sweep key order: ul=0, ur=1, dl=2, dr=3.\n  const SWEEP_KEYS = ['ul', 'ur', 'dl', 'dr'] as const;\n  const dummySweepXs = new Map<string, number[]>();\n  for (const id of nodeById.keys()) {\n    if (!isDummy(id)) continue;\n    const vals = SWEEP_KEYS.map((k) => xss.get(k)?.get(id) ?? 0);\n    dummySweepXs.set(id, vals);\n  }\n\n  // \u2500\u2500 BK Step 5: Find smallest-width alignment \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  let minSpan = Infinity;\n  let smallestXs = xss.get('ul')!;\n  for (const [, xs] of xss) {\n    let lo = Infinity,\n      hi = -Infinity;\n    for (const [id, x] of xs) {\n      const n = nodeById.get(id);\n      if (!n) continue;\n      const half = cross(n) / 2;\n      lo = Math.min(lo, x - half);\n      hi = Math.max(hi, x + half);\n    }\n    if (hi - lo < minSpan) {\n      minSpan = hi - lo;\n      smallestXs = xs;\n    }\n  }\n\n  // \u2500\u2500 BK Step 6: Align all 4 layouts to the smallest-width one \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const refVals = [...smallestXs.values()];\n  const refMin = Math.min(...refVals);\n  const refMax = Math.max(...refVals);\n\n  for (const [key, xs] of xss) {\n    if (xs === smallestXs) continue;\n    const vals = [...xs.values()];\n    const isRight = key.endsWith('r');\n    const delta = isRight ? refMax - Math.max(...vals) : refMin - Math.min(...vals);\n    if (delta !== 0) {\n      const shifted = new Map<string, number>();\n      for (const [id, x] of xs) shifted.set(id, x + delta);\n      xss.set(key, shifted);\n    }\n  }\n\n  // \u2500\u2500 BK Step 7: Balance \u2014 per-node median of the 4 aligned values \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const balanced = new Map<string, number>();\n  for (const [id] of xss.get('ul')!) {\n    const vals = [...xss.values()].map((xs) => xs.get(id) ?? 0).sort((a, b) => a - b);\n    balanced.set(id, ((vals[1] ?? 0) + (vals[2] ?? 0)) / 2);\n  }\n\n  // \u2500\u2500 Column snap: align directly-connected adjacent-layer node chains \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Build chains (union-find) over direct edges between adjacent layers where the\n  // BK misalignment is small. Then snap each chain to the median balanced x of its\n  // members. Running per-edge would cause double-snap interference on multi-node\n  // chains (e.g. A\u2192B and B\u2192C would shift B twice with different partners).\n  const COLUMN_SNAP_EPSILON = 6; // px \u2014 only snap if misalignment is smaller than this\n\n  const csParent = new Map<string, string>();\n  const csFind = (id: string): string => {\n    let r = csParent.get(id) ?? id;\n    while (csParent.get(r) !== undefined && csParent.get(r) !== r) r = csParent.get(r)!;\n    csParent.set(id, r);\n    return r;\n  };\n  const csUnion = (a: string, b: string): void => {\n    const ra = csFind(a),\n      rb = csFind(b);\n    if (ra !== rb) csParent.set(ra, rb);\n  };\n\n  edges.forEach((edge, i) => {\n    if (backEdgeSet.has(i) || edge.from === edge.to) return;\n    if (isDummy(edge.from) || isDummy(edge.to)) return;\n\n    const fromLayer = nodeLayerIdx.get(edge.from);\n    const toLayer = nodeLayerIdx.get(edge.to);\n    if (fromLayer === undefined || toLayer === undefined) return;\n    if (Math.abs(toLayer - fromLayer) !== 1) return;\n\n    const fromX = balanced.get(edge.from);\n    const toX = balanced.get(edge.to);\n    if (fromX === undefined || toX === undefined) return;\n    if (Math.abs(fromX - toX) > COLUMN_SNAP_EPSILON) return;\n\n    csUnion(edge.from, edge.to);\n  });\n\n  // Group chain members and snap each chain to its median balanced x.\n  const csGroups = new Map<string, string[]>();\n  for (const id of balanced.keys()) {\n    if (isDummy(id)) continue;\n    const root = csFind(id);\n    if (!csGroups.has(root)) csGroups.set(root, []);\n    csGroups.get(root)!.push(id);\n  }\n  for (const members of csGroups.values()) {\n    if (members.length < 2) continue;\n    const xs = members.map((id) => balanced.get(id)!).sort((a, b) => a - b);\n    const medX =\n      xs.length % 2 === 1\n        ? xs[Math.floor(xs.length / 2)]!\n        : (xs[xs.length / 2 - 1]! + xs[xs.length / 2]!) / 2;\n    for (const id of members) balanced.set(id, medX);\n  }\n\n  // Shift so the leftmost node's left edge sits at `margin`.\n  let minLeft = Infinity;\n  for (const [id, cx] of balanced) {\n    const n = nodeById.get(id);\n    if (n) minLeft = Math.min(minLeft, cx - cross(n) / 2);\n  }\n  const shift = margin - (isFinite(minLeft) ? minLeft : 0);\n\n  // \u2500\u2500 Build NodeBox results \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const nodePos = new Map<string, NodeBox>();\n  let alongCursor = margin;\n\n  for (let li = 0; li < numLayers; li++) {\n    const layerIdx = layerKeys[li]!;\n    const ns = byLayer.get(layerIdx)!;\n    const layerSize = ns.length > 0 ? Math.max(...ns.map(along)) : 0;\n\n    for (const node of ns) {\n      const cx = (balanced.get(node.id) ?? 0) + shift;\n      const crossLeft = cx - cross(node) / 2;\n      const alongPos =\n        isDummy(node.id) && li > 0\n          ? alongCursor - layerGap / 2\n          : alongCursor + (layerSize - along(node)) / 2;\n\n      nodePos.set(node.id, {\n        id: node.id,\n        x: isLR ? alongPos : crossLeft,\n        y: isLR ? crossLeft : alongPos,\n        width: node.width,\n        height: node.height,\n      });\n    }\n    alongCursor += layerSize + layerGap;\n  }\n\n  return { boxes: nodePos, dummySweepXs };\n}\n\n// \u2500\u2500\u2500 Public Entry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layeredLayout(\n  nodes: readonly GraphNode[],\n  edges: readonly GraphEdge[],\n  options: LayeredOptions = {},\n): LayeredResult {\n  const direction = options.direction ?? 'TB';\n  const layerGap = options.layerGap ?? 70;\n  const nodeGap = options.nodeGap ?? 40;\n  const margin = options.margin ?? 32;\n  const isLR = direction === 'LR';\n\n  if (nodes.length === 0)\n    return {\n      boxes: new Map(),\n      width: margin * 2,\n      height: margin * 2,\n      edgeBends: new Map(),\n      dummySweepXs: new Map(),\n      dummyChainIds: new Map(),\n    };\n\n  // Phase 1: Back-edge detection (DFS).\n  const backEdges = detectBackEdges(nodes, edges);\n\n  // Phase 2a: Layer assignment (ignoring back-edges so cycles don't inflate layers).\n  const layer = assignLayers(nodes, edges, backEdges);\n\n  // Phase 2b: Dummy node insertion for skip edges (spans > 1 layer).\n  // `layer` is mutated to include dummy node layer assignments.\n  const { newNodes, newEdges, newBackEdgeSet, dummyChains } = insertDummyNodes(\n    nodes,\n    edges,\n    layer,\n    backEdges,\n  );\n\n  // Rebuild byLayer with all nodes (real + dummy).\n  const newMaxLayer = Math.max(...newNodes.map((n) => layer.get(n.id)!));\n  const byLayerArr: Map<number, GraphNode[]> = new Map();\n  for (let i = 0; i <= newMaxLayer; i++) byLayerArr.set(i, []);\n  for (const n of newNodes) byLayerArr.get(layer.get(n.id)!)!.push(n);\n\n  // Phase 3: Crossing minimisation (barycentric, bi-directional sweeps).\n  const orderedByLayer = minimizeCrossings(byLayerArr, newEdges, newBackEdgeSet);\n\n  // Phase 4: Full 4-layout B\u2013K coordinate assignment (variable node sizes).\n  const { boxes: allBoxesMap, dummySweepXs } = assignCoordinatesBK4(\n    orderedByLayer,\n    newEdges,\n    newBackEdgeSet,\n    isLR,\n    nodeGap,\n    layerGap,\n    margin,\n  );\n\n  // Phase 5: Extract bend points from dummy node positions.\n  const edgeBends = new Map<number, Array<{ x: number; y: number }>>();\n  for (const [origEdgeIdx, dummyIds] of dummyChains) {\n    const bends = dummyIds.map((id) => {\n      const b = allBoxesMap.get(id)!;\n      return { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n    });\n    edgeBends.set(origEdgeIdx, bends);\n  }\n\n  // Remove dummy nodes from result boxes (callers only see real nodes).\n  const boxes = new Map<string, NodeBox>();\n  for (const [id, box] of allBoxesMap) {\n    if (!id.startsWith('__dummy_')) boxes.set(id, box);\n  }\n\n  // Phase 6: Compact gaps between disconnected subgraphs.\n  if (boxes.size > 1) {\n    const uf = new Map<string, string>(nodes.map((n) => [n.id, n.id]));\n    const find = (x: string): string => {\n      while (uf.get(x) !== x) {\n        uf.set(x, uf.get(uf.get(x)!)!);\n        x = uf.get(x)!;\n      }\n      return x;\n    };\n    for (const e of edges) {\n      if (boxes.has(e.from) && boxes.has(e.to)) {\n        const ra = find(e.from),\n          rb = find(e.to);\n        if (ra !== rb) uf.set(ra, rb);\n      }\n    }\n    const comps = new Map<string, string[]>();\n    for (const id of boxes.keys()) {\n      const r = find(id);\n      if (!comps.has(r)) comps.set(r, []);\n      comps.get(r)!.push(id);\n    }\n    if (comps.size > 1) {\n      const compInfos = [...comps.values()]\n        .map((ids) => ({\n          ids,\n          left: Math.min(...ids.map((id) => boxes.get(id)!.x)),\n          right: Math.max(...ids.map((id) => boxes.get(id)!.x + boxes.get(id)!.width)),\n        }))\n        .sort((a, b) => a.left - b.left);\n\n      let cursor = compInfos[0]!.right;\n      for (let ci = 1; ci < compInfos.length; ci++) {\n        const comp = compInfos[ci]!;\n        const gap = comp.left - cursor;\n        const targetGap = nodeGap * 2;\n        if (gap > targetGap) {\n          const dx = -(gap - targetGap);\n          for (const id of comp.ids) {\n            const b = boxes.get(id)!;\n            boxes.set(id, { id: b.id, x: b.x + dx, y: b.y, width: b.width, height: b.height });\n          }\n          comp.left += dx;\n          comp.right += dx;\n        }\n        cursor = comp.right;\n      }\n    }\n  }\n\n  // Compute total diagram dimensions from placed real boxes.\n  const allBoxes = [...boxes.values()];\n  const width =\n    allBoxes.length > 0 ? Math.max(...allBoxes.map((b) => b.x + b.width)) + margin : margin * 2;\n  const height =\n    allBoxes.length > 0 ? Math.max(...allBoxes.map((b) => b.y + b.height)) + margin : margin * 2;\n\n  return { boxes, width, height, edgeBends, dummySweepXs, dummyChainIds: dummyChains };\n}\n\n// \u2500\u2500\u2500 Straight-line obstacle check \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Returns true if segment p1\u2192p2 does not pass through the strict interior of\n * any obstacle (with padding). Uses Liang\u2013Barsky clipping.\n */\nfunction straightLineObstacleFree(\n  p1: { x: number; y: number },\n  p2: { x: number; y: number },\n  obstacles: ReadonlyArray<Rect>,\n  padding: number,\n): boolean {\n  const dx = p2.x - p1.x,\n    dy = p2.y - p1.y;\n  for (const obs of obstacles) {\n    const xmin = obs.x - padding,\n      xmax = obs.x + obs.width + padding;\n    const ymin = obs.y - padding,\n      ymax = obs.y + obs.height + padding;\n    let tmin = 0,\n      tmax = 1;\n    const clips = [\n      { p: -dx, q: p1.x - xmin },\n      { p: dx, q: xmax - p1.x },\n      { p: -dy, q: p1.y - ymin },\n      { p: dy, q: ymax - p1.y },\n    ];\n    let crosses = true;\n    for (const { p, q } of clips) {\n      if (Math.abs(p) < 1e-10) {\n        if (q <= 0) {\n          crosses = false;\n          break;\n        }\n      } else {\n        const t = q / p;\n        if (p < 0) tmin = Math.max(tmin, t);\n        else tmax = Math.min(tmax, t);\n        if (tmin >= tmax) {\n          crosses = false;\n          break;\n        }\n      }\n    }\n    if (crosses) return false; // this obstacle blocks the straight line\n  }\n  return true;\n}\n\n// \u2500\u2500\u2500 Obstacle-Avoiding Edge Routing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Route an edge between two node boxes with obstacle avoidance.\n *\n * If a straight line from `fromPt` to `toPt` is unobstructed, it is used\n * directly. Otherwise the orthogonal router produces a bent path.\n *\n * @param fromBox   Source node box (in laid.boxes coordinates).\n * @param toBox     Target node box (in laid.boxes coordinates).\n * @param allBoxes  All node boxes in the diagram (obstacles are inferred from these).\n * @param yOff      Vertical offset to apply (e.g. title height) when computing world coords.\n * @param fromPt    Optional explicit source attachment point (overrides borderPoint).\n * @param toPt      Optional explicit target attachment point (overrides borderPoint).\n */\nexport function routeEdge(\n  fromBox: NodeBox,\n  toBox: NodeBox,\n  allBoxes: ReadonlyArray<NodeBox>,\n  yOff = 0,\n  fromPt?: { x: number; y: number },\n  toPt?: { x: number; y: number },\n  forceOrthogonal = false,\n): { path: string; labelMidpoint: { x: number; y: number } } {\n  const fromRect: Rect = {\n    x: fromBox.x,\n    y: fromBox.y + yOff,\n    width: fromBox.width,\n    height: fromBox.height,\n  };\n  const toRect: Rect = { x: toBox.x, y: toBox.y + yOff, width: toBox.width, height: toBox.height };\n\n  const fromCx = fromRect.x + fromRect.width / 2;\n  const fromCy = fromRect.y + fromRect.height / 2;\n  const toCx = toRect.x + toRect.width / 2;\n  const toCy = toRect.y + toRect.height / 2;\n\n  // Infer port directions from geometry (favour dominant axis).\n  const dx = toCx - fromCx;\n  const dy = toCy - fromCy;\n  let fromDir: PortDirection;\n  let toDir: PortDirection;\n  if (Math.abs(dy) >= Math.abs(dx)) {\n    fromDir = dy > 0 ? 'S' : 'N';\n    toDir = dy > 0 ? 'N' : 'S';\n  } else {\n    fromDir = dx > 0 ? 'E' : 'W';\n    toDir = dx > 0 ? 'W' : 'E';\n  }\n\n  // Use caller-supplied attachment points when provided; otherwise clip to border.\n  const pa = fromPt ?? borderPoint(fromRect, toCx, toCy);\n  const pb = toPt ?? borderPoint(toRect, fromCx, fromCy);\n\n  // Every box that is neither the source nor the target is an obstacle.\n  const fromId = fromBox.id;\n  const toId = toBox.id;\n  const obstacles: Rect[] = allBoxes\n    .filter((b) => b.id !== fromId && b.id !== toId)\n    .map((b) => ({ x: b.x, y: b.y + yOff, width: b.width, height: b.height }));\n\n  // Fast path: use a straight line when no obstacle blocks it.\n  // Skipped when forceOrthogonal=true (e.g. class diagrams require rectilinear routing).\n  if (\n    !forceOrthogonal &&\n    (obstacles.length === 0 || straightLineObstacleFree(pa, pb, obstacles, 10))\n  ) {\n    return {\n      path: `M ${pa.x} ${pa.y} L ${pb.x} ${pb.y}`,\n      labelMidpoint: { x: (pa.x + pb.x) / 2, y: (pa.y + pb.y) / 2 },\n    };\n  }\n\n  const route = orthogonalRouter.route({\n    from: pa,\n    to: pb,\n    style: 'orthogonal',\n    obstacles,\n    padding: 10,\n    fromDir,\n    toDir,\n  });\n\n  // Fallback: if the router produces an empty path, use a straight line.\n  // When forceOrthogonal is set, prefer a degenerate orthogonal path (V+H) over diagonal.\n  const path =\n    route.path ||\n    (forceOrthogonal\n      ? `M ${pa.x} ${pa.y} L ${pa.x} ${pb.y} L ${pb.x} ${pb.y}`\n      : `M ${pa.x} ${pa.y} L ${pb.x} ${pb.y}`);\n  return { path, labelMidpoint: route.labelPosition };\n}\n", "/**\n * @file diagrams/class/layout.ts \u2014 UML class diagram.\n *\n * Classes render as three-compartment boxes (name/stereotype, attributes,\n * methods); placement uses the shared layered kernel (inheritance points up).\n * Relationships draw as straight connectors clipped to box borders with\n * UML end markers (triangle / diamond / arrow) plus cardinality + labels.\n */\n\nimport type { ClassDocument, ClassBox, RelEnd } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport {\n  layeredLayout,\n  routeEdge,\n  type GraphNode,\n  type GraphEdge,\n  type NodeBox,\n} from '../../../graph/layered.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\n// \u2500\u2500 Skip-edge routing helpers (module-level) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Axis-aligned segment stored as an inflated rect for overlap detection. */\ninterface RoutedSegment {\n  x1: number;\n  y1: number; // top-left\n  x2: number;\n  y2: number; // bottom-right (x2 >= x1, y2 >= y1)\n}\n\n/** A scored routing candidate carrying full path geometry for one wall-pair strategy. */\ninterface RouteCandidate {\n  strategy: 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'V' | 'X1' | 'X2';\n  laneX: number;\n  segments: Array<[number, number, number, number]>;\n  labelMid: { x: number; y: number };\n  isMixed: boolean; // true for D, E, F \u2014 wall-pair penalty applies\n}\n\n/** True if axis-aligned segment (x1,y1)\u2192(x2,y2) passes through box interior. */\nfunction segmentIntersectsBox(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  box: NodeBox,\n): boolean {\n  const bx1 = box.x,\n    bx2 = box.x + box.width;\n  const by1 = box.y,\n    by2 = box.y + box.height;\n  if (y1 === y2) {\n    const lx = Math.min(x1, x2),\n      rx = Math.max(x1, x2);\n    return y1 > by1 && y1 < by2 && lx < bx2 && rx > bx1;\n  }\n  const ty = Math.min(y1, y2),\n    by = Math.max(y1, y2);\n  return x1 > bx1 && x1 < bx2 && ty < by2 && by > by1;\n}\n\n/** Convert a segment to a 2px-wide axis-aligned rect. */\nfunction toRect(x1: number, y1: number, x2: number, y2: number): RoutedSegment {\n  const W = 1;\n  return {\n    x1: Math.min(x1, x2) - W,\n    y1: Math.min(y1, y2) - W,\n    x2: Math.max(x1, x2) + W,\n    y2: Math.max(y1, y2) + W,\n  };\n}\n\n/** Returns the shared axis length between two RoutedSegment rects. */\nfunction rectsOverlapLength(a: RoutedSegment, b: RoutedSegment): number {\n  const ox = Math.min(a.x2, b.x2) - Math.max(a.x1, b.x1);\n  const oy = Math.min(a.y2, b.y2) - Math.max(a.y1, b.y1);\n  if (ox <= 0 || oy <= 0) return 0;\n  return Math.max(ox, oy);\n}\n\nconst CLEARANCE = 12; // obstacle avoidance (right-side, inter-column)\nconst LANE_CLEARANCE = 48; // visual breathing room for left/right margin lanes\n\n/** True if point (lx, ly) falls inside any of the given boxes. */\nfunction labelInBox(lx: number, ly: number, boxes: NodeBox[], padding = 8): boolean {\n  return boxes.some(\n    (b) =>\n      lx > b.x - padding &&\n      lx < b.x + b.width + padding &&\n      ly > b.y - padding &&\n      ly < b.y + b.height + padding,\n  );\n}\n\n/** Remove values within tol pixels of each other (keep first occurrence). */\nfunction dedup(arr: number[], tol: number): number[] {\n  const result: number[] = [];\n  for (const v of arr) {\n    if (!result.some((r) => Math.abs(r - v) < tol)) result.push(v);\n  }\n  return result;\n}\n\n/** Render a segment list to an SVG path string. */\nfunction segmentsToPath(segs: Array<[number, number, number, number]>): string {\n  if (segs.length === 0) return '';\n  if (segs.length === 1) {\n    return `M ${rhu(segs[0]![0])} ${rhu(segs[0]![1])} L ${rhu(segs[0]![2])} ${rhu(segs[0]![3])}`;\n  }\n  const pts: string[] = [`M ${rhu(segs[0]![0])} ${rhu(segs[0]![1])}`];\n  for (const [, , x2, y2] of segs) pts.push(`L ${rhu(x2)} ${rhu(y2)}`);\n  return pts.join(' ');\n}\n\n// \u2500\u2500 Port-assignment helpers (module-level) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype Wall = 'top' | 'bottom' | 'left' | 'right';\n\n// \u2500\u2500 Edge classification (module-level) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype EdgeClass =\n  | 'direct-same-column'\n  | 'direct-cross-column'\n  | 'skip-same-column'\n  | 'skip-cross-column';\n\nfunction classifyEdge(\n  a: NodeBox,\n  b: NodeBox,\n  bends: Array<{ x: number; y: number }> | undefined,\n): EdgeClass {\n  const cxA = a.x + a.width / 2;\n  const cxB = b.x + b.width / 2;\n  const sameCol = Math.abs(cxA - cxB) < 8;\n  const isSkip = bends != null && bends.length > 0;\n  if (isSkip) return sameCol ? 'skip-same-column' : 'skip-cross-column';\n  return sameCol ? 'direct-same-column' : 'direct-cross-column';\n}\n\nconst MIN_PORT_GAP = 32;\nconst WALL_MARGIN = 16;\n\n/**\n * Cascade algorithm: given N ideal positions (pre-sorted ascending) in [lo, hi],\n * return N positions that respect minGap while staying as close to ideals as possible.\n * Falls back to even distribution when the required span exceeds the available space.\n */\nfunction cascadePorts(ideals: number[], lo: number, hi: number, minGap: number): number[] {\n  const n = ideals.length;\n  if (n === 0) return [];\n  if (n === 1) return [Math.max(lo, Math.min(hi, ideals[0]!))];\n  if ((n - 1) * minGap > hi - lo) {\n    const step = (hi - lo) / (n + 1);\n    return Array.from({ length: n }, (_, i) => lo + step * (i + 1));\n  }\n  const pos = ideals.map((v) => Math.max(lo, Math.min(hi, v)));\n  for (let iter = 0; iter < 5; iter++) {\n    let changed = false;\n    for (let i = 1; i < n; i++) {\n      const minI = pos[i - 1]! + minGap;\n      if (pos[i]! < minI) {\n        pos[i] = minI;\n        changed = true;\n      }\n    }\n    for (let i = n - 1; i >= 0; i--) {\n      const maxI = i === n - 1 ? hi : pos[i + 1]! - minGap;\n      if (pos[i]! > maxI) {\n        pos[i] = maxI;\n        changed = true;\n      }\n    }\n    if (pos[0]! < lo) {\n      pos[0] = lo;\n      changed = true;\n    }\n    if (!changed) break;\n  }\n  return pos;\n}\n\n/**\n * Compute port points for one (box, wall) group of edges.\n * Edges are sorted by their opposite-end node centre along the wall axis\n * (crossing-minimisation), then spread via cascade to enforce MIN_PORT_GAP.\n * Returns Map<relationIndex, {x,y}>.\n */\nfunction assignGroupPorts(\n  box: NodeBox,\n  wall: Wall,\n  group: Array<{ ri: number; sourceCenter: number }>,\n  yOff: number,\n): Map<number, { x: number; y: number }> {\n  const result = new Map<number, { x: number; y: number }>();\n  if (group.length === 0) return result;\n\n  const sorted = [...group].sort((a, b) => a.sourceCenter - b.sourceCenter);\n\n  let wallBase: number, wallLen: number, fixedCoord: number, isHorizontal: boolean;\n  switch (wall) {\n    case 'top':\n      wallBase = box.x;\n      wallLen = box.width;\n      fixedCoord = box.y + yOff;\n      isHorizontal = true;\n      break;\n    case 'bottom':\n      wallBase = box.x;\n      wallLen = box.width;\n      fixedCoord = box.y + yOff + box.height;\n      isHorizontal = true;\n      break;\n    case 'left':\n      wallBase = box.y + yOff;\n      wallLen = box.height;\n      fixedCoord = box.x;\n      isHorizontal = false;\n      break;\n    default: // 'right'\n      wallBase = box.y + yOff;\n      wallLen = box.height;\n      fixedCoord = box.x + box.width;\n      isHorizontal = false;\n      break;\n  }\n\n  const lo = wallBase + WALL_MARGIN;\n  const hi = wallBase + wallLen - WALL_MARGIN;\n  const ideals = sorted.map((e) => Math.max(lo, Math.min(hi, e.sourceCenter)));\n  const positions = cascadePorts(ideals, lo, hi, MIN_PORT_GAP);\n\n  for (let i = 0; i < sorted.length; i++) {\n    const p = positions[i]!;\n    result.set(sorted[i]!.ri, isHorizontal ? { x: p, y: fixedCoord } : { x: fixedCoord, y: p });\n  }\n  return result;\n}\n\nexport function layoutClass(ir: ClassDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const memFont = typography.smallFontSize;\n  const nameFont = typography.baseFontSize;\n  const lineH = rhuInt(memFont * 1.6);\n  const headH = rhuInt(nameFont * 1.6);\n\n  // \u2500\u2500 Box sizing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const sizeOf = (c: ClassBox): { w: number; h: number; attrH: number } => {\n    const memberTexts = [\n      ...(c.stereotype ? [`\u00AB${c.stereotype}\u00BB`] : []),\n      ...c.attributes.map((m) => m.text),\n      ...c.methods.map((m) => m.text),\n    ];\n    const nameW = measureText(c.name, nameFont).width + 24;\n    const w = Math.max(130, nameW, ...memberTexts.map((t) => measureText(t, memFont).width + 24));\n    const stereoH = c.stereotype ? memFont + 4 : 0;\n    const attrH = c.attributes.length * lineH + 8;\n    const methH = c.methods.length * lineH + 8;\n    const h = headH + stereoH + attrH + methH;\n    return { w, h, attrH: headH + stereoH + attrH };\n  };\n  const sizes = new Map(ir.classes.map((c) => [c.name, sizeOf(c)]));\n\n  const nodes: GraphNode[] = ir.classes.map((c) => ({\n    id: c.name,\n    width: sizes.get(c.name)!.w,\n    height: sizes.get(c.name)!.h,\n  }));\n  const edges: GraphEdge[] = ir.relations.map((r) =>\n    r.leftHead === 'triangle' ? { from: r.right, to: r.left } : { from: r.left, to: r.right },\n  );\n  const LAYER_GAP = 64;\n  const laid = layeredLayout(nodes, edges, {\n    direction: 'TB',\n    layerGap: LAYER_GAP,\n    nodeGap: 46,\n    margin,\n  });\n\n  const canvasWidth = laid.width + margin * 2;\n  const allRealBoxes = [...laid.boxes.values()];\n\n  // Segment registry: updated after each skip edge is routed.\n  const routedSegments: RoutedSegment[] = [];\n\n  // Real-node x-centre values, deduplicated and sorted.\n  const realColumnXs = [...new Set(allRealBoxes.map((b) => b.x + b.width / 2))].sort(\n    (a, b) => a - b,\n  );\n\n  // Midpoint between each adjacent pair of real-node columns.\n  const interColMidpoints: number[] = [];\n  for (let ci = 0; ci < realColumnXs.length - 1; ci++) {\n    interColMidpoints.push((realColumnXs[ci]! + realColumnXs[ci + 1]!) / 2);\n  }\n\n  /**\n   * Score a candidate lane x for a skip or direct edge.\n   * Lower score = better. Returns Infinity if the candidate is out-of-bounds.\n   */\n  function scoreLane(\n    laneX: number,\n    segments: Array<[number, number, number, number]>,\n    interBoxes: NodeBox[],\n    routed: RoutedSegment[],\n    canvasW: number,\n    realMinX: number,\n    wallPairPenalty: number = 0,\n    sameWallBonus: number = 0,\n    straightBonus: number = 0,\n    labelMid: { x: number; y: number } | null = null,\n  ): number {\n    if (laneX > canvasW) return Infinity; // only hard-clip on the right\n\n    let pathLength = 0;\n    let segCount = segments.length;\n    let boxHits = 0;\n    let overlapHits = 0;\n\n    for (const [x1, y1, x2, y2] of segments) {\n      const dx = x2 - x1,\n        dy = y2 - y1;\n      pathLength += Math.sqrt(dx * dx + dy * dy);\n\n      for (const nb of interBoxes) {\n        if (segmentIntersectsBox(x1, y1, x2, y2, nb)) boxHits++;\n      }\n\n      const segRect = toRect(x1, y1, x2, y2);\n      for (const rs of routed) {\n        if (rectsOverlapLength(segRect, rs) >= 10) overlapHits++;\n      }\n    }\n\n    const dirPenalty = laneX <= realMinX - CLEARANCE ? 0 : 5;\n\n    // Canvas expansion penalty: very small \u2014 we want comfortable spacing\n    // to win over tight spacing, not be penalised for it.\n    const expansionPenalty = laneX < realMinX ? (realMinX - laneX) * 0.05 : 0;\n\n    const labelPenalty =\n      labelMid != null && labelInBox(labelMid.x, labelMid.y, allRealBoxes) ? 200 : 0;\n\n    return (\n      0.3 * pathLength +\n      10.0 * segCount +\n      1000 * boxHits +\n      50 * overlapHits +\n      dirPenalty +\n      expansionPenalty +\n      wallPairPenalty -\n      sameWallBonus - // bonus for same-wall same-column routing (B/C)\n      straightBonus + // reward for single-segment straight vertical\n      labelPenalty // penalty when label mid falls inside a box\n    );\n  }\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 14 : 0;\n  const yOff = titleH;\n\n  const elements: SceneElement[] = [];\n  if (title)\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  // \u2500\u2500 Relationships (under boxes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n\n  const approachWall = (from: NodeBox, to: NodeBox): Wall => {\n    if (from.y + from.height <= to.y) return 'top';\n    if (to.y + to.height <= from.y) return 'bottom';\n    const dx = to.x + to.width / 2 - (from.x + from.width / 2);\n    const dy = to.y + to.height / 2 - (from.y + from.height / 2);\n    if (Math.abs(dy) >= Math.abs(dx)) return dy >= 0 ? 'top' : 'bottom';\n    return dx >= 0 ? 'left' : 'right';\n  };\n\n  const wallPoint = (\n    box: NodeBox,\n    wall: Wall,\n    t: number,\n    yOff_: number,\n  ): { x: number; y: number } => {\n    const bx = box.x,\n      by = box.y + yOff_,\n      bw = box.width,\n      bh = box.height;\n    switch (wall) {\n      case 'top':\n        return { x: bx + t * bw, y: by };\n      case 'bottom':\n        return { x: bx + t * bw, y: by + bh };\n      case 'left':\n        return { x: bx, y: by + t * bh };\n      case 'right':\n        return { x: bx + bw, y: by + t * bh };\n    }\n  };\n\n  // \u2500\u2500 Port assignment: arrival ports (toPortMap2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Group edges by (targetId, wall). Sort each group by source-center along the\n  // wall axis \u2192 crossing-free order. Spread with cascade to enforce MIN_PORT_GAP.\n  // All edges (including skip edges) participate so ports are always separated.\n  // For skip edges, use laneX as the ideal arrival position so cascade sees a\n  // distinct ideal and doesn't tie with direct-edge ideals.\n  const toGroupAccum = new Map<string, Array<{ ri: number; sourceCenter: number }>>();\n  for (let ri = 0; ri < ir.relations.length; ri++) {\n    const r = ir.relations[ri]!;\n    const isFlipped = r.leftHead === 'triangle';\n    const a = laid.boxes.get(isFlipped ? r.right : r.left),\n      b = laid.boxes.get(isFlipped ? r.left : r.right);\n    if (!a || !b) continue;\n    const wall = approachWall(a, b);\n    const key = `${b.id}:${wall}`;\n    const bends = laid.edgeBends.get(ri);\n    const sourceCenter =\n      wall === 'top' || wall === 'bottom'\n        ? bends && bends.length > 0\n          ? bends[0]!.x\n          : a.x + a.width / 2\n        : a.y + a.height / 2 + yOff;\n    if (!toGroupAccum.has(key)) toGroupAccum.set(key, []);\n    toGroupAccum.get(key)!.push({ ri, sourceCenter });\n  }\n  const toPortMap2 = new Map<string, Map<number, { x: number; y: number }>>();\n  for (const [key, group] of toGroupAccum) {\n    const nodeId = key.split(':')[0]!;\n    const wall = key.split(':')[1] as Wall;\n    toPortMap2.set(key, assignGroupPorts(laid.boxes.get(nodeId)!, wall, group, yOff));\n  }\n\n  // \u2500\u2500 Port assignment: departure ports (fromPortMap2) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Departure wall of A toward B = approachWall(b, a). Sort by target-center.\n  // For skip edges, use laneX as the ideal departure position so cascade sees a\n  // distinct ideal and doesn't tie with direct-edge ideals.\n  const fromGroupAccum = new Map<string, Array<{ ri: number; sourceCenter: number }>>();\n  for (let ri = 0; ri < ir.relations.length; ri++) {\n    const r = ir.relations[ri]!;\n    const isFlipped = r.leftHead === 'triangle';\n    const a = laid.boxes.get(isFlipped ? r.right : r.left),\n      b = laid.boxes.get(isFlipped ? r.left : r.right);\n    if (!a || !b) continue;\n    const wall = approachWall(b, a);\n    const key = `${a.id}:${wall}`;\n    const bends = laid.edgeBends.get(ri);\n    const targetCenter =\n      wall === 'top' || wall === 'bottom'\n        ? bends && bends.length > 0\n          ? bends[0]!.x\n          : b.x + b.width / 2\n        : b.y + b.height / 2 + yOff;\n    if (!fromGroupAccum.has(key)) fromGroupAccum.set(key, []);\n    fromGroupAccum.get(key)!.push({ ri, sourceCenter: targetCenter });\n  }\n  const fromPortMap2 = new Map<string, Map<number, { x: number; y: number }>>();\n  for (const [key, group] of fromGroupAccum) {\n    const nodeId = key.split(':')[0]!;\n    const wall = key.split(':')[1] as Wall;\n    fromPortMap2.set(key, assignGroupPorts(laid.boxes.get(nodeId)!, wall, group, yOff));\n  }\n\n  // Arrowhead direction: point just outside the wall in the edge's travel direction.\n  const wallDir = (wall: Wall, pt: { x: number; y: number }): { x: number; y: number } => {\n    switch (wall) {\n      case 'top':\n        return { x: pt.x, y: pt.y - 1 };\n      case 'bottom':\n        return { x: pt.x, y: pt.y + 1 };\n      case 'left':\n        return { x: pt.x - 1, y: pt.y };\n      case 'right':\n        return { x: pt.x + 1, y: pt.y };\n    }\n  };\n\n  // \u2500\u2500 Edge classification + processing-order sort \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Classify all edges; sort most-constrained first (skip-cross, then skip-same,\n  // then direct-cross, then direct-same). Within each class, longest span first.\n  interface EdgeEntry {\n    ri: number;\n    cls: EdgeClass;\n    span: number;\n  }\n  const edgeEntries: EdgeEntry[] = [];\n  for (let ri_ = 0; ri_ < ir.relations.length; ri_++) {\n    const r_ = ir.relations[ri_]!;\n    const isFlipped_ = r_.leftHead === 'triangle';\n    const a_ = laid.boxes.get(isFlipped_ ? r_.right : r_.left),\n      b_ = laid.boxes.get(isFlipped_ ? r_.left : r_.right);\n    if (!a_ || !b_) continue;\n    const bends_ = laid.edgeBends.get(ri_);\n    const cls_ = classifyEdge(a_, b_, bends_);\n    const span_ =\n      Math.abs(a_.x + a_.width / 2 - (b_.x + b_.width / 2)) +\n      Math.abs(a_.y + a_.height / 2 - (b_.y + b_.height / 2));\n    edgeEntries.push({ ri: ri_, cls: cls_, span: span_ });\n  }\n  const classOrder: Record<EdgeClass, number> = {\n    'skip-cross-column': 0,\n    'skip-same-column': 1,\n    'direct-cross-column': 2,\n    'direct-same-column': 3,\n  };\n  edgeEntries.sort((ea, eb) => classOrder[ea.cls] - classOrder[eb.cls] || eb.span - ea.span);\n\n  for (const { ri, cls } of edgeEntries) {\n    const r = ir.relations[ri]!;\n    // When leftHead='triangle', the graph edge was flipped (from=r.right, to=r.left)\n    // for layout \u2014 rendering must match that direction.\n    const isFlipped = r.leftHead === 'triangle';\n    const a = laid.boxes.get(isFlipped ? r.right : r.left),\n      b = laid.boxes.get(isFlipped ? r.left : r.right);\n    if (!a || !b) continue;\n\n    // Arrival port: cascade-assigned position on target wall.\n    const toWall = approachWall(a, b);\n    const toPt = toPortMap2.get(`${b.id}:${toWall}`)?.get(ri) ?? wallPoint(b, toWall, 0.5, yOff);\n\n    // Departure port: cascade-assigned position on source wall, aimed at toPt.\n    const fromWall = approachWall(b, a);\n    const fromPt =\n      fromPortMap2.get(`${a.id}:${fromWall}`)?.get(ri) ??\n      borderPoint({ ...a, y: a.y + yOff }, toPt.x, toPt.y);\n\n    const bends = laid.edgeBends.get(ri);\n    let safePath: string;\n    let labelMid: { x: number; y: number };\n    let skipEdgeLateralStrategy = false;\n    let effectiveFromPt: { x: number; y: number } = fromPt;\n    let effectiveFromWall: Wall = fromWall;\n    let effectiveToPt: { x: number; y: number } = toPt;\n    let effectiveToWall: Wall = toWall;\n\n    if (bends && bends.length > 0) {\n      // \u2500\u2500 Build candidate lane x positions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const srcLayerY = a.y;\n      const tgtLayerY = b.y;\n      const minY = Math.min(srcLayerY, tgtLayerY);\n      const maxY = Math.max(srcLayerY, tgtLayerY);\n      const interBoxes = allRealBoxes.filter((nb) => {\n        const cy = nb.y + nb.height / 2;\n        return cy > minY && cy < maxY;\n      });\n\n      // Seed from BK sweeps: the 4 per-dummy x values from the first dummy in chain\n      const firstDummyId = laid.dummyChainIds.get(ri)?.[0] ?? null;\n      const sweepCandidates: number[] = firstDummyId\n        ? (laid.dummySweepXs.get(firstDummyId) ?? [])\n        : [];\n\n      const rightMarginX = Math.max(...allRealBoxes.map((b) => b.x + b.width)) + CLEARANCE;\n      const sourceX = fromPt.x;\n      const realMinX = Math.min(...allRealBoxes.map((b) => b.x));\n\n      // \u2500\u2500 Compute route for each candidate \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const exitY = bends[0]!.y + yOff;\n      const entryY = toPt.y - LAYER_GAP / 2;\n\n      // Adaptive left-margin: push far enough left that horizontal segments at\n      // exitY and entryY clear ALL intermediate boxes.\n      // safeX = min(fromPt.x, toPt.x) - max(intermediate box right edge that\n      // would be crossed by a horizontal from laneX to fromPt.x) - CLEARANCE.\n      // Equivalently: laneX must satisfy laneX < min(interBox.left) for all\n      // interBoxes whose y range overlaps exitY or entryY.\n      const blockingAtExit = interBoxes.filter((b) => exitY > b.y && exitY < b.y + b.height);\n      const blockingAtEntry = interBoxes.filter((b) => entryY > b.y && entryY < b.y + b.height);\n      const allBlocking = [...blockingAtExit, ...blockingAtEntry];\n\n      const adaptiveLeftX =\n        allBlocking.length > 0\n          ? Math.min(...allBlocking.map((b) => b.x)) - CLEARANCE\n          : realMinX - CLEARANCE;\n\n      const candidates_A: number[] = [\n        ...sweepCandidates,\n        adaptiveLeftX,\n        rightMarginX,\n        sourceX,\n        ...interColMidpoints,\n      ];\n\n      // \u2500\u2500 Mid-wall port coords for non-A strategies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const srcMidY_ = a.y + a.height / 2 + yOff;\n      const tgtMidY_ = b.y + b.height / 2 + yOff;\n      const srcLeft_ = a.x;\n      const srcRight_ = a.x + a.width;\n      const tgtLeft_ = b.x;\n      const tgtRight_ = b.x + b.width;\n\n      // Extended blocking set: covers B/C/D/E/F horizontal segments that may\n      // hit boxes at srcMidY or tgtMidY rows outside the strict inter-layer band.\n      const interBoxesExt = allRealBoxes.filter((nb) => {\n        const cy = nb.y + nb.height / 2;\n        return cy > a.y && cy < b.y + b.height && nb.id !== a.id && nb.id !== b.id;\n      });\n\n      // Adaptive left-margin for B/D strategies (left-side lanes)\n      const blockingBD = allRealBoxes.filter((nb) => {\n        const ny = nb.y,\n          nh = nb.height;\n        return (srcMidY_ > ny && srcMidY_ < ny + nh) || (tgtMidY_ > ny && tgtMidY_ < ny + nh);\n      });\n      const adaptiveLeftX_BD =\n        blockingBD.length > 0\n          ? Math.min(...blockingBD.map((nb) => nb.x)) - LANE_CLEARANCE\n          : realMinX - LANE_CLEARANCE;\n\n      // Adaptive right-margin for C/E strategies (right-side lanes)\n      const adaptiveRightX_CE =\n        blockingBD.length > 0\n          ? Math.max(...blockingBD.map((nb) => nb.x + nb.width)) + LANE_CLEARANCE\n          : rightMarginX;\n\n      // Adaptive left-margin for F strategy (checks exitY and tgtMidY rows)\n      const blockingF = allRealBoxes.filter((nb) => {\n        return (\n          (exitY > nb.y && exitY < nb.y + nb.height) ||\n          (tgtMidY_ > nb.y && tgtMidY_ < nb.y + nb.height)\n        );\n      });\n      const adaptiveLeftX_F =\n        blockingF.length > 0\n          ? Math.min(...blockingF.map((nb) => nb.x)) - LANE_CLEARANCE\n          : realMinX - LANE_CLEARANCE;\n\n      // \u2500\u2500 Segment builder functions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      function buildSegmentsA(laneX: number): Array<[number, number, number, number]> {\n        const fx = fromPt.x,\n          fy = fromPt.y;\n        const tx = toPt.x,\n          ty = toPt.y;\n        if (Math.abs(laneX - fx) < 1 && Math.abs(laneX - tx) < 1) {\n          return [[fx, fy, tx, ty]];\n        }\n        return [\n          [fx, fy, fx, exitY],\n          [fx, exitY, laneX, exitY],\n          [laneX, exitY, laneX, entryY],\n          [laneX, entryY, tx, entryY],\n          [tx, entryY, tx, ty],\n        ];\n      }\n\n      function buildSegmentsB(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [srcLeft_, srcMidY_, laneX, srcMidY_],\n          [laneX, srcMidY_, laneX, tgtMidY_],\n          [laneX, tgtMidY_, tgtLeft_, tgtMidY_],\n        ];\n      }\n\n      function buildSegmentsC(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [srcRight_, srcMidY_, laneX, srcMidY_],\n          [laneX, srcMidY_, laneX, tgtMidY_],\n          [laneX, tgtMidY_, tgtRight_, tgtMidY_],\n        ];\n      }\n\n      function buildSegmentsD(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [srcLeft_, srcMidY_, laneX, srcMidY_],\n          [laneX, srcMidY_, laneX, entryY],\n          [laneX, entryY, toPt.x, entryY],\n          [toPt.x, entryY, toPt.x, toPt.y],\n        ];\n      }\n\n      function buildSegmentsE(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [srcRight_, srcMidY_, laneX, srcMidY_],\n          [laneX, srcMidY_, laneX, entryY],\n          [laneX, entryY, toPt.x, entryY],\n          [toPt.x, entryY, toPt.x, toPt.y],\n        ];\n      }\n\n      function buildSegmentsF(laneX: number): Array<[number, number, number, number]> {\n        return [\n          [fromPt.x, fromPt.y, fromPt.x, exitY],\n          [fromPt.x, exitY, laneX, exitY],\n          [laneX, exitY, laneX, tgtMidY_],\n          [laneX, tgtMidY_, tgtLeft_, tgtMidY_],\n        ];\n      }\n\n      // \u2500\u2500 Build flat candidate list from all strategies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const allCandidates: RouteCandidate[] = [];\n\n      for (const laneX of candidates_A) {\n        allCandidates.push({\n          strategy: 'A',\n          laneX,\n          isMixed: false,\n          segments: buildSegmentsA(laneX),\n          labelMid: { x: laneX, y: (exitY + entryY) / 2 },\n        });\n      }\n\n      const minAllowedLaneX = Math.min(srcLeft_, tgtLeft_) - LANE_CLEARANCE;\n      const laneXsB = [\n        adaptiveLeftX_BD, // LANE_CLEARANCE from nearest box\n        realMinX - LANE_CLEARANCE * 1.5,\n        realMinX - LANE_CLEARANCE * 2,\n        realMinX - LANE_CLEARANCE * 3,\n        ...sweepCandidates,\n      ].filter((x) => x <= minAllowedLaneX); // must have at least LANE_CLEARANCE gap\n      for (const laneX of laneXsB) {\n        allCandidates.push({\n          strategy: 'B',\n          laneX,\n          isMixed: false,\n          segments: buildSegmentsB(laneX),\n          labelMid: { x: laneX, y: (srcMidY_ + tgtMidY_) / 2 },\n        });\n      }\n\n      const laneXsC = [\n        adaptiveRightX_CE,\n        rightMarginX,\n        rightMarginX + LANE_CLEARANCE * 0.5,\n        rightMarginX + LANE_CLEARANCE,\n        ...sweepCandidates,\n      ].filter((x) => x > Math.max(srcRight_, tgtRight_));\n      for (const laneX of laneXsC) {\n        allCandidates.push({\n          strategy: 'C',\n          laneX,\n          isMixed: false,\n          segments: buildSegmentsC(laneX),\n          labelMid: { x: laneX, y: (srcMidY_ + tgtMidY_) / 2 },\n        });\n      }\n\n      const laneXsD = [adaptiveLeftX_BD, realMinX - CLEARANCE, ...sweepCandidates].filter(\n        (x) => x < srcLeft_,\n      );\n      for (const laneX of laneXsD) {\n        allCandidates.push({\n          strategy: 'D',\n          laneX,\n          isMixed: true,\n          segments: buildSegmentsD(laneX),\n          labelMid: { x: laneX, y: (srcMidY_ + entryY) / 2 },\n        });\n      }\n\n      const laneXsE = [adaptiveRightX_CE, rightMarginX, ...sweepCandidates].filter(\n        (x) => x > srcRight_,\n      );\n      for (const laneX of laneXsE) {\n        allCandidates.push({\n          strategy: 'E',\n          laneX,\n          isMixed: true,\n          segments: buildSegmentsE(laneX),\n          labelMid: { x: laneX, y: (srcMidY_ + entryY) / 2 },\n        });\n      }\n\n      const laneXsF = [adaptiveLeftX_F, realMinX - CLEARANCE, ...sweepCandidates].filter(\n        (x) => x < tgtLeft_,\n      );\n      for (const laneX of laneXsF) {\n        allCandidates.push({\n          strategy: 'F',\n          laneX,\n          isMixed: true,\n          segments: buildSegmentsF(laneX),\n          labelMid: { x: laneX, y: (exitY + tgtMidY_) / 2 },\n        });\n      }\n\n      // \u2500\u2500 Score all candidates and pick best \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      let bestScore = Infinity;\n      let bestCandidate: RouteCandidate = allCandidates[0] ?? {\n        strategy: 'A',\n        laneX: bends[0]!.x,\n        isMixed: false,\n        segments: buildSegmentsA(bends[0]!.x),\n        labelMid: { x: bends[0]!.x, y: (exitY + entryY) / 2 },\n      };\n\n      for (const c of allCandidates) {\n        // Same-wall bonus: Strategy B (left\u2192left) and C (right\u2192right) are\n        // the canonical routing style for skip edges in the same column.\n        // 30-point bonus ensures they win over A when geometry is clean.\n        const sameWallBonus = c.strategy === 'B' || c.strategy === 'C' ? 30 : 0;\n        const score = scoreLane(\n          c.laneX,\n          c.segments,\n          interBoxesExt,\n          routedSegments,\n          canvasWidth,\n          realMinX,\n          c.isMixed ? 2.0 : 0,\n          sameWallBonus,\n          0,\n          c.labelMid,\n        );\n        if (score < bestScore) {\n          bestScore = score;\n          bestCandidate = c;\n        }\n      }\n\n      // \u2500\u2500 Register winning segments \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      for (const [x1, y1, x2, y2] of bestCandidate.segments) {\n        routedSegments.push(toRect(x1, y1, x2, y2));\n      }\n      skipEdgeLateralStrategy = bestCandidate.strategy === 'B' || bestCandidate.strategy === 'C';\n\n      // \u2500\u2500 Determine effective port points and walls for arrowheads \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      switch (bestCandidate.strategy) {\n        case 'B':\n          effectiveFromPt = { x: srcLeft_, y: srcMidY_ };\n          effectiveFromWall = 'left';\n          effectiveToPt = { x: tgtLeft_, y: tgtMidY_ };\n          effectiveToWall = 'left';\n          break;\n        case 'C':\n          effectiveFromPt = { x: srcRight_, y: srcMidY_ };\n          effectiveFromWall = 'right';\n          effectiveToPt = { x: tgtRight_, y: tgtMidY_ };\n          effectiveToWall = 'right';\n          break;\n        case 'D':\n          effectiveFromPt = { x: srcLeft_, y: srcMidY_ };\n          effectiveFromWall = 'left';\n          break;\n        case 'E':\n          effectiveFromPt = { x: srcRight_, y: srcMidY_ };\n          effectiveFromWall = 'right';\n          break;\n        case 'F':\n          effectiveToPt = { x: tgtLeft_, y: tgtMidY_ };\n          effectiveToWall = 'left';\n          break;\n      }\n\n      // \u2500\u2500 Render path from winning candidate's segments \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      const segs = bestCandidate.segments;\n      if (segs.length === 1) {\n        safePath = `M ${rhu(segs[0]![0])} ${rhu(segs[0]![1])} L ${rhu(segs[0]![2])} ${rhu(segs[0]![3])}`;\n      } else {\n        const pts: string[] = [`M ${rhu(segs[0]![0])} ${rhu(segs[0]![1])}`];\n        for (const [, , x2, y2] of segs) {\n          pts.push(`L ${rhu(x2)} ${rhu(y2)}`);\n        }\n        safePath = pts.join(' ');\n      }\n      labelMid = bestCandidate.labelMid;\n\n      elements.push(p.path(safePath, palette.textMuted, 1.3, r.dashed ? { dash: '6 4' } : {}));\n\n      // When edge is flipped, leftHead belongs at toPt (b=r.left) and rightHead at fromPt (a=r.right).\n      const headFrom = isFlipped ? r.rightHead : r.leftHead;\n      const headTo = isFlipped ? r.leftHead : r.rightHead;\n      elements.push(\n        ...endMarker(\n          p,\n          effectiveFromPt,\n          wallDir(effectiveFromWall, effectiveFromPt),\n          headFrom,\n          palette,\n        ),\n      );\n      elements.push(\n        ...endMarker(p, effectiveToPt, wallDir(effectiveToWall, effectiveToPt), headTo, palette),\n      );\n    } else {\n      // \u2500\u2500 Direct-edge optimizer (X1/X2 for cross-column; V/B/C for same-column) \u2500\u2500\n      const fx = fromPt.x,\n        fy = fromPt.y,\n        tx = toPt.x,\n        ty = toPt.y;\n      const realMinX_d = Math.min(...allRealBoxes.map((nb) => nb.x));\n      const rightMarginX_d = Math.max(...allRealBoxes.map((nb) => nb.x + nb.width)) + CLEARANCE;\n      // All real boxes except source and target are obstacles.\n      const interBoxesDirect = allRealBoxes.filter((nb) => nb.id !== a.id && nb.id !== b.id);\n\n      const directCandidates: RouteCandidate[] = [];\n\n      if (cls === 'direct-same-column') {\n        // V: straight vertical (or near-vertical) \u2014 gets a straightBonus\n        directCandidates.push({\n          strategy: 'V',\n          laneX: fx,\n          isMixed: false,\n          segments: [[fx, fy, tx, ty]],\n          labelMid: { x: fx, y: (fy + ty) / 2 },\n        });\n        // B/C: left/right wall lanes (same builders as skip edges)\n        const srcMidY_d = a.y + a.height / 2 + yOff;\n        const tgtMidY_d = b.y + b.height / 2 + yOff;\n        const srcLeft_d = a.x;\n        const srcRight_d = a.x + a.width;\n        const tgtLeft_d = b.x;\n        const tgtRight_d = b.x + b.width;\n        const blockingBD_d = allRealBoxes.filter((nb) => {\n          const ny = nb.y,\n            nh = nb.height;\n          return (srcMidY_d > ny && srcMidY_d < ny + nh) || (tgtMidY_d > ny && tgtMidY_d < ny + nh);\n        });\n        const adaptiveLeftX_BD_d =\n          blockingBD_d.length > 0\n            ? Math.min(...blockingBD_d.map((nb) => nb.x)) - LANE_CLEARANCE\n            : realMinX_d - LANE_CLEARANCE;\n        const adaptiveRightX_CE_d =\n          blockingBD_d.length > 0\n            ? Math.max(...blockingBD_d.map((nb) => nb.x + nb.width)) + LANE_CLEARANCE\n            : rightMarginX_d;\n        if (adaptiveLeftX_BD_d < srcLeft_d) {\n          directCandidates.push({\n            strategy: 'B',\n            laneX: adaptiveLeftX_BD_d,\n            isMixed: false,\n            segments: [\n              [srcLeft_d, srcMidY_d, adaptiveLeftX_BD_d, srcMidY_d],\n              [adaptiveLeftX_BD_d, srcMidY_d, adaptiveLeftX_BD_d, tgtMidY_d],\n              [adaptiveLeftX_BD_d, tgtMidY_d, tgtLeft_d, tgtMidY_d],\n            ],\n            labelMid: { x: adaptiveLeftX_BD_d, y: (srcMidY_d + tgtMidY_d) / 2 },\n          });\n        }\n        if (adaptiveRightX_CE_d > srcRight_d) {\n          directCandidates.push({\n            strategy: 'C',\n            laneX: adaptiveRightX_CE_d,\n            isMixed: false,\n            segments: [\n              [srcRight_d, srcMidY_d, adaptiveRightX_CE_d, srcMidY_d],\n              [adaptiveRightX_CE_d, srcMidY_d, adaptiveRightX_CE_d, tgtMidY_d],\n              [adaptiveRightX_CE_d, tgtMidY_d, tgtRight_d, tgtMidY_d],\n            ],\n            labelMid: { x: adaptiveRightX_CE_d, y: (srcMidY_d + tgtMidY_d) / 2 },\n          });\n        }\n      } else {\n        // direct-cross-column: X1 (V-then-H) and X2 (H-then-V) families\n        // \u2500\u2500 X1 candidates \u2500\u2500\n        const midYRaw = [(fy + ty) / 2, fy + LAYER_GAP / 2, ty - LAYER_GAP / 2];\n        for (const midY of dedup(midYRaw, 2)) {\n          const segsX1: Array<[number, number, number, number]> =\n            Math.abs(fx - tx) < 1\n              ? [[fx, fy, tx, ty]]\n              : [\n                  [fx, fy, fx, midY],\n                  [fx, midY, tx, midY],\n                  [tx, midY, tx, ty],\n                ];\n          directCandidates.push({\n            strategy: 'X1',\n            laneX: (fx + tx) / 2,\n            isMixed: false,\n            segments: segsX1,\n            labelMid: { x: (fx + tx) / 2, y: midY },\n          });\n        }\n        // \u2500\u2500 X2 candidates \u2500\u2500\n        const midXRaw = [\n          ...interColMidpoints.filter((x) => x > Math.min(fx, tx) && x < Math.max(fx, tx)),\n          realMinX_d - CLEARANCE,\n          rightMarginX_d,\n        ];\n        for (const midX of dedup(midXRaw, 2)) {\n          const segsX2: Array<[number, number, number, number]> =\n            Math.abs(fy - ty) < 1\n              ? [[fx, fy, tx, ty]]\n              : [\n                  [fx, fy, midX, fy],\n                  [midX, fy, midX, ty],\n                  [midX, ty, tx, ty],\n                ];\n          directCandidates.push({\n            strategy: 'X2',\n            laneX: midX,\n            isMixed: false,\n            segments: segsX2,\n            labelMid: { x: midX, y: (fy + ty) / 2 },\n          });\n        }\n      }\n\n      // \u2500\u2500 Score all direct candidates and pick best \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      let bestScoreDirect = Infinity;\n      let bestDirect: RouteCandidate | null = directCandidates[0] ?? null;\n      for (const c of directCandidates) {\n        const straightBns = c.strategy === 'V' ? 40 : 0;\n        // For X1/X2 cross-column routes, use ALL boxes (including src/tgt)\n        // so segments that clip through the source or target body are penalised.\n        const boxesForScoring =\n          c.strategy === 'X1' || c.strategy === 'X2' ? allRealBoxes : interBoxesDirect;\n        const score = scoreLane(\n          c.laneX,\n          c.segments,\n          boxesForScoring,\n          routedSegments,\n          canvasWidth,\n          realMinX_d,\n          c.isMixed ? 2.0 : 0,\n          0,\n          straightBns,\n          c.labelMid,\n        );\n        if (score < bestScoreDirect) {\n          bestScoreDirect = score;\n          bestDirect = c;\n        }\n      }\n\n      if (bestScoreDirect === Infinity || bestDirect == null || cls === 'direct-same-column') {\n        // Same-column direct edges: always use routeEdge() \u2014 cascade ports\n        // already handle port spreading; the V candidate deviates from them.\n        // Cross-column fallback when all candidates score Infinity.\n        const routed = routeEdge(a, b, allBoxes, yOff, fromPt, toPt, true);\n        safePath = routed.path || `M ${fromPt.x} ${fromPt.y} L ${toPt.x} ${toPt.y}`;\n        labelMid = routed.labelMidpoint;\n        // Register routeEdge segments so later edges see claimed corridors.\n        routedSegments.push(toRect(fromPt.x, fromPt.y, toPt.x, toPt.y));\n      } else {\n        // Register winning segments so later edges see claimed corridors.\n        for (const [x1, y1, x2, y2] of bestDirect.segments) {\n          routedSegments.push(toRect(x1, y1, x2, y2));\n        }\n        safePath = segmentsToPath(bestDirect.segments);\n        labelMid = bestDirect.labelMid;\n      }\n\n      elements.push(p.path(safePath, palette.textMuted, 1.3, r.dashed ? { dash: '6 4' } : {}));\n      elements.push(\n        ...endMarker(\n          p,\n          effectiveFromPt,\n          wallDir(effectiveFromWall, effectiveFromPt),\n          isFlipped ? r.rightHead : r.leftHead,\n          palette,\n        ),\n      );\n      elements.push(\n        ...endMarker(\n          p,\n          effectiveToPt,\n          wallDir(effectiveToWall, effectiveToPt),\n          isFlipped ? r.leftHead : r.rightHead,\n          palette,\n        ),\n      );\n    }\n\n    const mx = labelMid.x,\n      my = labelMid.y;\n    if (r.label) {\n      let labelX: number, labelAnchor: 'start' | 'middle' | 'end';\n      if (skipEdgeLateralStrategy && labelMid.x < Math.min(...allRealBoxes.map((b) => b.x))) {\n        labelX = mx - 4;\n        labelAnchor = 'end';\n      } else if (skipEdgeLateralStrategy) {\n        labelX = mx + 8;\n        labelAnchor = 'start';\n      } else {\n        labelX = mx;\n        labelAnchor = 'middle';\n      }\n      elements.push(\n        p.text(r.label, rhuInt(labelX), rhuInt(my - 4), memFont, palette.textMuted, {\n          anchor: labelAnchor,\n        }),\n      );\n    }\n    const cardOffset = (wall: Wall, pt: { x: number; y: number }): { cx: number; cy: number } => {\n      switch (wall) {\n        case 'top':\n          return { cx: pt.x + 10, cy: pt.y - 10 };\n        case 'bottom':\n          return { cx: pt.x + 10, cy: pt.y + 10 };\n        case 'left':\n          return { cx: pt.x - 10, cy: pt.y - 10 };\n        default:\n          return { cx: pt.x + 10, cy: pt.y - 10 };\n      }\n    };\n    if (r.leftCard) {\n      const o = cardOffset(\n        isFlipped ? effectiveToWall : effectiveFromWall,\n        isFlipped ? effectiveToPt : effectiveFromPt,\n      );\n      elements.push(p.text(r.leftCard, rhu(o.cx), rhu(o.cy), memFont, palette.textMuted));\n    }\n    if (r.rightCard) {\n      const o = cardOffset(\n        isFlipped ? effectiveFromWall : effectiveToWall,\n        isFlipped ? effectiveFromPt : effectiveToPt,\n      );\n      elements.push(p.text(r.rightCard, rhu(o.cx), rhu(o.cy), memFont, palette.textMuted));\n    }\n  }\n\n  // \u2500\u2500 Class boxes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const c of ir.classes) {\n    const box = laid.boxes.get(c.name)!;\n    const s = sizes.get(c.name)!;\n    const x = box.x,\n      y = box.y + yOff;\n    elements.push(\n      p.rect(\n        { x: rhu(x), y: rhu(y), width: rhu(s.w), height: rhu(s.h) },\n        palette.surface,\n        palette.border,\n        1.4,\n        { rx: 4 },\n      ),\n    );\n\n    // Header \u2014 title vertically centered in headH band\n    const headerMidY = y + headH / 2;\n    let ty = headerMidY + nameFont * 0.35; // 0.35 \u2248 half cap-height for baseline offset\n    elements.push(\n      p.text(c.name, rhuInt(x + s.w / 2), rhu(ty), nameFont, palette.text, {\n        weight: 'bold',\n        anchor: 'middle',\n      }),\n    );\n    if (c.stereotype) {\n      ty += memFont + 2;\n      elements.push(\n        p.text(`\u00AB${c.stereotype}\u00BB`, rhuInt(x + s.w / 2), rhu(ty), memFont, palette.textMuted, {\n          anchor: 'middle',\n        }),\n      );\n    }\n    const headerBottom = y + headH + (c.stereotype ? memFont + 4 : 0);\n    elements.push(\n      p.path(\n        `M ${rhu(x)} ${rhu(headerBottom)} L ${rhu(x + s.w)} ${rhu(headerBottom)}`,\n        palette.border,\n        1,\n      ),\n    );\n\n    // Attributes\n    let ay = headerBottom + lineH - 4;\n    for (const m of c.attributes) {\n      elements.push(p.text(m.text, rhu(x + 8), rhu(ay), memFont, palette.text));\n      ay += lineH;\n    }\n    const attrBottom = y + s.attrH;\n    elements.push(\n      p.path(\n        `M ${rhu(x)} ${rhu(attrBottom)} L ${rhu(x + s.w)} ${rhu(attrBottom)}`,\n        palette.border,\n        1,\n      ),\n    );\n\n    // Methods\n    let my2 = attrBottom + lineH - 4;\n    for (const m of c.methods) {\n      elements.push(p.text(m.text, rhu(x + 8), rhu(my2), memFont, palette.text));\n      my2 += lineH;\n    }\n  }\n\n  const totalW = rhuInt(laid.width + margin);\n  const totalH = rhuInt(laid.height + yOff + margin);\n\n  // If any skip-edge routing went left of x=margin (Strategy B lateral lanes),\n  // expand the viewBox leftward. Add extra margin for the label text width (~48px).\n  const LABEL_EXTRA = 48;\n  const routingMinX = Math.min(0, ...routedSegments.map((s) => s.x1));\n  const leftOvershoot = routingMinX < margin ? Math.ceil(margin - routingMinX) + LABEL_EXTRA : 0;\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: -leftOvershoot, y: 0, width: totalW + leftOvershoot, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n\n/** Draw a UML relationship end marker at `at`, pointing from `toward` into the box. */\nfunction endMarker(\n  p: ReturnType<typeof pen>,\n  at: { x: number; y: number },\n  toward: { x: number; y: number },\n  type: RelEnd,\n  palette: ResolvedTheme['palette'],\n): SceneElement[] {\n  if (type === 'none') return [];\n  const ang = Math.atan2(at.y - toward.y, at.x - toward.x); // points outward from box centre toward marker\n  const back = ang + Math.PI; // into the box\n  const at2 = (len: number, spread: number) => ({\n    x: at.x + Math.cos(back + spread) * len,\n    y: at.y + Math.sin(back + spread) * len,\n  });\n  const tip = `${rhu(at.x)} ${rhu(at.y)}`;\n\n  if (type === 'arrow') {\n    const a = at2(12, 0.4),\n      b = at2(12, -0.4);\n    return [\n      p.path(\n        `M ${rhu(a.x)} ${rhu(a.y)} L ${tip} L ${rhu(b.x)} ${rhu(b.y)}`,\n        palette.textMuted,\n        1.4,\n      ),\n    ];\n  }\n  if (type === 'triangle') {\n    const a = at2(14, 0.45),\n      b = at2(14, -0.45);\n    return [\n      p.path(\n        `M ${tip} L ${rhu(a.x)} ${rhu(a.y)} L ${rhu(b.x)} ${rhu(b.y)} Z`,\n        palette.textMuted,\n        1.3,\n        { fill: palette.background },\n      ),\n    ];\n  }\n  // diamonds\n  const near = at2(11, 0);\n  const a = at2(8, 0.9),\n    b = at2(8, -0.9);\n  const fill = type === 'diamondF' ? palette.textMuted : palette.background;\n  return [\n    p.path(\n      `M ${tip} L ${rhu(a.x)} ${rhu(a.y)} L ${rhu(near.x)} ${rhu(near.y)} L ${rhu(b.x)} ${rhu(b.y)} Z`,\n      palette.textMuted,\n      1.3,\n      { fill },\n    ),\n  ];\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function relHeads(tok) {\n    const dashed = tok.includes('..');\n    let leftHead = 'none', rightHead = 'none';\n    if (tok.startsWith('<|')) leftHead = 'triangle';\n    else if (tok.startsWith('*')) leftHead = 'diamondF';\n    else if (tok.startsWith('o')) leftHead = 'diamondO';\n    else if (tok.startsWith('<')) leftHead = 'arrow';\n    if (tok.endsWith('|>')) rightHead = 'triangle';\n    else if (tok.endsWith('*')) rightHead = 'diamondF';\n    else if (tok.endsWith('o')) rightHead = 'diamondO';\n    else if (tok.endsWith('>')) rightHead = 'arrow';\n    return { leftHead, rightHead, dashed };\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"classdiagram\";\n  var peg$c1 = \"-v2\";\n  var peg$c2 = \"---\";\n  var peg$c3 = \"class\";\n  var peg$c4 = \"{\";\n  var peg$c5 = \"\\r\";\n  var peg$c6 = \"\\n\";\n  var peg$c7 = \"}\";\n  var peg$c8 = \":\";\n  var peg$c9 = \"note\";\n  var peg$c10 = \"<|--\";\n  var peg$c11 = \"<|..\";\n  var peg$c12 = \"--|>\";\n  var peg$c13 = \"..|>\";\n  var peg$c14 = \"*--\";\n  var peg$c15 = \"--*\";\n  var peg$c16 = \"o--\";\n  var peg$c17 = \"--o\";\n  var peg$c18 = \"<--\";\n  var peg$c19 = \"-->\";\n  var peg$c20 = \"<..\";\n  var peg$c21 = \"..>\";\n  var peg$c22 = \"..\";\n  var peg$c23 = \"--\";\n  var peg$c24 = \"\\\"\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[A-Za-z0-9_~]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"classDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"-v2\", false);\n  var peg$e2 = peg$literalExpectation(\"---\", false);\n  var peg$e3 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e4 = peg$literalExpectation(\"class\", true);\n  var peg$e5 = peg$literalExpectation(\"{\", false);\n  var peg$e6 = peg$literalExpectation(\"\\r\", false);\n  var peg$e7 = peg$literalExpectation(\"\\n\", false);\n  var peg$e8 = peg$literalExpectation(\"}\", false);\n  var peg$e9 = peg$literalExpectation(\":\", false);\n  var peg$e10 = peg$literalExpectation(\"note\", true);\n  var peg$e11 = peg$literalExpectation(\"<|--\", false);\n  var peg$e12 = peg$literalExpectation(\"<|..\", false);\n  var peg$e13 = peg$literalExpectation(\"--|>\", false);\n  var peg$e14 = peg$literalExpectation(\"..|>\", false);\n  var peg$e15 = peg$literalExpectation(\"*--\", false);\n  var peg$e16 = peg$literalExpectation(\"--*\", false);\n  var peg$e17 = peg$literalExpectation(\"o--\", false);\n  var peg$e18 = peg$literalExpectation(\"--o\", false);\n  var peg$e19 = peg$literalExpectation(\"<--\", false);\n  var peg$e20 = peg$literalExpectation(\"-->\", false);\n  var peg$e21 = peg$literalExpectation(\"<..\", false);\n  var peg$e22 = peg$literalExpectation(\"..>\", false);\n  var peg$e23 = peg$literalExpectation(\"..\", false);\n  var peg$e24 = peg$literalExpectation(\"--\", false);\n  var peg$e25 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e26 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e27 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\", \"~\"], false, false);\n  var peg$e28 = peg$anyExpectation();\n  var peg$e29 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const classes = [];\n      const relations = [];\n      const ensure = (name) => {\n        let c = classes.find(x => x.name === name);\n        if (!c) { c = { name, attributes: [], methods: [] }; classes.push(c); }\n        return c;\n      };\n      const addMember = (c, raw) => {\n        const s = raw.trim();\n        if (!s) return;\n        if (s.startsWith('<<')) { c.stereotype = s.replace(/[<>]/g, '').trim(); return; }\n        const isMethod = s.includes('(');\n        (isMethod ? c.methods : c.attributes).push({ text: s, isMethod });\n      };\n      for (const st of stmts.filter(Boolean)) {\n        if (st.t === 'class') { const c = ensure(st.name); for (const m of st.members) addMember(c, m); }\n        else if (st.t === 'member') addMember(ensure(st.name), st.content);\n        else if (st.t === 'relation') {\n          ensure(st.left); ensure(st.right);\n          const { leftHead, rightHead, dashed } = relHeads(st.tok);\n          relations.push({ left: st.left, right: st.right, leftHead, rightHead, dashed,\n            ...(st.label ? { label: st.label } : {}),\n            ...(st.lc ? { leftCard: st.lc } : {}),\n            ...(st.rc ? { rightCard: st.rc } : {}) });\n        }\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, classes, relations };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(name, rows) { return { t: 'class', name, members: rows.filter(Boolean) }; };\n  var peg$f4 = function(content) { return content.trim(); };\n  var peg$f5 = function() { return null; };\n  var peg$f6 = function(name, content) { return { t: 'member', name, content: content.trim() }; };\n  var peg$f7 = function(left, lc, tok, rc, right, l) { return l.trim(); };\n  var peg$f8 = function(left, lc, tok, rc, right, label) {\n      return { t: 'relation', left, right, tok, lc: lc || undefined, rc: rc || undefined, label: label || undefined };\n    };\n  var peg$f9 = function() { return null; };\n  var peg$f10 = function(s) { return s; };\n  var peg$f11 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 12);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 12;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c1) {\n        s4 = peg$c1;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = peg$parseStatement();\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = peg$parseStatement();\n        }\n        s7 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s6);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c2) {\n      s1 = peg$c2;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s7 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c2) {\n            s7 = peg$c2;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e3); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s4 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseClassBlock();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseRelation();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseClassMemberLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseNoteLine();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseClassBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 123) {\n            s6 = peg$c4;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s8 = peg$c5;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s8 === peg$FAILED) {\n              s8 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s9 = peg$c6;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s9 !== peg$FAILED) {\n              s10 = [];\n              s11 = peg$parseMemberRow();\n              while (s11 !== peg$FAILED) {\n                s10.push(s11);\n                s11 = peg$parseMemberRow();\n              }\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 125) {\n                s12 = peg$c7;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parseLineEnd();\n                if (s13 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f3(s4, s10);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMemberRow() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 125) {\n      s3 = peg$c7;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = input.charAt(peg$currPos);\n          if (peg$r0.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = input.substring(s3, peg$currPos);\n      } else {\n        s3 = s4;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s4 = peg$c5;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s5 = peg$c6;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f4(s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s2 = peg$c5;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s3 = peg$c6;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f5();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseClassMemberLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c8;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseRestOfLine();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parseLineEnd();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s2, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelation() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseCardStr();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parse_();\n      s6 = peg$parseRelTok();\n      if (s6 !== peg$FAILED) {\n        s7 = peg$parse_();\n        s8 = peg$parseCardStr();\n        if (s8 === peg$FAILED) {\n          s8 = null;\n        }\n        s9 = peg$parse_();\n        s10 = peg$parseIdent();\n        if (s10 !== peg$FAILED) {\n          s11 = peg$currPos;\n          s12 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s13 = peg$c8;\n            peg$currPos++;\n          } else {\n            s13 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s13 !== peg$FAILED) {\n            s14 = peg$parse_();\n            s15 = peg$parseRestOfLine();\n            if (s15 !== peg$FAILED) {\n              peg$savedPos = s11;\n              s11 = peg$f7(s2, s4, s6, s8, s10, s15);\n            } else {\n              peg$currPos = s11;\n              s11 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s11;\n            s11 = peg$FAILED;\n          }\n          if (s11 === peg$FAILED) {\n            s11 = null;\n          }\n          s12 = peg$parseLineEnd();\n          if (s12 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f8(s2, s4, s6, s8, s10, s11);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoteLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 4);\n    if (s2.toLowerCase() === peg$c9) {\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f9();\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelTok() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c10) {\n      s1 = peg$c10;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c11) {\n        s1 = peg$c11;\n        peg$currPos += 4;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s1 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c12) {\n          s1 = peg$c12;\n          peg$currPos += 4;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n        if (s1 === peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c13) {\n            s1 = peg$c13;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s1 === peg$FAILED) {\n            if (input.substr(peg$currPos, 3) === peg$c14) {\n              s1 = peg$c14;\n              peg$currPos += 3;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e15); }\n            }\n            if (s1 === peg$FAILED) {\n              if (input.substr(peg$currPos, 3) === peg$c15) {\n                s1 = peg$c15;\n                peg$currPos += 3;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n              if (s1 === peg$FAILED) {\n                if (input.substr(peg$currPos, 3) === peg$c16) {\n                  s1 = peg$c16;\n                  peg$currPos += 3;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                }\n                if (s1 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 3) === peg$c17) {\n                    s1 = peg$c17;\n                    peg$currPos += 3;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                  }\n                  if (s1 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 3) === peg$c18) {\n                      s1 = peg$c18;\n                      peg$currPos += 3;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                    }\n                    if (s1 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 3) === peg$c19) {\n                        s1 = peg$c19;\n                        peg$currPos += 3;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n                      }\n                      if (s1 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 3) === peg$c20) {\n                          s1 = peg$c20;\n                          peg$currPos += 3;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n                        }\n                        if (s1 === peg$FAILED) {\n                          if (input.substr(peg$currPos, 3) === peg$c21) {\n                            s1 = peg$c21;\n                            peg$currPos += 3;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e22); }\n                          }\n                          if (s1 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 2) === peg$c22) {\n                              s1 = peg$c22;\n                              peg$currPos += 2;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e23); }\n                            }\n                            if (s1 === peg$FAILED) {\n                              if (input.substr(peg$currPos, 2) === peg$c23) {\n                                s1 = peg$c23;\n                                peg$currPos += 2;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e24); }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardStr() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c24;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c24;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f10(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e27); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e27); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f11();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e28); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e29); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e29); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { ClassDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutClass } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { ClassDocument, ClassBox, ClassMember, ClassRelation } from './ir.js';\n\nexport const classDiagram: DiagramModule<ClassDocument> = {\n  parseMermaid(input: string): ClassDocument {\n    return parser.parse(input) as ClassDocument;\n  },\n\n  parseYaml(input: string): ClassDocument {\n    return JSON.parse(input) as ClassDocument;\n  },\n\n  layout(ir: ClassDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutClass(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/state/layout.ts \u2014 UML state machine.\n *\n * States place via the shared layered kernel; transitions draw as arrows\n * clipped to node borders with optional labels. Pseudo-states render specially:\n * start (filled dot), end (ringed dot), choice (diamond).\n */\n\nimport type { StateDocument, StateNode } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport {\n  measureFormattedText,\n  renderFormattedText,\n  type FormattedTextLines,\n} from '../../../text/formatted.js';\nimport { measureText } from '../../../text/metrics.js';\nimport {\n  layeredLayout,\n  routeEdge,\n  type GraphNode,\n  type GraphEdge,\n} from '../../../graph/layered.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'state-arrow';\n\nexport function layoutState(ir: StateDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  const stateInfos = new Map<string, FormattedTextLines>();\n  const sizeOf = (s: StateNode): { w: number; h: number } => {\n    if (s.kind === 'start' || s.kind === 'end') return { w: 22, h: 22 };\n    if (s.kind === 'choice') return { w: 34, h: 34 };\n    const info = measureFormattedText(s.label, font, smallFont, 240, 4);\n    stateInfos.set(s.id, info);\n    const w = Math.max(76, Math.ceil(info.maxLineWidth + 28));\n    const h = info.lineCount > 1 ? rhu(info.lineCount * (font * 1.25) + 16) : 38;\n    return { w, h };\n  };\n  const sizes = new Map(ir.states.map((s) => [s.id, sizeOf(s)]));\n\n  const composites = ir.composites ?? [];\n  const compositeIds = new Set(composites.map((c) => c.id));\n  const compositeMap = new Map(composites.map((c) => [c.id, c]));\n\n  // Find inner start/end nodes to hide them from the layout if composite has real members\n  const innerPseudostates = new Set<string>();\n  for (const comp of composites) {\n    for (const id of comp.nodeIds) {\n      if (id.startsWith('__start_') || id.startsWith('__end_')) {\n        innerPseudostates.add(id);\n      }\n    }\n  }\n\n  // Real member IDs per composite (excluding inner pseudostates if real members exist)\n  const compositeMemberIds = new Map<string, readonly string[]>();\n  for (const comp of composites) {\n    const realMembers = comp.nodeIds.filter((id) => !innerPseudostates.has(id));\n    compositeMemberIds.set(comp.id, realMembers.length > 0 ? realMembers : comp.nodeIds);\n  }\n\n  // For graph layout, composite containers are represented by their member flow.\n  // Real nodes to lay out exclude the composite container IDs themselves and inner pseudostates.\n  const layoutStates = ir.states.filter(\n    (s) => !compositeIds.has(s.id) && !innerPseudostates.has(s.id),\n  );\n  const nodes: GraphNode[] = layoutStates.map((s) => ({\n    id: s.id,\n    width: sizes.get(s.id)!.w,\n    height: sizes.get(s.id)!.h,\n  }));\n\n  // Map transitions to appropriate graph edge endpoints:\n  // If an edge targets a composite (e.g. Idle --> Processing), map it to the entry node of Processing.\n  // If an edge leaves a composite (e.g. Processing --> Authorized), map it from the exit node of Processing.\n  const edges: GraphEdge[] = [];\n  for (const t of ir.transitions) {\n    if (innerPseudostates.has(t.from) || innerPseudostates.has(t.to)) {\n      continue;\n    }\n    let from = t.from;\n    let to = t.to;\n    const fromMembers = compositeMemberIds.get(from);\n    if (fromMembers && fromMembers.length > 0) {\n      from = fromMembers[fromMembers.length - 1]!;\n    }\n    const toMembers = compositeMemberIds.get(to);\n    if (toMembers && toMembers.length > 0) {\n      to = toMembers[0]!;\n    }\n    edges.push({ from, to });\n  }\n  const laid = layeredLayout(nodes, edges, { direction: 'TB', layerGap: 56, nodeGap: 40, margin });\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 14 : 0;\n  const yOff = titleH;\n\n  const elements: SceneElement[] = [];\n  if (title)\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  // \u2500\u2500 Composite containers (bounding boxes around members) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const containerRect = new Map<string, { x: number; y: number; width: number; height: number }>();\n  const hidden = new Set<string>(); // composite node ids hidden in favour of their container\n  for (const comp of composites) {\n    const members = compositeMemberIds.get(comp.id) ?? comp.nodeIds;\n    const memberIdSet = new Set(members);\n    const rects = members\n      .map((id) => laid.boxes.get(id))\n      .filter((r): r is NonNullable<typeof r> => !!r);\n    if (rects.length === 0) continue;\n    const pad = 16;\n    let minX = Math.min(...rects.map((r) => r.x)) - pad;\n    let minY = Math.min(...rects.map((r) => r.y)) - pad - 14 + yOff;\n    let maxX = Math.max(...rects.map((r) => r.x + r.width)) + pad;\n    let maxY = Math.max(...rects.map((r) => r.y + r.height)) + pad + yOff;\n\n    // Clamp boundary so it does not encroach on non-member nodes that share the\n    // same y-range. This prevents the container from overlapping sibling nodes.\n    for (const [id, box] of laid.boxes) {\n      if (memberIdSet.has(id) || hidden.has(id)) continue;\n      const nmMinY = box.y;\n      const nmMaxY = box.y + box.height;\n      const rawMinY = Math.min(...rects.map((r) => r.y)) - pad;\n      const rawMaxY = Math.max(...rects.map((r) => r.y + r.height)) + pad;\n      // Skip if no y-overlap with the composite boundary range.\n      if (nmMaxY <= rawMinY || nmMinY >= rawMaxY) continue;\n      // Non-member overlaps in y \u2014 ensure the x boundary stays clear.\n      const nmLeft = box.x,\n        nmRight = box.x + box.width;\n      const memberCentreX =\n        (Math.min(...rects.map((r) => r.x)) + Math.max(...rects.map((r) => r.x + r.width))) / 2;\n      if (nmLeft < maxX && nmRight > minX) {\n        if (nmRight <= memberCentreX) {\n          // Non-member is left of members \u2014 push our left boundary right.\n          minX = Math.max(minX, nmRight + 4);\n        } else {\n          // Non-member is right of members \u2014 push our right boundary left.\n          maxX = Math.min(maxX, nmLeft - 4);\n        }\n      }\n    }\n\n    const rect = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n    containerRect.set(comp.id, rect);\n    hidden.add(comp.id);\n    elements.push(\n      p.rect(\n        { x: rhu(minX), y: rhu(minY), width: rhu(rect.width), height: rhu(rect.height) },\n        palette.surface,\n        palette.primary,\n        1.4,\n        { rx: 10, opacity: 0.5 },\n      ),\n    );\n    elements.push(\n      p.text(comp.label, rhu(minX + 12), rhu(minY + 16), typography.smallFontSize, palette.text, {\n        weight: 'bold',\n      }),\n    );\n  }\n\n  // Resolve a node's effective rect (container for composites, box otherwise).\n  const rectFor = (\n    id: string,\n  ): { x: number; y: number; width: number; height: number } | undefined => {\n    const c = containerRect.get(id);\n    if (c) return c;\n    const b = laid.boxes.get(id);\n    return b ? { x: b.x, y: b.y + yOff, width: b.width, height: b.height } : undefined;\n  };\n\n  // \u2500\u2500 Transitions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  let validEdgeIdx = 0;\n  for (const t of ir.transitions) {\n    if (innerPseudostates.has(t.from) || innerPseudostates.has(t.to)) continue;\n    const currentEdgeIdx = validEdgeIdx++;\n    const a = rectFor(t.from),\n      b = rectFor(t.to);\n    if (!a || !b) continue;\n    const ac = { x: a.x + a.width / 2, y: a.y + a.height / 2 };\n    const bc = { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n    const pa = borderPoint(a, bc.x, bc.y);\n    const pb = borderPoint(b, ac.x, ac.y);\n    // Use routed path for obstacle avoidance; fall back to straight for\n    // composite-to-member transitions where one endpoint is inside a container.\n    const fromBox = laid.boxes.get(t.from),\n      toBox = laid.boxes.get(t.to);\n    let edgePath: string;\n    const bends = laid.edgeBends.get(currentEdgeIdx);\n    if (bends && bends.length > 0 && fromBox && toBox) {\n      const fromPt = { x: a.x + a.width / 2, y: a.y + a.height };\n      const boxesAbove = allBoxes.filter((box) => box.y + box.height + yOff <= b.y);\n      const lowestObstacleBottom =\n        boxesAbove.length > 0 ? Math.max(...boxesAbove.map((box) => box.y + box.height + yOff)) : fromPt.y;\n      const turnY = (lowestObstacleBottom + b.y) / 2;\n      const targetPt = borderPoint(b, fromPt.x, turnY);\n      const pts = [fromPt, { x: fromPt.x, y: turnY }, targetPt];\n      edgePath = pts.map((p, idx) => `${idx === 0 ? 'M' : 'L'} ${rhu(p.x)} ${rhu(p.y)}`).join(' ');\n    } else if (fromBox && toBox) {\n      ({ path: edgePath } = routeEdge(fromBox, toBox, allBoxes, yOff));\n    } else {\n      edgePath = `M ${rhu(pa.x)} ${rhu(pa.y)} L ${rhu(pb.x)} ${rhu(pb.y)}`;\n    }\n    elements.push(p.path(edgePath, palette.textMuted, 1.4, { markerEnd: ARROW_ID }));\n    if (t.label) {\n      let mx = (pa.x + pb.x) / 2,\n        my = (pa.y + pb.y) / 2;\n      // Only shift label outside a composite boundary if exactly one endpoint\n      // belongs to that composite (cross-boundary edge). Inner transitions\n      // (both endpoints inside) keep their labels inside the boundary.\n      for (const [compId, cr] of containerRect) {\n        const comp = composites.find((c) => c.id === compId);\n        if (!comp) continue;\n        const fromInside = comp.nodeIds.includes(t.from);\n        const toInside = comp.nodeIds.includes(t.to);\n        if (fromInside && toInside) continue; // inner: no shift needed\n        if (!fromInside && !toInside) continue; // unrelated: no shift needed\n        // Cross-boundary: shift label outside if midpoint landed inside.\n        if (mx > cr.x && mx < cr.x + cr.width && my > cr.y && my < cr.y + cr.height) {\n          my = cr.y - typography.smallFontSize - 4;\n          break;\n        }\n      }\n      const w = measureText(t.label, typography.smallFontSize).width + 8;\n      elements.push(\n        p.rect(\n          {\n            x: rhu(mx - w / 2),\n            y: rhu(my - typography.smallFontSize),\n            width: rhu(w),\n            height: typography.smallFontSize + 4,\n          },\n          palette.background,\n          palette.background,\n          0,\n        ),\n      );\n      elements.push(\n        p.text(t.label, rhuInt(mx), rhu(my - 1), typography.smallFontSize, palette.textMuted, {\n          anchor: 'middle',\n        }),\n      );\n    }\n  }\n\n  // \u2500\u2500 States \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const s of ir.states) {\n    if (hidden.has(s.id) || innerPseudostates.has(s.id)) continue;\n    const box = laid.boxes.get(s.id)!;\n    const x = box.x,\n      y = box.y + yOff;\n    const cx = x + box.width / 2,\n      cy = y + box.height / 2;\n    if (s.kind === 'start') {\n      elements.push(p.circle({ x: rhu(cx), y: rhu(cy) }, 8, palette.text, palette.text, 0));\n    } else if (s.kind === 'end') {\n      elements.push(p.circle({ x: rhu(cx), y: rhu(cy) }, 10, 'none', palette.text, 1.5));\n      elements.push(p.circle({ x: rhu(cx), y: rhu(cy) }, 5, palette.text, palette.text, 0));\n    } else if (s.kind === 'choice') {\n      const r = box.width / 2;\n      elements.push(\n        p.path(\n          `M ${rhu(cx)} ${rhu(cy - r)} L ${rhu(cx + r)} ${rhu(cy)} L ${rhu(cx)} ${rhu(cy + r)} L ${rhu(cx - r)} ${rhu(cy)} Z`,\n          palette.border,\n          1.4,\n          { fill: palette.surface },\n        ),\n      );\n    } else {\n      elements.push(\n        p.rect(\n          { x: rhu(x), y: rhu(y), width: rhu(box.width), height: rhu(box.height) },\n          palette.surface,\n          palette.primary,\n          1.4,\n          { rx: 10 },\n        ),\n      );\n      const info = stateInfos.get(s.id);\n      if (info) {\n        elements.push(\n          ...renderFormattedText(\n            p,\n            info,\n            x,\n            y,\n            box.width,\n            box.height,\n            font,\n            smallFont,\n            palette.text,\n            palette.textMuted,\n            { align: 'middle', defaultBold: true },\n          ),\n        );\n      }\n    }\n  }\n\n  const totalW = rhuInt(laid.width + margin);\n  const totalH = rhuInt(laid.height + yOff + margin);\n  const s = theme.edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function collect(stmts, states, transitions, composites, scope) {\n    const ensure = (id, label, kind) => {\n      let s = states.find(x => x.id === id);\n      if (!s) { s = { id, label: label || id, kind: kind || 'normal' }; states.push(s); }\n      else {\n        if (label) s.label = label;\n        if (kind && s.kind === 'normal') s.kind = kind;\n      }\n      return s;\n    };\n    const ref = (r, side) => {\n      if (r === '[*]') {\n        const id = side === 'from' ? '__start__' : '__end__';\n        ensure(id, '', side === 'from' ? 'start' : 'end');\n        return id;\n      }\n      ensure(r);\n      return r;\n    };\n    const localIds = new Set();\n    for (const st of stmts.filter(Boolean)) {\n      if (st.t === 'choice') { ensure(st.id, st.id, 'choice'); localIds.add(st.id); }\n      else if (st.t === 'state') { ensure(st.id, st.label || st.id, 'normal'); localIds.add(st.id); }\n      else if (st.t === 'trans') {\n        if (scope && (st.from === '[*]' || st.to === '[*]')) {\n          if (st.from !== '[*]') { ensure(st.from); localIds.add(st.from); }\n          if (st.to !== '[*]') { ensure(st.to); localIds.add(st.to); }\n        } else {\n          const f = ref(st.from, 'from'), to = ref(st.to, 'to');\n          transitions.push({ from: f, to: to, ...(st.label ? { label: st.label } : {}) });\n          if (f !== '__start__' && f !== '__end__') localIds.add(f);\n          if (to !== '__start__' && to !== '__end__') localIds.add(to);\n        }\n      } else if (st.t === 'block') {\n        const innerIds = collect(st.inner, states, transitions, composites, st.name);\n        const memberIds = [...innerIds];\n        composites.push({ id: st.name, label: st.name, nodeIds: memberIds });\n        for (const id of innerIds) localIds.add(id);\n      }\n    }\n    return localIds;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"statediagram\";\n  var peg$c1 = \"-v2\";\n  var peg$c2 = \"---\";\n  var peg$c3 = \"state\";\n  var peg$c4 = \"{\";\n  var peg$c5 = \"\\r\";\n  var peg$c6 = \"\\n\";\n  var peg$c7 = \"}\";\n  var peg$c8 = \"<<\";\n  var peg$c9 = \"choice\";\n  var peg$c10 = \"fork\";\n  var peg$c11 = \"join\";\n  var peg$c12 = \">>\";\n  var peg$c13 = \"-->\";\n  var peg$c14 = \":\";\n  var peg$c15 = \"as\";\n  var peg$c16 = \"direction\";\n  var peg$c17 = \"note\";\n  var peg$c18 = \"[*]\";\n  var peg$c19 = \"\\\"\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"stateDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"-v2\", false);\n  var peg$e2 = peg$literalExpectation(\"---\", false);\n  var peg$e3 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e4 = peg$literalExpectation(\"state\", true);\n  var peg$e5 = peg$literalExpectation(\"{\", false);\n  var peg$e6 = peg$literalExpectation(\"\\r\", false);\n  var peg$e7 = peg$literalExpectation(\"\\n\", false);\n  var peg$e8 = peg$literalExpectation(\"}\", false);\n  var peg$e9 = peg$literalExpectation(\"<<\", false);\n  var peg$e10 = peg$literalExpectation(\"choice\", false);\n  var peg$e11 = peg$literalExpectation(\"fork\", false);\n  var peg$e12 = peg$literalExpectation(\"join\", false);\n  var peg$e13 = peg$literalExpectation(\">>\", false);\n  var peg$e14 = peg$literalExpectation(\"-->\", false);\n  var peg$e15 = peg$literalExpectation(\":\", false);\n  var peg$e16 = peg$literalExpectation(\"as\", true);\n  var peg$e17 = peg$literalExpectation(\"direction\", true);\n  var peg$e18 = peg$literalExpectation(\"note\", true);\n  var peg$e19 = peg$literalExpectation(\"[*]\", false);\n  var peg$e20 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e21 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e22 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e23 = peg$anyExpectation();\n  var peg$e24 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const states = [];\n      const transitions = [];\n      const composites = [];\n      collect(stmts, states, transitions, composites);\n      return { version: '1.0', metadata: { ...(fm || {}) }, states, transitions, ...(composites.length ? { composites } : {}) };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(name, inner) { return { t: 'block', name, inner }; };\n  var peg$f4 = function(id) { return { t: 'choice', id }; };\n  var peg$f5 = function(from, to, l) { return l.trim(); };\n  var peg$f6 = function(from, to, label) {\n      return { t: 'trans', from, to, label: label || undefined };\n    };\n  var peg$f7 = function(label, id) { return { t: 'state', id, label }; };\n  var peg$f8 = function(id) { return { t: 'state', id, label: id }; };\n  var peg$f9 = function(id, label) { return { t: 'state', id, label: label.trim() }; };\n  var peg$f10 = function() { return null; };\n  var peg$f11 = function() { return '[*]'; };\n  var peg$f12 = function(s) { return s; };\n  var peg$f13 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 12);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 12;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c1) {\n        s4 = peg$c1;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = peg$parseStatement();\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = peg$parseStatement();\n        }\n        s7 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s6);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c2) {\n      s1 = peg$c2;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s7 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c2) {\n            s7 = peg$c2;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e3); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s4 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseStateBlock();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseChoiceDecl();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseTransition();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseStateDecl();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseStateDescDecl();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseDirectiveLine();\n              if (s0 === peg$FAILED) {\n                s0 = peg$parseBlankLine();\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStateBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 123) {\n            s6 = peg$c4;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s8 = peg$c5;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s8 === peg$FAILED) {\n              s8 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s9 = peg$c6;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s9 !== peg$FAILED) {\n              s10 = [];\n              s11 = peg$parseStatement();\n              while (s11 !== peg$FAILED) {\n                s10.push(s11);\n                s11 = peg$parseStatement();\n              }\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 125) {\n                s12 = peg$c7;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parseLineEnd();\n                if (s13 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f3(s4, s10);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseChoiceDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c8) {\n              s6 = peg$c8;\n              peg$currPos += 2;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e9); }\n            }\n            if (s6 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 6) === peg$c9) {\n                s7 = peg$c9;\n                peg$currPos += 6;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e10); }\n              }\n              if (s7 === peg$FAILED) {\n                if (input.substr(peg$currPos, 4) === peg$c10) {\n                  s7 = peg$c10;\n                  peg$currPos += 4;\n                } else {\n                  s7 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e11); }\n                }\n                if (s7 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 4) === peg$c11) {\n                    s7 = peg$c11;\n                    peg$currPos += 4;\n                  } else {\n                    s7 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e12); }\n                  }\n                }\n              }\n              if (s7 !== peg$FAILED) {\n                if (input.substr(peg$currPos, 2) === peg$c12) {\n                  s8 = peg$c12;\n                  peg$currPos += 2;\n                } else {\n                  s8 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e13); }\n                }\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$parseLineEnd();\n                  if (s9 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f4(s4);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTransition() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseStateRef();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.substr(peg$currPos, 3) === peg$c13) {\n        s4 = peg$c13;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseStateRef();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$currPos;\n          s8 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s9 = peg$c14;\n            peg$currPos++;\n          } else {\n            s9 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n          if (s9 !== peg$FAILED) {\n            s10 = peg$parse_();\n            s11 = peg$parseRestOfLine();\n            if (s11 !== peg$FAILED) {\n              peg$savedPos = s7;\n              s7 = peg$f5(s2, s6, s11);\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 === peg$FAILED) {\n            s7 = null;\n          }\n          s8 = peg$parseLineEnd();\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s2, s6, s7);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStateDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseQuotedOrId();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = input.substr(peg$currPos, 2);\n            if (s6.toLowerCase() === peg$c15) {\n              peg$currPos += 2;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse__();\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parseIdent();\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$parseLineEnd();\n                  if (s9 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f7(s4, s8);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      s2 = input.substr(peg$currPos, 5);\n      if (s2.toLowerCase() === peg$c3) {\n        peg$currPos += 5;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse__();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseIdent();\n          if (s4 !== peg$FAILED) {\n            s5 = peg$parseLineEnd();\n            if (s5 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f8(s4);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStateDescDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c14;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseRestOfLine();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parseLineEnd();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f9(s2, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDirectiveLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 9);\n    if (s2.toLowerCase() === peg$c16) {\n      peg$currPos += 9;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 4);\n      if (s2.toLowerCase() === peg$c17) {\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r0.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r0.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f10();\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStateRef() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c18) {\n      s1 = peg$c18;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f11();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseIdent();\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuotedOrId() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c19;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c19;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f12(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseIdent();\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e22); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f13();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c5;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c6;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e24); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { StateDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutState } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { StateDocument, StateNode, StateTransition } from './ir.js';\n\nexport const state: DiagramModule<StateDocument> = {\n  parseMermaid(input: string): StateDocument {\n    return parser.parse(input) as StateDocument;\n  },\n\n  parseYaml(input: string): StateDocument {\n    return JSON.parse(input) as StateDocument;\n  },\n\n  layout(ir: StateDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutState(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/er/layout.ts \u2014 Entity-relationship diagram.\n *\n * Entities render as header + typed-attribute tables; placement uses the shared\n * layered kernel. Relationships connect entity borders with crow's-foot\n * cardinality markers (one = tick, many = foot, zero = circle).\n */\n\nimport type { ErDocument, ErEntity } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport {\n  layeredLayout,\n  routeEdge,\n  type GraphNode,\n  type GraphEdge,\n} from '../../../graph/layered.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\nimport { readableText } from '../../../theme/contrast.js';\n\nexport function layoutEr(ir: ErDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const nameFont = typography.baseFontSize;\n  const rowFont = typography.smallFontSize;\n  const rowH = rhuInt(rowFont * 1.7);\n  const headH = rhuInt(nameFont * 1.8);\n\n  const sizeOf = (e: ErEntity): { w: number; h: number } => {\n    const rowText = (a: ErEntity['attributes'][number]) =>\n      `${a.type}  ${a.name}${a.key ? '  ' + a.key : ''}`;\n    const w = Math.max(\n      140,\n      measureText(e.name, nameFont).width + 28,\n      ...e.attributes.map((a) => measureText(rowText(a), rowFont).width + 28),\n    );\n    const h = headH + e.attributes.length * rowH + (e.attributes.length ? 6 : 0);\n    return { w, h };\n  };\n  const sizes = new Map(ir.entities.map((e) => [e.name, sizeOf(e)]));\n\n  const nodes: GraphNode[] = ir.entities.map((e) => ({\n    id: e.name,\n    width: sizes.get(e.name)!.w,\n    height: sizes.get(e.name)!.h,\n  }));\n  const edges: GraphEdge[] = ir.relations.map((r) => ({ from: r.left, to: r.right }));\n  const laid = layeredLayout(nodes, edges, { direction: 'TB', layerGap: 70, nodeGap: 50, margin });\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 14 : 0;\n  const yOff = titleH;\n\n  const elements: SceneElement[] = [];\n  if (title)\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  // \u2500\u2500 Relationships \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  for (const r of ir.relations) {\n    const a = laid.boxes.get(r.left),\n      b = laid.boxes.get(r.right);\n    if (!a || !b) continue;\n    const ac = { x: a.x + a.width / 2, y: a.y + a.height / 2 + yOff };\n    const bc = { x: b.x + b.width / 2, y: b.y + b.height / 2 + yOff };\n    const pa = borderPoint({ ...a, y: a.y + yOff }, bc.x, bc.y);\n    const pb = borderPoint({ ...b, y: b.y + yOff }, ac.x, ac.y);\n    const { path } = routeEdge(a, b, allBoxes, yOff);\n    elements.push(p.path(path, palette.textMuted, 1.3, r.dashed ? { dash: '6 4' } : {}));\n    elements.push(...crowFoot(p, pa, bc, r.leftCard, palette));\n    elements.push(...crowFoot(p, pb, ac, r.rightCard, palette));\n    if (r.label) {\n      const mx = (pa.x + pb.x) / 2,\n        my = (pa.y + pb.y) / 2;\n      const w = measureText(r.label, rowFont).width + 8;\n      elements.push(\n        p.rect(\n          { x: rhu(mx - w / 2), y: rhu(my - rowFont), width: rhu(w), height: rowFont + 4 },\n          palette.background,\n          palette.background,\n          0,\n        ),\n      );\n      elements.push(\n        p.text(r.label, rhuInt(mx), rhu(my - 1), rowFont, palette.textMuted, { anchor: 'middle' }),\n      );\n    }\n  }\n\n  // \u2500\u2500 Entities \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const e of ir.entities) {\n    const box = laid.boxes.get(e.name)!;\n    const s = sizes.get(e.name)!;\n    const x = box.x,\n      y = box.y + yOff;\n    elements.push(\n      p.rect(\n        { x: rhu(x), y: rhu(y), width: rhu(s.w), height: rhu(s.h) },\n        palette.surface,\n        palette.border,\n        1.4,\n        { rx: 4 },\n      ),\n    );\n    elements.push(\n      p.rect(\n        { x: rhu(x), y: rhu(y), width: rhu(s.w), height: headH },\n        palette.primary,\n        palette.border,\n        1.4,\n        { rx: 4 },\n      ),\n    );\n    elements.push(\n      p.text(\n        e.name,\n        rhuInt(x + s.w / 2),\n        rhu(y + headH / 2 + nameFont * 0.35),\n        nameFont,\n        readableText(palette.primary, theme),\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n    let ry = y + headH + rowH - 5;\n    for (const a of e.attributes) {\n      elements.push(p.text(`${a.type}  ${a.name}`, rhu(x + 8), rhu(ry), rowFont, palette.text));\n      if (a.key)\n        elements.push(\n          p.text(a.key, rhu(x + s.w - 8), rhu(ry), rowFont, palette.secondary, {\n            anchor: 'end',\n            weight: 'bold',\n          }),\n        );\n      ry += rowH;\n    }\n  }\n\n  const totalW = rhuInt(laid.width + margin);\n  const totalH = rhuInt(laid.height + yOff + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n\n/** Crow's-foot cardinality marker at `at`, line heading toward `toward`. */\nfunction crowFoot(\n  p: ReturnType<typeof pen>,\n  at: { x: number; y: number },\n  toward: { x: number; y: number },\n  card: string,\n  palette: ResolvedTheme['palette'],\n): SceneElement[] {\n  const len = Math.hypot(toward.x - at.x, toward.y - at.y) || 1;\n  const ux = (toward.x - at.x) / len,\n    uy = (toward.y - at.y) / len; // unit toward other entity\n  const px = -uy,\n    py = ux; // perpendicular\n  const at2 = (d: number, s: number) => ({ x: at.x + ux * d + px * s, y: at.y + uy * d + py * s });\n  const out: SceneElement[] = [];\n  const color = palette.textMuted;\n\n  const many = /[}{]/.test(card);\n  const zero = /o/.test(card);\n  const one = /\\|/.test(card);\n\n  if (many) {\n    const base = at2(14, 0);\n    const a = at2(0, 6),\n      b = at2(0, -6);\n    out.push(p.path(`M ${rhu(base.x)} ${rhu(base.y)} L ${rhu(a.x)} ${rhu(a.y)}`, color, 1.2));\n    out.push(p.path(`M ${rhu(base.x)} ${rhu(base.y)} L ${rhu(b.x)} ${rhu(b.y)}`, color, 1.2));\n    out.push(p.path(`M ${rhu(base.x)} ${rhu(base.y)} L ${rhu(at.x)} ${rhu(at.y)}`, color, 1.2));\n  } else if (one) {\n    const c1 = at2(10, 6),\n      c2 = at2(10, -6);\n    out.push(p.path(`M ${rhu(c1.x)} ${rhu(c1.y)} L ${rhu(c2.x)} ${rhu(c2.y)}`, color, 1.3));\n  }\n  if (zero) {\n    const c = at2(many ? 20 : 16, 0);\n    out.push(p.circle({ x: rhu(c.x), y: rhu(c.y) }, 4, palette.background, color, 1.2));\n  } else if (one && !many) {\n    const c1 = at2(15, 5),\n      c2 = at2(15, -5);\n    out.push(p.path(`M ${rhu(c1.x)} ${rhu(c1.y)} L ${rhu(c2.x)} ${rhu(c2.y)}`, color, 1.3));\n  }\n  return out;\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"erdiagram\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"{\";\n  var peg$c3 = \"\\r\";\n  var peg$c4 = \"\\n\";\n  var peg$c5 = \"}\";\n  var peg$c6 = \"\\\"\";\n  var peg$c7 = \":\";\n  var peg$c8 = \"--\";\n  var peg$c9 = \"..\";\n  var peg$c10 = \"PK\";\n  var peg$c11 = \"FK\";\n  var peg$c12 = \"UK\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[|}{o]/;\n  var peg$r3 = /^[A-Za-z0-9_]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"erDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"{\", false);\n  var peg$e4 = peg$literalExpectation(\"\\r\", false);\n  var peg$e5 = peg$literalExpectation(\"\\n\", false);\n  var peg$e6 = peg$literalExpectation(\"}\", false);\n  var peg$e7 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e8 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e9 = peg$literalExpectation(\":\", false);\n  var peg$e10 = peg$classExpectation([\"|\", \"}\", \"{\", \"o\"], false, false);\n  var peg$e11 = peg$literalExpectation(\"--\", false);\n  var peg$e12 = peg$literalExpectation(\"..\", false);\n  var peg$e13 = peg$literalExpectation(\"PK\", false);\n  var peg$e14 = peg$literalExpectation(\"FK\", false);\n  var peg$e15 = peg$literalExpectation(\"UK\", false);\n  var peg$e16 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e17 = peg$anyExpectation();\n  var peg$e18 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const entities = [];\n      const relations = [];\n      const ensure = (name) => { let e = entities.find(x => x.name === name); if (!e) { e = { name, attributes: [] }; entities.push(e); } return e; };\n      for (const st of stmts.filter(Boolean)) {\n        if (st.t === 'entity') { const e = ensure(st.name); for (const a of st.attrs) e.attributes.push(a); }\n        else if (st.t === 'rel') {\n          ensure(st.left); ensure(st.right);\n          const dashed = st.tok.includes('..');\n          const leftCard = st.tok.slice(0, 2);\n          const rightCard = st.tok.slice(-2);\n          relations.push({ left: st.left, right: st.right, leftCard, rightCard, dashed, ...(st.label ? { label: st.label } : {}) });\n        }\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, entities, relations };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(name, rows) { return { t: 'entity', name, attrs: rows.filter(Boolean) }; };\n  var peg$f4 = function(type, name, k) { return k; };\n  var peg$f5 = function(type, name, key) {\n      return { type, name, ...(key ? { key } : {}) };\n    };\n  var peg$f6 = function() { return null; };\n  var peg$f7 = function(left, tok, right, label) {\n      return { t: 'rel', left, right, tok, label };\n    };\n  var peg$f8 = function(s) { return s; };\n  var peg$f9 = function(s) { return s.trim(); };\n  var peg$f10 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 9);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 9;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseEntityBlock();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseRelation();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlankLine();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEntityBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 123) {\n        s4 = peg$c2;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s6 = peg$c3;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s6 === peg$FAILED) {\n          s6 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s7 = peg$c4;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = [];\n          s9 = peg$parseAttrRow();\n          while (s9 !== peg$FAILED) {\n            s8.push(s9);\n            s9 = peg$parseAttrRow();\n          }\n          s9 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 125) {\n            s10 = peg$c5;\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s10 !== peg$FAILED) {\n            s11 = peg$parseLineEnd();\n            if (s11 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f3(s2, s8);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrRow() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 125) {\n      s3 = peg$c5;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseIdent();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse__();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseIdent();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = peg$parse__();\n            if (s7 !== peg$FAILED) {\n              s8 = peg$parseKey();\n              if (s8 !== peg$FAILED) {\n                peg$savedPos = s6;\n                s6 = peg$f4(s3, s5, s8);\n              } else {\n                peg$currPos = s6;\n                s6 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n            if (s6 === peg$FAILED) {\n              s6 = null;\n            }\n            s7 = peg$currPos;\n            s8 = peg$parse__();\n            if (s8 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 34) {\n                s9 = peg$c6;\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n              if (s9 !== peg$FAILED) {\n                s10 = [];\n                s11 = input.charAt(peg$currPos);\n                if (peg$r1.test(s11)) {\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e8); }\n                }\n                while (s11 !== peg$FAILED) {\n                  s10.push(s11);\n                  s11 = input.charAt(peg$currPos);\n                  if (peg$r1.test(s11)) {\n                    peg$currPos++;\n                  } else {\n                    s11 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e8); }\n                  }\n                }\n                if (input.charCodeAt(peg$currPos) === 34) {\n                  s11 = peg$c6;\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e7); }\n                }\n                if (s11 !== peg$FAILED) {\n                  s8 = [s8, s9, s10, s11];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n            if (s7 === peg$FAILED) {\n              s7 = null;\n            }\n            s8 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s9 = peg$c3;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n            if (s9 === peg$FAILED) {\n              s9 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s10 = peg$c4;\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e5); }\n            }\n            if (s10 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f5(s3, s5, s6);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s2 = peg$c3;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s3 = peg$c4;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f6();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelation() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseErTok();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseIdent();\n            if (s6 !== peg$FAILED) {\n              s7 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s8 = peg$c7;\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e9); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parse_();\n                s10 = peg$parseRelLabel();\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$parseLineEnd();\n                  if (s11 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f7(s2, s4, s6, s10);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c6;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c6;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = input.charAt(peg$currPos);\n          if (peg$r0.test(s3)) {\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f9(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseErTok() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = input.charAt(peg$currPos);\n      if (peg$r2.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c8) {\n          s4 = peg$c8;\n          peg$currPos += 2;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s4 === peg$FAILED) {\n          if (input.substr(peg$currPos, 2) === peg$c9) {\n            s4 = peg$c9;\n            peg$currPos += 2;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = input.charAt(peg$currPos);\n          if (peg$r2.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e10); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = input.charAt(peg$currPos);\n            if (peg$r2.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n            if (s6 !== peg$FAILED) {\n              s2 = [s2, s3, s4, s5, s6];\n              s1 = s2;\n            } else {\n              peg$currPos = s1;\n              s1 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s1;\n            s1 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseKey() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c10) {\n      s0 = peg$c10;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 2) === peg$c11) {\n        s0 = peg$c11;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c12) {\n          s0 = peg$c12;\n          peg$currPos += 2;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r3.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c4;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f10();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r4.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { ErDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutEr } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { ErDocument, ErEntity, ErAttribute, ErRelation } from './ir.js';\n\nexport const er: DiagramModule<ErDocument> = {\n  parseMermaid(input: string): ErDocument {\n    return parser.parse(input) as ErDocument;\n  },\n\n  parseYaml(input: string): ErDocument {\n    return JSON.parse(input) as ErDocument;\n  },\n\n  layout(ir: ErDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutEr(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/block/layout.ts \u2014 Block diagram (column grid).\n *\n * Blocks pack left\u2192right into a fixed column grid, honouring per-block column\n * spans and wrapping when a span would overflow the row. Edges connect block\n * centres, clipped to borders, with an arrowhead.\n */\n\nimport type { BlockDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult, Rect } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport {\n  measureFormattedText,\n  renderFormattedText,\n  type FormattedTextLines,\n} from '../../../text/formatted.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\nimport { wavifyPath } from '../../../crosslink/render.js';\nimport type { RenderedConnectorAnimation } from '../../../contracts/animations.js';\n\nconst ARROW_END_ID = 'block-arrow';\nconst ARROW_START_ID = 'block-arrow-start';\n\nfunction edgeDash(style: string | undefined): string | undefined {\n  switch (style) {\n    case 'dotted':\n      return '6 3';\n    case 'dashed':\n      return '8 4';\n    default:\n      return undefined;\n  }\n}\n\nfunction edgeStrokeWidth(style: string | undefined, base: number): number {\n  return style === 'thick' ? base * 2 : base;\n}\n\nexport function layoutBlock(ir: BlockDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  const cols = Math.max(1, ir.columns);\n  const cellW = 150;\n  const gap = 40;\n  const defaultRowH = 56;\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n  const top = margin + titleH;\n\n  // \u2500\u2500 Measure blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const blockInfos = new Map<string, FormattedTextLines>();\n  for (const b of ir.blocks) {\n    const span = Math.min(b.span, cols);\n    const w = span * cellW + (span - 1) * gap;\n    const info = measureFormattedText(b.label, font, smallFont, w - 24, 4);\n    blockInfos.set(b.id, info);\n  }\n\n  // \u2500\u2500 Pack into the grid with dynamic row heights \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const rects = new Map<string, Rect>();\n  let col = 0,\n    row = 0;\n  const rowItems: { b: (typeof ir.blocks)[number]; span: number; col: number; row: number }[] = [];\n  const rowMaxLines = new Map<number, number>();\n\n  for (const b of ir.blocks) {\n    const span = Math.min(b.span, cols);\n    if (col + span > cols) {\n      col = 0;\n      row += 1;\n    }\n    const info = blockInfos.get(b.id)!;\n    rowMaxLines.set(row, Math.max(rowMaxLines.get(row) ?? 1, info.lineCount));\n    rowItems.push({ b, span, col, row });\n    col += span;\n  }\n\n  // Calculate top y for each row\n  const rowY = new Map<number, number>();\n  const rowHeightMap = new Map<number, number>();\n  let curY = top;\n  for (let r = 0; r <= row; r++) {\n    const maxL = rowMaxLines.get(r) ?? 1;\n    const h = maxL > 1 ? rhu(maxL * (font * 1.25) + 20) : defaultRowH;\n    rowY.set(r, curY);\n    rowHeightMap.set(r, h);\n    curY += h + gap;\n  }\n\n  for (const item of rowItems) {\n    const x = margin + item.col * (cellW + gap);\n    const w = item.span * cellW + (item.span - 1) * gap;\n    const y = rowY.get(item.row)!;\n    const h = rowHeightMap.get(item.row)!;\n    rects.set(item.b.id, { x, y, width: w, height: h });\n  }\n\n  const elements: SceneElement[] = [];\n  if (ir.metadata.title)\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  // \u2500\u2500 Edges (under blocks) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const e of ir.edges) {\n    const a = rects.get(e.from),\n      b = rects.get(e.to);\n    if (!a || !b) continue;\n    const ac = { x: a.x + a.width / 2, y: a.y + a.height / 2 };\n    const bc = { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n    const pa = borderPoint(a, bc.x, bc.y);\n    const pb = borderPoint(b, ac.x, ac.y);\n    const style = e.style ?? 'solid';\n    const pathOpts: Parameters<typeof p.path>[3] = {};\n    if ((e.endMarker ?? 'arrow') === 'arrow') pathOpts.markerEnd = ARROW_END_ID;\n    if (e.startMarker === 'arrow') pathOpts.markerStart = ARROW_START_ID;\n    const dash = edgeDash(style);\n    if (dash) pathOpts.dash = dash;\n    let anim: RenderedConnectorAnimation | undefined;\n    if (e.animation === 'none') anim = undefined;\n    else if (e.animation) anim = e.animation;\n    else if (style === 'dotted' || style === 'dashed') anim = 'march';\n    if (anim) pathOpts.animated = anim;\n    const path =\n      style === 'wavy'\n        ? wavifyPath([pa, pb], 3, 12)\n        : `M ${rhu(pa.x)} ${rhu(pa.y)} L ${rhu(pb.x)} ${rhu(pb.y)}`;\n    elements.push(p.path(path, palette.primary, edgeStrokeWidth(style, 1.6), pathOpts));\n    if (e.label)\n      elements.push(\n        p.text(\n          e.label,\n          rhuInt((pa.x + pb.x) / 2),\n          rhuInt((pa.y + pb.y) / 2 - 4),\n          typography.smallFontSize,\n          palette.textMuted,\n          { anchor: 'middle' },\n        ),\n      );\n  }\n\n  // \u2500\u2500 Blocks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.blocks.forEach((b, i) => {\n    const r = rects.get(b.id)!;\n    const hue = categoricalHue(i, theme);\n    const info = blockInfos.get(b.id);\n    elements.push(\n      p.rect(\n        { x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: rhu(r.height) },\n        palette.surface,\n        hue,\n        1.6,\n        { rx: 8 },\n      ),\n    );\n    if (info) {\n      elements.push(\n        ...renderFormattedText(\n          p,\n          info,\n          r.x,\n          r.y,\n          r.width,\n          r.height,\n          font,\n          smallFont,\n          palette.text,\n          palette.textMuted,\n          { align: 'middle', defaultBold: true },\n        ),\n      );\n    }\n  });\n\n  const maxRight = Math.max(margin, ...[...rects.values()].map((r) => r.x + r.width));\n  const maxBottom = Math.max(top, ...[...rects.values()].map((r) => r.y + r.height));\n  const s = theme.edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n  const defs = [\n    `<marker id=\"${ARROW_END_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n    `<marker id=\"${ARROW_START_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto-start-reverse\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: rhuInt(maxRight + margin), height: rhuInt(maxBottom + margin) },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  import { CONNECTOR_ANIMATIONS } from '../../../contracts/animations.js';\n\n  const ANIMATION_SET = new Set(CONNECTOR_ANIMATIONS);\n  const CONNECTOR_TOKEN_MAP = {\n    '<-->':  { style: 'solid',  startMarker: 'arrow', endMarker: 'arrow' },\n    '<-.->': { style: 'dotted', startMarker: 'arrow', endMarker: 'arrow' },\n    '<==>':  { style: 'thick',  startMarker: 'arrow', endMarker: 'arrow' },\n    '<-_->': { style: 'dashed', startMarker: 'arrow', endMarker: 'arrow' },\n    '<-~->': { style: 'wavy',   startMarker: 'arrow', endMarker: 'arrow' },\n\n    '-->':   { style: 'solid',  startMarker: 'none', endMarker: 'arrow' },\n    '-.->':  { style: 'dotted', startMarker: 'none', endMarker: 'arrow' },\n    '==>':   { style: 'thick',  startMarker: 'none', endMarker: 'arrow' },\n    '-_->':  { style: 'dashed', startMarker: 'none', endMarker: 'arrow' },\n    '-~->':  { style: 'wavy',   startMarker: 'none', endMarker: 'arrow' },\n\n    '---':   { style: 'solid',  startMarker: 'none', endMarker: 'none' },\n    '-.-':   { style: 'dotted', startMarker: 'none', endMarker: 'none' },\n    '===':   { style: 'thick',  startMarker: 'none', endMarker: 'none' },\n    '-_-':   { style: 'dashed', startMarker: 'none', endMarker: 'none' },\n    '-~-':   { style: 'wavy',   startMarker: 'none', endMarker: 'none' },\n  };\n\n  function assertAnim(value) {\n    if (value === 'none') return value;\n    if (!ANIMATION_SET.has(value)) {\n      throw new Error(`Invalid connector animation \"${value}\"`);\n    }\n    return value;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"block-beta\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"columns\";\n  var peg$c3 = \"|\";\n  var peg$c4 = \"<-~->\";\n  var peg$c5 = \"<-_->\";\n  var peg$c6 = \"<-.->\";\n  var peg$c7 = \"<==>\";\n  var peg$c8 = \"<-->\";\n  var peg$c9 = \"-~->\";\n  var peg$c10 = \"-_->\";\n  var peg$c11 = \"-.->\";\n  var peg$c12 = \"==>\";\n  var peg$c13 = \"-->\";\n  var peg$c14 = \"-~-\";\n  var peg$c15 = \"-_-\";\n  var peg$c16 = \"-.-\";\n  var peg$c17 = \"===\";\n  var peg$c18 = \"@\";\n  var peg$c19 = \"anim:\";\n  var peg$c20 = \"{\";\n  var peg$c21 = \",\";\n  var peg$c22 = \"}\";\n  var peg$c23 = \":\";\n  var peg$c24 = \"[\";\n  var peg$c25 = \"]\";\n  var peg$c26 = \"\\r\";\n  var peg$c27 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^|\\n]/;\n  var peg$r2 = /^[^\\]\\n]/;\n  var peg$r3 = /^[A-Za-z0-9_]/;\n  var peg$r4 = /^[0-9]/;\n  var peg$r5 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"block-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"columns\", true);\n  var peg$e4 = peg$literalExpectation(\"|\", false);\n  var peg$e5 = peg$classExpectation([\"|\", \"\\n\"], true, false);\n  var peg$e6 = peg$literalExpectation(\"<-~->\", false);\n  var peg$e7 = peg$literalExpectation(\"<-_->\", false);\n  var peg$e8 = peg$literalExpectation(\"<-.->\", false);\n  var peg$e9 = peg$literalExpectation(\"<==>\", false);\n  var peg$e10 = peg$literalExpectation(\"<-->\", false);\n  var peg$e11 = peg$literalExpectation(\"-~->\", false);\n  var peg$e12 = peg$literalExpectation(\"-_->\", false);\n  var peg$e13 = peg$literalExpectation(\"-.->\", false);\n  var peg$e14 = peg$literalExpectation(\"==>\", false);\n  var peg$e15 = peg$literalExpectation(\"-->\", false);\n  var peg$e16 = peg$literalExpectation(\"-~-\", false);\n  var peg$e17 = peg$literalExpectation(\"-_-\", false);\n  var peg$e18 = peg$literalExpectation(\"-.-\", false);\n  var peg$e19 = peg$literalExpectation(\"===\", false);\n  var peg$e20 = peg$literalExpectation(\"@\", false);\n  var peg$e21 = peg$literalExpectation(\"anim:\", false);\n  var peg$e22 = peg$literalExpectation(\"{\", false);\n  var peg$e23 = peg$literalExpectation(\",\", false);\n  var peg$e24 = peg$literalExpectation(\"}\", false);\n  var peg$e25 = peg$literalExpectation(\":\", false);\n  var peg$e26 = peg$literalExpectation(\"[\", false);\n  var peg$e27 = peg$classExpectation([\"]\", \"\\n\"], true, false);\n  var peg$e28 = peg$literalExpectation(\"]\", false);\n  var peg$e29 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e30 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e31 = peg$literalExpectation(\"\\r\", false);\n  var peg$e32 = peg$literalExpectation(\"\\n\", false);\n  var peg$e33 = peg$anyExpectation();\n  var peg$e34 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      let columns = 1;\n      const blocks = [];\n      const edges = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'columns') columns = s.n;\n        else if (s.t === 'blocks')  for (const b of s.items) blocks.push(b);\n        else if (s.t === 'edge')    edges.push({ from: s.from, to: s.to, ...(s.label ? { label: s.label } : {}), style: s.style, startMarker: s.startMarker, endMarker: s.endMarker, ...(s.animation !== undefined ? { animation: s.animation } : {}) });\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, columns, blocks, edges };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(n) { return { t: 'columns', n }; };\n  var peg$f4 = function(from, conn, l) { return l.trim(); };\n  var peg$f5 = function(from, conn, label, to, tail) {\n      return { t: 'edge', from, to, label: label || undefined, ...conn, ...(tail.animation !== undefined ? { animation: tail.animation } : {}) };\n    };\n  var peg$f6 = function(token) {\n      return CONNECTOR_TOKEN_MAP[token];\n    };\n  var peg$f7 = function(anns, block, rest) {\n      if (/@anim:/.test(rest)) {\n        throw new Error('Invalid connector annotation');\n      }\n      const result = {};\n      if (block) {\n        const b = block[1];\n        if (b.anim !== undefined) result.animation = assertAnim(b.anim);\n      }\n      for (const ann of anns) {\n        Object.assign(result, ann[2]);\n      }\n      return result;\n    };\n  var peg$f8 = function(value) { return { animation: value }; };\n  var peg$f9 = function(value) { return assertAnim(value); };\n  var peg$f10 = function(first, rest) {\n      const result = {};\n      result[first.key] = first.value;\n      for (const r of rest) { result[r[3].key] = r[3].value; }\n      return result;\n    };\n  var peg$f11 = function(key, value) { return { key, value }; };\n  var peg$f12 = function(value) { return value; };\n  var peg$f13 = function(first, b) { return b; };\n  var peg$f14 = function(first, rest) {\n      return { t: 'blocks', items: [first, ...rest] };\n    };\n  var peg$f15 = function(id, t) { return t; };\n  var peg$f16 = function(id, label, n) { return n; };\n  var peg$f17 = function(id, label, span) {\n      return { id, label: label != null ? label.replace(/^[\"']|[\"']$/g, '') : id, span: span || 1 };\n    };\n  var peg$f18 = function(n) { return parseInt(n, 10); };\n  var peg$f19 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 10);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 10;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseColumnsLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseEdgeLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlockLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseBlankLine();\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseColumnsLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseInteger();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$parseConnector();\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 124) {\n          s7 = peg$c3;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$currPos;\n          s9 = [];\n          s10 = input.charAt(peg$currPos);\n          if (peg$r1.test(s10)) {\n            peg$currPos++;\n          } else {\n            s10 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s10 !== peg$FAILED) {\n            while (s10 !== peg$FAILED) {\n              s9.push(s10);\n              s10 = input.charAt(peg$currPos);\n              if (peg$r1.test(s10)) {\n                peg$currPos++;\n              } else {\n                s10 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e5); }\n              }\n            }\n          } else {\n            s9 = peg$FAILED;\n          }\n          if (s9 !== peg$FAILED) {\n            s8 = input.substring(s8, peg$currPos);\n          } else {\n            s8 = s9;\n          }\n          if (s8 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 124) {\n              s9 = peg$c3;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n            if (s9 !== peg$FAILED) {\n              peg$savedPos = s6;\n              s6 = peg$f4(s2, s4, s8);\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        if (s6 === peg$FAILED) {\n          s6 = null;\n        }\n        s7 = peg$parse_();\n        s8 = peg$parseIdent();\n        if (s8 !== peg$FAILED) {\n          s9 = peg$parseEdgeTail();\n          s10 = peg$parseLineEnd();\n          if (s10 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5(s2, s4, s6, s8, s9);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseConnector() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c4) {\n      s1 = peg$c4;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c5) {\n        s1 = peg$c5;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s1 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c6) {\n          s1 = peg$c6;\n          peg$currPos += 5;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s1 === peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c7) {\n            s1 = peg$c7;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s1 === peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c8) {\n              s1 = peg$c8;\n              peg$currPos += 4;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n            if (s1 === peg$FAILED) {\n              if (input.substr(peg$currPos, 4) === peg$c9) {\n                s1 = peg$c9;\n                peg$currPos += 4;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e11); }\n              }\n              if (s1 === peg$FAILED) {\n                if (input.substr(peg$currPos, 4) === peg$c10) {\n                  s1 = peg$c10;\n                  peg$currPos += 4;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e12); }\n                }\n                if (s1 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 4) === peg$c11) {\n                    s1 = peg$c11;\n                    peg$currPos += 4;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e13); }\n                  }\n                  if (s1 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 3) === peg$c12) {\n                      s1 = peg$c12;\n                      peg$currPos += 3;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n                    }\n                    if (s1 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 3) === peg$c13) {\n                        s1 = peg$c13;\n                        peg$currPos += 3;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                      }\n                      if (s1 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 3) === peg$c14) {\n                          s1 = peg$c14;\n                          peg$currPos += 3;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                        }\n                        if (s1 === peg$FAILED) {\n                          if (input.substr(peg$currPos, 3) === peg$c15) {\n                            s1 = peg$c15;\n                            peg$currPos += 3;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                          }\n                          if (s1 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 3) === peg$c16) {\n                              s1 = peg$c16;\n                              peg$currPos += 3;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                            }\n                            if (s1 === peg$FAILED) {\n                              if (input.substr(peg$currPos, 3) === peg$c17) {\n                                s1 = peg$c17;\n                                peg$currPos += 3;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                              }\n                              if (s1 === peg$FAILED) {\n                                if (input.substr(peg$currPos, 3) === peg$c1) {\n                                  s1 = peg$c1;\n                                  peg$currPos += 3;\n                                } else {\n                                  s1 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e1); }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f6(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseEdgeTail() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$currPos;\n    s3 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 64) {\n      s4 = peg$c18;\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$parseAnnotation();\n      if (s5 !== peg$FAILED) {\n        s3 = [s3, s4, s5];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 64) {\n        s4 = peg$c18;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseAnnotation();\n        if (s5 !== peg$FAILED) {\n          s3 = [s3, s4, s5];\n          s2 = s3;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    }\n    s2 = peg$currPos;\n    s3 = peg$parse_();\n    s4 = peg$parsePropBlock();\n    if (s4 !== peg$FAILED) {\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$currPos;\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r0.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    while (s5 !== peg$FAILED) {\n      s4.push(s5);\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n    }\n    s3 = input.substring(s3, peg$currPos);\n    peg$savedPos = s0;\n    s0 = peg$f7(s1, s2, s3);\n\n    return s0;\n  }\n\n  function peg$parseAnnotation() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c19) {\n      s1 = peg$c19;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseAnimValue();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnimValue() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f9(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parsePropBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 123) {\n      s1 = peg$c20;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parsePropEntry();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s7 = peg$c21;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e23); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parsePropEntry();\n          if (s9 !== peg$FAILED) {\n            s6 = [s6, s7, s8, s9];\n            s5 = s6;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c21;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e23); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parsePropEntry();\n            if (s9 !== peg$FAILED) {\n              s6 = [s6, s7, s8, s9];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        }\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 125) {\n          s6 = peg$c22;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f10(s3, s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropEntry() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c23;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parsePropValue();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f11(s1, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropValue() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f12(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBlockLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseBlockDef();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$parse__();\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parseBlockDef();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s4;\n          s4 = peg$f13(s2, s6);\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$parse__();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parseBlockDef();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f13(s2, s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s4 = peg$parse_();\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f14(s2, s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlockDef() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 91) {\n        s3 = peg$c24;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r2.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e27); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r2.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e27); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 93) {\n            s5 = peg$c25;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e28); }\n          }\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s2;\n            s2 = peg$f15(s1, s4);\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c23;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseInteger();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f16(s1, s2, s5);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f17(s1, s2, s3);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r3.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e29); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInteger() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r4.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e30); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r4.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e30); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f18(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c26;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c27;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c26;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c27;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f19();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c26;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c27;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e33); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r5.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e34); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r5.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e34); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { BlockDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutBlock } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { BlockDocument, BlockNode, BlockEdge } from './ir.js';\n\nexport const block: DiagramModule<BlockDocument> = {\n  parseMermaid(input: string): BlockDocument {\n    return parser.parse(input) as BlockDocument;\n  },\n\n  parseYaml(input: string): BlockDocument {\n    return JSON.parse(input) as BlockDocument;\n  },\n\n  layout(ir: BlockDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutBlock(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/requirement/layout.ts \u2014 SysML-style requirement diagram.\n *\n * Requirement / element nodes render as titled boxes (\u00ABkind\u00BB + name + fields);\n * placement uses the shared layered kernel. Relationships draw as dashed\n * connectors with the relationship type as the edge label.\n */\n\nimport type { RequirementDocument, ReqNode } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { wrapText } from '../../../text/wrap.js';\nimport {\n  layeredLayout,\n  routeEdge,\n  type GraphNode,\n  type GraphEdge,\n} from '../../../graph/layered.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'req-arrow';\nconst BOX_W = 230;\n\nexport function layoutRequirement(ir: RequirementDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const nameFont = typography.baseFontSize;\n  const fieldFont = typography.smallFontSize;\n  const lineH = rhuInt(fieldFont * 1.5);\n\n  // Pre-wrap fields and size boxes.\n  const prepared = new Map<string, { lines: string[]; h: number }>();\n  const sizeOf = (n: ReqNode): { w: number; h: number } => {\n    const lines: string[] = [];\n    for (const f of n.fields) {\n      const wrapped = wrapText(`${f.key}: ${f.value}`, fieldFont, BOX_W - 20, 3).lines;\n      lines.push(...wrapped);\n    }\n    const headH = rhuInt(nameFont * 1.5) + fieldFont + 8;\n    const h = headH + lines.length * lineH + 8;\n    prepared.set(n.id, { lines, h });\n    return { w: BOX_W, h };\n  };\n  const sizes = new Map(ir.nodes.map((n) => [n.id, sizeOf(n)]));\n\n  const nodes: GraphNode[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: BOX_W,\n    height: sizes.get(n.id)!.h,\n  }));\n  const edges: GraphEdge[] = ir.relations.map((r) => ({ from: r.from, to: r.to }));\n  const laid = layeredLayout(nodes, edges, { direction: 'TB', layerGap: 60, nodeGap: 44, margin });\n\n  const elements: SceneElement[] = [];\n\n  // \u2500\u2500 Relationships \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  ir.relations.forEach((r, ri) => {\n    const a = laid.boxes.get(r.from),\n      b = laid.boxes.get(r.to);\n    if (!a || !b) return;\n\n    let path: string;\n    let labelMidpoint: { x: number; y: number };\n\n    const bends = laid.edgeBends.get(ri);\n    if (bends && bends.length > 0) {\n      const fromPt = { x: a.x + a.width / 2, y: a.y + a.height };\n      const toPt = { x: b.x + b.width / 2, y: b.y };\n      const pts: Array<{ x: number; y: number }> = [fromPt];\n      for (const pt of bends) {\n        pts.push({ x: pt.x, y: pt.y });\n      }\n      const lastBend = bends[bends.length - 1]!;\n      const boxesAbove = allBoxes.filter((box) => box.y + box.height <= toPt.y);\n      const lowestObstacleBottom =\n        boxesAbove.length > 0 ? Math.max(...boxesAbove.map((box) => box.y + box.height)) : fromPt.y;\n      const turnY = (lowestObstacleBottom + toPt.y) / 2;\n      pts.length = 0;\n      pts.push(fromPt);\n      pts.push({ x: fromPt.x, y: turnY });\n      pts.push({ x: toPt.x, y: turnY });\n      pts.push(toPt);\n\n      path = pts.map((p, idx) => `${idx === 0 ? 'M' : 'L'} ${rhu(p.x)} ${rhu(p.y)}`).join(' ');\n      labelMidpoint = { x: (fromPt.x + toPt.x) / 2, y: turnY };\n    } else {\n      ({ path, labelMidpoint } = routeEdge(a, b, allBoxes));\n    }\n\n    elements.push(p.path(path, palette.textMuted, 1.3, { dash: '6 4', markerEnd: ARROW_ID }));\n    const mx = labelMidpoint.x,\n      my = labelMidpoint.y;\n    const w = measureText(`\u00AB${r.type}\u00BB`, fieldFont).width + 8;\n    elements.push(\n      p.rect(\n        { x: rhu(mx - w / 2), y: rhu(my - fieldFont), width: rhu(w), height: fieldFont + 4 },\n        palette.background,\n        palette.background,\n        0,\n      ),\n    );\n    elements.push(\n      p.text(`\u00AB${r.type}\u00BB`, rhuInt(mx), rhu(my - 1), fieldFont, palette.secondary, {\n        anchor: 'middle',\n      }),\n    );\n  });\n\n  // \u2500\u2500 Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const n of ir.nodes) {\n    const box = laid.boxes.get(n.id)!;\n    const prep = prepared.get(n.id)!;\n    const { x, y } = box;\n    const headH = rhuInt(nameFont * 1.5) + fieldFont + 8;\n    elements.push(\n      p.rect(\n        { x: rhu(x), y: rhu(y), width: BOX_W, height: rhu(box.height) },\n        palette.surface,\n        palette.primary,\n        1.4,\n        { rx: 6 },\n      ),\n    );\n    elements.push(\n      p.text(\n        `\u00AB${n.kind}\u00BB`,\n        rhuInt(x + BOX_W / 2),\n        rhu(y + fieldFont + 4),\n        fieldFont,\n        palette.textMuted,\n        { anchor: 'middle' },\n      ),\n    );\n    elements.push(\n      p.text(\n        n.id,\n        rhuInt(x + BOX_W / 2),\n        rhu(y + fieldFont + 6 + nameFont),\n        nameFont,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n    elements.push(\n      p.path(\n        `M ${rhu(x)} ${rhu(y + headH)} L ${rhu(x + BOX_W)} ${rhu(y + headH)}`,\n        palette.border,\n        1,\n      ),\n    );\n    let fy = y + headH + lineH - 3;\n    for (const ln of prep.lines) {\n      elements.push(p.text(ln, rhu(x + 10), rhu(fy), fieldFont, palette.text));\n      fy += lineH;\n    }\n  }\n\n  const s = theme.edges?.arrowSize ?? 8;\n  const openW = s + 1;\n  const openH = rhu(s * 0.8);\n  const openMidY = rhu(openH / 2);\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${openW}\" markerHeight=\"${openH}\" refX=\"${s}\" refY=\"${openMidY}\" orient=\"auto\"><polyline points=\"0 0, ${s} ${openMidY}, 0 ${openH}\" fill=\"none\" stroke=\"${palette.textMuted}\" stroke-width=\"1.3\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: {\n        x: 0,\n        y: 0,\n        width: rhuInt(laid.width + margin),\n        height: rhuInt(laid.height + margin),\n      },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"requirementdiagram\";\n  var peg$c1 = \"requirement\";\n  var peg$c2 = \"---\";\n  var peg$c3 = \"{\";\n  var peg$c4 = \"\\r\";\n  var peg$c5 = \"\\n\";\n  var peg$c6 = \"}\";\n  var peg$c7 = \":\";\n  var peg$c8 = \"-\";\n  var peg$c9 = \"->\";\n  var peg$c10 = \"functionalrequirement\";\n  var peg$c11 = \"interfacerequirement\";\n  var peg$c12 = \"performancerequirement\";\n  var peg$c13 = \"physicalrequirement\";\n  var peg$c14 = \"designconstraint\";\n  var peg$c15 = \"element\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^:\\n]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"requirementDiagram\", true);\n  var peg$e1 = peg$literalExpectation(\"requirement\", true);\n  var peg$e2 = peg$literalExpectation(\"---\", false);\n  var peg$e3 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e4 = peg$literalExpectation(\"{\", false);\n  var peg$e5 = peg$literalExpectation(\"\\r\", false);\n  var peg$e6 = peg$literalExpectation(\"\\n\", false);\n  var peg$e7 = peg$literalExpectation(\"}\", false);\n  var peg$e8 = peg$classExpectation([\":\", \"\\n\"], true, false);\n  var peg$e9 = peg$literalExpectation(\":\", false);\n  var peg$e10 = peg$literalExpectation(\"-\", false);\n  var peg$e11 = peg$literalExpectation(\"->\", false);\n  var peg$e12 = peg$literalExpectation(\"functionalRequirement\", true);\n  var peg$e13 = peg$literalExpectation(\"interfaceRequirement\", true);\n  var peg$e14 = peg$literalExpectation(\"performanceRequirement\", true);\n  var peg$e15 = peg$literalExpectation(\"physicalRequirement\", true);\n  var peg$e16 = peg$literalExpectation(\"designConstraint\", true);\n  var peg$e17 = peg$literalExpectation(\"element\", true);\n  var peg$e18 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e19 = peg$anyExpectation();\n  var peg$e20 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const nodes = [];\n      const relations = [];\n      for (const s of stmts.filter(Boolean)) {\n        if      (s.t === 'node') nodes.push({ id: s.name, kind: s.kind, fields: s.fields });\n        else if (s.t === 'rel')  relations.push({ from: s.from, to: s.to, type: s.type });\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, nodes, relations };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(kind, name, rows) {\n      return { t: 'node', kind, name, fields: rows.filter(Boolean) };\n    };\n  var peg$f4 = function(key, val) { return { key: key.trim(), value: val.trim() }; };\n  var peg$f5 = function() { return null; };\n  var peg$f6 = function(from, type, to) { return { t: 'rel', from, to, type }; };\n  var peg$f7 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 18);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 18;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = input.substr(peg$currPos, 11);\n      if (s3.toLowerCase() === peg$c1) {\n        peg$currPos += 11;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseStatement();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseStatement();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c2) {\n      s1 = peg$c2;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s7 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c2) {\n            s7 = peg$c2;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e3); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s4 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseBlock();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseRelation();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlankLine();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseReqKind();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 123) {\n            s6 = peg$c3;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e4); }\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s8 = peg$c4;\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e5); }\n            }\n            if (s8 === peg$FAILED) {\n              s8 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s9 = peg$c5;\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s9 !== peg$FAILED) {\n              s10 = [];\n              s11 = peg$parseFieldRow();\n              while (s11 !== peg$FAILED) {\n                s10.push(s11);\n                s11 = peg$parseFieldRow();\n              }\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 125) {\n                s12 = peg$c6;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parseLineEnd();\n                if (s13 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f3(s2, s4, s10);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFieldRow() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 125) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    peg$silentFails--;\n    if (s3 === peg$FAILED) {\n      s2 = undefined;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r1.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = input.charAt(peg$currPos);\n          if (peg$r1.test(s5)) {\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s3 = input.substring(s3, peg$currPos);\n      } else {\n        s3 = s4;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s4 = peg$c7;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = input.charAt(peg$currPos);\n          if (peg$r0.test(s7)) {\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e3); }\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 13) {\n              s6 = peg$c4;\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e5); }\n            }\n            if (s6 === peg$FAILED) {\n              s6 = null;\n            }\n            if (input.charCodeAt(peg$currPos) === 10) {\n              s7 = peg$c5;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f4(s3, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s2 = peg$c4;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s3 = peg$c5;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f5();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelation() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseIdent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 45) {\n        s4 = peg$c8;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseIdent();\n        if (s6 !== peg$FAILED) {\n          s7 = peg$parse_();\n          if (input.substr(peg$currPos, 2) === peg$c9) {\n            s8 = peg$c9;\n            peg$currPos += 2;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e11); }\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parse_();\n            s10 = peg$parseIdent();\n            if (s10 !== peg$FAILED) {\n              s11 = peg$parse_();\n              s12 = peg$parseLineEnd();\n              if (s12 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f6(s2, s6, s10);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseReqKind() {\n    var s0;\n\n    s0 = input.substr(peg$currPos, 21);\n    if (s0.toLowerCase() === peg$c10) {\n      peg$currPos += 21;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.substr(peg$currPos, 20);\n      if (s0.toLowerCase() === peg$c11) {\n        peg$currPos += 20;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = input.substr(peg$currPos, 22);\n        if (s0.toLowerCase() === peg$c12) {\n          peg$currPos += 22;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e14); }\n        }\n        if (s0 === peg$FAILED) {\n          s0 = input.substr(peg$currPos, 19);\n          if (s0.toLowerCase() === peg$c13) {\n            peg$currPos += 19;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n          if (s0 === peg$FAILED) {\n            s0 = input.substr(peg$currPos, 16);\n            if (s0.toLowerCase() === peg$c14) {\n              peg$currPos += 16;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            if (s0 === peg$FAILED) {\n              s0 = input.substr(peg$currPos, 11);\n              if (s0.toLowerCase() === peg$c1) {\n                peg$currPos += 11;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n              if (s0 === peg$FAILED) {\n                s0 = input.substr(peg$currPos, 7);\n                if (s0.toLowerCase() === peg$c15) {\n                  peg$currPos += 7;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c4;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c5;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f7();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c4;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c5;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e19); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r3.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e20); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { RequirementDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutRequirement } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { RequirementDocument, ReqNode, ReqRelation, ReqField } from './ir.js';\n\nexport const requirement: DiagramModule<RequirementDocument> = {\n  parseMermaid(input: string): RequirementDocument {\n    return parser.parse(input) as RequirementDocument;\n  },\n\n  parseYaml(input: string): RequirementDocument {\n    return JSON.parse(input) as RequirementDocument;\n  },\n\n  layout(ir: RequirementDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutRequirement(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/sankey/layout.ts \u2014 Sankey flow diagram.\n *\n * Nodes are assigned to columns by longest-path depth; node height is\n * proportional to its larger of in/out flow. Links render as filled bezier\n * ribbons whose width encodes value, coloured by source. Deterministic.\n */\n\nimport type { SankeyDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutSankey(ir: SankeyDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  // \u2500\u2500 Nodes + layering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const order: string[] = [];\n  const seen = new Set<string>();\n  const add = (n: string) => {\n    if (!seen.has(n)) {\n      seen.add(n);\n      order.push(n);\n    }\n  };\n  for (const l of ir.links) {\n    add(l.source);\n    add(l.target);\n  }\n\n  const layer = new Map(order.map((n) => [n, 0]));\n  for (let pass = 0; pass < order.length; pass++) {\n    let changed = false;\n    for (const l of ir.links) {\n      const want = layer.get(l.source)! + 1;\n      if (layer.get(l.target)! < want) {\n        layer.set(l.target, want);\n        changed = true;\n      }\n    }\n    if (!changed) break;\n  }\n  const maxLayer = Math.max(0, ...order.map((n) => layer.get(n)!));\n\n  const sumOut = new Map<string, number>();\n  const sumIn = new Map<string, number>();\n  for (const l of ir.links) {\n    sumOut.set(l.source, (sumOut.get(l.source) ?? 0) + l.value);\n    sumIn.set(l.target, (sumIn.get(l.target) ?? 0) + l.value);\n  }\n  const nodeValue = (n: string): number => Math.max(sumOut.get(n) ?? 0, sumIn.get(n) ?? 0);\n\n  // Group by layer (insertion order within layer).\n  const byLayer: string[][] = Array.from({ length: maxLayer + 1 }, () => []);\n  for (const n of order) byLayer[layer.get(n)!]!.push(n);\n  const colSum = byLayer.map((col) => col.reduce((s, n) => s + nodeValue(n), 0));\n  const maxColSum = Math.max(1, ...colSum);\n\n  // \u2500\u2500 Geometry \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n  const plotH = 480;\n  const nodeW = 18;\n  const colGap = 220;\n  const nodeGap = 14;\n  const unit = (plotH - 0) / maxColSum;\n  const plotLeft = margin + 4;\n  const plotTop = margin + titleH + 6;\n  const colX = (li: number): number => plotLeft + li * (nodeW + colGap);\n\n  // Node rects + per-node running offsets.\n  interface NodeBox {\n    x: number;\n    y: number;\n    h: number;\n  }\n  const boxes = new Map<string, NodeBox>();\n  byLayer.forEach((col, li) => {\n    const totalH = col.reduce((s, n) => s + nodeValue(n) * unit, 0) + (col.length - 1) * nodeGap;\n    let y = plotTop + (plotH - totalH) / 2;\n    for (const n of col) {\n      const h = Math.max(2, nodeValue(n) * unit);\n      boxes.set(n, { x: colX(li), y, h });\n      y += h + nodeGap;\n    }\n  });\n\n  const elements: SceneElement[] = [];\n  if (title)\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  // \u2500\u2500 Link ribbons (under nodes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const outOff = new Map<string, number>();\n  const inOff = new Map<string, number>();\n  const hueOf = new Map(order.map((n, i) => [n, categoricalHue(i, theme)]));\n  for (const l of ir.links) {\n    const sb = boxes.get(l.source)!,\n      tb = boxes.get(l.target)!;\n    const lh = Math.max(1, l.value * unit);\n    const so = outOff.get(l.source) ?? 0;\n    outOff.set(l.source, so + lh);\n    const io = inOff.get(l.target) ?? 0;\n    inOff.set(l.target, io + lh);\n    const sx = sb.x + nodeW,\n      tx = tb.x;\n    const sy0 = sb.y + so,\n      sy1 = sy0 + lh;\n    const ty0 = tb.y + io,\n      ty1 = ty0 + lh;\n    const mx = (sx + tx) / 2;\n    const d =\n      `M ${rhu(sx)} ${rhu(sy0)} C ${rhu(mx)} ${rhu(sy0)}, ${rhu(mx)} ${rhu(ty0)}, ${rhu(tx)} ${rhu(ty0)} ` +\n      `L ${rhu(tx)} ${rhu(ty1)} C ${rhu(mx)} ${rhu(ty1)}, ${rhu(mx)} ${rhu(sy1)}, ${rhu(sx)} ${rhu(sy1)} Z`;\n    elements.push(p.path(d, 'none', 0, { fill: hueOf.get(l.source)!, opacity: 0.4 }));\n  }\n\n  // \u2500\u2500 Node bars + labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  byLayer.forEach((col, li) => {\n    const lastCol = li === maxLayer;\n    for (const n of col) {\n      const b = boxes.get(n)!;\n      elements.push(\n        p.rect(\n          { x: rhu(b.x), y: rhu(b.y), width: nodeW, height: rhu(b.h) },\n          hueOf.get(n)!,\n          hueOf.get(n)!,\n          0,\n          { rx: 2 },\n        ),\n      );\n      const ly = rhu(b.y + b.h / 2 + typography.smallFontSize * 0.35);\n      if (lastCol)\n        elements.push(\n          p.text(n, rhu(b.x - 6), ly, typography.smallFontSize, palette.text, { anchor: 'end' }),\n        );\n      else\n        elements.push(p.text(n, rhu(b.x + nodeW + 6), ly, typography.smallFontSize, palette.text));\n    }\n  });\n\n  // Width: account for the last column's left-anchored labels and others' right labels.\n  const lastLabelW = Math.max(\n    0,\n    ...byLayer[maxLayer]!.map((n) => measureText(n, typography.smallFontSize).width),\n  );\n  const otherLabelW = 140;\n  const totalW = rhuInt(\n    colX(maxLayer) + nodeW + (maxLayer === 0 ? otherLabelW : Math.max(otherLabelW, 0)) + margin,\n  );\n  const totalH = rhuInt(plotTop + plotH + margin);\n  void lastLabelW;\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"sankey-beta\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \",\";\n  var peg$c3 = \"\\r\";\n  var peg$c4 = \"\\n\";\n  var peg$c5 = \"%%\";\n  var peg$c6 = \"-\";\n  var peg$c7 = \".\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^,\\n]/;\n  var peg$r2 = /^[0-9]/;\n  var peg$r3 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"sankey-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\",\", false);\n  var peg$e4 = peg$literalExpectation(\"\\r\", false);\n  var peg$e5 = peg$literalExpectation(\"\\n\", false);\n  var peg$e6 = peg$literalExpectation(\"%%\", false);\n  var peg$e7 = peg$anyExpectation();\n  var peg$e8 = peg$classExpectation([\",\", \"\\n\"], true, false);\n  var peg$e9 = peg$literalExpectation(\"-\", false);\n  var peg$e10 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e11 = peg$literalExpectation(\".\", false);\n  var peg$e12 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, rows) {\n      const links = rows.filter(Boolean);\n      return { version: '1.0', metadata: { ...(fm || {}) }, links };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(src, tgt, val) { return { source: src.trim(), target: tgt.trim(), value: val }; };\n  var peg$f4 = function() { return null; };\n  var peg$f5 = function() { return null; };\n  var peg$f6 = function(n) { return parseFloat(n); };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 11);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 11;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseRow();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseRow();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRow() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$parseComment();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parse_();\n      s2 = peg$parseField();\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s3 = peg$c2;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseField();\n          if (s4 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 44) {\n              s5 = peg$c2;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parse_();\n              s7 = peg$parseNum();\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parse_();\n                s9 = peg$parseLineEnd();\n                if (s9 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f3(s2, s4, s7);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s2 = peg$c3;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s3 = peg$c4;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f4();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 2) === peg$c5) {\n      s2 = peg$c5;\n      peg$currPos += 2;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r0.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n      s3 = input.substring(s3, peg$currPos);\n      s4 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 13) {\n        s5 = peg$c3;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      if (input.charCodeAt(peg$currPos) === 10) {\n        s6 = peg$c4;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s6 !== peg$FAILED) {\n        s5 = [s5, s6];\n        s4 = s5;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = peg$currPos;\n        peg$silentFails++;\n        if (input.length > peg$currPos) {\n          s5 = input.charAt(peg$currPos);\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n        peg$silentFails--;\n        if (s5 === peg$FAILED) {\n          s4 = undefined;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f5();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseField() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r1.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNum() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 45) {\n      s3 = peg$c6;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r2.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s5 !== peg$FAILED) {\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r2.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n      }\n    } else {\n      s4 = peg$FAILED;\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s6 = peg$c7;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      if (s6 !== peg$FAILED) {\n        s7 = [];\n        s8 = input.charAt(peg$currPos);\n        if (peg$r2.test(s8)) {\n          peg$currPos++;\n        } else {\n          s8 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n        if (s8 !== peg$FAILED) {\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r2.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n          }\n        } else {\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s6 = [s6, s7];\n          s5 = s6;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 === peg$FAILED) {\n        s5 = null;\n      }\n      s3 = [s3, s4, s5];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f6(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r3.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r3.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { SankeyDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutSankey } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { SankeyDocument, SankeyLink } from './ir.js';\n\nexport const sankey: DiagramModule<SankeyDocument> = {\n  parseMermaid(input: string): SankeyDocument {\n    return parser.parse(input) as SankeyDocument;\n  },\n\n  parseYaml(input: string): SankeyDocument {\n    return JSON.parse(input) as SankeyDocument;\n  },\n\n  layout(ir: SankeyDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutSankey(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/mindmap/layout.ts \u2014 Right-growing tidy tree (mindmap).\n *\n * Depth maps to x (root at left), a post-order sweep assigns leaf rows and\n * centres parents on their children. Depth-1 branches take distinct categorical\n * hues that descendants inherit; curved connectors link parent\u2192child.\n */\n\nimport type { MindmapDocument, MindNode } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport {\n  measureFormattedText,\n  renderFormattedText,\n  type FormattedTextLines,\n} from '../../../text/formatted.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\ninterface Placed {\n  label: string;\n  depth: number;\n  x: number;\n  y: number;\n  w: number;\n  h: number;\n  hue: string;\n  icon?: string;\n  info: FormattedTextLines;\n  children: Placed[];\n}\n\nexport function layoutMindmap(ir: MindmapDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  if (!ir.root) {\n    return {\n      scene: {\n        viewBox: { x: 0, y: 0, width: 100, height: 60 },\n        background: palette.background,\n        elements: [],\n      },\n      anchors: {},\n    };\n  }\n\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n  const levelGap = 70;\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n\n  const fontFor = (d: number): number =>\n    d === 0 ? typography.titleFontSize : d === 1 ? font : smallFont;\n  const smallFontFor = (d: number): number => (d === 0 ? font : smallFont);\n\n  // Assign x by depth, y by post-order leaf sweep.\n  let leafCursor = margin + titleH + 20;\n  const place = (node: MindNode, depth: number, hue: string): Placed => {\n    const f = fontFor(depth);\n    const sf = smallFontFor(depth);\n    const info = measureFormattedText(node.label, f, sf);\n    const padX = depth === 0 ? 40 : 28;\n    const w = Math.max(rhu(info.maxLineWidth + padX), depth === 0 ? 60 : 40);\n    const baseH = depth === 0 ? 44 : depth === 1 ? 34 : 26;\n    const h = info.lineCount > 1 ? rhu(info.lineCount * (f * 1.25) + 14) : baseH;\n\n    const kids = node.children.map((c, i) =>\n      place(c, depth + 1, depth === 0 ? categoricalHue(i, theme) : hue),\n    );\n    let y: number;\n    if (kids.length === 0) {\n      y = leafCursor + h / 2;\n      leafCursor += Math.max(30, h + 10);\n    } else {\n      y = (kids[0]!.y + kids[kids.length - 1]!.y) / 2;\n    }\n    return {\n      label: node.label,\n      depth,\n      x: 0,\n      y,\n      w,\n      h,\n      hue,\n      info,\n      ...(node.icon ? { icon: node.icon } : {}),\n      children: kids,\n    };\n  };\n  const root = place(ir.root, 0, palette.primary);\n\n  // Column x: per-depth max width + level gaps.\n  const all = flat(root);\n  const depthMax = maxDepth(root);\n  const maxW: number[] = [];\n  for (const n of all) maxW[n.depth] = Math.max(maxW[n.depth] ?? 0, n.w);\n  const colStart: number[] = [margin];\n  for (let d = 1; d <= depthMax; d++)\n    colStart[d] = colStart[d - 1]! + (maxW[d - 1] ?? 0) + levelGap;\n  for (const n of all) n.x = colStart[n.depth]!;\n\n  const elements: SceneElement[] = [];\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        {\n          weight: 'bold',\n        },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Connectors (under nodes) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const drawEdges = (n: Placed): void => {\n    for (const c of n.children) {\n      const x1 = n.x + n.w,\n        y1 = n.y,\n        x2 = c.x,\n        y2 = c.y;\n      const mx = (x1 + x2) / 2;\n      elements.push(\n        p.path(\n          `M ${rhu(x1)} ${rhu(y1)} C ${rhu(mx)} ${rhu(y1)}, ${rhu(mx)} ${rhu(y2)}, ${rhu(x2)} ${rhu(y2)}`,\n          c.hue,\n          2,\n        ),\n      );\n      drawEdges(c);\n    }\n  };\n  drawEdges(root);\n\n  // \u2500\u2500 Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const drawNode = (n: Placed): void => {\n    const h = n.h;\n    const cy = n.y;\n    const f = fontFor(n.depth);\n    const sf = smallFontFor(n.depth);\n    const x = rhu(n.x);\n    const y = rhu(cy - h / 2);\n\n    if (n.depth === 0) {\n      elements.push(\n        p.rect({ x, y, width: rhu(n.w), height: h }, palette.primary, palette.primary, 0, {\n          rx: Math.min(h / 2, 22),\n        }),\n      );\n      elements.push(\n        ...renderFormattedText(\n          p,\n          n.info,\n          x,\n          y,\n          n.w,\n          h,\n          f,\n          sf,\n          '#FFFFFF',\n          'rgba(255, 255, 255, 0.8)',\n          {\n            align: 'middle',\n            defaultBold: true,\n          },\n        ),\n      );\n    } else if (n.depth === 1) {\n      elements.push(p.rect({ x, y, width: rhu(n.w), height: h }, n.hue, n.hue, 0, { rx: 8 }));\n      elements.push(\n        ...renderFormattedText(\n          p,\n          n.info,\n          x,\n          y,\n          n.w,\n          h,\n          f,\n          sf,\n          '#FFFFFF',\n          'rgba(255, 255, 255, 0.8)',\n          {\n            align: 'middle',\n            defaultBold: true,\n          },\n        ),\n      );\n    } else {\n      elements.push(\n        p.rect({ x, y, width: rhu(n.w), height: h }, palette.surface, n.hue, 1.4, { rx: 6 }),\n      );\n      elements.push(\n        ...renderFormattedText(p, n.info, x, y, n.w, h, f, sf, palette.text, palette.textMuted, {\n          align: 'middle',\n        }),\n      );\n    }\n    if (n.icon)\n      elements.push(p.circle({ x: rhu(n.x - 7), y: rhu(cy) }, 4, n.hue, palette.background, 1.5));\n    for (const c of n.children) drawNode(c);\n  };\n  drawNode(root);\n\n  const totalW = rhuInt(Math.max(...all.map((n) => n.x + n.w)) + margin);\n  const totalH = rhuInt(leafCursor + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n\nfunction flat(n: Placed, acc: Placed[] = []): Placed[] {\n  acc.push(n);\n  for (const c of n.children) flat(c, acc);\n  return acc;\n}\nfunction maxDepth(n: Placed): number {\n  return n.children.length ? Math.max(...n.children.map(maxDepth)) : n.depth;\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"mindmap\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"\\r\";\n  var peg$c3 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[ \\t]/;\n  var peg$r2 = /^[^ \\t\\n]/;\n\n  var peg$e0 = peg$literalExpectation(\"mindmap\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e4 = peg$literalExpectation(\"\\r\", false);\n  var peg$e5 = peg$literalExpectation(\"\\n\", false);\n  var peg$e6 = peg$anyExpectation();\n  var peg$e7 = peg$classExpectation([\" \", \"\\t\", \"\\n\"], true, false);\n\n  var peg$f0 = function(fm, lines) {\n      return { version: '1.0', metadata: { ...(fm || {}) }, lines: lines.filter(Boolean) };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(fmlines) {\n      const meta = {}; for (const line of fmlines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(indent, content) { return { indent: indent.length, raw: content.trim() }; };\n  var peg$f4 = function(content) { return { indent: 0, raw: content.trim() }; };\n  var peg$f5 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 7);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 7;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseLine();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseLine();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r1.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r0.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r0.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s4 = peg$c2;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s5 = peg$c3;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        if (s3 === peg$FAILED) {\n          s3 = peg$currPos;\n          peg$silentFails++;\n          if (input.length > peg$currPos) {\n            s4 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          peg$silentFails--;\n          if (s4 === peg$FAILED) {\n            s3 = undefined;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s1, s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = input.charAt(peg$currPos);\n      if (peg$r2.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = input.charAt(peg$currPos);\n          if (peg$r0.test(s3)) {\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n        }\n        s3 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s4 = peg$c2;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s5 = peg$c3;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        if (s3 === peg$FAILED) {\n          s3 = peg$currPos;\n          peg$silentFails++;\n          if (input.length > peg$currPos) {\n            s4 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          peg$silentFails--;\n          if (s4 === peg$FAILED) {\n            s3 = undefined;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f4(s1);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = [];\n        s2 = input.charAt(peg$currPos);\n        if (peg$r1.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = input.charAt(peg$currPos);\n          if (peg$r1.test(s2)) {\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n        }\n        if (input.charCodeAt(peg$currPos) === 13) {\n          s2 = peg$c2;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e4); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = null;\n        }\n        if (input.charCodeAt(peg$currPos) === 10) {\n          s3 = peg$c3;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f5();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r1.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r1.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { MindmapDocument, MindNode } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutMindmap } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { MindmapDocument, MindNode } from './ir.js';\n\ninterface RawLine {\n  indent: number;\n  raw: string;\n}\ninterface RawDoc {\n  version: string;\n  metadata: MindmapDocument['metadata'];\n  lines: RawLine[];\n}\n\ninterface MutNode {\n  label: string;\n  icon?: string;\n  children: MutNode[];\n}\n\nfunction cleanLabel(raw: string): string {\n  // Strip a node-shape wrapper, ignoring any leading id: id((label)) \u2192 label.\n  const m = raw.match(/^[^([{]*[([{]+(.+?)[)\\]}]+$/);\n  return (m ? m[1]! : raw).trim();\n}\n\nfunction buildTree(lines: RawLine[]): MindNode | undefined {\n  if (lines.length === 0) return undefined;\n  const first = lines.find((l) => !l.raw.startsWith('::'));\n  if (!first) return undefined;\n  const root: MutNode = { label: cleanLabel(first.raw), children: [] };\n  const stack: Array<{ node: MutNode; indent: number }> = [{ node: root, indent: first.indent }];\n  let last: MutNode = root;\n  let started = false;\n  for (const ln of lines) {\n    if (!started) {\n      if (ln === first) started = true;\n      continue;\n    }\n    // `::icon(...)` attaches to the most recent node rather than creating one.\n    const iconMatch = ln.raw.match(/^::icon\\(([^)]*)\\)/);\n    if (iconMatch) {\n      last.icon = iconMatch[1]!.trim();\n      continue;\n    }\n    const node: MutNode = { label: cleanLabel(ln.raw), children: [] };\n    while (stack.length > 1 && stack[stack.length - 1]!.indent >= ln.indent) stack.pop();\n    stack[stack.length - 1]!.node.children.push(node);\n    stack.push({ node, indent: ln.indent });\n    last = node;\n  }\n  return root as MindNode;\n}\n\nexport const mindmap: DiagramModule<MindmapDocument> = {\n  parseMermaid(input: string): MindmapDocument {\n    const raw = parser.parse(input) as RawDoc;\n    const root = buildTree(raw.lines);\n    return { version: raw.version, metadata: raw.metadata, ...(root ? { root } : {}) };\n  },\n\n  parseYaml(input: string): MindmapDocument {\n    return JSON.parse(input) as MindmapDocument;\n  },\n\n  layout(ir: MindmapDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutMindmap(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/gitgraph/layout.ts \u2014 Git commit graph.\n *\n * Branches occupy horizontal lanes; commits sit at sequential x positions.\n * Lane lines, branch-point curves and merge curves connect them; commit dots\n * carry ids and tags. Lane colours come from the categorical hue cycle.\n */\n\nimport type { GitgraphDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport function layoutGitgraph(ir: GitgraphDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n  const xGap = 70;\n  const laneGap = 60;\n  const leftPad = margin + 70; // room for lane labels\n  const topPad = margin + titleH + 24;\n  const maxX = Math.max(0, ...ir.commits.map((c) => c.x));\n\n  const cx = (x: number): number => leftPad + x * xGap;\n  const cy = (lane: number): number => topPad + lane * laneGap;\n  const hue = (lane: number): string => categoricalHue(lane, theme);\n\n  const elements: SceneElement[] = [];\n  if (ir.metadata.title)\n    elements.push(\n      p.text(\n        ir.metadata.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  // \u2500\u2500 Lane lines + labels \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (let lane = 0; lane < ir.lanes; lane++) {\n    const laneCommits = ir.commits.filter((c) => c.lane === lane);\n    if (laneCommits.length === 0 && lane !== 0) continue;\n    const xs = laneCommits.map((c) => c.x);\n    const bp = ir.branchPoints.find((b) => b.lane === lane);\n    const startX = bp\n      ? Math.min(bp.x, ...(xs.length ? xs : [bp.x]))\n      : Math.min(0, ...(xs.length ? xs : [0]));\n    const endX = xs.length ? Math.max(...xs) : startX;\n    elements.push(\n      p.path(\n        `M ${rhu(cx(startX))} ${rhu(cy(lane))} L ${rhu(cx(endX))} ${rhu(cy(lane))}`,\n        hue(lane),\n        3,\n        { opacity: 0.55 },\n      ),\n    );\n    const name = ir.laneNames[lane];\n    if (name)\n      elements.push(\n        p.text(\n          name,\n          margin,\n          rhu(cy(lane) + typography.smallFontSize * 0.35),\n          typography.smallFontSize,\n          hue(lane),\n          { weight: 'bold' },\n        ),\n      );\n  }\n\n  // \u2500\u2500 Branch-point curves \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const b of ir.branchPoints) {\n    const x1 = cx(b.parentX),\n      y1 = cy(b.parentLane);\n    const x2 = cx(b.x),\n      y2 = cy(b.lane);\n    const mx = (x1 + x2) / 2;\n    elements.push(\n      p.path(\n        `M ${rhu(x1)} ${rhu(y1)} C ${rhu(mx)} ${rhu(y1)}, ${rhu(mx)} ${rhu(y2)}, ${rhu(x2)} ${rhu(y2)}`,\n        hue(b.lane),\n        2.5,\n        { opacity: 0.55 },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Merge curves \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const c of ir.commits) {\n    if (!c.isMerge || c.fromLane === undefined || c.fromX === undefined) continue;\n    const x1 = cx(c.fromX),\n      y1 = cy(c.fromLane);\n    const x2 = cx(c.x),\n      y2 = cy(c.lane);\n    const mx = (x1 + x2) / 2;\n    elements.push(\n      p.path(\n        `M ${rhu(x1)} ${rhu(y1)} C ${rhu(mx)} ${rhu(y1)}, ${rhu(mx)} ${rhu(y2)}, ${rhu(x2)} ${rhu(y2)}`,\n        hue(c.fromLane),\n        2.5,\n        { opacity: 0.6 },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Commit dots + ids + tags \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const c of ir.commits) {\n    const x = cx(c.x),\n      y = cy(c.lane);\n    const col = hue(c.lane);\n    if (c.type === 'highlight') {\n      elements.push(\n        p.rect(\n          { x: rhu(x - 9), y: rhu(y - 9), width: 18, height: 18 },\n          palette.warning,\n          palette.background,\n          2,\n          { rx: 3 },\n        ),\n      );\n    } else if (c.isMerge) {\n      elements.push(p.circle({ x: rhu(x), y: rhu(y) }, 9, palette.background, col, 2.5));\n      elements.push(p.circle({ x: rhu(x), y: rhu(y) }, 3.5, col, col, 0));\n    } else {\n      elements.push(p.circle({ x: rhu(x), y: rhu(y) }, 8, col, palette.background, 2));\n    }\n    elements.push(\n      p.text(c.id, rhu(x), rhu(y + 22), typography.smallFontSize, palette.textMuted, {\n        anchor: 'middle',\n      }),\n    );\n    if (c.tag) {\n      const w = measureText(c.tag, typography.smallFontSize).width + 12;\n      elements.push(\n        p.rect(\n          { x: rhu(x - w / 2), y: rhu(y - 34), width: rhu(w), height: 17 },\n          palette.warning + '22',\n          palette.warning,\n          1,\n          { rx: 3 },\n        ),\n      );\n      elements.push(\n        p.text(c.tag, rhu(x), rhu(y - 22), typography.smallFontSize, palette.text, {\n          anchor: 'middle',\n          weight: 'bold',\n        }),\n      );\n    }\n  }\n\n  const totalW = rhuInt(cx(maxX) + 80 + margin);\n  const totalH = rhuInt(cy(ir.lanes - 1) + laneGap + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function opts(list) {\n    const o = {};\n    for (const it of list) o[it.k.toLowerCase()] = it.v;\n    return o;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"gitgraph\";\n  var peg$c1 = \":\";\n  var peg$c2 = \"---\";\n  var peg$c3 = \"commit\";\n  var peg$c4 = \"branch\";\n  var peg$c5 = \"order:\";\n  var peg$c6 = \"checkout\";\n  var peg$c7 = \"switch\";\n  var peg$c8 = \"merge\";\n  var peg$c9 = \"id\";\n  var peg$c10 = \"tag\";\n  var peg$c11 = \"type\";\n  var peg$c12 = \"\\\"\";\n  var peg$c13 = \"\\r\";\n  var peg$c14 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[0-9]/;\n  var peg$r2 = /^[^\"]/;\n  var peg$r3 = /^[A-Za-z0-9_]/;\n  var peg$r4 = /^[A-Za-z0-9_\\/.\\-]/;\n  var peg$r5 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"gitGraph\", true);\n  var peg$e1 = peg$literalExpectation(\":\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$literalExpectation(\"---\", false);\n  var peg$e4 = peg$literalExpectation(\"commit\", true);\n  var peg$e5 = peg$literalExpectation(\"branch\", true);\n  var peg$e6 = peg$literalExpectation(\"order:\", false);\n  var peg$e7 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e8 = peg$literalExpectation(\"checkout\", true);\n  var peg$e9 = peg$literalExpectation(\"switch\", true);\n  var peg$e10 = peg$literalExpectation(\"merge\", true);\n  var peg$e11 = peg$literalExpectation(\"id\", true);\n  var peg$e12 = peg$literalExpectation(\"tag\", true);\n  var peg$e13 = peg$literalExpectation(\"type\", true);\n  var peg$e14 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e15 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e16 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e17 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\", \"/\", \".\", \"-\"], false, false);\n  var peg$e18 = peg$literalExpectation(\"\\r\", false);\n  var peg$e19 = peg$literalExpectation(\"\\n\", false);\n  var peg$e20 = peg$anyExpectation();\n  var peg$e21 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      return { version: '1.0', metadata: { ...(fm || {}) }, statements: stmts.filter(Boolean) };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(o) { const x = opts(o); return { t: 'commit', id: x.id, tag: x.tag, type: x.type }; };\n  var peg$f4 = function(name) { return { t: 'branch', name }; };\n  var peg$f5 = function(name) { return { t: 'checkout', name }; };\n  var peg$f6 = function(name, o) { const x = opts(o); return { t: 'merge', name, id: x.id, tag: x.tag, type: x.type }; };\n  var peg$f7 = function(k, v) { return { k, v }; };\n  var peg$f8 = function(s) { return s; };\n  var peg$f9 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 8);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 8;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s6 = peg$c1;\n        peg$currPos++;\n      } else {\n        s6 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s6 === peg$FAILED) {\n        s6 = null;\n      }\n      s7 = peg$parse_();\n      s8 = peg$currPos;\n      s9 = [];\n      s10 = input.charAt(peg$currPos);\n      if (peg$r0.test(s10)) {\n        peg$currPos++;\n      } else {\n        s10 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      while (s10 !== peg$FAILED) {\n        s9.push(s10);\n        s10 = input.charAt(peg$currPos);\n        if (peg$r0.test(s10)) {\n          peg$currPos++;\n        } else {\n          s10 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n      }\n      s8 = input.substring(s8, peg$currPos);\n      s5 = [s5, s6, s7, s8];\n      s4 = s5;\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = peg$parseStatement();\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = peg$parseStatement();\n        }\n        s7 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s6);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c2) {\n      s1 = peg$c2;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s7 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c2) {\n            s7 = peg$c2;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s4 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseCommit();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseBranch();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseCheckout();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseMerge();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCommit() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseOpt();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseOpt();\n      }\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f3(s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBranch() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 6);\n    if (s2.toLowerCase() === peg$c4) {\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseBranchName();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          if (input.substr(peg$currPos, 6) === peg$c5) {\n            s7 = peg$c5;\n            peg$currPos += 6;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = [];\n            s10 = input.charAt(peg$currPos);\n            if (peg$r1.test(s10)) {\n              peg$currPos++;\n            } else {\n              s10 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s10 !== peg$FAILED) {\n              while (s10 !== peg$FAILED) {\n                s9.push(s10);\n                s10 = input.charAt(peg$currPos);\n                if (peg$r1.test(s10)) {\n                  peg$currPos++;\n                } else {\n                  s10 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e7); }\n                }\n              }\n            } else {\n              s9 = peg$FAILED;\n            }\n            if (s9 !== peg$FAILED) {\n              s6 = [s6, s7, s8, s9];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f4(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCheckout() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 8);\n    if (s2.toLowerCase() === peg$c6) {\n      peg$currPos += 8;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 6);\n      if (s2.toLowerCase() === peg$c7) {\n        peg$currPos += 6;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseBranchName();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMerge() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseBranchName();\n        if (s4 !== peg$FAILED) {\n          s5 = [];\n          s6 = peg$parseOpt();\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = peg$parseOpt();\n          }\n          s6 = peg$parseLineEnd();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f6(s4, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseOpt() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse__();\n    if (s1 !== peg$FAILED) {\n      s2 = input.substr(peg$currPos, 2);\n      if (s2.toLowerCase() === peg$c9) {\n        peg$currPos += 2;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 3);\n        if (s2.toLowerCase() === peg$c10) {\n          peg$currPos += 3;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e12); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = input.substr(peg$currPos, 4);\n          if (s2.toLowerCase() === peg$c11) {\n            peg$currPos += 4;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e13); }\n          }\n        }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s4 = peg$c1;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          s6 = peg$parseOptVal();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f7(s2, s6);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseOptVal() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c12;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = input.charAt(peg$currPos);\n      if (peg$r3.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      if (s2 !== peg$FAILED) {\n        while (s2 !== peg$FAILED) {\n          s1.push(s2);\n          s2 = input.charAt(peg$currPos);\n          if (peg$r3.test(s2)) {\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n        }\n      } else {\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBranchName() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r4.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r4.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c13;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c14;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c13;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c14;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f9();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c13;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c14;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r5.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r5.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { GitgraphDocument, GitCommit, GitBranchPoint, GitCommitType } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutGitgraph } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { GitgraphDocument, GitCommit, GitBranchPoint } from './ir.js';\n\ninterface Stmt {\n  t: string;\n  name?: string;\n  id?: string;\n  tag?: string;\n  type?: string;\n}\ninterface RawDoc {\n  version: string;\n  metadata: GitgraphDocument['metadata'];\n  statements: Stmt[];\n}\n\nfunction commitType(raw?: string): GitCommitType {\n  const t = (raw || '').toUpperCase();\n  return t === 'HIGHLIGHT' ? 'highlight' : t === 'REVERSE' ? 'reverse' : 'normal';\n}\n\nexport const gitgraph: DiagramModule<GitgraphDocument> = {\n  parseMermaid(input: string): GitgraphDocument {\n    const raw = parser.parse(input) as RawDoc;\n    const laneOf = new Map<string, number>([['main', 0]]);\n    const laneNames = ['main'];\n    const lastX = new Map<number, number>(); // lane \u2192 x of last commit\n    const commits: GitCommit[] = [];\n    const branchPoints: GitBranchPoint[] = [];\n    let current = 'main';\n    let nextLane = 1;\n    let order = 0;\n    let auto = 0;\n\n    for (const s of raw.statements) {\n      if (s.t === 'commit') {\n        const lane = laneOf.get(current)!;\n        commits.push({\n          id: s.id || `c${auto++}`,\n          lane,\n          x: order,\n          type: commitType(s.type),\n          isMerge: false,\n          ...(s.tag ? { tag: s.tag } : {}),\n        });\n        lastX.set(lane, order);\n        order++;\n      } else if (s.t === 'branch') {\n        if (!laneOf.has(s.name!)) {\n          laneOf.set(s.name!, nextLane);\n          laneNames[nextLane] = s.name!;\n          nextLane++;\n        }\n        const lane = laneOf.get(s.name!)!;\n        const parentLane = laneOf.get(current)!;\n        branchPoints.push({ lane, parentLane, x: order, parentX: lastX.get(parentLane) ?? 0 });\n        current = s.name!;\n      } else if (s.t === 'checkout') {\n        if (laneOf.has(s.name!)) current = s.name!;\n      } else if (s.t === 'merge') {\n        const lane = laneOf.get(current)!;\n        const fromLane = laneOf.get(s.name!) ?? lane;\n        commits.push({\n          id: s.id || `m${auto++}`,\n          lane,\n          x: order,\n          type: commitType(s.type),\n          isMerge: true,\n          fromLane,\n          fromX: lastX.get(fromLane) ?? order,\n          ...(s.tag ? { tag: s.tag } : {}),\n        });\n        lastX.set(lane, order);\n        order++;\n      }\n    }\n\n    return {\n      version: raw.version,\n      metadata: raw.metadata,\n      lanes: nextLane,\n      laneNames,\n      commits,\n      branchPoints,\n    };\n  },\n\n  parseYaml(input: string): GitgraphDocument {\n    return JSON.parse(input) as GitgraphDocument;\n  },\n\n  layout(ir: GitgraphDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutGitgraph(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/c4/layout.ts \u2014 C4 context/container diagram.\n *\n * Nodes (Person/System, optionally _Ext) place via the shared layered kernel;\n * boundaries draw as labeled dashed containers around their descendant nodes\n * (outer first). Relationships are arrows with label + optional technology.\n */\n\nimport type { C4Document, C4Node } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult, Rect } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport {\n  measureFormattedText,\n  renderFormattedText,\n  type FormattedTextLines,\n} from '../../../text/formatted.js';\nimport { measureText } from '../../../text/metrics.js';\nimport {\n  layeredLayout,\n  routeEdge,\n  type GraphNode,\n  type GraphEdge,\n} from '../../../graph/layered.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst ARROW_ID = 'c4-arrow';\nconst NODE_W = 180;\n\nexport function layoutC4(ir: C4Document, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.smallFontSize;\n\n  const isPerson = (k: C4Node['kind']) => k === 'person' || k === 'person_ext';\n  const isExt = (k: C4Node['kind']) => k.endsWith('_ext');\n\n  // Pre-wrap + size.\n  const prep = new Map<\n    string,\n    { labelInfo: FormattedTextLines; descrInfo?: FormattedTextLines | undefined; h: number }\n  >();\n  for (const n of ir.nodes) {\n    const labelInfo = measureFormattedText(n.label, typography.baseFontSize, font, NODE_W - 20, 4);\n    const descrInfo = n.descr\n      ? measureFormattedText(n.descr, font, font, NODE_W - 20, 4)\n      : undefined;\n    const labelH = labelInfo.lineCount * rhuInt(typography.baseFontSize * 1.25);\n    const descrH = descrInfo ? descrInfo.lineCount * rhuInt(font * 1.3) + 4 : 0;\n    const h = 14 + labelH + 4 + descrH + 14 + (isPerson(n.kind) ? 10 : 0);\n    prep.set(n.id, { labelInfo, descrInfo, h });\n  }\n\n  const nodes: GraphNode[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: NODE_W,\n    height: prep.get(n.id)!.h,\n  }));\n  const edges: GraphEdge[] = ir.rels.map((r) => ({ from: r.from, to: r.to }));\n  const laid = layeredLayout(nodes, edges, {\n    direction: 'TB',\n    layerGap: 80,\n    nodeGap: 50,\n    margin: margin + 24,\n  });\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n  const yOff = titleH + 12;\n\n  const elements: SceneElement[] = [];\n  if (title)\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  // \u2500\u2500 Boundaries (outer first) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const sorted = [...ir.boundaries].sort((a, b) => a.depth - b.depth);\n  for (const bnd of sorted) {\n    const rects = bnd.nodeIds\n      .map((id) => laid.boxes.get(id))\n      .filter((r): r is NonNullable<typeof r> => !!r);\n    if (rects.length === 0) continue;\n    const pad = 18 + bnd.depth * 4;\n    const minX = Math.min(...rects.map((r) => r.x)) - pad;\n    const minY = Math.min(...rects.map((r) => r.y)) - pad - 16 + yOff;\n    const maxX = Math.max(...rects.map((r) => r.x + r.width)) + pad;\n    const maxY = Math.max(...rects.map((r) => r.y + r.height)) + pad + yOff;\n    const bx = rhu(minX),\n      by = rhu(minY),\n      bw = rhu(maxX - minX),\n      bh = rhu(maxY - minY);\n    elements.push(\n      p.path(`M ${bx} ${by} h ${bw} v ${bh} h ${-bw} Z`, palette.textMuted, 1.3, { dash: '7 5' }),\n    );\n    elements.push(\n      p.text(bnd.label, rhu(minX + 10), rhu(minY + 16), font, palette.textMuted, {\n        weight: 'bold',\n      }),\n    );\n  }\n\n  // \u2500\u2500 Relationships \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...laid.boxes.values()];\n  for (const r of ir.rels) {\n    const a = laid.boxes.get(r.from),\n      b = laid.boxes.get(r.to);\n    if (!a || !b) continue;\n    const ao = { ...a, y: a.y + yOff },\n      bo = { ...b, y: b.y + yOff };\n    const ac = { x: ao.x + ao.width / 2, y: ao.y + ao.height / 2 };\n    const bc = { x: bo.x + bo.width / 2, y: bo.y + bo.height / 2 };\n    const pa = borderPoint(ao, bc.x, bc.y);\n    const pb = borderPoint(bo, ac.x, ac.y);\n    const { path, labelMidpoint } = routeEdge(a, b, allBoxes, yOff);\n    elements.push(\n      p.path(path, palette.textMuted, 1.4, {\n        ...(r.ext ? { dash: '6 4' } : {}),\n        markerEnd: ARROW_ID,\n      }),\n    );\n    const mx = labelMidpoint.x,\n      my = labelMidpoint.y;\n    const lbl = r.tech ? `${r.label ?? ''} [${r.tech}]` : (r.label ?? '');\n    if (lbl) {\n      const w = measureText(lbl, font).width + 8;\n      elements.push(\n        p.rect(\n          { x: rhu(mx - w / 2), y: rhu(my - font), width: rhu(w), height: font + 4 },\n          palette.background,\n          palette.background,\n          0,\n        ),\n      );\n      elements.push(\n        p.text(lbl, rhuInt(mx), rhu(my - 1), font, palette.textMuted, { anchor: 'middle' }),\n      );\n    }\n  }\n\n  // \u2500\u2500 Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const n of ir.nodes) {\n    const box = laid.boxes.get(n.id)!;\n    const pr = prep.get(n.id)!;\n    const x = box.x,\n      y = box.y + yOff,\n      w = NODE_W,\n      h = box.height;\n    const fill = isExt(n.kind)\n      ? palette.surface\n      : isPerson(n.kind)\n        ? palette.secondary\n        : palette.primary;\n    const txt = isExt(n.kind) ? palette.text : '#FFFFFF';\n    const mutedTxt = isExt(n.kind) ? palette.textMuted : 'rgba(255, 255, 255, 0.8)';\n    const rx = isPerson(n.kind) ? 16 : 6;\n    elements.push(\n      p.rect(\n        { x: rhu(x), y: rhu(y), width: w, height: rhu(h) },\n        fill,\n        isExt(n.kind) ? palette.textMuted : fill,\n        isExt(n.kind) ? 1.4 : 0,\n        { rx },\n      ),\n    );\n    let ty = y + 16;\n    const labelH = pr.labelInfo.lineCount * rhuInt(typography.baseFontSize * 1.25);\n    elements.push(\n      ...renderFormattedText(\n        p,\n        pr.labelInfo,\n        x,\n        ty - 14,\n        w,\n        labelH + 14,\n        typography.baseFontSize,\n        font,\n        txt,\n        mutedTxt,\n        { align: 'middle', defaultBold: true },\n      ),\n    );\n    ty += labelH;\n    elements.push(\n      p.text(\n        `[${n.kind.replace('_', ' ')}]`,\n        rhuInt(x + w / 2),\n        rhu(ty),\n        font,\n        isExt(n.kind) ? palette.textMuted : '#FFFFFF',\n        { anchor: 'middle' },\n      ),\n    );\n    ty += rhuInt(font * 1.3) + 2;\n    if (pr.descrInfo) {\n      const descrH = pr.descrInfo.lineCount * rhuInt(font * 1.3);\n      elements.push(\n        ...renderFormattedText(\n          p,\n          pr.descrInfo,\n          x,\n          ty - 10,\n          w,\n          descrH + 10,\n          font,\n          font,\n          isExt(n.kind) ? palette.textMuted : '#FFFFFF',\n          isExt(n.kind) ? palette.textMuted : 'rgba(255, 255, 255, 0.8)',\n          { align: 'middle', opacity: 0.9 },\n        ),\n      );\n    }\n  }\n\n  const allRects: Rect[] = ir.nodes.map((n) => {\n    const b = laid.boxes.get(n.id)!;\n    return { x: b.x, y: b.y + yOff, width: b.width, height: b.height };\n  });\n  const totalW = rhuInt(Math.max(laid.width, ...allRects.map((r) => r.x + r.width)) + margin + 24);\n  const totalH = rhuInt(Math.max(...allRects.map((r) => r.y + r.height)) + margin + 24);\n  const s = theme.edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function kindOf(k) {\n    const s = k.toLowerCase();\n    if (s === 'person') return 'person';\n    if (s === 'person_ext') return 'person_ext';\n    if (s === 'system_ext') return 'system_ext';\n    if (s === 'systemdb' || s === 'containerdb') return 'db';\n    if (s.startsWith('container')) return s.endsWith('_ext') ? 'container_ext' : 'container';\n    if (s.startsWith('component')) return 'component';\n    return 'system';\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"c4\";\n  var peg$c1 = \"context\";\n  var peg$c2 = \"container\";\n  var peg$c3 = \"component\";\n  var peg$c4 = \"dynamic\";\n  var peg$c5 = \"deployment\";\n  var peg$c6 = \"---\";\n  var peg$c7 = \"title\";\n  var peg$c8 = \"enterprise_boundary\";\n  var peg$c9 = \"system_boundary\";\n  var peg$c10 = \"container_boundary\";\n  var peg$c11 = \"boundary\";\n  var peg$c12 = \"(\";\n  var peg$c13 = \",\";\n  var peg$c14 = \")\";\n  var peg$c15 = \"{\";\n  var peg$c16 = \"\\r\";\n  var peg$c17 = \"\\n\";\n  var peg$c18 = \"}\";\n  var peg$c19 = \"rel_ext\";\n  var peg$c20 = \"birel\";\n  var peg$c21 = \"rel\";\n  var peg$c22 = \"\\\"\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[A-Za-z]/;\n  var peg$r2 = /^[A-Za-z0-9_]/;\n  var peg$r3 = /^[^\"]/;\n  var peg$r4 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"C4\", true);\n  var peg$e1 = peg$literalExpectation(\"Context\", true);\n  var peg$e2 = peg$literalExpectation(\"Container\", true);\n  var peg$e3 = peg$literalExpectation(\"Component\", true);\n  var peg$e4 = peg$literalExpectation(\"Dynamic\", true);\n  var peg$e5 = peg$literalExpectation(\"Deployment\", true);\n  var peg$e6 = peg$literalExpectation(\"---\", false);\n  var peg$e7 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e8 = peg$literalExpectation(\"title\", true);\n  var peg$e9 = peg$literalExpectation(\"Enterprise_Boundary\", true);\n  var peg$e10 = peg$literalExpectation(\"System_Boundary\", true);\n  var peg$e11 = peg$literalExpectation(\"Container_Boundary\", true);\n  var peg$e12 = peg$literalExpectation(\"Boundary\", true);\n  var peg$e13 = peg$literalExpectation(\"(\", false);\n  var peg$e14 = peg$literalExpectation(\",\", false);\n  var peg$e15 = peg$literalExpectation(\")\", false);\n  var peg$e16 = peg$literalExpectation(\"{\", false);\n  var peg$e17 = peg$literalExpectation(\"\\r\", false);\n  var peg$e18 = peg$literalExpectation(\"\\n\", false);\n  var peg$e19 = peg$literalExpectation(\"}\", false);\n  var peg$e20 = peg$literalExpectation(\"Rel_Ext\", true);\n  var peg$e21 = peg$literalExpectation(\"BiRel\", true);\n  var peg$e22 = peg$literalExpectation(\"Rel\", true);\n  var peg$e23 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"]], false, false);\n  var peg$e24 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e25 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e26 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e27 = peg$anyExpectation();\n  var peg$e28 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      const nodes = [];\n      const boundaries = [];\n      const rels = [];\n      let title;\n      const walk = (list, depth) => {\n        const ids = [];\n        for (const s of list.filter(Boolean)) {\n          if (s.t === 'title') title = s.v;\n          else if (s.t === 'node') { nodes.push({ id: s.id, label: s.label, kind: s.kind, ...(s.descr ? { descr: s.descr } : {}) }); ids.push(s.id); }\n          else if (s.t === 'rel') rels.push({ from: s.from, to: s.to, ext: s.ext, ...(s.label ? { label: s.label } : {}), ...(s.tech ? { tech: s.tech } : {}) });\n          else if (s.t === 'boundary') {\n            const inner = walk(s.inner, depth + 1);\n            boundaries.push({ id: s.id, label: s.label, depth, nodeIds: inner });\n            for (const id of inner) ids.push(id);\n          }\n        }\n        return ids;\n      };\n      walk(stmts, 0);\n      return { version: '1.0', metadata: { ...(fm || {}), ...(title ? { title } : {}) }, nodes, boundaries, rels };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f4 = function(id, label, inner) {\n      return { t: 'boundary', id, label, inner };\n    };\n  var peg$f5 = function(k, id, label, d) { return d; };\n  var peg$f6 = function(k, id, label, descr) {\n      return { t: 'node', kind: kindOf(k), id, label, descr: descr || undefined };\n    };\n  var peg$f7 = function(kind, from, to, l) { return l; };\n  var peg$f8 = function(kind, from, to, label, t) { return t; };\n  var peg$f9 = function(kind, from, to, label, tech) {\n      return { t: 'rel', from, to, label: label || undefined, tech: tech || undefined, ext: kind.toLowerCase() === 'rel_ext' };\n    };\n  var peg$f10 = function(s) { return s.replace(/<br\\s*\\/?>/gi, ' ').replace(/\\s+/g, ' ').trim(); };\n  var peg$f11 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 2);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 2;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = input.substr(peg$currPos, 7);\n      if (s4.toLowerCase() === peg$c1) {\n        peg$currPos += 7;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      if (s4 === peg$FAILED) {\n        s4 = input.substr(peg$currPos, 9);\n        if (s4.toLowerCase() === peg$c2) {\n          peg$currPos += 9;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = input.substr(peg$currPos, 9);\n          if (s4.toLowerCase() === peg$c3) {\n            peg$currPos += 9;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          if (s4 === peg$FAILED) {\n            s4 = input.substr(peg$currPos, 7);\n            if (s4.toLowerCase() === peg$c4) {\n              peg$currPos += 7;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e4); }\n            }\n            if (s4 === peg$FAILED) {\n              s4 = input.substr(peg$currPos, 10);\n              if (s4.toLowerCase() === peg$c5) {\n                peg$currPos += 10;\n              } else {\n                s4 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e5); }\n              }\n            }\n          }\n        }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseLineEnd();\n        if (s5 !== peg$FAILED) {\n          s6 = [];\n          s7 = peg$parseStatement();\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = peg$parseStatement();\n          }\n          s7 = peg$parse_();\n          peg$savedPos = s0;\n          s0 = peg$f0(s1, s6);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c6) {\n      s1 = peg$c6;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c6) {\n          s7 = peg$c6;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e7); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c6) {\n            s7 = peg$c6;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e6); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c6) {\n          s4 = peg$c6;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e6); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitleLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseBoundaryBlock();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseRelDecl();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseNodeDecl();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseBlankLine();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleLine() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c7) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseRestOfLine();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBoundaryBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18, s19, s20, s21;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 19);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 19;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 15);\n      if (s2.toLowerCase() === peg$c9) {\n        peg$currPos += 15;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 18);\n        if (s2.toLowerCase() === peg$c10) {\n          peg$currPos += 18;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s2 === peg$FAILED) {\n          s2 = input.substr(peg$currPos, 8);\n          if (s2.toLowerCase() === peg$c11) {\n            peg$currPos += 8;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseIdent();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c13;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseQuoted();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s12 = peg$c13;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseQuoted();\n                if (s14 !== peg$FAILED) {\n                  s11 = [s11, s12, s13, s14];\n                  s10 = s11;\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 41) {\n                s12 = peg$c14;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 123) {\n                  s14 = peg$c15;\n                  peg$currPos++;\n                } else {\n                  s14 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                if (s14 !== peg$FAILED) {\n                  s15 = peg$parse_();\n                  if (input.charCodeAt(peg$currPos) === 13) {\n                    s16 = peg$c16;\n                    peg$currPos++;\n                  } else {\n                    s16 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e17); }\n                  }\n                  if (s16 === peg$FAILED) {\n                    s16 = null;\n                  }\n                  if (input.charCodeAt(peg$currPos) === 10) {\n                    s17 = peg$c17;\n                    peg$currPos++;\n                  } else {\n                    s17 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e18); }\n                  }\n                  if (s17 !== peg$FAILED) {\n                    s18 = [];\n                    s19 = peg$parseStatement();\n                    while (s19 !== peg$FAILED) {\n                      s18.push(s19);\n                      s19 = peg$parseStatement();\n                    }\n                    s19 = peg$parse_();\n                    if (input.charCodeAt(peg$currPos) === 125) {\n                      s20 = peg$c18;\n                      peg$currPos++;\n                    } else {\n                      s20 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n                    }\n                    if (s20 !== peg$FAILED) {\n                      s21 = peg$parseLineEnd();\n                      if (s21 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s0 = peg$f4(s5, s9, s18);\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseNodeKind();\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseIdent();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c13;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseQuoted();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s12 = peg$c13;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseQuoted();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s10;\n                  s10 = peg$f5(s2, s5, s9, s14);\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              s11 = [];\n              s12 = peg$currPos;\n              s13 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s14 = peg$c13;\n                peg$currPos++;\n              } else {\n                s14 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s14 !== peg$FAILED) {\n                s15 = peg$parse_();\n                s16 = peg$parseQuoted();\n                if (s16 !== peg$FAILED) {\n                  s13 = [s13, s14, s15, s16];\n                  s12 = s13;\n                } else {\n                  peg$currPos = s12;\n                  s12 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s12;\n                s12 = peg$FAILED;\n              }\n              while (s12 !== peg$FAILED) {\n                s11.push(s12);\n                s12 = peg$currPos;\n                s13 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 44) {\n                  s14 = peg$c13;\n                  peg$currPos++;\n                } else {\n                  s14 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e14); }\n                }\n                if (s14 !== peg$FAILED) {\n                  s15 = peg$parse_();\n                  s16 = peg$parseQuoted();\n                  if (s16 !== peg$FAILED) {\n                    s13 = [s13, s14, s15, s16];\n                    s12 = s13;\n                  } else {\n                    peg$currPos = s12;\n                    s12 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s12;\n                  s12 = peg$FAILED;\n                }\n              }\n              s12 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 41) {\n                s13 = peg$c14;\n                peg$currPos++;\n              } else {\n                s13 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s13 !== peg$FAILED) {\n                s14 = peg$parseLineEnd();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f6(s2, s5, s9, s10);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRelDecl() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c19) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = input.substr(peg$currPos, 5);\n      if (s2.toLowerCase() === peg$c20) {\n        peg$currPos += 5;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      if (s2 === peg$FAILED) {\n        s2 = input.substr(peg$currPos, 3);\n        if (s2.toLowerCase() === peg$c21) {\n          peg$currPos += 3;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e22); }\n        }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 40) {\n        s3 = peg$c12;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parseIdent();\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c13;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parseIdent();\n            if (s9 !== peg$FAILED) {\n              s10 = peg$currPos;\n              s11 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s12 = peg$c13;\n                peg$currPos++;\n              } else {\n                s12 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s12 !== peg$FAILED) {\n                s13 = peg$parse_();\n                s14 = peg$parseQuoted();\n                if (s14 !== peg$FAILED) {\n                  peg$savedPos = s10;\n                  s10 = peg$f7(s2, s5, s9, s14);\n                } else {\n                  peg$currPos = s10;\n                  s10 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s10;\n                s10 = peg$FAILED;\n              }\n              if (s10 === peg$FAILED) {\n                s10 = null;\n              }\n              s11 = peg$currPos;\n              s12 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s13 = peg$c13;\n                peg$currPos++;\n              } else {\n                s13 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s13 !== peg$FAILED) {\n                s14 = peg$parse_();\n                s15 = peg$parseQuoted();\n                if (s15 !== peg$FAILED) {\n                  peg$savedPos = s11;\n                  s11 = peg$f8(s2, s5, s9, s10, s15);\n                } else {\n                  peg$currPos = s11;\n                  s11 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s11;\n                s11 = peg$FAILED;\n              }\n              if (s11 === peg$FAILED) {\n                s11 = null;\n              }\n              s12 = [];\n              s13 = peg$currPos;\n              s14 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 44) {\n                s15 = peg$c13;\n                peg$currPos++;\n              } else {\n                s15 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s15 !== peg$FAILED) {\n                s16 = peg$parse_();\n                s17 = peg$parseQuoted();\n                if (s17 !== peg$FAILED) {\n                  s14 = [s14, s15, s16, s17];\n                  s13 = s14;\n                } else {\n                  peg$currPos = s13;\n                  s13 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s13;\n                s13 = peg$FAILED;\n              }\n              while (s13 !== peg$FAILED) {\n                s12.push(s13);\n                s13 = peg$currPos;\n                s14 = peg$parse_();\n                if (input.charCodeAt(peg$currPos) === 44) {\n                  s15 = peg$c13;\n                  peg$currPos++;\n                } else {\n                  s15 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e14); }\n                }\n                if (s15 !== peg$FAILED) {\n                  s16 = peg$parse_();\n                  s17 = peg$parseQuoted();\n                  if (s17 !== peg$FAILED) {\n                    s14 = [s14, s15, s16, s17];\n                    s13 = s14;\n                  } else {\n                    peg$currPos = s13;\n                    s13 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s13;\n                  s13 = peg$FAILED;\n                }\n              }\n              s13 = peg$parse_();\n              if (input.charCodeAt(peg$currPos) === 41) {\n                s14 = peg$c14;\n                peg$currPos++;\n              } else {\n                s14 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s14 !== peg$FAILED) {\n                s15 = peg$parseLineEnd();\n                if (s15 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f9(s2, s5, s9, s10, s11);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeKind() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e24); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c22;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r3.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c22;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f10(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r2.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r2.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e24); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r0.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c16;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c17;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f11();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c16;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c17;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c16;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c17;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e18); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e27); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e28); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r4.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e28); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r4.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e28); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r4.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e28); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { C4Document } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutC4 } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { C4Document, C4Node, C4Boundary, C4Rel } from './ir.js';\n\nexport const c4: DiagramModule<C4Document> = {\n  parseMermaid(input: string): C4Document {\n    return parser.parse(input) as C4Document;\n  },\n\n  parseYaml(input: string): C4Document {\n    return JSON.parse(input) as C4Document;\n  },\n\n  layout(ir: C4Document, theme: ResolvedTheme): LayoutResult {\n    return layoutC4(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/architecture/gridPlacer.ts \u2014 Directional grid placement for\n * architecture-beta diagrams.\n *\n * The legacy `directionalGridPlacer` keeps the original flat Mermaid-compatible\n * BFS behavior. `groupAwareDirectionalGridPlacer` adds recursive cluster\n * placement for architecture groups so containment is preserved before pixel\n * group rectangles are measured in layout.ts.\n */\n\nimport type { ArchAlign, ArchitectureDocument } from './ir.js';\n\nexport interface GridPlacerResult {\n  /** Grid column (0-indexed, left-to-right). */\n  readonly col: number;\n  /** Grid row (0-indexed, top-to-bottom). */\n  readonly row: number;\n}\n\ntype Side = 'L' | 'R' | 'T' | 'B';\ntype ContainerId = string | '__root__';\ntype ItemKind = 'leaf' | 'group';\n\ntype ItemId = `node:${string}` | `group:${string}`;\n\ninterface MutableCell {\n  col: number;\n  row: number;\n}\ninterface Size {\n  width: number;\n  height: number;\n}\n\ninterface Item {\n  id: ItemId;\n  kind: ItemKind;\n  sourceId: string;\n  width: number;\n  height: number;\n  order: number;\n  cluster?: Cluster;\n}\n\ninterface Constraint {\n  from: ItemId;\n  to: ItemId;\n  fromSide: Side;\n  toSide: Side;\n  fromInner: MutableCell;\n  toInner: MutableCell;\n  edgeOrder: number;\n}\n\ninterface AdjConstraint {\n  to: ItemId;\n  fromSide: Side;\n  toSide: Side;\n  currInner: MutableCell;\n  nextInner: MutableCell;\n  edgeOrder: number;\n}\n\ninterface RectCell {\n  id: ItemId;\n  col: number;\n  row: number;\n  width: number;\n  height: number;\n}\n\ninterface Cluster {\n  containerId: ContainerId;\n  items: Item[];\n  itemPos: Map<ItemId, MutableCell>;\n  nodePos: Map<string, MutableCell>;\n  width: number;\n  height: number;\n}\n\nconst CLUSTER_ROUTING_LANE_GAP = 1;\n\n// \u2500\u2500\u2500 Direction-pair delta table \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n//\n// For each direction pair (fromSide + toSide), this gives (\u0394col, \u0394row) to\n// apply to the CURRENT node's position to get the NEIGHBOR node's position.\n// Rows increase downward.\nconst DELTA: Readonly<Record<string, readonly [number, number]>> = {\n  LR: [-1, 0],\n  RL: [+1, 0],\n  TB: [0, -1],\n  BT: [0, +1],\n  LT: [-1, -1],\n  LB: [-1, +1],\n  RT: [+1, -1],\n  RB: [+1, +1],\n  TL: [-1, -1],\n  TR: [+1, -1],\n  BL: [-1, +1],\n  BR: [+1, +1],\n};\n\nfunction upperSide(side: string): Side | undefined {\n  const s = side.toUpperCase();\n  return s === 'L' || s === 'R' || s === 'T' || s === 'B' ? s : undefined;\n}\n\n// \u2500\u2500\u2500 Public API: legacy flat placer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Compute integer grid-cell positions from directional edge constraints.\n *\n * @param nodes  All services and junctions (any object with an `id`).\n * @param edges  All edges with `from`, `fromSide`, `to`, `toSide`.\n * @returns      Map from node ID to {col, row} (0-indexed, non-negative).\n */\nexport function directionalGridPlacer(\n  nodes: ReadonlyArray<{ readonly id: string }>,\n  edges: ReadonlyArray<{\n    readonly from: string;\n    readonly fromSide: string;\n    readonly to: string;\n    readonly toSide: string;\n  }>,\n): Map<string, GridPlacerResult> {\n  if (nodes.length === 0) return new Map();\n\n  // \u2500\u2500 1. Build bidirectional adjacency list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // adjList[nodeId][dirPair] = neighborId\n  const adjList = new Map<string, Map<string, string>>();\n  for (const n of nodes) adjList.set(n.id, new Map());\n\n  for (const e of edges) {\n    const fs = e.fromSide.toUpperCase();\n    const ts = e.toSide.toUpperCase();\n    const fwd = fs + ts;\n    const rev = ts + fs;\n\n    const fromAdj = adjList.get(e.from);\n    const toAdj = adjList.get(e.to);\n    if (!fromAdj || !toAdj) continue; // unknown node \u2014 skip\n\n    // Contradiction detection: same pair pointing to a DIFFERENT neighbor.\n    if (fromAdj.has(fwd) && fromAdj.get(fwd) !== e.to) {\n      console.warn(\n        `[gridPlacer] Contradictory constraint on \"${e.from}\" direction ${fwd} \u2014 first-wins`,\n      );\n    } else {\n      fromAdj.set(fwd, e.to);\n    }\n\n    if (toAdj.has(rev) && toAdj.get(rev) !== e.from) {\n      console.warn(\n        `[gridPlacer] Contradictory constraint on \"${e.to}\" direction ${rev} \u2014 first-wins`,\n      );\n    } else {\n      toAdj.set(rev, e.from);\n    }\n  }\n\n  // \u2500\u2500 2. BFS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const position = new Map<string, { col: number; row: number }>();\n  /** Reverse map for collision detection: \"col,row\" \u2192 nodeId */\n  const occupied = new Map<string, string>();\n\n  function bfs(seed: string, seedCol: number, seedRow: number): void {\n    position.set(seed, { col: seedCol, row: seedRow });\n    occupied.set(`${seedCol},${seedRow}`, seed);\n    const queue: string[] = [seed];\n\n    while (queue.length > 0) {\n      const curr = queue.shift()!;\n      const currPos = position.get(curr)!;\n      const adj = adjList.get(curr);\n      if (!adj) continue;\n\n      for (const [pair, neighbor] of adj) {\n        if (position.has(neighbor)) continue; // already placed (cycle or revisit)\n\n        const d = DELTA[pair];\n        if (!d) continue; // unrecognised pair \u2014 skip\n\n        let col = currPos.col + d[0];\n        let row = currPos.row + d[1];\n\n        // Collision: bump to the next free row in the same column.\n        const key = `${col},${row}`;\n        if (occupied.has(key) && occupied.get(key) !== neighbor) {\n          console.warn(`[gridPlacer] Cell collision at (${col},${row}), bumping \"${neighbor}\"`);\n          let bump = row + 1;\n          while (occupied.has(`${col},${bump}`)) bump++;\n          row = bump;\n        }\n\n        position.set(neighbor, { col, row });\n        occupied.set(`${col},${row}`, neighbor);\n        queue.push(neighbor);\n      }\n    }\n  }\n\n  // Seed: prefer a node that has at least one edge, for a more centred layout.\n  const connected = new Set([...edges.map((e) => e.from), ...edges.map((e) => e.to)]);\n  const seed = nodes.find((n) => connected.has(n.id)) ?? nodes[0]!;\n  bfs(seed.id, 0, 0);\n\n  // \u2500\u2500 3. Handle disconnected components \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  for (const n of nodes) {\n    if (!position.has(n.id)) {\n      const maxCol =\n        position.size > 0 ? Math.max(...[...position.values()].map((p) => p.col)) + 2 : 0;\n      bfs(n.id, maxCol, 0);\n    }\n  }\n\n  // \u2500\u2500 4. Nodes with NO edges at all \u2192 fall back: single row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  if (position.size === 0) {\n    nodes.forEach((n, i) => position.set(n.id, { col: i, row: 0 }));\n  }\n\n  // \u2500\u2500 5. Normalise to non-negative \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const vals = [...position.values()];\n  const minCol = Math.min(...vals.map((p) => p.col));\n  const minRow = Math.min(...vals.map((p) => p.row));\n\n  const result = new Map<string, GridPlacerResult>();\n  for (const [id, pos] of position) {\n    result.set(id, { col: pos.col - minCol, row: pos.row - minRow });\n  }\n  return result;\n}\n\n// \u2500\u2500\u2500 Public API: group-aware cluster placer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function groupAwareDirectionalGridPlacer(\n  ir: ArchitectureDocument,\n): Map<string, GridPlacerResult> {\n  const nodeIds = new Set<string>([\n    ...ir.services.map((s) => s.id),\n    ...ir.junctions.map((j) => j.id),\n  ]);\n  if (nodeIds.size === 0) return new Map();\n\n  const groupIds = new Set(ir.groups.map((g) => g.id));\n  const parentOfGroup = new Map<string, ContainerId>();\n  for (const g of ir.groups) {\n    parentOfGroup.set(g.id, g.parent && groupIds.has(g.parent) ? g.parent : '__root__');\n  }\n\n  const ownerOfNode = new Map<string, ContainerId>();\n  for (const s of ir.services)\n    ownerOfNode.set(s.id, s.group && groupIds.has(s.group) ? s.group : '__root__');\n  for (const j of ir.junctions)\n    ownerOfNode.set(j.id, j.group && groupIds.has(j.group) ? j.group : '__root__');\n\n  const groupOrder = new Map<string, number>();\n  ir.groups.forEach((g, i) => groupOrder.set(g.id, i));\n  const serviceOrder = new Map<string, number>();\n  ir.services.forEach((s, i) => serviceOrder.set(s.id, i));\n  const junctionOrder = new Map<string, number>();\n  ir.junctions.forEach((j, i) => junctionOrder.set(j.id, i));\n\n  const clusterByContainer = new Map<ContainerId, Cluster>();\n\n  function isDescendantNode(nodeId: string, container: ContainerId): boolean {\n    if (!nodeIds.has(nodeId)) return false;\n    if (container === '__root__') return true;\n    let owner = ownerOfNode.get(nodeId);\n    while (owner && owner !== '__root__') {\n      if (owner === container) return true;\n      owner = parentOfGroup.get(owner);\n    }\n    return false;\n  }\n\n  function directChildItem(container: ContainerId, nodeId: string): ItemId | undefined {\n    if (!nodeIds.has(nodeId)) return undefined;\n    const owner = ownerOfNode.get(nodeId) ?? '__root__';\n    if (owner === container) return `node:${nodeId}`;\n    if (owner === '__root__') return undefined;\n\n    let childGroup = owner;\n    let parent = parentOfGroup.get(childGroup) ?? '__root__';\n    while (parent !== container) {\n      if (parent === '__root__') return undefined;\n      childGroup = parent;\n      parent = parentOfGroup.get(childGroup) ?? '__root__';\n    }\n    return `group:${childGroup}`;\n  }\n\n  function ancestorContainers(nodeId: string): ContainerId[] {\n    const ancestors: ContainerId[] = ['__root__'];\n    const chain: string[] = [];\n    let owner = ownerOfNode.get(nodeId);\n    while (owner && owner !== '__root__') {\n      chain.push(owner);\n      owner = parentOfGroup.get(owner);\n    }\n    ancestors.push(...chain.reverse());\n    return ancestors;\n  }\n\n  function leastCommonContainer(memberIds: readonly string[]): ContainerId | undefined {\n    const known = memberIds.filter((id) => nodeIds.has(id));\n    if (known.length < 2) return undefined;\n    const chains = known.map(ancestorContainers);\n    let lca: ContainerId = '__root__';\n    const minLen = Math.min(...chains.map((c) => c.length));\n    for (let i = 0; i < minLen; i++) {\n      const candidate = chains[0]![i]!;\n      if (chains.every((c) => c[i] === candidate)) lca = candidate;\n      else break;\n    }\n    return lca;\n  }\n\n  function buildCluster(container: ContainerId): Cluster {\n    const cached = clusterByContainer.get(container);\n    if (cached) return cached;\n\n    const items: Item[] = [];\n    for (const g of ir.groups) {\n      if ((parentOfGroup.get(g.id) ?? '__root__') !== container) continue;\n      const child = buildCluster(g.id);\n      if (child.width === 0 || child.height === 0) continue;\n      items.push({\n        id: `group:${g.id}`,\n        kind: 'group',\n        sourceId: g.id,\n        width: child.width,\n        height: child.height,\n        order: groupOrder.get(g.id) ?? 0,\n        cluster: child,\n      });\n    }\n    for (const s of ir.services) {\n      if ((ownerOfNode.get(s.id) ?? '__root__') === container) {\n        items.push({\n          id: `node:${s.id}`,\n          kind: 'leaf',\n          sourceId: s.id,\n          width: 1,\n          height: 1,\n          order: serviceOrder.get(s.id) ?? 0,\n        });\n      }\n    }\n    for (const j of ir.junctions) {\n      if ((ownerOfNode.get(j.id) ?? '__root__') === container) {\n        items.push({\n          id: `node:${j.id}`,\n          kind: 'leaf',\n          sourceId: j.id,\n          width: 1,\n          height: 1,\n          order: junctionOrder.get(j.id) ?? 0,\n        });\n      }\n    }\n\n    const constraints: Constraint[] = [];\n    ir.edges.forEach((e, edgeOrder) => {\n      if (!isDescendantNode(e.from, container) || !isDescendantNode(e.to, container)) return;\n      const fromSide = upperSide(e.fromSide);\n      const toSide = upperSide(e.toSide);\n      if (!fromSide || !toSide) return;\n      const from = directChildItem(container, e.from);\n      const to = directChildItem(container, e.to);\n      if (!from || !to || from === to) return;\n      constraints.push({\n        from,\n        to,\n        fromSide,\n        toSide,\n        fromInner: innerLocalCell(from, e.from),\n        toInner: innerLocalCell(to, e.to),\n        edgeOrder,\n      });\n    });\n\n    const itemPos = placeItemsAsRectangles(items, constraints);\n    applyContainerAligns(\n      container,\n      items,\n      itemPos,\n      ir.aligns,\n      leastCommonContainer,\n      directChildItem,\n    );\n\n    const nodePos = new Map<string, MutableCell>();\n    for (const item of items) {\n      const base = itemPos.get(item.id);\n      if (!base) continue;\n      if (item.kind === 'leaf') {\n        nodePos.set(item.sourceId, { col: base.col, row: base.row });\n      } else {\n        for (const [nodeId, local] of item.cluster!.nodePos) {\n          nodePos.set(nodeId, { col: base.col + local.col, row: base.row + local.row });\n        }\n      }\n    }\n\n    normalizePositions(itemPos, nodePos);\n    const bounds = boundsForItems(items, itemPos);\n    const cluster: Cluster = {\n      containerId: container,\n      items,\n      itemPos,\n      nodePos,\n      width: bounds.width,\n      height: bounds.height,\n    };\n    clusterByContainer.set(container, cluster);\n    return cluster;\n  }\n\n  function innerLocalCell(itemId: ItemId, nodeId: string): MutableCell {\n    if (itemId.startsWith('node:')) return { col: 0, row: 0 };\n    const groupId = itemId.slice('group:'.length);\n    const local = clusterByContainer.get(groupId)?.nodePos.get(nodeId);\n    return local ? { col: local.col, row: local.row } : { col: 0, row: 0 };\n  }\n\n  const root = buildCluster('__root__');\n  return new Map([...root.nodePos].map(([id, cell]) => [id, { col: cell.col, row: cell.row }]));\n}\n\n// \u2500\u2500\u2500 Rectangle item placement \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction placeItemsAsRectangles(\n  items: readonly Item[],\n  constraints: readonly Constraint[],\n): Map<ItemId, MutableCell> {\n  const pos = new Map<ItemId, MutableCell>();\n  if (items.length === 0) return pos;\n\n  const itemById = new Map(items.map((i) => [i.id, i]));\n  const adj = buildAdjacency(items, constraints);\n  const occupied: RectCell[] = [];\n\n  const connected = new Set<ItemId>();\n  for (const c of constraints) {\n    if (itemById.has(c.from) && itemById.has(c.to)) {\n      connected.add(c.from);\n      connected.add(c.to);\n    }\n  }\n  const connectedSeeds = items.filter((i) => connected.has(i.id));\n  const seeds =\n    connectedSeeds.length > 0\n      ? [...connectedSeeds, ...items.filter((i) => !connected.has(i.id))]\n      : [...items];\n\n  function place(item: Item, cell: MutableCell): void {\n    pos.set(item.id, { col: cell.col, row: cell.row });\n    occupied.push({\n      id: item.id,\n      col: cell.col,\n      row: cell.row,\n      width: item.width,\n      height: item.height,\n    });\n  }\n\n  for (const seed of seeds) {\n    if (!pos.has(seed.id)) {\n      const hasPlacedGroup = occupied.some((r) => itemById.get(r.id)?.kind === 'group');\n      const laneGap = seed.kind === 'group' || hasPlacedGroup ? CLUSTER_ROUTING_LANE_GAP : 0;\n      const seedCell =\n        occupied.length === 0 ? { col: 0, row: 0 } : { col: maxRight(occupied) + laneGap, row: 0 };\n      place(seed, firstFreeRect(seedCell, seed, occupied));\n    }\n\n    const queue: Item[] = [seed];\n    while (queue.length > 0) {\n      const curr = queue.shift()!;\n      const currPos = pos.get(curr.id);\n      if (!currPos) continue;\n      for (const c of adj.get(curr.id) ?? []) {\n        const next = itemById.get(c.to);\n        if (!next || pos.has(next.id)) continue;\n        const candidate = candidateFromSidePair(\n          curr,\n          currPos,\n          next,\n          c.fromSide,\n          c.toSide,\n          c.currInner,\n          c.nextInner,\n        );\n        const free = firstNonOverlappingCandidate(candidate, curr, next, c, occupied);\n        place(next, free);\n        queue.push(next);\n      }\n    }\n  }\n\n  normalizeItemPositions(pos);\n  return pos;\n}\n\nfunction buildAdjacency(\n  items: readonly Item[],\n  constraints: readonly Constraint[],\n): Map<ItemId, AdjConstraint[]> {\n  const itemIds = new Set(items.map((i) => i.id));\n  const firstWins = new Map<ItemId, Map<string, AdjConstraint>>();\n  for (const item of items) firstWins.set(item.id, new Map());\n\n  for (const c of [...constraints].sort((a, b) => a.edgeOrder - b.edgeOrder)) {\n    if (!itemIds.has(c.from) || !itemIds.has(c.to)) continue;\n    addAdj(firstWins, c.from, c.fromSide + c.toSide, {\n      to: c.to,\n      fromSide: c.fromSide,\n      toSide: c.toSide,\n      currInner: c.fromInner,\n      nextInner: c.toInner,\n      edgeOrder: c.edgeOrder,\n    });\n    addAdj(firstWins, c.to, c.toSide + c.fromSide, {\n      to: c.from,\n      fromSide: c.toSide,\n      toSide: c.fromSide,\n      currInner: c.toInner,\n      nextInner: c.fromInner,\n      edgeOrder: c.edgeOrder,\n    });\n  }\n\n  return new Map(\n    [...firstWins].map(([id, byPair]) => [\n      id,\n      [...byPair.values()].sort((a, b) => a.edgeOrder - b.edgeOrder),\n    ]),\n  );\n}\n\nfunction addAdj(\n  adj: Map<ItemId, Map<string, AdjConstraint>>,\n  from: ItemId,\n  pair: string,\n  c: AdjConstraint,\n): void {\n  const byPair = adj.get(from);\n  if (!byPair) return;\n  if (byPair.has(pair) && byPair.get(pair)!.to !== c.to) {\n    console.warn(\n      `[gridPlacer] Contradictory constraint on \"${from}\" direction ${pair} \u2014 first-wins`,\n    );\n    return;\n  }\n  if (!byPair.has(pair)) byPair.set(pair, c);\n}\n\nfunction candidateFromSidePair(\n  curr: Item,\n  currPos: MutableCell,\n  next: Item,\n  fromSide: Side,\n  toSide: Side,\n  currInner: MutableCell,\n  nextInner: MutableCell,\n): MutableCell {\n  const d = DELTA[fromSide + toSide];\n  if (!d) return { col: currPos.col, row: currPos.row };\n  const laneGap = curr.kind === 'group' || next.kind === 'group' ? CLUSTER_ROUTING_LANE_GAP : 0;\n  if (isMixedSidePair(fromSide, toSide)) {\n    return mixedSideCandidate(curr, currPos, next, fromSide, toSide, currInner, nextInner, laneGap);\n  }\n  let col = currPos.col;\n  let row = currPos.row;\n  if (d[0] < 0) col = currPos.col - next.width - laneGap;\n  else if (d[0] > 0) col = currPos.col + curr.width + laneGap;\n  if (d[1] < 0) row = currPos.row - next.height - laneGap;\n  else if (d[1] > 0) row = currPos.row + curr.height + laneGap;\n  return { col, row };\n}\n\nfunction isHorizontalSide(side: Side): boolean {\n  return side === 'L' || side === 'R';\n}\n\nfunction isMixedSidePair(fromSide: Side, toSide: Side): boolean {\n  return isHorizontalSide(fromSide) !== isHorizontalSide(toSide);\n}\n\nfunction mixedSideCandidate(\n  curr: Item,\n  currPos: MutableCell,\n  next: Item,\n  fromSide: Side,\n  toSide: Side,\n  currInner: MutableCell,\n  nextInner: MutableCell,\n  laneGap: number,\n): MutableCell {\n  let col = currPos.col;\n  let row = currPos.row;\n  const innerCol = currPos.col + currInner.col;\n  const innerRow = currPos.row + currInner.row;\n\n  switch (fromSide) {\n    case 'R':\n      col = currPos.col + curr.width + laneGap;\n      break;\n    case 'L':\n      col = currPos.col - next.width - laneGap;\n      break;\n    case 'B':\n      row = currPos.row + curr.height + laneGap;\n      break;\n    case 'T':\n      row = currPos.row - next.height - laneGap;\n      break;\n  }\n\n  switch (toSide) {\n    case 'R':\n      col = innerCol - 1 - nextInner.col;\n      break;\n    case 'L':\n      col = innerCol + 1 - nextInner.col;\n      break;\n    case 'B':\n      row = innerRow - 1 - nextInner.row;\n      break;\n    case 'T':\n      row = innerRow + 1 - nextInner.row;\n      break;\n  }\n\n  return { col, row };\n}\n\nfunction firstNonOverlappingCandidate(\n  candidate: MutableCell,\n  curr: Item,\n  next: Item,\n  c: AdjConstraint,\n  occupied: readonly RectCell[],\n): MutableCell {\n  if (!overlapsAny(candidate, next, occupied)) return candidate;\n\n  const d = placementHalfPlaneDelta(c.fromSide, c.toSide);\n  const currRect = occupied.find((r) => r.id === curr.id);\n  const limit = Math.max(\n    12,\n    occupied.length * 4 + maxRight(occupied) + maxBottom(occupied) + next.width + next.height,\n  );\n\n  const offsets = orderedOffsets(limit);\n  if (d[0] !== 0 && d[1] === 0) {\n    for (const off of offsets) {\n      const cell = { col: candidate.col, row: candidate.row + off };\n      if (preservesHalfPlane(cell, next, currRect, d) && !overlapsAny(cell, next, occupied))\n        return cell;\n    }\n  } else if (d[0] === 0 && d[1] !== 0) {\n    for (const off of offsets) {\n      const cell = { col: candidate.col + off, row: candidate.row };\n      if (preservesHalfPlane(cell, next, currRect, d) && !overlapsAny(cell, next, occupied))\n        return cell;\n    }\n  } else {\n    for (let radius = 0; radius <= limit; radius++) {\n      for (let dx = -radius; dx <= radius; dx++) {\n        const dyAbs = radius - Math.abs(dx);\n        for (const dy of dyAbs === 0 ? [0] : [-dyAbs, dyAbs]) {\n          const cell = { col: candidate.col + dx, row: candidate.row + dy };\n          if (preservesHalfPlane(cell, next, currRect, d) && !overlapsAny(cell, next, occupied))\n            return cell;\n        }\n      }\n    }\n  }\n\n  console.warn(\n    `[gridPlacer] Rectangle collision near (${candidate.col},${candidate.row}), placing \"${next.id}\" after occupied extent`,\n  );\n  return firstFreeRect({ col: maxRight(occupied), row: 0 }, next, occupied);\n}\n\nfunction placementHalfPlaneDelta(fromSide: Side, toSide: Side): readonly [number, number] {\n  if (isMixedSidePair(fromSide, toSide)) {\n    return isHorizontalSide(fromSide)\n      ? [fromSide === 'L' ? -1 : 1, 0]\n      : [0, fromSide === 'T' ? -1 : 1];\n  }\n  return DELTA[fromSide + toSide] ?? [0, 0];\n}\n\nfunction orderedOffsets(limit: number): number[] {\n  const out = [0];\n  for (let i = 1; i <= limit; i++) out.push(i, -i);\n  return out;\n}\n\nfunction preservesHalfPlane(\n  cell: MutableCell,\n  item: Size,\n  curr: RectCell | undefined,\n  d: readonly number[],\n): boolean {\n  if (!curr) return true;\n  const dx = d[0] ?? 0;\n  const dy = d[1] ?? 0;\n  if (dx < 0 && cell.col + item.width > curr.col) return false;\n  if (dx > 0 && cell.col < curr.col + curr.width) return false;\n  if (dy < 0 && cell.row + item.height > curr.row) return false;\n  if (dy > 0 && cell.row < curr.row + curr.height) return false;\n  return true;\n}\n\nfunction firstFreeRect(start: MutableCell, item: Size, occupied: readonly RectCell[]): MutableCell {\n  let row = start.row;\n  const widthLimit = Math.max(start.col + 1, maxRight(occupied) + item.width + occupied.length + 2);\n  for (;;) {\n    for (let col = start.col; col <= widthLimit; col++) {\n      const cell = { col, row };\n      if (!overlapsAny(cell, item, occupied)) return cell;\n    }\n    row++;\n  }\n}\n\nfunction overlapsAny(\n  cell: MutableCell,\n  item: Size,\n  occupied: readonly RectCell[],\n  ignore: ReadonlySet<ItemId> = new Set(),\n): boolean {\n  return occupied.some(\n    (r) =>\n      !ignore.has(r.id) &&\n      rectsOverlap(cell.col, cell.row, item.width, item.height, r.col, r.row, r.width, r.height),\n  );\n}\n\nfunction rectsOverlap(\n  ax: number,\n  ay: number,\n  aw: number,\n  ah: number,\n  bx: number,\n  by: number,\n  bw: number,\n  bh: number,\n): boolean {\n  return ax < bx + bw && ax + aw > bx && ay < by + bh && ay + ah > by;\n}\n\nfunction maxRight(rects: readonly RectCell[]): number {\n  return rects.length === 0 ? 0 : Math.max(...rects.map((r) => r.col + r.width));\n}\n\nfunction maxBottom(rects: readonly RectCell[]): number {\n  return rects.length === 0 ? 0 : Math.max(...rects.map((r) => r.row + r.height));\n}\n\nfunction normalizeItemPositions(pos: Map<ItemId, MutableCell>): void {\n  if (pos.size === 0) return;\n  const minCol = Math.min(...[...pos.values()].map((p) => p.col));\n  const minRow = Math.min(...[...pos.values()].map((p) => p.row));\n  for (const p of pos.values()) {\n    p.col -= minCol;\n    p.row -= minRow;\n  }\n}\n\nfunction normalizePositions(\n  itemPos: Map<ItemId, MutableCell>,\n  nodePos: Map<string, MutableCell>,\n): void {\n  if (itemPos.size === 0 && nodePos.size === 0) return;\n  const vals = [...itemPos.values(), ...nodePos.values()];\n  const minCol = Math.min(...vals.map((p) => p.col));\n  const minRow = Math.min(...vals.map((p) => p.row));\n  for (const p of itemPos.values()) {\n    p.col -= minCol;\n    p.row -= minRow;\n  }\n  for (const p of nodePos.values()) {\n    p.col -= minCol;\n    p.row -= minRow;\n  }\n}\n\nfunction boundsForItems(items: readonly Item[], itemPos: ReadonlyMap<ItemId, MutableCell>): Size {\n  if (items.length === 0) return { width: 0, height: 0 };\n  let width = 0;\n  let height = 0;\n  for (const item of items) {\n    const p = itemPos.get(item.id);\n    if (!p) continue;\n    width = Math.max(width, p.col + item.width);\n    height = Math.max(height, p.row + item.height);\n  }\n  return { width, height };\n}\n\n// \u2500\u2500\u2500 Containment-safe align \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction applyContainerAligns(\n  container: ContainerId,\n  items: readonly Item[],\n  itemPos: Map<ItemId, MutableCell>,\n  aligns: readonly ArchAlign[],\n  leastCommonContainer: (memberIds: readonly string[]) => ContainerId | undefined,\n  directChildItem: (container: ContainerId, nodeId: string) => ItemId | undefined,\n): void {\n  const itemById = new Map(items.map((i) => [i.id, i]));\n  for (const align of aligns) {\n    if (leastCommonContainer(align.members) !== container) continue;\n    const itemIds = [\n      ...new Set(\n        align.members\n          .map((id) => directChildItem(container, id))\n          .filter((id): id is ItemId => !!id),\n      ),\n    ];\n    if (itemIds.length < 2) continue;\n    if (!itemIds.every((id) => itemById.has(id) && itemPos.has(id))) continue;\n\n    const coords = itemIds\n      .map((id) => itemPos.get(id)![align.axis === 'row' ? 'row' : 'col'])\n      .sort((a, b) => a - b);\n    const target = coords[Math.floor(coords.length / 2)]!;\n    const proposed = new Map<ItemId, MutableCell>(\n      [...itemPos].map(([id, p]) => [id, { col: p.col, row: p.row }]),\n    );\n    for (const id of itemIds) {\n      const p = proposed.get(id)!;\n      if (align.axis === 'row') p.row = target;\n      else p.col = target;\n    }\n\n    if (positionsOverlap(items, proposed)) {\n      console.warn(\n        `[gridPlacer] Skipping align ${align.axis} [${align.members.join(', ')}] to preserve containment`,\n      );\n      continue;\n    }\n    for (const [id, p] of proposed) itemPos.set(id, p);\n  }\n  normalizeItemPositions(itemPos);\n}\n\nfunction positionsOverlap(items: readonly Item[], pos: ReadonlyMap<ItemId, MutableCell>): boolean {\n  const rects: RectCell[] = [];\n  for (const item of items) {\n    const p = pos.get(item.id);\n    if (!p) continue;\n    if (overlapsAny(p, item, rects)) return true;\n    rects.push({ id: item.id, col: p.col, row: p.row, width: item.width, height: item.height });\n  }\n  return false;\n}\n", "/**\n * @file diagrams/architecture/layout.ts \u2014 Cloud architecture diagram.\n *\n * Phase C implementation \u2014 replaces Sugiyama layered layout with a\n * direction-constrained BFS grid placer that honours L/R/T/B side semantics.\n * All other rendering features from Phase B remain unchanged.\n *\n * Features:\n *   1. Directional grid placement \u2014 BFS from directional edge constraints\n *   2. Junctions      \u2014 small 4-way split nodes; edges enter/leave on any side.\n *   3. Arrowheads     \u2014 driven by arrowLeft / arrowRight; axis-aligned markers.\n *   4. {group} edges  \u2014 port sits on the enclosing group boundary, not the service box.\n *   5. Align          \u2014 containment-safe row/column constraints in cluster placement.\n *   6. Nested groups  \u2014 parent groups visually contain child groups.\n *   7. Iconify icons  \u2014 prefix:name tokens resolved through LayoutOptions.icons;\n *                       unresolvable tokens fall back to the built-in glyph.\n *\n * Deviations / limitations (disclosed):\n *   - Iconify resolution requires the host to supply LayoutOptions.icons.\n */\n\nimport type { ArchitectureDocument, ArchGroup, ArchIconAlign } from './ir.js';\nimport type {\n  Scene,\n  SceneElement,\n  LayoutResult,\n  Point,\n  Rect,\n  PortDirection,\n  LayoutOptions,\n  RouteStyle,\n  TextAnchor,\n} from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { categoricalHue } from '../../../palette/categorical.js';\nimport { groupAwareDirectionalGridPlacer } from './gridPlacer.js';\nimport { createRouter, countRouteCollisions } from '../../../routing/router.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\nimport { parseIconRef, resolveIcon } from '../../../icons/resolver.js';\nimport { wavifyPath } from '../../../crosslink/render.js';\nimport {\n  measureFormattedText,\n  renderFormattedText,\n  type FormattedTextLines,\n} from '../../../text/formatted.js';\n\n// \u2500\u2500\u2500 Marker IDs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ARROW_END_ID = 'arch-arrow-end'; // \u2192 points in path direction\nconst ARROW_START_ID = 'arch-arrow-start'; // \u2190 points against path direction\n\n// \u2500\u2500\u2500 Geometry helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst MIN_SERVICE_W = 130;\nconst MIN_SERVICE_H = 56;\nconst SERVICE_PAD = 12;\nconst ICON_SIZE = 24;\nconst ICON_LANE_W = 34;\nconst ICON_BAND_H = 30;\nconst SERVICE_TOP_BAR_H = 8;\nconst CENTER_ICON_GAP = 8;\n\nfunction normalizedIconAlign(align: ArchIconAlign | undefined): ArchIconAlign {\n  return align ?? 'N';\n}\n\nfunction isSideIconAlign(align: ArchIconAlign): boolean {\n  return align === 'E' || align === 'W';\n}\n\nfunction serviceSize(\n  label: string,\n  align: ArchIconAlign | undefined,\n  font: number,\n  smallFont: number,\n): { width: number; height: number; info: FormattedTextLines } {\n  const a = normalizedIconAlign(align);\n  const info = measureFormattedText(label, font, smallFont, 220, 4);\n  const laneW = isSideIconAlign(a) ? ICON_LANE_W : 0;\n  const width = Math.ceil(Math.max(MIN_SERVICE_W, laneW + info.maxLineWidth + SERVICE_PAD * 2));\n  const textH = info.lineCount > 1 ? info.lineCount * (font * 1.25) : font * 1.2;\n  const baseH =\n    a === 'C'\n      ? Math.ceil(\n          Math.max(\n            MIN_SERVICE_H,\n            SERVICE_TOP_BAR_H + ICON_SIZE + CENTER_ICON_GAP + textH + SERVICE_PAD,\n          ),\n        )\n      : MIN_SERVICE_H;\n  const height =\n    info.lineCount > 1\n      ? Math.max(\n          baseH,\n          Math.ceil(\n            SERVICE_TOP_BAR_H +\n              textH +\n              (a === 'N' || a === 'NE' || a === 'NW' ? ICON_BAND_H : 0) +\n              SERVICE_PAD,\n          ),\n        )\n      : baseH;\n  return { width, height, info };\n}\n\nfunction port(r: Rect, side: string, t = 0.5): { x: number; y: number } {\n  switch (side.toUpperCase()) {\n    case 'L':\n      return { x: r.x, y: r.y + r.height * t };\n    case 'R':\n      return { x: r.x + r.width, y: r.y + r.height * t };\n    case 'T':\n      return { x: r.x + r.width * t, y: r.y };\n    default:\n      return { x: r.x + r.width * t, y: r.y + r.height };\n  }\n}\n\nfunction sideToDir(side: string): PortDirection {\n  switch (side.toUpperCase()) {\n    case 'L':\n      return 'W';\n    case 'R':\n      return 'E';\n    case 'T':\n      return 'N';\n    default:\n      return 'S';\n  }\n}\n\nfunction dirToSide(dir: PortDirection): string {\n  switch (dir) {\n    case 'W':\n      return 'L';\n    case 'E':\n      return 'R';\n    case 'N':\n      return 'T';\n    case 'S':\n      return 'B';\n  }\n}\n\nfunction rectCenter(r: Rect): Point {\n  return { x: r.x + r.width / 2, y: r.y + r.height / 2 };\n}\n\nfunction endpointSide(edge: ArchitectureDocument['edges'][number], isSource: boolean): string {\n  const wall = isSource ? edge.exitWall : edge.entryWall;\n  return wall ? dirToSide(wall) : isSource ? edge.fromSide : edge.toSide;\n}\n\nfunction tangentKeyForSide(side: string, otherCenter: Point): number {\n  switch (side.toUpperCase()) {\n    case 'T':\n    case 'B':\n      return otherCenter.x;\n    default:\n      return otherCenter.y;\n  }\n}\n\nfunction edgeDash(style: string | undefined): string | undefined {\n  switch (style) {\n    case 'dotted':\n      return '6 3';\n    case 'dashed':\n      return '8 4';\n    default:\n      return undefined;\n  }\n}\n\nfunction edgeStrokeWidth(style: string | undefined, base: number): number {\n  return style === 'thick' ? base * 2 : base;\n}\n\nfunction iconCenter(r: Rect, align: ArchIconAlign | undefined): { x: number; y: number } {\n  const a = normalizedIconAlign(align);\n  const sideY = r.y + SERVICE_TOP_BAR_H + (r.height - SERVICE_TOP_BAR_H) / 2;\n  const topY = r.y + SERVICE_TOP_BAR_H + ICON_SIZE / 2;\n  const bottomY = r.y + r.height - ICON_SIZE / 2 - 4;\n  switch (a) {\n    case 'S':\n      return { x: r.x + r.width / 2, y: bottomY };\n    case 'E':\n      return { x: r.x + r.width - ICON_LANE_W / 2, y: sideY };\n    case 'W':\n      return { x: r.x + ICON_LANE_W / 2, y: sideY };\n    case 'NE':\n      return { x: r.x + r.width - ICON_LANE_W / 2, y: topY };\n    case 'NW':\n      return { x: r.x + ICON_LANE_W / 2, y: topY };\n    case 'SE':\n      return { x: r.x + r.width - ICON_LANE_W / 2, y: bottomY };\n    case 'SW':\n      return { x: r.x + ICON_LANE_W / 2, y: bottomY };\n    case 'C':\n      return { x: r.x + r.width / 2, y: topY };\n    case 'N':\n    default:\n      return { x: r.x + r.width / 2, y: topY };\n  }\n}\n\nfunction serviceLabelArea(\n  r: Rect,\n  align: ArchIconAlign | undefined,\n): {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n  anchor: TextAnchor;\n  paddingLeft?: number;\n} {\n  const a = normalizedIconAlign(align);\n  switch (a) {\n    case 'W':\n      return {\n        x: r.x + ICON_LANE_W + SERVICE_PAD,\n        y: r.y + SERVICE_TOP_BAR_H,\n        width: r.width - ICON_LANE_W - SERVICE_PAD * 2,\n        height: r.height - SERVICE_TOP_BAR_H,\n        anchor: 'start',\n      };\n    case 'E':\n      return {\n        x: r.x + SERVICE_PAD,\n        y: r.y + SERVICE_TOP_BAR_H,\n        width: r.width - ICON_LANE_W - SERVICE_PAD * 2,\n        height: r.height - SERVICE_TOP_BAR_H,\n        anchor: 'start',\n      };\n    case 'S':\n    case 'SE':\n    case 'SW':\n      return {\n        x: r.x + SERVICE_PAD,\n        y: r.y + SERVICE_TOP_BAR_H,\n        width: r.width - SERVICE_PAD * 2,\n        height: r.height - SERVICE_TOP_BAR_H - ICON_BAND_H,\n        anchor: 'middle',\n      };\n    case 'C': {\n      const top = r.y + SERVICE_TOP_BAR_H + ICON_SIZE + CENTER_ICON_GAP;\n      return {\n        x: r.x + SERVICE_PAD,\n        y: top,\n        width: r.width - SERVICE_PAD * 2,\n        height: r.y + r.height - SERVICE_PAD - top,\n        anchor: 'middle',\n      };\n    }\n    case 'N':\n    case 'NE':\n    case 'NW':\n    default: {\n      const top = r.y + SERVICE_TOP_BAR_H + ICON_BAND_H;\n      return {\n        x: r.x + SERVICE_PAD,\n        y: top,\n        width: r.width - SERVICE_PAD * 2,\n        height: r.y + r.height - top,\n        anchor: 'middle',\n      };\n    }\n  }\n}\n\nconst GROUP_HEADER_ICON_X = 18;\nconst GROUP_HEADER_LABEL_GAP_X = 34;\nconst GROUP_HEADER_CENTER_Y = 16;\n\nfunction isRightGroupIconAlign(align: ArchIconAlign | undefined): boolean {\n  return align === 'E' || align === 'NE' || align === 'SE';\n}\n\nfunction groupHeaderPlacement(\n  r: Rect,\n  align: ArchIconAlign | undefined,\n  hasIcon: boolean,\n): {\n  icon: Point;\n  label: { x: number; y: number; anchor: TextAnchor };\n} {\n  const y = r.y + GROUP_HEADER_CENTER_Y;\n  if (hasIcon && isRightGroupIconAlign(align)) {\n    return {\n      icon: { x: r.x + r.width - GROUP_HEADER_ICON_X, y },\n      label: { x: r.x + r.width - GROUP_HEADER_LABEL_GAP_X, y, anchor: 'end' },\n    };\n  }\n  return {\n    icon: { x: r.x + GROUP_HEADER_ICON_X, y },\n    label: { x: r.x + (hasIcon ? GROUP_HEADER_LABEL_GAP_X : 12), y, anchor: 'start' },\n  };\n}\n\n// \u2500\u2500\u2500 Group sort (parent before child for back-to-front rendering) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction groupsByDepth(groups: readonly ArchGroup[]): ArchGroup[] {\n  const result: ArchGroup[] = [];\n  const added = new Set<string>();\n  function add(g: ArchGroup) {\n    if (added.has(g.id)) return;\n    if (g.parent) {\n      const par = groups.find((pg) => pg.id === g.parent);\n      if (par) add(par);\n    }\n    result.push(g);\n    added.add(g.id);\n  }\n  for (const g of groups) add(g);\n  return result;\n}\n\n// \u2500\u2500\u2500 Layout entry point \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function layoutArchitecture(\n  ir: ArchitectureDocument,\n  theme: ResolvedTheme,\n  options?: LayoutOptions,\n): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n  const iconPacks = options?.icons;\n\n  // \u2500\u2500 Sizes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const jctW = 16,\n    jctH = 16; // junctions are small crosshair nodes\n\n  // \u2500\u2500 Node sizes (services vs junctions) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const nodeSizes = new Map<string, { width: number; height: number }>();\n  const serviceInfos = new Map<string, FormattedTextLines>();\n  for (const s of ir.services) {\n    const sz = serviceSize(s.label, s.iconAlign, font, smallFont);\n    nodeSizes.set(s.id, sz);\n    serviceInfos.set(s.id, sz.info);\n  }\n  for (const j of ir.junctions) nodeSizes.set(j.id, { width: jctW, height: jctH });\n\n  // \u2500\u2500 Directional grid placement \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const colGap = 90,\n    rowGap = 64;\n  const gridCells = groupAwareDirectionalGridPlacer(ir);\n\n  // Convert grid cells \u2192 pixel coords; mutable for align post-processing.\n  const colWidths = new Map<number, number>();\n  const rowHeights = new Map<number, number>();\n  for (const [id, cell] of gridCells) {\n    const sz = nodeSizes.get(id);\n    if (!sz) continue;\n    colWidths.set(cell.col, Math.max(colWidths.get(cell.col) ?? MIN_SERVICE_W, sz.width));\n    rowHeights.set(cell.row, Math.max(rowHeights.get(cell.row) ?? MIN_SERVICE_H, sz.height));\n  }\n  const cells = [...gridCells.values()];\n  const maxCol = Math.max(0, ...cells.map((c) => c.col));\n  const maxRow = Math.max(0, ...cells.map((c) => c.row));\n  const colX = new Map<number, number>();\n  const rowY = new Map<number, number>();\n  let xCursor = margin;\n  for (let c = 0; c <= maxCol; c++) {\n    colX.set(c, xCursor);\n    xCursor += (colWidths.get(c) ?? MIN_SERVICE_W) + colGap;\n  }\n  let yCursor = margin;\n  for (let r = 0; r <= maxRow; r++) {\n    rowY.set(r, yCursor);\n    yCursor += (rowHeights.get(r) ?? MIN_SERVICE_H) + rowGap;\n  }\n  const positions = new Map<string, { x: number; y: number }>();\n  for (const [id, cell] of gridCells) {\n    positions.set(id, {\n      x: colX.get(cell.col) ?? margin,\n      y: rowY.get(cell.row) ?? margin,\n    });\n  }\n\n  // \u2500\u2500 rectOf: adjusted position + node size + yOffset \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const titleH = ir.metadata.title ? typography.titleFontSize + 14 : 0;\n  const yOff = titleH;\n  const rectOf = (id: string): Rect | undefined => {\n    const pos = positions.get(id);\n    const sz = nodeSizes.get(id);\n    const cell = gridCells.get(id);\n    if (!pos || !sz) return undefined;\n    const isJct = ir.junctions.some((j) => j.id === id);\n    const width = isJct ? sz.width : cell ? (colWidths.get(cell.col) ?? sz.width) : sz.width;\n    return { x: pos.x, y: pos.y + yOff, width, height: sz.height };\n  };\n\n  // \u2500\u2500 Compute group rects (memoised, recursive for nested groups) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const groupRectCache = new Map<string, Rect>();\n  const computeGroupRect = (gId: string): Rect | undefined => {\n    if (groupRectCache.has(gId)) return groupRectCache.get(gId)!;\n    const pad = 20;\n    const memberRects: Rect[] = [\n      ...ir.services\n        .filter((s) => s.group === gId)\n        .map((s) => rectOf(s.id))\n        .filter((r): r is Rect => !!r),\n      ...ir.junctions\n        .filter((j) => j.group === gId)\n        .map((j) => rectOf(j.id))\n        .filter((r): r is Rect => !!r),\n      ...ir.groups\n        .filter((g) => g.parent === gId)\n        .map((g) => computeGroupRect(g.id))\n        .filter((r): r is Rect => !!r),\n    ];\n    if (memberRects.length === 0) return undefined;\n    const minX = Math.min(...memberRects.map((r) => r.x)) - pad;\n    const minY = Math.min(...memberRects.map((r) => r.y)) - pad - 14;\n    const maxX = Math.max(...memberRects.map((r) => r.x + r.width)) + pad;\n    const maxY = Math.max(...memberRects.map((r) => r.y + r.height)) + pad;\n    const rect: Rect = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n    groupRectCache.set(gId, rect);\n    return rect;\n  };\n  // Prime the cache for all groups.\n  for (const g of ir.groups) computeGroupRect(g.id);\n\n  // \u2500\u2500 Build element list \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const elements: SceneElement[] = [];\n  const warnedIcons = new Set<string>();\n\n  // Title\n  if (ir.metadata.title) {\n    elements.push(\n      p.text(\n        String(ir.metadata.title),\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500 Group boxes (outermost first so children render on top) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const isMono = theme.name === 'bw-light' || theme.name === 'bw-dark' || theme.name === 'minimal';\n  const orderedGroups = groupsByDepth(ir.groups);\n  orderedGroups.forEach((g, gi) => {\n    const r = computeGroupRect(g.id);\n    if (!r) return;\n    const hue = categoricalHue(gi, theme);\n    const groupStroke = isMono ? palette.border : hue;\n    const groupFill = isMono ? palette.surface : hue + '14';\n    const groupLabelColor = isMono ? palette.text : hue;\n    elements.push(\n      p.rect(\n        { x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: rhu(r.height) },\n        groupFill,\n        groupStroke,\n        1.4,\n        { rx: 10 },\n      ),\n    );\n    const header = groupHeaderPlacement(r, g.iconAlign, !!g.iconAlign);\n    if (g.iconAlign) {\n      elements.push(\n        ...resolveIconElems(\n          p,\n          g.icon,\n          header.icon.x,\n          header.icon.y,\n          isMono ? palette.textMuted : hue,\n          palette,\n          iconPacks,\n          warnedIcons,\n        ),\n      );\n    }\n    elements.push(\n      p.text(\n        g.label,\n        rhu(header.label.x),\n        rhu(header.label.y),\n        typography.smallFontSize,\n        groupLabelColor,\n        {\n          weight: 'bold',\n          anchor: header.label.anchor,\n        },\n      ),\n    );\n  });\n\n  // \u2500\u2500 Flat box list for orthogonalRouter obstacle detection \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes: Array<{ id: string; x: number; y: number; width: number; height: number }> = [];\n  for (const [id, pos] of positions) {\n    const sz = nodeSizes.get(id);\n    if (sz) allBoxes.push({ id, x: pos.x, y: pos.y, width: sz.width, height: sz.height });\n  }\n\n  const endpointRect = (\n    edge: ArchitectureDocument['edges'][number],\n    isSource: boolean,\n  ): Rect | undefined => {\n    const id = isSource ? edge.from : edge.to;\n    let r = rectOf(id);\n    if (!r) return undefined;\n    const useGroup = isSource ? edge.fromGroup : edge.toGroup;\n    if (useGroup) {\n      const svc = ir.services.find((s) => s.id === id);\n      if (svc?.group) {\n        const gr = computeGroupRect(svc.group);\n        if (gr) r = gr;\n      }\n    }\n    return r;\n  };\n\n  type EndpointSlot = { sourceT?: number; targetT?: number };\n  type EndpointMember = {\n    edgeIndex: number;\n    isSource: boolean;\n    tangentKey: number;\n  };\n  const endpointGroups = new Map<string, EndpointMember[]>();\n  const endpointSlots = new Map<number, EndpointSlot>();\n\n  ir.edges.forEach((e, edgeIndex) => {\n    const fromRect = endpointRect(e, true);\n    const toRect = endpointRect(e, false);\n    if (!fromRect || !toRect) return;\n\n    const fromSide = endpointSide(e, true);\n    const toSide = endpointSide(e, false);\n    const fromCenter = rectCenter(fromRect);\n    const toCenter = rectCenter(toRect);\n\n    const sourceKey = `${e.from}:${fromSide.toUpperCase()}`;\n    const targetKey = `${e.to}:${toSide.toUpperCase()}`;\n    if (!endpointGroups.has(sourceKey)) endpointGroups.set(sourceKey, []);\n    if (!endpointGroups.has(targetKey)) endpointGroups.set(targetKey, []);\n    endpointGroups\n      .get(sourceKey)!\n      .push({ edgeIndex, isSource: true, tangentKey: tangentKeyForSide(fromSide, toCenter) });\n    endpointGroups\n      .get(targetKey)!\n      .push({ edgeIndex, isSource: false, tangentKey: tangentKeyForSide(toSide, fromCenter) });\n  });\n\n  for (const members of endpointGroups.values()) {\n    members.sort(\n      (a, b) =>\n        a.tangentKey - b.tangentKey ||\n        a.edgeIndex - b.edgeIndex ||\n        Number(a.isSource) - Number(b.isSource),\n    );\n    const n = members.length;\n    for (let k = 0; k < n; k++) {\n      const member = members[k]!;\n      const t = (k + 1) / (n + 1);\n      const slot = endpointSlots.get(member.edgeIndex) ?? {};\n      endpointSlots.set(\n        member.edgeIndex,\n        member.isSource ? { ...slot, sourceT: t } : { ...slot, targetT: t },\n      );\n    }\n  }\n\n  // Align straight on-axis connections where one side is multi-fanned and the other is single\n  ir.edges.forEach((e, edgeIndex) => {\n    const fromRect = endpointRect(e, true);\n    const toRect = endpointRect(e, false);\n    if (!fromRect || !toRect) return;\n\n    const fromSide = endpointSide(e, true).toUpperCase();\n    const toSide = endpointSide(e, false).toUpperCase();\n    const fromCenter = rectCenter(fromRect);\n    const toCenter = rectCenter(toRect);\n\n    const isVerticalStraight =\n      ((fromSide === 'B' && toSide === 'T') || (fromSide === 'T' && toSide === 'B')) &&\n      Math.abs(fromCenter.x - toCenter.x) < 4;\n\n    const isHorizontalStraight =\n      ((fromSide === 'R' && toSide === 'L') || (fromSide === 'L' && toSide === 'R')) &&\n      Math.abs(fromCenter.y - toCenter.y) < 4;\n\n    if (isVerticalStraight || isHorizontalStraight) {\n      const sourceKey = `${e.from}:${fromSide}`;\n      const targetKey = `${e.to}:${toSide}`;\n      const sourceCount = endpointGroups.get(sourceKey)?.length ?? 1;\n      const targetCount = endpointGroups.get(targetKey)?.length ?? 1;\n      // Single-endpoint targets remain centered (targetT = 0.5)\n    }\n  });\n\n  // \u2500\u2500 Fan-out / fan-in lane allocation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const fanBendOffsets = new Map<number, { axis: 'x' | 'y'; offset: number }>();\n  for (const [key, members] of endpointGroups) {\n    if (members.length < 2) continue;\n    const sources = members.filter((m) => m.isSource);\n    if (sources.length < 2) continue;\n\n    const [, side] = key.split(':') as [string, string];\n    const isVertical = side === 'B' || side === 'T';\n    const N = sources.length;\n\n    // Rank members by distance to target along the tangent axis\n    const ranked = sources\n      .map((m) => {\n        const e = ir.edges[m.edgeIndex]!;\n        const fR = endpointRect(e, true);\n        const tR = endpointRect(e, false);\n        if (!fR || !tR) return { edgeIndex: m.edgeIndex, dist: 0, dir: 1 };\n        const fC = rectCenter(fR);\n        const tC = rectCenter(tR);\n        const dist = isVertical ? Math.abs(tC.x - fC.x) : Math.abs(tC.y - fC.y);\n        const dir = isVertical ? (tC.y >= fC.y ? 1 : -1) : tC.x >= fC.x ? 1 : -1;\n        return { edgeIndex: m.edgeIndex, dist, dir };\n      })\n      .sort((a, b) => b.dist - a.dist);\n\n    for (let r = 0; r < N; r++) {\n      const item = ranked[r]!;\n      const laneOffset = (r - (N - 1) / 2) * 12 * item.dir;\n      fanBendOffsets.set(item.edgeIndex, {\n        axis: isVertical ? 'y' : 'x',\n        offset: laneOffset,\n      });\n    }\n  }\n\n  for (let edgeIndex = 0; edgeIndex < ir.edges.length; edgeIndex++) {\n    const e = ir.edges[edgeIndex]!;\n    // Resolve from-port \u2014 use group boundary when fromGroup=true.\n    let fromRect = endpointRect(e, true);\n    if (!fromRect) continue;\n\n    // Resolve to-port \u2014 use group boundary when toGroup=true.\n    let toRect = endpointRect(e, false);\n    if (!toRect) continue;\n\n    const fromDir = e.exitWall ?? sideToDir(e.fromSide);\n    const toDir = e.entryWall ?? sideToDir(e.toSide);\n    const slots = endpointSlots.get(edgeIndex);\n    const pa = port(fromRect, endpointSide(e, true), slots?.sourceT);\n    const pb = port(toRect, endpointSide(e, false), slots?.targetT);\n\n    const obstacles: Rect[] = allBoxes\n      .filter((bx) => bx.id !== e.from && bx.id !== e.to)\n      .map((bx) => ({ x: bx.x, y: bx.y + yOff, width: bx.width, height: bx.height }));\n\n    const routing: RouteStyle = e.routing ?? 'orthogonal';\n    const route = createRouter(routing).route({\n      from: pa,\n      to: pb,\n      style: routing,\n      obstacles,\n      padding: 10,\n      fromDir,\n      toDir,\n    });\n    let routedPoints =\n      routing === 'orthogonal' && isHorizontalDir(fromDir) !== isHorizontalDir(toDir)\n        ? mixedOrthogonalRoutePoints(pa, pb, fromDir, toDir, obstacles, 10)\n        : route.points;\n\n    const fanOffset = fanBendOffsets.get(edgeIndex);\n    if (\n      fanOffset &&\n      routing === 'orthogonal' &&\n      route.points.length === 4 &&\n      isHorizontalDir(fromDir) === isHorizontalDir(toDir)\n    ) {\n      const p0 = route.points[0]!;\n      const p1 = { ...route.points[1]! };\n      const p2 = { ...route.points[2]! };\n      const p3 = route.points[3]!;\n      if (fanOffset.axis === 'y') {\n        const newY = p1.y + fanOffset.offset;\n        const testCandidate = [p0, { x: p1.x, y: newY }, { x: p2.x, y: newY }, p3];\n        if (countRouteCollisions(testCandidate, obstacles) === 0) {\n          p1.y = newY;\n          p2.y = newY;\n          routedPoints = [p0, p1, p2, p3];\n        }\n      } else {\n        const newX = p1.x + fanOffset.offset;\n        const testCandidate = [p0, { x: newX, y: p1.y }, { x: newX, y: p2.y }, p3];\n        if (countRouteCollisions(testCandidate, obstacles) === 0) {\n          p1.x = newX;\n          p2.x = newX;\n          routedPoints = [p0, p1, p2, p3];\n        }\n      }\n    }\n\n    const routePoints = cleanRoutePoints(routedPoints);\n    if (countRouteCollisions(routePoints, obstacles) > 0) {\n      console.warn(\n        `[routing] No clear route between ${e.from} and ${e.to}: route intersects obstacles.`,\n      );\n    }\n\n    const style = e.style ?? 'solid';\n\n    // Drive arrowhead markers from marker fields, with arrowLeft/Right fallback\n    // for older JSON IR created before Triton connector styles existed.\n    const pathOpts: Parameters<typeof p.path>[3] = {};\n    if (e.endMarker === 'arrow' || (!e.endMarker && e.arrowRight))\n      pathOpts.markerEnd = ARROW_END_ID;\n    if (e.startMarker === 'arrow' || (!e.startMarker && e.arrowLeft))\n      pathOpts.markerStart = ARROW_START_ID;\n    const dash = edgeDash(style);\n    if (dash) pathOpts.dash = dash;\n    if (e.animation && e.animation !== 'none') pathOpts.animated = e.animation;\n\n    const path =\n      style === 'wavy'\n        ? wavifyPath(routePoints, 3, 12)\n        : routing === 'bezier'\n          ? route.path\n          : routePointsToPath(routePoints, route.path);\n    elements.push(p.path(path, palette.primary, edgeStrokeWidth(style, 1.6), pathOpts));\n  }\n\n  // \u2500\u2500 Service nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.services.forEach((s, i) => {\n    const r = rectOf(s.id);\n    if (!r) return;\n    const hue = categoricalHue(i, theme);\n    elements.push(\n      p.rect(\n        { x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: rhu(r.height) },\n        palette.surface,\n        palette.border,\n        1.4,\n        { rx: 8 },\n      ),\n    );\n    elements.push(\n      p.rect({ x: rhu(r.x), y: rhu(r.y), width: rhu(r.width), height: 8 }, hue, hue, 0, { rx: 4 }),\n    );\n\n    // Icon: try iconify resolution first, fall back to built-in glyph.\n    const iconPos = iconCenter(r, s.iconAlign);\n    const iconElems = resolveIconElems(\n      p,\n      s.icon,\n      iconPos.x,\n      iconPos.y,\n      isMono ? palette.text : hue,\n      palette,\n      iconPacks,\n      warnedIcons,\n    );\n    elements.push(...iconElems);\n\n    const area = serviceLabelArea(r, s.iconAlign);\n    const info = serviceInfos.get(s.id);\n    if (info) {\n      elements.push(\n        ...renderFormattedText(\n          p,\n          info,\n          area.x,\n          area.y,\n          area.width,\n          area.height,\n          font,\n          smallFont,\n          palette.text,\n          palette.textMuted,\n          { align: area.anchor, defaultBold: true },\n        ),\n      );\n    }\n  });\n\n  // \u2500\u2500 Junction nodes (4-way crosshair dot) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ir.junctions.forEach((j) => {\n    const r = rectOf(j.id);\n    if (!r) return;\n    const cx = rhu(r.x + r.width / 2);\n    const cy = rhu(r.y + r.height / 2);\n    const R = 4; // outer crosshair half-length\n    // Central filled circle\n    elements.push(p.circle({ x: cx, y: cy }, R, palette.primary, palette.primary, 0));\n    // Four short lines extending to the sides (visual affordance for 4-way)\n    elements.push(\n      p.path(\n        `M ${rhu(cx - R)} ${cy} L ${rhu(cx + R)} ${cy} M ${cx} ${rhu(cy - R)} L ${cx} ${rhu(cy + R)}`,\n        palette.primary,\n        1.6,\n      ),\n    );\n  });\n\n  // \u2500\u2500 Compute canvas bounds \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allNodeRects: Rect[] = [\n    ...ir.services.map((s) => rectOf(s.id)).filter((r): r is Rect => !!r),\n    ...ir.junctions.map((j) => rectOf(j.id)).filter((r): r is Rect => !!r),\n  ];\n  // Also include group rects so nested group labels aren't clipped.\n  const allGroupRects: Rect[] = [...groupRectCache.values()];\n  const allRects = [...allNodeRects, ...allGroupRects];\n\n  if (allRects.length === 0) {\n    // Empty diagram \u2014 minimal canvas.\n    const scene: Scene = applyOverlays(\n      {\n        viewBox: { x: 0, y: 0, width: 200, height: 100 },\n        background: palette.background,\n        elements,\n        defs: [],\n      },\n      ir.overlays,\n      theme,\n    );\n    return { scene, anchors: {} };\n  }\n\n  const totalW = rhuInt(Math.max(...allRects.map((r) => r.x + r.width)) + margin + 26);\n  const totalH = rhuInt(Math.max(...allRects.map((r) => r.y + r.height)) + margin + 26);\n\n  // Expand viewBox upward/leftward to accommodate group boxes that extend above/left of origin.\n  const vbX = rhuInt(Math.min(0, ...allRects.map((r) => r.x)) - margin);\n  const vbY = rhuInt(Math.min(0, ...allRects.map((r) => r.y)) - margin);\n\n  const s = theme.edges?.arrowSize ?? 8;\n  const sW = s * 2;\n  const sH = rhu(sW * 0.8125);\n  const sMidY = rhu(sH / 2);\n  const sRefX = rhu(sW * 0.9);\n  const sRefXStart = rhu(sW * 0.1);\n\n  const defs = [\n    `<marker id=\"${ARROW_END_ID}\" markerUnits=\"userSpaceOnUse\" markerWidth=\"${sW}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\">` +\n      `<polygon points=\"0 0, ${sW} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n    `<marker id=\"${ARROW_START_ID}\" markerUnits=\"userSpaceOnUse\" markerWidth=\"${sW}\" markerHeight=\"${sH}\" refX=\"${sRefXStart}\" refY=\"${sMidY}\" orient=\"auto-start-reverse\">` +\n      `<polygon points=\"0 0, ${sW} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: vbX, y: vbY, width: totalW - vbX, height: totalH - vbY },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n\nfunction cleanRoutePoints(\n  points: readonly { x: number; y: number }[],\n): Array<{ x: number; y: number }> {\n  const out: Array<{ x: number; y: number }> = [];\n  for (const p of points) {\n    const prev = out[out.length - 1];\n    if (!prev || prev.x !== p.x || prev.y !== p.y) out.push(p);\n  }\n  return out;\n}\n\nfunction routePointsToPath(points: readonly { x: number; y: number }[], fallback: string): string {\n  if (points.length === 0) return fallback;\n  if (points.length === 1) return `M ${rhu(points[0]!.x)} ${rhu(points[0]!.y)}`;\n  return points.map((p, i) => `${i === 0 ? 'M' : 'L'} ${rhu(p.x)} ${rhu(p.y)}`).join(' ');\n}\n\nfunction isHorizontalDir(dir: PortDirection): boolean {\n  return dir === 'E' || dir === 'W';\n}\n\nfunction mixedOrthogonalRoutePoints(\n  from: Point,\n  to: Point,\n  fromDir: PortDirection,\n  toDir: PortDirection,\n  obstacles: readonly Rect[],\n  pad: number,\n): Point[] {\n  // Check if a direct single-bend L-route is collision-free\n  const directCorner: Point = isHorizontalDir(fromDir)\n    ? { x: to.x, y: from.y }\n    : { x: from.x, y: to.y };\n  const simpleL = [from, directCorner, to];\n  if (routeCollisionCount(simpleL, obstacles) === 0) {\n    return simpleL;\n  }\n\n  // When direct L crosses an obstacle, route via corridor bend with minimal segments\n  const stubLen = Math.max(pad, 20);\n  const stub1 = offsetPoint(from, fromDir, stubLen);\n  const stub2 = offsetPoint(to, toDir, stubLen);\n\n  if (isHorizontalDir(fromDir)) {\n    let bendX = (from.x + to.x) / 2;\n    const blockingObstacles = obstacles.filter(\n      (o) =>\n        ((fromDir === 'E' && o.x > from.x && o.x < to.x) ||\n          (fromDir === 'W' && o.x + o.width < from.x && o.x + o.width > to.x)) &&\n        from.y >= o.y - pad &&\n        from.y <= o.y + o.height + pad,\n    );\n    if (blockingObstacles.length > 0) {\n      if (fromDir === 'E') {\n        const nearest = Math.min(...blockingObstacles.map((o) => o.x));\n        bendX = (from.x + nearest) / 2;\n      } else {\n        const nearest = Math.max(...blockingObstacles.map((o) => o.x + o.width));\n        bendX = (from.x + nearest) / 2;\n      }\n    }\n\n    const candidates = [\n      (from.y + to.y) / 2,\n      (stub1.y + stub2.y) / 2,\n      ...obstacles.flatMap((o) => [\n        o.y - pad,\n        o.y + o.height + pad,\n        (o.y + to.y) / 2,\n        (o.y + o.height + to.y) / 2,\n      ]),\n    ];\n    const bendY = bestBend(\n      candidates,\n      (y) => [from, { x: bendX, y: from.y }, { x: bendX, y }, { x: to.x, y }, to],\n      obstacles,\n    );\n    const candidate = [\n      from,\n      { x: bendX, y: from.y },\n      { x: bendX, y: bendY },\n      { x: to.x, y: bendY },\n      to,\n    ];\n    return clearMixedRoute(candidate, from, to, stub1, stub2, obstacles, pad);\n  }\n\n  let bendY = (from.y + to.y) / 2;\n  const blockingObstacles = obstacles.filter(\n    (o) =>\n      ((fromDir === 'S' && o.y > from.y && o.y < to.y) ||\n        (fromDir === 'N' && o.y + o.height < from.y && o.y + o.height > to.y)) &&\n      from.x >= o.x - pad &&\n      from.x <= o.x + o.width + pad,\n  );\n  if (blockingObstacles.length > 0) {\n    if (fromDir === 'S') {\n      const nearest = Math.min(...blockingObstacles.map((o) => o.y));\n      bendY = (from.y + nearest) / 2;\n    } else {\n      const nearest = Math.max(...blockingObstacles.map((o) => o.y + o.height));\n      bendY = (from.y + nearest) / 2;\n    }\n  }\n\n  const candidates = [\n    (from.x + to.x) / 2,\n    (stub1.x + stub2.x) / 2,\n    ...obstacles.flatMap((o) => [\n      o.x - pad,\n      o.x + o.width + pad,\n      (o.x + to.x) / 2,\n      (o.x + o.width + to.x) / 2,\n    ]),\n  ];\n  const bendX = bestBend(\n    candidates,\n    (x) => [from, { x: from.x, y: bendY }, { x, y: bendY }, { x, y: to.y }, to],\n    obstacles,\n  );\n  const candidate = [\n    from,\n    { x: from.x, y: bendY },\n    { x: bendX, y: bendY },\n    { x: bendX, y: to.y },\n    to,\n  ];\n  return clearMixedRoute(candidate, from, to, stub1, stub2, obstacles, pad);\n}\n\nfunction clearMixedRoute(\n  candidate: Point[],\n  from: Point,\n  to: Point,\n  stub1: Point,\n  stub2: Point,\n  obstacles: readonly Rect[],\n  pad: number,\n): Point[] {\n  if (routeCollisionCount(candidate, obstacles) === 0) return candidate;\n  const middle = createRouter('orthogonal').route({\n    from: stub1,\n    to: stub2,\n    style: 'orthogonal',\n    obstacles,\n    padding: pad,\n  }).points;\n  const detour = [from, ...middle, to];\n  return routeCollisionCount(detour, obstacles) < routeCollisionCount(candidate, obstacles)\n    ? detour\n    : candidate;\n}\n\nfunction offsetPoint(p: Point, dir: PortDirection, amount: number): Point {\n  switch (dir) {\n    case 'W':\n      return { x: p.x - amount, y: p.y };\n    case 'E':\n      return { x: p.x + amount, y: p.y };\n    case 'N':\n      return { x: p.x, y: p.y - amount };\n    case 'S':\n      return { x: p.x, y: p.y + amount };\n  }\n}\n\nfunction bestBend(\n  candidates: readonly number[],\n  build: (v: number) => Point[],\n  obstacles: readonly Rect[],\n): number {\n  let best = candidates[0] ?? 0;\n  let bestHits = Infinity;\n  let bestLen = Infinity;\n  for (const c of [...new Set(candidates)]) {\n    const points = build(c);\n    const hits = routeCollisionCount(points, obstacles);\n    const len = routeLength(points);\n    if (hits < bestHits || (hits === bestHits && len < bestLen)) {\n      best = c;\n      bestHits = hits;\n      bestLen = len;\n    }\n  }\n  return best;\n}\n\nfunction routeCollisionCount(points: readonly Point[], obstacles: readonly Rect[]): number {\n  let count = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    for (const obs of obstacles) {\n      if (segmentCrossesRectInterior(points[i]!, points[i + 1]!, obs)) count++;\n    }\n  }\n  return count;\n}\n\nfunction routeLength(points: readonly Point[]): number {\n  let len = 0;\n  for (let i = 0; i < points.length - 1; i++) {\n    len += Math.abs(points[i + 1]!.x - points[i]!.x) + Math.abs(points[i + 1]!.y - points[i]!.y);\n  }\n  return len;\n}\n\nfunction segmentCrossesRectInterior(a: Point, b: Point, r: Rect): boolean {\n  const xMin = r.x,\n    xMax = r.x + r.width,\n    yMin = r.y,\n    yMax = r.y + r.height;\n  if (a.x === b.x) {\n    if (a.x <= xMin || a.x >= xMax) return false;\n    return Math.max(a.y, b.y) > yMin && Math.min(a.y, b.y) < yMax;\n  }\n  if (a.y === b.y) {\n    if (a.y <= yMin || a.y >= yMax) return false;\n    return Math.max(a.x, b.x) > xMin && Math.min(a.x, b.x) < xMax;\n  }\n  return false;\n}\n\n// \u2500\u2500\u2500 Icon resolution (Feature 6) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Attempt to resolve an icon token as a prefixed iconify reference (prefix:name).\n * Falls back to the built-in line-art glyph when:\n *   - the token has no colon (it's a simple glyph hint like \"server\"),\n *   - no icon pack map was provided,\n *   - parseIconRef or resolveIcon fails.\n * Emits console.warn once per unresolvable prefixed token.\n */\nfunction resolveIconElems(\n  p: ReturnType<typeof pen>,\n  icon: string,\n  cx: number,\n  cy: number,\n  hue: string,\n  palette: ResolvedTheme['palette'],\n  iconPacks: Parameters<typeof resolveIcon>[1] | undefined,\n  warnedIcons: Set<string>,\n): SceneElement[] {\n  // Only attempt iconify resolution when there is a colon separator.\n  if (icon.includes(':') && iconPacks) {\n    const ref = parseIconRef(icon);\n    if (ref.ok) {\n      const resolved = resolveIcon(ref.value, iconPacks);\n      if (resolved.ok) {\n        // Center the icon in a 24\u00D724 box at (cx, cy).\n        const size = 24;\n        return [\n          p.icon(resolved.value, rhu(cx - size / 2), rhu(cy - size / 2), size, { color: hue }),\n        ];\n      }\n    }\n    // Resolution failed \u2014 warn once.\n    if (!warnedIcons.has(icon)) {\n      warnedIcons.add(icon);\n      console.warn(`[architecture] icon \"${icon}\" could not be resolved \u2014 falling back to glyph.`);\n    }\n  } else if (icon.includes(':') && !iconPacks) {\n    // Prefixed token but no packs loaded \u2014 warn once.\n    if (!warnedIcons.has(icon)) {\n      warnedIcons.add(icon);\n      console.warn(\n        `[architecture] icon \"${icon}\" is an iconify token but no icon packs were loaded.`,\n      );\n    }\n  }\n\n  // Built-in line-art glyph fallback.\n  return iconGlyph(p, icon, cx, cy, hue, palette);\n}\n\n// \u2500\u2500\u2500 Built-in line-art glyphs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** A small line glyph for a service icon name (server/database/cloud/internet/disk). */\nfunction iconGlyph(\n  p: ReturnType<typeof pen>,\n  icon: string,\n  cx: number,\n  cy: number,\n  hue: string,\n  palette: ResolvedTheme['palette'],\n): SceneElement[] {\n  const name = icon.toLowerCase();\n  const out: SceneElement[] = [];\n  const stroke = hue;\n  if (name.includes('server') || name.includes('compute')) {\n    for (let i = 0; i < 3; i++)\n      out.push(\n        p.rect(\n          { x: rhu(cx - 10), y: rhu(cy - 9 + i * 7), width: 20, height: 5 },\n          palette.surface,\n          stroke,\n          1.3,\n          { rx: 1 },\n        ),\n      );\n  } else if (\n    name.includes('database') ||\n    name.includes('db') ||\n    name.includes('datastore') ||\n    name.includes('storage') ||\n    name.includes('disk')\n  ) {\n    out.push(\n      p.rect(\n        { x: rhu(cx - 9), y: rhu(cy - 9), width: 18, height: 18 },\n        palette.surface,\n        stroke,\n        1.3,\n        { rx: 5 },\n      ),\n    );\n    out.push(\n      p.path(\n        `M ${rhu(cx - 9)} ${rhu(cy - 3)} Q ${rhu(cx)} ${rhu(cy + 1)}, ${rhu(cx + 9)} ${rhu(cy - 3)}`,\n        stroke,\n        1.3,\n      ),\n    );\n  } else if (name.includes('cloud')) {\n    out.push(p.circle({ x: rhu(cx - 6), y: rhu(cy + 2) }, 6, palette.surface, stroke, 1.3));\n    out.push(p.circle({ x: rhu(cx + 6), y: rhu(cy + 2) }, 6, palette.surface, stroke, 1.3));\n    out.push(p.circle({ x: rhu(cx), y: rhu(cy - 3) }, 7, palette.surface, stroke, 1.3));\n    out.push(\n      p.rect(\n        { x: rhu(cx - 10), y: rhu(cy + 2), width: 20, height: 6 },\n        palette.surface,\n        palette.surface,\n        0,\n      ),\n    );\n  } else if (\n    name.includes('internet') ||\n    name.includes('globe') ||\n    name.includes('web') ||\n    name.includes('client')\n  ) {\n    out.push(p.circle({ x: rhu(cx), y: rhu(cy) }, 9, palette.surface, stroke, 1.3));\n    out.push(\n      p.path(\n        `M ${rhu(cx)} ${rhu(cy - 9)} L ${rhu(cx)} ${rhu(cy + 9)} M ${rhu(cx - 9)} ${rhu(cy)} L ${rhu(cx + 9)} ${rhu(cy)}`,\n        stroke,\n        1,\n      ),\n    );\n    out.push(\n      p.path(\n        `M ${rhu(cx - 9)} ${rhu(cy)} Q ${rhu(cx)} ${rhu(cy - 11)}, ${rhu(cx + 9)} ${rhu(cy)} Q ${rhu(cx)} ${rhu(cy + 11)}, ${rhu(cx - 9)} ${rhu(cy)}`,\n        stroke,\n        1,\n      ),\n    );\n  } else {\n    out.push(\n      p.rect(\n        { x: rhu(cx - 9), y: rhu(cy - 9), width: 18, height: 18 },\n        palette.surface,\n        stroke,\n        1.3,\n        { rx: 4 },\n      ),\n    );\n  }\n  return out;\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  import { CONNECTOR_ANIMATIONS } from '../../../contracts/animations.js';\n\n  const ANIMATION_SET = new Set([...CONNECTOR_ANIMATIONS, 'none']);\n  const ROUTE_STYLE_SET = new Set(['straight', 'orthogonal', 'bezier', 'polyline']);\n  const ICON_ALIGN_SET = new Set(['N', 'S', 'E', 'W', 'NE', 'NW', 'SE', 'SW', 'C']);\n\n  const CONNECTOR_TOKEN_MAP = {\n    '<-->':  { direction: 'bidirectional', style: 'solid',  startMarker: 'arrow', endMarker: 'arrow' },\n    '<-.->': { direction: 'bidirectional', style: 'dotted', startMarker: 'arrow', endMarker: 'arrow' },\n    '<==>':  { direction: 'bidirectional', style: 'thick',  startMarker: 'arrow', endMarker: 'arrow' },\n    '<-_->': { direction: 'bidirectional', style: 'dashed', startMarker: 'arrow', endMarker: 'arrow' },\n    '<-~->': { direction: 'bidirectional', style: 'wavy',   startMarker: 'arrow', endMarker: 'arrow' },\n\n    '-->':   { direction: 'directed', style: 'solid',  startMarker: 'none', endMarker: 'arrow' },\n    '-.->':  { direction: 'directed', style: 'dotted', startMarker: 'none', endMarker: 'arrow' },\n    '==>':   { direction: 'directed', style: 'thick',  startMarker: 'none', endMarker: 'arrow' },\n    '-_->':  { direction: 'directed', style: 'dashed', startMarker: 'none', endMarker: 'arrow' },\n    '-~->':  { direction: 'directed', style: 'wavy',   startMarker: 'none', endMarker: 'arrow' },\n\n    '---':   { direction: 'undirected', style: 'solid',  startMarker: 'none', endMarker: 'none' },\n    '-.-':   { direction: 'undirected', style: 'dotted', startMarker: 'none', endMarker: 'none' },\n    '===':   { direction: 'undirected', style: 'thick',  startMarker: 'none', endMarker: 'none' },\n    '-_-':   { direction: 'undirected', style: 'dashed', startMarker: 'none', endMarker: 'none' },\n    '-~-':   { direction: 'undirected', style: 'wavy',   startMarker: 'none', endMarker: 'none' },\n  };\n\n  function edgeFromConnectorToken(token) {\n    const desc = CONNECTOR_TOKEN_MAP[token];\n    return {\n      left: desc.startMarker === 'arrow',\n      right: desc.endMarker === 'arrow',\n      style: desc.style,\n      startMarker: desc.startMarker,\n      endMarker: desc.endMarker,\n    };\n  }\n\n  function assertAnim(value) {\n    if (!ANIMATION_SET.has(value)) {\n      throw new Error(`Invalid connector animation \"${value}\"`);\n    }\n    return value;\n  }\n\n  function assertRouteStyle(value) {\n    if (!ROUTE_STYLE_SET.has(value)) {\n      throw new Error(`Invalid connector route style \"${value}\"`);\n    }\n    return value;\n  }\n\n  function assertIconAlign(value) {\n    const upper = String(value).toUpperCase();\n    if (!ICON_ALIGN_SET.has(upper)) {\n      throw new Error(`Invalid icon alignment \"${value}\"`);\n    }\n    return upper;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"architecture-beta\";\n  var peg$c1 = \"---\";\n  var peg$c2 = \"group\";\n  var peg$c3 = \"(\";\n  var peg$c4 = \")\";\n  var peg$c5 = \"[\";\n  var peg$c6 = \"]\";\n  var peg$c7 = \"in\";\n  var peg$c8 = \"service\";\n  var peg$c9 = \"junction\";\n  var peg$c10 = \":\";\n  var peg$c11 = \"{group}\";\n  var peg$c12 = \"<-~->\";\n  var peg$c13 = \"<-_->\";\n  var peg$c14 = \"<-.->\";\n  var peg$c15 = \"<==>\";\n  var peg$c16 = \"<-->\";\n  var peg$c17 = \"-~->\";\n  var peg$c18 = \"-_->\";\n  var peg$c19 = \"-.->\";\n  var peg$c20 = \"==>\";\n  var peg$c21 = \"-->\";\n  var peg$c22 = \"<--\";\n  var peg$c23 = \"-~-\";\n  var peg$c24 = \"-_-\";\n  var peg$c25 = \"-.-\";\n  var peg$c26 = \"===\";\n  var peg$c27 = \"--\";\n  var peg$c28 = \"@\";\n  var peg$c29 = \"anim:\";\n  var peg$c30 = \"route:\";\n  var peg$c31 = \"orthogonal\";\n  var peg$c32 = \"bezier\";\n  var peg$c33 = \"straight\";\n  var peg$c34 = \"polyline\";\n  var peg$c35 = \"{\";\n  var peg$c36 = \",\";\n  var peg$c37 = \"}\";\n  var peg$c38 = \"iconalign:\";\n  var peg$c39 = \"align\";\n  var peg$c40 = \"row\";\n  var peg$c41 = \"column\";\n  var peg$c42 = \"\\r\";\n  var peg$c43 = \"\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[ \\t]/;\n  var peg$r2 = /^[^)\\n]/;\n  var peg$r3 = /^[^\\]\\n]/;\n  var peg$r4 = /^[A-Za-z0-9_]/;\n  var peg$r5 = /^[ENSW]/;\n  var peg$r6 = /^[LRTBlrtb]/;\n\n  var peg$e0 = peg$literalExpectation(\"architecture-beta\", true);\n  var peg$e1 = peg$literalExpectation(\"---\", false);\n  var peg$e2 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e3 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e4 = peg$literalExpectation(\"group\", true);\n  var peg$e5 = peg$literalExpectation(\"(\", false);\n  var peg$e6 = peg$classExpectation([\")\", \"\\n\"], true, false);\n  var peg$e7 = peg$literalExpectation(\")\", false);\n  var peg$e8 = peg$literalExpectation(\"[\", false);\n  var peg$e9 = peg$classExpectation([\"]\", \"\\n\"], true, false);\n  var peg$e10 = peg$literalExpectation(\"]\", false);\n  var peg$e11 = peg$literalExpectation(\"in\", true);\n  var peg$e12 = peg$literalExpectation(\"service\", true);\n  var peg$e13 = peg$literalExpectation(\"junction\", true);\n  var peg$e14 = peg$literalExpectation(\":\", false);\n  var peg$e15 = peg$literalExpectation(\"{group}\", false);\n  var peg$e16 = peg$literalExpectation(\"<-~->\", false);\n  var peg$e17 = peg$literalExpectation(\"<-_->\", false);\n  var peg$e18 = peg$literalExpectation(\"<-.->\", false);\n  var peg$e19 = peg$literalExpectation(\"<==>\", false);\n  var peg$e20 = peg$literalExpectation(\"<-->\", false);\n  var peg$e21 = peg$literalExpectation(\"-~->\", false);\n  var peg$e22 = peg$literalExpectation(\"-_->\", false);\n  var peg$e23 = peg$literalExpectation(\"-.->\", false);\n  var peg$e24 = peg$literalExpectation(\"==>\", false);\n  var peg$e25 = peg$literalExpectation(\"-->\", false);\n  var peg$e26 = peg$literalExpectation(\"<--\", false);\n  var peg$e27 = peg$literalExpectation(\"-~-\", false);\n  var peg$e28 = peg$literalExpectation(\"-_-\", false);\n  var peg$e29 = peg$literalExpectation(\"-.-\", false);\n  var peg$e30 = peg$literalExpectation(\"===\", false);\n  var peg$e31 = peg$literalExpectation(\"--\", false);\n  var peg$e32 = peg$literalExpectation(\"@\", false);\n  var peg$e33 = peg$literalExpectation(\"anim:\", false);\n  var peg$e34 = peg$literalExpectation(\"route:\", false);\n  var peg$e35 = peg$literalExpectation(\"orthogonal\", false);\n  var peg$e36 = peg$literalExpectation(\"bezier\", false);\n  var peg$e37 = peg$literalExpectation(\"straight\", false);\n  var peg$e38 = peg$literalExpectation(\"polyline\", false);\n  var peg$e39 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\"], false, false);\n  var peg$e40 = peg$classExpectation([\"E\", \"N\", \"S\", \"W\"], false, false);\n  var peg$e41 = peg$literalExpectation(\"{\", false);\n  var peg$e42 = peg$literalExpectation(\",\", false);\n  var peg$e43 = peg$literalExpectation(\"}\", false);\n  var peg$e44 = peg$literalExpectation(\"iconalign:\", false);\n  var peg$e45 = peg$literalExpectation(\"align\", true);\n  var peg$e46 = peg$literalExpectation(\"row\", true);\n  var peg$e47 = peg$literalExpectation(\"column\", true);\n  var peg$e48 = peg$classExpectation([\"L\", \"R\", \"T\", \"B\", \"l\", \"r\", \"t\", \"b\"], false, false);\n  var peg$e49 = peg$literalExpectation(\"\\r\", false);\n  var peg$e50 = peg$literalExpectation(\"\\n\", false);\n  var peg$e51 = peg$anyExpectation();\n\n  var peg$f0 = function(fm, lines) {\n      const groups = [];\n      const services = [];\n      const junctions = [];\n      const edges = [];\n      const aligns = [];\n      let curGroup, curIndent = -1;\n      for (const l of lines.filter(Boolean)) {\n        if (l.t === 'group') {\n          groups.push({ id: l.id, label: l.label, icon: l.icon, ...(l.inGroup ? { parent: l.inGroup } : {}), ...(l.iconAlign !== undefined ? { iconAlign: l.iconAlign } : {}) });\n          curGroup = l.id; curIndent = l.indent;\n        } else if (l.t === 'service') {\n          const group = l.inGroup || (l.indent > curIndent && curGroup ? curGroup : undefined);\n          services.push({ id: l.id, label: l.label, icon: l.icon, ...(group ? { group } : {}), ...(l.iconAlign !== undefined ? { iconAlign: l.iconAlign } : {}) });\n        } else if (l.t === 'junction') {\n          const group = l.inGroup || (l.indent > curIndent && curGroup ? curGroup : undefined);\n          junctions.push({ id: l.id, ...(group ? { group } : {}) });\n        } else if (l.t === 'edge') {\n          edges.push({ from: l.from, fromSide: l.fromSide, fromGroup: l.fromGroup, to: l.to, toSide: l.toSide, toGroup: l.toGroup, arrowLeft: l.arrowLeft, arrowRight: l.arrowRight, style: l.style, startMarker: l.startMarker, endMarker: l.endMarker, ...(l.animation !== undefined ? { animation: l.animation } : {}), ...(l.routing !== undefined ? { routing: l.routing } : {}), ...(l.exitWall !== undefined ? { exitWall: l.exitWall } : {}), ...(l.entryWall !== undefined ? { entryWall: l.entryWall } : {}) });\n        } else if (l.t === 'align') {\n          aligns.push({ axis: l.axis, members: l.members });\n        }\n      }\n      return { version: '1.0', metadata: { ...(fm || {}) }, groups, services, junctions, edges, aligns };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(ind, id, icon, label, g) { return g; };\n  var peg$f4 = function(ind, id, icon, label, inG, tail) {\n      return { t: 'group', indent: ind.length, id, icon: icon.trim(), label: label.trim(), inGroup: inG || undefined, ...(tail.iconAlign !== undefined ? { iconAlign: tail.iconAlign } : {}) };\n    };\n  var peg$f5 = function(ind, id, icon, label, g) { return g; };\n  var peg$f6 = function(ind, id, icon, label, inG, tail) {\n      return { t: 'service', indent: ind.length, id, icon: icon.trim(), label: label.trim(), inGroup: inG || undefined, ...(tail.iconAlign !== undefined ? { iconAlign: tail.iconAlign } : {}) };\n    };\n  var peg$f7 = function(ind, id, g) { return g; };\n  var peg$f8 = function(ind, id, inG) {\n      return { t: 'junction', indent: ind.length, id, inGroup: inG || undefined };\n    };\n  var peg$f9 = function(fromEp, fromSide, arrow, toSide, toEp, tail) {\n      const extra = tail || {};\n      return {\n        t: 'edge',\n        from: fromEp.id, fromSide, fromGroup: fromEp.grp,\n        to: toEp.id, toSide, toGroup: toEp.grp,\n        arrowLeft: arrow.left, arrowRight: arrow.right,\n        style: arrow.style,\n        startMarker: arrow.startMarker,\n        endMarker: arrow.endMarker,\n        ...(extra.animation !== undefined ? { animation: extra.animation } : {}),\n        ...(extra.routing !== undefined ? { routing: extra.routing } : {}),\n        ...(extra.exitWall !== undefined ? { exitWall: extra.exitWall } : {}),\n        ...(extra.entryWall !== undefined ? { entryWall: extra.entryWall } : {}),\n      };\n    };\n  var peg$f10 = function(id) { return true; };\n  var peg$f11 = function(id, grp) { return { id, grp: grp === true }; };\n  var peg$f12 = function(token) {\n      if (token === \"<--\") return { left: true, right: false, style: 'solid', startMarker: 'arrow', endMarker: 'none' };\n      if (token === \"--\")  return { left: false, right: false, style: 'solid', startMarker: 'none', endMarker: 'none' };\n      return edgeFromConnectorToken(token);\n    };\n  var peg$f13 = function(anns, block, rest) {\n      if (/@(?:anim|route|orthogonal|bezier|straight|polyline):/.test(rest)) {\n        throw new Error('Invalid connector annotation');\n      }\n      const result = {};\n      if (block) {\n        const b = block[1];\n        if (b.anim !== undefined) result.animation = assertAnim(b.anim);\n        if (b.route !== undefined) result.routing = assertRouteStyle(b.route);\n      }\n      for (const ann of anns) {\n        Object.assign(result, ann[2]);\n      }\n      return result;\n    };\n  var peg$f14 = function(value) { return { animation: value }; };\n  var peg$f15 = function(value) { return { routing: value }; };\n  var peg$f16 = function(style, walls) { return { routing: style, ...walls }; };\n  var peg$f17 = function(value) { return assertAnim(value); };\n  var peg$f18 = function(value) { return assertRouteStyle(value); };\n  var peg$f19 = function() { return 'orthogonal'; };\n  var peg$f20 = function() { return 'bezier'; };\n  var peg$f21 = function() { return 'straight'; };\n  var peg$f22 = function() { return 'polyline'; };\n  var peg$f23 = function(exit, entry) { return { exitWall: exit, entryWall: entry }; };\n  var peg$f24 = function(exit) { return { exitWall: exit }; };\n  var peg$f25 = function(w) { return w; };\n  var peg$f26 = function(first, rest) {\n      const result = {};\n      result[first.key] = first.value;\n      for (const r of rest) { result[r[3].key] = r[3].value; }\n      return result;\n    };\n  var peg$f27 = function(key, value) { return { key, value }; };\n  var peg$f28 = function(value) { return value; };\n  var peg$f29 = function(anns, block, rest) {\n      if (/@iconalign:/.test(rest)) {\n        throw new Error('Invalid icon alignment annotation');\n      }\n      const result = {};\n      if (block) {\n        const b = block[1];\n        if (b.iconalign !== undefined) result.iconAlign = assertIconAlign(b.iconalign);\n      }\n      for (const ann of anns) {\n        Object.assign(result, ann[2]);\n      }\n      return result;\n    };\n  var peg$f30 = function(value) { return { iconAlign: value }; };\n  var peg$f31 = function(value) { return assertIconAlign(value); };\n  var peg$f32 = function(axis, head, id) { return id; };\n  var peg$f33 = function(axis, head, tail) {\n      return { t: 'align', axis: axis.toLowerCase(), members: [head, ...tail] };\n    };\n  var peg$f34 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    s3 = input.substr(peg$currPos, 17);\n    if (s3.toLowerCase() === peg$c0) {\n      peg$currPos += 17;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseLineEnd();\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$parseLine();\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$parseLine();\n        }\n        s6 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c1) {\n      s1 = peg$c1;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s7 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c1) {\n            s7 = peg$c1;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e2); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e2); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c1) {\n          s4 = peg$c1;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLine() {\n    var s0;\n\n    s0 = peg$parseGroupLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseServiceLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseJunctionLine();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseAlignLine();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseEdgeLine();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseBlankLine();\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseGroupLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r1.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c2) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 40) {\n            s5 = peg$c3;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r2.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r2.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e6); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            if (input.charCodeAt(peg$currPos) === 41) {\n              s7 = peg$c4;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s7 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 91) {\n                s8 = peg$c5;\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$currPos;\n                s10 = [];\n                s11 = input.charAt(peg$currPos);\n                if (peg$r3.test(s11)) {\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e9); }\n                }\n                while (s11 !== peg$FAILED) {\n                  s10.push(s11);\n                  s11 = input.charAt(peg$currPos);\n                  if (peg$r3.test(s11)) {\n                    peg$currPos++;\n                  } else {\n                    s11 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e9); }\n                  }\n                }\n                s9 = input.substring(s9, peg$currPos);\n                if (input.charCodeAt(peg$currPos) === 93) {\n                  s10 = peg$c6;\n                  peg$currPos++;\n                } else {\n                  s10 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e10); }\n                }\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$currPos;\n                  s12 = peg$parse__();\n                  if (s12 !== peg$FAILED) {\n                    s13 = input.substr(peg$currPos, 2);\n                    if (s13.toLowerCase() === peg$c7) {\n                      peg$currPos += 2;\n                    } else {\n                      s13 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n                    }\n                    if (s13 !== peg$FAILED) {\n                      s14 = peg$parse__();\n                      if (s14 !== peg$FAILED) {\n                        s15 = peg$parseIdent();\n                        if (s15 !== peg$FAILED) {\n                          peg$savedPos = s11;\n                          s11 = peg$f3(s1, s4, s6, s9, s15);\n                        } else {\n                          peg$currPos = s11;\n                          s11 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s11;\n                        s11 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s11;\n                      s11 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s11;\n                    s11 = peg$FAILED;\n                  }\n                  if (s11 === peg$FAILED) {\n                    s11 = null;\n                  }\n                  s12 = peg$parseNodeTail();\n                  s13 = peg$parseLineEnd();\n                  if (s13 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f4(s1, s4, s6, s9, s11, s12);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseServiceLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r1.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    s2 = input.substr(peg$currPos, 7);\n    if (s2.toLowerCase() === peg$c8) {\n      peg$currPos += 7;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 40) {\n            s5 = peg$c3;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e5); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r2.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e6); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r2.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e6); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            if (input.charCodeAt(peg$currPos) === 41) {\n              s7 = peg$c4;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            if (s7 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 91) {\n                s8 = peg$c5;\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$currPos;\n                s10 = [];\n                s11 = input.charAt(peg$currPos);\n                if (peg$r3.test(s11)) {\n                  peg$currPos++;\n                } else {\n                  s11 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e9); }\n                }\n                while (s11 !== peg$FAILED) {\n                  s10.push(s11);\n                  s11 = input.charAt(peg$currPos);\n                  if (peg$r3.test(s11)) {\n                    peg$currPos++;\n                  } else {\n                    s11 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e9); }\n                  }\n                }\n                s9 = input.substring(s9, peg$currPos);\n                if (input.charCodeAt(peg$currPos) === 93) {\n                  s10 = peg$c6;\n                  peg$currPos++;\n                } else {\n                  s10 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e10); }\n                }\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$currPos;\n                  s12 = peg$parse__();\n                  if (s12 !== peg$FAILED) {\n                    s13 = input.substr(peg$currPos, 2);\n                    if (s13.toLowerCase() === peg$c7) {\n                      peg$currPos += 2;\n                    } else {\n                      s13 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n                    }\n                    if (s13 !== peg$FAILED) {\n                      s14 = peg$parse__();\n                      if (s14 !== peg$FAILED) {\n                        s15 = peg$parseIdent();\n                        if (s15 !== peg$FAILED) {\n                          peg$savedPos = s11;\n                          s11 = peg$f5(s1, s4, s6, s9, s15);\n                        } else {\n                          peg$currPos = s11;\n                          s11 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s11;\n                        s11 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s11;\n                      s11 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s11;\n                    s11 = peg$FAILED;\n                  }\n                  if (s11 === peg$FAILED) {\n                    s11 = null;\n                  }\n                  s12 = peg$parseNodeTail();\n                  s13 = peg$parseLineEnd();\n                  if (s13 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f6(s1, s4, s6, s9, s11, s12);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseJunctionLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r1.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r1.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    s2 = input.substr(peg$currPos, 8);\n    if (s2.toLowerCase() === peg$c9) {\n      peg$currPos += 8;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseIdent();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          s6 = peg$parse__();\n          if (s6 !== peg$FAILED) {\n            s7 = input.substr(peg$currPos, 2);\n            if (s7.toLowerCase() === peg$c7) {\n              peg$currPos += 2;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e11); }\n            }\n            if (s7 !== peg$FAILED) {\n              s8 = peg$parse__();\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parseIdent();\n                if (s9 !== peg$FAILED) {\n                  peg$savedPos = s5;\n                  s5 = peg$f7(s1, s4, s9);\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 === peg$FAILED) {\n            s5 = null;\n          }\n          s6 = peg$parseRestIgnore();\n          s7 = peg$parseLineEnd();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f8(s1, s4, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseEdgeEndpoint();\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c10;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseSide();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse_();\n          s6 = peg$parseConnectorArrow();\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parse_();\n            s8 = peg$parseSide();\n            if (s8 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s9 = peg$c10;\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e14); }\n              }\n              if (s9 !== peg$FAILED) {\n                s10 = peg$parseEdgeEndpoint();\n                if (s10 !== peg$FAILED) {\n                  s11 = peg$parseEdgeTail();\n                  s12 = peg$parseLineEnd();\n                  if (s12 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f9(s2, s4, s6, s8, s10, s11);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeEndpoint() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.substr(peg$currPos, 7) === peg$c11) {\n        s3 = peg$c11;\n        peg$currPos += 7;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s2;\n        s3 = peg$f10(s1);\n      }\n      s2 = s3;\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f11(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseConnectorArrow() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c12) {\n      s1 = peg$c12;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s1 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c13) {\n        s1 = peg$c13;\n        peg$currPos += 5;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n      if (s1 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c14) {\n          s1 = peg$c14;\n          peg$currPos += 5;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n        if (s1 === peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c15) {\n            s1 = peg$c15;\n            peg$currPos += 4;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e19); }\n          }\n          if (s1 === peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c16) {\n              s1 = peg$c16;\n              peg$currPos += 4;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e20); }\n            }\n            if (s1 === peg$FAILED) {\n              if (input.substr(peg$currPos, 4) === peg$c17) {\n                s1 = peg$c17;\n                peg$currPos += 4;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e21); }\n              }\n              if (s1 === peg$FAILED) {\n                if (input.substr(peg$currPos, 4) === peg$c18) {\n                  s1 = peg$c18;\n                  peg$currPos += 4;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e22); }\n                }\n                if (s1 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 4) === peg$c19) {\n                    s1 = peg$c19;\n                    peg$currPos += 4;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e23); }\n                  }\n                  if (s1 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 3) === peg$c20) {\n                      s1 = peg$c20;\n                      peg$currPos += 3;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n                    }\n                    if (s1 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 3) === peg$c21) {\n                        s1 = peg$c21;\n                        peg$currPos += 3;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n                      }\n                      if (s1 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 3) === peg$c22) {\n                          s1 = peg$c22;\n                          peg$currPos += 3;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n                        }\n                        if (s1 === peg$FAILED) {\n                          if (input.substr(peg$currPos, 3) === peg$c23) {\n                            s1 = peg$c23;\n                            peg$currPos += 3;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e27); }\n                          }\n                          if (s1 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 3) === peg$c24) {\n                              s1 = peg$c24;\n                              peg$currPos += 3;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e28); }\n                            }\n                            if (s1 === peg$FAILED) {\n                              if (input.substr(peg$currPos, 3) === peg$c25) {\n                                s1 = peg$c25;\n                                peg$currPos += 3;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e29); }\n                              }\n                              if (s1 === peg$FAILED) {\n                                if (input.substr(peg$currPos, 3) === peg$c26) {\n                                  s1 = peg$c26;\n                                  peg$currPos += 3;\n                                } else {\n                                  s1 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e30); }\n                                }\n                                if (s1 === peg$FAILED) {\n                                  if (input.substr(peg$currPos, 3) === peg$c1) {\n                                    s1 = peg$c1;\n                                    peg$currPos += 3;\n                                  } else {\n                                    s1 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e1); }\n                                  }\n                                  if (s1 === peg$FAILED) {\n                                    if (input.substr(peg$currPos, 2) === peg$c27) {\n                                      s1 = peg$c27;\n                                      peg$currPos += 2;\n                                    } else {\n                                      s1 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f12(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseEdgeTail() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$currPos;\n    s3 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 64) {\n      s4 = peg$c28;\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$parseAnnotation();\n      if (s5 !== peg$FAILED) {\n        s3 = [s3, s4, s5];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 64) {\n        s4 = peg$c28;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseAnnotation();\n        if (s5 !== peg$FAILED) {\n          s3 = [s3, s4, s5];\n          s2 = s3;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    }\n    s2 = peg$currPos;\n    s3 = peg$parse_();\n    s4 = peg$parsePropBlock();\n    if (s4 !== peg$FAILED) {\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$currPos;\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r0.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    while (s5 !== peg$FAILED) {\n      s4.push(s5);\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n    }\n    s3 = input.substring(s3, peg$currPos);\n    peg$savedPos = s0;\n    s0 = peg$f13(s1, s2, s3);\n\n    return s0;\n  }\n\n  function peg$parseAnnotation() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c29) {\n      s1 = peg$c29;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e33); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseAnimValue();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f14(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 6) === peg$c30) {\n        s1 = peg$c30;\n        peg$currPos += 6;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e34); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseRouteStyleValue();\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f15(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseWallRouteStyle();\n        if (s1 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s2 = peg$c10;\n            peg$currPos++;\n          } else {\n            s2 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e14); }\n          }\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parseWallPair();\n            if (s3 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f16(s1, s3);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnimValue() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f17(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRouteStyleValue() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f18(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseWallRouteStyle() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 10) === peg$c31) {\n      s1 = peg$c31;\n      peg$currPos += 10;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e35); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f19();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 6) === peg$c32) {\n        s1 = peg$c32;\n        peg$currPos += 6;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e36); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f20();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 8) === peg$c33) {\n          s1 = peg$c33;\n          peg$currPos += 8;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e37); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f21();\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 8) === peg$c34) {\n            s1 = peg$c34;\n            peg$currPos += 8;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e38); }\n          }\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f22();\n          }\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWallPair() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parseWall();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseWall();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f23(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseWall();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        peg$silentFails++;\n        s3 = input.charAt(peg$currPos);\n        if (peg$r4.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n        peg$silentFails--;\n        if (s3 === peg$FAILED) {\n          s2 = undefined;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f24(s1);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWall() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = input.charAt(peg$currPos);\n    if (peg$r5.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e40); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f25(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parsePropBlock() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 123) {\n      s1 = peg$c35;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parsePropEntry();\n      if (s3 !== peg$FAILED) {\n        s4 = [];\n        s5 = peg$currPos;\n        s6 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s7 = peg$c36;\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e42); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parsePropEntry();\n          if (s9 !== peg$FAILED) {\n            s6 = [s6, s7, s8, s9];\n            s5 = s6;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$currPos;\n          s6 = peg$parse_();\n          if (input.charCodeAt(peg$currPos) === 44) {\n            s7 = peg$c36;\n            peg$currPos++;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e42); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parse_();\n            s9 = peg$parsePropEntry();\n            if (s9 !== peg$FAILED) {\n              s6 = [s6, s7, s8, s9];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        }\n        s5 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 125) {\n          s6 = peg$c37;\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e43); }\n        }\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f26(s3, s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropEntry() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s3 = peg$c10;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parse_();\n        s5 = peg$parsePropValue();\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f27(s1, s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropValue() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f28(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNodeTail() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$currPos;\n    s3 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 64) {\n      s4 = peg$c28;\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s4 !== peg$FAILED) {\n      s5 = peg$parseNodeAnnotation();\n      if (s5 !== peg$FAILED) {\n        s3 = [s3, s4, s5];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 64) {\n        s4 = peg$c28;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseNodeAnnotation();\n        if (s5 !== peg$FAILED) {\n          s3 = [s3, s4, s5];\n          s2 = s3;\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    }\n    s2 = peg$currPos;\n    s3 = peg$parse_();\n    s4 = peg$parsePropBlock();\n    if (s4 !== peg$FAILED) {\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$currPos;\n    s4 = [];\n    s5 = input.charAt(peg$currPos);\n    if (peg$r0.test(s5)) {\n      peg$currPos++;\n    } else {\n      s5 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    while (s5 !== peg$FAILED) {\n      s4.push(s5);\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n    }\n    s3 = input.substring(s3, peg$currPos);\n    peg$savedPos = s0;\n    s0 = peg$f29(s1, s2, s3);\n\n    return s0;\n  }\n\n  function peg$parseNodeAnnotation() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 10) === peg$c38) {\n      s1 = peg$c38;\n      peg$currPos += 10;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e44); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseIconAlignValue();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f30(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseIconAlignValue() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIdent();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f31(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseAlignLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c39) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e45); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = input.substr(peg$currPos, 3);\n        if (s4.toLowerCase() === peg$c40) {\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e46); }\n        }\n        if (s4 === peg$FAILED) {\n          s4 = input.substr(peg$currPos, 6);\n          if (s4.toLowerCase() === peg$c41) {\n            peg$currPos += 6;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e47); }\n          }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parse__();\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parseIdent();\n            if (s6 !== peg$FAILED) {\n              s7 = [];\n              s8 = peg$currPos;\n              s9 = peg$parse__();\n              if (s9 !== peg$FAILED) {\n                s10 = peg$parseIdent();\n                if (s10 !== peg$FAILED) {\n                  peg$savedPos = s8;\n                  s8 = peg$f32(s4, s6, s10);\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                while (s8 !== peg$FAILED) {\n                  s7.push(s8);\n                  s8 = peg$currPos;\n                  s9 = peg$parse__();\n                  if (s9 !== peg$FAILED) {\n                    s10 = peg$parseIdent();\n                    if (s10 !== peg$FAILED) {\n                      peg$savedPos = s8;\n                      s8 = peg$f32(s4, s6, s10);\n                    } else {\n                      peg$currPos = s8;\n                      s8 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s8;\n                    s8 = peg$FAILED;\n                  }\n                }\n              } else {\n                s7 = peg$FAILED;\n              }\n              if (s7 !== peg$FAILED) {\n                s8 = peg$parseRestIgnore();\n                s9 = peg$parseLineEnd();\n                if (s9 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f33(s4, s6, s7);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSide() {\n    var s0;\n\n    s0 = input.charAt(peg$currPos);\n    if (peg$r6.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e48); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRestIgnore() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = input.charAt(peg$currPos);\n      if (peg$r0.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n    }\n    s0 = input.substring(s0, peg$currPos);\n\n    return s0;\n  }\n\n  function peg$parseIdent() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r4.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r4.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e39); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c42;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e49); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c43;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e50); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c42;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e49); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c43;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e50); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f34();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c42;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e49); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c43;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e50); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e51); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r1.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r1.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r1.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r1.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e3); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult, LayoutOptions } from '../../../contracts/index.js';\nimport type { ArchitectureDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutArchitecture } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type {\n  ArchitectureDocument,\n  ArchService,\n  ArchGroup,\n  ArchJunction,\n  ArchEdge,\n  ArchAlign,\n} from './ir.js';\n\nexport const architecture: DiagramModule<ArchitectureDocument> = {\n  parseMermaid(input: string): ArchitectureDocument {\n    return parser.parse(input) as ArchitectureDocument;\n  },\n\n  parseYaml(input: string): ArchitectureDocument {\n    return JSON.parse(input) as ArchitectureDocument;\n  },\n\n  layout(ir: ArchitectureDocument, theme: ResolvedTheme, options?: LayoutOptions): LayoutResult {\n    return layoutArchitecture(ir, theme, options);\n  },\n};\n", "/**\n * @file diagrams/packet/layout.ts \u2014 Network packet / bit-field diagram.\n *\n * Bits lay out in rows of 32; each field spans its bit range (split across rows\n * when needed) as a labeled cell. Start/end bit numbers sit above row edges.\n * Field fills are theme-derived tints (a semantic token mixed toward the\n * background); labels pick the most readable neutral token via readableText.\n */\n\nimport type { PacketDocument } from './ir.js';\nimport type { Scene, SceneElement, LayoutResult, Color } from '../../../contracts/index.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { readableText } from '../../../theme/contrast.js';\nimport { truncateText } from '../../../text/wrap.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nconst BITS_PER_ROW = 32;\n\nexport function layoutPacket(ir: PacketDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n\n  const fields = [...ir.fields].sort((a, b) => a.start - b.start);\n  const maxBit = Math.max(0, ...fields.map((f) => f.end));\n  const numRows = Math.floor(maxBit / BITS_PER_ROW) + 1;\n\n  const bitW = 26;\n  const rowH = 46;\n  const rowGap = 26; // room for bit-number labels above each row\n  const bitFont = typography.smallFontSize;\n  const labelFont = typography.smallFontSize;\n\n  const title = ir.metadata.title;\n  const titleH = title ? typography.titleFontSize + 16 : 0;\n  const gridLeft = margin;\n  const gridTop = margin + titleH + rowGap;\n\n  const elements: SceneElement[] = [];\n  if (title)\n    elements.push(\n      p.text(\n        title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  // Field cells cycle the theme's semantic accents (never a hardcoded palette).\n  const fieldTokens: readonly Color[] = [\n    palette.primary,\n    palette.secondary,\n    palette.success,\n    palette.warning,\n    palette.error,\n  ];\n\n  const rowTop = (r: number): number => gridTop + r * (rowH + rowGap);\n\n  // Per-row bit ticks (0 and 31 on each row plus multiples of 8).\n  for (let r = 0; r < numRows; r++) {\n    for (let c = 0; c <= BITS_PER_ROW; c += 8) {\n      const bit = r * BITS_PER_ROW + c;\n      const x = gridLeft + c * bitW;\n      if (c < BITS_PER_ROW)\n        elements.push(\n          p.text(String(bit), rhu(x + 2), rhu(rowTop(r) - 6), bitFont, palette.textMuted),\n        );\n    }\n  }\n\n  // Field cells (split across row boundaries).\n  fields.forEach((f, i) => {\n    const accent = fieldTokens[i % fieldTokens.length]!;\n    const fill = mixHex(accent, palette.background, 0.8); // soft theme-derived tint\n    const labelColor = readableText(fill, theme);\n    for (let r = Math.floor(f.start / BITS_PER_ROW); r <= Math.floor(f.end / BITS_PER_ROW); r++) {\n      const rowStartBit = r * BITS_PER_ROW;\n      const cStart = Math.max(f.start, rowStartBit) - rowStartBit;\n      const cEnd = Math.min(f.end, rowStartBit + BITS_PER_ROW - 1) - rowStartBit;\n      const x = gridLeft + cStart * bitW;\n      const w = (cEnd - cStart + 1) * bitW;\n      const y = rowTop(r);\n      elements.push(\n        p.rect({ x: rhu(x), y: rhu(y), width: rhu(w), height: rowH }, fill, accent, 1.4, { rx: 3 }),\n      );\n      // Label: horizontal when it fits; rotate 90\u00B0 in narrow (\u22642-bit) cells so\n      // flag labels (URG/ACK/PSH\u2026) stay readable; shrink\u2192truncate as a last resort.\n      placeFieldLabel(\n        p,\n        elements,\n        x,\n        y,\n        w,\n        rowH,\n        f.label,\n        labelFont,\n        labelColor,\n        bitFont + 3,\n        bitW * 2,\n      );\n      // start bit number inside top-left of the cell\n      elements.push(\n        p.text(String(f.start), rhu(x + 3), rhu(y + bitFont + 1), bitFont, palette.textMuted),\n      );\n    }\n  });\n\n  const totalW = rhuInt(gridLeft + BITS_PER_ROW * bitW + margin);\n  const totalH = rhuInt(rowTop(numRows - 1) + rowH + margin);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: {} };\n}\n\n// \u2500\u2500\u2500 Field label placement \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Horizontal when the label fits the cell width. For narrow cells (\u2264 narrowW,\n// i.e. 1\u20132 bit flag fields) the label is rotated 90\u00B0 (reads bottom-to-top) and\n// centered below the start-bit number. Font shrinks toward MIN_LABEL_FONT before\n// any truncation, so text is only clipped as an absolute last resort.\n\nconst MIN_LABEL_FONT = 7;\n\nfunction placeFieldLabel(\n  p: ReturnType<typeof pen>,\n  elements: SceneElement[],\n  x: number,\n  y: number,\n  w: number,\n  cellH: number,\n  text: string,\n  baseFont: number,\n  color: Color,\n  topReserve: number,\n  narrowW: number,\n): void {\n  const cx = x + w / 2;\n  const padX = 6;\n\n  // 1. Horizontal fit at full size \u2014 the common case for multi-bit fields.\n  if (measureText(text, baseFont).width <= w - padX) {\n    elements.push(\n      p.text(text, rhuInt(cx), rhu(y + cellH / 2 + baseFont * 0.35), baseFont, color, {\n        weight: 'bold',\n        anchor: 'middle',\n      }),\n    );\n    return;\n  }\n\n  // 2. Narrow cell \u2192 rotate the label into the vertical space below the number.\n  if (w <= narrowW) {\n    const availV = cellH - topReserve - 4;\n    const cy = y + topReserve + availV / 2;\n    let f = baseFont;\n    while (f > MIN_LABEL_FONT && measureText(text, f).width > availV) f -= 0.5;\n    const label = measureText(text, f).width > availV ? truncateText(text, f, availV) : text;\n    const px = rhuInt(cx),\n      py = rhu(cy);\n    elements.push(\n      p.group(\n        [p.text(label, px, rhu(cy + f * 0.35), f, color, { weight: 'bold', anchor: 'middle' })],\n        { transform: `rotate(-90 ${px} ${py})` },\n      ),\n    );\n    return;\n  }\n\n  // 3. Wide cell, long label \u2192 shrink horizontally, then truncate.\n  let f = baseFont;\n  while (f > MIN_LABEL_FONT && measureText(text, f).width > w - padX) f -= 0.5;\n  const label = measureText(text, f).width > w - padX ? truncateText(text, f, w - padX) : text;\n  elements.push(\n    p.text(label, rhuInt(cx), rhu(y + cellH / 2 + f * 0.35), f, color, {\n      weight: 'bold',\n      anchor: 'middle',\n    }),\n  );\n}\n\n// \u2500\u2500\u2500 Local colour helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// mixHex(a, b, t): t=0 \u2192 a, t=1 \u2192 b. Used to derive a soft tint of a theme\n// token toward the theme background so field fills track the active theme.\n\nfunction parseHex(c: Color): [number, number, number] | null {\n  const s = c.trim();\n  const m3 = s.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);\n  if (m3)\n    return [\n      parseInt(m3[1]! + m3[1]!, 16),\n      parseInt(m3[2]! + m3[2]!, 16),\n      parseInt(m3[3]! + m3[3]!, 16),\n    ];\n  const m6 = s.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n  if (m6) return [parseInt(m6[1]!, 16), parseInt(m6[2]!, 16), parseInt(m6[3]!, 16)];\n  return null;\n}\n\nfunction toHex(n: number): string {\n  return Math.max(0, Math.min(255, Math.round(n)))\n    .toString(16)\n    .padStart(2, '0');\n}\n\nfunction mixHex(a: Color, b: Color, t: number): Color {\n  const ca = parseHex(a),\n    cb = parseHex(b);\n  if (!ca || !cb) return a;\n  return `#${toHex(ca[0] + (cb[0] - ca[0]) * t)}${toHex(ca[1] + (cb[1] - ca[1]) * t)}${toHex(ca[2] + (cb[2] - ca[2]) * t)}`;\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Document: peg$parseDocument };\n  var peg$startRuleFunction = peg$parseDocument;\n\n  var peg$c0 = \"---\";\n  var peg$c1 = \"packet-beta\";\n  var peg$c2 = \"packet\";\n  var peg$c3 = \"title\";\n  var peg$c4 = \":\";\n  var peg$c5 = \"-\";\n  var peg$c6 = \"\\\"\";\n  var peg$c7 = \"'\";\n  var peg$c8 = \"%%\";\n  var peg$c9 = \"\\r\\n\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\"]/;\n  var peg$r2 = /^[^']/;\n  var peg$r3 = /^[^\\r\\n]/;\n  var peg$r4 = /^[0-9]/;\n  var peg$r5 = /^[\\n\\r]/;\n  var peg$r6 = /^[ \\t]/;\n\n  var peg$e0 = peg$literalExpectation(\"---\", false);\n  var peg$e1 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e2 = peg$literalExpectation(\"packet-beta\", true);\n  var peg$e3 = peg$literalExpectation(\"packet\", true);\n  var peg$e4 = peg$literalExpectation(\"title\", true);\n  var peg$e5 = peg$literalExpectation(\":\", false);\n  var peg$e6 = peg$literalExpectation(\"-\", false);\n  var peg$e7 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e8 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e9 = peg$literalExpectation(\"'\", false);\n  var peg$e10 = peg$classExpectation([\"'\"], true, false);\n  var peg$e11 = peg$classExpectation([\"\\r\", \"\\n\"], true, false);\n  var peg$e12 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e13 = peg$literalExpectation(\"%%\", false);\n  var peg$e14 = peg$literalExpectation(\"\\r\\n\", false);\n  var peg$e15 = peg$classExpectation([\"\\n\", \"\\r\"], false, false);\n  var peg$e16 = peg$anyExpectation();\n  var peg$e17 = peg$classExpectation([\" \", \"\\t\"], false, false);\n\n  var peg$f0 = function(fm, stmts) {\n      let title;\n      const fields = [];\n      for (const s of stmts.filter(Boolean)) {\n        if (s.t === 'title') title = s.v;\n        else if (s.t === 'field') {\n          const sMin = Math.min(s.start, s.end);\n          const sMax = Math.max(s.start, s.end);\n          fields.push({ start: sMin, end: sMax, label: s.label });\n        }\n      }\n      return { version: '1.0', metadata: { ...(fm || {}), ...(title ? { title } : {}) }, fields };\n    };\n  var peg$f1 = function(line) { return line; };\n  var peg$f2 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f3 = function(v) { return { t: 'title', v: v.trim() }; };\n  var peg$f4 = function(start, e) { return e; };\n  var peg$f5 = function(start, end, label) {\n      return { t: 'field', start, end: end != null ? end : start, label };\n    };\n  var peg$f6 = function(s) { return s.trim(); };\n  var peg$f7 = function(s) { return s.trim(); };\n  var peg$f8 = function(s) { return s.trim(); };\n  var peg$f9 = function(n) { return parseInt(n, 10); };\n  var peg$f10 = function() { return null; };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseDocument() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = [];\n    s3 = peg$parseBlankLine();\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseBlankLine();\n    }\n    s3 = peg$parse_();\n    s4 = peg$parsePacketHeader();\n    if (s4 !== peg$FAILED) {\n      s5 = peg$parseLineEnd();\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = peg$parseStatement();\n        while (s7 !== peg$FAILED) {\n          s6.push(s7);\n          s7 = peg$parseStatement();\n        }\n        s7 = peg$parse_();\n        peg$savedPos = s0;\n        s0 = peg$f0(s1, s6);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s7 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e1); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f1(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c0) {\n            s7 = peg$c0;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e1); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e1); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f1(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c0) {\n          s4 = peg$c0;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f2(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePacketHeader() {\n    var s0;\n\n    s0 = input.substr(peg$currPos, 11);\n    if (s0.toLowerCase() === peg$c1) {\n      peg$currPos += 11;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.substr(peg$currPos, 6);\n      if (s0.toLowerCase() === peg$c2) {\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e3); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStatement() {\n    var s0;\n\n    s0 = peg$parseTitleLine();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseFieldLine();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseBlankLine();\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = input.substr(peg$currPos, 5);\n    if (s2.toLowerCase() === peg$c3) {\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      s4 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s5 = peg$c4;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s5 = [s5, s6];\n        s4 = s5;\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseRestOfLine();\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parseLineEnd();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f3(s5);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFieldLine() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseInt();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 45) {\n        s5 = peg$c5;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseInt();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f4(s2, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s5 = peg$c4;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e5); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseQuoted();\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parse_();\n          s9 = peg$parseLineEnd();\n          if (s9 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f5(s2, s3, s7);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuoted() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c6;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r1.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c6;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f6(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 39) {\n        s1 = peg$c7;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r2.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e10); }\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        if (input.charCodeAt(peg$currPos) === 39) {\n          s3 = peg$c7;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e9); }\n        }\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f7(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$currPos;\n        s2 = [];\n        s3 = input.charAt(peg$currPos);\n        if (peg$r3.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = input.charAt(peg$currPos);\n            if (peg$r3.test(s3)) {\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e11); }\n            }\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = input.substring(s1, peg$currPos);\n        } else {\n          s1 = s2;\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f8(s1);\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInt() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r4.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r4.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e12); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f9(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseRestOfLine() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r3.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = input.charAt(peg$currPos);\n        if (peg$r3.test(s2)) {\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseComment();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseNL();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f10();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseComment() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c8) {\n      s1 = peg$c8;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r3.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r3.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n      }\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c9) {\n      s0 = peg$c9;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = input.charAt(peg$currPos);\n      if (peg$r5.test(s0)) {\n        peg$currPos++;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$parseComment();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseNL();\n    if (s3 === peg$FAILED) {\n      s3 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s4 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      peg$silentFails--;\n      if (s4 === peg$FAILED) {\n        s3 = undefined;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n    }\n    if (s3 !== peg$FAILED) {\n      s1 = [s1, s2, s3];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r6.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r6.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r6.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r6.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Document\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "import type { DiagramModule, LayoutResult } from '../../../contracts/index.js';\nimport type { PacketDocument } from './ir.js';\nimport type { ResolvedTheme } from '../../../contracts/index.js';\nimport { layoutPacket } from './layout.js';\nimport * as parser from './parser.js';\n\nexport type { PacketDocument, PacketField } from './ir.js';\n\nexport const packet: DiagramModule<PacketDocument> = {\n  parseMermaid(input: string): PacketDocument {\n    return parser.parse(input) as PacketDocument;\n  },\n\n  parseYaml(input: string): PacketDocument {\n    return JSON.parse(input) as PacketDocument;\n  },\n\n  layout(ir: PacketDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutPacket(ir, theme);\n  },\n};\n", "/**\n * @file graph/tree.ts \u2014 Tidy hierarchical (tree) placement.\n *\n * Centered-parent subtree packing: every parent is centered over the block its\n * descendants occupy, sibling subtrees never overlap, and node sizes may vary.\n * Shared by the decorated-tree diagrams (avl, rbtree, btree, radix, segtree,\n * heap, plan). Edge routing is left to callers (connect the returned boxes).\n *\n * Deterministic: stable child order, no clock, no randomness.\n */\n\nexport interface TreeNodeInput {\n  readonly id: string;\n  readonly width: number;\n  readonly height: number;\n  /** Child node ids, in draw order (left\u2192right for TB, top\u2192bottom for LR). */\n  readonly children: readonly string[];\n}\n\nexport interface TreeOptions {\n  /** 'TB' stacks depth top\u2192bottom (siblings spread horizontally); 'LR' rotates. */\n  readonly direction?: 'TB' | 'LR';\n  /** Gap between consecutive depths (px). */\n  readonly levelGap?: number;\n  /** Gap between sibling subtrees (px). */\n  readonly siblingGap?: number;\n  /** Outer margin (px). */\n  readonly margin?: number;\n}\n\nexport interface TreeBox {\n  readonly id: string;\n  readonly x: number;\n  readonly y: number;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport interface TreeResult {\n  readonly boxes: Map<string, TreeBox>;\n  readonly width: number;\n  readonly height: number;\n}\n\nexport function treeLayout(nodes: readonly TreeNodeInput[], options: TreeOptions = {}): TreeResult {\n  const direction = options.direction ?? 'TB';\n  const levelGap = options.levelGap ?? 56;\n  const siblingGap = options.siblingGap ?? 28;\n  const margin = options.margin ?? 32;\n  const horizontal = direction === 'LR';\n\n  if (nodes.length === 0) return { boxes: new Map(), width: margin * 2, height: margin * 2 };\n\n  const byId = new Map<string, TreeNodeInput>(nodes.map((n) => [n.id, n]));\n  const crossOf = (n: TreeNodeInput): number => (horizontal ? n.height : n.width);\n  const alongOf = (n: TreeNodeInput): number => (horizontal ? n.width : n.height);\n\n  // Roots = nodes never referenced as a child.\n  const childIds = new Set<string>();\n  for (const n of nodes) for (const c of n.children) childIds.add(c);\n  const roots = nodes.filter((n) => !childIds.has(n.id));\n\n  // Depth of every node (BFS from roots; stable).\n  const depth = new Map<string, number>();\n  const queue: string[] = roots.map((r) => {\n    depth.set(r.id, 0);\n    return r.id;\n  });\n  for (let i = 0; i < queue.length; i++) {\n    const id = queue[i]!;\n    const d = depth.get(id)!;\n    for (const c of byId.get(id)!.children) {\n      if (!depth.has(c)) {\n        depth.set(c, d + 1);\n        queue.push(c);\n      }\n    }\n  }\n  const maxDepth = Math.max(...depth.values());\n\n  // Along-axis band per depth = max along-extent at that depth.\n  const levelAlong = Array.from({ length: maxDepth + 1 }, () => 0);\n  for (const n of nodes) {\n    const d = depth.get(n.id)!;\n    levelAlong[d] = Math.max(levelAlong[d]!, alongOf(n));\n  }\n  const levelStart: number[] = [];\n  let acc = margin;\n  for (let d = 0; d <= maxDepth; d++) {\n    levelStart[d] = acc;\n    acc += levelAlong[d]! + levelGap;\n  }\n  const alongTotal = acc - levelGap + margin;\n\n  // Subtree cross-extent (memoized).\n  const subCross = new Map<string, number>();\n  const computeCross = (id: string): number => {\n    const cached = subCross.get(id);\n    if (cached !== undefined) return cached;\n    const node = byId.get(id)!;\n    let own = crossOf(node);\n    if (node.children.length > 0) {\n      const childrenCross = node.children.reduce(\n        (s, c, i) => s + computeCross(c) + (i > 0 ? siblingGap : 0),\n        0,\n      );\n      own = Math.max(own, childrenCross);\n    }\n    subCross.set(id, own);\n    return own;\n  };\n\n  const crossPos = new Map<string, number>(); // cross-axis top-left of each node\n  const assign = (id: string, u0: number): void => {\n    const node = byId.get(id)!;\n    const sc = computeCross(id);\n    const center = u0 + sc / 2;\n    crossPos.set(id, center - crossOf(node) / 2);\n    if (node.children.length === 0) return;\n    const childrenCross = node.children.reduce(\n      (s, c, i) => s + computeCross(c) + (i > 0 ? siblingGap : 0),\n      0,\n    );\n    let cursor = u0 + (sc - childrenCross) / 2;\n    for (const c of node.children) {\n      assign(c, cursor);\n      cursor += computeCross(c) + siblingGap;\n    }\n  };\n\n  // Place each root forest block left\u2192right (cross axis).\n  let cursor = margin;\n  for (const r of roots) {\n    assign(r.id, cursor);\n    cursor += computeCross(r.id) + siblingGap;\n  }\n  const crossTotal = cursor - siblingGap + margin;\n\n  const boxes = new Map<string, TreeBox>();\n  for (const n of nodes) {\n    const d = depth.get(n.id)!;\n    const u = crossPos.get(n.id)!;\n    const v = levelStart[d]! + (levelAlong[d]! - alongOf(n)) / 2;\n    const x = horizontal ? v : u;\n    const y = horizontal ? u : v;\n    boxes.set(n.id, { id: n.id, x, y, width: n.width, height: n.height });\n  }\n\n  return {\n    boxes,\n    width: horizontal ? alongTotal : crossTotal,\n    height: horizontal ? crossTotal : alongTotal,\n  };\n}\n", "/**\n * @file diagrams/tree/layout.ts \u2014 Decorated tree layout.\n *\n * Sizes each node from its label/info, runs the shared tidy tree placement\n * (graph/tree), then renders nodes per their decoration kinds (circle / pill /\n * rect, with colour states, corner badges, info sub-lines) and links parents to\n * children with edge labels. Produces a node-anchor registry so trees are\n * linkable inside posters.\n */\n\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport type {\n  Scene,\n  SceneElement,\n  LayoutResult,\n  NodeAnchorRegistry,\n  ResolvedTheme,\n  Color,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { treeLayout, type TreeNodeInput } from '../../../../graph/tree.js';\nimport { connectSlots } from '../../../../graph/connect.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { bestContrast, contrastRatio, relativeLuminance } from '../../../../theme/contrast.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu } from '../../../../util/round.js';\n\nconst RB_RED = '#d64545';\n\ninterface NodeStyle {\n  readonly shape: 'circle' | 'pill' | 'rect' | 'strip';\n  readonly fill: Color;\n  readonly stroke: Color;\n  readonly text: Color;\n}\n\n/** Split a `a | b | c` strip label into per-key cells with measured widths. */\nfunction stripCells(label: string, font: number): { key: string; width: number }[] {\n  return label\n    .split('|')\n    .map((s) => s.trim())\n    .map((key) => ({\n      key,\n      width: Math.max(measureText(key, font).width + 18, 34),\n    }));\n}\n\nfunction parseHex(c: Color): [number, number, number] | null {\n  const s = c.trim();\n  const m3 = s.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);\n  if (m3)\n    return [\n      parseInt(m3[1]! + m3[1]!, 16),\n      parseInt(m3[2]! + m3[2]!, 16),\n      parseInt(m3[3]! + m3[3]!, 16),\n    ];\n  const m6 = s.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n  if (m6) return [parseInt(m6[1]!, 16), parseInt(m6[2]!, 16), parseInt(m6[3]!, 16)];\n  return null;\n}\n\nfunction toHex(n: number): string {\n  return Math.max(0, Math.min(255, Math.round(n)))\n    .toString(16)\n    .padStart(2, '0');\n}\n\nfunction mixHex(a: Color, b: Color, t: number): Color {\n  const ca = parseHex(a),\n    cb = parseHex(b);\n  if (!ca || !cb) return a;\n  const r = ca[0] + (cb[0] - ca[0]) * t;\n  const g = ca[1] + (cb[1] - ca[1]) * t;\n  const bl = ca[2] + (cb[2] - ca[2]) * t;\n  return `#${toHex(r)}${toHex(g)}${toHex(bl)}`;\n}\n\nfunction canvasColor(theme: ResolvedTheme): Color {\n  return parseHex(theme.palette.background) ? theme.palette.background : theme.palette.surface;\n}\n\nfunction isDarkTheme(theme: ResolvedTheme): boolean {\n  const lum =\n    relativeLuminance(theme.palette.background) ?? relativeLuminance(theme.palette.surface);\n  return lum !== undefined ? lum < 0.5 : false;\n}\n\nfunction readableText(fill: Color, theme: ResolvedTheme): Color {\n  const themed = bestContrast(\n    fill,\n    [theme.palette.text, theme.palette.background],\n    theme.palette.text,\n  );\n  if (contrastRatio(themed, fill) >= 4.5) return themed;\n  return bestContrast(fill, ['#ffffff', '#000000'], themed);\n}\n\nfunction outlineStroke(fill: Color, theme: ResolvedTheme): Color {\n  const canvas = canvasColor(theme);\n  const candidates = [\n    theme.palette.text,\n    theme.palette.border,\n    theme.palette.textMuted,\n    theme.palette.background,\n  ];\n  let best = theme.palette.text,\n    score = -Infinity;\n  for (const c of candidates) {\n    if (!parseHex(c)) continue;\n    const next =\n      Math.min(contrastRatio(c, fill), contrastRatio(c, canvas)) + contrastRatio(c, canvas) * 0.15;\n    if (next > score) {\n      best = c;\n      score = next;\n    }\n  }\n  return best;\n}\n\nfunction isRedHue(c: Color): boolean {\n  const rgb = parseHex(c);\n  return rgb !== null && rgb[0] > rgb[1] * 1.35 && rgb[0] > rgb[2] * 1.35;\n}\n\nfunction redNodeFill(theme: ResolvedTheme): Color {\n  const { palette } = theme;\n  if (isRedHue(palette.error)) return mixHex(RB_RED, palette.error, isDarkTheme(theme) ? 0.7 : 0.6);\n  return mixHex(RB_RED, palette.text, isDarkTheme(theme) ? 0.12 : 0.08);\n}\n\nfunction blackNodeFill(theme: ResolvedTheme): Color {\n  const { palette } = theme;\n  if (!isDarkTheme(theme)) return mixHex(palette.text, palette.background, 0.08);\n\n  const canvas = canvasColor(theme);\n  for (const source of [palette.text, palette.surface, palette.border, '#ffffff']) {\n    for (const t of [0.22, 0.26, 0.3, 0.34]) {\n      const fill = mixHex(canvas, source, t);\n      const lum = relativeLuminance(fill);\n      if (lum !== undefined && lum < 0.32 && contrastRatio(fill, canvas) >= 1.7) return fill;\n    }\n  }\n  return mixHex(canvas, '#ffffff', 0.28);\n}\n\nfunction nodeStyle(kinds: readonly string[], theme: ResolvedTheme): NodeStyle {\n  const { palette } = theme;\n  const has = (k: string): boolean => kinds.includes(k);\n  const shape: NodeStyle['shape'] = has('strip')\n    ? 'strip'\n    : has('leaf') || has('pill')\n      ? 'pill'\n      : has('circle') || has('red') || has('black') || has('dot')\n        ? 'circle'\n        : 'rect';\n  if (has('red')) {\n    const fill = redNodeFill(theme);\n    return { shape, fill, stroke: outlineStroke(fill, theme), text: readableText(fill, theme) };\n  }\n  if (has('black')) {\n    const fill = blackNodeFill(theme);\n    return { shape, fill, stroke: outlineStroke(fill, theme), text: readableText(fill, theme) };\n  }\n  if (has('active') || has('primary') || has('focal'))\n    return {\n      shape,\n      fill: palette.primary,\n      stroke: palette.primary,\n      text: readableText(palette.primary, theme),\n    };\n  if (has('scan'))\n    return { shape, fill: palette.surface, stroke: palette.primary, text: palette.text };\n  if (has('join'))\n    return { shape, fill: palette.surface, stroke: palette.secondary, text: palette.text };\n  if (has('build') || has('muted'))\n    return { shape, fill: palette.surface, stroke: palette.textMuted, text: palette.text };\n  const fill = palette.surface;\n  return { shape, fill, stroke: palette.border, text: palette.text };\n}\n\n/** Build the muted info sub-line from a node's parsed attributes. */\nfunction infoLine(node: TreeNode): string | undefined {\n  return node.info;\n}\n\nfunction badgeColor(badge: string, theme: ResolvedTheme): Color {\n  const n = Number(badge);\n  if (!Number.isNaN(n)) {\n    if (n === 0) return theme.palette.success;\n    if (Math.abs(n) === 1) return theme.palette.primary;\n    return theme.palette.error;\n  }\n  return theme.palette.primary;\n}\n\nexport function layoutTree(ir: TreeDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  if (ir.nodes.length === 0) {\n    const scene: Scene = {\n      viewBox: { x: 0, y: 0, width: 120, height: 80 },\n      background: palette.background,\n      elements: [],\n    };\n    return { scene, anchors: {} };\n  }\n\n  // \u2500\u2500\u2500 Size every node from its content \u2500\u2500\u2500\n  const style = new Map<string, NodeStyle>();\n  const sizes = new Map<string, { width: number; height: number }>();\n  for (const node of ir.nodes) {\n    const st = nodeStyle(node.kinds, theme);\n    style.set(node.id, st);\n    const info = infoLine(node);\n    const labelW = measureText(node.label, font).width;\n    const infoW = info ? measureText(info, smallFont).width : 0;\n    const contentW = Math.max(labelW, infoW);\n    if (st.shape === 'strip') {\n      const width = stripCells(node.label, font).reduce((s, c) => s + c.width, 0);\n      sizes.set(node.id, { width, height: font + 20 });\n    } else if (st.shape === 'circle') {\n      const side = info\n        ? Math.max(contentW + 24, font + smallFont + 32, 48)\n        : Math.max(contentW + 18, font + 24, 42);\n      sizes.set(node.id, { width: side, height: side });\n    } else {\n      const width = contentW + 28;\n      const height = info ? font + smallFont + 24 : font + 22;\n      sizes.set(node.id, { width, height });\n    }\n  }\n\n  const isCompact =\n    ir.metadata['compact'] === true ||\n    ir.metadata['layout'] === 'compact' ||\n    String(ir.metadata['compact']) === 'true';\n\n  const inputs: TreeNodeInput[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: sizes.get(n.id)!.width,\n    height: sizes.get(n.id)!.height,\n    children: n.children,\n  }));\n  const placed = treeLayout(inputs, {\n    direction: ir.direction,\n    levelGap: isCompact ? 38 : 52,\n    siblingGap: isCompact ? 12 : 28,\n    margin,\n  });\n\n  const titleText = ir.metadata['title'] ? String(ir.metadata['title']) : undefined;\n  const titleW = titleText ? measureText(titleText, typography.titleFontSize).width : 0;\n  const titleH = titleText ? typography.titleFontSize + 14 : 0;\n  const box = (id: string) => {\n    const b = placed.boxes.get(id)!;\n    return { x: b.x, y: b.y + titleH, width: b.width, height: b.height };\n  };\n\n  const elements: SceneElement[] = [];\n  if (titleText) {\n    elements.push(\n      p.text(\n        titleText,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500\u2500 Edges first (parent \u2192 child), so nodes draw over them \u2500\u2500\u2500\n  const byId = new Map(ir.nodes.map((n) => [n.id, n]));\n  // Build active-edge set for highlighted paths (e.g. DFS/BFS traversal)\n  const activeEdgeSet = new Set<string>((ir.activePaths ?? []).map(([a, b]) => `${a}:${b}`));\n\n  // Map child to parent for anchor clearance\n  const parentMap = new Map<string, { parentId: string; index: number; total: number }>();\n  for (const node of ir.nodes) {\n    node.children.forEach((cid, idx) => {\n      parentMap.set(cid, { parentId: node.id, index: idx, total: node.children.length });\n    });\n  }\n\n  /** For circle-shaped nodes, snap the edge endpoint to the circle perimeter. */\n  function circleBorder(\n    center: { x: number; y: number },\n    radius: number,\n    dir: { x: number; y: number },\n    sign: 1 | -1, // +1 = move in dir (parent side), -1 = move against dir (child side)\n  ): { x: number; y: number } {\n    return { x: rhu(center.x + sign * radius * dir.x), y: rhu(center.y + sign * radius * dir.y) };\n  }\n\n  for (const node of ir.nodes) {\n    const pb = box(node.id);\n    const parentShape = style.get(node.id)!.shape;\n    for (const cid of node.children) {\n      const cb = box(cid);\n      const childShape = style.get(cid)!.shape;\n\n      // Centers\n      const pc = { x: pb.x + pb.width / 2, y: pb.y + pb.height / 2 };\n      const cc = { x: cb.x + cb.width / 2, y: cb.y + cb.height / 2 };\n      const dx = cc.x - pc.x,\n        dy = cc.y - pc.y;\n      const len = Math.hypot(dx, dy);\n      const dir = len > 0 ? { x: dx / len, y: dy / len } : { x: 0, y: 1 };\n\n      // Box-based fallback for non-circle shapes\n      const { start: boxStart, end: boxEnd } = connectSlots(pb, cb);\n\n      const start = parentShape === 'circle' ? circleBorder(pc, pb.width / 2, dir, 1) : boxStart;\n      const end = childShape === 'circle' ? circleBorder(cc, cb.width / 2, dir, -1) : boxEnd;\n\n      const isActive = activeEdgeSet.has(`${node.id}:${cid}`);\n      const edgeColor = isActive ? palette.primary : palette.textMuted;\n      const edgeWidth = isActive ? 2.5 : 1.5;\n      elements.push(\n        p.path(\n          `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`,\n          edgeColor,\n          edgeWidth,\n        ),\n      );\n      const child = byId.get(cid)!;\n      if (child.edgeLabel) {\n        const mx = (start.x + end.x) / 2,\n          my = (start.y + end.y) / 2;\n        const edgeFont = theme.edges?.labelFontSize ?? 12;\n        const w = measureText(child.edgeLabel, edgeFont).width + 8;\n        elements.push(\n          p.rect(\n            { x: mx - w / 2, y: my - 9, width: w, height: 16 },\n            palette.background,\n            palette.background,\n            0,\n            { rx: 3 },\n          ),\n        );\n        elements.push(\n          p.text(\n            child.edgeLabel,\n            mx,\n            my + 3,\n            edgeFont,\n            isActive ? palette.primary : palette.textMuted,\n            { anchor: 'middle' },\n          ),\n        );\n      }\n    }\n  }\n\n  // \u2500\u2500\u2500 Nodes \u2500\u2500\u2500\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n    const st = style.get(node.id)!;\n    const info = infoLine(node);\n    const cx = b.x + b.width / 2,\n      cy = b.y + b.height / 2;\n    const isLeaf = node.kinds.includes('leaf') || node.kinds.includes('pill');\n    const sw = isLeaf\n      ? (theme.nodes?.leaf.borderWidth ?? 1.2)\n      : (theme.nodes?.standard.borderWidth ?? 1.5);\n\n    if (st.shape === 'strip') {\n      elements.push(\n        p.rect(b, st.fill, st.stroke, sw, {\n          rx: theme.nodes?.standard.cornerRadius ?? 4,\n        }),\n      );\n      let sx = b.x;\n      stripCells(node.label, font).forEach((cell, idx) => {\n        if (idx > 0)\n          elements.push(\n            p.path(`M ${rhu(sx)} ${rhu(b.y)} L ${rhu(sx)} ${rhu(b.y + b.height)}`, st.stroke, 1),\n          );\n        elements.push(\n          p.text(\n            cell.key,\n            rhu(sx + cell.width / 2),\n            rhu(b.y + b.height / 2 + font * 0.35),\n            font,\n            st.text,\n            { anchor: 'middle', weight: 'bold' },\n          ),\n        );\n        sx += cell.width;\n      });\n    } else if (st.shape === 'circle') {\n      elements.push(p.circle({ x: cx, y: cy }, b.width / 2, st.fill, st.stroke, sw));\n    } else {\n      const rx =\n        st.shape === 'pill'\n          ? (theme.nodes?.leaf.cornerRadius ?? b.height / 2)\n          : (theme.nodes?.standard.cornerRadius ?? 6);\n      elements.push(p.rect(b, st.fill, st.stroke, sw, { rx }));\n    }\n\n    const textWeight = isLeaf ? 'normal' : 'bold';\n    if (st.shape !== 'strip') {\n      if (info) {\n        const topPad = 10;\n        elements.push(\n          p.text(node.label, cx, rhu(b.y + topPad + font * 0.75), font, st.text, {\n            anchor: 'middle',\n            weight: textWeight,\n          }),\n        );\n        elements.push(\n          p.text(\n            info,\n            cx,\n            rhu(b.y + topPad + font + 5 + smallFont * 0.75),\n            smallFont,\n            st.fill === palette.surface ? palette.textMuted : st.text,\n            { anchor: 'middle' },\n          ),\n        );\n      } else {\n        elements.push(\n          p.text(node.label, cx, rhu(cy + font * 0.35), font, st.text, {\n            anchor: 'middle',\n            weight: textWeight,\n          }),\n        );\n      }\n    }\n\n    if (node.badge !== undefined) {\n      const bc = badgeColor(node.badge, theme);\n      const parentInfo = parentMap.get(node.id);\n      const pb = parentInfo ? box(parentInfo.parentId) : undefined;\n      const isLeftChild = pb ? b.x + b.width / 2 < pb.x + pb.width / 2 : false;\n\n      // Place badge on the outer side so incoming connectors from parent enter opposite side unobstructed\n      const badgeX = isLeftChild ? b.x + 3 : b.x + b.width - 3;\n      const badgeY = b.y + 3;\n\n      elements.push(p.circle({ x: badgeX, y: badgeY }, 9, palette.surface, bc, 1.5));\n      elements.push(\n        p.text(node.badge, badgeX, rhu(badgeY + smallFont * 0.35), smallFont, bc, {\n          anchor: 'middle',\n          weight: 'bold',\n        }),\n      );\n    }\n  }\n\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  for (const node of ir.nodes) anchors[node.id] = { bounds: box(node.id) };\n\n  const viewWidth = Math.max(placed.width, titleW + margin * 2);\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: viewWidth, height: placed.height + titleH },\n      background: palette.background,\n      elements,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n", "// AUTO-GENERATED from grammar.peggy \u2014 do not edit.\n// Regenerate: node scripts/build-grammars.mjs\n\n// @generated by Peggy 4.2.0.\n//\n// https://peggyjs.org/\n\n\n\n  function toObj(pairs) {\n    const o = {};\n    for (const [k, v] of pairs) o[k] = v;\n    return o;\n  }\n\nfunction peg$subclass(child, parent) {\n  function C() { this.constructor = child; }\n  C.prototype = parent.prototype;\n  child.prototype = new C();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n  var self = Error.call(this, message);\n  // istanbul ignore next Check is a necessary evil to support older environments\n  if (Object.setPrototypeOf) {\n    Object.setPrototypeOf(self, peg$SyntaxError.prototype);\n  }\n  self.expected = expected;\n  self.found = found;\n  self.location = location;\n  self.name = \"SyntaxError\";\n  return self;\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\nfunction peg$padEnd(str, targetLength, padString) {\n  padString = padString || \" \";\n  if (str.length > targetLength) { return str; }\n  targetLength -= str.length;\n  padString += padString.repeat(targetLength);\n  return str + padString.slice(0, targetLength);\n}\n\npeg$SyntaxError.prototype.format = function(sources) {\n  var str = \"Error: \" + this.message;\n  if (this.location) {\n    var src = null;\n    var k;\n    for (k = 0; k < sources.length; k++) {\n      if (sources[k].source === this.location.source) {\n        src = sources[k].text.split(/\\r\\n|\\n|\\r/g);\n        break;\n      }\n    }\n    var s = this.location.start;\n    var offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n      ? this.location.source.offset(s)\n      : s;\n    var loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n    if (src) {\n      var e = this.location.end;\n      var filler = peg$padEnd(\"\", offset_s.line.toString().length, ' ');\n      var line = src[s.line - 1];\n      var last = s.line === e.line ? e.column : line.length + 1;\n      var hatLen = (last - s.column) || 1;\n      str += \"\\n --> \" + loc + \"\\n\"\n          + filler + \" |\\n\"\n          + offset_s.line + \" | \" + line + \"\\n\"\n          + filler + \" | \" + peg$padEnd(\"\", s.column - 1, ' ')\n          + peg$padEnd(\"\", hatLen, \"^\");\n    } else {\n      str += \"\\n at \" + loc;\n    }\n  }\n  return str;\n};\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n  var DESCRIBE_EXPECTATION_FNS = {\n    literal: function(expectation) {\n      return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n    },\n\n    class: function(expectation) {\n      var escapedParts = expectation.parts.map(function(part) {\n        return Array.isArray(part)\n          ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n          : classEscape(part);\n      });\n\n      return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\";\n    },\n\n    any: function() {\n      return \"any character\";\n    },\n\n    end: function() {\n      return \"end of input\";\n    },\n\n    other: function(expectation) {\n      return expectation.description;\n    }\n  };\n\n  function hex(ch) {\n    return ch.charCodeAt(0).toString(16).toUpperCase();\n  }\n\n  function literalEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\"/g,  \"\\\\\\\"\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function classEscape(s) {\n    return s\n      .replace(/\\\\/g, \"\\\\\\\\\")\n      .replace(/\\]/g, \"\\\\]\")\n      .replace(/\\^/g, \"\\\\^\")\n      .replace(/-/g,  \"\\\\-\")\n      .replace(/\\0/g, \"\\\\0\")\n      .replace(/\\t/g, \"\\\\t\")\n      .replace(/\\n/g, \"\\\\n\")\n      .replace(/\\r/g, \"\\\\r\")\n      .replace(/[\\x00-\\x0F]/g,          function(ch) { return \"\\\\x0\" + hex(ch); })\n      .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\"  + hex(ch); });\n  }\n\n  function describeExpectation(expectation) {\n    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n  }\n\n  function describeExpected(expected) {\n    var descriptions = expected.map(describeExpectation);\n    var i, j;\n\n    descriptions.sort();\n\n    if (descriptions.length > 0) {\n      for (i = 1, j = 1; i < descriptions.length; i++) {\n        if (descriptions[i - 1] !== descriptions[i]) {\n          descriptions[j] = descriptions[i];\n          j++;\n        }\n      }\n      descriptions.length = j;\n    }\n\n    switch (descriptions.length) {\n      case 1:\n        return descriptions[0];\n\n      case 2:\n        return descriptions[0] + \" or \" + descriptions[1];\n\n      default:\n        return descriptions.slice(0, -1).join(\", \")\n          + \", or \"\n          + descriptions[descriptions.length - 1];\n    }\n  }\n\n  function describeFound(found) {\n    return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n  }\n\n  return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  var peg$FAILED = {};\n  var peg$source = options.grammarSource;\n\n  var peg$startRuleFunctions = { Start: peg$parseStart };\n  var peg$startRuleFunction = peg$parseStart;\n\n  var peg$c0 = \"tree\";\n  var peg$c1 = \"plan\";\n  var peg$c2 = \"---\";\n  var peg$c3 = \"\\r\";\n  var peg$c4 = \"\\n\";\n  var peg$c5 = \"TD\";\n  var peg$c6 = \"TB\";\n  var peg$c7 = \"LR\";\n  var peg$c8 = \"title\";\n  var peg$c9 = \"|\";\n  var peg$c10 = \":\";\n  var peg$c11 = \"{\";\n  var peg$c12 = \"}\";\n  var peg$c13 = \",\";\n  var peg$c14 = \"\\\"\";\n  var peg$c15 = \".\";\n\n  var peg$r0 = /^[^\\n]/;\n  var peg$r1 = /^[^\\r\\n]/;\n  var peg$r2 = /^[ \\t]/;\n  var peg$r3 = /^[^|\\r\\n]/;\n  var peg$r4 = /^[^ \\t:{|\\r\\n]/;\n  var peg$r5 = /^[^:{|\\r\\n]/;\n  var peg$r6 = /^[A-Za-z]/;\n  var peg$r7 = /^[A-Za-z0-9_\\-]/;\n  var peg$r8 = /^[A-Za-z_]/;\n  var peg$r9 = /^[^,}\\r\\n]/;\n  var peg$r10 = /^[^\"]/;\n  var peg$r11 = /^[0-9]/;\n\n  var peg$e0 = peg$literalExpectation(\"tree\", false);\n  var peg$e1 = peg$literalExpectation(\"plan\", false);\n  var peg$e2 = peg$literalExpectation(\"---\", false);\n  var peg$e3 = peg$classExpectation([\"\\n\"], true, false);\n  var peg$e4 = peg$literalExpectation(\"\\r\", false);\n  var peg$e5 = peg$literalExpectation(\"\\n\", false);\n  var peg$e6 = peg$literalExpectation(\"TD\", false);\n  var peg$e7 = peg$literalExpectation(\"TB\", false);\n  var peg$e8 = peg$literalExpectation(\"LR\", false);\n  var peg$e9 = peg$literalExpectation(\"title\", false);\n  var peg$e10 = peg$classExpectation([\"\\r\", \"\\n\"], true, false);\n  var peg$e11 = peg$classExpectation([\" \", \"\\t\"], false, false);\n  var peg$e12 = peg$literalExpectation(\"|\", false);\n  var peg$e13 = peg$classExpectation([\"|\", \"\\r\", \"\\n\"], true, false);\n  var peg$e14 = peg$classExpectation([\" \", \"\\t\", \":\", \"{\", \"|\", \"\\r\", \"\\n\"], true, false);\n  var peg$e15 = peg$classExpectation([\":\", \"{\", \"|\", \"\\r\", \"\\n\"], true, false);\n  var peg$e16 = peg$literalExpectation(\":\", false);\n  var peg$e17 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"]], false, false);\n  var peg$e18 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], [\"0\", \"9\"], \"_\", \"-\"], false, false);\n  var peg$e19 = peg$literalExpectation(\"{\", false);\n  var peg$e20 = peg$literalExpectation(\"}\", false);\n  var peg$e21 = peg$literalExpectation(\",\", false);\n  var peg$e22 = peg$classExpectation([[\"A\", \"Z\"], [\"a\", \"z\"], \"_\"], false, false);\n  var peg$e23 = peg$classExpectation([\",\", \"}\", \"\\r\", \"\\n\"], true, false);\n  var peg$e24 = peg$literalExpectation(\"\\\"\", false);\n  var peg$e25 = peg$classExpectation([\"\\\"\"], true, false);\n  var peg$e26 = peg$classExpectation([[\"0\", \"9\"]], false, false);\n  var peg$e27 = peg$literalExpectation(\".\", false);\n\n  var peg$f0 = function(fm, d) { return d; };\n  var peg$f1 = function(fm, dir, title, lines) {\n      return {\n        version: \"1.0\",\n        metadata: { ...(fm || {}), ...(title ? { title } : {}) },\n        direction: dir || \"TB\",\n        lines: lines.filter(l => l !== null),\n      };\n    };\n  var peg$f2 = function(line) { return line; };\n  var peg$f3 = function(lines) {\n      const meta = {}; for (const line of lines) { const m = line.match(/^\\s*(\\w+)\\s*:\\s*(.+?)\\s*$/); if (m) meta[m[1]] = m[2]; } return meta;\n    };\n  var peg$f4 = function() { return \"TB\"; };\n  var peg$f5 = function() { return \"TB\"; };\n  var peg$f6 = function() { return \"LR\"; };\n  var peg$f7 = function(t) { return t.trim(); };\n  var peg$f8 = function() { return null; };\n  var peg$f9 = function(indent, content) {\n      return { indent: indent.length, ...content };\n    };\n  var peg$f10 = function(e) { return e; };\n  var peg$f11 = function(edge, label, kinds, a) { return a; };\n  var peg$f12 = function(edge, label, kinds, attrs) {\n      return {\n        edgeLabel: edge || undefined,\n        label: label.trim(),\n        kinds: kinds,\n        attrs: attrs || {},\n      };\n    };\n  var peg$f13 = function(t) { return t.trim(); };\n  var peg$f14 = function(name) { return name; };\n  var peg$f15 = function(pairs) { return pairs ? toObj(pairs) : {}; };\n  var peg$f16 = function(first, p) { return p; };\n  var peg$f17 = function(first, rest) { return [first, ...rest]; };\n  var peg$f18 = function(k, val) { return val; };\n  var peg$f19 = function(k, v) { return [k, v === null ? true : v]; };\n  var peg$f20 = function(n) { return n; };\n  var peg$f21 = function(r) { return r.trim(); };\n  var peg$f22 = function(s) { return s; };\n  var peg$f23 = function(n) { return parseFloat(n); };\n  var peg$currPos = options.peg$currPos | 0;\n  var peg$savedPos = peg$currPos;\n  var peg$posDetailsCache = [{ line: 1, column: 1 }];\n  var peg$maxFailPos = peg$currPos;\n  var peg$maxFailExpected = options.peg$maxFailExpected || [];\n  var peg$silentFails = options.peg$silentFails | 0;\n\n  var peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase) {\n    return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description: description };\n  }\n\n  function peg$computePosDetails(pos) {\n    var details = peg$posDetailsCache[pos];\n    var p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    var startPosDetails = peg$computePosDetails(startPos);\n    var endPosDetails = peg$computePosDetails(endPos);\n\n    var res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column\n      }\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseStart() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parseFrontmatter();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parse_();\n    if (input.substr(peg$currPos, 4) === peg$c0) {\n      s3 = peg$c0;\n      peg$currPos += 4;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s3 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c1) {\n        s3 = peg$c1;\n        peg$currPos += 4;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      s5 = peg$parse__();\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parseDirection();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s4;\n          s4 = peg$f0(s1, s6);\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$parseLineEnd();\n      s6 = peg$parseTitleLine();\n      if (s6 === peg$FAILED) {\n        s6 = null;\n      }\n      s7 = [];\n      s8 = peg$parseNodeLine();\n      if (s8 === peg$FAILED) {\n        s8 = peg$parseBlankLine();\n      }\n      while (s8 !== peg$FAILED) {\n        s7.push(s8);\n        s8 = peg$parseNodeLine();\n        if (s8 === peg$FAILED) {\n          s8 = peg$parseBlankLine();\n        }\n      }\n      peg$savedPos = s0;\n      s0 = peg$f1(s1, s4, s6, s7);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFrontmatter() {\n    var s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c2) {\n      s1 = peg$c2;\n      peg$currPos += 3;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseNL();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$currPos;\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s7 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseNL();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$currPos;\n          s7 = [];\n          s8 = input.charAt(peg$currPos);\n          if (peg$r0.test(s8)) {\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e3); }\n          }\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n          }\n          s6 = input.substring(s6, peg$currPos);\n          s7 = peg$parseNL();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s4;\n            s4 = peg$f2(s6);\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$currPos;\n          if (input.substr(peg$currPos, 3) === peg$c2) {\n            s7 = peg$c2;\n            peg$currPos += 3;\n          } else {\n            s7 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e2); }\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseNL();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = input.charAt(peg$currPos);\n            if (peg$r0.test(s8)) {\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e3); }\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = input.charAt(peg$currPos);\n              if (peg$r0.test(s8)) {\n                peg$currPos++;\n              } else {\n                s8 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e3); }\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseNL();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s4;\n              s4 = peg$f2(s6);\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        if (input.substr(peg$currPos, 3) === peg$c2) {\n          s4 = peg$c2;\n          peg$currPos += 3;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseNL();\n          if (s5 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f3(s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    var s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s2 = peg$c4;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDirection() {\n    var s0, s1;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c5) {\n      s1 = peg$c5;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f4();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c6) {\n        s1 = peg$c6;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f5();\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 2) === peg$c7) {\n          s1 = peg$c7;\n          peg$currPos += 2;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f6();\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleLine() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.substr(peg$currPos, 5) === peg$c8) {\n      s2 = peg$c8;\n      peg$currPos += 5;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse__();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r1.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e10); }\n        }\n        if (s6 !== peg$FAILED) {\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            s6 = input.charAt(peg$currPos);\n            if (peg$r1.test(s6)) {\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e10); }\n            }\n          }\n        } else {\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s4 = input.substring(s4, peg$currPos);\n        } else {\n          s4 = s5;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseLineEnd();\n          peg$savedPos = s0;\n          s0 = peg$f7(s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s2 = peg$c3;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s3 = peg$c4;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f8();\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeLine() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r2.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r2.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    s2 = peg$parseNodeContent();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseLineEnd();\n      peg$savedPos = s0;\n      s0 = peg$f9(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNodeContent() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseEdgeLabel();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parse_();\n      peg$savedPos = s1;\n      s1 = peg$f10(s2);\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parseLabel();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseKind();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseKind();\n      }\n      s4 = peg$currPos;\n      s5 = peg$parse_();\n      s6 = peg$parseAttrBlock();\n      if (s6 !== peg$FAILED) {\n        peg$savedPos = s4;\n        s4 = peg$f11(s1, s2, s3, s6);\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f12(s1, s2, s3, s4);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseEdgeLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 124) {\n      s1 = peg$c9;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r3.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 124) {\n        s3 = peg$c9;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f13(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLabel() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r4.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r5.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r5.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e15); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseKind() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 58) {\n      s1 = peg$c10;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = input.charAt(peg$currPos);\n      if (peg$r6.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e17); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = input.charAt(peg$currPos);\n        if (peg$r7.test(s6)) {\n          peg$currPos++;\n        } else {\n          s6 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = input.charAt(peg$currPos);\n          if (peg$r7.test(s6)) {\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e18); }\n          }\n        }\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f14(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrBlock() {\n    var s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 123) {\n      s1 = peg$c11;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parse_();\n      s3 = peg$parseAttrPairs();\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 125) {\n        s5 = peg$c12;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s5 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f15(s3);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrPairs() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseAttrPair();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 44) {\n        s5 = peg$c13;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e21); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parse_();\n        s7 = peg$parseAttrPair();\n        if (s7 !== peg$FAILED) {\n          peg$savedPos = s3;\n          s3 = peg$f16(s1, s7);\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = peg$currPos;\n        s4 = peg$parse_();\n        if (input.charCodeAt(peg$currPos) === 44) {\n          s5 = peg$c13;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e21); }\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parse_();\n          s7 = peg$parseAttrPair();\n          if (s7 !== peg$FAILED) {\n            peg$savedPos = s3;\n            s3 = peg$f16(s1, s7);\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      peg$savedPos = s0;\n      s0 = peg$f17(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrPair() {\n    var s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseKey();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$parse_();\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s4 = peg$c10;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parse_();\n        s6 = peg$parseVal();\n        if (s6 !== peg$FAILED) {\n          peg$savedPos = s2;\n          s2 = peg$f18(s1, s6);\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      peg$savedPos = s0;\n      s0 = peg$f19(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseKey() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r8.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r7.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r7.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseVal() {\n    var s0, s1, s2, s3;\n\n    s0 = peg$parseQuotedString();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseNumber();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f20(s1);\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$currPos;\n        s2 = [];\n        s3 = input.charAt(peg$currPos);\n        if (peg$r9.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e23); }\n        }\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = input.charAt(peg$currPos);\n            if (peg$r9.test(s3)) {\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e23); }\n            }\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s1 = input.substring(s1, peg$currPos);\n        } else {\n          s1 = s2;\n        }\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f21(s1);\n        }\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseQuotedString() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 34) {\n      s1 = peg$c14;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r10.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e25); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r10.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e25); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      if (input.charCodeAt(peg$currPos) === 34) {\n        s3 = peg$c14;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e24); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f22(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseNumber() {\n    var s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    s3 = [];\n    s4 = input.charAt(peg$currPos);\n    if (peg$r11.test(s4)) {\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e26); }\n    }\n    if (s4 !== peg$FAILED) {\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r11.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n      }\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s4 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 46) {\n        s5 = peg$c15;\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e27); }\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = [];\n        s7 = input.charAt(peg$currPos);\n        if (peg$r11.test(s7)) {\n          peg$currPos++;\n        } else {\n          s7 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n        if (s7 !== peg$FAILED) {\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = input.charAt(peg$currPos);\n            if (peg$r11.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e26); }\n            }\n          }\n        } else {\n          s6 = peg$FAILED;\n        }\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f23(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseLineEnd() {\n    var s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parse_();\n    s2 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 13) {\n      s3 = peg$c3;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = null;\n    }\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s4 = peg$c4;\n      peg$currPos++;\n    } else {\n      s4 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s4 !== peg$FAILED) {\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s1 = [s1, s2];\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parse_() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r2.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = input.charAt(peg$currPos);\n      if (peg$r2.test(s1)) {\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e11); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parse__() {\n    var s0, s1;\n\n    s0 = [];\n    s1 = input.charAt(peg$currPos);\n    if (peg$r2.test(s1)) {\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = input.charAt(peg$currPos);\n        if (peg$r2.test(s1)) {\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  peg$result = peg$startRuleFunction();\n\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos\n    });\n  }\n  if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n    return peg$result;\n  } else {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"Start\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n", "/**\n * @file diagrams/tree/build.ts \u2014 Shared parsing helpers for the tree family.\n *\n * The indentation grammar (shared by `tree` and `plan`) is parsed here and the\n * raw lines are folded into a child-linked node list. Semantic front-ends\n * (plan) reuse this; value-driven front-ends (avl, \u2026) build nodes directly.\n */\n\nimport * as parser from './parser.js';\n\nexport interface RawLine {\n  indent: number;\n  label: string;\n  kinds: string[];\n  attrs: Record<string, unknown>;\n  edgeLabel?: string;\n}\n\nexport interface ParsedTree {\n  version: string;\n  metadata: Record<string, unknown>;\n  direction: 'TB' | 'LR';\n  lines: RawLine[];\n}\n\n/** A node with mutable arrays so front-ends can post-process before freezing. */\nexport interface MutableTreeNode {\n  id: string;\n  label: string;\n  kinds: string[];\n  children: string[];\n  info?: string;\n  badge?: string;\n  edgeLabel?: string;\n}\n\nexport function parseLines(input: string): ParsedTree {\n  return parser.parse(input) as ParsedTree;\n}\n\n/** Fold indentation-nested raw lines into a flat, child-linked node list. */\nexport function buildNodes(lines: readonly RawLine[]): MutableTreeNode[] {\n  const nodes: MutableTreeNode[] = [];\n  const byId = new Map<string, MutableTreeNode>();\n  const stack: { indent: number; id: string }[] = [];\n\n  lines.forEach((ln, i) => {\n    const id = `n${i}`;\n    while (stack.length > 0 && stack[stack.length - 1]!.indent >= ln.indent) stack.pop();\n    const parent = stack.length > 0 ? stack[stack.length - 1] : undefined;\n\n    const kinds = [...ln.kinds];\n    const infoParts: string[] = [];\n    let badge: string | undefined;\n    for (const [k, v] of Object.entries(ln.attrs ?? {})) {\n      if (v === true) {\n        kinds.push(k);\n        continue;\n      }\n      if (k === 'badge') {\n        badge = String(v);\n        continue;\n      }\n      infoParts.push(k === 'sub' || k === 'info' ? String(v) : `${k}: ${v}`);\n    }\n    const info = infoParts.length > 0 ? infoParts.join(' \u00B7 ') : undefined;\n\n    const node: MutableTreeNode = {\n      id,\n      label: ln.label,\n      kinds,\n      children: [],\n      ...(info !== undefined ? { info } : {}),\n      ...(badge !== undefined ? { badge } : {}),\n      ...(ln.edgeLabel !== undefined ? { edgeLabel: ln.edgeLabel } : {}),\n    };\n    nodes.push(node);\n    byId.set(id, node);\n    if (parent) byId.get(parent.id)!.children.push(id);\n    stack.push({ indent: ln.indent, id });\n  });\n\n  return nodes;\n}\n", "/**\n * @file diagrams/tree/bplustree.ts \u2014 Dedicated B+ tree diagram module.\n *\n * Characteristics of B+ Trees:\n *   1. All data entries (keys) are stored only in leaf nodes.\n *   2. Internal nodes contain only routing / separator keys.\n *   3. Leaf splits use \"copy-up\" semantics (the median key is promoted to the\n *      parent while remaining as the first key of the right leaf).\n *   4. Internal splits use \"push-up\" semantics (the median key is promoted to the\n *      parent and removed from the internal node).\n *   5. All leaf nodes reside at the exact same rank/depth and are linked via\n *      ordered horizontal sibling pointers (L_i -> L_{i+1}).\n *   6. Sibling pointers do not affect the hierarchical tree layout (constraint=false).\n *   7. Supports both algorithmic value-driven insertion (`order N insert ...`)\n *      and explicit manual authoring with custom page IDs, keys, and notes.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { treeLayout, type TreeNodeInput } from '../../../../graph/tree.js';\nimport { connectSlots } from '../../../../graph/connect.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { pen } from '../../../../scene/build.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../../util/round.js';\n\n// \u2500\u2500\u2500 B+ Tree Internal Data Structures for Algorithmic Insertion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface BPlusInternal {\n  readonly isLeaf: false;\n  keys: number[];\n  children: (BPlusInternal | BPlusLeaf)[];\n  pageId?: string | undefined;\n}\n\ninterface BPlusLeaf {\n  readonly isLeaf: true;\n  keys: number[];\n  next: BPlusLeaf | null;\n  prev: BPlusLeaf | null;\n  pageId?: string | undefined;\n}\n\ntype BPlusNode = BPlusInternal | BPlusLeaf;\n\ninterface SplitResult {\n  readonly upKey: number;\n  readonly rightChild: BPlusNode;\n}\n\n/**\n * Recursive B+ tree insertion.\n * - Leaves use copy-up: the separator key remains in the right leaf.\n * - Internal nodes use push-up: the separator key is removed from the internal node.\n */\nfunction insertBPlus(node: BPlusNode, key: number, order: number): SplitResult | null {\n  if (node.isLeaf) {\n    // 1. Insert key in sorted order into leaf\n    let i = node.keys.length - 1;\n    while (i >= 0 && key < node.keys[i]!) i--;\n    if (i >= 0 && node.keys[i] === key) return null; // duplicate key, ignore\n    node.keys.splice(i + 1, 0, key);\n\n    // 2. Check overflow (max keys in leaf is order - 1)\n    if (node.keys.length <= order - 1) return null;\n\n    // 3. Copy-up split: median key is copied up and retained in right leaf\n    const mid = Math.floor(node.keys.length / 2);\n    const upKey = node.keys[mid]!;\n    const rightLeaf: BPlusLeaf = {\n      isLeaf: true,\n      keys: node.keys.slice(mid), // includes upKey\n      next: node.next,\n      prev: node,\n    };\n    if (node.next) node.next.prev = rightLeaf;\n    node.next = rightLeaf;\n    node.keys = node.keys.slice(0, mid);\n\n    return { upKey, rightChild: rightLeaf };\n  }\n\n  // Internal node: find child branch\n  let i = 0;\n  while (i < node.keys.length && key >= node.keys[i]!) i++;\n\n  const split = insertBPlus(node.children[i]!, key, order);\n  if (!split) return null;\n\n  // Insert promoted key and new child pointer\n  node.keys.splice(i, 0, split.upKey);\n  node.children.splice(i + 1, 0, split.rightChild);\n\n  // Check internal node overflow (max keys is order - 1)\n  if (node.keys.length <= order - 1) return null;\n\n  // Push-up split: median key is removed from internal node and promoted\n  const mid = Math.floor(node.keys.length / 2);\n  const upKey = node.keys[mid]!;\n  const rightInternal: BPlusInternal = {\n    isLeaf: false,\n    keys: node.keys.slice(mid + 1), // excludes upKey\n    children: node.children.slice(mid + 1),\n  };\n  node.keys = node.keys.slice(0, mid);\n  node.children = node.children.slice(0, mid + 1);\n\n  return { upKey, rightChild: rightInternal };\n}\n\n// \u2500\u2500\u2500 IR Types for B+ Tree \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface BPlusTreeNode extends TreeNode {\n  readonly isLeaf?: boolean | undefined;\n  readonly pageId?: string | undefined;\n}\n\nexport interface BPlusTreeNote {\n  readonly target: 'internal' | 'root' | 'leaves' | 'leaf' | string;\n  readonly text: string;\n}\n\nexport interface BPlusTreeDocument extends TreeDocument {\n  readonly nodes: readonly BPlusTreeNode[];\n  readonly bidirectionalLeaves?: boolean | undefined;\n  readonly notes?: readonly BPlusTreeNote[] | undefined;\n}\n\n// \u2500\u2500\u2500 Parser / Builder \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Parse and compile B+ tree input into a BPlusTreeDocument.\n */\nexport function buildBPlusTree(input: string): BPlusTreeDocument {\n  const lines = input\n    .split(/\\r?\\n/)\n    .map((l) => l.trim())\n    .filter(Boolean);\n\n  let title: string | undefined;\n  let compact = false;\n  let maxWidth: number | undefined;\n  let direction: 'TB' | 'LR' | undefined;\n  const filteredLines: string[] = [];\n  const notes: BPlusTreeNote[] = [];\n  let bidirectional = false;\n\n  for (const line of lines) {\n    if (/^(b\\+?tree|bplustree)$/i.test(line)) {\n      continue;\n    }\n    const headerWithArgs = line.match(/^(b\\+?tree|bplustree)\\s+(.+)$/i);\n    if (headerWithArgs) {\n      filteredLines.push(headerWithArgs[2]!.trim());\n      continue;\n    }\n\n    const titleMatch = line.match(/^title\\s+(.+)$/i);\n    if (titleMatch) {\n      title = titleMatch[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n\n    const compactMatch = line.match(/^(layout\\s+compact|compact\\s*(true)?|compact)\\b/i);\n    if (compactMatch) {\n      compact = true;\n      continue;\n    }\n\n    const maxWidthMatch = line.match(/^max-?width\\s+(\\d+)/i);\n    if (maxWidthMatch) {\n      maxWidth = Number(maxWidthMatch[1]);\n      compact = true;\n      continue;\n    }\n\n    const dirMatch = line.match(/^direction\\s+(TD|TB|LR)/i);\n    if (dirMatch) {\n      direction = dirMatch[1] === 'LR' ? 'LR' : 'TB';\n      continue;\n    }\n\n    if (/^(bidirectional|doubly-linked|doublyLinked)\\b/i.test(line)) {\n      bidirectional = true;\n      continue;\n    }\n\n    const noteMatch = line.match(/^note\\s+(\\w+)\\s+[\"']?([^\"']+)[\"']?$/i);\n    if (noteMatch) {\n      notes.push({ target: noteMatch[1]!.toLowerCase(), text: noteMatch[2]!.trim() });\n      continue;\n    }\n\n    filteredLines.push(line);\n  }\n\n  const extraMeta: Record<string, unknown> = {\n    ...(compact ? { compact: true } : {}),\n    ...(maxWidth !== undefined ? { maxWidth } : {}),\n    ...(direction ? { direction } : {}),\n  };\n\n  const cleanInput = filteredLines.join('\\n');\n\n  // Check if input is explicit/manual tree authoring (contains `->`, `leaf`, `page`, or indented lines without `insert`)\n  const isExplicit =\n    filteredLines.some((l) => l.includes('->') || /^leaf\\b/i.test(l) || /^page\\b/i.test(l)) ||\n    (input.includes('\\n  ') && !/\\binsert\\b/i.test(input) && !/\\border\\b/i.test(input));\n\n  if (isExplicit) {\n    return parseExplicitBPlusTree(cleanInput, title, bidirectional, notes, extraMeta);\n  }\n\n  return buildAlgorithmicBPlusTree(cleanInput, title, bidirectional, notes, extraMeta);\n}\n\n/**\n * Algorithmic value-driven B+ tree builder.\n */\nfunction buildAlgorithmicBPlusTree(\n  input: string,\n  title?: string,\n  bidirectional?: boolean,\n  notes?: readonly BPlusTreeNote[],\n  extraMeta?: Record<string, unknown>,\n): BPlusTreeDocument {\n  const orderMatch = input.match(/order\\s+(\\d+)/i);\n  const order = Math.max(3, orderMatch ? Number(orderMatch[1]) : 3);\n  const afterOrder = input.replace(/order\\s+\\d+/i, '').replace(/insert/gi, '');\n  const keys = (afterOrder.match(/-?\\d+/g) ?? []).map(Number);\n\n  if (keys.length === 0) {\n    return {\n      version: '1.0',\n      metadata: title ? { title } : {},\n      direction: 'TB',\n      nodes: [],\n      ...(bidirectional ? { bidirectionalLeaves: true } : {}),\n      ...(notes && notes.length > 0 ? { notes } : {}),\n    };\n  }\n\n  let root: BPlusNode = {\n    isLeaf: true,\n    keys: [],\n    next: null,\n    prev: null,\n  };\n\n  for (const k of keys) {\n    const split = insertBPlus(root, k, order);\n    if (split) {\n      root = {\n        isLeaf: false,\n        keys: [split.upKey],\n        children: [root, split.rightChild],\n      };\n    }\n  }\n\n  let internalCount = 1;\n  let leafCount = 1;\n  const nodes: BPlusTreeNode[] = [];\n\n  const emit = (n: BPlusNode): string => {\n    if (n.isLeaf) {\n      const pageId = `L${leafCount++}`;\n      const id = `leaf_${pageId}`;\n      nodes.push({\n        id,\n        label: n.keys.join(' | '),\n        kinds: ['strip', 'leaf'],\n        pageId,\n        isLeaf: true,\n        children: [],\n      });\n      return id;\n    }\n\n    const pageId = `P${internalCount++}`;\n    const id = `page_${pageId}`;\n    const childIds: string[] = [];\n    for (const c of n.children) {\n      childIds.push(emit(c));\n    }\n    nodes.push({\n      id,\n      label: n.keys.join(' | '),\n      kinds: ['strip', 'internal'],\n      pageId,\n      isLeaf: false,\n      children: childIds,\n    });\n    return id;\n  };\n\n  emit(root);\n\n  return {\n    version: '1.0',\n    metadata: title ? { title } : {},\n    direction: 'TB',\n    nodes,\n    ...(bidirectional ? { bidirectionalLeaves: true } : {}),\n    ...(notes && notes.length > 0 ? { notes } : {}),\n  };\n}\n\n/**\n * Parse manual/explicit B+ tree definitions.\n */\nfunction parseExplicitBPlusTree(\n  input: string,\n  title?: string,\n  bidirectional?: boolean,\n  notes?: readonly BPlusTreeNote[],\n  extraMeta?: Record<string, unknown>,\n): BPlusTreeDocument {\n  const nodes: BPlusTreeNode[] = [];\n  const lines = input.split(/\\r?\\n/).filter((l) => l.trim().length > 0);\n\n  const isStatementSyntax = lines.some((l) => l.includes('->'));\n\n  if (isStatementSyntax) {\n    const rawNodes = new Map<\n      string,\n      { id: string; label: string; pageId?: string | undefined; isLeaf: boolean; children: string[] }\n    >();\n\n    for (const line of lines) {\n      const trimmed = line.trim();\n      if (!trimmed) continue;\n\n      const isLeafDecl = /^leaf\\b/i.test(trimmed);\n      const isPageDecl = /^page\\b/i.test(trimmed);\n      const cleanLine = trimmed.replace(/^(page|leaf|node)\\s+/i, '');\n\n      const arrowIdx = cleanLine.indexOf('->');\n      const declPart = arrowIdx >= 0 ? cleanLine.slice(0, arrowIdx).trim() : cleanLine;\n      const targetsPart = arrowIdx >= 0 ? cleanLine.slice(arrowIdx + 2).trim() : '';\n\n      let label = '';\n      let id = '';\n      let pageId: string | undefined;\n\n      const bracketMatch = declPart.match(/\\[(.*?)\\]/);\n      const quoteMatch = declPart.match(/\"(.*?)\"/);\n      if (bracketMatch) {\n        label = bracketMatch[1]!.replace(/\\s*\\|\\s*/g, ' | ').trim();\n        id = declPart.slice(0, bracketMatch.index).trim();\n      } else if (quoteMatch) {\n        label = quoteMatch[1]!.replace(/\\s*\\|\\s*/g, ' | ').trim();\n        id = declPart.slice(0, quoteMatch.index).trim();\n      } else {\n        const parts = declPart.split(/\\s+/);\n        id = parts[0]!;\n        label = parts.slice(1).join(' | ');\n      }\n\n      if (!id) id = `n${rawNodes.size + 1}`;\n      pageId = id;\n\n      const children = targetsPart\n        ? targetsPart\n            .split(/[,;\\s]+/)\n            .map((s) => s.trim())\n            .filter(Boolean)\n        : [];\n\n      const isLeaf = isLeafDecl || (children.length === 0 && !isPageDecl);\n\n      rawNodes.set(id, {\n        id,\n        label: label || id,\n        pageId,\n        isLeaf,\n        children,\n      });\n    }\n\n    for (const raw of rawNodes.values()) {\n      nodes.push({\n        id: raw.id,\n        label: raw.label,\n        kinds: raw.isLeaf ? ['strip', 'leaf'] : ['strip', 'internal'],\n        ...(raw.pageId ? { pageId: raw.pageId } : {}),\n        isLeaf: raw.isLeaf,\n        children: raw.children,\n      });\n    }\n  } else {\n    // Indentation-based tree parsing\n    const rawLines = lines.map((l) => {\n      const indent = l.search(/\\S|$/);\n      const content = l.trim();\n      return { indent, content };\n    });\n\n    const stack: { indent: number; id: string }[] = [];\n    rawLines.forEach((ln, idx) => {\n      while (stack.length > 0 && stack[stack.length - 1]!.indent >= ln.indent) stack.pop();\n      const parent = stack.length > 0 ? stack[stack.length - 1] : undefined;\n\n      let content = ln.content;\n      let isLeaf = false;\n      let pageId: string | undefined;\n\n      const attrMatch = content.match(/\\{(.*?)\\}/);\n      if (attrMatch) {\n        const attrStr = attrMatch[1]!;\n        if (/\\bleaf\\s*:\\s*true\\b/i.test(attrStr) || /\\bleaf\\b/i.test(attrStr)) isLeaf = true;\n        const pageMatch = attrStr.match(/page\\s*:\\s*[\"']?([^\"',}]+)[\"']?/i);\n        const idMatch = attrStr.match(/id\\s*:\\s*[\"']?([^\"',}]+)[\"']?/i);\n        if (pageMatch) pageId = pageMatch[1]!.trim();\n        else if (idMatch) pageId = idMatch[1]!.trim();\n        content = content.replace(/\\{.*?\\}/, '').trim();\n      }\n\n      const bracketMatch = content.match(/^(\\w+)?\\s*\\[(.*?)\\]/);\n      let label = content;\n      if (bracketMatch) {\n        label = bracketMatch[2]!;\n        if (bracketMatch[1] && !pageId) pageId = bracketMatch[1];\n      }\n      const id = pageId || `bn_${idx + 1}`;\n      if (!parent && rawLines.length === 1) isLeaf = true;\n\n      nodes.push({\n        id,\n        label: label.replace(/\\s*\\|\\s*/g, ' | '),\n        kinds: isLeaf ? ['strip', 'leaf'] : ['strip', 'internal'],\n        ...(pageId ? { pageId } : {}),\n        isLeaf,\n        children: [],\n      });\n\n      if (parent) {\n        const pNode = nodes.find((n) => n.id === parent.id);\n        if (pNode) {\n          (pNode.children as string[]).push(id);\n          (pNode as any).isLeaf = false;\n        }\n      }\n\n      stack.push({ indent: ln.indent, id });\n    });\n\n    for (const node of nodes) {\n      if (node.children.length === 0) {\n        (node as any).isLeaf = true;\n        if (!node.kinds.includes('leaf')) {\n          (node as any).kinds = ['strip', 'leaf'];\n        }\n      }\n    }\n  }\n\n  return {\n    version: '1.0',\n    metadata: { ...(title ? { title } : {}), ...(extraMeta ?? {}) },\n    direction: 'TB',\n    nodes,\n    ...(bidirectional ? { bidirectionalLeaves: true } : {}),\n    ...(notes && notes.length > 0 ? { notes } : {}),\n  };\n}\n\n// \u2500\u2500\u2500 Layout & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ARROW_ID = 'bplus-arrow';\nconst ARROW_START_ID = 'bplus-arrow-start';\nconst TREE_ARROW_ID = 'bplus-tree-arrow';\nconst NOTE_ARROW_ID = 'bplus-note-arrow';\n\n/** Split a `a | b | c` strip label into per-key cells with measured widths. */\nfunction stripCells(label: string, font: number, isCompact = false): { key: string; width: number }[] {\n  return label\n    .split('|')\n    .map((s) => s.trim())\n    .map((key) => ({\n      key,\n      width: Math.max(measureText(key, isCompact ? font - 2 : font).width + (isCompact ? 14 : 24), isCompact ? 28 : 40),\n    }));\n}\n\n/**\n * Layout and render a B+ Tree diagram.\n */\nexport function layoutBPlusTree(ir: BPlusTreeDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  if (ir.nodes.length === 0) {\n    const scene: Scene = {\n      viewBox: { x: 0, y: 0, width: 120, height: 80 },\n      background: palette.background,\n      elements: [],\n    };\n    return { scene, anchors: {} };\n  }\n\n  const isCompact =\n    ir.metadata['compact'] === true ||\n    ir.metadata['layout'] === 'compact' ||\n    String(ir.metadata['compact']) === 'true';\n\n  // 1. Measure all nodes\n  const sizes = new Map<string, { width: number; height: number }>();\n  const isLeafNode = new Map<string, boolean>();\n\n  for (const node of ir.nodes) {\n    const isLeaf = Boolean(node.isLeaf || node.children.length === 0 || node.kinds.includes('leaf'));\n    isLeafNode.set(node.id, isLeaf);\n\n    const cells = stripCells(node.label, font, isCompact);\n    const width = cells.reduce((sum, c) => sum + c.width, 0);\n    const height = (isCompact ? font - 2 : font) + (isCompact ? 16 : 22);\n    sizes.set(node.id, { width, height });\n  }\n\n  // 2. Perform tidy tree hierarchy placement\n  const inputs: TreeNodeInput[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: sizes.get(n.id)!.width,\n    height: sizes.get(n.id)!.height,\n    children: n.children,\n  }));\n\n  const placed = treeLayout(inputs, {\n    direction: (ir.metadata['direction'] as 'TB' | 'LR') ?? ir.direction ?? 'TB',\n    levelGap: isCompact ? 42 : 68,\n    siblingGap: isCompact ? 16 : 38,\n    margin,\n  });\n\n  const titleH = ir.metadata['title'] ? typography.titleFontSize + 24 : 0;\n\n  // 3. Same-Rank Leaf Alignment: Ensure all leaves share the exact same baseline Y\n  const leafIds = ir.nodes.filter((n) => isLeafNode.get(n.id)).map((n) => n.id);\n  const leafBoxes = leafIds.map((id) => placed.boxes.get(id)).filter(Boolean);\n  const maxLeafY = leafBoxes.length > 0 ? Math.max(...leafBoxes.map((b) => b!.y)) : 0;\n\n  // Adjust boxes for title offset and leaf alignment\n  const adjustedBoxes = new Map<string, { x: number; y: number; width: number; height: number }>();\n  for (const node of ir.nodes) {\n    const b = placed.boxes.get(node.id)!;\n    const isLeaf = isLeafNode.get(node.id);\n    const y = (isLeaf && maxLeafY > 0 ? maxLeafY : b.y) + titleH;\n    adjustedBoxes.set(node.id, { x: b.x, y, width: b.width, height: b.height });\n  }\n\n  const box = (id: string) => adjustedBoxes.get(id)!;\n\n  const elements: SceneElement[] = [];\n\n  // Title\n  if (titleH > 0) {\n    elements.push(\n      p.text(\n        String(ir.metadata['title']),\n        placed.width / 2,\n        margin + typography.titleFontSize,\n        typography.titleFontSize + 2,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  // 4. Render Hierarchical Parent -> Child Edges (Slots Originating from Keys / Dividers)\n  for (const node of ir.nodes) {\n    const pb = box(node.id);\n    const cells = stripCells(node.label, font);\n    const childCount = node.children.length;\n\n    node.children.forEach((cid, cIdx) => {\n      const cb = box(cid);\n      let startX: number;\n\n      // In B+ trees, an internal node with k keys has k+1 child pointers:\n      // Pointer 0: left corner\n      // Pointer 1..k-1: dividers between keys\n      // Pointer k: right corner\n      if (childCount === cells.length + 1) {\n        if (cIdx === 0) {\n          startX = pb.x;\n        } else if (cIdx === childCount - 1) {\n          startX = pb.x + pb.width;\n        } else {\n          let curX = pb.x;\n          for (let j = 0; j < cIdx; j++) {\n            curX += cells[j]!.width;\n          }\n          startX = curX;\n        }\n      } else {\n        const { start } = connectSlots(pb, cb);\n        startX = start.x;\n      }\n\n      const startY = pb.y + pb.height;\n      const endX = cb.x + cb.width / 2;\n      const endY = cb.y;\n\n      elements.push(\n        p.path(\n          `M ${rhu(startX)} ${rhu(startY)} L ${rhu(endX)} ${rhu(endY)}`,\n          palette.textMuted,\n          1.5,\n          {\n            markerEnd: TREE_ARROW_ID,\n          },\n        ),\n      );\n    });\n  }\n\n  // 5. Render Ordered Sibling Pointers Between Leaves (constraint=false)\n  // Sort leaves by their X coordinate to guarantee left-to-right chain\n  const sortedLeaves = [...leafIds].sort((a, b) => box(a).x - box(b).x);\n\n  for (let i = 0; i < sortedLeaves.length - 1; i++) {\n    const curId = sortedLeaves[i]!;\n    const nextId = sortedLeaves[i + 1]!;\n    const curBox = box(curId);\n    const nextBox = box(nextId);\n\n    const startX = curBox.x + curBox.width;\n    const startY = curBox.y + curBox.height / 2;\n    const endX = nextBox.x;\n    const endY = nextBox.y + nextBox.height / 2;\n\n    if (endX > startX + 2) {\n      elements.push(\n        p.path(\n          `M ${rhu(startX)} ${rhu(startY)} L ${rhu(endX)} ${rhu(endY)}`,\n          palette.primary,\n          1.5,\n          {\n            markerEnd: ARROW_ID,\n            ...(ir.bidirectionalLeaves ? { markerStart: ARROW_START_ID } : {}),\n          },\n        ),\n      );\n    }\n  }\n\n  // 6. Render Nodes (Strips with Cells and Clean Header Subtitles)\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n    const isLeaf = isLeafNode.get(node.id);\n\n    const fill = palette.surface;\n    const stroke = isLeaf ? palette.primary : palette.border;\n    const strokeWidth = isLeaf ? 1.8 : 1.5;\n\n    // Outer node card\n    elements.push(p.rect(b, fill, stroke, strokeWidth, { rx: 4 }));\n\n    // Internal cell dividers and key labels\n    let sx = b.x;\n    const cells = stripCells(node.label, font);\n    cells.forEach((cell, idx) => {\n      if (idx > 0) {\n        elements.push(\n          p.path(`M ${rhu(sx)} ${rhu(b.y)} L ${rhu(sx)} ${rhu(b.y + b.height)}`, stroke, 1),\n        );\n      }\n      elements.push(\n        p.text(\n          cell.key,\n          rhu(sx + cell.width / 2),\n          rhu(b.y + b.height / 2 + font * 0.35),\n          font,\n          palette.text,\n          { anchor: 'middle', weight: 'bold' },\n        ),\n      );\n      sx += cell.width;\n    });\n\n    // Clean text header above the node (e.g. `internal node` or `leaf`)\n    const headerLabel =\n      node.badge ??\n      (node.pageId && !node.pageId.startsWith('n') && !node.pageId.startsWith('l') && !node.pageId.startsWith('p')\n        ? node.pageId\n        : isLeaf\n          ? 'leaf'\n          : 'internal node');\n\n    if (headerLabel) {\n      elements.push(\n        p.text(\n          headerLabel,\n          rhu(b.x + b.width / 2),\n          rhu(b.y - 7),\n          smallFont,\n          isLeaf ? palette.primary : palette.textMuted,\n          { anchor: 'middle', weight: 'normal' },\n        ),\n      );\n    }\n  }\n\n  // 7. Render Explanatory Notes & Callout Arrows (if specified)\n  const rootNode = ir.nodes.find((n) => !isLeafNode.get(n.id)) ?? ir.nodes[0];\n  const rootBox = rootNode ? box(rootNode.id) : undefined;\n  let extraBottomH = 0;\n  let extraRightW = 0;\n\n  if (ir.notes && ir.notes.length > 0) {\n    for (const note of ir.notes) {\n      if ((note.target === 'internal' || note.target === 'root') && rootBox) {\n        // Annotation on top-right of root\n        const noteX = rootBox.x + rootBox.width + 48;\n        const noteY = rootBox.y - 2;\n        extraRightW = Math.max(extraRightW, measureText(note.text, smallFont).width + 60);\n\n        elements.push(\n          p.text(note.text, rhu(noteX), rhu(noteY), smallFont, palette.textMuted, {\n            anchor: 'start',\n          }),\n        );\n        // Callout arrow pointing from note to right edge of internal node\n        elements.push(\n          p.path(\n            `M ${rhu(noteX - 6)} ${rhu(noteY - 4)} L ${rhu(rootBox.x + rootBox.width + 4)} ${rhu(rootBox.y + rootBox.height / 2)}`,\n            palette.textMuted,\n            1.2,\n            { markerEnd: NOTE_ARROW_ID },\n          ),\n        );\n      } else if (note.target === 'leaves' || note.target === 'leaf' || note.target === 'data') {\n        // Annotation below the linked leaves\n        const leafH = sizes.get(leafIds[0] ?? '')?.height ?? 34;\n        const noteY = maxLeafY + leafH + titleH + 34;\n        const noteX = placed.width / 2;\n        extraBottomH = Math.max(extraBottomH, 48);\n\n        elements.push(\n          p.text(note.text, rhu(noteX), rhu(noteY), smallFont, palette.textMuted, {\n            anchor: 'middle',\n          }),\n        );\n        // Curved arc arrow above the text indicating the leaf scan chain\n        const arcStart = noteX - 80;\n        const arcEnd = noteX + 80;\n        const arcMidY = noteY - 14;\n        elements.push(\n          p.path(\n            `M ${rhu(arcStart)} ${rhu(arcMidY)} Q ${rhu(noteX)} ${rhu(arcMidY + 10)} ${rhu(arcEnd)} ${rhu(arcMidY)}`,\n            palette.textMuted,\n            1.2,\n            { markerEnd: NOTE_ARROW_ID },\n          ),\n        );\n      }\n    }\n  }\n\n  // 8. Node Anchor Registry for Poster Cross-linking\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> =\n    {};\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n    anchors[node.id] = { bounds: b };\n    if (node.pageId) {\n      anchors[node.pageId] = { bounds: b };\n      anchors[`page_${node.pageId}`] = { bounds: b };\n      anchors[`leaf_${node.pageId}`] = { bounds: b };\n    }\n  }\n\n  // 9. Dynamic Arrowhead Marker Definitions\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n    `<marker id=\"${ARROW_START_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"1\" refY=\"${sMidY}\" orient=\"auto-start-reverse\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n    `<marker id=\"${TREE_ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n    `<marker id=\"${NOTE_ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n  ];\n\n  const totalH = rhuInt(maxLeafY + (sizes.get(leafIds[0] ?? '')?.height ?? 34) + margin * 2 + titleH + extraBottomH);\n  const totalW = rhuInt(placed.width + extraRightW);\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\n// \u2500\u2500\u2500 Module Export \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const bplustree: DiagramModule<BPlusTreeDocument> = {\n  parseMermaid: buildBPlusTree,\n  parseYaml: (input) => JSON.parse(input) as BPlusTreeDocument,\n  layout: (ir: BPlusTreeDocument, theme: ResolvedTheme): LayoutResult =>\n    layoutBPlusTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/merkletree.ts \u2014 Merkle Tree (Cryptographic Hash Tree) diagram module.\n *\n * Characteristics:\n *   1. Leaf nodes store raw data blocks (e.g., Transactions) and their computed hashes H(Data).\n *   2. Internal nodes store concatenated cryptographic parent hashes H(Left || Right).\n *   3. The top node is the Merkle Root.\n *   4. Supports `proof <target>` or `verify <target>` to visually highlight the\n *      Merkle Audit Path (the leaf, intermediate sibling hashes, and path to root).\n *   5. Supports both automatic hashing from `data D1 D2 D3 ...` and explicit manual tree authoring.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport type { BaseIR } from '../../../../contracts/diagram.js';\nimport { treeLayout, type TreeNodeInput } from '../../../../graph/tree.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { pen } from '../../../../scene/build.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../../util/round.js';\n\n// Simple deterministic hash helper for visual mock-ups (produces clean 8-char hex string)\nfunction mockHash(input: string): string {\n  let h = 0x811c9dc5;\n  for (let i = 0; i < input.length; i++) {\n    h ^= input.charCodeAt(i);\n    h = Math.imul(h, 0x01000193);\n  }\n  return (h >>> 0).toString(16).padStart(8, '0').slice(0, 8);\n}\n\nexport interface MerkleNode {\n  readonly id: string;\n  readonly hash: string;\n  readonly data?: string | undefined;\n  readonly isLeaf: boolean;\n  readonly isRoot?: boolean | undefined;\n  readonly isProof?: boolean | undefined;\n  readonly isProofSibling?: boolean | undefined;\n  readonly children: readonly string[];\n}\n\nexport interface MerkleTreeDocument extends BaseIR {\n  readonly title?: string | undefined;\n  readonly nodes: readonly MerkleNode[];\n  readonly proofTarget?: string | undefined;\n}\n\nexport function buildMerkleTree(input: string): MerkleTreeDocument {\n  const lines = input\n    .split(/\\r?\\n/)\n    .map((l) => l.trim())\n    .filter(Boolean);\n\n  let title: string | undefined;\n  let proofTarget: string | undefined;\n  let compact = false;\n  let maxWidth: number | undefined;\n  let direction: 'TB' | 'LR' | undefined;\n  const dataItems: string[] = [];\n  const manualLines: string[] = [];\n\n  for (const line of lines) {\n    if (/^merkletree\\b/i.test(line)) continue;\n\n    const titleMatch = line.match(/^title\\s+(.+)$/i);\n    if (titleMatch) {\n      title = titleMatch[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n\n    const proofMatch = line.match(/^(proof|verify)\\s+(.+)$/i);\n    if (proofMatch) {\n      proofTarget = proofMatch[2]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n\n    const compactMatch = line.match(/^(layout\\s+compact|compact\\s*(true)?|compact)\\b/i);\n    if (compactMatch) {\n      compact = true;\n      continue;\n    }\n\n    const maxWidthMatch = line.match(/^max-?width\\s+(\\d+)/i);\n    if (maxWidthMatch) {\n      maxWidth = Number(maxWidthMatch[1]);\n      compact = true;\n      continue;\n    }\n\n    const dirMatch = line.match(/^direction\\s+(TD|TB|LR)/i);\n    if (dirMatch) {\n      direction = dirMatch[1] === 'LR' ? 'LR' : 'TB';\n      continue;\n    }\n\n    const dataMatch = line.match(/^data\\s+(.+)$/i);\n    if (dataMatch) {\n      const items = dataMatch[1]!.match(/\"([^\"]+)\"|'([^']+)'|(\\S+)/g) ?? [];\n      for (const item of items) {\n        dataItems.push(item.replace(/^[\"']|[\"']$/g, ''));\n      }\n      continue;\n    }\n\n    manualLines.push(line);\n  }\n\n  const extraMeta: Record<string, unknown> = {\n    ...(compact ? { compact: true } : {}),\n    ...(maxWidth !== undefined ? { maxWidth } : {}),\n    ...(direction ? { direction } : {}),\n  };\n\n  if (dataItems.length > 0) {\n    return buildAlgorithmicMerkleTree(dataItems, title, proofTarget, extraMeta);\n  }\n\n  return parseExplicitMerkleTree(manualLines.join('\\n'), title, proofTarget, extraMeta);\n}\n\nfunction buildAlgorithmicMerkleTree(\n  dataItems: string[],\n  title?: string,\n  proofTarget?: string,\n  extraMeta?: Record<string, unknown>,\n): MerkleTreeDocument {\n  // Ensure power of 2 by duplicating last element if needed\n  const leaves = [...dataItems];\n  while ((leaves.length & (leaves.length - 1)) !== 0 || leaves.length < 2) {\n    leaves.push(leaves[leaves.length - 1]!);\n  }\n\n  interface TempNode {\n    id: string;\n    hash: string;\n    data?: string | undefined;\n    isLeaf: boolean;\n    children: TempNode[];\n  }\n\n  let currentLevel: TempNode[] = leaves.map((data, idx) => ({\n    id: `leaf_${idx}`,\n    hash: mockHash(`data:${data}`),\n    data,\n    isLeaf: true,\n    children: [],\n  }));\n\n  const allNodes: TempNode[] = [...currentLevel];\n  let levelIdx = 1;\n\n  while (currentLevel.length > 1) {\n    const nextLevel: TempNode[] = [];\n    for (let i = 0; i < currentLevel.length; i += 2) {\n      const left = currentLevel[i]!;\n      const right = currentLevel[i + 1] ?? left;\n      const combinedHash = mockHash(`${left.hash}+${right.hash}`);\n      const parentNode: TempNode = {\n        id: `node_${levelIdx}_${i / 2}`,\n        hash: combinedHash,\n        isLeaf: false,\n        children: [left, right],\n      };\n      nextLevel.push(parentNode);\n      allNodes.push(parentNode);\n    }\n    currentLevel = nextLevel;\n    levelIdx++;\n  }\n\n  const root = currentLevel[0]!;\n\n  // Mark proof path if requested\n  const proofNodes = new Set<string>();\n  const proofSiblings = new Set<string>();\n\n  if (proofTarget) {\n    // Find target leaf\n    const targetLeaf = allNodes.find(\n      (n) => n.isLeaf && (n.data === proofTarget || n.id === proofTarget || n.hash.startsWith(proofTarget)),\n    );\n    if (targetLeaf) {\n      let cur: TempNode | undefined = targetLeaf;\n      proofNodes.add(cur.id);\n\n      while (cur && cur.id !== root.id) {\n        const targetId: string = cur.id;\n        const parent: TempNode | undefined = allNodes.find((p: TempNode): boolean =>\n          p.children.some((c: TempNode): boolean => c.id === targetId),\n        );\n        if (parent) {\n          proofNodes.add(parent.id);\n          const sibling = parent.children.find((c: TempNode): boolean => c.id !== targetId);\n          if (sibling) proofSiblings.add(sibling.id);\n          cur = parent;\n        } else {\n          break;\n        }\n      }\n    }\n  }\n\n  const nodes: MerkleNode[] = allNodes.map((n) => ({\n    id: n.id,\n    hash: n.hash,\n    ...(n.data ? { data: n.data } : {}),\n    isLeaf: n.isLeaf,\n    ...(n.id === root.id ? { isRoot: true } : {}),\n    ...(proofNodes.has(n.id) ? { isProof: true } : {}),\n    ...(proofSiblings.has(n.id) ? { isProofSibling: true } : {}),\n    children: n.children.map((c) => c.id),\n  }));\n\n  return {\n    version: '1.0',\n    metadata: { ...(title ? { title } : {}), ...(extraMeta ?? {}) },\n    ...(title ? { title } : {}),\n    ...(proofTarget ? { proofTarget } : {}),\n    nodes,\n  };\n}\n\nfunction parseExplicitMerkleTree(\n  input: string,\n  title?: string,\n  proofTarget?: string,\n  extraMeta?: Record<string, unknown>,\n): MerkleTreeDocument {\n  const lines = input.split(/\\r?\\n/).filter((l) => l.trim().length > 0);\n  const nodes: MerkleNode[] = [];\n\n  for (const line of lines) {\n    const isLeaf = /^leaf\\b/i.test(line);\n    const isRoot = /^root\\b/i.test(line);\n    const clean = line.replace(/^(root|leaf|node)\\s+/i, '');\n\n    const arrowIdx = clean.indexOf('->');\n    const decl = arrowIdx >= 0 ? clean.slice(0, arrowIdx).trim() : clean;\n    const targets = arrowIdx >= 0 ? clean.slice(arrowIdx + 2).trim().split(/[,;\\s]+/).filter(Boolean) : [];\n\n    const bracketMatch = decl.match(/\\[(.*?)\\]/);\n    let id = '';\n    let hash = '';\n    let data: string | undefined;\n\n    if (bracketMatch) {\n      id = decl.slice(0, bracketMatch.index).trim();\n      const content = bracketMatch[1]!.trim();\n      if (content.includes(':')) {\n        const parts = content.split(':');\n        hash = parts[0]!.trim();\n        data = parts[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      } else {\n        hash = content;\n      }\n    } else {\n      const parts = decl.split(/\\s+/);\n      id = parts[0]!;\n      hash = parts[1] ?? mockHash(id);\n    }\n\n    if (!id) id = `m_${nodes.length + 1}`;\n\n    nodes.push({\n      id,\n      hash,\n      ...(data ? { data } : {}),\n      isLeaf: isLeaf || targets.length === 0,\n      ...(isRoot ? { isRoot: true } : {}),\n      children: targets,\n    });\n  }\n\n  return {\n    version: '1.0',\n    metadata: { ...(title ? { title } : {}), ...(extraMeta ?? {}) },\n    ...(title ? { title } : {}),\n    ...(proofTarget ? { proofTarget } : {}),\n    nodes,\n  };\n}\n\n// \u2500\u2500\u2500 Layout & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ARROW_ID = 'merkle-arrow';\nconst PROOF_ARROW_ID = 'merkle-proof-arrow';\n\nexport function layoutMerkleTree(ir: MerkleTreeDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  if (ir.nodes.length === 0) {\n    const scene: Scene = {\n      viewBox: { x: 0, y: 0, width: 140, height: 90 },\n      background: palette.background,\n      elements: [],\n    };\n    return { scene, anchors: {} };\n  }\n\n  const isCompact =\n    ir.metadata['compact'] === true ||\n    ir.metadata['layout'] === 'compact' ||\n    String(ir.metadata['compact']) === 'true';\n\n  const sizes = new Map<string, { width: number; height: number }>();\n  for (const node of ir.nodes) {\n    const hashLabel = isCompact ? node.hash.slice(0, 6) : `hash: ${node.hash.slice(0, 8)}`;\n    const dataLabel = node.data ? (isCompact ? node.data : `data: ${node.data}`) : undefined;\n    const w = isCompact\n      ? Math.max(\n          measureText(hashLabel, smallFont - 1).width + 16,\n          dataLabel ? measureText(dataLabel, smallFont - 1).width + 16 : 0,\n          56,\n        )\n      : Math.max(\n          measureText(hashLabel, smallFont).width + 24,\n          dataLabel ? measureText(dataLabel, smallFont).width + 24 : 0,\n          100,\n        );\n    const h = node.data ? (isCompact ? 40 : 48) : (isCompact ? 28 : 36);\n    sizes.set(node.id, { width: w, height: h });\n  }\n\n  const inputs: TreeNodeInput[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: sizes.get(n.id)!.width,\n    height: sizes.get(n.id)!.height,\n    children: n.children,\n  }));\n\n  const placed = treeLayout(inputs, {\n    direction: (ir.metadata['direction'] as 'TB' | 'LR') ?? 'TB',\n    levelGap: isCompact ? 36 : 52,\n    siblingGap: isCompact ? 10 : 24,\n    margin,\n  });\n\n  const titleH = ir.metadata['title'] ? typography.titleFontSize + 24 : 0;\n  const box = (id: string) => {\n    const b = placed.boxes.get(id)!;\n    return { x: b.x, y: b.y + titleH, width: b.width, height: b.height };\n  };\n\n  const elements: SceneElement[] = [];\n\n  // Title\n  if (titleH > 0) {\n    elements.push(\n      p.text(\n        String(ir.metadata['title']),\n        placed.width / 2,\n        margin + typography.titleFontSize,\n        typography.titleFontSize + 2,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  // 1. Edges\n  for (const node of ir.nodes) {\n    const pb = box(node.id);\n    for (const cid of node.children) {\n      const cb = box(cid);\n      const childNode = ir.nodes.find((n) => n.id === cid);\n      const isProofEdge = node.isProof && childNode?.isProof;\n\n      const stroke = isProofEdge ? palette.primary : palette.textMuted;\n      const strokeWidth = isProofEdge ? 2.2 : 1.5;\n      const marker = isProofEdge ? PROOF_ARROW_ID : ARROW_ID;\n\n      elements.push(\n        p.path(\n          `M ${rhu(pb.x + pb.width / 2)} ${rhu(pb.y + pb.height)} L ${rhu(cb.x + cb.width / 2)} ${rhu(cb.y)}`,\n          stroke,\n          strokeWidth,\n          { markerEnd: marker },\n        ),\n      );\n    }\n  }\n\n  // 2. Nodes\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n\n    let fill = palette.surface;\n    let stroke = palette.border;\n    let strokeWidth = 1.5;\n\n    if (node.isRoot) {\n      stroke = palette.primary;\n      strokeWidth = 2.0;\n    }\n    if (node.isProof) {\n      fill = palette.surface;\n      stroke = palette.primary;\n      strokeWidth = 2.4;\n    } else if (node.isProofSibling) {\n      stroke = palette.secondary ?? palette.primary;\n      strokeWidth = 1.8;\n    }\n\n    // Card rect\n    elements.push(p.rect(b, fill, stroke, strokeWidth, { rx: isCompact ? 4 : 6 }));\n\n    // Hash text\n    const hashText = isCompact ? node.hash.slice(0, 6) : node.hash.slice(0, 8);\n    const hashY = node.data\n      ? isCompact\n        ? b.y + 14\n        : b.y + 18\n      : b.y + b.height / 2 + (isCompact ? smallFont - 1 : smallFont) * 0.35;\n\n    elements.push(\n      p.text(\n        hashText,\n        rhu(b.x + b.width / 2),\n        rhu(hashY),\n        isCompact ? smallFont - 1 : smallFont,\n        palette.text,\n        { anchor: 'middle', weight: node.isRoot || node.isProof ? 'bold' : 'normal' },\n      ),\n    );\n\n    // Data text & divider (if leaf with data)\n    if (node.data) {\n      const dataText = isCompact ? node.data : `data: ${node.data}`;\n      const divY = isCompact ? b.y + 22 : b.y + 28;\n      elements.push(\n        p.path(`M ${rhu(b.x)} ${rhu(divY)} L ${rhu(b.x + b.width)} ${rhu(divY)}`, stroke, 1),\n      );\n      elements.push(\n        p.text(\n          dataText,\n          rhu(b.x + b.width / 2),\n          rhu(divY + (isCompact ? 11 : 14)),\n          isCompact ? smallFont - 2 : smallFont - 1,\n          palette.textMuted,\n          { anchor: 'middle' },\n        ),\n      );\n    }\n\n    // Role Badges (Root / Proof / Sibling)\n    let badgeText: string | undefined;\n    let badgeColor = palette.primary;\n\n    if (node.isRoot) {\n      badgeText = 'ROOT';\n      badgeColor = palette.primary;\n    } else if (node.isProof) {\n      badgeText = 'VERIFY';\n      badgeColor = palette.primary;\n    } else if (node.isProofSibling) {\n      badgeText = 'SIBLING HASH';\n      badgeColor = palette.secondary ?? palette.textMuted;\n    }\n\n    if (badgeText) {\n      const bw = measureText(badgeText, smallFont - 2).width + 8;\n      const bh = 13;\n      const bx = b.x + b.width - bw - 4;\n      const by = b.y - bh / 2;\n\n      elements.push(\n        p.rect(\n          { x: rhu(bx), y: rhu(by), width: rhu(bw), height: bh },\n          palette.background,\n          badgeColor,\n          1,\n          { rx: 3 },\n        ),\n      );\n      elements.push(\n        p.text(\n          badgeText,\n          rhu(bx + bw / 2),\n          rhu(by + bh / 2 + (smallFont - 2) * 0.35),\n          smallFont - 2,\n          badgeColor,\n          { anchor: 'middle', weight: 'bold' },\n        ),\n      );\n    }\n  }\n\n  // 3. Dynamic markers\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n    `<marker id=\"${PROOF_ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n  ];\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n    anchors[node.id] = { bounds: b };\n    if (node.data) anchors[`data_${node.data}`] = { bounds: b };\n  }\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: rhuInt(placed.width), height: rhuInt(placed.height + titleH) },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const merkletree: DiagramModule<MerkleTreeDocument> = {\n  parseMermaid: buildMerkleTree,\n  parseYaml: (input) => JSON.parse(input) as MerkleTreeDocument,\n  layout: (ir: MerkleTreeDocument, theme: ResolvedTheme): LayoutResult => layoutMerkleTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/lsmtree.ts \u2014 Log-Structured Merge-Tree diagram module.\n *\n * Visualizes the tiered memory/disk architecture of modern LSM storage engines:\n *   - Memory Layer: Active MemTable, Immutable MemTable, Write-Ahead Log (WAL).\n *   - Disk Layer: Tiered SSTables across Level 0 (overlapping) and Level 1..k (non-overlapping).\n *   - Operations: Flush arrows and leveled Compaction arrows between SSTable blocks.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport type { BaseIR } from '../../../../contracts/diagram.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { pen } from '../../../../scene/build.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../../util/round.js';\n\nexport interface LsmMemtable {\n  readonly id: string;\n  readonly name: string;\n  readonly keys: readonly string[];\n  readonly isImmutable?: boolean | undefined;\n}\n\nexport interface LsmSst {\n  readonly id: string;\n  readonly range: string;\n  readonly size?: string | undefined;\n}\n\nexport interface LsmLevel {\n  readonly id: string;\n  readonly title: string;\n  readonly ssts: readonly LsmSst[];\n}\n\nexport interface LsmOperation {\n  readonly type: 'flush' | 'compact';\n  readonly from: string;\n  readonly to: string;\n  readonly label?: string | undefined;\n}\n\nexport interface LsmTreeDocument extends BaseIR {\n  readonly title?: string | undefined;\n  readonly wal?: string | undefined;\n  readonly memtables: readonly LsmMemtable[];\n  readonly levels: readonly LsmLevel[];\n  readonly operations: readonly LsmOperation[];\n}\n\nexport function buildLsmTree(input: string): LsmTreeDocument {\n  const lines = input.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean);\n\n  let title: string | undefined;\n  let wal: string | undefined;\n  const memtables: LsmMemtable[] = [];\n  const levels: LsmLevel[] = [];\n  const operations: LsmOperation[] = [];\n\n  let currentLevel: { id: string; title: string; ssts: LsmSst[] } | null = null;\n\n  for (const line of lines) {\n    if (/^lsmtree\\b/i.test(line)) continue;\n\n    const titleMatch = line.match(/^title\\s+(.+)$/i);\n    if (titleMatch) {\n      title = titleMatch[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n\n    const walMatch = line.match(/^wal\\s*(.*)$/i);\n    if (walMatch) {\n      wal = walMatch[1] ? walMatch[1].trim().replace(/^[\"']|[\"']$/g, '') : 'Write-Ahead Log (WAL)';\n      continue;\n    }\n\n    const memMatch = line.match(/^memtable\\s+(\\w+)\\s*(?:\"([^\"]+)\")?\\s*(?:\\[(.*?)\\])?/i);\n    if (memMatch) {\n      const id = memMatch[1]!;\n      const name = memMatch[2] ?? (id === 'immutable' ? 'Immutable MemTable' : 'Active MemTable');\n      const rawKeys = memMatch[3] ? memMatch[3].split('|').map((s) => s.trim()).filter(Boolean) : [];\n      memtables.push({\n        id,\n        name,\n        keys: rawKeys.length > 0 ? rawKeys : ['k1', 'k2', 'k3'],\n        ...(id.toLowerCase().includes('imm') ? { isImmutable: true } : {}),\n      });\n      continue;\n    }\n\n    const levelStart = line.match(/^level\\s+(\\w+)\\s*(?:\"([^\"]+)\")?/i);\n    if (levelStart) {\n      if (currentLevel) levels.push(currentLevel);\n      currentLevel = {\n        id: levelStart[1]!,\n        title: levelStart[2] ?? `Level ${levelStart[1]}`,\n        ssts: [],\n      };\n      continue;\n    }\n\n    if (/^end\\b/i.test(line) && currentLevel) {\n      levels.push(currentLevel);\n      currentLevel = null;\n      continue;\n    }\n\n    const sstMatch = line.match(/^sst\\s+(\\w+)\\s*(?:\\[(.*?)\\])?\\s*(?:\"([^\"]+)\")?/i);\n    if (sstMatch && currentLevel) {\n      currentLevel.ssts.push({\n        id: sstMatch[1]!,\n        range: sstMatch[2] ?? '0..100',\n        ...(sstMatch[3] ? { size: sstMatch[3] } : {}),\n      });\n      continue;\n    }\n\n    const flushMatch = line.match(/^flush\\s+(\\w+)\\s*->\\s*(\\w+)(?:\\s+\"([^\"]+)\")?/i);\n    if (flushMatch) {\n      operations.push({\n        type: 'flush',\n        from: flushMatch[1]!,\n        to: flushMatch[2]!,\n        ...(flushMatch[3] ? { label: flushMatch[3] } : {}),\n      });\n      continue;\n    }\n\n    const compactMatch = line.match(/^compact\\s+([\\w.]+)\\s*->\\s*([\\w.]+)(?:\\s+\"([^\"]+)\")?/i);\n    if (compactMatch) {\n      operations.push({\n        type: 'compact',\n        from: compactMatch[1]!,\n        to: compactMatch[2]!,\n        ...(compactMatch[3] ? { label: compactMatch[3] } : {}),\n      });\n      continue;\n    }\n  }\n\n  if (currentLevel) levels.push(currentLevel);\n\n  // Defaults if minimal input\n  if (memtables.length === 0) {\n    memtables.push(\n      { id: 'active', name: 'Active MemTable', keys: ['10', '25', '40'] },\n      { id: 'immutable', name: 'Immutable MemTable', keys: ['5', '18', '32'], isImmutable: true },\n    );\n  }\n  if (levels.length === 0) {\n    levels.push(\n      { id: 'L0', title: 'Level 0 (Overlapping)', ssts: [{ id: 's0_1', range: '1..50' }, { id: 's0_2', range: '25..75' }] },\n      { id: 'L1', title: 'Level 1 (Partitioned)', ssts: [{ id: 's1_1', range: '1..30' }, { id: 's1_2', range: '31..60' }, { id: 's1_3', range: '61..90' }] },\n    );\n  }\n\n  return {\n    version: '1.0',\n    metadata: title ? { title } : {},\n    ...(title ? { title } : {}),\n    ...(wal ? { wal } : {}),\n    memtables,\n    levels,\n    operations,\n  };\n}\n\nexport function layoutLsmTree(ir: LsmTreeDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  const elements: SceneElement[] = [];\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n\n  const titleH = ir.title ? typography.titleFontSize + 24 : 0;\n  let curY = margin + titleH;\n\n  const totalWidth = 680;\n  const contentWidth = totalWidth - margin * 2;\n\n  // Title\n  if (ir.title) {\n    elements.push(\n      p.text(\n        ir.title,\n        totalWidth / 2,\n        margin + typography.titleFontSize,\n        typography.titleFontSize + 2,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  // 1. Memory Layer Container\n  const memY = curY;\n  const memH = 100;\n\n  elements.push(\n    p.rect(\n      { x: margin, y: memY, width: contentWidth, height: memH },\n      palette.surface,\n      palette.primary,\n      1.5,\n      { rx: 8 },\n    ),\n  );\n\n  elements.push(\n    p.text(\n      'MEMORY BUFFER (DRAM)',\n      margin + 16,\n      memY + 18,\n      smallFont - 1,\n      palette.primary,\n      { weight: 'bold' },\n    ),\n  );\n\n  // WAL Card (if present)\n  let memCardsX = margin + 16;\n  if (ir.wal) {\n    const walW = 120;\n    const walH = 54;\n    const walBox = { x: memCardsX, y: memY + 30, width: walW, height: walH };\n    elements.push(p.rect(walBox, palette.background, palette.textMuted, 1.2, { rx: 4 }));\n    elements.push(\n      p.text('WAL Log', walBox.x + walW / 2, walBox.y + 22, smallFont, palette.text, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n    elements.push(\n      p.text('append-only', walBox.x + walW / 2, walBox.y + 40, smallFont - 2, palette.textMuted, {\n        anchor: 'middle',\n      }),\n    );\n    anchors['wal'] = { bounds: walBox };\n    memCardsX += walW + 16;\n  }\n\n  // Memtables\n  const memTableW = Math.min(220, (contentWidth - memCardsX + margin - 20) / ir.memtables.length);\n  const memBoxes = new Map<string, { x: number; y: number; width: number; height: number }>();\n\n  for (const mt of ir.memtables) {\n    const mtBox = { x: memCardsX, y: memY + 30, width: memTableW, height: 54 };\n    memBoxes.set(mt.id, mtBox);\n    anchors[mt.id] = { bounds: mtBox };\n\n    const stroke = mt.isImmutable ? palette.textMuted : palette.primary;\n    elements.push(p.rect(mtBox, palette.background, stroke, 1.5, { rx: 4 }));\n\n    elements.push(\n      p.text(mt.name, mtBox.x + 8, mtBox.y + 16, smallFont - 1, stroke, { weight: 'bold' }),\n    );\n\n    // Key cells\n    const cellW = (mtBox.width - 16) / mt.keys.length;\n    mt.keys.forEach((k, idx) => {\n      const cx = mtBox.x + 8 + idx * cellW;\n      const cy = mtBox.y + 24;\n      elements.push(\n        p.rect({ x: cx, y: cy, width: cellW, height: 22 }, palette.surface, palette.border, 1, {\n          rx: 2,\n        }),\n      );\n      elements.push(\n        p.text(k, cx + cellW / 2, cy + 15, smallFont - 1, palette.text, {\n          anchor: 'middle',\n          weight: 'bold',\n        }),\n      );\n    });\n\n    memCardsX += memTableW + 16;\n  }\n\n  curY += memH + 28;\n\n  // 2. Disk Storage Levels\n  const levelBoxes = new Map<string, { x: number; y: number; width: number; height: number }>();\n  const sstBoxes = new Map<string, { x: number; y: number; width: number; height: number }>();\n\n  for (const lvl of ir.levels) {\n    const lvlY = curY;\n    const lvlH = 68;\n    const lvlBox = { x: margin, y: lvlY, width: contentWidth, height: lvlH };\n    levelBoxes.set(lvl.id, lvlBox);\n    anchors[lvl.id] = { bounds: lvlBox };\n\n    elements.push(p.rect(lvlBox, palette.surface, palette.border, 1.2, { rx: 6 }));\n\n    // Level Title Tag\n    const tagW = measureText(lvl.title, smallFont).width + 16;\n    elements.push(\n      p.rect(\n        { x: margin + 12, y: lvlY + 10, width: tagW, height: 18 },\n        palette.background,\n        palette.textMuted,\n        1,\n        { rx: 3 },\n      ),\n    );\n    elements.push(\n      p.text(lvl.title, margin + 12 + tagW / 2, lvlY + 23, smallFont - 1, palette.textMuted, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n\n    // SSTable blocks\n    const sstStartX = margin + tagW + 28;\n    const availableW = contentWidth - (sstStartX - margin) - 16;\n    const sstW = Math.min(130, availableW / Math.max(1, lvl.ssts.length) - 12);\n\n    lvl.ssts.forEach((sst, idx) => {\n      const sx = sstStartX + idx * (sstW + 12);\n      const sy = lvlY + 12;\n      const sbox = { x: sx, y: sy, width: sstW, height: 44 };\n      sstBoxes.set(sst.id, sbox);\n      sstBoxes.set(`${lvl.id}.${sst.id}`, sbox);\n      anchors[sst.id] = { bounds: sbox };\n      anchors[`${lvl.id}.${sst.id}`] = { bounds: sbox };\n\n      elements.push(p.rect(sbox, palette.background, palette.primary, 1.5, { rx: 4 }));\n      elements.push(\n        p.text(`SST [${sst.range}]`, sx + sstW / 2, sy + 20, smallFont, palette.text, {\n          anchor: 'middle',\n          weight: 'bold',\n        }),\n      );\n      elements.push(\n        p.text(\n          sst.size ?? 'Immutable block',\n          sx + sstW / 2,\n          sy + 34,\n          smallFont - 2,\n          palette.textMuted,\n          { anchor: 'middle' },\n        ),\n      );\n    });\n\n    curY += lvlH + 20;\n  }\n\n  // 3. Operations & Compaction Arrows\n  const FLUSH_ARROW_ID = 'lsm-flush-arrow';\n  const COMPACT_ARROW_ID = 'lsm-compact-arrow';\n\n  for (const op of ir.operations) {\n    if (op.type === 'flush') {\n      const fromBox = memBoxes.get(op.from) ?? memBoxes.get('immutable') ?? memBoxes.get('active');\n      const toBox = levelBoxes.get(op.to) ?? levelBoxes.get('L0');\n      if (fromBox && toBox) {\n        const startX = fromBox.x + fromBox.width / 2;\n        const startY = fromBox.y + fromBox.height;\n        const endX = toBox.x + 60;\n        const endY = toBox.y;\n\n        elements.push(\n          p.path(\n            `M ${rhu(startX)} ${rhu(startY)} L ${rhu(endX)} ${rhu(endY)}`,\n            palette.primary,\n            1.8,\n            { markerEnd: FLUSH_ARROW_ID, dash: '3 3' },\n          ),\n        );\n      }\n    } else if (op.type === 'compact') {\n      const fromBox = sstBoxes.get(op.from) ?? levelBoxes.get(op.from);\n      const toBox = sstBoxes.get(op.to) ?? levelBoxes.get(op.to);\n      if (fromBox && toBox) {\n        const startX = fromBox.x + fromBox.width / 2;\n        const startY = fromBox.y + fromBox.height;\n        const endX = toBox.x + toBox.width / 2;\n        const endY = toBox.y;\n\n        elements.push(\n          p.path(\n            `M ${rhu(startX)} ${rhu(startY)} L ${rhu(endX)} ${rhu(endY)}`,\n            palette.secondary ?? palette.primary,\n            1.8,\n            { markerEnd: COMPACT_ARROW_ID },\n          ),\n        );\n      }\n    }\n  }\n\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n\n  const defs = [\n    `<marker id=\"${FLUSH_ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n    `<marker id=\"${COMPACT_ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.secondary ?? palette.primary}\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalWidth, height: rhuInt(curY + margin) },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const lsmtree: DiagramModule<LsmTreeDocument> = {\n  parseMermaid: buildLsmTree,\n  parseYaml: (input) => JSON.parse(input) as LsmTreeDocument,\n  layout: (ir: LsmTreeDocument, theme: ResolvedTheme): LayoutResult => layoutLsmTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/behaviortree.ts \u2014 Behavior Tree diagram module for AI & Robotics.\n *\n * Characteristics:\n *   1. Composite control flow nodes:\n *      - Selector / Fallback (`?`)\n *      - Sequence (`->` or `\u2192`)\n *      - Parallel (`||` or `\u21F6`)\n *   2. Decorator nodes (`invert`, `retry`, `repeat`, `timeout`).\n *   3. Leaf nodes:\n *      - Condition nodes (rounded pill cards)\n *      - Action nodes (rectangular task cards)\n *   4. Execution state badges (SUCCESS \u2713, RUNNING \u27F3, FAILURE \u2717, IDLE).\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport type { BaseIR } from '../../../../contracts/diagram.js';\nimport { treeLayout, type TreeNodeInput } from '../../../../graph/tree.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { pen } from '../../../../scene/build.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../../util/round.js';\n\nexport type BehaviorNodeKind = 'selector' | 'sequence' | 'parallel' | 'decorator' | 'condition' | 'action';\nexport type BehaviorStatus = 'success' | 'running' | 'failure' | 'idle';\n\nexport interface BehaviorTreeNode {\n  readonly id: string;\n  readonly label: string;\n  readonly kind: BehaviorNodeKind;\n  readonly status?: BehaviorStatus | undefined;\n  readonly decoratorType?: string | undefined;\n  readonly children: readonly string[];\n}\n\nexport interface BehaviorTreeDocument extends BaseIR {\n  readonly title?: string | undefined;\n  readonly nodes: readonly BehaviorTreeNode[];\n}\n\nexport function buildBehaviorTree(input: string): BehaviorTreeDocument {\n  const lines = input.split(/\\r?\\n/).filter((l) => l.trim().length > 0);\n  let title: string | undefined;\n  let compact = false;\n  let maxWidth: number | undefined;\n  let direction: 'TB' | 'LR' | undefined;\n  const filteredLines: { indent: number; text: string }[] = [];\n\n  for (const line of lines) {\n    const trimmed = line.trim();\n    if (/^behaviortree\\b/i.test(trimmed)) continue;\n\n    const titleMatch = trimmed.match(/^title\\s+(.+)$/i);\n    if (titleMatch) {\n      title = titleMatch[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n\n    const compactMatch = trimmed.match(/^(layout\\s+compact|compact\\s*(true)?|compact)\\b/i);\n    if (compactMatch) {\n      compact = true;\n      continue;\n    }\n\n    const maxWidthMatch = trimmed.match(/^max-?width\\s+(\\d+)/i);\n    if (maxWidthMatch) {\n      maxWidth = Number(maxWidthMatch[1]);\n      compact = true;\n      continue;\n    }\n\n    const dirMatch = trimmed.match(/^direction\\s+(TD|TB|LR)/i);\n    if (dirMatch) {\n      direction = dirMatch[1] === 'LR' ? 'LR' : 'TB';\n      continue;\n    }\n\n    const indent = line.search(/\\S|$/);\n    filteredLines.push({ indent, text: trimmed });\n  }\n\n  const nodes: BehaviorTreeNode[] = [];\n  const stack: { indent: number; id: string }[] = [];\n\n  filteredLines.forEach((item, idx) => {\n    const id = `bn_${idx + 1}`;\n    while (stack.length > 0 && stack[stack.length - 1]!.indent >= item.indent) {\n      stack.pop();\n    }\n    const parent = stack.length > 0 ? stack[stack.length - 1] : undefined;\n\n    let text = item.text;\n    let status: BehaviorStatus | undefined;\n    let kind: BehaviorNodeKind = 'action';\n    let decoratorType: string | undefined;\n\n    // Status attribute in { status: success }\n    const attrMatch = text.match(/\\{(.*?)\\}/);\n    if (attrMatch) {\n      const attrStr = attrMatch[1]!;\n      const statMatch = attrStr.match(/status\\s*:\\s*[\"']?(\\w+)[\"']?/i);\n      if (statMatch) {\n        status = statMatch[1]!.toLowerCase() as BehaviorStatus;\n      }\n      text = text.replace(/\\{.*?\\}/, '').trim();\n    }\n\n    // Determine kind from syntax markers\n    if (/^(\\?|fallback\\b|selector\\b)/i.test(text)) {\n      kind = 'selector';\n      text = text.replace(/^(\\?|fallback|selector)\\s*/i, '');\n    } else if (/^(->|\u2192|sequence\\b)/i.test(text)) {\n      kind = 'sequence';\n      text = text.replace(/^(->|\u2192|sequence)\\s*/i, '');\n    } else if (/^(\\|\\||\u21F6|parallel\\b)/i.test(text)) {\n      kind = 'parallel';\n      text = text.replace(/^(\\|\\||\u21F6|parallel)\\s*/i, '');\n    } else if (/^(decorator|invert|repeat|retry|timeout)\\b/i.test(text)) {\n      kind = 'decorator';\n      const decM = text.match(/^(\\w+)/);\n      decoratorType = decM ? decM[1] : 'decorator';\n      text = text.replace(/^(\\w+)\\s*/i, '');\n    } else if (text.startsWith('(') && text.endsWith(')')) {\n      kind = 'condition';\n      text = text.slice(1, -1).trim();\n    } else if (text.startsWith('[') && text.endsWith(']')) {\n      kind = 'action';\n      text = text.slice(1, -1).trim();\n    } else if (/^condition\\b/i.test(text)) {\n      kind = 'condition';\n      text = text.replace(/^condition\\s+/i, '');\n    } else if (/^action\\b/i.test(text)) {\n      kind = 'action';\n      text = text.replace(/^action\\s+/i, '');\n    }\n\n    const node: BehaviorTreeNode = {\n      id,\n      label: text.replace(/^[\"']+|[\"']+$/g, '').trim() || (kind === 'selector' ? '?' : kind === 'sequence' ? '\u2192' : 'Action'),\n      kind,\n      ...(status ? { status } : {}),\n      ...(decoratorType ? { decoratorType } : {}),\n      children: [],\n    };\n\n    nodes.push(node);\n\n    if (parent) {\n      const pNode = nodes.find((n) => n.id === parent.id);\n      if (pNode) {\n        (pNode.children as string[]).push(id);\n      }\n    }\n\n    stack.push({ indent: item.indent, id });\n  });\n\n  return {\n    version: '1.0',\n    metadata: {\n      ...(title ? { title } : {}),\n      ...(compact ? { compact: true } : {}),\n      ...(maxWidth !== undefined ? { maxWidth } : {}),\n      ...(direction ? { direction } : {}),\n    },\n    ...(title ? { title } : {}),\n    nodes,\n  };\n}\n\n// \u2500\u2500\u2500 Layout & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ARROW_ID = 'bt-arrow';\n\nexport function layoutBehaviorTree(ir: BehaviorTreeDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  if (ir.nodes.length === 0) {\n    const scene: Scene = {\n      viewBox: { x: 0, y: 0, width: 140, height: 90 },\n      background: palette.background,\n      elements: [],\n    };\n    return { scene, anchors: {} };\n  }\n\n  const isCompact =\n    ir.metadata['compact'] === true ||\n    ir.metadata['layout'] === 'compact' ||\n    String(ir.metadata['compact']) === 'true';\n\n  const sizes = new Map<string, { width: number; height: number }>();\n  for (const node of ir.nodes) {\n    let w = measureText(node.label, isCompact ? smallFont : font).width + (isCompact ? 24 : 36);\n    let h = (isCompact ? smallFont : font) + (isCompact ? 16 : 24);\n\n    if (node.kind === 'selector' || node.kind === 'sequence' || node.kind === 'parallel') {\n      w = Math.max(w, isCompact ? 44 : 54);\n      h = isCompact ? 36 : 44;\n    } else if (node.kind === 'condition') {\n      w = Math.max(w, isCompact ? 64 : 80);\n      h = isCompact ? 30 : 38;\n    } else {\n      w = Math.max(w, isCompact ? 70 : 90);\n      h = isCompact ? 32 : 42;\n    }\n\n    if (node.status) w += isCompact ? 14 : 20; // extra space for status badge\n\n    sizes.set(node.id, { width: w, height: h });\n  }\n\n  const inputs: TreeNodeInput[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: sizes.get(n.id)!.width,\n    height: sizes.get(n.id)!.height,\n    children: n.children,\n  }));\n\n  const placed = treeLayout(inputs, {\n    direction: (ir.metadata['direction'] as 'TB' | 'LR') ?? 'TB',\n    levelGap: isCompact ? 38 : 56,\n    siblingGap: isCompact ? 12 : 24,\n    margin,\n  });\n\n  const titleH = ir.title ? typography.titleFontSize + 24 : 0;\n  const box = (id: string) => {\n    const b = placed.boxes.get(id)!;\n    return { x: b.x, y: b.y + titleH, width: b.width, height: b.height };\n  };\n\n  const elements: SceneElement[] = [];\n\n  // Title\n  if (ir.title) {\n    elements.push(\n      p.text(\n        ir.title,\n        placed.width / 2,\n        margin + typography.titleFontSize,\n        typography.titleFontSize + 2,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  // 1. Edges\n  for (const node of ir.nodes) {\n    const pb = box(node.id);\n    for (const cid of node.children) {\n      const cb = box(cid);\n      elements.push(\n        p.path(\n          `M ${rhu(pb.x + pb.width / 2)} ${rhu(pb.y + pb.height)} L ${rhu(cb.x + cb.width / 2)} ${rhu(cb.y)}`,\n          palette.textMuted,\n          1.5,\n          { markerEnd: ARROW_ID },\n        ),\n      );\n    }\n  }\n\n  // 2. Nodes\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n\n    let fill = palette.surface;\n    let stroke = palette.border;\n    let rx = 4;\n\n    if (node.kind === 'selector') {\n      stroke = palette.primary;\n      rx = 6;\n    } else if (node.kind === 'sequence') {\n      stroke = palette.secondary ?? palette.primary;\n      rx = 6;\n    } else if (node.kind === 'parallel') {\n      stroke = palette.primary;\n      rx = 6;\n    } else if (node.kind === 'condition') {\n      rx = b.height / 2; // Pill shape\n      stroke = palette.textMuted;\n    } else if (node.kind === 'decorator') {\n      rx = 4;\n      stroke = palette.secondary ?? palette.primary;\n    }\n\n    elements.push(p.rect(b, fill, stroke, 1.5, { rx }));\n\n    // Composite Icon Badge / Prefix\n    let prefix = '';\n    if (node.kind === 'selector') prefix = '? ';\n    else if (node.kind === 'sequence') prefix = '\u2192 ';\n    else if (node.kind === 'parallel') prefix = '\u21F6 ';\n\n    const displayText = `${prefix}${node.label}`;\n    const textX = node.status ? b.x + (b.width - 24) / 2 : b.x + b.width / 2;\n    const textY = b.y + b.height / 2 + font * 0.35;\n\n    elements.push(\n      p.text(\n        displayText,\n        rhu(textX),\n        rhu(textY),\n        font,\n        palette.text,\n        { anchor: 'middle', weight: node.kind === 'action' || node.kind === 'condition' ? 'normal' : 'bold' },\n      ),\n    );\n\n    // Status Indicator Badge\n    if (node.status) {\n      let icon = '';\n      let statColor = palette.textMuted;\n\n      if (node.status === 'success') {\n        icon = '\u2713';\n        statColor = '#10B981'; // green\n      } else if (node.status === 'running') {\n        icon = '\u27F3';\n        statColor = '#F59E0B'; // yellow/amber\n      } else if (node.status === 'failure') {\n        icon = '\u2717';\n        statColor = '#EF4444'; // red\n      } else {\n        icon = '\u2022';\n        statColor = palette.textMuted;\n      }\n\n      const badgeX = b.x + b.width - 16;\n      const badgeY = b.y + b.height / 2;\n\n      elements.push(\n        p.circle({ x: badgeX, y: badgeY }, 9, palette.background, statColor, 1.2),\n      );\n      elements.push(\n        p.text(icon, badgeX, badgeY + 4, smallFont, statColor, { anchor: 'middle', weight: 'bold' }),\n      );\n    }\n  }\n\n  // 3. Dynamic Arrowheads\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n  ];\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  for (const node of ir.nodes) {\n    anchors[node.id] = { bounds: box(node.id) };\n  }\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: rhuInt(placed.width), height: rhuInt(placed.height + titleH) },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const behaviortree: DiagramModule<BehaviorTreeDocument> = {\n  parseMermaid: buildBehaviorTree,\n  parseYaml: (input) => JSON.parse(input) as BehaviorTreeDocument,\n  layout: (ir: BehaviorTreeDocument, theme: ResolvedTheme): LayoutResult => layoutBehaviorTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/quadtree.ts \u2014 Spatial Quadtree diagram module.\n *\n * Visualizes 2D space recursive partitioning:\n *   - 2D Spatial Partitioning Grid (NW, NE, SW, SE quadrants with data points).\n *   - 4-ary Hierarchy Tree with branch pointers to sub-quadrants.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport type { BaseIR } from '../../../../contracts/diagram.js';\nimport { treeLayout, type TreeNodeInput } from '../../../../graph/tree.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { pen } from '../../../../scene/build.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../../util/round.js';\n\nexport interface QuadPoint {\n  readonly x: number;\n  readonly y: number;\n  readonly label?: string | undefined;\n}\n\nexport interface QuadNode {\n  readonly id: string;\n  readonly label: string;\n  readonly bounds: { x: number; y: number; w: number; h: number };\n  readonly points: readonly QuadPoint[];\n  readonly children: readonly string[];\n}\n\nexport interface QuadTreeDocument extends BaseIR {\n  readonly title?: string | undefined;\n  readonly bounds: { x: number; y: number; w: number; h: number };\n  readonly capacity: number;\n  readonly nodes: readonly QuadNode[];\n}\n\nexport function buildQuadTree(input: string): QuadTreeDocument {\n  const lines = input.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean);\n\n  let title: string | undefined;\n  let capacity = 1;\n  let bounds = { x: 0, y: 0, w: 100, h: 100 };\n  let compact = false;\n  let maxWidth: number | undefined;\n  let direction: 'TB' | 'LR' | undefined;\n  const rawPoints: QuadPoint[] = [];\n  const manualLines: string[] = [];\n\n  for (const line of lines) {\n    if (/^quadtree\\b/i.test(line)) continue;\n\n    const titleMatch = line.match(/^title\\s+(.+)$/i);\n    if (titleMatch) {\n      title = titleMatch[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n\n    const compactMatch = line.match(/^(layout\\s+compact|compact\\s*(true)?|compact)\\b/i);\n    if (compactMatch) {\n      compact = true;\n      continue;\n    }\n\n    const maxWidthMatch = line.match(/^max-?width\\s+(\\d+)/i);\n    if (maxWidthMatch) {\n      maxWidth = Number(maxWidthMatch[1]);\n      compact = true;\n      continue;\n    }\n\n    const dirMatch = line.match(/^direction\\s+(TD|TB|LR)/i);\n    if (dirMatch) {\n      direction = dirMatch[1] === 'LR' ? 'LR' : 'TB';\n      continue;\n    }\n\n    const capMatch = line.match(/^capacity\\s+(\\d+)/i);\n    if (capMatch) {\n      capacity = Math.max(1, Number(capMatch[1]));\n      continue;\n    }\n\n    const boundsMatch = line.match(/^bounds\\s+(-?\\d+)\\s+(-?\\d+)\\s+(-?\\d+)\\s+(-?\\d+)/i);\n    if (boundsMatch) {\n      bounds = {\n        x: Number(boundsMatch[1]),\n        y: Number(boundsMatch[2]),\n        w: Number(boundsMatch[3]),\n        h: Number(boundsMatch[4]),\n      };\n      continue;\n    }\n\n    const insertMatch = line.match(/^insert\\s*\\(\\s*(-?\\d+(?:\\.\\d+)?)\\s*,\\s*(-?\\d+(?:\\.\\d+)?)\\s*\\)(?:\\s+[\"']?([^\"']+)[\"']?)?/i);\n    if (insertMatch) {\n      rawPoints.push({\n        x: Number(insertMatch[1]),\n        y: Number(insertMatch[2]),\n        ...(insertMatch[3] ? { label: insertMatch[3] } : {}),\n      });\n      continue;\n    }\n\n    manualLines.push(line);\n  }\n\n  const extraMeta: Record<string, unknown> = {\n    ...(compact ? { compact: true } : {}),\n    ...(maxWidth !== undefined ? { maxWidth } : {}),\n    ...(direction ? { direction } : {}),\n  };\n\n  if (rawPoints.length > 0) {\n    return buildAlgorithmicQuadTree(rawPoints, bounds, capacity, title, extraMeta);\n  }\n\n  return parseExplicitQuadTree(manualLines.join('\\n'), bounds, title, extraMeta);\n}\n\nfunction buildAlgorithmicQuadTree(\n  points: QuadPoint[],\n  bounds: { x: number; y: number; w: number; h: number },\n  capacity: number,\n  title?: string,\n  extraMeta?: Record<string, unknown>,\n): QuadTreeDocument {\n  interface InternalQuad {\n    id: string;\n    label: string;\n    b: { x: number; y: number; w: number; h: number };\n    pts: QuadPoint[];\n    children: InternalQuad[];\n  }\n\n  let idCounter = 1;\n\n  function subdivide(box: { x: number; y: number; w: number; h: number }, pts: QuadPoint[], label: string, depth: number): InternalQuad {\n    const id = `q_${idCounter++}`;\n    if (pts.length <= capacity || depth >= 4) {\n      return { id, label, b: box, pts, children: [] };\n    }\n\n    const hw = box.w / 2;\n    const hh = box.h / 2;\n    const nwBox = { x: box.x, y: box.y, w: hw, h: hh };\n    const neBox = { x: box.x + hw, y: box.y, w: hw, h: hh };\n    const swBox = { x: box.x, y: box.y + hh, w: hw, h: hh };\n    const seBox = { x: box.x + hw, y: box.y + hh, w: hw, h: hh };\n\n    const inBox = (p: QuadPoint, b: { x: number; y: number; w: number; h: number }) =>\n      p.x >= b.x && p.x < b.x + b.w && p.y >= b.y && p.y < b.y + b.h;\n\n    const nwPts = pts.filter((p) => inBox(p, nwBox));\n    const nePts = pts.filter((p) => inBox(p, neBox));\n    const swPts = pts.filter((p) => inBox(p, swBox));\n    const sePts = pts.filter((p) => inBox(p, seBox));\n\n    return {\n      id,\n      label,\n      b: box,\n      pts: [],\n      children: [\n        subdivide(nwBox, nwPts, `${label}-NW`, depth + 1),\n        subdivide(neBox, nePts, `${label}-NE`, depth + 1),\n        subdivide(swBox, swPts, `${label}-SW`, depth + 1),\n        subdivide(seBox, sePts, `${label}-SE`, depth + 1),\n      ],\n    };\n  }\n\n  const root = subdivide(bounds, points, 'Root', 0);\n  const flatNodes: QuadNode[] = [];\n\n  function collect(node: InternalQuad) {\n    flatNodes.push({\n      id: node.id,\n      label: node.label,\n      bounds: node.b,\n      points: node.pts,\n      children: node.children.map((c) => c.id),\n    });\n    for (const c of node.children) collect(c);\n  }\n\n  collect(root);\n\n  return {\n    version: '1.0',\n    metadata: { ...(title ? { title } : {}), ...(extraMeta ?? {}) },\n    ...(title ? { title } : {}),\n    bounds,\n    capacity,\n    nodes: flatNodes,\n  };\n}\n\nfunction parseExplicitQuadTree(\n  input: string,\n  bounds: { x: number; y: number; w: number; h: number },\n  title?: string,\n  extraMeta?: Record<string, unknown>,\n): QuadTreeDocument {\n  const lines = input.split(/\\r?\\n/).filter((l) => l.trim().length > 0);\n  const nodes: QuadNode[] = [];\n\n  for (const line of lines) {\n    const clean = line.replace(/^(root|leaf|node)\\s+/i, '');\n    const arrowIdx = clean.indexOf('->');\n    const decl = arrowIdx >= 0 ? clean.slice(0, arrowIdx).trim() : clean;\n    const targets = arrowIdx >= 0 ? clean.slice(arrowIdx + 2).trim().split(/[,;\\s]+/).filter(Boolean) : [];\n\n    const bracketMatch = decl.match(/\\[(.*?)\\]/);\n    let id = '';\n    let label = '';\n    if (bracketMatch) {\n      id = decl.slice(0, bracketMatch.index).trim();\n      label = bracketMatch[1]!.trim();\n    } else {\n      const parts = decl.split(/\\s+/);\n      id = parts[0]!;\n      label = parts.slice(1).join(' ') || id;\n    }\n\n    if (!id) id = `qn_${nodes.length + 1}`;\n\n    nodes.push({\n      id,\n      label,\n      bounds,\n      points: [],\n      children: targets,\n    });\n  }\n\n  return {\n    version: '1.0',\n    metadata: { ...(title ? { title } : {}), ...(extraMeta ?? {}) },\n    ...(title ? { title } : {}),\n    bounds,\n    capacity: 1,\n    nodes,\n  };\n}\n\n// \u2500\u2500\u2500 Layout & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ARROW_ID = 'quad-arrow';\n\nexport function layoutQuadTree(ir: QuadTreeDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  if (ir.nodes.length === 0) {\n    const scene: Scene = {\n      viewBox: { x: 0, y: 0, width: 140, height: 90 },\n      background: palette.background,\n      elements: [],\n    };\n    return { scene, anchors: {} };\n  }\n\n  const isCompact =\n    ir.metadata['compact'] === true ||\n    ir.metadata['layout'] === 'compact' ||\n    String(ir.metadata['compact']) === 'true';\n\n  // 1. Measure tree nodes\n  const sizes = new Map<string, { width: number; height: number }>();\n  for (const node of ir.nodes) {\n    const ptText = node.points.length > 0 ? node.points.map((pt) => pt.label ?? `(${pt.x},${pt.y})`).join(', ') : '';\n    const mainW = measureText(node.label, smallFont).width + (isCompact ? 16 : 24);\n    const ptW = ptText ? measureText(ptText, smallFont - 1).width + (isCompact ? 16 : 24) : 0;\n    const w = Math.max(mainW, ptW, isCompact ? 56 : 80);\n    const h = ptText ? (isCompact ? 36 : 44) : (isCompact ? 26 : 32);\n    sizes.set(node.id, { width: w, height: h });\n  }\n\n  const inputs: TreeNodeInput[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: sizes.get(n.id)!.width,\n    height: sizes.get(n.id)!.height,\n    children: n.children,\n  }));\n\n  const treePlaced = treeLayout(inputs, {\n    direction: (ir.metadata['direction'] as 'TB' | 'LR') ?? 'TB',\n    levelGap: isCompact ? 36 : 52,\n    siblingGap: isCompact ? 10 : 20,\n    margin,\n  });\n\n  const titleH = ir.title ? typography.titleFontSize + 24 : 0;\n\n  // Spatial Grid Configuration (placed to the left of the tree)\n  const gridSize = Math.max(220, Math.min(280, treePlaced.height - 40));\n  const gridX = margin;\n  const gridY = margin + titleH + 10;\n  const treeOffsetX = gridX + gridSize + 40;\n\n  const box = (id: string) => {\n    const b = treePlaced.boxes.get(id)!;\n    return { x: b.x + treeOffsetX, y: b.y + titleH, width: b.width, height: b.height };\n  };\n\n  const elements: SceneElement[] = [];\n\n  // Title\n  if (ir.title) {\n    elements.push(\n      p.text(\n        ir.title,\n        (treeOffsetX + treePlaced.width) / 2,\n        margin + typography.titleFontSize,\n        typography.titleFontSize + 2,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500\u2500 Spatial Grid Render (Left Panel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  elements.push(\n    p.text('SPATIAL 2D PARTITION', gridX + gridSize / 2, gridY - 8, smallFont, palette.textMuted, {\n      anchor: 'middle',\n      weight: 'bold',\n    }),\n  );\n\n  elements.push(\n    p.rect(\n      { x: gridX, y: gridY, width: gridSize, height: gridSize },\n      palette.surface,\n      palette.primary,\n      1.8,\n      { rx: 6 },\n    ),\n  );\n\n  const scaleX = gridSize / ir.bounds.w;\n  const scaleY = gridSize / ir.bounds.h;\n\n  for (const node of ir.nodes) {\n    if (node.children.length > 0) {\n      // Subdivide lines\n      const midX = gridX + (node.bounds.x + node.bounds.w / 2 - ir.bounds.x) * scaleX;\n      const midY = gridY + (node.bounds.y + node.bounds.h / 2 - ir.bounds.y) * scaleY;\n      const minX = gridX + (node.bounds.x - ir.bounds.x) * scaleX;\n      const maxX = gridX + (node.bounds.x + node.bounds.w - ir.bounds.x) * scaleX;\n      const minY = gridY + (node.bounds.y - ir.bounds.y) * scaleY;\n      const maxY = gridY + (node.bounds.y + node.bounds.h - ir.bounds.y) * scaleY;\n\n      // Cross lines\n      elements.push(p.path(`M ${rhu(midX)} ${rhu(minY)} L ${rhu(midX)} ${rhu(maxY)}`, palette.border, 1.2));\n      elements.push(p.path(`M ${rhu(minX)} ${rhu(midY)} L ${rhu(maxX)} ${rhu(midY)}`, palette.border, 1.2));\n    }\n\n    // Points inside this leaf\n    for (const pt of node.points) {\n      const px = gridX + (pt.x - ir.bounds.x) * scaleX;\n      const py = gridY + (pt.y - ir.bounds.y) * scaleY;\n\n      elements.push(p.circle({ x: px, y: py }, 4.5, palette.primary, palette.background, 1.5));\n      const ptLabel = pt.label ? `${pt.label} (${pt.x},${pt.y})` : `(${pt.x},${pt.y})`;\n      elements.push(\n        p.text(ptLabel, px + 8, py + 3, smallFont - 2, palette.text, { weight: 'bold' }),\n      );\n    }\n  }\n\n  // \u2500\u2500\u2500 Tree Hierarchy Render (Right Panel) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  // Edges\n  for (const node of ir.nodes) {\n    const pb = box(node.id);\n    for (const cid of node.children) {\n      const cb = box(cid);\n      elements.push(\n        p.path(\n          `M ${rhu(pb.x + pb.width / 2)} ${rhu(pb.y + pb.height)} L ${rhu(cb.x + cb.width / 2)} ${rhu(cb.y)}`,\n          palette.textMuted,\n          1.5,\n          { markerEnd: ARROW_ID },\n        ),\n      );\n    }\n  }\n\n  // Nodes\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n    const isLeaf = node.children.length === 0;\n\n    const stroke = isLeaf ? palette.primary : palette.border;\n    elements.push(p.rect(b, palette.surface, stroke, isLeaf ? 1.8 : 1.5, { rx: 4 }));\n\n    const textY = node.points.length > 0 ? b.y + 16 : b.y + b.height / 2 + smallFont * 0.35;\n    elements.push(\n      p.text(node.label, rhu(b.x + b.width / 2), rhu(textY), smallFont, palette.text, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n\n    if (node.points.length > 0) {\n      const ptText = node.points.map((pt) => pt.label ?? `(${pt.x},${pt.y})`).join(', ');\n      elements.push(\n        p.text(ptText, rhu(b.x + b.width / 2), rhu(b.y + 34), smallFont - 1, palette.primary, {\n          anchor: 'middle',\n        }),\n      );\n    }\n  }\n\n  // Dynamic Markers\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n  ];\n\n  const totalW = rhuInt(treeOffsetX + treePlaced.width);\n  const totalH = rhuInt(Math.max(gridY + gridSize + margin, treePlaced.height + titleH + margin));\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  for (const node of ir.nodes) {\n    anchors[node.id] = { bounds: box(node.id) };\n  }\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: totalW, height: totalH },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const quadtree: DiagramModule<QuadTreeDocument> = {\n  parseMermaid: buildQuadTree,\n  parseYaml: (input) => JSON.parse(input) as QuadTreeDocument,\n  layout: (ir: QuadTreeDocument, theme: ResolvedTheme): LayoutResult => layoutQuadTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/treap.ts \u2014 Treap (Cartesian Tree / BST + Heap) diagram module.\n *\n * Characteristics:\n *   1. Each node carries a (Key, Priority) pair.\n *   2. Keys satisfy Binary Search Tree (BST) ordering.\n *   3. Priorities satisfy Max-Heap ordering.\n *   4. Supports algorithmic insertion with automated heap rotations.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport type { BaseIR } from '../../../../contracts/diagram.js';\nimport { treeLayout, type TreeNodeInput } from '../../../../graph/tree.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { pen } from '../../../../scene/build.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../../util/round.js';\n\ninterface TreapInternalNode {\n  key: number | string;\n  priority: number;\n  left: TreapInternalNode | null;\n  right: TreapInternalNode | null;\n}\n\nfunction rotateRight(y: TreapInternalNode): TreapInternalNode {\n  const x = y.left!;\n  y.left = x.right;\n  x.right = y;\n  return x;\n}\n\nfunction rotateLeft(x: TreapInternalNode): TreapInternalNode {\n  const y = x.right!;\n  x.right = y.left;\n  y.left = x;\n  return y;\n}\n\nfunction insertTreap(node: TreapInternalNode | null, key: number | string, priority: number): TreapInternalNode {\n  if (!node) return { key, priority, left: null, right: null };\n\n  if (key < node.key) {\n    node.left = insertTreap(node.left, key, priority);\n    if (node.left.priority > node.priority) {\n      node = rotateRight(node);\n    }\n  } else if (key > node.key) {\n    node.right = insertTreap(node.right, key, priority);\n    if (node.right.priority > node.priority) {\n      node = rotateLeft(node);\n    }\n  }\n  return node;\n}\n\nexport interface TreapNode {\n  readonly id: string;\n  readonly key: string;\n  readonly priority: number;\n  readonly children: readonly string[];\n}\n\nexport interface TreapDocument extends BaseIR {\n  readonly title?: string | undefined;\n  readonly nodes: readonly TreapNode[];\n}\n\nexport function buildTreap(input: string): TreapDocument {\n  const lines = input.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean);\n\n  let title: string | undefined;\n  const pairs: { key: number | string; priority: number }[] = [];\n  const manualLines: string[] = [];\n\n  for (const line of lines) {\n    if (/^treap\\b/i.test(line)) continue;\n\n    const titleMatch = line.match(/^title\\s+(.+)$/i);\n    if (titleMatch) {\n      title = titleMatch[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n\n    // Match (K:50, P:85) or (50, 85) or insert 50:85\n    const pairMatches = line.matchAll(/\\(?\\s*(?:k\\s*:\\s*)?(-?\\d+|[a-zA-Z]+)\\s*[,:]\\s*(?:p\\s*:\\s*)?(-?\\d+)\\s*\\)?/gi);\n    let matchedAny = false;\n    for (const m of pairMatches) {\n      matchedAny = true;\n      const rawK = m[1]!;\n      const key = /^-?\\d+$/.test(rawK) ? Number(rawK) : rawK;\n      const priority = Number(m[2]);\n      pairs.push({ key, priority });\n    }\n\n    if (!matchedAny) manualLines.push(line);\n  }\n\n  if (pairs.length > 0) {\n    let root: TreapInternalNode | null = null;\n    for (const p of pairs) {\n      root = insertTreap(root, p.key, p.priority);\n    }\n\n    const nodes: TreapNode[] = [];\n    let idCount = 1;\n\n    const emit = (n: TreapInternalNode): string => {\n      const id = `t_${idCount++}`;\n      const children: string[] = [];\n      if (n.left) children.push(emit(n.left));\n      if (n.right) children.push(emit(n.right));\n\n      nodes.push({\n        id,\n        key: String(n.key),\n        priority: n.priority,\n        children,\n      });\n      return id;\n    };\n\n    if (root) emit(root);\n\n    return {\n      version: '1.0',\n      metadata: title ? { title } : {},\n      ...(title ? { title } : {}),\n      nodes,\n    };\n  }\n\n  // Parse explicit manual lines\n  const nodes: TreapNode[] = [];\n  for (const line of manualLines) {\n    const arrowIdx = line.indexOf('->');\n    const decl = arrowIdx >= 0 ? line.slice(0, arrowIdx).trim() : line.trim();\n    const targets = arrowIdx >= 0 ? line.slice(arrowIdx + 2).trim().split(/[,;\\s]+/).filter(Boolean) : [];\n\n    const bracketMatch = decl.match(/\\[(.*?)\\]/);\n    let id = '';\n    let key = '';\n    let priority = 0;\n\n    if (bracketMatch) {\n      id = decl.slice(0, bracketMatch.index).trim();\n      const content = bracketMatch[1]!.trim();\n      const m = content.match(/^(.*?)(?:,\\s*p\\s*:\\s*(\\d+))?$/i);\n      key = m ? m[1]!.trim() : content;\n      priority = m && m[2] ? Number(m[2]) : 50;\n    } else {\n      const parts = decl.split(/\\s+/);\n      id = parts[0]!;\n      key = parts[1] ?? id;\n      priority = parts[2] ? Number(parts[2]) : 50;\n    }\n\n    if (!id) id = `t_${nodes.length + 1}`;\n\n    nodes.push({\n      id,\n      key,\n      priority,\n      children: targets,\n    });\n  }\n\n  return {\n    version: '1.0',\n    metadata: title ? { title } : {},\n    ...(title ? { title } : {}),\n    nodes,\n  };\n}\n\n// \u2500\u2500\u2500 Layout & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ARROW_ID = 'treap-arrow';\n\nexport function layoutTreap(ir: TreapDocument, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  if (ir.nodes.length === 0) {\n    const scene: Scene = {\n      viewBox: { x: 0, y: 0, width: 140, height: 90 },\n      background: palette.background,\n      elements: [],\n    };\n    return { scene, anchors: {} };\n  }\n\n  const sizes = new Map<string, { width: number; height: number }>();\n  for (const node of ir.nodes) {\n    const keyW = measureText(node.key, font).width;\n    const prioW = measureText(String(node.priority), smallFont - 1).width + 12;\n    const w = Math.max(keyW + prioW + 28, 68);\n    const h = 38;\n    sizes.set(node.id, { width: w, height: h });\n  }\n\n  const inputs: TreeNodeInput[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: sizes.get(n.id)!.width,\n    height: sizes.get(n.id)!.height,\n    children: n.children,\n  }));\n\n  const placed = treeLayout(inputs, {\n    direction: 'TB',\n    levelGap: 52,\n    siblingGap: 24,\n    margin,\n  });\n\n  const titleH = ir.title ? typography.titleFontSize + 24 : 0;\n  const box = (id: string) => {\n    const b = placed.boxes.get(id)!;\n    return { x: b.x, y: b.y + titleH, width: b.width, height: b.height };\n  };\n\n  const elements: SceneElement[] = [];\n\n  if (ir.title) {\n    elements.push(\n      p.text(\n        ir.title,\n        placed.width / 2,\n        margin + typography.titleFontSize,\n        typography.titleFontSize + 2,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  // 1. Edges\n  for (const node of ir.nodes) {\n    const pb = box(node.id);\n    for (const cid of node.children) {\n      const cb = box(cid);\n      elements.push(\n        p.path(\n          `M ${rhu(pb.x + pb.width / 2)} ${rhu(pb.y + pb.height)} L ${rhu(cb.x + cb.width / 2)} ${rhu(cb.y)}`,\n          palette.textMuted,\n          1.5,\n          { markerEnd: ARROW_ID },\n        ),\n      );\n    }\n  }\n\n  // 2. Nodes\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n\n    // Pill container\n    elements.push(p.rect(b, palette.surface, palette.primary, 1.6, { rx: b.height / 2 }));\n\n    // Key text\n    const keyX = b.x + (b.width - 24) / 2;\n    elements.push(\n      p.text(\n        node.key,\n        rhu(keyX),\n        rhu(b.y + b.height / 2 + font * 0.35),\n        font,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n\n    // Priority badge (small pill circle on the right)\n    const prioText = String(node.priority);\n    const prioW = measureText(prioText, smallFont - 1).width + 10;\n    const prioH = 16;\n    const prioX = b.x + b.width - prioW - 4;\n    const prioY = b.y + (b.height - prioH) / 2;\n\n    elements.push(\n      p.rect(\n        { x: rhu(prioX), y: rhu(prioY), width: rhu(prioW), height: prioH },\n        palette.primary,\n        palette.primary,\n        1,\n        { rx: prioH / 2 },\n      ),\n    );\n    elements.push(\n      p.text(\n        prioText,\n        rhu(prioX + prioW / 2),\n        rhu(prioY + prioH / 2 + (smallFont - 1) * 0.35),\n        smallFont - 1,\n        '#FFFFFF',\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n  ];\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  for (const node of ir.nodes) {\n    anchors[node.id] = { bounds: box(node.id) };\n  }\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: rhuInt(placed.width), height: rhuInt(placed.height + titleH) },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const treap: DiagramModule<TreapDocument> = {\n  parseMermaid: buildTreap,\n  parseYaml: (input) => JSON.parse(input) as TreapDocument,\n  layout: (ir: TreapDocument, theme: ResolvedTheme): LayoutResult => layoutTreap(ir, theme),\n};\n", "/**\n * @file diagrams/tree/tree234.ts \u2014 2-3-4 Tree diagram module.\n *\n * Characteristics:\n *   1. 2-nodes have 1 key and 2 children.\n *   2. 3-nodes have 2 keys and 3 children.\n *   3. 4-nodes have 3 keys and 4 children.\n *   4. All leaves reside at the exact same depth.\n *   5. Preemptive 4-node splitting on insertion.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport type { BaseIR } from '../../../../contracts/diagram.js';\nimport { treeLayout, type TreeNodeInput } from '../../../../graph/tree.js';\nimport { connectSlots } from '../../../../graph/connect.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { pen } from '../../../../scene/build.js';\nimport { applyOverlays } from '../../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../../util/round.js';\n\ninterface Node234 {\n  keys: number[];\n  children: Node234[];\n}\n\nfunction insert234(root: Node234, key: number): Node234 {\n  if (root.keys.length === 3) {\n    const newRoot: Node234 = { keys: [], children: [root] };\n    splitChild(newRoot, 0);\n    insertNonFull(newRoot, key);\n    return newRoot;\n  }\n  insertNonFull(root, key);\n  return root;\n}\n\nfunction splitChild(parent: Node234, index: number): void {\n  const full = parent.children[index]!;\n  const right: Node234 = {\n    keys: [full.keys[2]!],\n    children: full.children.length > 0 ? full.children.slice(2) : [],\n  };\n  const upKey = full.keys[1]!;\n  full.keys = [full.keys[0]!];\n  if (full.children.length > 0) {\n    full.children = full.children.slice(0, 2);\n  }\n\n  parent.children.splice(index + 1, 0, right);\n  parent.keys.splice(index, 0, upKey);\n}\n\nfunction insertNonFull(node: Node234, key: number): void {\n  let i = node.keys.length - 1;\n\n  if (node.children.length === 0) {\n    // Leaf node: insert in sorted order\n    while (i >= 0 && key < node.keys[i]!) i--;\n    if (i >= 0 && node.keys[i] === key) return; // duplicate\n    node.keys.splice(i + 1, 0, key);\n    return;\n  }\n\n  // Internal node: find child\n  while (i >= 0 && key < node.keys[i]!) i--;\n  i++;\n\n  if (node.children[i]!.keys.length === 3) {\n    splitChild(node, i);\n    if (key > node.keys[i]!) {\n      i++;\n    } else if (key === node.keys[i]!) {\n      return;\n    }\n  }\n\n  insertNonFull(node.children[i]!, key);\n}\n\nexport interface Tree234Node {\n  readonly id: string;\n  readonly keys: readonly number[];\n  readonly children: readonly string[];\n}\n\nexport interface Tree234Document extends BaseIR {\n  readonly title?: string | undefined;\n  readonly nodes: readonly Tree234Node[];\n}\n\nexport function buildTree234(input: string): Tree234Document {\n  const lines = input.split(/\\r?\\n/).map((l) => l.trim()).filter(Boolean);\n\n  let title: string | undefined;\n  const filteredLines: string[] = [];\n\n  for (const line of lines) {\n    if (/^(2-3-4tree|234tree)\\b/i.test(line)) continue;\n\n    const titleMatch = line.match(/^title\\s+(.+)$/i);\n    if (titleMatch) {\n      title = titleMatch[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n    filteredLines.push(line);\n  }\n\n  const clean = filteredLines.join('\\n');\n  const numbers = (clean.match(/-?\\d+/g) ?? []).map(Number);\n\n  if (numbers.length === 0) {\n    return {\n      version: '1.0',\n      metadata: title ? { title } : {},\n      ...(title ? { title } : {}),\n      nodes: [],\n    };\n  }\n\n  let root: Node234 = { keys: [], children: [] };\n  for (const n of numbers) {\n    if (root.keys.length === 0 && root.children.length === 0) {\n      root.keys.push(n);\n    } else {\n      root = insert234(root, n);\n    }\n  }\n\n  const nodes: Tree234Node[] = [];\n  let idCount = 1;\n\n  const emit = (n: Node234): string => {\n    const id = `n234_${idCount++}`;\n    const childIds: string[] = [];\n    for (const c of n.children) {\n      childIds.push(emit(c));\n    }\n    nodes.push({\n      id,\n      keys: n.keys,\n      children: childIds,\n    });\n    return id;\n  };\n\n  emit(root);\n\n  return {\n    version: '1.0',\n    metadata: title ? { title } : {},\n    ...(title ? { title } : {}),\n    nodes,\n  };\n}\n\n// \u2500\u2500\u2500 Layout & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ARROW_ID = 'tree234-arrow';\n\nexport function layoutTree234(ir: Tree234Document, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n\n  if (ir.nodes.length === 0) {\n    const scene: Scene = {\n      viewBox: { x: 0, y: 0, width: 140, height: 90 },\n      background: palette.background,\n      elements: [],\n    };\n    return { scene, anchors: {} };\n  }\n\n  // Measure nodes\n  const sizes = new Map<string, { width: number; height: number; cellWidths: number[] }>();\n\n  for (const node of ir.nodes) {\n    const cellWidths = node.keys.map((k) => Math.max(measureText(String(k), font).width + 24, 38));\n    const width = cellWidths.reduce((sum, w) => sum + w, 0);\n    const height = font + 20;\n    sizes.set(node.id, { width, height, cellWidths });\n  }\n\n  const inputs: TreeNodeInput[] = ir.nodes.map((n) => ({\n    id: n.id,\n    width: sizes.get(n.id)!.width,\n    height: sizes.get(n.id)!.height,\n    children: n.children,\n  }));\n\n  // Map child to parent for anchor clearance\n  const parentMap = new Map<string, string>();\n  for (const node of ir.nodes) {\n    for (const cid of node.children) {\n      parentMap.set(cid, node.id);\n    }\n  }\n\n  const placed = treeLayout(inputs, {\n    direction: 'TB',\n    levelGap: 66,\n    siblingGap: 24,\n    margin,\n  });\n\n  const titleH = ir.title ? typography.titleFontSize + 24 : 0;\n  const box = (id: string) => {\n    const b = placed.boxes.get(id)!;\n    return { x: b.x, y: b.y + titleH, width: b.width, height: b.height };\n  };\n\n  const elements: SceneElement[] = [];\n\n  if (ir.title) {\n    elements.push(\n      p.text(\n        ir.title,\n        placed.width / 2,\n        margin + typography.titleFontSize,\n        typography.titleFontSize + 2,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  // 1. Edges originating from key divider slots\n  for (const node of ir.nodes) {\n    const pb = box(node.id);\n    const cellWidths = sizes.get(node.id)!.cellWidths;\n    const childCount = node.children.length;\n\n    node.children.forEach((cid, cIdx) => {\n      const cb = box(cid);\n      let startX: number;\n\n      if (childCount === cellWidths.length + 1) {\n        if (cIdx === 0) {\n          startX = pb.x;\n        } else if (cIdx === childCount - 1) {\n          startX = pb.x + pb.width;\n        } else {\n          let curX = pb.x;\n          for (let j = 0; j < cIdx; j++) curX += cellWidths[j]!;\n          startX = curX;\n        }\n      } else {\n        const { start } = connectSlots(pb, cb);\n        startX = start.x;\n      }\n\n      elements.push(\n        p.path(\n          `M ${rhu(startX)} ${rhu(pb.y + pb.height)} L ${rhu(cb.x + cb.width / 2)} ${rhu(cb.y)}`,\n          palette.textMuted,\n          1.5,\n          { markerEnd: ARROW_ID },\n        ),\n      );\n    });\n  }\n\n  // 2. Nodes\n  for (const node of ir.nodes) {\n    const b = box(node.id);\n    const cellWidths = sizes.get(node.id)!.cellWidths;\n    const nodeType = node.keys.length === 1 ? '2-node' : node.keys.length === 2 ? '3-node' : '4-node';\n\n    // Outer card\n    elements.push(p.rect(b, palette.surface, palette.primary, 1.6, { rx: 4 }));\n\n    // Internal cell dividers and values\n    let sx = b.x;\n    node.keys.forEach((k, idx) => {\n      const cw = cellWidths[idx]!;\n      if (idx > 0) {\n        elements.push(\n          p.path(`M ${rhu(sx)} ${rhu(b.y)} L ${rhu(sx)} ${rhu(b.y + b.height)}`, palette.primary, 1),\n        );\n      }\n      elements.push(\n        p.text(\n          String(k),\n          rhu(sx + cw / 2),\n          rhu(b.y + b.height / 2 + font * 0.35),\n          font,\n          palette.text,\n          { anchor: 'middle', weight: 'bold' },\n        ),\n      );\n      sx += cw;\n    });\n\n    // Tag placement: root is placed above, child nodes placed below so incoming connectors to top-center are unobstructed\n    const tagY = !parentMap.has(node.id) ? b.y - 8 : b.y + b.height + 12;\n    elements.push(\n      p.text(nodeType, rhu(b.x + b.width / 2), rhu(tagY), smallFont - 2, palette.textMuted, {\n        anchor: 'middle',\n      }),\n    );\n  }\n\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.textMuted}\" /></marker>`,\n  ];\n\n  const anchors: Record<string, { bounds: { x: number; y: number; width: number; height: number } }> = {};\n  for (const node of ir.nodes) {\n    anchors[node.id] = { bounds: box(node.id) };\n  }\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: rhuInt(placed.width), height: rhuInt(placed.height + titleH) },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    ir.overlays,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const tree234: DiagramModule<Tree234Document> = {\n  parseMermaid: buildTree234,\n  parseYaml: (input) => JSON.parse(input) as Tree234Document,\n  layout: (ir: Tree234Document, theme: ResolvedTheme): LayoutResult => layoutTree234(ir, theme),\n};\n", "import type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument } from './ir.js';\nimport { layoutTree } from './layout.js';\nimport { parseLines, buildNodes } from './build.js';\n\nexport type { TreeDocument, TreeNode, TreeDirection } from './ir.js';\nexport { bplustree, buildBPlusTree, layoutBPlusTree } from './bplustree.js';\nexport type { BPlusTreeDocument, BPlusTreeNode } from './bplustree.js';\nexport { merkletree, buildMerkleTree, layoutMerkleTree } from './merkletree.js';\nexport type { MerkleTreeDocument, MerkleNode } from './merkletree.js';\nexport { lsmtree, buildLsmTree, layoutLsmTree } from './lsmtree.js';\nexport type { LsmTreeDocument, LsmLevel, LsmSst, LsmMemtable } from './lsmtree.js';\nexport { behaviortree, buildBehaviorTree, layoutBehaviorTree } from './behaviortree.js';\nexport type { BehaviorTreeDocument, BehaviorTreeNode } from './behaviortree.js';\nexport { quadtree, buildQuadTree, layoutQuadTree } from './quadtree.js';\nexport type { QuadTreeDocument, QuadNode, QuadPoint } from './quadtree.js';\nexport { treap, buildTreap, layoutTreap } from './treap.js';\nexport type { TreapDocument, TreapNode } from './treap.js';\nexport { tree234, buildTree234, layoutTree234 } from './tree234.js';\nexport type { Tree234Document, Tree234Node } from './tree234.js';\n\n/** Pre-process `path A -> B -> C` directives, returning them separately. */\nfunction extractPathDirectives(input: string): { clean: string; paths: string[][] } {\n  const cleanLines: string[] = [];\n  const paths: string[][] = [];\n  const PATH_RE = /^[ \\t]*path[ \\t]+(.+)$/;\n\n  for (const line of input.split('\\n')) {\n    const m = line.match(PATH_RE);\n    if (m && m[1]!.includes('->')) {\n      const nodes = m[1]!\n        .split('->')\n        .map((s) => s.trim())\n        .filter(Boolean);\n      if (nodes.length >= 2) {\n        paths.push(nodes);\n        continue;\n      }\n    }\n    cleanLines.push(line);\n  }\n  return { clean: cleanLines.join('\\n'), paths };\n}\n\nexport const tree: DiagramModule<TreeDocument> = {\n  parseMermaid(input: string): TreeDocument {\n    const { clean, paths } = extractPathDirectives(input);\n    const raw = parseLines(clean);\n    const nodes = buildNodes(raw.lines);\n\n    // Map label \u2192 first node id\n    const labelToId = new Map<string, string>();\n    for (const node of nodes) {\n      if (!labelToId.has(node.label)) labelToId.set(node.label, node.id);\n    }\n\n    const activePairs: [string, string][] = [];\n    for (const seg of paths) {\n      for (let i = 0; i < seg.length - 1; i++) {\n        const fromId = labelToId.get(seg[i]!);\n        const toId = labelToId.get(seg[i + 1]!);\n        if (fromId && toId) activePairs.push([fromId, toId]);\n      }\n    }\n\n    return {\n      version: raw.version,\n      metadata: raw.metadata ?? {},\n      direction: raw.direction,\n      nodes,\n      ...(activePairs.length > 0 ? { activePaths: activePairs } : {}),\n    };\n  },\n\n  parseYaml(input: string): TreeDocument {\n    return JSON.parse(input) as TreeDocument;\n  },\n\n  layout(ir: TreeDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutTree(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/tree/plan.ts \u2014 Query-plan front-end over the tree engine.\n *\n * Same indentation source as `tree`, but operator nodes are auto-coloured by\n * kind inferred from their name (scan / join / build), so authors don't tag\n * every node by hand.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument } from './ir.js';\nimport { layoutTree } from './layout.js';\nimport { parseLines, buildNodes } from './build.js';\n\nconst COLOUR_KINDS = ['scan', 'join', 'build', 'red', 'black', 'active', 'primary', 'muted'];\n\n/** Infer an operator colour-kind from its label. */\nfunction inferKind(label: string): string | undefined {\n  const l = label.toLowerCase();\n  if (l.includes('join')) return 'join';\n  if (l.includes('scan')) return 'scan';\n  if (\n    l.includes('hash') ||\n    l.includes('sort') ||\n    l.includes('aggregate') ||\n    l.includes('group') ||\n    l.includes('materialize') ||\n    l.includes('gather')\n  )\n    return 'build';\n  return undefined;\n}\n\nexport const plan: DiagramModule<TreeDocument> = {\n  parseMermaid(input: string): TreeDocument {\n    const raw = parseLines(input);\n    const nodes = buildNodes(raw.lines);\n    for (const n of nodes) {\n      if (n.kinds.some((k) => COLOUR_KINDS.includes(k))) continue;\n      const k = inferKind(n.label);\n      if (k) n.kinds.push(k);\n    }\n    return {\n      version: raw.version,\n      metadata: raw.metadata ?? {},\n      direction: raw.direction,\n      nodes,\n    };\n  },\n\n  parseYaml(input: string): TreeDocument {\n    return JSON.parse(input) as TreeDocument;\n  },\n\n  layout(ir: TreeDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutTree(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/tree/avl.ts \u2014 AVL-tree front-end over the tree engine.\n *\n * Value-driven: the source is a list of integers (`avl insert 50 30 70 \u2026`); the\n * builder performs real BST insertion with AVL rotations and emits one circle\n * node per key with its balance-factor badge. The structure is always valid by\n * construction \u2014 you cannot author an unbalanced AVL tree.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\ninterface AvlNode {\n  key: number;\n  left: AvlNode | null;\n  right: AvlNode | null;\n  height: number;\n}\n\nconst h = (n: AvlNode | null): number => (n ? n.height : 0);\nconst upd = (n: AvlNode): void => {\n  n.height = 1 + Math.max(h(n.left), h(n.right));\n};\nconst bf = (n: AvlNode): number => h(n.left) - h(n.right);\n\nfunction rotateRight(y: AvlNode): AvlNode {\n  const x = y.left!;\n  y.left = x.right;\n  x.right = y;\n  upd(y);\n  upd(x);\n  return x;\n}\nfunction rotateLeft(x: AvlNode): AvlNode {\n  const y = x.right!;\n  x.right = y.left;\n  y.left = x;\n  upd(x);\n  upd(y);\n  return y;\n}\n\nfunction insert(node: AvlNode | null, key: number): AvlNode {\n  if (!node) return { key, left: null, right: null, height: 1 };\n  if (key < node.key) node.left = insert(node.left, key);\n  else if (key > node.key) node.right = insert(node.right, key);\n  else return node; // ignore duplicates\n  upd(node);\n  const balance = bf(node);\n  if (balance > 1 && key < node.left!.key) return rotateRight(node);\n  if (balance < -1 && key > node.right!.key) return rotateLeft(node);\n  if (balance > 1 && key > node.left!.key) {\n    node.left = rotateLeft(node.left!);\n    return rotateRight(node);\n  }\n  if (balance < -1 && key < node.right!.key) {\n    node.right = rotateRight(node.right!);\n    return rotateLeft(node);\n  }\n  return node;\n}\n\n/** Build a valid AVL tree IR from the integers in the source. */\nexport function buildAvl(input: string): TreeDocument {\n  const keys = (input.match(/-?\\d+/g) ?? []).map(Number);\n  let root: AvlNode | null = null;\n  for (const k of keys) root = insert(root, k);\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: AvlNode): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    nodes.push({ id, label: String(n.key), kinds: ['circle'], badge: String(bf(n)), children });\n    if (n.left) children.push(emit(n.left));\n    if (n.right) children.push(emit(n.right));\n    return id;\n  };\n  if (root) emit(root);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const avl: DiagramModule<TreeDocument> = {\n  parseMermaid(input: string): TreeDocument {\n    return buildAvl(input);\n  },\n  parseYaml(input: string): TreeDocument {\n    return JSON.parse(input) as TreeDocument;\n  },\n  layout(ir: TreeDocument, theme: ResolvedTheme): LayoutResult {\n    return layoutTree(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/tree/rbtree.ts \u2014 Red-black tree front-end over the tree engine.\n *\n * Value-driven via a left-leaning red-black tree (Sedgewick): real insertion\n * with rotations + colour flips yields a valid red-black colouring by\n * construction. Each key becomes a circle node tagged red or black.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\nconst RED = true,\n  BLACK = false;\ninterface RbNode {\n  key: number;\n  left: RbNode | null;\n  right: RbNode | null;\n  color: boolean;\n}\n\nconst isRed = (n: RbNode | null): boolean => n !== null && n.color === RED;\n\nfunction rotateLeft(h: RbNode): RbNode {\n  const x = h.right!;\n  h.right = x.left;\n  x.left = h;\n  x.color = h.color;\n  h.color = RED;\n  return x;\n}\nfunction rotateRight(h: RbNode): RbNode {\n  const x = h.left!;\n  h.left = x.right;\n  x.right = h;\n  x.color = h.color;\n  h.color = RED;\n  return x;\n}\nfunction flip(h: RbNode): void {\n  h.color = !h.color;\n  if (h.left) h.left.color = !h.left.color;\n  if (h.right) h.right.color = !h.right.color;\n}\n\nfunction insert(h: RbNode | null, key: number): RbNode {\n  if (!h) return { key, left: null, right: null, color: RED };\n  if (key < h.key) h.left = insert(h.left, key);\n  else if (key > h.key) h.right = insert(h.right, key);\n  // duplicates ignored\n  if (isRed(h.right) && !isRed(h.left)) h = rotateLeft(h);\n  if (isRed(h.left) && isRed(h.left!.left)) h = rotateRight(h);\n  if (isRed(h.left) && isRed(h.right)) flip(h);\n  return h;\n}\n\nexport function buildRbtree(input: string): TreeDocument {\n  const keys = (input.match(/-?\\d+/g) ?? []).map(Number);\n  let root: RbNode | null = null;\n  for (const k of keys) {\n    root = insert(root, k);\n    root.color = BLACK;\n  }\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: RbNode): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    nodes.push({ id, label: String(n.key), kinds: [n.color === RED ? 'red' : 'black'], children });\n    if (n.left) children.push(emit(n.left));\n    if (n.right) children.push(emit(n.right));\n    return id;\n  };\n  if (root) emit(root);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const rbtree: DiagramModule<TreeDocument> = {\n  parseMermaid: buildRbtree,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/btree.ts \u2014 B-tree front-end over the tree engine.\n *\n * Value-driven: `btree order 3 insert 10 20 \u2026` performs real B-tree insertion\n * with node splitting and emits multi-key strip nodes. Structure is valid by\n * construction (every non-root node holds between \u2308order/2\u2309\u22121 and order\u22121 keys).\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\ninterface BNode {\n  keys: number[];\n  children: BNode[];\n  leaf: boolean;\n}\n\ninterface Split {\n  up: number;\n  right: BNode;\n}\n\n/** Insert into a subtree; return a Split if this node overflowed and divided. */\nfunction insertRec(node: BNode, key: number, order: number): Split | null {\n  if (node.leaf) {\n    let i = node.keys.length - 1;\n    while (i >= 0 && key < node.keys[i]!) i--;\n    if (i >= 0 && node.keys[i] === key) return null; // dup\n    node.keys.splice(i + 1, 0, key);\n  } else {\n    let i = node.keys.length - 1;\n    while (i >= 0 && key < node.keys[i]!) i--;\n    if (i >= 0 && node.keys[i] === key) return null; // dup\n    i++;\n    const split = insertRec(node.children[i]!, key, order);\n    if (split) {\n      node.keys.splice(i, 0, split.up);\n      node.children.splice(i + 1, 0, split.right);\n    }\n  }\n  if (node.keys.length <= order - 1) return null;\n\n  // overflow: divide around the median\n  const mid = node.keys.length >> 1;\n  const up = node.keys[mid]!;\n  const right: BNode = {\n    keys: node.keys.slice(mid + 1),\n    children: node.leaf ? [] : node.children.slice(mid + 1),\n    leaf: node.leaf,\n  };\n  node.keys = node.keys.slice(0, mid);\n  node.children = node.leaf ? [] : node.children.slice(0, mid + 1);\n  return { up, right };\n}\n\nexport function buildBtree(input: string): TreeDocument {\n  const orderMatch = input.match(/order\\s+(\\d+)/i);\n  const order = Math.max(3, orderMatch ? Number(orderMatch[1]) : 3);\n  const afterOrder = input.replace(/order\\s+\\d+/i, '');\n  const keys = (afterOrder.match(/-?\\d+/g) ?? []).map(Number);\n\n  let root: BNode = { keys: [], children: [], leaf: true };\n  for (const k of keys) {\n    const split = insertRec(root, k, order);\n    if (split) root = { keys: [split.up], children: [root, split.right], leaf: false };\n  }\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: BNode): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    nodes.push({ id, label: n.keys.join(' | '), kinds: ['strip'], children });\n    for (const c of n.children) children.push(emit(c));\n    return id;\n  };\n  if (root.keys.length > 0 || root.children.length > 0) emit(root);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const btree: DiagramModule<TreeDocument> = {\n  parseMermaid: buildBtree,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/radix.ts \u2014 Radix (Patricia) trie front-end.\n *\n * Value-driven: `radix insert cat car card dog` inserts strings into a\n * prefix-compressed trie. Shared prefixes collapse onto single labelled edges;\n * branch nodes render as small dots, word-terminal nodes as filled pills.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\ninterface RNode {\n  edges: Map<string, RNode>;\n  end: boolean;\n}\n\nconst newNode = (): RNode => ({ edges: new Map(), end: false });\n\nfunction commonPrefix(a: string, b: string): number {\n  let i = 0;\n  while (i < a.length && i < b.length && a[i] === b[i]) i++;\n  return i;\n}\n\nfunction insert(root: RNode, word: string): void {\n  let node = root;\n  let rest = word;\n  while (rest.length > 0) {\n    let matched: string | undefined;\n    for (const label of node.edges.keys()) {\n      if (label[0] === rest[0]) {\n        matched = label;\n        break;\n      }\n    }\n    if (matched === undefined) {\n      const child = newNode();\n      child.end = true;\n      node.edges.set(rest, child);\n      return;\n    }\n    const cp = commonPrefix(matched, rest);\n    if (cp === matched.length) {\n      node = node.edges.get(matched)!;\n      rest = rest.slice(cp);\n      if (rest.length === 0) node.end = true;\n    } else {\n      // split the existing edge at cp\n      const existingChild = node.edges.get(matched)!;\n      node.edges.delete(matched);\n      const mid = newNode();\n      node.edges.set(matched.slice(0, cp), mid);\n      mid.edges.set(matched.slice(cp), existingChild);\n      if (cp === rest.length) {\n        mid.end = true;\n      } else {\n        const leaf = newNode();\n        leaf.end = true;\n        mid.edges.set(rest.slice(cp), leaf);\n      }\n      return;\n    }\n  }\n  node.end = true;\n}\n\nexport function buildRadix(input: string): TreeDocument {\n  // words = alphabetic tokens after the leading `radix`/`insert` keywords\n  const tokens = input.split(/\\s+/).filter(Boolean);\n  const words = tokens.filter((t) => /^[A-Za-z]+$/.test(t) && t !== 'radix' && t !== 'insert');\n  const root = newNode();\n  for (const w of words) insert(root, w);\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: RNode, prefix: string, edgeLabel?: string): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    const node: TreeNode = n.end\n      ? {\n          id,\n          label: prefix,\n          kinds: ['leaf', 'active'],\n          children,\n          ...(edgeLabel !== undefined ? { edgeLabel } : {}),\n        }\n      : {\n          id,\n          label: '',\n          kinds: ['dot'],\n          children,\n          ...(edgeLabel !== undefined ? { edgeLabel } : {}),\n        };\n    nodes.push(node);\n    for (const [label, child] of n.edges) children.push(emit(child, prefix + label, label));\n    return id;\n  };\n  emit(root, '');\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const radix: DiagramModule<TreeDocument> = {\n  parseMermaid: buildRadix,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/segtree.ts \u2014 Segment-tree front-end over the tree engine.\n *\n * Value-driven: `segtree over [1,2,3,4] reduce sum` builds a segment tree whose\n * nodes each carry a [lo,hi] range (info sub-line) and the reduced value.\n * Supported reducers: sum (default), min, max.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\ntype Reducer = (a: number, b: number) => number;\n\nfunction pickReducer(input: string): Reducer {\n  const l = input.toLowerCase();\n  if (l.includes('min')) return Math.min;\n  if (l.includes('max')) return Math.max;\n  return (a, b) => a + b;\n}\n\nexport function buildSegtree(input: string): TreeDocument {\n  // numbers inside the array literal; ignore an `order`/`reduce` word's digits \u2014 there are none\n  const arr = (input.match(/-?\\d+/g) ?? []).map(Number);\n  const reduce = pickReducer(input);\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const build = (lo: number, hi: number): { id: string; value: number } => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    const node: TreeNode = { id, label: '', kinds: ['box'], info: `[${lo},${hi}]`, children };\n    nodes.push(node);\n    let value: number;\n    if (lo === hi) {\n      value = arr[lo]!;\n    } else {\n      const mid = (lo + hi) >> 1;\n      const left = build(lo, mid);\n      const right = build(mid + 1, hi);\n      children.push(left.id, right.id);\n      value = reduce(left.value, right.value);\n    }\n    (node as { label: string }).label = String(value);\n    return { id, value };\n  };\n  if (arr.length > 0) build(0, arr.length - 1);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const segtree: DiagramModule<TreeDocument> = {\n  parseMermaid: buildSegtree,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/tree/heap.ts \u2014 Binary-heap front-end over the tree engine.\n *\n * Value-driven: `heap max insert 50 30 70 \u2026` builds a binary heap (max by\n * default, `min` supported) with real sift-up, then renders the implicit tree\n * (children of i are 2i+1, 2i+2) as circle nodes.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from './ir.js';\nimport { layoutTree } from './layout.js';\n\nexport function buildHeap(input: string): TreeDocument {\n  const isMin = /\\bmin\\b/i.test(input);\n  const keys = (input.match(/-?\\d+/g) ?? []).map(Number);\n  const higher = (a: number, b: number): boolean => (isMin ? a < b : a > b);\n\n  const heap: number[] = [];\n  for (const k of keys) {\n    heap.push(k);\n    let i = heap.length - 1;\n    while (i > 0) {\n      const parent = (i - 1) >> 1;\n      if (higher(heap[i]!, heap[parent]!)) {\n        [heap[i], heap[parent]] = [heap[parent]!, heap[i]!];\n        i = parent;\n      } else break;\n    }\n  }\n\n  const nodes: TreeNode[] = [];\n  const emit = (idx: number): string => {\n    const id = `n${idx}`;\n    const children: string[] = [];\n    nodes.push({ id, label: String(heap[idx]), kinds: ['circle'], children });\n    const l = 2 * idx + 1,\n      r = 2 * idx + 2;\n    if (l < heap.length) children.push(emit(l));\n    if (r < heap.length) children.push(emit(r));\n    return id;\n  };\n  if (heap.length > 0) emit(0);\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const heap: DiagramModule<TreeDocument> = {\n  parseMermaid: buildHeap,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/struct/linkedlist.ts \u2014 Singly linked list (slot + pointer).\n *\n * Value-driven:\n *   linkedlist 3 7 9          // head -> [3|\u00B7] -> [7|\u00B7] -> [9|/] (null)\n *   linkedlist\n *     title queue\n *     3 7 9\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines, tokenizeDirective } from './shared.js';\n\ninterface ListDoc {\n  title?: string;\n  values: string[];\n}\n\nfunction parse(input: string): ListDoc {\n  let title: string | undefined;\n  const values: string[] = [];\n  for (const line of lines(input)) {\n    const t = tokenizeDirective(line);\n    if (t[0] === 'linkedlist') {\n      values.push(...t.slice(1));\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = t.slice(1).join(' ');\n      continue;\n    }\n    if (t[0] === 'values' || t[0] === 'nodes') {\n      values.push(...t.slice(1));\n      continue;\n    }\n    values.push(...t);\n  }\n  return { ...(title !== undefined ? { title } : {}), values };\n}\n\nexport function layoutList(doc: ListDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const nh = 40,\n    nw = 26,\n    gap = 46;\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const y = margin + titleH;\n\n  const headW = measureText('head', font).width;\n  const startX = margin + headW + 38;\n\n  const nodes: { x: number; vw: number; value: string }[] = [];\n  let cursor = startX;\n  for (const v of doc.values) {\n    const vw = Math.max(measureText(v, font).width + 18, 30);\n    nodes.push({ x: cursor, vw, value: v });\n    cursor += vw + nw + gap;\n  }\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // head\n  elements.push(\n    p.text('head', margin, y + nh / 2 + font * 0.35, font, palette.textMuted, { weight: 'bold' }),\n  );\n  if (nodes.length > 0) {\n    elements.push(\n      p.path(\n        `M ${rhu(margin + headW + 6)} ${rhu(y + nh / 2)} L ${rhu(nodes[0]!.x - 4)} ${rhu(y + nh / 2)}`,\n        palette.primary,\n        1.5,\n        { markerEnd: ARROW_ID },\n      ),\n    );\n  }\n\n  nodes.forEach((node, i) => {\n    const nextX = node.x + node.vw;\n    elements.push(\n      p.rect({ x: node.x, y, width: node.vw, height: nh }, palette.surface, palette.border, 1.5, {\n        rx: 4,\n      }),\n    );\n    elements.push(\n      p.rect({ x: nextX, y, width: nw, height: nh }, '#f1f3f5', palette.border, 1.5, { rx: 4 }),\n    );\n    elements.push(\n      p.path(`M ${rhu(nextX)} ${rhu(y)} L ${rhu(nextX)} ${rhu(y + nh)}`, palette.border, 1.5),\n    );\n    elements.push(\n      p.text(\n        node.value,\n        rhu(node.x + node.vw / 2),\n        rhu(y + nh / 2 + font * 0.35),\n        font,\n        palette.text,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n\n    const linkCx = nextX + nw / 2,\n      linkCy = y + nh / 2;\n    if (i < nodes.length - 1) {\n      elements.push(p.circle({ x: linkCx, y: linkCy }, 3, palette.primary, palette.primary, 1));\n      elements.push(\n        p.path(\n          `M ${rhu(linkCx)} ${rhu(linkCy)} L ${rhu(nodes[i + 1]!.x - 4)} ${rhu(linkCy)}`,\n          palette.primary,\n          1.5,\n          { markerEnd: ARROW_ID },\n        ),\n      );\n    } else {\n      // null slash through the next cell\n      elements.push(\n        p.path(\n          `M ${rhu(nextX)} ${rhu(y + nh)} L ${rhu(nextX + nw)} ${rhu(y)}`,\n          palette.textMuted,\n          1.5,\n        ),\n      );\n    }\n  });\n\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  nodes.forEach((node, i) => {\n    anchors[`n${i}`] = { bounds: { x: node.x, y, width: node.vw + nw, height: nh } };\n  });\n\n  const width = (nodes.length > 0 ? cursor - gap : startX) + margin;\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width, height: y + nh + margin },\n    background: palette.background,\n    elements,\n    defs: [arrowDef(palette.primary, theme.edges?.arrowSize)],\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const linkedlist: DiagramModule<\n  ListDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutList(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/struct/memory.ts \u2014 Memory regions with cross-region pointers.\n *\n * Value-driven mini-syntax:\n *   memory\n *     title Stack -> Heap\n *     region STACK\n *       var p -> obj            // a slot holding a reference\n *     region HEAP\n *       object obj : Point : x=1, y=2\n *\n * Exercises connectSlots across region boundaries (the slot-aware pointer).\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n  Rect,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { connectSlots } from '../../../../graph/connect.js';\nimport { countRouteCollisions } from '../../../../routing/router.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines, tokenizeDirective } from './shared.js';\n\ninterface VarItem {\n  kind: 'var';\n  name: string;\n  target?: string;\n}\ninterface ObjItem {\n  kind: 'object';\n  id: string;\n  title: string;\n  fields: { k: string; v: string }[];\n}\ntype Item = VarItem | ObjItem;\ninterface Region {\n  name: string;\n  items: Item[];\n}\ninterface MemoryDoc {\n  title?: string;\n  regions: Region[];\n}\n\nfunction parse(input: string): MemoryDoc {\n  let title: string | undefined;\n  const regions: Region[] = [];\n  let cur: Region | undefined;\n  for (const line of lines(input)) {\n    const t = tokenizeDirective(line);\n    if (t[0] === 'memory') continue;\n    if (t[0] === 'title') {\n      title = t.slice(1).join(' ');\n      continue;\n    }\n    if (t[0] === 'region') {\n      cur = { name: decodeLabel(line.slice(6)), items: [] };\n      regions.push(cur);\n      continue;\n    }\n    if (!cur) continue;\n    if (t[0] === 'var') {\n      const parsed = parseVarDirective(t);\n      if (parsed)\n        cur.items.push({\n          kind: 'var',\n          name: parsed.name,\n          ...(parsed.target ? { target: parsed.target } : {}),\n        });\n      continue;\n    }\n    if (t[0] === 'object') {\n      const parts = line\n        .slice(6)\n        .split(':')\n        .map((s) => s.trim());\n      const id = parts[0] ?? 'obj';\n      const titleO = parts[1] ? decodeLabel(parts[1]) : id;\n      const fields = (parts[2] ?? '')\n        .split(',')\n        .map((s) => s.trim())\n        .filter(Boolean)\n        .map((pair) => {\n          const [k, v] = pair.split('=').map((x) => x.trim());\n          return { k: k ?? '', v: v ?? '' };\n        });\n      cur.items.push({ kind: 'object', id, title: titleO, fields });\n    }\n  }\n  return { ...(title !== undefined ? { title } : {}), regions };\n}\n\nfunction decodeLabel(raw: string): string {\n  return tokenizeDirective(raw.trim()).join(' ');\n}\n\nfunction parseVarDirective(\n  tokens: readonly string[],\n): { name: string; target?: string } | undefined {\n  const nameToken = tokens[1];\n  if (nameToken === undefined) return undefined;\n\n  const inlineArrow = nameToken.indexOf('->');\n  if (inlineArrow >= 0) {\n    const name = nameToken.slice(0, inlineArrow);\n    const target = nameToken.slice(inlineArrow + 2);\n    return { name, ...(target ? { target } : {}) };\n  }\n\n  if (tokens[2] === '->') {\n    return { name: nameToken, ...(tokens[3] ? { target: tokens[3] } : {}) };\n  }\n\n  if (tokens[2]?.startsWith('->')) {\n    const target = tokens[2].slice(2) || tokens[3];\n    return { name: nameToken, ...(target ? { target } : {}) };\n  }\n\n  return { name: nameToken };\n}\n\nexport function layoutMemory(doc: MemoryDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const small = typography.smallFontSize;\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n\n  const HEADER = 26,\n    PAD = 14,\n    GAP = 14,\n    REGION_GAP = 90;\n  const REGION_FILL_OPACITY = 0.26;\n  const VAR_FILL_OPACITY = 0.56;\n  const OBJECT_FILL_OPACITY = 0.62;\n\n  const itemSize = (item: Item): { w: number; h: number } => {\n    if (item.kind === 'var') {\n      return { w: Math.max(130, measureText(item.name, font).width + 56), h: 34 };\n    }\n    const titleW = measureText(item.title, font).width * 1.1;\n    const fieldW = Math.max(\n      0,\n      ...item.fields.map((f) => measureText(`${f.k}: ${f.v}`, small).width),\n    );\n    return { w: Math.max(120, titleW + 28, fieldW + 32), h: 24 + item.fields.length * 20 + 8 };\n  };\n\n  const elements: SceneElement[] = [];\n  if (doc.title)\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  const idBox = new Map<string, Rect>();\n  const anchors: Record<string, { bounds: Rect }> = {};\n  const pending: { from: Rect; target: string }[] = [];\n\n  let regionX = margin;\n  let maxBottom = margin + titleH;\n  const regionTop = margin + titleH;\n\n  for (const region of doc.regions) {\n    const sizes = region.items.map(itemSize);\n    const innerW = Math.max(80, ...sizes.map((s) => s.w));\n    const regionW = Math.max(innerW + PAD * 2, measureText(region.name, small).width + 24);\n    const contentH = sizes.reduce((s, sz) => s + sz.h + GAP, 0) - (sizes.length ? GAP : 0);\n    const regionH = HEADER + PAD + contentH + PAD;\n\n    elements.push(\n      p.rect(\n        { x: regionX, y: regionTop, width: regionW, height: regionH },\n        palette.surface,\n        palette.border,\n        1.5,\n        { rx: 8, fillOpacity: REGION_FILL_OPACITY },\n      ),\n    );\n    elements.push(\n      p.text(region.name, regionX + 12, regionTop + 17, small, palette.textMuted, {\n        weight: 'bold',\n      }),\n    );\n\n    let iy = regionTop + HEADER + PAD;\n    region.items.forEach((item, i) => {\n      const { h } = sizes[i]!;\n      const box: Rect = { x: regionX + PAD, y: iy, width: innerW, height: h };\n      if (item.kind === 'var') {\n        elements.push(\n          p.rect(box, palette.surface, palette.border, 1.5, {\n            rx: 4,\n            fillOpacity: VAR_FILL_OPACITY,\n          }),\n        );\n        elements.push(\n          p.text(item.name, box.x + 12, box.y + h / 2 + font * 0.35, font, palette.text, {\n            weight: 'bold',\n          }),\n        );\n        idBox.set(item.name, box);\n        anchors[item.name] = { bounds: box };\n        if (item.target) {\n          elements.push(\n            p.circle(\n              { x: box.x + box.width - 12, y: box.y + h / 2 },\n              3,\n              palette.primary,\n              palette.primary,\n              1,\n            ),\n          );\n          pending.push({ from: box, target: item.target });\n        }\n      } else {\n        elements.push(\n          p.rect(box, palette.surface, palette.primary, 2, {\n            rx: 6,\n            fillOpacity: OBJECT_FILL_OPACITY,\n          }),\n        );\n        elements.push(\n          p.text(item.title, box.x + 12, box.y + 18, font, palette.primary, { weight: 'bold' }),\n        );\n        item.fields.forEach((f, fi) => {\n          elements.push(\n            p.text(`${f.k}: ${f.v}`, box.x + 12, box.y + 24 + (fi + 1) * 18, small, palette.text),\n          );\n        });\n        idBox.set(item.id, box);\n        anchors[item.id] = { bounds: box };\n      }\n      iy += h + GAP;\n    });\n\n    maxBottom = Math.max(maxBottom, regionTop + regionH);\n    regionX += regionW + REGION_GAP;\n  }\n\n  // cross-region pointers (resolved after all boxes are placed)\n  const resolvedPending = pending\n    .map(({ from, target }) => {\n      const key = target.includes('.') ? target.slice(target.indexOf('.') + 1) : target;\n      const to = idBox.get(key);\n      return to ? { from, to, target } : null;\n    })\n    .filter((p): p is { from: Rect; to: Rect; target: string } => p !== null);\n\n  const allObstacles = [...idBox.values()];\n\n  // Group pending pointers by corridor\n  const corridorGroups = new Map<string, typeof resolvedPending>();\n  for (const p of resolvedPending) {\n    const isForward = p.from.x + p.from.width <= p.to.x;\n    const key = isForward\n      ? `${Math.round(p.from.x + p.from.width)}:${Math.round(p.to.x)}`\n      : `${Math.round(p.to.x + p.to.width)}:${Math.round(p.from.x)}`;\n    if (!corridorGroups.has(key)) corridorGroups.set(key, []);\n    corridorGroups.get(key)!.push(p);\n  }\n\n  for (const group of corridorGroups.values()) {\n    const N = group.length;\n    for (let i = 0; i < N; i++) {\n      const { from, to, target } = group[i]!;\n      const startX = from.x + from.width - 12;\n      const startY = from.y + from.height / 2;\n      const start = { x: startX, y: startY };\n      const isForward = startX <= to.x;\n      const endX = isForward ? to.x : to.x + to.width;\n      const targetHeaderY = to.y + Math.min(to.height / 2, 18);\n      const endY = startY >= to.y + 6 && startY <= to.y + 24 ? startY : targetHeaderY;\n      const end = { x: endX, y: endY };\n\n      const obstacles = allObstacles.filter((b) => b !== from && b !== to);\n      const hitsObstacles = countRouteCollisions([start, end], obstacles) > 0;\n\n      let points: { x: number; y: number }[];\n      let d: string;\n\n      if (!hitsObstacles) {\n        points = [start, end];\n        d = `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`;\n      } else {\n        const corridorLeft = isForward ? from.x + from.width : to.x + to.width;\n        const corridorRight = isForward ? to.x : from.x;\n        const corridorCenter = (corridorLeft + corridorRight) / 2;\n        const laneSpacing = Math.min(\n          10,\n          Math.max(6, (corridorRight - corridorLeft - 16) / (N + 1)),\n        );\n        const laneX = corridorCenter + (i - (N - 1) / 2) * laneSpacing;\n        points = [start, { x: laneX, y: start.y }, { x: laneX, y: end.y }, end];\n        const R = Math.min(\n          6,\n          Math.abs(end.y - start.y) / 3,\n          Math.abs(laneX - start.x) / 2,\n          Math.abs(end.x - laneX) / 2,\n        );\n        const signY = end.y > start.y ? 1 : -1;\n        const sx = isForward ? laneX - R : laneX + R;\n        const ex = isForward ? laneX + R : laneX - R;\n        d = `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(sx)} ${rhu(start.y)} Q ${rhu(laneX)} ${rhu(start.y)}, ${rhu(laneX)} ${rhu(start.y + signY * R)} L ${rhu(laneX)} ${rhu(end.y - signY * R)} Q ${rhu(laneX)} ${rhu(end.y)}, ${rhu(ex)} ${rhu(end.y)} L ${rhu(end.x)} ${rhu(end.y)}`;\n      }\n\n      if (countRouteCollisions(points, obstacles) > 0) {\n        console.warn(\n          `[routing] No clear route between var and ${target}: route intersects rendered objects.`,\n        );\n      }\n\n      elements.push(p.path(d, palette.primary, 1.5, { markerEnd: ARROW_ID }));\n    }\n  }\n\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width: regionX - REGION_GAP + margin, height: maxBottom + margin },\n    background: palette.background,\n    elements,\n    defs: [arrowDef(palette.primary, theme.edges?.arrowSize)],\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const memory: DiagramModule<\n  MemoryDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutMemory(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/struct/page.ts \u2014 Slotted page (storage layout).\n *\n * Value-driven:\n *   page\n *     title heap page\n *     slots 4\n *     tuples (10,Ann) (40,Bob) (50,Cy)\n *\n * Line pointers (slots) indirect to tuples \u2014 the classic slotted-page layout\n * that lets tuples move without invalidating their slot ids.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines, tokenizeDirective } from './shared.js';\n\ninterface PageDoc {\n  title?: string;\n  slots?: number;\n  tuples: string[];\n}\n\nfunction parse(input: string): PageDoc {\n  let title: string | undefined;\n  let slots: number | undefined;\n  const tuples: string[] = [];\n  for (const line of lines(input)) {\n    const t = tokenizeDirective(line);\n    if (t[0] === 'page') continue;\n    if (t[0] === 'title') {\n      title = t.slice(1).join(' ');\n      continue;\n    }\n    if (t[0] === 'slots') {\n      slots = Number(t[1]);\n      continue;\n    }\n    if (t[0] === 'tuples') {\n      tuples.push(...t.slice(1));\n      continue;\n    }\n  }\n  return {\n    ...(title !== undefined ? { title } : {}),\n    ...(slots !== undefined ? { slots } : {}),\n    tuples,\n  };\n}\n\nexport function layoutPage(doc: PageDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const small = typography.smallFontSize;\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n\n  const slotCount = doc.slots ?? doc.tuples.length;\n  const PAD = 14,\n    HEADER = 26,\n    SLOT_W = 54,\n    SLOT_H = 22,\n    TUPLE_H = 28,\n    TGAP = 18;\n  const SLOT_TOP_GAP = 12,\n    FREE_BAND = 48,\n    MIN_INNER_W = 240,\n    SLOT_FILL_OPACITY = 0.14;\n\n  const tupleWidths = doc.tuples.map((t) => Math.max(110, measureText(t, font).width + 24));\n  const columnCount = Math.max(slotCount, doc.tuples.length, 1);\n  const columnWidths = Array.from({ length: columnCount }, (_, i) =>\n    Math.max(SLOT_W, tupleWidths[i] ?? 0),\n  );\n  const contentW = columnWidths.reduce((sum, width) => sum + width, 0) + (columnCount - 1) * TGAP;\n  const innerW = Math.max(contentW, MIN_INNER_W);\n  const pageW = innerW + PAD * 2;\n  const pageH = HEADER + SLOT_TOP_GAP + SLOT_H + FREE_BAND + TUPLE_H + PAD;\n  const contentX = pxForCenteredContent(margin + PAD, innerW, contentW);\n\n  const px = margin,\n    py = margin + titleH;\n  const elements: SceneElement[] = [];\n  if (doc.title)\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n\n  elements.push(\n    p.rect({ x: px, y: py, width: pageW, height: pageH }, palette.surface, palette.border, 1.5, {\n      rx: 6,\n    }),\n  );\n  elements.push(\n    p.rect({ x: px, y: py, width: pageW, height: HEADER }, palette.primary, palette.primary, 0, {\n      rx: 0,\n    }),\n  );\n  elements.push(\n    p.text('PageHeader    freeStart \u2192        \u2190 freeEnd', px + 12, py + 17, small, '#ffffff', {\n      weight: 'bold',\n    }),\n  );\n\n  const slotY = py + HEADER + SLOT_TOP_GAP;\n  const slotCx: number[] = [];\n  const tupleCx: number[] = [];\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  const columnX: number[] = [];\n  let x = contentX;\n  for (const width of columnWidths) {\n    columnX.push(x);\n    x += width + TGAP;\n  }\n\n  for (let i = 0; i < slotCount; i++) {\n    const sx = (columnX[i] ?? contentX) + ((columnWidths[i] ?? SLOT_W) - SLOT_W) / 2;\n    const box = { x: sx, y: slotY, width: SLOT_W, height: SLOT_H };\n    elements.push(\n      p.rect(box, palette.primary, palette.primary, 1.5, { rx: 3, fillOpacity: SLOT_FILL_OPACITY }),\n    );\n    elements.push(\n      p.text(`slot${i}`, sx + SLOT_W / 2, slotY + 15, small, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n    slotCx.push(sx + SLOT_W / 2);\n    anchors[`slot${i}`] = { bounds: box };\n  }\n\n  const tupleY = slotY + SLOT_H + FREE_BAND;\n  const freeLabel = 'free space';\n  const freeLabelY = slotY + SLOT_H + FREE_BAND / 2 + font * 0.35;\n  const freeLabelX = px + pageW / 2;\n  const freeLabelWidth = measureText(freeLabel, font).width;\n  const freeLabelBounds = {\n    x1: freeLabelX - freeLabelWidth / 2 - 6,\n    x2: freeLabelX + freeLabelWidth / 2 + 6,\n    y1: freeLabelY - font - 3,\n    y2: freeLabelY + 5,\n  };\n  elements.push(\n    p.text(freeLabel, freeLabelX, freeLabelY, font, palette.textMuted, { anchor: 'middle' }),\n  );\n\n  doc.tuples.forEach((tuple, i) => {\n    const tupleW = tupleWidths[i]!;\n    const tx = (columnX[i] ?? contentX) + ((columnWidths[i] ?? tupleW) - tupleW) / 2;\n    const box = { x: tx, y: tupleY, width: tupleW, height: TUPLE_H };\n    const cx = tx + tupleW / 2;\n    tupleCx.push(cx);\n    elements.push(p.rect(box, palette.surface, palette.border, 1.5, { rx: 3 }));\n    elements.push(\n      p.text(tuple, cx, tupleY + TUPLE_H / 2 + font * 0.35, font, palette.text, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n    anchors[`tuple${i}`] = { bounds: box };\n  });\n\n  for (let i = 0; i < Math.min(slotCx.length, tupleCx.length); i++) {\n    elements.push(\n      p.path(\n        verticalArrow(slotCx[i]!, slotY + SLOT_H, tupleY, freeLabelBounds),\n        palette.textMuted,\n        1.5,\n        { markerEnd: ARROW_ID },\n      ),\n    );\n  }\n\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width: pageW + margin * 2, height: py + pageH + margin },\n    background: palette.background,\n    elements,\n    defs: [arrowDef(palette.textMuted, theme.edges?.arrowSize)],\n  };\n  // Expose the PageHeader bar as chrome so the poster label de-collision pass\n  // keeps cross-link labels from landing on top of it.\n  const chromeRects = [{ x: px, y: py, width: pageW, height: HEADER }];\n  return { scene, anchors: anchors as NodeAnchorRegistry, chromeRects };\n}\n\nfunction pxForCenteredContent(innerLeft: number, innerW: number, contentW: number): number {\n  return innerLeft + Math.max(0, (innerW - contentW) / 2);\n}\n\nfunction verticalArrow(\n  x: number,\n  y1: number,\n  y2: number,\n  avoid?: { x1: number; x2: number; y1: number; y2: number },\n): string {\n  const rx = rhu(x);\n  if (avoid && x >= avoid.x1 && x <= avoid.x2 && y1 < avoid.y2 && y2 > avoid.y1) {\n    return `M ${rx} ${rhu(y1)} L ${rx} ${rhu(Math.max(y1, avoid.y1))} M ${rx} ${rhu(Math.min(y2, avoid.y2))} L ${rx} ${rhu(y2)}`;\n  }\n  return `M ${rx} ${rhu(y1)} L ${rx} ${rhu(y2)}`;\n}\n\nexport const page: DiagramModule<PageDoc & { version: string; metadata: Record<string, unknown> }> =\n  {\n    parseMermaid(input: string) {\n      return { version: '1.0', metadata: {}, ...parse(input) };\n    },\n    parseYaml(input: string) {\n      return JSON.parse(input);\n    },\n    layout(ir, theme: ResolvedTheme): LayoutResult {\n      return layoutPage(ir, theme);\n    },\n  };\n", "/**\n * @file scene/strip.ts \u2014 Cell-strip construction.\n *\n * A strip is a contiguous (or gapped) run of equal-extent cells: arrays, heap\n * array-backings, ring/queue buffers, packet fields, B-tree key strips, slotted\n * pages. Returns the scene elements plus the bounding `slots` so pointer routing\n * (graph/connect) can clip arrows to individual cells.\n *\n * Deterministic: positions are pure functions of inputs.\n */\n\nimport type { SceneElement, Rect, Color, Point, ResolvedTheme } from '../contracts/index.js';\nimport type { Pen } from './build.js';\n\nexport interface StripCell {\n  /** Centered cell text. */\n  readonly label?: string;\n  /** Cell fill; defaults to theme surface. */\n  readonly fill?: Color;\n  /** Fill opacity override (e.g. 0.22 for a semi-transparent highlight). */\n  readonly fillOpacity?: number;\n  /** Stroke override; defaults to theme border. */\n  readonly stroke?: Color;\n  /** Optional label drawn just outside the strip (index / address). */\n  readonly index?: string;\n}\n\nexport interface StripOptions {\n  /** Top-left of the strip. */\n  readonly origin: Point;\n  readonly cellWidth: number;\n  readonly cellHeight: number;\n  /** 'horizontal' lays cells left\u2192right (default); 'vertical' top\u2192bottom. */\n  readonly orientation?: 'horizontal' | 'vertical';\n  /** Gap between cells; 0 = contiguous (default). */\n  readonly gap?: number;\n}\n\nexport interface StripResult {\n  readonly elements: SceneElement[];\n  /** Bounding rect of each cell, in input order \u2014 anchors for pointers. */\n  readonly slots: Rect[];\n  /** Overall bounding box of the strip cells (excludes index labels). */\n  readonly bounds: Rect;\n}\n\nexport function buildStrip(\n  pen: Pen,\n  theme: ResolvedTheme,\n  cells: readonly StripCell[],\n  options: StripOptions,\n): StripResult {\n  const { origin, cellWidth, cellHeight } = options;\n  const orientation = options.orientation ?? 'horizontal';\n  const gap = options.gap ?? 0;\n  const horizontal = orientation === 'horizontal';\n  const palette = theme.palette;\n\n  const elements: SceneElement[] = [];\n  const slots: Rect[] = [];\n\n  cells.forEach((cell, i) => {\n    const step = (horizontal ? cellWidth : cellHeight) + gap;\n    const x = origin.x + (horizontal ? i * step : 0);\n    const y = origin.y + (horizontal ? 0 : i * step);\n    const slot: Rect = { x, y, width: cellWidth, height: cellHeight };\n    slots.push(slot);\n    elements.push(\n      pen.rect(slot, cell.fill ?? palette.surface, cell.stroke ?? palette.border, 1.5, {\n        rx: 3,\n        ...(cell.fillOpacity !== undefined ? { fillOpacity: cell.fillOpacity } : {}),\n      }),\n    );\n    if (cell.label !== undefined) {\n      elements.push(\n        pen.text(\n          cell.label,\n          x + cellWidth / 2,\n          y + cellHeight / 2 + 5,\n          theme.typography.baseFontSize,\n          palette.text,\n          { anchor: 'middle', weight: 'bold' },\n        ),\n      );\n    }\n    if (cell.index !== undefined) {\n      // index sits just outside the strip on the leading cross edge\n      const ix = horizontal ? x + cellWidth / 2 : x - 6;\n      const iy = horizontal ? y - 6 : y + cellHeight / 2 + 4;\n      elements.push(\n        pen.text(cell.index, ix, iy, theme.typography.smallFontSize, palette.textMuted, {\n          anchor: horizontal ? 'middle' : 'end',\n        }),\n      );\n    }\n  });\n\n  const n = cells.length;\n  const totalAlong = n === 0 ? 0 : n * (horizontal ? cellWidth : cellHeight) + (n - 1) * gap;\n  const bounds: Rect = {\n    x: origin.x,\n    y: origin.y,\n    width: horizontal ? totalAlong : cellWidth,\n    height: horizontal ? cellHeight : totalAlong,\n  };\n\n  return { elements, slots, bounds };\n}\n", "/**\n * @file diagrams/queue/shared.ts \u2014 Shared helpers for the queue family.\n *\n * Queue variants (linear, circular, deque, priority) are cell-strip diagrams\n * built on the same kernel (`scene/strip.buildStrip`). They share: two\n * fixed-direction arrowhead markers (forward + reverse, so a deque can draw a\n * double-headed arrow without relying on the renderer-specific\n * `auto-start-reverse` orientation), and a `front`/`rear` pointer-below-cell\n * helper. Pure + deterministic \u2014 geometry is a function of inputs only.\n */\n\nimport type {\n  Scene,\n  SceneElement,\n  ResolvedTheme,\n  Rect,\n  TextAnchor,\n} from '../../../../contracts/index.js';\nimport type { Pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\n\nexport { lines } from '../struct/shared.js';\n\nexport type StripOrientation = 'horizontal' | 'vertical';\nexport type PointerSide = 'top' | 'right' | 'bottom' | 'left';\n\n/** Forward arrowhead (apex along travel direction) \u2014 use as `markerEnd`. */\nexport const ARROW_FWD = 'queue-arrow-fwd';\n/** Reverse arrowhead (apex against travel direction) \u2014 use as `markerStart`. */\nexport const ARROW_REV = 'queue-arrow-rev';\n\nexport function parseAxisToken(\n  token: string | undefined,\n  fallback: StripOrientation,\n): StripOrientation {\n  return token === 'horizontal' || token === 'vertical' ? token : fallback;\n}\n\n/**\n * Both arrowhead markers in the given colour.\n * `ARROW_FWD` points in the path's travel direction (markerEnd); `ARROW_REV`\n * points opposite it (markerStart) so a single straight segment can carry two\n * outward-pointing heads \u2014 the deque case.\n */\nexport function arrowDefs(color: string, size = 8): string {\n  const s = size;\n  const sH = s;\n  const sMidY = rhu(s / 2);\n  const sRefXFwd = rhu(s - 1);\n  const sRefXRev = rhu(1);\n  return (\n    `<marker id=\"${ARROW_FWD}\" markerWidth=\"${s + 1}\" markerHeight=\"${sH}\" refX=\"${sRefXFwd}\" refY=\"${sMidY}\" orient=\"auto\">` +\n    `<path d=\"M0 0 L${s} ${sMidY} L0 ${sH} z\" fill=\"${color}\" /></marker>` +\n    `<marker id=\"${ARROW_REV}\" markerWidth=\"${s + 1}\" markerHeight=\"${sH}\" refX=\"${sRefXRev}\" refY=\"${sMidY}\" orient=\"auto\">` +\n    `<path d=\"M${s} 0 L0 ${sMidY} L${s} ${sH} z\" fill=\"${color}\" /></marker>`\n  );\n}\n\n/**\n * A labelled pointer beneath a strip cell: a short vertical arrow rising into\n * the cell's bottom edge with the name below it. Mirrors `array.ts` pointers.\n * `stack` shifts the label down a row so two pointers on the same cell (e.g.\n * front == rear on a one-element queue) do not collide.\n */\nexport function pointerBelow(\n  p: Pen,\n  theme: ResolvedTheme,\n  slot: Rect,\n  name: string,\n  color: string,\n  stack = 0,\n): { elements: SceneElement[]; bottom: number } {\n  const pointer = pointerToSlot(p, theme, slot, name, color, 'bottom', stack);\n  return { elements: pointer.elements, bottom: pointer.outerEdge };\n}\n\nexport function pointerToSlot(\n  p: Pen,\n  theme: ResolvedTheme,\n  slot: Rect,\n  name: string,\n  color: string,\n  side: PointerSide,\n  stack = 0,\n): { elements: SceneElement[]; outerEdge: number } {\n  const font = theme.typography.baseFontSize;\n  const laneGap = font + 6;\n  const arrowLen = 30;\n  const labelGap = 6;\n  const cx = slot.x + slot.width / 2;\n  const cy = slot.y + slot.height / 2;\n\n  if (side === 'bottom' || side === 'top') {\n    const s = side === 'bottom' ? 1 : -1;\n    const laneX = cx;\n    const edgeY = side === 'bottom' ? slot.y + slot.height + 4 : slot.y - 4;\n    const tailY = edgeY + s * (arrowLen + stack * laneGap);\n    const labelY = tailY + s * (labelGap + (s > 0 ? font : 0));\n    return {\n      elements: [\n        p.path(`M ${rhu(laneX)} ${rhu(tailY)} L ${rhu(laneX)} ${rhu(edgeY)}`, color, 1.5, {\n          markerEnd: ARROW_FWD,\n        }),\n        p.text(name, laneX, labelY, font, color, { anchor: 'middle', weight: 'bold' }),\n      ],\n      outerEdge: s > 0 ? labelY + 4 : labelY - font - 4,\n    };\n  }\n\n  const s = side === 'right' ? 1 : -1;\n  const laneY = cy + stack * laneGap;\n  const edgeX = side === 'right' ? slot.x + slot.width + 4 : slot.x - 4;\n  const tailX = edgeX + s * arrowLen;\n  const labelX = tailX + s * labelGap;\n  const anchor: TextAnchor = s > 0 ? 'start' : 'end';\n  return {\n    elements: [\n      p.path(`M ${rhu(tailX)} ${rhu(laneY)} L ${rhu(edgeX)} ${rhu(laneY)}`, color, 1.5, {\n        markerEnd: ARROW_FWD,\n      }),\n      p.text(name, labelX, laneY + 4, font, color, { anchor, weight: 'bold' }),\n    ],\n    outerEdge: labelX,\n  };\n}\n\nexport function finalizeStripScene(\n  elements: readonly SceneElement[],\n  anchors: Record<string, { bounds: Rect }>,\n  theme: ResolvedTheme,\n  defs?: readonly string[],\n): { scene: Scene; anchors: Record<string, { bounds: Rect }> } {\n  const margin = theme.spacing.diagramMargin;\n  const contentBounds = boundsForElements(elements);\n  const dx = margin - contentBounds.x;\n  const dy = margin - contentBounds.y;\n  const shiftedElements = translateElements(elements, dx, dy);\n  const shiftedAnchors = translateAnchors(anchors, dx, dy);\n  return {\n    scene: {\n      viewBox: {\n        x: 0,\n        y: 0,\n        width: rhu(contentBounds.width + margin * 2),\n        height: rhu(contentBounds.height + margin * 2),\n      },\n      background: theme.palette.background,\n      elements: shiftedElements,\n      ...(defs !== undefined ? { defs } : {}),\n    },\n    anchors: shiftedAnchors,\n  };\n}\n\nexport function boundsForElements(elements: readonly SceneElement[]): Rect {\n  const bounds = elements.map(boundsForElement).filter((b): b is Rect => b !== undefined);\n  if (bounds.length === 0) return { x: 0, y: 0, width: 0, height: 0 };\n  const minX = Math.min(...bounds.map((b) => b.x));\n  const minY = Math.min(...bounds.map((b) => b.y));\n  const maxX = Math.max(...bounds.map((b) => b.x + b.width));\n  const maxY = Math.max(...bounds.map((b) => b.y + b.height));\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction boundsForElement(element: SceneElement): Rect | undefined {\n  switch (element.type) {\n    case 'rect':\n      return element.bounds;\n    case 'circle':\n      return {\n        x: element.center.x - element.radius,\n        y: element.center.y - element.radius,\n        width: element.radius * 2,\n        height: element.radius * 2,\n      };\n    case 'path':\n      return boundsForPath(element.d, element.strokeWidth);\n    case 'text':\n      return boundsForText(element);\n    case 'group':\n      return boundsForElements(element.children);\n  }\n}\n\nfunction boundsForText(text: Extract<SceneElement, { type: 'text' }>): Rect {\n  const measured = measureText(text.content, text.fontSize);\n  const x =\n    text.anchor === 'middle'\n      ? text.position.x - measured.width / 2\n      : text.anchor === 'end'\n        ? text.position.x - measured.width\n        : text.position.x;\n  return {\n    x,\n    y: text.position.y - text.fontSize,\n    width: measured.width,\n    height: text.fontSize * 1.25,\n  };\n}\n\nfunction boundsForPath(d: string, strokeWidth: number): Rect {\n  const nums = [...d.matchAll(/-?\\d+(?:\\.\\d+)?/g)].map((match) => Number(match[0]));\n  if (nums.length < 2) return { x: 0, y: 0, width: 0, height: 0 };\n  const xs = nums.filter((_, i) => i % 2 === 0);\n  const ys = nums.filter((_, i) => i % 2 === 1);\n  const pad = strokeWidth / 2;\n  const minX = Math.min(...xs) - pad;\n  const minY = Math.min(...ys) - pad;\n  const maxX = Math.max(...xs) + pad;\n  const maxY = Math.max(...ys) + pad;\n  return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction translateElements(\n  elements: readonly SceneElement[],\n  dx: number,\n  dy: number,\n): SceneElement[] {\n  return elements.map((element) => translateElement(element, dx, dy));\n}\n\nfunction translateElement(element: SceneElement, dx: number, dy: number): SceneElement {\n  switch (element.type) {\n    case 'rect':\n      return { ...element, bounds: translateRect(element.bounds, dx, dy) };\n    case 'circle':\n      return {\n        ...element,\n        center: { x: rhu(element.center.x + dx), y: rhu(element.center.y + dy) },\n      };\n    case 'path':\n      return { ...element, d: translatePathD(element.d, dx, dy) };\n    case 'text':\n      return {\n        ...element,\n        position: { x: rhu(element.position.x + dx), y: rhu(element.position.y + dy) },\n      };\n    case 'group':\n      return { ...element, children: translateElements(element.children, dx, dy) };\n    case 'icon':\n      return { ...element, x: rhu(element.x + dx), y: rhu(element.y + dy) };\n  }\n}\n\nfunction translateAnchors(\n  anchors: Record<string, { bounds: Rect }>,\n  dx: number,\n  dy: number,\n): Record<string, { bounds: Rect }> {\n  return Object.fromEntries(\n    Object.entries(anchors).map(([key, anchor]) => [\n      key,\n      { bounds: translateRect(anchor.bounds, dx, dy) },\n    ]),\n  );\n}\n\nfunction translateRect(rect: Rect, dx: number, dy: number): Rect {\n  return { x: rhu(rect.x + dx), y: rhu(rect.y + dy), width: rect.width, height: rect.height };\n}\n\nfunction translatePathD(d: string, dx: number, dy: number): string {\n  let i = 0;\n  return d.replace(/-?\\d+(?:\\.\\d+)?/g, (value) => {\n    const delta = i++ % 2 === 0 ? dx : dy;\n    return String(rhu(Number(value) + delta));\n  });\n}\n", "/**\n * @file diagrams/queue/queue.ts \u2014 Linear (FIFO) queue.\n *\n * A horizontal cell strip. Items enter at the REAR (right) via an `enqueue`\n * arrow and leave at the FRONT (left) via a `dequeue` arrow. `front`/`rear`\n * pointers sit beneath the filled cells; a `capacity` larger than the filled\n * count shows trailing empty slots.\n *\n * Value-driven mini-syntax:\n *   queue A B C                 // three filled cells\n *   queue\n *     title task queue\n *     cells A B C\n *     capacity 5                // 2 trailing empty slots\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport {\n  ARROW_FWD,\n  arrowDefs,\n  finalizeStripScene,\n  lines,\n  parseAxisToken,\n  pointerBelow,\n  pointerToSlot,\n  type StripOrientation,\n} from './shared.js';\n\nexport interface QueueDoc {\n  title?: string;\n  cells: string[];\n  capacity?: number;\n  axis?: StripOrientation;\n}\n\nfunction parse(input: string): QueueDoc {\n  let title: string | undefined;\n  let cells: string[] = [];\n  let capacity: number | undefined;\n  let axis: StripOrientation = 'horizontal';\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'queue') {\n      if (t.length > 1) cells = t.slice(1);\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = line.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'cells' || t[0] === 'items') {\n      cells = t.slice(1);\n      continue;\n    }\n    if (t[0] === 'capacity') {\n      const n = Number(t[1]);\n      if (Number.isFinite(n)) capacity = n;\n      continue;\n    }\n    if (t[0] === 'axis') {\n      axis = parseAxisToken(t[1], axis);\n      continue;\n    }\n  }\n  return {\n    ...(title !== undefined ? { title } : {}),\n    cells,\n    ...(capacity !== undefined ? { capacity } : {}),\n    axis,\n  };\n}\n\nexport function layoutQueue(doc: QueueDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 40;\n  const filled = doc.cells.length;\n  const total = Math.max(filled, doc.capacity ?? filled);\n  const cellW = Math.max(46, ...doc.cells.map((c) => measureText(c, font).width + 24));\n  const axis: StripOrientation = doc.axis === 'vertical' ? 'vertical' : 'horizontal';\n  const horizontal = axis === 'horizontal';\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const topH = font + 14; // room for enqueue / dequeue captions\n  const sideGap = 50; // room for the end arrows\n  const origin = horizontal\n    ? { x: margin + sideGap, y: margin + titleH + topH }\n    : { x: margin, y: margin + titleH + sideGap };\n\n  const cellInputs: StripCell[] = Array.from({ length: total }, (_, i) =>\n    i < filled ? { label: doc.cells[i]! } : { fill: palette.background },\n  );\n  const strip = buildStrip(p, theme, cellInputs, {\n    origin,\n    cellWidth: cellW,\n    cellHeight: cellH,\n    orientation: axis,\n  });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  if (horizontal) {\n    const midY = origin.y + cellH / 2;\n    const leftEdge = origin.x;\n    const rightEdge = origin.x + total * cellW;\n\n    // dequeue \u2014 leaves at the FRONT (left), pointing out\n    elements.push(\n      p.path(\n        `M ${rhu(leftEdge)} ${rhu(midY)} L ${rhu(margin)} ${rhu(midY)}`,\n        palette.primary,\n        1.5,\n        { markerEnd: ARROW_FWD },\n      ),\n    );\n    elements.push(\n      p.text('dequeue', leftEdge - sideGap / 2, origin.y - 8, font, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n\n    // enqueue \u2014 enters at the REAR (right), pointing in\n    elements.push(\n      p.path(\n        `M ${rhu(rightEdge + sideGap)} ${rhu(midY)} L ${rhu(rightEdge)} ${rhu(midY)}`,\n        palette.primary,\n        1.5,\n        { markerEnd: ARROW_FWD },\n      ),\n    );\n    elements.push(\n      p.text('enqueue', rightEdge + sideGap / 2, origin.y - 8, font, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n  } else {\n    const midX = origin.x + cellW / 2;\n    const topEdge = origin.y;\n    const bottomEdge = origin.y + total * cellH;\n\n    // dequeue \u2014 leaves at the FRONT (top), pointing out\n    elements.push(\n      p.path(\n        `M ${rhu(midX)} ${rhu(topEdge)} L ${rhu(midX)} ${rhu(topEdge - sideGap)}`,\n        palette.primary,\n        1.5,\n        { markerEnd: ARROW_FWD },\n      ),\n    );\n    elements.push(\n      p.text('dequeue', midX, topEdge - sideGap / 2 - 6, font, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n\n    // enqueue \u2014 enters at the REAR (bottom), pointing in\n    elements.push(\n      p.path(\n        `M ${rhu(midX)} ${rhu(bottomEdge + sideGap)} L ${rhu(midX)} ${rhu(bottomEdge)}`,\n        palette.primary,\n        1.5,\n        { markerEnd: ARROW_FWD },\n      ),\n    );\n    elements.push(\n      p.text('enqueue', midX, bottomEdge + sideGap / 2 + font, font, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n  }\n\n  // front / rear pointers below the filled span\n  if (filled > 0) {\n    const frontSlot = strip.slots[0]!;\n    const rearSlot = strip.slots[filled - 1]!;\n    const same = filled === 1;\n    const front = horizontal\n      ? pointerBelow(p, theme, frontSlot, 'front', palette.secondary, 0)\n      : pointerToSlot(p, theme, frontSlot, 'front', palette.secondary, 'right', 0);\n    const rear = horizontal\n      ? pointerBelow(p, theme, rearSlot, 'rear', palette.primary, same ? 1 : 0)\n      : pointerToSlot(p, theme, rearSlot, 'rear', palette.primary, 'right', same ? 1 : 0);\n    elements.push(...front.elements, ...rear.elements);\n  }\n\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  strip.slots.forEach((slot, i) => {\n    anchors[`c${i}`] = { bounds: slot };\n  });\n\n  const finalized = finalizeStripScene(elements, anchors, theme, [\n    arrowDefs(palette.primary, theme.edges?.arrowSize),\n  ]);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nexport const queue: DiagramModule<\n  QueueDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutQueue(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/queue/cqueue.ts \u2014 Circular (ring-buffer) queue.\n *\n * Same horizontal strip as the linear queue, but an orthogonal wrap-around\n * connector routes from the REAR cell back to the FRONT cell \u2014 the modular\n * (ring) continuity. `front`/`rear` markers sit beneath their cells and may\n * wrap independently. This is the strip-plus-wrap rendering (not a true radial\n * ring): the intended look of the reference's top-right panel.\n *\n * Value-driven mini-syntax:\n *   cqueue\n *     title ring buffer\n *     capacity 6\n *     cells _ B C D _ _       // `_` (or `.`) is an empty slot\n *     front 1\n *     rear 3\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n  Rect,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { routeConnectors } from '../../../../crosslink/connectors.js';\nimport {\n  ARROW_FWD,\n  arrowDefs,\n  finalizeStripScene,\n  lines,\n  parseAxisToken,\n  pointerBelow,\n  pointerToSlot,\n  type StripOrientation,\n} from './shared.js';\n\nexport interface CQueueDoc {\n  title?: string;\n  capacity: number;\n  cells: (string | null)[];\n  front?: number;\n  rear?: number;\n  axis?: StripOrientation;\n}\n\nconst EMPTY = new Set(['_', '.', '-']);\n\nfunction parse(input: string): CQueueDoc {\n  let title: string | undefined;\n  let cells: (string | null)[] = [];\n  let capacity: number | undefined;\n  let front: number | undefined;\n  let rear: number | undefined;\n  let axis: StripOrientation = 'horizontal';\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'cqueue') {\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = line.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'capacity') {\n      const n = Number(t[1]);\n      if (Number.isFinite(n)) capacity = n;\n      continue;\n    }\n    if (t[0] === 'cells' || t[0] === 'items') {\n      cells = t.slice(1).map((v) => (EMPTY.has(v) ? null : v));\n      continue;\n    }\n    if (t[0] === 'front') {\n      const n = Number(t[1]);\n      if (Number.isFinite(n)) front = n;\n      continue;\n    }\n    if (t[0] === 'rear') {\n      const n = Number(t[1]);\n      if (Number.isFinite(n)) rear = n;\n      continue;\n    }\n    if (t[0] === 'axis') {\n      axis = parseAxisToken(t[1], axis);\n      continue;\n    }\n  }\n\n  const cap = capacity ?? cells.length;\n  // pad / clamp cells to capacity\n  const padded: (string | null)[] = Array.from({ length: cap }, (_, i) => cells[i] ?? null);\n  // infer front/rear from occupancy when not given\n  const firstFilled = padded.findIndex((c) => c !== null);\n  let lastFilled = -1;\n  for (let i = 0; i < padded.length; i++) if (padded[i] !== null) lastFilled = i;\n  const f = front ?? (firstFilled >= 0 ? firstFilled : 0);\n  const r = rear ?? (lastFilled >= 0 ? lastFilled : 0);\n\n  return {\n    ...(title !== undefined ? { title } : {}),\n    capacity: cap,\n    cells: padded,\n    front: f,\n    rear: r,\n    axis,\n  };\n}\n\nexport function layoutCQueue(doc: CQueueDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 40;\n  const total = doc.capacity;\n  const labelW = doc.cells.map((c) => (c ? measureText(c, font).width : 0));\n  const cellW = Math.max(46, ...labelW.map((w) => w + 24));\n  const axis: StripOrientation = doc.axis === 'vertical' ? 'vertical' : 'horizontal';\n  const horizontal = axis === 'horizontal';\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const arcH = 44; // room for the wrap arc above the strip\n  const origin = horizontal\n    ? { x: margin, y: margin + titleH + arcH }\n    : { x: margin + arcH, y: margin + titleH };\n\n  const cellInputs: StripCell[] = doc.cells.map((v, i) =>\n    v !== null ? { label: v, index: String(i) } : { fill: palette.background, index: String(i) },\n  );\n  const strip = buildStrip(p, theme, cellInputs, {\n    origin,\n    cellWidth: cellW,\n    cellHeight: cellH,\n    orientation: axis,\n  });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  const rearSlot = strip.slots[doc.rear ?? 0];\n  const frontSlot = strip.slots[doc.front ?? 0];\n  const anchors: Record<string, { bounds: Rect }> = {};\n  strip.slots.forEach((slot, i) => {\n    anchors[`c${i}`] = { bounds: slot };\n  });\n  if (frontSlot) anchors.front = { bounds: frontSlot };\n  if (rearSlot) anchors.rear = { bounds: rearSlot };\n\n  // Implicit wrap connector: rear slot \u2192 front slot, routed through the shared\n  // connector seam with wall hints that keep the channel outboard.\n  if (rearSlot && frontSlot) {\n    const selfLoop = (doc.front ?? 0) === (doc.rear ?? 0);\n    const connectorAnchors = selfLoop\n      ? selfLoopWrapAnchors(frontSlot, horizontal)\n      : strip.slots.reduce<Record<string, { bounds: Rect }>>((acc, slot, i) => {\n          acc[`c${i}`] = { bounds: slot };\n          return acc;\n        }, {});\n    const fromKey = selfLoop ? '__rearWrap' : `c${doc.rear ?? 0}`;\n    const toKey = selfLoop ? '__frontWrap' : `c${doc.front ?? 0}`;\n    const connectorResult = routeConnectors({\n      anchors: connectorAnchors,\n      connectors: [\n        {\n          fromKey,\n          toKey,\n          direction: 'directed',\n          style: 'solid',\n          label: `mod ${total}`,\n          routing: 'orthogonal',\n          exitWall: horizontal ? 'N' : 'W',\n          entryWall: horizontal ? 'N' : 'W',\n          animation: 'none',\n          props: {\n            color: palette.primary,\n            routePadding: arcH - 8,\n            labelPlacement: 'path-midpoint',\n          },\n        },\n      ],\n      theme,\n    });\n    const connectorElements = connectorResult.elements.map((element) =>\n      element.type === 'path' && element.markerEnd?.startsWith('triton-crosslink-arrow-')\n        ? { ...element, markerEnd: ARROW_FWD, strokeWidth: 1.5 }\n        : element,\n    );\n    const linkPaths = connectorElements.filter((e) => e.type !== 'text');\n    const linkLabels = connectorElements.filter((e) => e.type === 'text');\n    elements.push(...linkPaths, ...linkLabels);\n  }\n\n  // front / rear pointers below\n  if (frontSlot && rearSlot) {\n    const same = (doc.front ?? 0) === (doc.rear ?? 0);\n    const front = horizontal\n      ? pointerBelow(p, theme, frontSlot, 'front', palette.secondary, 0)\n      : pointerToSlot(p, theme, frontSlot, 'front', palette.secondary, 'right', 0);\n    const rear = horizontal\n      ? pointerBelow(p, theme, rearSlot, 'rear', palette.primary, same ? 1 : 0)\n      : pointerToSlot(p, theme, rearSlot, 'rear', palette.primary, 'right', same ? 1 : 0);\n    elements.push(...front.elements, ...rear.elements);\n  }\n\n  const finalized = finalizeStripScene(elements, anchors, theme, [\n    arrowDefs(palette.primary, theme.edges?.arrowSize),\n  ]);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nfunction selfLoopWrapAnchors(slot: Rect, horizontal: boolean): Record<string, { bounds: Rect }> {\n  if (horizontal) {\n    return {\n      __rearWrap: {\n        bounds: {\n          x: slot.x + slot.width / 2,\n          y: slot.y,\n          width: slot.width / 2,\n          height: slot.height,\n        },\n      },\n      __frontWrap: { bounds: { x: slot.x, y: slot.y, width: slot.width / 2, height: slot.height } },\n    };\n  }\n  return {\n    __rearWrap: {\n      bounds: {\n        x: slot.x,\n        y: slot.y + slot.height / 2,\n        width: slot.width,\n        height: slot.height / 2,\n      },\n    },\n    __frontWrap: { bounds: { x: slot.x, y: slot.y, width: slot.width, height: slot.height / 2 } },\n  };\n}\n\nexport const cqueue: DiagramModule<\n  CQueueDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutCQueue(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/queue/deque.ts \u2014 Double-ended queue (deque).\n *\n * A horizontal cell strip with a double-headed arrow at BOTH ends: insert and\n * remove are legal at the front (left) and the rear (right). `front`/`rear`\n * markers sit beneath the end cells.\n *\n * Value-driven mini-syntax:\n *   deque A B C D\n *   deque\n *     title work-stealing deque\n *     cells A B C D\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport {\n  ARROW_FWD,\n  ARROW_REV,\n  arrowDefs,\n  finalizeStripScene,\n  lines,\n  parseAxisToken,\n  pointerBelow,\n  pointerToSlot,\n  type StripOrientation,\n} from './shared.js';\n\nexport interface DequeDoc {\n  title?: string;\n  cells: string[];\n  axis?: StripOrientation;\n}\n\nfunction parse(input: string): DequeDoc {\n  let title: string | undefined;\n  let cells: string[] = [];\n  let axis: StripOrientation = 'horizontal';\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'deque') {\n      if (t.length > 1) cells = t.slice(1);\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = line.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'cells' || t[0] === 'items') {\n      cells = t.slice(1);\n      continue;\n    }\n    if (t[0] === 'axis') {\n      axis = parseAxisToken(t[1], axis);\n      continue;\n    }\n  }\n  return { ...(title !== undefined ? { title } : {}), cells, axis };\n}\n\nexport function layoutDeque(doc: DequeDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 40;\n  const n = doc.cells.length;\n  const cellW = Math.max(46, ...doc.cells.map((c) => measureText(c, font).width + 24));\n  const axis: StripOrientation = doc.axis === 'vertical' ? 'vertical' : 'horizontal';\n  const horizontal = axis === 'horizontal';\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const topH = font + 14; // room for the push/pop captions\n  const sideGap = 56; // room for the double-headed end arrows\n  const origin = horizontal\n    ? { x: margin + sideGap, y: margin + titleH + topH }\n    : { x: margin, y: margin + titleH + sideGap };\n\n  const cellInputs: StripCell[] = doc.cells.map((v) => ({ label: v }));\n  const strip = buildStrip(p, theme, cellInputs, {\n    origin,\n    cellWidth: cellW,\n    cellHeight: cellH,\n    orientation: axis,\n  });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  if (horizontal) {\n    const midY = origin.y + cellH / 2;\n    const leftEdge = origin.x;\n    const rightEdge = origin.x + n * cellW;\n\n    // double-headed arrow at the FRONT (left)\n    elements.push(\n      p.path(\n        `M ${rhu(leftEdge)} ${rhu(midY)} L ${rhu(margin)} ${rhu(midY)}`,\n        palette.primary,\n        1.5,\n        { markerStart: ARROW_REV, markerEnd: ARROW_FWD },\n      ),\n    );\n    elements.push(\n      p.text('push / pop', leftEdge - sideGap / 2, origin.y - 8, font, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n\n    // double-headed arrow at the REAR (right)\n    elements.push(\n      p.path(\n        `M ${rhu(rightEdge)} ${rhu(midY)} L ${rhu(rightEdge + sideGap)} ${rhu(midY)}`,\n        palette.primary,\n        1.5,\n        { markerStart: ARROW_REV, markerEnd: ARROW_FWD },\n      ),\n    );\n    elements.push(\n      p.text('push / pop', rightEdge + sideGap / 2, origin.y - 8, font, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n  } else {\n    const midX = origin.x + cellW / 2;\n    const topEdge = origin.y;\n    const bottomEdge = origin.y + n * cellH;\n\n    // double-headed arrow at the FRONT (top)\n    elements.push(\n      p.path(\n        `M ${rhu(midX)} ${rhu(topEdge)} L ${rhu(midX)} ${rhu(topEdge - sideGap)}`,\n        palette.primary,\n        1.5,\n        { markerStart: ARROW_REV, markerEnd: ARROW_FWD },\n      ),\n    );\n    elements.push(\n      p.text('push / pop', midX, topEdge - sideGap / 2 - 6, font, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n\n    // double-headed arrow at the REAR (bottom)\n    elements.push(\n      p.path(\n        `M ${rhu(midX)} ${rhu(bottomEdge)} L ${rhu(midX)} ${rhu(bottomEdge + sideGap)}`,\n        palette.primary,\n        1.5,\n        { markerStart: ARROW_REV, markerEnd: ARROW_FWD },\n      ),\n    );\n    elements.push(\n      p.text('push / pop', midX, bottomEdge + sideGap / 2 + font, font, palette.primary, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n  }\n\n  // front / rear pointers\n  if (n > 0) {\n    const frontSlot = strip.slots[0]!;\n    const rearSlot = strip.slots[n - 1]!;\n    const same = n === 1;\n    const front = horizontal\n      ? pointerBelow(p, theme, frontSlot, 'front', palette.secondary, 0)\n      : pointerToSlot(p, theme, frontSlot, 'front', palette.secondary, 'right', 0);\n    const rear = horizontal\n      ? pointerBelow(p, theme, rearSlot, 'rear', palette.primary, same ? 1 : 0)\n      : pointerToSlot(p, theme, rearSlot, 'rear', palette.primary, 'right', same ? 1 : 0);\n    elements.push(...front.elements, ...rear.elements);\n  }\n\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  strip.slots.forEach((slot, i) => {\n    anchors[`c${i}`] = { bounds: slot };\n  });\n\n  const finalized = finalizeStripScene(elements, anchors, theme, [\n    arrowDefs(palette.primary, theme.edges?.arrowSize),\n  ]);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nexport const deque: DiagramModule<\n  DequeDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutDeque(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/queue/pqueue.ts \u2014 Priority queue.\n *\n * A strip of cells ordered by priority (highest first). Each cell\n * is shaded by its priority \u2014 a deterministic tint of the theme's primary\n * accent (strongest first) \u2014 and shows its priority value on the right.\n *\n * Value-driven mini-syntax:\n *   pqueue\n *     title scheduler\n *     item Deploy 9\n *     item Build 5\n *     item Lint 2\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n  Color,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { finalizeStripScene, lines, parseAxisToken, type StripOrientation } from './shared.js';\n\nexport interface PQItem {\n  label: string;\n  priority: number;\n}\n\nexport interface PQueueDoc {\n  title?: string;\n  items: PQItem[];\n  axis?: StripOrientation;\n}\n\nfunction parse(input: string): PQueueDoc {\n  let title: string | undefined;\n  const items: PQItem[] = [];\n  let axis: StripOrientation = 'horizontal';\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'pqueue') {\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = line.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'axis') {\n      axis = parseAxisToken(t[1], axis);\n      continue;\n    }\n    if (t[0] === 'item') {\n      // `item <label words...> <priority>` \u2014 trailing token is the priority.\n      const rest = line.slice(4).trim();\n      const m = rest.match(/^(.*?)\\s+(-?\\d+(?:\\.\\d+)?)\\s*$/);\n      if (m) items.push({ label: m[1]!.trim(), priority: Number(m[2]) });\n      else if (rest) items.push({ label: rest, priority: 0 });\n    }\n  }\n  return { ...(title !== undefined ? { title } : {}), items, axis };\n}\n\n/** Parse `#rgb` / `#rrggbb` into [r,g,b], or null if not a hex colour. */\nfunction parseHex(c: string): [number, number, number] | null {\n  const s = c.trim();\n  const m3 = s.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);\n  if (m3)\n    return [\n      parseInt(m3[1]! + m3[1]!, 16),\n      parseInt(m3[2]! + m3[2]!, 16),\n      parseInt(m3[3]! + m3[3]!, 16),\n    ];\n  const m6 = s.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n  if (m6) return [parseInt(m6[1]!, 16), parseInt(m6[2]!, 16), parseInt(m6[3]!, 16)];\n  return null;\n}\n\nfunction toHex(n: number): string {\n  return Math.max(0, Math.min(255, Math.round(n)))\n    .toString(16)\n    .padStart(2, '0');\n}\n\n/** Linear mix of two hex colours at t\u2208[0,1]; falls back to `a` if non-hex. */\nfunction mixHex(a: Color, b: Color, t: number): Color {\n  const ca = parseHex(a),\n    cb = parseHex(b);\n  if (!ca || !cb) return a;\n  const r = ca[0] + (cb[0] - ca[0]) * t;\n  const g = ca[1] + (cb[1] - ca[1]) * t;\n  const bl = ca[2] + (cb[2] - ca[2]) * t;\n  return `#${toHex(r)}${toHex(g)}${toHex(bl)}`;\n}\n\nexport function layoutPQueue(doc: PQueueDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 38;\n  const axis: StripOrientation = doc.axis === 'vertical' ? 'vertical' : 'horizontal';\n\n  // Highest priority first; ties keep input order (stable).\n  const items = doc.items\n    .map((it, i) => ({ ...it, i }))\n    .sort((a, b) => b.priority - a.priority || a.i - b.i);\n\n  const priorities = items.map((it) => it.priority);\n  const max = priorities.length ? Math.max(...priorities) : 0;\n  const min = priorities.length ? Math.min(...priorities) : 0;\n  const span = max - min;\n\n  const labelW = Math.max(40, ...items.map((it) => measureText(it.label, font).width));\n  const prioW = Math.max(24, ...items.map((it) => measureText(String(it.priority), font).width));\n  const padX = 14;\n  const cellW = labelW + prioW + padX * 3;\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const origin = { x: margin, y: margin + titleH };\n\n  // Shade: highest \u2192 near primary (t small), lowest \u2192 near surface (t large).\n  const cellInputs: StripCell[] = items.map((it) => {\n    const norm = span === 0 ? 1 : (it.priority - min) / span;\n    const t = 0.15 + (1 - norm) * 0.65; // 0.15 (top) \u2026 0.80 (bottom)\n    return { fill: mixHex(palette.primary, palette.surface, t) };\n  });\n\n  const strip = buildStrip(p, theme, cellInputs, {\n    origin,\n    cellWidth: cellW,\n    cellHeight: cellH,\n    orientation: axis,\n  });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // Overlay: label (left) + priority value (right) per cell.\n  items.forEach((it, i) => {\n    const slot = strip.slots[i]!;\n    const cy = slot.y + slot.height / 2 + font * 0.35;\n    elements.push(p.text(it.label, slot.x + padX, cy, font, palette.text, { weight: 'bold' }));\n    elements.push(\n      p.text(String(it.priority), slot.x + slot.width - padX, cy, font, palette.text, {\n        anchor: 'end',\n        weight: 'bold',\n      }),\n    );\n  });\n\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  strip.slots.forEach((slot, i) => {\n    anchors[`c${i}`] = { bounds: slot };\n  });\n\n  const finalized = finalizeStripScene(elements, anchors, theme);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nexport const pqueue: DiagramModule<\n  PQueueDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutPQueue(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/stack/stack.ts \u2014 LIFO stack (vertical cell strip + top marker).\n *\n * A vertical run of cells. The most-recently-pushed item sits at the TOP\n * (smallest y); push and pop both happen at the top. A `top` pointer points\n * into the top-of-stack cell from the left; a `capacity` larger than the\n * filled count shows empty slots above the top (the stack grows upward).\n *\n * Value-driven mini-syntax:\n *   stack A B C D                 // push order; D is on top\n *   stack\n *     title call stack\n *     cells main parse layout     // layout is on top\n *     capacity 6                  // 3 empty slots above\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport {\n  finalizeStripScene,\n  parseAxisToken,\n  pointerToSlot,\n  type StripOrientation,\n} from '../queue/shared.js';\nimport { ARROW_ID, arrowDef, lines } from '../struct/shared.js';\n\nexport interface StackDoc {\n  title?: string;\n  /** Push order \u2014 the last element is the top of the stack. */\n  cells: string[];\n  capacity?: number;\n  axis?: StripOrientation;\n}\n\nfunction parse(input: string): StackDoc {\n  let title: string | undefined;\n  let cells: string[] = [];\n  let capacity: number | undefined;\n  let axis: StripOrientation = 'vertical';\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'stack') {\n      if (t.length > 1) cells = t.slice(1);\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = line.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'cells' || t[0] === 'items') {\n      cells = t.slice(1);\n      continue;\n    }\n    if (t[0] === 'capacity') {\n      const n = Number(t[1]);\n      if (Number.isFinite(n)) capacity = n;\n      continue;\n    }\n    if (t[0] === 'axis') {\n      axis = parseAxisToken(t[1], axis);\n      continue;\n    }\n  }\n  return {\n    ...(title !== undefined ? { title } : {}),\n    cells,\n    ...(capacity !== undefined ? { capacity } : {}),\n    axis,\n  };\n}\n\nexport function layoutStack(doc: StackDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 38;\n  const filled = doc.cells.length;\n  const total = Math.max(filled, doc.capacity ?? filled, 1);\n  const empty = total - filled;\n  const cellW = Math.max(64, ...doc.cells.map((c) => measureText(c, font).width + 28));\n  const axis: StripOrientation = doc.axis === 'horizontal' ? 'horizontal' : 'vertical';\n  const horizontal = axis === 'horizontal';\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const topH = font + 18; // room for the push / pop caption\n  const sideGap = 64; // room for the `top` pointer on the left\n  const origin = horizontal\n    ? { x: margin, y: margin + titleH + topH }\n    : { x: margin + sideGap, y: margin + titleH + topH };\n\n  // Top-of-stack drawn at the top: empty slots first, then filled cells in\n  // reverse push order (last pushed is topmost).\n  const display: (string | null)[] = [\n    ...Array.from({ length: empty }, () => null),\n    ...[...doc.cells].reverse(),\n  ];\n  const cellInputs: StripCell[] = display.map((v) =>\n    v !== null ? { label: v } : { fill: palette.background },\n  );\n  const strip = buildStrip(p, theme, cellInputs, {\n    origin,\n    cellWidth: cellW,\n    cellHeight: cellH,\n    orientation: axis,\n  });\n\n  const elements: SceneElement[] = [...strip.elements];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  const topSlot = filled > 0 ? strip.slots[empty]! : strip.slots[0];\n  const actionX = topSlot ? topSlot.x + topSlot.width / 2 : origin.x + cellW / 2;\n  elements.push(\n    p.text('push / pop', actionX, origin.y - 9, font, palette.primary, {\n      anchor: 'middle',\n      weight: 'bold',\n    }),\n  );\n  elements.push(\n    p.path(\n      `M ${rhu(actionX)} ${rhu(origin.y - topH + 8)} L ${rhu(actionX)} ${rhu(origin.y)}`,\n      palette.primary,\n      1.5,\n      { markerEnd: ARROW_ID },\n    ),\n  );\n\n  // `top` pointer \u2014 points into the top-of-stack cell\n  if (filled > 0) {\n    if (horizontal) {\n      const top = pointerToSlot(p, theme, topSlot!, 'top', palette.secondary, 'bottom', 0);\n      elements.push(...top.elements);\n    } else {\n      const cyTop = topSlot!.y + topSlot!.height / 2;\n      elements.push(\n        p.path(\n          `M ${rhu(origin.x - sideGap + 8)} ${rhu(cyTop)} L ${rhu(origin.x)} ${rhu(cyTop)}`,\n          palette.secondary,\n          1.5,\n          { markerEnd: ARROW_ID },\n        ),\n      );\n      elements.push(\n        p.text('top', origin.x - sideGap + 6, cyTop - 6, font, palette.secondary, {\n          anchor: 'start',\n          weight: 'bold',\n        }),\n      );\n    }\n  }\n\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  strip.slots.forEach((slot, i) => {\n    anchors[`c${i}`] = { bounds: slot };\n  });\n\n  const finalized = finalizeStripScene(elements, anchors, theme, [\n    arrowDef(palette.primary, theme.edges?.arrowSize),\n  ]);\n  return { scene: finalized.scene, anchors: finalized.anchors as NodeAnchorRegistry };\n}\n\nexport const stack: DiagramModule<\n  StackDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutStack(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/hashmap/hashmap.ts \u2014 Hash map with separate chaining.\n *\n * A vertical strip of buckets. Each non-empty bucket points right to a chain\n * of key\u2192value entries (a singly linked list), reusing the slot/pointer\n * kernel idiom from the linked-list struct. Buckets can be numbered or labeled\n * with arbitrary strings, and empty buckets show their configured label.\n *\n * Value-driven mini-syntax:\n *   hashmap\n *     title users\n *     buckets name, email, phone\n *     bucket name: alice->1, bob->2  // two chained entries\n *     bucket phone: carol->3\n *\n * Entry separators: `,` between entries; `->`, `=>`, `:` or `=` between\n * key and value.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { rhu } from '../../../../util/round.js';\nimport { ARROW_ID, arrowDef, lines } from '../struct/shared.js';\n\nexport interface HashEntry {\n  key: string;\n  value: string;\n}\nexport interface HashChain {\n  index: number | string;\n  entries: HashEntry[];\n}\n\nexport interface HashmapDoc {\n  title?: string;\n  buckets: number;\n  bucketLabels: string[];\n  chains: HashChain[];\n}\n\nfunction parseEntries(spec: string): HashEntry[] {\n  return spec\n    .split(',')\n    .map((s) => s.trim())\n    .filter(Boolean)\n    .map((pair) => {\n      const m = pair.match(/^(.*?)\\s*(?:->|=>|:|=)\\s*(.*)$/);\n      if (m) return { key: m[1]!.trim(), value: m[2]!.trim() };\n      return { key: pair, value: '' };\n    });\n}\n\nfunction parseBucketLabels(spec: string): string[] {\n  const labels: string[] = [];\n  let current = '';\n  let inQuotes = false;\n  let escaping = false;\n\n  for (const ch of spec) {\n    if (escaping) {\n      current += ch;\n      escaping = false;\n      continue;\n    }\n    if (inQuotes && ch === '\\\\') {\n      escaping = true;\n      continue;\n    }\n    if (ch === '\"') {\n      inQuotes = !inQuotes;\n      continue;\n    }\n    if (!inQuotes && ch === ',') {\n      const label = current.trim();\n      if (label) labels.push(label);\n      current = '';\n      continue;\n    }\n    current += ch;\n  }\n\n  if (inQuotes) throw new Error(`Unterminated bucket label: ${spec}`);\n  const tail = current.trim();\n  if (tail) labels.push(tail);\n  return labels;\n}\n\nfunction splitBucketDirective(spec: string): { id: string; entries: string } | null {\n  let inQuotes = false;\n  let escaping = false;\n\n  for (let i = 0; i < spec.length; i++) {\n    const ch = spec[i]!;\n    if (escaping) {\n      escaping = false;\n      continue;\n    }\n    if (inQuotes && ch === '\\\\') {\n      escaping = true;\n      continue;\n    }\n    if (ch === '\"') {\n      inQuotes = !inQuotes;\n      continue;\n    }\n    if (!inQuotes && ch === ':') {\n      return { id: spec.slice(0, i).trim(), entries: spec.slice(i + 1).trim() };\n    }\n  }\n\n  return null;\n}\n\nfunction parseBucketId(spec: string): number | string {\n  const [label = ''] = parseBucketLabels(spec);\n  return /^\\d+$/.test(label) ? Number(label) : label;\n}\n\nfunction normalizeDoc(doc: {\n  title?: string | undefined;\n  buckets?: number | undefined;\n  bucketLabels?: string[] | undefined;\n  chains?: HashChain[] | undefined;\n}): HashmapDoc {\n  const chains = doc.chains ?? [];\n  const bucketLabels = [...(doc.bucketLabels ?? [])];\n  for (const chain of chains) {\n    if (typeof chain.index === 'string' && !bucketLabels.includes(chain.index))\n      bucketLabels.push(chain.index);\n  }\n\n  const maxIdx = chains.reduce(\n    (mx, c) => (typeof c.index === 'number' ? Math.max(mx, c.index) : mx),\n    -1,\n  );\n  const numericBucketCount = Math.max(doc.buckets ?? 0, maxIdx + 1, 1);\n  if (bucketLabels.length === 0) {\n    for (let i = 0; i < numericBucketCount; i++) bucketLabels.push(String(i));\n  } else {\n    while (bucketLabels.length < numericBucketCount) bucketLabels.push(String(bucketLabels.length));\n  }\n\n  return {\n    ...(doc.title !== undefined ? { title: doc.title } : {}),\n    buckets: bucketLabels.length,\n    bucketLabels,\n    chains,\n  };\n}\n\nfunction parse(input: string): HashmapDoc {\n  let title: string | undefined;\n  let bucketCount: number | undefined;\n  let explicitBucketLabels: string[] | undefined;\n  const chains: HashChain[] = [];\n\n  for (const line of lines(input)) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'hashmap') {\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = line.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'buckets') {\n      const spec = line.slice(7).trim();\n      if (!spec) continue;\n      if (/^\\d+$/.test(spec)) {\n        bucketCount = Number(spec);\n        explicitBucketLabels = undefined;\n      } else {\n        explicitBucketLabels = parseBucketLabels(spec);\n      }\n      continue;\n    }\n    if (t[0] === 'bucket') {\n      const parsed = splitBucketDirective(line.slice(6).trim());\n      if (parsed)\n        chains.push({ index: parseBucketId(parsed.id), entries: parseEntries(parsed.entries) });\n    }\n  }\n\n  return normalizeDoc({ title, buckets: bucketCount, bucketLabels: explicitBucketLabels, chains });\n}\n\nfunction bucketKey(id: number | string): string {\n  return typeof id === 'number' ? `n:${id}` : `s:${id}`;\n}\n\nexport function layoutHashmap(doc: HashmapDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 38;\n  const idxW = Math.max(\n    46,\n    ...doc.bucketLabels.map((label) => measureText(label, font).width + 24),\n  );\n  const entryH = 30;\n  const entryGap = 30;\n  const chainGap = 36; // bucket strip \u2192 first entry\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const origin = { x: margin, y: margin + titleH };\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // bucket label column (vertical strip)\n  const slotById = new Map<\n    string,\n    { row: number; bounds: { x: number; y: number; width: number; height: number } }\n  >();\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  for (let i = 0; i < doc.buckets; i++) {\n    const slot = { x: origin.x, y: origin.y + i * cellH, width: idxW, height: cellH };\n    const label = doc.bucketLabels[i] ?? String(i);\n    slotById.set(bucketKey(i), { row: i, bounds: slot });\n    if (!slotById.has(bucketKey(label))) slotById.set(bucketKey(label), { row: i, bounds: slot });\n    anchors[`b${i}`] = { bounds: slot };\n    elements.push(p.rect(slot, palette.surface, palette.border, 1.5, { rx: 3 }));\n    elements.push(\n      p.text(\n        label,\n        slot.x + slot.width / 2,\n        slot.y + slot.height / 2 + font * 0.35,\n        font,\n        palette.textMuted,\n        { anchor: 'middle', weight: 'bold' },\n      ),\n    );\n  }\n\n  const chainStartX = origin.x + idxW + chainGap;\n  let maxRight = chainStartX;\n\n  for (const chain of doc.chains) {\n    const slotRef = slotById.get(bucketKey(chain.index));\n    if (!slotRef || chain.entries.length === 0) continue;\n    const { bounds: slot, row } = slotRef;\n    const cy = slot.y + slot.height / 2;\n    let x = chainStartX;\n    let fromX = slot.x + slot.width;\n    chain.entries.forEach((e, j) => {\n      const label = e.value ? `${e.key} : ${e.value}` : e.key;\n      const w = measureText(label, font).width + 22;\n      const box = { x, y: cy - entryH / 2, width: w, height: entryH };\n      // pointer into this entry\n      elements.push(\n        p.path(`M ${rhu(fromX)} ${rhu(cy)} L ${rhu(x - 3)} ${rhu(cy)}`, palette.primary, 1.5, {\n          markerEnd: ARROW_ID,\n        }),\n      );\n      elements.push(p.rect(box, palette.surface, palette.border, 1.5, { rx: 4 }));\n      elements.push(\n        p.text(label, x + w / 2, cy + font * 0.35, font, palette.text, {\n          anchor: 'middle',\n          weight: 'bold',\n        }),\n      );\n      anchors[`b${row}e${j}`] = { bounds: box };\n      fromX = x + w;\n      x = fromX + entryGap;\n      maxRight = Math.max(maxRight, fromX);\n    });\n  }\n\n  const width = maxRight + margin;\n  const height = origin.y + doc.buckets * cellH + margin;\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width, height },\n    background: palette.background,\n    elements,\n    defs: [arrowDef(palette.primary, theme.edges?.arrowSize)],\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const hashmap: DiagramModule<\n  HashmapDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return {\n      version: '1.0',\n      metadata: {},\n      ...normalizeDoc(JSON.parse(input) as Partial<HashmapDoc>),\n    };\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutHashmap(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/matrix/matrix.ts \u2014 2D grid (rows \u00D7 cols) with indices.\n *\n * A grid of equal cells built by stacking horizontal cell strips \u2014 one per\n * row \u2014 and labelling the column indices across the top and the row indices\n * down the left. Ragged rows are padded with blanks so the grid stays\n * rectangular.\n *\n * Value-driven mini-syntax:\n *   matrix\n *     title weights\n *     row 1 2 3 4\n *     row 5 6 7 8\n *     row 9 10 11 12\n *\n *   matrix 3x4              // empty 3-row, 4-column grid\n *   matrix                  // `noindex` hides the row/column index labels\n *     noindex\n *     row a b\n *     row c d\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { buildStrip, type StripCell } from '../../../../scene/strip.js';\nimport { measureText } from '../../../../text/metrics.js';\n\nexport interface MatrixDoc {\n  title?: string;\n  rows: string[][];\n  showIndex: boolean;\n  /** Highlighted cell positions as [row, col] pairs (0-indexed). */\n  highlights?: [number, number][];\n}\n\nfunction parse(input: string): MatrixDoc {\n  let title: string | undefined;\n  const rows: string[][] = [];\n  let showIndex = true;\n\n  const highlights: [number, number][] = [];\n\n  for (const line of input.split(/\\r?\\n/).map((l) => l.trimEnd())) {\n    const trimmed = line.trim();\n    if (!trimmed) continue;\n    const t = trimmed.split(/\\s+/);\n    if (t[0] === 'matrix') {\n      const dim = t[1]?.match(/^(\\d+)x(\\d+)$/i);\n      if (dim) {\n        const r = Number(dim[1]),\n          c = Number(dim[2]);\n        for (let i = 0; i < r; i++) rows.push(Array.from({ length: c }, () => ''));\n      }\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = trimmed.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'noindex') {\n      showIndex = false;\n      continue;\n    }\n    if (t[0] === 'row') {\n      rows.push(t.slice(1));\n      continue;\n    }\n    if (t[0] === 'highlight') {\n      // Accepts space-separated r,c pairs: highlight 0,1 1,2 2,0\n      for (const tok of t.slice(1)) {\n        const m = tok.match(/^(\\d+),(\\d+)$/);\n        if (m) highlights.push([Number(m[1]), Number(m[2])]);\n      }\n      continue;\n    }\n  }\n  return {\n    ...(title !== undefined ? { title } : {}),\n    rows,\n    showIndex,\n    ...(highlights.length > 0 ? { highlights } : {}),\n  };\n}\n\nexport function layoutMatrix(doc: MatrixDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const cellH = 38;\n\n  const nRows = doc.rows.length;\n  const nCols = doc.rows.reduce((m, r) => Math.max(m, r.length), 0);\n  const grid = doc.rows.map((r) => Array.from({ length: nCols }, (_, j) => r[j] ?? ''));\n  const cellW = Math.max(40, ...grid.flat().map((v) => measureText(v, font).width + 20));\n\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const colIdxH = doc.showIndex ? typography.smallFontSize + 8 : 0;\n  const rowIdxW = doc.showIndex ? 22 : 0;\n  const origin = { x: margin + rowIdxW, y: margin + titleH + colIdxH };\n\n  const elements: SceneElement[] = [];\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  grid.forEach((row, r) => {\n    const rowOrigin = { x: origin.x, y: origin.y + r * cellH };\n    const cellInputs: StripCell[] = row.map((v, c) => {\n      const isHighlit = doc.highlights?.some(([hr, hc]) => hr === r && hc === c) ?? false;\n      return isHighlit\n        ? { label: v, fill: palette.primary, fillOpacity: 0.22, stroke: palette.primary }\n        : { label: v };\n    });\n    const strip = buildStrip(p, theme, cellInputs, {\n      origin: rowOrigin,\n      cellWidth: cellW,\n      cellHeight: cellH,\n    });\n    elements.push(...strip.elements);\n    strip.slots.forEach((slot, c) => {\n      anchors[`r${r}c${c}`] = { bounds: slot };\n    });\n    if (doc.showIndex) {\n      elements.push(\n        p.text(\n          String(r),\n          origin.x - 7,\n          rowOrigin.y + cellH / 2 + font * 0.35,\n          typography.smallFontSize,\n          palette.textMuted,\n          { anchor: 'end' },\n        ),\n      );\n    }\n  });\n\n  if (doc.showIndex) {\n    for (let c = 0; c < nCols; c++) {\n      const cx = origin.x + c * cellW + cellW / 2;\n      elements.push(\n        p.text(String(c), cx, origin.y - 6, typography.smallFontSize, palette.textMuted, {\n          anchor: 'middle',\n        }),\n      );\n    }\n  }\n\n  const width = origin.x + nCols * cellW + margin;\n  const height = origin.y + nRows * cellH + margin;\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width, height },\n    background: palette.background,\n    elements,\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const matrix: DiagramModule<\n  MatrixDoc & { version: string; metadata: Record<string, unknown> }\n> = {\n  parseMermaid(input: string) {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutMatrix(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/trie/trie.ts \u2014 Prefix tree (trie) front-end.\n *\n * Value-driven: `trie insert cat car card dog do` inserts strings into a\n * character trie. Unlike the radix/Patricia trie, edges are NOT compressed \u2014\n * every character gets its own edge and node. Shared prefixes share a path,\n * branch/intermediate nodes render as small dots, and word-terminal nodes\n * render as filled pills showing the full word.\n *\n * Compiles down to the shared decorated-tree IR (ir.ts) and reuses the tidy\n * tree placement kernel (graph/tree via layout.ts), exactly like radix.\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from '../tree/ir.js';\nimport { layoutTree } from '../tree/layout.js';\n\ninterface TNode {\n  edges: Map<string, TNode>;\n  end: boolean;\n}\n\nconst newNode = (): TNode => ({ edges: new Map(), end: false });\n\nfunction insert(root: TNode, word: string): void {\n  let node = root;\n  for (const ch of word) {\n    let child = node.edges.get(ch);\n    if (child === undefined) {\n      child = newNode();\n      node.edges.set(ch, child);\n    }\n    node = child;\n  }\n  node.end = true;\n}\n\nexport function buildTrie(input: string): TreeDocument {\n  // words = non-keyword alphanumeric tokens after `trie`/`insert`\n  const tokens = input.split(/\\s+/).filter(Boolean);\n  const words = tokens.filter((t) => t !== 'trie' && t !== 'insert' && /^[A-Za-z0-9]+$/.test(t));\n  const root = newNode();\n  for (const w of words) insert(root, w);\n\n  const nodes: TreeNode[] = [];\n  let i = 0;\n  const emit = (n: TNode, prefix: string, edgeLabel?: string): string => {\n    const id = `n${i++}`;\n    const children: string[] = [];\n    // Terminal nodes (end of a word) \u2192 filled pill labelled with the full word.\n    // Intermediate/branch nodes \u2192 small dot; the character lives on the edge.\n    const node: TreeNode = n.end\n      ? {\n          id,\n          label: prefix,\n          kinds: ['leaf', 'active'],\n          children,\n          ...(edgeLabel !== undefined ? { edgeLabel } : {}),\n        }\n      : {\n          id,\n          label: '',\n          kinds: ['dot'],\n          children,\n          ...(edgeLabel !== undefined ? { edgeLabel } : {}),\n        };\n    nodes.push(node);\n    // Stable child order: insertion order of the Map (first-seen character).\n    for (const [ch, child] of n.edges) children.push(emit(child, prefix + ch, ch));\n    return id;\n  };\n  emit(root, '');\n\n  return { version: '1.0', metadata: {}, direction: 'TB', nodes };\n}\n\nexport const trie: DiagramModule<TreeDocument> = {\n  parseMermaid: buildTrie,\n  parseYaml: (input) => JSON.parse(input) as TreeDocument,\n  layout: (ir: TreeDocument, theme: ResolvedTheme): LayoutResult => layoutTree(ir, theme),\n};\n", "/**\n * @file diagrams/ds/graph/graph.ts \u2014 Generic node/edge graph.\n *\n * A clean, themeable node-link graph (directed or undirected) built on the\n * shared layered placement kernel (graph/layered). Nodes are rounded boxes,\n * edges are straight connectors clipped to node borders; in directed mode each\n * edge carries an arrowhead, in undirected mode it does not.\n *\n * \u26A0\uFE0F Header keyword is `nodegraph` (alias `dsgraph`) \u2014 NOT `graph`, because\n * Mermaid's flowchart already owns `graph` (`graph TD`). Using a distinct token\n * keeps flowchart detection intact.\n *\n * Value-driven mini-syntax:\n *   nodegraph\n *     directed                 // or `undirected` (the default)\n *     title Dependency graph\n *     node A : Parser          // optional explicit label\n *     A -> B : calls           // edge with optional `: label`\n *     B -- C                   // edges may use -> or --\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n  Rect,\n  BaseIR,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { layeredLayout, type GraphNode, type GraphEdge } from '../../../../graph/layered.js';\nimport { borderPoint, connectSlots } from '../../../../graph/connect.js';\nimport { orthogonalRouter, countRouteCollisions } from '../../../../routing/router.js';\nimport { rhu } from '../../../../util/round.js';\n\nconst ARROW_ID = 'dsgraph-arrow';\nconst ARROW_ACTIVE_ID = 'dsgraph-arrow-active';\n\nimport { readableText } from '../../../../theme/contrast.js';\n\nfunction graphArrowDef(color: string, id: string, size = 8): string {\n  const s = size;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n  return `<marker id=\"${id}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${color}\" /></marker>`;\n}\n\nexport interface GNode {\n  id: string;\n  label: string;\n  kind?: 'active' | undefined;\n}\nexport interface GEdge {\n  from: string;\n  to: string;\n  label?: string;\n  kind?: 'active' | 'dashed';\n}\n\nexport interface GraphDoc extends BaseIR {\n  title?: string;\n  directed: boolean;\n  nodes: GNode[];\n  edges: GEdge[];\n}\n\nconst EDGE_RE = /^(\\S+)\\s*(<->|->|--)\\s*(\\S+)(?:\\s*:\\s*(.+))?$/;\n\nfunction parse(input: string): Omit<GraphDoc, keyof BaseIR> {\n  let title: string | undefined;\n  let directed = false;\n  const order: string[] = [];\n  const labels = new Map<string, string>();\n  const nodeKinds = new Map<string, GNode['kind']>();\n  const edges: GEdge[] = [];\n  const ensure = (id: string): void => {\n    if (!labels.has(id)) {\n      labels.set(id, id);\n      order.push(id);\n    }\n  };\n\n  for (const raw of input.split(/\\r?\\n/)) {\n    const line = raw.trim();\n    if (!line) continue;\n    const t = line.split(/\\s+/);\n    if (t[0] === 'nodegraph' || t[0] === 'dsgraph') continue;\n    if (t[0] === 'directed') {\n      directed = true;\n      continue;\n    }\n    if (t[0] === 'undirected') {\n      directed = false;\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = line.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'node') {\n      const parts = line\n        .slice(4)\n        .split(':')\n        .map((s) => s.trim());\n      const id = parts[0] ?? '';\n      if (id) {\n        ensure(id);\n        if (parts.length === 2) {\n          labels.set(id, parts[1] || id);\n        } else if (parts.length >= 3) {\n          labels.set(id, parts[1] || id);\n          if (parts[2] === 'active') {\n            nodeKinds.set(id, 'active');\n          }\n        }\n      }\n      continue;\n    }\n    const m = line.match(EDGE_RE);\n    if (m) {\n      const from = m[1]!,\n        to = m[3]!;\n      const rawLabel = m[4]?.trim();\n      let label: string | undefined;\n      let kind: GEdge['kind'] | undefined;\n      if (rawLabel === 'active') kind = 'active';\n      else if (rawLabel === 'dashed') kind = 'dashed';\n      else label = rawLabel;\n      ensure(from);\n      ensure(to);\n      edges.push({ from, to, ...(label ? { label } : {}), ...(kind ? { kind } : {}) });\n    }\n  }\n\n  const nodes: GNode[] = order.map((id) => ({\n    id,\n    label: labels.get(id)!,\n    ...(nodeKinds.has(id) ? { kind: nodeKinds.get(id) } : {}),\n  }));\n  return { ...(title !== undefined ? { title } : {}), directed, nodes, edges };\n}\n\nexport function layoutGraph(doc: GraphDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const small = typography.smallFontSize;\n  const titleH = doc.title ? typography.titleFontSize + 14 : 0;\n  const nodeH = 40;\n\n  const sizeOf = (n: GNode): number => Math.max(64, measureText(n.label, font).width + 28);\n  const gNodes: GraphNode[] = doc.nodes.map((n) => ({ id: n.id, width: sizeOf(n), height: nodeH }));\n  const gEdges: GraphEdge[] = doc.edges.map((e) => ({ from: e.from, to: e.to }));\n  const hasOpposingEdges = doc.edges.some((e, i) =>\n    doc.edges.some((other, j) => i !== j && e.from === other.to && e.to === other.from),\n  );\n  const layerGap = hasOpposingEdges ? 88 : doc.edges.some((e) => e.label) ? 72 : 64;\n  const placed = layeredLayout(gNodes, gEdges, {\n    direction: 'TB',\n    layerGap,\n    nodeGap: 44,\n    margin,\n  });\n\n  const box = (id: string): Rect => {\n    const b = placed.boxes.get(id)!;\n    return { x: b.x, y: b.y + titleH, width: b.width, height: b.height };\n  };\n  type Pt = { x: number; y: number };\n  type PortDir = 'N' | 'S' | 'E' | 'W';\n  const pathData = (points: readonly Pt[]): string =>\n    points.map((pt, i) => `${i === 0 ? 'M' : 'L'} ${rhu(pt.x)} ${rhu(pt.y)}`).join(' ');\n  const pathPointAtFraction = (points: readonly Pt[], frac = 0.5): { pt: Pt; normal: Pt } => {\n    if (points.length === 0) return { pt: { x: 0, y: 0 }, normal: { x: 0, y: 0 } };\n    let total = 0;\n    for (let i = 1; i < points.length; i++) {\n      total += Math.hypot(points[i]!.x - points[i - 1]!.x, points[i]!.y - points[i - 1]!.y);\n    }\n    if (total === 0) return { pt: points[0]!, normal: { x: 0, y: 0 } };\n    let walked = 0;\n    const target = total * frac;\n    for (let i = 1; i < points.length; i++) {\n      const from = points[i - 1]!;\n      const to = points[i]!;\n      const segment = Math.hypot(to.x - from.x, to.y - from.y);\n      if (walked + segment >= target && segment > 0) {\n        const t = (target - walked) / segment;\n        const dx = (to.x - from.x) / segment;\n        const dy = (to.y - from.y) / segment;\n        return {\n          pt: { x: from.x + (to.x - from.x) * t, y: from.y + (to.y - from.y) * t },\n          normal: { x: dy, y: -dx }, // right-hand normal\n        };\n      }\n      walked += segment;\n    }\n    const last = points[points.length - 1]!;\n    return { pt: last, normal: { x: 0, y: 0 } };\n  };\n  type Wall = 'top' | 'bottom' | 'left' | 'right';\n  const dirForWall = (wall: Wall): PortDir => {\n    switch (wall) {\n      case 'top':\n        return 'N';\n      case 'bottom':\n        return 'S';\n      case 'left':\n        return 'W';\n      case 'right':\n        return 'E';\n    }\n  };\n  const targetWall = (from: Rect, to: Rect): Wall => {\n    if (from.y + from.height <= to.y) return 'top';\n    if (to.y + to.height <= from.y) return 'bottom';\n    const dx = to.x + to.width / 2 - (from.x + from.width / 2);\n    const dy = to.y + to.height / 2 - (from.y + from.height / 2);\n    if (Math.abs(dy) >= Math.abs(dx)) return dy >= 0 ? 'top' : 'bottom';\n    return dx >= 0 ? 'left' : 'right';\n  };\n  const sourceWall = (from: Rect, to: Rect): Wall => targetWall(to, from);\n  const wallPoint = (r: Rect, wall: Wall, axis: number): Pt => {\n    switch (wall) {\n      case 'top':\n        return { x: axis, y: r.y };\n      case 'bottom':\n        return { x: axis, y: r.y + r.height };\n      case 'left':\n        return { x: r.x, y: axis };\n      case 'right':\n        return { x: r.x + r.width, y: axis };\n    }\n  };\n\n  const MIN_PORT_GAP = 28;\n  const WALL_MARGIN = 16;\n  const SKIP_LANE_CLEARANCE = 40;\n  const SKIP_LANE_GAP = 28;\n  const SKIP_STUB = 16;\n\n  const cascadePorts = (ideals: number[], lo: number, hi: number): number[] => {\n    const n = ideals.length;\n    if (n === 0) return [];\n    if (hi <= lo) return Array.from({ length: n }, () => (lo + hi) / 2);\n    if (n === 1) return [Math.max(lo, Math.min(hi, ideals[0]!))];\n    if ((n - 1) * MIN_PORT_GAP > hi - lo) {\n      const step = (hi - lo) / (n + 1);\n      return Array.from({ length: n }, (_, i) => lo + step * (i + 1));\n    }\n    const pos = ideals.map((v) => Math.max(lo, Math.min(hi, v)));\n    for (let iter = 0; iter < 5; iter++) {\n      let changed = false;\n      for (let i = 1; i < n; i++) {\n        const minI = pos[i - 1]! + MIN_PORT_GAP;\n        if (pos[i]! < minI) {\n          pos[i] = minI;\n          changed = true;\n        }\n      }\n      for (let i = n - 1; i >= 0; i--) {\n        const maxI = i === n - 1 ? hi : pos[i + 1]! - MIN_PORT_GAP;\n        if (pos[i]! > maxI) {\n          pos[i] = maxI;\n          changed = true;\n        }\n      }\n      if (pos[0]! < lo) {\n        pos[0] = lo;\n        changed = true;\n      }\n      if (!changed) break;\n    }\n    return pos;\n  };\n\n  const assignPorts = (\n    rect: Rect,\n    wall: Wall,\n    group: Array<{ edgeIndex: number; ideal: number }>,\n  ): Map<number, Pt> => {\n    const result = new Map<number, Pt>();\n    if (group.length === 0) return result;\n    const sorted = [...group].sort((a, b) => a.ideal - b.ideal || a.edgeIndex - b.edgeIndex);\n    const horizontal = wall === 'top' || wall === 'bottom';\n    const base = horizontal ? rect.x : rect.y;\n    const len = horizontal ? rect.width : rect.height;\n    const lo = base + Math.min(WALL_MARGIN, len / 3);\n    const hi = base + len - Math.min(WALL_MARGIN, len / 3);\n    const positions = cascadePorts(\n      sorted.map((e) => e.ideal),\n      lo,\n      hi,\n    );\n    for (let i = 0; i < sorted.length; i++) {\n      result.set(sorted[i]!.edgeIndex, wallPoint(rect, wall, positions[i]!));\n    }\n    return result;\n  };\n\n  const simplifyPoints = (raw: readonly Pt[]): Pt[] => {\n    const points: Pt[] = [];\n    for (const pt of raw) {\n      const prev = points[points.length - 1];\n      if (!prev || Math.abs(prev.x - pt.x) > 1e-6 || Math.abs(prev.y - pt.y) > 1e-6) {\n        points.push(pt);\n      }\n    }\n    for (let i = 1; i < points.length - 1; ) {\n      const a = points[i - 1]!,\n        b = points[i]!,\n        c = points[i + 1]!;\n      const collinearX = Math.abs(a.x - b.x) < 1e-6 && Math.abs(b.x - c.x) < 1e-6;\n      const collinearY = Math.abs(a.y - b.y) < 1e-6 && Math.abs(b.y - c.y) < 1e-6;\n      if (collinearX || collinearY) points.splice(i, 1);\n      else i++;\n    }\n    return points;\n  };\n\n  const realBoxes = [...placed.boxes.values()];\n  const skipLaneX = new Map<number, number>();\n  let skipLaneOrdinal = 0;\n  for (const [i, e] of doc.edges.entries()) {\n    const bends = placed.edgeBends.get(i);\n    if (!bends || bends.length === 0) continue;\n    const a = placed.boxes.get(e.from);\n    const b = placed.boxes.get(e.to);\n    if (!a || !b) continue;\n    const minCy = Math.min(a.y + a.height / 2, b.y + b.height / 2);\n    const maxCy = Math.max(a.y + a.height / 2, b.y + b.height / 2);\n    const spanBoxes = realBoxes.filter((ob) => {\n      const cy = ob.y + ob.height / 2;\n      return cy >= minCy && cy <= maxCy;\n    });\n    const right = Math.max(...spanBoxes.map((ob) => ob.x + ob.width));\n    skipLaneX.set(i, right + SKIP_LANE_CLEARANCE + skipLaneOrdinal * SKIP_LANE_GAP);\n    skipLaneOrdinal++;\n  }\n\n  // Detect opposing edge pairs (antiparallel edges)\n  const opposingEdges = new Map<number, number>();\n  for (let i = 0; i < doc.edges.length; i++) {\n    for (let j = i + 1; j < doc.edges.length; j++) {\n      const e1 = doc.edges[i]!,\n        e2 = doc.edges[j]!;\n      if (e1.from === e2.to && e1.to === e2.from) {\n        opposingEdges.set(i, j);\n        opposingEdges.set(j, i);\n      }\n    }\n  }\n\n  const wallGroups = new Map<string, Array<{ edgeIndex: number; ideal: number }>>();\n  const fromWallByEdge = new Map<number, Wall>();\n  const toWallByEdge = new Map<number, Wall>();\n  const groupKey = (id: string, wall: Wall): string => `${id}\\0${wall}`;\n  const axisIdeal = (\n    wall: Wall,\n    self: Rect,\n    other: Rect,\n    edgeIndex: number,\n    isSource: boolean,\n  ): number => {\n    const lane = skipLaneX.get(edgeIndex);\n    if (lane !== undefined && (wall === 'top' || wall === 'bottom')) return lane;\n    const isOpposing = opposingEdges.has(edgeIndex);\n    if (wall === 'top' || wall === 'bottom') {\n      const mid = other.x + other.width / 2;\n      if (!isOpposing) return mid;\n      const dy = other.y + other.height / 2 - (self.y + self.height / 2);\n      // Traffic drives on the right: outgoing goes +X if dy > 0, -X if dy < 0\n      const sign = isSource ? (dy >= 0 ? 1 : -1) : dy >= 0 ? -1 : 1;\n      return mid + sign * 14;\n    } else {\n      const mid = other.y + other.height / 2;\n      if (!isOpposing) return mid;\n      const dx = other.x + other.width / 2 - (self.x + self.width / 2);\n      const sign = isSource ? (dx >= 0 ? -1 : 1) : dx >= 0 ? 1 : -1;\n      return mid + sign * 14;\n    }\n  };\n  for (const [i, e] of doc.edges.entries()) {\n    const a = placed.boxes.has(e.from) ? box(e.from) : undefined;\n    const b = placed.boxes.has(e.to) ? box(e.to) : undefined;\n    if (!a || !b) continue;\n    const lane = skipLaneX.get(i);\n    const fw =\n      lane !== undefined ? (lane > a.x + a.width / 2 ? 'right' : 'left') : sourceWall(a, b);\n    const tw =\n      lane !== undefined ? (lane > b.x + b.width / 2 ? 'right' : 'left') : targetWall(a, b);\n    fromWallByEdge.set(i, fw);\n    toWallByEdge.set(i, tw);\n    const fk = groupKey(e.from, fw);\n    const tk = groupKey(e.to, tw);\n    if (!wallGroups.has(fk)) wallGroups.set(fk, []);\n    if (!wallGroups.has(tk)) wallGroups.set(tk, []);\n    wallGroups.get(fk)!.push({ edgeIndex: i, ideal: axisIdeal(fw, a, b, i, true) });\n    wallGroups.get(tk)!.push({ edgeIndex: i, ideal: axisIdeal(tw, b, a, i, false) });\n  }\n\n  const fromPorts = new Map<string, Map<number, Pt>>();\n  const toPorts = new Map<string, Map<number, Pt>>();\n  for (const [key, group] of wallGroups) {\n    const [id, wall] = key.split('\\0') as [string, Wall];\n    const ports = assignPorts(box(id), wall, group);\n    fromPorts.set(key, ports);\n    toPorts.set(key, ports);\n  }\n\n  const elements: SceneElement[] = [];\n  const labelElements: SceneElement[] = [];\n  let maxRouteX = placed.width - margin;\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // Edges first (under the nodes).\n  for (const [i, e] of doc.edges.entries()) {\n    const a = placed.boxes.has(e.from) ? box(e.from) : undefined;\n    const b = placed.boxes.has(e.to) ? box(e.to) : undefined;\n    if (!a || !b) continue;\n    const bends = placed.edgeBends.get(i);\n    const fw = fromWallByEdge.get(i) ?? sourceWall(a, b);\n    const tw = toWallByEdge.get(i) ?? targetWall(a, b);\n    const fromPt =\n      fromPorts.get(groupKey(e.from, fw))?.get(i) ??\n      borderPoint(a, b.x + b.width / 2, b.y + b.height / 2);\n    const toPt =\n      toPorts.get(groupKey(e.to, tw))?.get(i) ??\n      borderPoint(b, a.x + a.width / 2, a.y + a.height / 2);\n    const hasBends = bends && bends.length > 0;\n    const points: readonly Pt[] =\n      hasBends && skipLaneX.has(i)\n        ? (() => {\n            const laneX = skipLaneX.get(i)!;\n            return simplifyPoints([\n              fromPt,\n              { x: laneX, y: fromPt.y },\n              { x: laneX, y: toPt.y },\n              toPt,\n            ]);\n          })()\n        : hasBends\n          ? (() => {\n              const obstacles = [...placed.boxes.values()]\n                .filter((ob) => ob.id !== e.from && ob.id !== e.to)\n                .map((ob) => ({ x: ob.x, y: ob.y + titleH, width: ob.width, height: ob.height }));\n              return orthogonalRouter.route({\n                from: fromPt,\n                to: toPt,\n                style: 'orthogonal',\n                obstacles,\n                padding: 10,\n                fromDir: dirForWall(fw),\n                toDir: dirForWall(tw),\n              }).points;\n            })()\n          : (() => {\n              if (fromPt && toPt) {\n                return [fromPt, toPt];\n              }\n              const { start, end } = connectSlots(a, b);\n              return [start, end];\n            })();\n    const obstacles = [...placed.boxes.values()]\n      .filter((ob) => ob.id !== e.from && ob.id !== e.to)\n      .map((ob) => ({ x: ob.x, y: ob.y + titleH, width: ob.width, height: ob.height }));\n    if (countRouteCollisions(points, obstacles) > 0) {\n      console.warn(\n        `[routing] No clear route between ${e.from} and ${e.to}: route intersects obstacles.`,\n      );\n    }\n    maxRouteX = Math.max(maxRouteX, ...points.map((pt) => pt.x));\n    const isActive = e.kind === 'active';\n    const edgeColor = isActive ? palette.primary : palette.textMuted;\n    const edgeWidth = isActive ? 2.5 : 1.5;\n    const pathOpts: Parameters<typeof p.path>[3] = {\n      ...(doc.directed ? { markerEnd: isActive ? ARROW_ACTIVE_ID : ARROW_ID } : {}),\n      ...(e.kind === 'dashed' ? { dash: '6 3' } : {}),\n    };\n    elements.push(p.path(pathData(points), edgeColor, edgeWidth, pathOpts));\n    if (e.label) {\n      const isOpposing = opposingEdges.has(i);\n      const frac = isOpposing ? 0.28 : 0.5;\n      const { pt, normal } = pathPointAtFraction(points, frac);\n      const lateralShift = isOpposing ? 16 : 0;\n      const mx = pt.x + normal.x * lateralShift;\n      const my = pt.y + normal.y * lateralShift;\n      const edgeFont = theme.edges?.labelFontSize ?? 12;\n      const w = measureText(e.label, edgeFont).width + 8;\n      maxRouteX = Math.max(maxRouteX, mx + w / 2);\n      labelElements.push(\n        p.rect(\n          { x: mx - w / 2, y: my - 9, width: w, height: 18 },\n          palette.background,\n          palette.background,\n          0,\n          { rx: 3 },\n        ),\n      );\n      labelElements.push(\n        p.text(e.label, mx, my + 4, edgeFont, isActive ? palette.primary : palette.textMuted, {\n          anchor: 'middle',\n        }),\n      );\n    }\n  }\n  elements.push(...labelElements);\n\n  // Nodes.\n  const anchors: Record<string, { bounds: Rect }> = {};\n  for (const n of doc.nodes) {\n    const b = box(n.id);\n    const isActive = n.kind === 'active';\n    const fill = isActive ? palette.primary : palette.surface;\n    const stroke = isActive ? palette.primary : palette.border;\n    const sw = isActive ? 2 : (theme.nodes?.standard.borderWidth ?? 1.5);\n    const rx = theme.nodes?.standard.cornerRadius ?? 6;\n    const textColor = isActive ? readableText(fill, theme) : palette.text;\n    elements.push(p.rect(b, fill, stroke, sw, { rx }));\n    elements.push(\n      p.text(n.label, b.x + b.width / 2, b.y + b.height / 2 + font * 0.35, font, textColor, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n    anchors[n.id] = { bounds: b };\n  }\n\n  const titleWidth = doc.title ? measureText(doc.title, typography.titleFontSize).width : 0;\n  const viewWidth = Math.max(\n    placed.width + margin,\n    maxRouteX + margin,\n    doc.title ? margin + titleWidth + margin : 0,\n  );\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width: viewWidth, height: placed.height + titleH + margin },\n    background: palette.background,\n    elements,\n    ...(doc.directed\n      ? {\n          defs: [\n            graphArrowDef(palette.textMuted, ARROW_ID, theme.edges?.arrowSize ?? 8),\n            graphArrowDef(palette.primary, ARROW_ACTIVE_ID, theme.edges?.arrowSize ?? 8),\n          ],\n        }\n      : {}),\n  };\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const graph: DiagramModule<GraphDoc> = {\n  parseMermaid(input: string): GraphDoc {\n    return { version: '1.0', metadata: {}, ...parse(input) };\n  },\n  parseYaml(input: string): GraphDoc {\n    return JSON.parse(input) as GraphDoc;\n  },\n  layout(ir: GraphDoc, theme: ResolvedTheme): LayoutResult {\n    return layoutGraph(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/ds/unionfind/unionfind.ts \u2014 Disjoint Set Union (DSU) forest.\n *\n * A union-find structure is a forest of parent-pointer trees: each set is one\n * tree rooted at its representative. This renders the whole forest side by side\n * (the shared tidy-tree kernel places each root block left\u2192right), with the\n * representative of each set marked distinctly (filled) and the members drawn\n * as plain circles. Edges are parent pointers (child \u2192 parent, drawn top-down).\n *\n * Value-driven mini-syntax (header `unionfind` or alias `dsu`):\n *   unionfind 7\n *     parent 0 0 1 1 3 5 5        // parent[i]; parent[i]==i \u21D2 representative\n *\n *   dsu 7\n *     union 1 0                    // attach set(1) under set(0)\n *     union 3 1\n *     union 6 5\n *\n * Compiles to the shared decorated-tree IR and reuses layout.ts (graph/tree).\n */\n\nimport type { DiagramModule, ResolvedTheme, LayoutResult } from '../../../../contracts/index.js';\nimport type { TreeDocument, TreeNode } from '../tree/ir.js';\nimport { layoutTree } from '../tree/layout.js';\n\nexport interface UnionFindDoc extends TreeDocument {\n  /** parent[i] is the parent of element i; parent[i] === i \u21D2 representative. */\n  readonly parent: readonly number[];\n  /** Indices of the set representatives (roots). */\n  readonly roots: readonly number[];\n  /** Number of disjoint sets (= roots.length). */\n  readonly count: number;\n}\n\nfunction find(parent: number[], x: number): number {\n  let r = x;\n  // Walk to the root without path compression (preserve the drawn shape),\n  // guarding against malformed cycles by capping iterations.\n  for (let guard = 0; guard < parent.length && parent[r] !== r; guard++) r = parent[r]!;\n  return r;\n}\n\nexport function buildUnionFind(input: string): UnionFindDoc {\n  const linesArr = input\n    .split(/\\r?\\n/)\n    .map((l) => l.trim())\n    .filter(Boolean);\n  let count = 0;\n  let parent: number[] = [];\n  let title: string | undefined;\n  const unions: [number, number][] = [];\n\n  for (const line of linesArr) {\n    const t = line.split(/\\s+/);\n    if (t[0] === 'unionfind' || t[0] === 'dsu') {\n      const n = Number(t[1]);\n      if (Number.isFinite(n) && n > 0) count = Math.floor(n);\n      continue;\n    }\n    if (t[0] === 'title') {\n      title = line.slice(5).trim();\n      continue;\n    }\n    if (t[0] === 'parent') {\n      const vals = t.slice(1).map(Number).filter(Number.isFinite);\n      parent = vals;\n      count = Math.max(count, vals.length);\n      continue;\n    }\n    if (t[0] === 'union') {\n      const a = Number(t[1]);\n      const b = Number(t[2]);\n      if (Number.isFinite(a) && Number.isFinite(b)) {\n        unions.push([a, b]);\n        count = Math.max(count, a + 1, b + 1);\n      }\n      continue;\n    }\n  }\n\n  // Seed parent[] as singletons, then apply any explicit array + union ops.\n  const par: number[] = Array.from({ length: count }, (_, i) =>\n    parent[i] !== undefined ? parent[i]! : i,\n  );\n  for (const [a, b] of unions) {\n    const ra = find(par, a);\n    const rb = find(par, b);\n    if (ra !== rb) par[ra] = rb; // attach a's set under b's representative\n  }\n\n  const roots: number[] = [];\n  for (let i = 0; i < count; i++) if (par[i] === i) roots.push(i);\n\n  // Build the decorated-tree node list: each element points to its parent;\n  // representatives are roots (never referenced as a child of anyone else).\n  const nodes: TreeNode[] = [];\n  for (let i = 0; i < count; i++) {\n    const children: string[] = [];\n    for (let j = 0; j < count; j++) if (j !== i && par[j] === i) children.push(`e${j}`);\n    const isRoot = par[i] === i;\n    nodes.push({\n      id: `e${i}`,\n      label: String(i),\n      kinds: isRoot ? ['circle', 'active'] : ['circle'],\n      children,\n    });\n  }\n\n  return {\n    version: '1.0',\n    metadata: { ...(title !== undefined ? { title } : {}) },\n    direction: 'TB',\n    nodes,\n    parent: par,\n    roots,\n    count,\n  };\n}\n\nexport function layoutUnionFind(ir: UnionFindDoc, theme: ResolvedTheme): LayoutResult {\n  return layoutTree(ir, theme);\n}\n\nexport const unionfind: DiagramModule<UnionFindDoc> = {\n  parseMermaid: buildUnionFind,\n  parseYaml: (input) => JSON.parse(input) as UnionFindDoc,\n  layout: layoutUnionFind,\n};\n", "/**\n * @file style/cost.ts \u2014 Cost / latency tier styling.\n *\n * Maps a numeric edge weight (latency, bandwidth-inverse, hop distance, plan\n * cost) onto a discrete visual tier \u2014 colour + dash pattern \u2014 and builds a\n * legend block. Shared by any diagram with weighted edges (architecture/NUMA,\n * topology, query plans). Pure styling: no layout.\n */\n\nimport type { SceneElement, Color, Point, Rect, ResolvedTheme } from '../contracts/index.js';\nimport type { Pen } from '../scene/build.js';\n\nexport interface CostTier {\n  readonly name: string;\n  /** Inclusive upper bound for bucketing a weight into this tier. */\n  readonly maxWeight: number;\n  readonly color: Color;\n  /** Optional SVG stroke-dasharray (e.g. '5 4'). */\n  readonly dash?: string;\n}\n\nexport interface CostScale {\n  /** Unit label shown in the legend (e.g. 'ns', 'Gbps'). */\n  readonly unit?: string;\n  /** Tiers, ascending by maxWeight. */\n  readonly tiers: readonly CostTier[];\n}\n\n/** Bucket a weight into the first tier whose maxWeight \u2265 weight (else the last). */\nexport function classifyCost(scale: CostScale, weight: number): CostTier {\n  for (const t of scale.tiers) if (weight <= t.maxWeight) return t;\n  return scale.tiers[scale.tiers.length - 1]!;\n}\n\n/** Look up a tier by name (for explicit `-- tier -->` edges). */\nexport function tierByName(scale: CostScale, name: string): CostTier | undefined {\n  return scale.tiers.find((t) => t.name === name);\n}\n\nexport interface LegendResult {\n  readonly elements: SceneElement[];\n  readonly bounds: Rect;\n}\n\n/** A small legend: one swatch + tier name + threshold per tier. */\nexport function buildLegend(\n  pen: Pen,\n  theme: ResolvedTheme,\n  scale: CostScale,\n  origin: Point,\n): LegendResult {\n  const palette = theme.palette;\n  const pad = 14,\n    rowH = 22,\n    swatch = 16;\n  const rows = scale.tiers.length + 1;\n  const width = 220;\n  const height = pad + rows * rowH;\n  const elements: SceneElement[] = [];\n\n  elements.push(\n    pen.rect({ x: origin.x, y: origin.y, width, height }, palette.background, palette.border, 1.5, {\n      rx: 8,\n    }),\n  );\n  const title = scale.unit ? `Cost (${scale.unit})` : 'Cost';\n  elements.push(\n    pen.text(\n      title,\n      origin.x + pad,\n      origin.y + pad + 8,\n      theme.typography.baseFontSize,\n      palette.text,\n      { weight: 'bold' },\n    ),\n  );\n\n  scale.tiers.forEach((t, i) => {\n    const y = origin.y + pad + (i + 1) * rowH;\n    elements.push(\n      pen.rect(\n        { x: origin.x + pad, y: y - swatch + 4, width: swatch, height: swatch - 4 },\n        t.color,\n        t.color,\n        1,\n        { rx: 2 },\n      ),\n    );\n    elements.push(\n      pen.text(\n        t.name,\n        origin.x + pad + swatch + 8,\n        y,\n        theme.typography.smallFontSize,\n        palette.text,\n      ),\n    );\n    elements.push(\n      pen.text(\n        `\u2264 ${t.maxWeight}`,\n        origin.x + width - pad,\n        y,\n        theme.typography.smallFontSize,\n        palette.textMuted,\n        { anchor: 'end', weight: 'bold' },\n      ),\n    );\n  });\n\n  return { elements, bounds: { x: origin.x, y: origin.y, width, height } };\n}\n", "/**\n * @file diagrams/topology/topology.ts \u2014 Network & Infrastructure Topology Engine.\n *\n * Characteristics:\n *   1. Title support via `topology :: \"Title\"`, `title \"Title\"`, or frontmatter.\n *   2. Device roles with semantic icons & badges:\n *      - `router` / `gateway`, `switch` / `tor` / `spine` / `leaf`\n *      - `firewall` / `waf`, `loadbalancer` / `lb`\n *      - `server` / `host` / `compute`, `database` / `db` / `storage`\n *      - `cloud` / `internet` / `wan`, `client` / `endpoint`, `cluster` / `pod`\n *   3. Subnet, VLAN, Zone, and Rack enclosures:\n *      - `subnet \"10.0.1.0/24\" \"Public Subnet\"`\n *      - `zone \"DMZ\"`, `vlan 100 \"Prod VLAN\"`, `rack \"Rack-01\"`\n *   4. Topology layout patterns:\n *      - `pattern spine-leaf` (Spines -> Leaves -> Compute tiered Clos network)\n *      - `pattern hub-spoke` / `star` (Central Hub with radial/perimeter Spokes)\n *      - `pattern ring` (Circular loop topology)\n *      - `pattern mesh` (Full/partial mesh topology)\n *      - `pattern tiered` (Hierarchical ingress -> aggregation -> storage)\n *   5. Connection routing styles & collision-free label placement:\n *      - Pre-layout edge label measurement & automatic clearance allocation\n *      - Obstacle-aware label positioning (never overlaps nodes, group titles, or paths)\n *      - Multi-track non-overlapping `@orthogonal` bus/channel routing\n *      - `@straight`, `@bezier`, `@polyline`\n *      - Interface ports and IP annotations (`r1:eth0 [10.0.0.1] -- sw1:ge-0/0/1`)\n *   6. Cost / latency scale and legend tiering (full backward compatibility).\n *   7. Comprehensive NodeAnchorRegistry for poster cross-linking.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n  Rect,\n  Point,\n  RouteStyle,\n} from '../../../contracts/index.js';\nimport { pen } from '../../../scene/build.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { borderPoint } from '../../../graph/connect.js';\nimport { classifyCost, buildLegend, type CostScale, type CostTier } from '../../../style/cost.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\nimport { rhu, rhuInt } from '../../../util/round.js';\n\nexport type DeviceRole =\n  | 'router'\n  | 'gateway'\n  | 'switch'\n  | 'spine'\n  | 'leaf'\n  | 'tor'\n  | 'firewall'\n  | 'waf'\n  | 'loadbalancer'\n  | 'lb'\n  | 'server'\n  | 'host'\n  | 'compute'\n  | 'database'\n  | 'db'\n  | 'storage'\n  | 'cloud'\n  | 'internet'\n  | 'wan'\n  | 'client'\n  | 'device'\n  | 'cluster'\n  | 'pod'\n  | 'node';\n\nexport type TopologyPattern = 'spine-leaf' | 'hub-spoke' | 'star' | 'ring' | 'mesh' | 'tiered' | 'grid';\n\nexport interface TopoNode {\n  id: string;\n  label: string;\n  sub?: string | undefined;\n  role?: DeviceRole | undefined;\n  ip?: string | undefined;\n  group?: string | undefined;\n}\n\nexport interface TopoGroup {\n  id: string;\n  label: string;\n  cidr?: string | undefined;\n  type?: 'subnet' | 'zone' | 'vlan' | 'rack' | 'group' | undefined;\n}\n\nexport interface TopoEdge {\n  from: string;\n  to: string;\n  fromPort?: string | undefined;\n  toPort?: string | undefined;\n  label?: string | undefined;\n  routeStyle?: RouteStyle | undefined;\n  directed?: boolean | undefined;\n  bidirectional?: boolean | undefined;\n  cost?: number | undefined;\n}\n\nexport interface TopologyDoc {\n  version: string;\n  metadata: Record<string, unknown>;\n  title?: string | undefined;\n  pattern?: TopologyPattern | undefined;\n  scale: CostScale;\n  groups: TopoGroup[];\n  nodes: TopoNode[];\n  edges: TopoEdge[];\n}\n\n// \u2500\u2500\u2500 Parser \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction parse(input: string): TopologyDoc {\n  let title: string | undefined;\n  let unit: string | undefined;\n  let pattern: TopologyPattern | undefined;\n  const tiers: CostTier[] = [];\n  const groups: TopoGroup[] = [];\n  const nodes: TopoNode[] = [];\n  const edges: TopoEdge[] = [];\n  let curGroup: string | undefined;\n\n  const lines = input.split(/\\r?\\n/);\n\n  for (let rawLine of lines) {\n    const line = rawLine.trim();\n    if (!line || line.startsWith('%%')) continue;\n\n    // Header with optional `::` title: `topology :: \"Enterprise Network\"`\n    const headerMatch = line.match(/^topology(?:\\s*::\\s*|\\s+title\\s+|\\s+)(.+)$/i);\n    if (headerMatch && !title && !line.startsWith('topology\\n') && line !== 'topology') {\n      const rest = headerMatch[1]!.trim();\n      if (!/^(costs|pattern|tier|group|subnet|zone|vlan|rack|node|router|switch|server|db|cloud|firewall)\\b/i.test(rest)) {\n        title = rest.replace(/^[\"']|[\"']$/g, '');\n        continue;\n      }\n    }\n    if (/^topology$/i.test(line)) continue;\n\n    // Title directive: `title \"Enterprise Network\"` or `title :: Enterprise Network`\n    const titleMatch = line.match(/^title(?:\\s*::\\s*|\\s+)(.+)$/i);\n    if (titleMatch) {\n      title = titleMatch[1]!.trim().replace(/^[\"']|[\"']$/g, '');\n      continue;\n    }\n\n    // Pattern directive: `pattern spine-leaf` or `pattern hub-spoke`\n    const patternMatch = line.match(/^pattern\\s+([\\w-]+)/i);\n    if (patternMatch) {\n      pattern = patternMatch[1]!.toLowerCase() as TopologyPattern;\n      continue;\n    }\n\n    // Cost scale & tiers\n    if (line.startsWith('costs')) {\n      const t = line.split(/\\s+/);\n      unit = t[1];\n      continue;\n    }\n    if (line.startsWith('tier')) {\n      const t = line.split(/\\s+/);\n      const tier: CostTier = {\n        name: t[1] ?? '',\n        maxWeight: Number(t[2]),\n        color: t[3] ?? '#888',\n        ...(t[4] ? { dash: t.slice(4).join(' ') } : {}),\n      };\n      tiers.push(tier);\n      continue;\n    }\n\n    // Subnet / Zone / VLAN / Rack containers\n    const groupMatch = line.match(/^(group|subnet|zone|vlan|rack)\\s+(.+)$/i);\n    if (groupMatch) {\n      const gType = groupMatch[1]!.toLowerCase() as TopoGroup['type'];\n      const rest = groupMatch[2]!.trim();\n\n      let id = '';\n      let label = '';\n      let cidr: string | undefined;\n\n      if (gType === 'group' && rest.includes(':') && !rest.includes('\"')) {\n        const parts = rest.split(':').map((s) => s.trim());\n        id = parts[0]!;\n        label = parts[1] || id;\n      } else {\n        const quoted = rest.matchAll(/\"([^\"]+)\"|'([^']+)'|(\\S+)/g);\n        const tokens: string[] = [];\n        for (const m of quoted) {\n          tokens.push(m[1] ?? m[2] ?? m[3]!);\n        }\n        if (tokens.length >= 2) {\n          if (tokens[0]!.includes('/') || /^\\d+\\.\\d+/.test(tokens[0]!)) {\n            cidr = tokens[0]!;\n            label = tokens[1]!;\n            id = `sub_${groups.length + 1}`;\n          } else {\n            id = tokens[0]!;\n            label = tokens[1]!;\n          }\n        } else if (tokens.length === 1) {\n          label = tokens[0]!;\n          id = `grp_${groups.length + 1}`;\n        }\n      }\n\n      if (!id) id = `g_${groups.length + 1}`;\n      if (!label) label = id;\n\n      groups.push({\n        id,\n        label,\n        type: gType,\n        ...(cidr ? { cidr } : {}),\n      });\n      curGroup = id;\n      continue;\n    }\n\n    if (/^end\\b/i.test(line)) {\n      curGroup = undefined;\n      continue;\n    }\n\n    // Devices & Nodes\n    const deviceMatch = line.match(\n      /^(node|router|gateway|switch|spine|leaf|tor|firewall|waf|loadbalancer|lb|server|host|compute|database|db|storage|cloud|internet|wan|client|device|cluster|pod)\\s+(.+)$/i,\n    );\n    if (deviceMatch) {\n      const role = deviceMatch[1]!.toLowerCase() as DeviceRole;\n      const rest = deviceMatch[2]!.trim();\n\n      let id = '';\n      let label = '';\n      let sub: string | undefined;\n      let ip: string | undefined;\n\n      if (role === 'node' && rest.includes(':') && !rest.includes('\"')) {\n        const parts = rest.split(':').map((s) => s.trim());\n        id = parts[0]!;\n        label = parts[1] || id;\n        if (parts[2]) sub = parts[2];\n      } else {\n        const idM = rest.match(/^([\\w-]+)/);\n        if (idM) {\n          id = idM[1]!;\n          let remainder = rest.slice(id.length).trim();\n\n          const bracketM = remainder.match(/\\[(.*?)\\]/);\n          if (bracketM) {\n            sub = bracketM[1]!.trim();\n            remainder = remainder.replace(/\\[.*?\\]/, '').trim();\n          }\n\n          const labelM = remainder.match(/\"([^\"]+)\"|'([^']+)'/);\n          if (labelM) {\n            label = labelM[1] ?? labelM[2]!;\n          } else if (remainder) {\n            label = remainder;\n          } else {\n            label = id;\n          }\n        }\n      }\n\n      if (!id) id = `n_${nodes.length + 1}`;\n      if (!label) label = id;\n\n      if (sub && (/^\\d+\\.\\d+\\.\\d+\\.\\d+/.test(sub) || sub.includes('/'))) {\n        ip = sub;\n      }\n\n      nodes.push({\n        id,\n        label,\n        role: role === 'node' ? undefined : role,\n        ...(sub ? { sub } : {}),\n        ...(ip ? { ip } : {}),\n        ...(curGroup ? { group: curGroup } : {}),\n      });\n      continue;\n    }\n\n    // Connections / Edges\n    const edgeMatch = line.match(/^(\\S+)\\s*(-->|<-->|<--|--|\\.\\.|\\.\\.\\.)\\s*(.+)$/);\n    if (edgeMatch) {\n      const fromRaw = edgeMatch[1]!;\n      const op = edgeMatch[2]!;\n      let rest = edgeMatch[3]!.trim();\n\n      const directed = op === '-->' || op === '->';\n      const bidirectional = op === '<-->';\n\n      // Extract label if present: \"100G Trunk\" or '100G Trunk'\n      let edgeLabel: string | undefined;\n      const labelMatch = rest.match(/\"([^\"]+)\"|'([^']+)'/);\n      if (labelMatch) {\n        edgeLabel = labelMatch[1] ?? labelMatch[2];\n        rest = rest.replace(labelMatch[0], '').trim();\n      }\n\n      // Extract cost if present: : 140\n      let cost: number | undefined;\n      const costMatch = rest.match(/:\\s*(-?\\d+(?:\\.\\d+)?)/);\n      if (costMatch) {\n        cost = Number(costMatch[1]);\n        rest = rest.replace(costMatch[0], '').trim();\n      }\n\n      // Extract route style modifier: @orthogonal, @straight, @bezier, @polyline\n      let routeStyle: RouteStyle | undefined;\n      const routerMatch = rest.match(/@(orthogonal|straight|bezier|polyline)\\b/i);\n      if (routerMatch) {\n        routeStyle = routerMatch[1]!.toLowerCase() as RouteStyle;\n        rest = rest.replace(routerMatch[0], '').trim();\n      }\n\n      const toRawList = rest.split(/[,;]+/).map((s) => s.trim()).filter(Boolean);\n\n      const fromParts = fromRaw.split(':');\n      const fromId = fromParts[0]!;\n      const fromPort = fromParts[1];\n\n      for (const toItem of toRawList) {\n        const toParts = toItem.split(':');\n        const toId = toParts[0]!;\n        const toPort = toParts[1];\n\n        edges.push({\n          from: fromId,\n          to: toId,\n          ...(fromPort ? { fromPort } : {}),\n          ...(toPort ? { toPort } : {}),\n          ...(edgeLabel ? { label: edgeLabel } : {}),\n          ...(routeStyle ? { routeStyle } : {}),\n          ...(directed ? { directed: true } : {}),\n          ...(bidirectional ? { bidirectional: true } : {}),\n          ...(cost !== undefined ? { cost } : {}),\n        });\n      }\n    }\n  }\n\n  return {\n    version: '1.0',\n    metadata: title ? { title } : {},\n    ...(title ? { title } : {}),\n    ...(pattern ? { pattern } : {}),\n    scale: { ...(unit !== undefined ? { unit } : {}), tiers },\n    groups,\n    nodes,\n    edges,\n  };\n}\n\n// \u2500\u2500\u2500 Layout & Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ARROW_ID = 'topo-arrow';\nconst ARROW_START_ID = 'topo-arrow-start';\n\nfunction intersects(a: Rect, b: Rect, pad = 2): boolean {\n  return !(\n    a.x + a.width < b.x - pad ||\n    a.x > b.x + b.width + pad ||\n    a.y + a.height < b.y - pad ||\n    a.y > b.y + b.height + pad\n  );\n}\n\nexport function layoutTopology(doc: TopologyDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing, edges } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const small = typography.smallFontSize;\n  const titleH = doc.title ? typography.titleFontSize + 24 : 0;\n\n  const nodeWidth = (n: TopoNode): number =>\n    Math.max(\n      130,\n      Math.max(measureText(n.label, font).width, measureText(n.sub ?? '', small).width) + 40,\n    );\n  const nodeH = doc.nodes.some((n) => n.sub || n.role) ? 58 : 42;\n\n  const elements: SceneElement[] = [];\n  const box = new Map<string, Rect>();\n  const groupBox = new Map<string, Rect>();\n\n  // Title\n  if (doc.title) {\n    elements.push(\n      p.text(\n        doc.title,\n        margin,\n        margin + typography.titleFontSize,\n        typography.titleFontSize + 2,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  // \u2500\u2500\u2500 Pre-Layout Edge Label Measurement & Dynamic Clearance Allocation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const nodeGroupMap = new Map<string, string>();\n  doc.nodes.forEach((n) => {\n    if (n.group) nodeGroupMap.set(n.id, n.group);\n  });\n\n  let maxInterGroupLabelW = 0;\n  let maxIntraGroupLabelW = 0;\n  let maxIntraGroupLabelH = 0;\n  let hasIntraGroupLabels = false;\n  let maxTierLabelH = 0;\n  let maxSpokeLabelW = 0;\n\n  for (const e of doc.edges) {\n    const labelText =\n      e.label ??\n      (e.cost !== undefined\n        ? doc.scale.unit\n          ? `${e.cost} ${doc.scale.unit}`\n          : String(e.cost)\n        : undefined);\n    if (!labelText) continue;\n\n    const lw = measureText(labelText, small - 1).width + 16;\n    const lh = 18;\n\n    const gFrom = nodeGroupMap.get(e.from);\n    const gTo = nodeGroupMap.get(e.to);\n\n    if (gFrom && gTo && gFrom !== gTo) {\n      maxInterGroupLabelW = Math.max(maxInterGroupLabelW, lw);\n    } else if (gFrom && gTo && gFrom === gTo) {\n      hasIntraGroupLabels = true;\n      maxIntraGroupLabelW = Math.max(maxIntraGroupLabelW, lw);\n      maxIntraGroupLabelH = Math.max(maxIntraGroupLabelH, lh);\n    } else if (!gFrom && !gTo) {\n      maxTierLabelH = Math.max(maxTierLabelH, lh);\n      maxSpokeLabelW = Math.max(maxSpokeLabelW, lw);\n      maxInterGroupLabelW = Math.max(maxInterGroupLabelW, lw);\n    } else {\n      maxInterGroupLabelW = Math.max(maxInterGroupLabelW, lw);\n    }\n  }\n\n  // \u2500\u2500\u2500 Layout Positioning Strategies \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n  if (doc.pattern === 'spine-leaf') {\n    // Clos 3-Tier Network: Spines (Tier 0) -> Leaves (Tier 1) -> Compute (Tier 2)\n    const isSpine = (n: TopoNode) => n.role === 'spine' || n.id.toLowerCase().startsWith('spine');\n    const isLeaf = (n: TopoNode) =>\n      !isSpine(n) &&\n      (n.role === 'leaf' ||\n        n.role === 'tor' ||\n        n.id.toLowerCase().startsWith('leaf') ||\n        n.role === 'switch');\n    const isCompute = (n: TopoNode) => !isSpine(n) && !isLeaf(n);\n\n    const spines = doc.nodes.filter(isSpine);\n    const leaves = doc.nodes.filter(isLeaf);\n    const compute = doc.nodes.filter(isCompute);\n\n    const tiers = [spines, leaves, compute].filter((t) => t.length > 0);\n    const startY = margin + titleH + 20;\n    const tierGap = Math.max(130, maxTierLabelH + 110);\n    const maxCount = Math.max(...tiers.map((t) => t.length), 1);\n    const colSpacing = Math.max(180, maxInterGroupLabelW + 20);\n    const totalContentW = maxCount * colSpacing;\n\n    tiers.forEach((tierNodes, tIdx) => {\n      const ty = startY + tIdx * (nodeH + tierGap);\n      const tierW = tierNodes.length * colSpacing;\n      const startX = margin + (totalContentW - tierW) / 2;\n\n      tierNodes.forEach((n, i) => {\n        const w = nodeWidth(n);\n        const bx = startX + i * colSpacing + (colSpacing - w) / 2;\n        box.set(n.id, { x: bx, y: ty, width: w, height: nodeH });\n      });\n    });\n  } else if (doc.pattern === 'hub-spoke' || doc.pattern === 'star') {\n    // Hub and Spoke radial layout with generous separation\n    const hub = doc.nodes[0]!;\n    const spokes = doc.nodes.slice(1);\n    const hubW = nodeWidth(hub);\n    const maxSpokeW = Math.max(...spokes.map(nodeWidth), 130);\n\n    const radius = Math.max(240, hubW / 2 + maxSpokeW / 2 + maxSpokeLabelW + 60);\n    const centerX = margin + radius + maxSpokeW / 2 + 20;\n    const centerY = margin + titleH + radius + nodeH / 2 + 20;\n\n    box.set(hub.id, { x: centerX - hubW / 2, y: centerY - nodeH / 2, width: hubW, height: nodeH });\n\n    spokes.forEach((spoke, idx) => {\n      const angle = (idx / spokes.length) * 2 * Math.PI - Math.PI / 2;\n      const sx = centerX + radius * Math.cos(angle);\n      const sy = centerY + radius * Math.sin(angle);\n      const sw = nodeWidth(spoke);\n      box.set(spoke.id, { x: sx - sw / 2, y: sy - nodeH / 2, width: sw, height: nodeH });\n    });\n  } else if (doc.pattern === 'ring') {\n    // Ring circular loop layout\n    const count = doc.nodes.length;\n    const maxNodeW = Math.max(...doc.nodes.map(nodeWidth), 130);\n    const radius = Math.max(220, count * 40);\n    const centerX = margin + radius + maxNodeW / 2 + 20;\n    const centerY = margin + titleH + radius + nodeH / 2 + 20;\n\n    doc.nodes.forEach((n, idx) => {\n      const angle = (idx / count) * 2 * Math.PI - Math.PI / 2;\n      const nx = centerX + radius * Math.cos(angle);\n      const ny = centerY + radius * Math.sin(angle);\n      const nw = nodeWidth(n);\n      box.set(n.id, { x: nx - nw / 2, y: ny - nodeH / 2, width: nw, height: nodeH });\n    });\n  } else if (doc.groups.length > 0) {\n    // Subnet / Zone Enclosures with clean vertical columns and dynamic clearance corridors\n    let gx = margin;\n    const gy = margin + titleH + 10;\n    let maxBottom = gy;\n    const GHEADER = 36,\n      GPAD = 24,\n      CGAP_X = Math.max(28, maxIntraGroupLabelW > 0 ? 36 : 28),\n      CGAP_Y = hasIntraGroupLabels ? 56 : 32,\n      GROUP_GAP = Math.max(70, maxInterGroupLabelW + 60);\n\n    for (const g of doc.groups) {\n      const kids = doc.nodes.filter((n) => n.group === g.id);\n      const childW = Math.max(140, ...(kids.length > 0 ? kids.map(nodeWidth) : [140]));\n      const cols = kids.length <= 4 ? 1 : 2;\n      const rows = Math.max(1, Math.ceil(kids.length / cols));\n      const innerW = cols * childW + (cols - 1) * CGAP_X;\n      const innerH = rows * nodeH + (rows - 1) * CGAP_Y;\n      const gw = Math.max(innerW + GPAD * 2, 230);\n      const gh = GHEADER + GPAD + innerH + GPAD;\n\n      groupBox.set(g.id, { x: gx, y: gy, width: gw, height: gh });\n      kids.forEach((n, i) => {\n        const col = i % cols;\n        const row = Math.floor(i / cols);\n        box.set(n.id, {\n          x: gx + GPAD + col * (childW + CGAP_X),\n          y: gy + GHEADER + GPAD + row * (nodeH + CGAP_Y),\n          width: childW,\n          height: nodeH,\n        });\n      });\n      maxBottom = Math.max(maxBottom, gy + gh);\n      gx += gw + GROUP_GAP;\n    }\n\n    let ux = margin;\n    const uy = maxBottom + 40;\n    for (const n of doc.nodes.filter((n) => !n.group)) {\n      const w = nodeWidth(n);\n      box.set(n.id, { x: ux, y: uy, width: w, height: nodeH });\n      ux += w + 40;\n    }\n  } else {\n    // Standard Grid layout\n    const nodeW = Math.max(140, ...doc.nodes.map(nodeWidth));\n    const cols = Math.max(1, Math.ceil(Math.sqrt(doc.nodes.length)));\n    const colGap = Math.max(100, maxInterGroupLabelW + 50);\n    const rowGap = hasIntraGroupLabels ? 90 : 80;\n\n    doc.nodes.forEach((n, i) => {\n      const col = i % cols;\n      const row = Math.floor(i / cols);\n      box.set(n.id, {\n        x: margin + col * (nodeW + colGap),\n        y: margin + titleH + row * (nodeH + rowGap) + 10,\n        width: nodeW,\n        height: nodeH,\n      });\n    });\n  }\n\n  // \u2500\u2500\u2500 Render Group Panels (Subnets / Zones) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const groupHeaderBoxes: Rect[] = [];\n\n  for (const g of doc.groups) {\n    const gb = groupBox.get(g.id)!;\n    const isSubnet = g.type === 'subnet' || Boolean(g.cidr);\n\n    elements.push(\n      p.rect(gb, palette.surface, isSubnet ? palette.primary : palette.border, 1.6, {\n        rx: 10,\n      }),\n    );\n\n    const tagText = g.cidr ? `${g.label} [${g.cidr}]` : g.label;\n    elements.push(\n      p.text(tagText, gb.x + 16, gb.y + 22, small, palette.primary, { weight: 'bold' }),\n    );\n\n    groupHeaderBoxes.push({ x: gb.x, y: gb.y, width: gb.width, height: 38 });\n  }\n\n  // \u2500\u2500\u2500 Render Edges & Multi-Track Corridor Routing \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const idBox = new Map<string, Rect>([...box, ...groupBox]);\n  const placedLabels: Rect[] = [];\n  const obstacles: Rect[] = [...box.values(), ...groupHeaderBoxes];\n\n  doc.edges.forEach((e, edgeIdx) => {\n    const a = idBox.get(e.from);\n    const b = idBox.get(e.to);\n    if (!a || !b) return;\n\n    const tier: CostTier | undefined =\n      e.cost !== undefined && doc.scale.tiers.length > 0\n        ? classifyCost(doc.scale, e.cost)\n        : undefined;\n\n    const color = tier?.color ?? palette.primary;\n    const strokeWidth = 1.8;\n\n    const acx = a.x + a.width / 2;\n    const acy = a.y + a.height / 2;\n    const bcx = b.x + b.width / 2;\n    const bcy = b.y + b.height / 2;\n\n    const dx = bcx - acx;\n    const dy = bcy - acy;\n\n    let start: Point;\n    let end: Point;\n\n    const isTopToBottom = dy > 30 && Math.abs(dy) > Math.abs(dx) * 0.4;\n    const isBottomToTop = dy < -30 && Math.abs(dy) > Math.abs(dx) * 0.4;\n    const isLeftToRight = dx > 30 && Math.abs(dx) >= Math.abs(dy) * 0.8;\n    const isRightToLeft = dx < -30 && Math.abs(dx) >= Math.abs(dy) * 0.8;\n\n    if (isTopToBottom) {\n      start = { x: acx, y: a.y + a.height };\n      end = { x: bcx, y: b.y };\n    } else if (isBottomToTop) {\n      start = { x: acx, y: a.y };\n      end = { x: bcx, y: b.y + b.height };\n    } else if (isLeftToRight) {\n      start = { x: a.x + a.width, y: acy };\n      end = { x: b.x, y: bcy };\n    } else if (isRightToLeft) {\n      start = { x: a.x, y: acy };\n      end = { x: b.x + b.width, y: bcy };\n    } else {\n      start = borderPoint(a, bcx, bcy);\n      end = borderPoint(b, acx, acy);\n    }\n\n    let pathD: string;\n    let labelPos: Point;\n\n    if (e.routeStyle === 'orthogonal') {\n      if (isTopToBottom || isBottomToTop) {\n        if (Math.abs(start.x - end.x) < 4) {\n          pathD = `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`;\n          labelPos = { x: start.x, y: (start.y + end.y) / 2 };\n        } else {\n          const corridorFraction = 0.32 + (edgeIdx % 4) * 0.12;\n          const yMid = start.y + (end.y - start.y) * corridorFraction;\n          pathD = `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(start.x)} ${rhu(yMid)} L ${rhu(end.x)} ${rhu(yMid)} L ${rhu(end.x)} ${rhu(end.y)}`;\n          labelPos = { x: (start.x + end.x) / 2, y: yMid - 6 };\n        }\n      } else if (isLeftToRight || isRightToLeft) {\n        if (Math.abs(start.y - end.y) < 4) {\n          pathD = `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`;\n          labelPos = { x: (start.x + end.x) / 2, y: start.y - 6 };\n        } else {\n          const corridorFraction = 0.32 + (edgeIdx % 4) * 0.12;\n          const xMid = start.x + (end.x - start.x) * corridorFraction;\n          pathD = `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(xMid)} ${rhu(start.y)} L ${rhu(xMid)} ${rhu(end.y)} L ${rhu(end.x)} ${rhu(end.y)}`;\n          labelPos = { x: xMid, y: (start.y + end.y) / 2 };\n        }\n      } else {\n        pathD = `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`;\n        labelPos = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 - 6 };\n      }\n    } else if (e.routeStyle === 'bezier') {\n      if (Math.abs(dx) > Math.abs(dy)) {\n        const cx1 = start.x + dx * 0.45;\n        const cx2 = end.x - dx * 0.45;\n        pathD = `M ${rhu(start.x)} ${rhu(start.y)} C ${rhu(cx1)} ${rhu(start.y)}, ${rhu(cx2)} ${rhu(end.y)}, ${rhu(end.x)} ${rhu(end.y)}`;\n      } else {\n        const cy1 = start.y + dy * 0.45;\n        const cy2 = end.y - dy * 0.45;\n        pathD = `M ${rhu(start.x)} ${rhu(start.y)} C ${rhu(start.x)} ${rhu(cy1)}, ${rhu(end.x)} ${rhu(cy2)}, ${rhu(end.x)} ${rhu(end.y)}`;\n      }\n      labelPos = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 - 8 };\n    } else {\n      // Straight direct line\n      pathD = `M ${rhu(start.x)} ${rhu(start.y)} L ${rhu(end.x)} ${rhu(end.y)}`;\n      if (Math.abs(start.x - end.x) < 4) {\n        // Vertical direct link: centered between top and bottom cards\n        labelPos = { x: start.x, y: (start.y + end.y) / 2 };\n      } else if (Math.abs(start.y - end.y) < 4) {\n        // Horizontal direct link\n        labelPos = { x: (start.x + end.x) / 2, y: start.y - 8 };\n      } else {\n        // Diagonal direct link\n        const t = edgeIdx % 2 === 0 ? 0.30 : 0.70;\n        const lx = start.x + (end.x - start.x) * t;\n        const ly = start.y + (end.y - start.y) * t;\n        const len = Math.hypot(dx, dy) || 1;\n        const nx = -dy / len;\n        const ny = dx / len;\n        labelPos = { x: lx + nx * 10, y: ly + ny * 10 };\n      }\n    }\n\n    elements.push(\n      p.path(pathD, color, strokeWidth, {\n        ...(tier?.dash ? { dash: tier.dash } : {}),\n        ...(e.directed ? { markerEnd: ARROW_ID } : {}),\n        ...(e.bidirectional ? { markerStart: ARROW_START_ID, markerEnd: ARROW_ID } : {}),\n      }),\n    );\n\n    // Interface Port Labels\n    if (e.fromPort) {\n      const offsetX = start.x <= a.x + 2 ? -6 : start.x >= a.x + a.width - 2 ? 6 : 0;\n      const offsetY = start.y <= a.y + 2 ? -6 : start.y >= a.y + a.height - 2 ? 14 : -6;\n      elements.push(\n        p.text(e.fromPort, start.x + offsetX, start.y + offsetY, small - 2, palette.textMuted, {\n          anchor: offsetX < 0 ? 'end' : offsetX > 0 ? 'start' : 'middle',\n        }),\n      );\n    }\n    if (e.toPort) {\n      const offsetX = end.x <= b.x + 2 ? -6 : end.x >= b.x + b.width - 2 ? 6 : 0;\n      const offsetY = end.y <= b.y + 2 ? -6 : end.y >= b.y + b.height - 2 ? 14 : -6;\n      elements.push(\n        p.text(e.toPort, end.x + offsetX, end.y + offsetY, small - 2, palette.textMuted, {\n          anchor: offsetX < 0 ? 'end' : offsetX > 0 ? 'start' : 'middle',\n        }),\n      );\n    }\n\n    // \u2500\u2500\u2500 Obstacle-Aware Edge Label Placement \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n    const labelText =\n      e.label ??\n      (e.cost !== undefined\n        ? doc.scale.unit\n          ? `${e.cost} ${doc.scale.unit}`\n          : String(e.cost)\n        : undefined);\n    if (labelText) {\n      const textDim = measureText(labelText, small - 1);\n      const lw = textDim.width + 10;\n      const lh = 16;\n\n      let bestX = labelPos.x - lw / 2;\n      let bestY = labelPos.y - lh / 2;\n\n      // Candidate search for collision-free placement\n      const allObstacles = [...obstacles, ...placedLabels];\n      let hasCollision = allObstacles.some((obs) =>\n        intersects({ x: bestX, y: bestY, width: lw, height: lh }, obs, 2),\n      );\n\n      if (hasCollision) {\n        // Try fractional positions along the edge path\n        const sampleT = [0.5, 0.4, 0.6, 0.3, 0.7, 0.2, 0.8];\n        let found = false;\n\n        for (const t of sampleT) {\n          const cx = start.x + (end.x - start.x) * t;\n          const cy = start.y + (end.y - start.y) * t;\n          const testX = cx - lw / 2;\n          const testY = cy - lh / 2;\n\n          if (!allObstacles.some((obs) => intersects({ x: testX, y: testY, width: lw, height: lh }, obs, 2))) {\n            bestX = testX;\n            bestY = testY;\n            found = true;\n            break;\n          }\n        }\n\n        // If still colliding, offset perpendicular to the edge path\n        if (!found) {\n          for (let step = 1; step <= 8; step++) {\n            const offsetY = (step % 2 === 0 ? 1 : -1) * Math.ceil(step / 2) * (lh + 4);\n            const testY = bestY + offsetY;\n            if (!allObstacles.some((obs) => intersects({ x: bestX, y: testY, width: lw, height: lh }, obs, 2))) {\n              bestY = testY;\n              found = true;\n              break;\n            }\n          }\n        }\n      }\n\n      const finalRect: Rect = { x: bestX, y: bestY, width: lw, height: lh };\n      placedLabels.push(finalRect);\n\n      elements.push(\n        p.rect(\n          { x: rhu(bestX), y: rhu(bestY), width: rhu(lw), height: lh },\n          palette.background,\n          palette.border,\n          0.8,\n          { rx: 3 },\n        ),\n      );\n      elements.push(\n        p.text(\n          labelText,\n          rhu(bestX + lw / 2),\n          rhu(bestY + lh / 2 + (small - 1) * 0.35),\n          small - 1,\n          color,\n          {\n            anchor: 'middle',\n            weight: 'bold',\n          },\n        ),\n      );\n    }\n  });\n\n  // \u2500\u2500\u2500 Render Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const anchors: Record<string, { bounds: Rect }> = {};\n\n  for (const n of doc.nodes) {\n    const b = box.get(n.id)!;\n\n    elements.push(p.rect(b, palette.surface, palette.primary, 1.8, { rx: 6 }));\n\n    // Device Role Badge\n    if (n.role) {\n      const roleText = n.role.toUpperCase();\n      const rw = measureText(roleText, small - 2).width + 8;\n      const rh = 13;\n      elements.push(\n        p.rect(\n          { x: b.x + 6, y: b.y - rh / 2, width: rw, height: rh },\n          palette.background,\n          palette.primary,\n          1,\n          { rx: 3 },\n        ),\n      );\n      elements.push(\n        p.text(roleText, b.x + 6 + rw / 2, b.y + (small - 2) * 0.35, small - 2, palette.primary, {\n          anchor: 'middle',\n          weight: 'bold',\n        }),\n      );\n    }\n\n    // Node Label\n    const textY = n.sub ? b.y + 24 : b.y + b.height / 2 + font * 0.35;\n    elements.push(\n      p.text(n.label, rhu(b.x + b.width / 2), rhu(textY), font, palette.text, {\n        anchor: 'middle',\n        weight: 'bold',\n      }),\n    );\n\n    // Subtitle / IP / Specs\n    if (n.sub) {\n      elements.push(\n        p.text(n.sub, rhu(b.x + b.width / 2), rhu(b.y + 44), small - 1, palette.textMuted, {\n          anchor: 'middle',\n        }),\n      );\n    }\n\n    // Anchor registrations for cross-linking in posters\n    anchors[n.id] = { bounds: b };\n    anchors[`node.${n.id}`] = { bounds: b };\n    if (n.role) anchors[`${n.role}.${n.id}`] = { bounds: b };\n    if (n.group) anchors[`${n.group}.${n.id}`] = { bounds: b };\n  }\n\n  // Anchor registrations for groups / subnets\n  for (const g of doc.groups) {\n    const gb = groupBox.get(g.id)!;\n    anchors[g.id] = { bounds: gb };\n    anchors[`zone_${g.id}`] = { bounds: gb };\n    anchors[`subnet_${g.id}`] = { bounds: gb };\n  }\n\n  // \u2500\u2500\u2500 Legend & ViewBox Dimensions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  const allBoxes = [...box.values(), ...groupBox.values(), ...placedLabels];\n  const boxesRight = Math.max(margin, ...allBoxes.map((b) => b.x + b.width));\n  const contentBottom = Math.max(margin + titleH, ...allBoxes.map((b) => b.y + b.height));\n\n  let contentRight = boxesRight;\n  if (doc.scale.tiers.length > 0) {\n    const legend = buildLegend(p, theme, doc.scale, { x: boxesRight + 36, y: margin + titleH });\n    elements.push(...legend.elements);\n    contentRight = legend.bounds.x + legend.bounds.width;\n  }\n\n  const s = edges?.arrowSize ?? 8;\n  const sH = rhu(s * 0.7);\n  const sMidY = rhu(s * 0.35);\n  const sRefX = rhu(s - 1);\n\n  const defs = [\n    `<marker id=\"${ARROW_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"${sRefX}\" refY=\"${sMidY}\" orient=\"auto\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n    `<marker id=\"${ARROW_START_ID}\" markerWidth=\"${s}\" markerHeight=\"${sH}\" refX=\"1\" refY=\"${sMidY}\" orient=\"auto-start-reverse\" markerUnits=\"userSpaceOnUse\"><polygon points=\"0 0, ${s} ${sMidY}, 0 ${sH}\" fill=\"${palette.primary}\" /></marker>`,\n  ];\n\n  const scene: Scene = applyOverlays(\n    {\n      viewBox: { x: 0, y: 0, width: rhuInt(contentRight + margin), height: rhuInt(contentBottom + margin) },\n      background: palette.background,\n      elements,\n      defs,\n    },\n    doc.metadata?.['overlays'] as any,\n    theme,\n  );\n\n  return { scene, anchors: anchors as NodeAnchorRegistry };\n}\n\nexport const topology: DiagramModule<TopologyDoc> = {\n  parseMermaid(input: string) {\n    return parse(input);\n  },\n  parseYaml(input: string) {\n    return JSON.parse(input);\n  },\n  layout(ir, theme: ResolvedTheme): LayoutResult {\n    return layoutTopology(ir, theme);\n  },\n};\n", "/**\n * @file diagrams/triton/deck/list/list.ts \u2014 staged, styleable list.\n *\n * A PowerPoint-style list object, and the FIRST citizen of Triton's\n * reveal-native \"deck\" family. A single `style` keyword switches the drawing\n * dramatically (bullets, numbered, block, box \u2026) while the parse and reveal\n * machinery stay shared. Items may be NESTED via indentation, forming a tree;\n * each node gets a stable hierarchical id (`item-0`, `item-0-1`, \u2026) drawn from\n * the same vocabulary as the node-anchor registry, so links/anchors and reveal\n * steps can target any node \u2014 including nested ones.\n *\n * The reveal choreography is emitted as a RevealTrack on the LayoutResult. It\n * is PURE DATA: the static SVG (via renderSync) renders identically and carries\n * no reveal manifest \u2014 only the interactive render path serializes it.\n *\n * Line-based mini-syntax:\n *   list\n *     style block             # bullets | numbered | block | box | tree\n *                             # chevron | process | timeline | pyramid | columns\n *                             # cycle | matrix | funnel | stepup | venn\n *                             # (default: bullets)\n *     reveal subtree          # sequence | subtree | layer | none            (default: sequence)\n *     title Agenda\n *     effect slide            # global default reveal effect (fade|slide|grow|draw)\n *     group 2                 # reveal items in chunks of N per step (sequence mode)\n *     flow snake              # ltr (default) | ttb | snake | snake-v  (process style only)\n *     wrap 3                  # cells per row/col before turning (snake/snake-v; default: ceil(\u221An))\n *     turn direct             # corridor (default) | direct  (snake/snake-v turn style)\n *     Introduction\n *     The problem\n *       and a sub-point       # 2-space indent \u2192 child of the previous item\n *     + and its cost          # `+` joins this item into the PREVIOUS step\n *     Our approach @grow      # trailing `@<effect>` overrides this step's effect\n *     Results\n *\n * A leading `-` or `*` marker on an item line is optional and stripped.\n * Indentation (spaces or tabs) determines nesting depth.\n *\n * Reveal choreography (interactive path only):\n *   - `sequence` (default): one step per item, in document order.\n *       `group N` chunks items N-per-step; `+` force-merges into the current step.\n *   - `subtree`: one step per top-level (depth-0) item, revealing it together\n *     with all its descendants.\n *   - `layer`: BFS by depth \u2014 one step per level (all depth-0, then depth-1 \u2026).\n *   - `none` (aka `all`/`off`/`static`): emit NO reveal track \u2014 the diagram is\n *     shown all at once (hosts like Deckpilot skip fragmenting it).\n *   - Step effect precedence: first item's `@effect` > global `effect` > 'fade'.\n */\n\nimport type {\n  DiagramModule,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n  RevealEffect,\n  RevealStep,\n  ThemePalette,\n} from '../../../../contracts/index.js';\nimport { pen } from '../../../../scene/build.js';\nimport { measureText } from '../../../../text/metrics.js';\nimport { wrapText } from '../../../../text/wrap.js';\nimport { readableText } from '../../../../theme/contrast.js';\nimport { rhu } from '../../../../util/round.js';\n\nconst REVEAL_EFFECTS: readonly RevealEffect[] = ['fade', 'slide', 'grow', 'draw'];\n\n/** Drawing styles. `bullets` is the default and preserves the original look. */\nexport type ListStyle =\n  | 'bullets'\n  | 'numbered'\n  | 'block'\n  | 'box'\n  | 'tree'\n  | 'chevron'\n  | 'process'\n  | 'timeline'\n  | 'pyramid'\n  | 'columns'\n  | 'cycle'\n  | 'matrix'\n  | 'funnel'\n  | 'stepup'\n  | 'venn';\nconst LIST_STYLES: readonly ListStyle[] = [\n  'bullets',\n  'numbered',\n  'block',\n  'box',\n  'tree',\n  'chevron',\n  'process',\n  'timeline',\n  'pyramid',\n  'columns',\n  'cycle',\n  'matrix',\n  'funnel',\n  'stepup',\n  'venn',\n];\n\n/** Reveal choreography over the (possibly nested) item tree. */\nexport type RevealMode = 'sequence' | 'subtree' | 'layer' | 'none';\nconst REVEAL_MODES: readonly RevealMode[] = ['sequence', 'subtree', 'layer', 'none'];\n\n/** Flow direction for the `process` style. `ltr` is the default and preserves legacy behavior. */\nexport type ProcessFlow = 'ltr' | 'ttb' | 'snake' | 'snake-v';\nexport const PROCESS_FLOWS: readonly ProcessFlow[] = ['ltr', 'ttb', 'snake', 'snake-v'];\n\nexport function asFlow(token: string): ProcessFlow | undefined {\n  const t = token.toLowerCase() as ProcessFlow;\n  return PROCESS_FLOWS.includes(t) ? t : undefined;\n}\n\n/** Turn-connector style for snake/snake-v flows. `corridor` is the default. */\nexport type TurnStyle = 'corridor' | 'direct';\nexport const TURN_STYLES: readonly TurnStyle[] = ['corridor', 'direct'];\n\nexport function asTurn(token: string): TurnStyle | undefined {\n  const t = token.toLowerCase() as TurnStyle;\n  return TURN_STYLES.includes(t) ? t : undefined;\n}\n\n/**\n * Returns the grid (row, col) coordinates for item index `i` under the given\n * flow pattern. Pure and unit-testable \u2014 all pattern math lives here.\n * Extend this function alone to add new patterns (diagonal, spiral, U-turn\u2026).\n */\nexport function cellForIndex(\n  i: number,\n  flow: ProcessFlow,\n  wrap: number,\n): { row: number; col: number } {\n  switch (flow) {\n    case 'ltr':\n      return { row: 0, col: i };\n    case 'ttb':\n      return { row: i, col: 0 };\n    case 'snake': {\n      const row = Math.floor(i / wrap);\n      const pos = i % wrap;\n      const col = row % 2 === 0 ? pos : wrap - 1 - pos;\n      return { row, col };\n    }\n    case 'snake-v': {\n      const col = Math.floor(i / wrap);\n      const pos = i % wrap;\n      const row = col % 2 === 0 ? pos : wrap - 1 - pos;\n      return { row, col };\n    }\n  }\n}\n\nfunction asEffect(token: string): RevealEffect | undefined {\n  const t = token.toLowerCase() as RevealEffect;\n  return REVEAL_EFFECTS.includes(t) ? t : undefined;\n}\nfunction asStyle(token: string): ListStyle | undefined {\n  const t = token.toLowerCase() as ListStyle;\n  return LIST_STYLES.includes(t) ? t : undefined;\n}\nfunction asMode(token: string): RevealMode | undefined {\n  const t = token.toLowerCase();\n  // `none` (aka all/off/static) opts the diagram OUT of progressive reveal:\n  // no reveal track is emitted, so hosts (e.g. Deckpilot) show it all at once.\n  if (t === 'none' || t === 'all' || t === 'off' || t === 'static') return 'none';\n  return REVEAL_MODES.includes(t as RevealMode) ? (t as RevealMode) : undefined;\n}\n\n/** A single, possibly-nested list item. */\nexport interface ListItem {\n  /** Display text, with markers/effect tokens stripped. */\n  text: string;\n  /** 0-based nesting depth. */\n  depth: number;\n  /** Stable hierarchical id, e.g. `item-0`, `item-0-1`. */\n  id: string;\n  /** 1-based dotted ordinal path, e.g. `1`, `1.2`, `2.1.1` (for `numbered`). */\n  numberLabel: string;\n  /** True when this item joins the PREVIOUS reveal step (`+` prefix). */\n  join: boolean;\n  /** Per-item reveal-effect override (undefined = inherit). */\n  effect?: RevealEffect;\n}\n\nexport interface ListDoc {\n  title?: string;\n  /** Resolved drawing style (default: `bullets`). */\n  style: ListStyle;\n  /** Resolved reveal mode (default: `sequence`). */\n  reveal: RevealMode;\n  /** Global default reveal effect for every step. */\n  effect?: RevealEffect;\n  /** Reveal items in chunks of this many per step (>= 1, sequence mode). */\n  group?: number;\n  /** Flow direction for `process` style (default: `ltr`). Ignored for other styles. */\n  flow?: ProcessFlow;\n  /** Cells per row (snake) / per column (snake-v) before turning. Defaults to ceil(\u221An). */\n  wrap?: number;\n  /** Turn-connector style for snake/snake-v flows (default: `corridor`). */\n  turn?: TurnStyle;\n  items: ListItem[];\n  version: string;\n  metadata: Record<string, unknown>;\n}\n\n/** Number of leading-whitespace columns (tabs count as 2), before trimming. */\nfunction indentWidth(line: string): number {\n  const lead = line.match(/^[ \\t]*/)?.[0] ?? '';\n  return lead.replace(/\\t/g, '  ').length;\n}\n\n/** Split into non-empty raw lines (leading whitespace PRESERVED), frontmatter removed, supporting line continuations. */\nfunction sourceLines(input: string): string[] {\n  // Theme injection (e.g. from Deckpilot) prepends a `---\\ntheme: \u2026\\n---` block.\n  const body = input.replace(/^\\s*---\\r?\\n[\\s\\S]*?\\r?\\n---\\r?\\n?/, '');\n  const lines = body.split(/\\r?\\n/);\n  const out: string[] = [];\n\n  for (let i = 0; i < lines.length; i++) {\n    let line = lines[i]!;\n    if (line.trim().length === 0) continue;\n\n    // Line continuation if ending with '\\' or '<br>' / '<br/>' / '<br />'\n    while (\n      (line.trimEnd().endsWith('\\\\') || /(?:<br\\s*\\/?>)\\s*$/i.test(line)) &&\n      i + 1 < lines.length\n    ) {\n      if (line.trimEnd().endsWith('\\\\')) {\n        line = line.trimEnd().slice(0, -1).trimEnd() + '\\n' + lines[i + 1]!.trim();\n      } else {\n        line = line + '\\n' + lines[i + 1]!.trim();\n      }\n      i++;\n    }\n\n    // Pipe continuation: indented line starting with \"| \"\n    while (i + 1 < lines.length && /^\\s*\\|\\s*/.test(lines[i + 1]!)) {\n      const nextClean = lines[i + 1]!.replace(/^\\s*\\|\\s*/, '');\n      line = line + '\\n' + nextClean;\n      i++;\n    }\n\n    // Quoted multiline block: \"Line 1 ...\n    if (/^\\s*\"[^\"]*$/.test(line)) {\n      while (i + 1 < lines.length) {\n        i++;\n        line = line + '\\n' + lines[i]!;\n        if (lines[i]!.includes('\"')) break;\n      }\n      line = line.replace(/^\\s*\"|\"\\s*$/g, '');\n    }\n\n    out.push(line);\n  }\n\n  return out;\n}\n\n/**\n * Parse a leading `---\u2026---` YAML-ish frontmatter block into a flat key/value\n * map. Triton's frontend reads `metadata.theme` to resolve the diagram theme.\n */\nfunction frontmatterMeta(input: string): Record<string, unknown> {\n  const m = input.match(/^\\s*---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?/);\n  if (!m) return {};\n  const meta: Record<string, unknown> = {};\n  for (const line of (m[1] ?? '').split(/\\r?\\n/)) {\n    const idx = line.indexOf(':');\n    if (idx === -1) continue;\n    const key = line.slice(0, idx).trim();\n    const value = line\n      .slice(idx + 1)\n      .trim()\n      .replace(/^[\"']|[\"']$/g, '');\n    if (key) meta[key] = value;\n  }\n  return meta;\n}\n\nexport function parseList(input: string): ListDoc {\n  let title: string | undefined;\n  let style: ListStyle = 'bullets';\n  let reveal: RevealMode = 'sequence';\n  let effect: RevealEffect | undefined;\n  let group: number | undefined;\n  let flow: ProcessFlow = 'ltr';\n  let wrap: number | undefined;\n  let turn: TurnStyle = 'corridor';\n\n  // Collect raw items with their indentation before resolving depth.\n  const raw: { indent: number; text: string; join: boolean; effect?: RevealEffect }[] = [];\n\n  for (const line of sourceLines(input)) {\n    const trimmed = line.trim();\n    const lower = trimmed.toLowerCase();\n    if (lower === 'list') continue; // header\n    if (lower.startsWith('title ') && !trimmed.includes('::') && raw.length === 0) {\n      title = trimmed.slice(6).trim();\n      continue;\n    }\n    if (lower.startsWith('style ') && !trimmed.includes('::') && raw.length === 0) {\n      style = asStyle(trimmed.slice(6).trim()) ?? style;\n      continue;\n    }\n    if (lower.startsWith('reveal ')) {\n      reveal = asMode(trimmed.slice(7).trim()) ?? reveal;\n      continue;\n    }\n    if (lower.startsWith('effect ')) {\n      effect = asEffect(trimmed.slice(7).trim()) ?? effect;\n      continue;\n    }\n    if (lower.startsWith('group ')) {\n      const num = parseInt(trimmed.slice(6).trim(), 10);\n      if (Number.isFinite(num) && num >= 1) group = num;\n      continue;\n    }\n    if (lower.startsWith('flow ')) {\n      flow = asFlow(trimmed.slice(5).trim()) ?? flow;\n      continue;\n    }\n    if (lower.startsWith('wrap ')) {\n      const num = parseInt(trimmed.slice(5).trim(), 10);\n      if (Number.isFinite(num) && num >= 1) wrap = num;\n      continue;\n    }\n    if (lower.startsWith('turn ')) {\n      turn = asTurn(trimmed.slice(5).trim()) ?? turn;\n      continue;\n    }\n\n    // Item line. Depth comes from the RAW indentation.\n    const indent = indentWidth(line);\n    let text = trimmed;\n    const join = /^\\+\\s+/.test(text);\n    if (join) text = text.replace(/^\\+\\s+/, '');\n    text = text.replace(/^[-*]\\s+/, ''); // optional list marker\n    let itemEffect: RevealEffect | undefined;\n    const m = text.match(/\\s+@(\\w+)\\s*$/);\n    if (m) {\n      const e = asEffect(m[1] ?? '');\n      if (e) {\n        itemEffect = e;\n        text = text.slice(0, m.index ?? 0).trimEnd();\n      }\n    }\n    raw.push({ indent, text, join, ...(itemEffect ? { effect: itemEffect } : {}) });\n  }\n\n  const items = assignTree(raw);\n\n  return {\n    ...(title !== undefined ? { title } : {}),\n    style,\n    reveal,\n    ...(effect !== undefined ? { effect } : {}),\n    ...(group !== undefined ? { group } : {}),\n    ...(flow !== 'ltr' ? { flow } : {}),\n    ...(wrap !== undefined ? { wrap } : {}),\n    ...(turn !== 'corridor' ? { turn } : {}),\n    items,\n    version: '1.0',\n    metadata: frontmatterMeta(input),\n  };\n}\n\n/**\n * Resolve indentation widths into a tree: assign each item a depth and a\n * stable hierarchical id/ordinal. Uses an indent stack so 2-space, 4-space,\n * or tab indentation all work; the first item establishes depth 0.\n */\nfunction assignTree(\n  raw: { indent: number; text: string; join: boolean; effect?: RevealEffect }[],\n): ListItem[] {\n  const stack: number[] = []; // indent widths of the current ancestor chain\n  const path: number[] = []; // 0-based sibling index at each depth\n  const items: ListItem[] = [];\n\n  for (const r of raw) {\n    while (stack.length > 0 && r.indent < stack[stack.length - 1]!) stack.pop();\n    if (stack.length === 0 || r.indent > stack[stack.length - 1]!) {\n      stack.push(r.indent);\n    }\n    const depth = stack.length - 1;\n\n    // Update the sibling-index path for id/ordinal assignment.\n    if (path.length === depth) {\n      path.push(0); // first child at a new deeper level\n    } else {\n      path.length = depth + 1; // pop back up to this depth\n      path[depth] = (path[depth] ?? -1) + 1;\n    }\n\n    items.push({\n      text: r.text,\n      depth,\n      id: `item-${path.join('-')}`,\n      numberLabel: path.map((num) => num + 1).join('.'),\n      join: r.join,\n      ...(r.effect ? { effect: r.effect } : {}),\n    });\n  }\n  return items;\n}\n\n// \u2500\u2500\u2500 Reveal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction buildSteps(doc: ListDoc): RevealStep[] {\n  type Mut = { enter: string[]; effect: RevealEffect; label: string };\n  const out: Mut[] = [];\n\n  if (doc.reveal === 'subtree') {\n    let cur: Mut | null = null;\n    for (const it of doc.items) {\n      if (it.depth === 0 || cur === null) {\n        cur = { enter: [it.id], effect: it.effect ?? doc.effect ?? 'fade', label: it.text };\n        out.push(cur);\n      } else {\n        cur.enter.push(it.id);\n      }\n    }\n  } else if (doc.reveal === 'layer') {\n    // BFS by depth: one step per level (all depth-0, then all depth-1, \u2026).\n    const byDepth = new Map<number, string[]>();\n    for (const it of doc.items) {\n      const arr = byDepth.get(it.depth) ?? [];\n      arr.push(it.id);\n      byDepth.set(it.depth, arr);\n    }\n    for (const depth of [...byDepth.keys()].sort((a, b) => a - b)) {\n      out.push({\n        enter: byDepth.get(depth)!,\n        effect: doc.effect ?? 'fade',\n        label: `Level ${depth + 1}`,\n      });\n    }\n  } else {\n    const chunk = doc.group && doc.group >= 1 ? doc.group : 1;\n    let inStep = 0;\n    for (const it of doc.items) {\n      const startNew = out.length === 0 ? true : it.join ? false : inStep >= chunk;\n      if (startNew) {\n        out.push({ enter: [it.id], effect: it.effect ?? doc.effect ?? 'fade', label: it.text });\n        inStep = 1;\n      } else {\n        out[out.length - 1]!.enter.push(it.id);\n        inStep++;\n      }\n    }\n  }\n\n  return out.map((s, i) => ({ index: i + 1, enter: s.enter, effect: s.effect, label: s.label }));\n}\n\n// \u2500\u2500\u2500 Layout \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction markerColor(depth: number, palette: ThemePalette): string {\n  return depth === 0 ? palette.primary : depth === 1 ? palette.secondary : palette.textMuted;\n}\nfunction markerRadius(depth: number, font: number): number {\n  return depth === 0\n    ? Math.max(3, rhu(font / 6))\n    : depth === 1\n      ? Math.max(2.5, rhu(font / 7))\n      : Math.max(2, rhu(font / 8));\n}\n\n/**\n * Build a filled arrowhead triangle path string pointing in `dir`.\n * `tx`/`ty` is the TIP (sharpest point); `al` is arrow length along direction, `aw` is half-width.\n */\nfunction arrowTriangle(\n  tx: number,\n  ty: number,\n  dir: 'right' | 'left' | 'down' | 'up',\n  al: number,\n  aw: number = Math.max(4, rhu(al * 0.55)),\n): string {\n  switch (dir) {\n    case 'right':\n      return `M ${rhu(tx - al)} ${rhu(ty - aw)} L ${tx} ${ty} L ${rhu(tx - al)} ${rhu(ty + aw)} Z`;\n    case 'left':\n      return `M ${rhu(tx + al)} ${rhu(ty - aw)} L ${tx} ${ty} L ${rhu(tx + al)} ${rhu(ty + aw)} Z`;\n    case 'down':\n      return `M ${rhu(tx - aw)} ${rhu(ty - al)} L ${tx} ${ty} L ${rhu(tx + aw)} ${rhu(ty - al)} Z`;\n    case 'up':\n      return `M ${rhu(tx - aw)} ${rhu(ty + al)} L ${tx} ${ty} L ${rhu(tx + aw)} ${rhu(ty + al)} Z`;\n  }\n}\n\nexport interface ItemTextLines {\n  title?: string | undefined;\n  subtitle?: string | undefined;\n  titleLines?: string[] | undefined;\n  subtitleLines?: string[] | undefined;\n  lines: string[];\n  maxLineWidth: number;\n}\n\nexport function getItemLineCount(info: ItemTextLines): number {\n  if (info.titleLines !== undefined) {\n    return info.titleLines.length + (info.subtitleLines?.length ?? 0);\n  }\n  return info.lines.length;\n}\n\nexport function measureItemLines(\n  rawText: string,\n  font: number,\n  smallFont: number,\n  maxAutoWrapWidth = 260,\n): ItemTextLines {\n  const sepIdx = rawText.indexOf('::');\n  if (sepIdx !== -1) {\n    const rawTitle = rawText.slice(0, sepIdx).trim();\n    const rawSubtitle = rawText.slice(sepIdx + 2).trim();\n\n    const titleNorm = rawTitle.replace(/<br\\s*\\/?>/gi, '\\n').replace(/\\\\n/g, '\\n');\n    const subNorm = rawSubtitle.replace(/<br\\s*\\/?>/gi, '\\n').replace(/\\\\n/g, '\\n');\n\n    const titleLines = titleNorm\n      .split(/\\r?\\n/)\n      .map((l) => l.trim())\n      .filter(Boolean);\n    const subtitleLines = subNorm\n      .split(/\\r?\\n/)\n      .map((l) => l.trim())\n      .filter(Boolean);\n\n    let titleMaxW = 0;\n    for (const t of titleLines) {\n      titleMaxW = Math.max(titleMaxW, measureText(t, font).width * 1.05);\n    }\n    let subMaxW = 0;\n    for (const s of subtitleLines) {\n      subMaxW = Math.max(subMaxW, measureText(s, smallFont).width);\n    }\n\n    const firstTitle = titleLines[0];\n    const firstSub = subtitleLines.length > 0 ? subtitleLines.join(' ') : undefined;\n\n    return {\n      title: firstTitle,\n      subtitle: firstSub,\n      titleLines: titleLines.length > 0 ? titleLines : undefined,\n      subtitleLines: subtitleLines.length > 0 ? subtitleLines : undefined,\n      lines: [...titleLines, ...subtitleLines],\n      maxLineWidth: Math.max(titleMaxW, subMaxW),\n    };\n  }\n\n  const normalized = rawText.replace(/<br\\s*\\/?>/gi, '\\n').replace(/\\\\n/g, '\\n');\n  const rawLines = normalized\n    .split(/\\r?\\n/)\n    .map((l) => l.trim())\n    .filter(Boolean);\n\n  const lines: string[] = [];\n  for (const r of rawLines) {\n    if (measureText(r, font).width > maxAutoWrapWidth) {\n      const wrapped = wrapText(r, font, maxAutoWrapWidth, 6);\n      lines.push(...wrapped.lines);\n    } else {\n      lines.push(r);\n    }\n  }\n\n  const finalLines = lines.length > 0 ? lines : [rawText];\n  const maxLineWidth = finalLines.reduce((m, l) => Math.max(m, measureText(l, font).width), 0);\n\n  return {\n    lines: finalLines,\n    maxLineWidth,\n  };\n}\n\nexport function renderItemText(\n  p: ReturnType<typeof pen>,\n  itemInfo: ItemTextLines,\n  x: number,\n  y: number,\n  w: number,\n  h: number,\n  font: number,\n  smallFont: number,\n  textColor: string,\n  mutedColor: string,\n  align: 'start' | 'middle' = 'start',\n  paddingLeft = 0,\n  defaultBold = false,\n): SceneElement[] {\n  const elements: SceneElement[] = [];\n\n  if (itemInfo.titleLines !== undefined) {\n    const titleLines = itemInfo.titleLines;\n    const subLines = itemInfo.subtitleLines ?? [];\n    const titleLH = font * 1.25;\n    const subLH = smallFont * 1.25;\n    const totalH = titleLines.length * titleLH + subLines.length * subLH;\n    const startY = y + (h - totalH) / 2 + font * 0.85;\n\n    const titleX = align === 'middle' ? rhu(x + w / 2) : rhu(x + paddingLeft);\n    const subX = titleX;\n\n    let curY = startY;\n    for (let ti = 0; ti < titleLines.length; ti++) {\n      elements.push(\n        p.text(titleLines[ti]!, titleX, rhu(curY), font, textColor, {\n          weight: 'bold',\n          anchor: align,\n        }),\n      );\n      curY += titleLH;\n    }\n\n    for (let si = 0; si < subLines.length; si++) {\n      elements.push(\n        p.text(subLines[si]!, subX, rhu(curY), smallFont, mutedColor, { anchor: align }),\n      );\n      curY += subLH;\n    }\n\n    return elements;\n  }\n\n  const lines = itemInfo.lines;\n  const count = lines.length;\n  const lineH = font * 1.25;\n\n  if (count === 1) {\n    const textY = rhu(y + h / 2 + font * 0.34);\n    const textX = align === 'middle' ? rhu(x + w / 2) : rhu(x + paddingLeft);\n    elements.push(\n      p.text(lines[0]!, textX, textY, font, textColor, {\n        ...(defaultBold ? { weight: 'bold' } : {}),\n        anchor: align,\n      }),\n    );\n    return elements;\n  }\n\n  const startY = y + (h - (count - 1) * lineH) / 2 + font * 0.34;\n  const textX = align === 'middle' ? rhu(x + w / 2) : rhu(x + paddingLeft);\n\n  for (let li = 0; li < count; li++) {\n    const lineY = rhu(startY + li * lineH);\n    elements.push(\n      p.text(lines[li]!, textX, lineY, font, textColor, {\n        ...(defaultBold ? { weight: 'bold' } : {}),\n        anchor: align,\n      }),\n    );\n  }\n\n  return elements;\n}\n\nfunction measureTaperedBands(items: ListItem[], font: number, smallFont: number, reversed: boolean) {\n  const count = Math.max(items.length, 1);\n  const padding = rhu(font * 0.8);\n  const rawInfos = items.map(item => measureItemLines(item.text, font, smallFont, Infinity));\n  const initialWidth = Math.max(font * 14, ...rawInfos.map(info => Math.min(info.maxLineWidth, 260) * 1.5));\n  const narrowRatios = items.map((_item, index) => count === 1 ? 1\n    : 0.28 + 0.72 * (reversed ? count - index - 1 : index) / count);\n  const itemInfos = rawInfos.map((info, index): ItemTextLines => {\n    const available = Math.max(font * 6, initialWidth * narrowRatios[index]! - 2 * padding);\n    const wrap = (lines: string[], size: number) => lines.flatMap(line => {\n      const width = Math.max(available, ...line.split(/\\s+/).map(word => measureText(word, size).width));\n      return wrapText(line, size, width, Math.max(line.length, 1)).lines;\n    });\n    const titleLines = info.titleLines ? wrap(info.titleLines, font) : undefined;\n    const subtitleLines = info.subtitleLines ? wrap(info.subtitleLines, smallFont) : undefined;\n    const lines = titleLines ? [...titleLines, ...(subtitleLines ?? [])] : wrap(info.lines, font);\n    const maxLineWidth = titleLines\n      ? Math.max(0, ...titleLines.map(line => measureText(line, font).width * 1.05),\n        ...(subtitleLines ?? []).map(line => measureText(line, smallFont).width))\n      : Math.max(0, ...lines.map(line => measureText(line, font).width));\n    return { ...info, titleLines, subtitleLines, lines, maxLineWidth };\n  });\n  const maxLines = Math.max(1, ...itemInfos.map(getItemLineCount));\n  const bandH = maxLines > 1 ? rhu(maxLines * font * 1.3 + font * 1.4) : rhu(font * 2.8);\n  const baseW = Math.ceil(Math.max(initialWidth, ...itemInfos.map((info, index) =>\n    (info.maxLineWidth * 1.1 + 2 * padding + 2) / narrowRatios[index]!)));\n  return { itemInfos, bandH, baseW };\n}\n\nexport function layoutList(doc: ListDoc, theme: ResolvedTheme): LayoutResult {\n  const { palette, typography, spacing } = theme;\n  const p = pen(theme);\n  const margin = spacing.diagramMargin;\n  const font = typography.baseFontSize;\n  const smallFont = typography.smallFontSize;\n  const indentPx = rhu(font * 1.6);\n  const titleH = doc.title ? typography.titleFontSize + 16 : 0;\n  const top = margin + titleH;\n  const n = Math.max(doc.items.length, 1);\n\n  const elements: SceneElement[] = [];\n  const anchors: Record<\n    string,\n    { bounds: { x: number; y: number; width: number; height: number } }\n  > = {};\n  let contentRight = 0;\n  let height: number;\n\n  if (doc.style === 'block' || doc.style === 'box') {\n    const pad = rhu(font * 0.8);\n    const gap = rhu(font * 0.6);\n    const barW = doc.style === 'box' ? Math.max(3, rhu(font * 0.35)) : 0;\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    const itemHeights = itemInfos.map((info) => {\n      const lineCount = getItemLineCount(info);\n      return lineCount > 1 ? rhu(lineCount * (font * 1.25) + 2 * pad) : rhu(font * 2.2);\n    });\n\n    // First pass: uniform right edge so blocks/boxes align.\n    let maxRight = 0;\n    doc.items.forEach((it, i) => {\n      const x = margin + it.depth * indentPx;\n      const tw = itemInfos[i]!.maxLineWidth;\n      maxRight = Math.max(maxRight, x + barW + pad + tw + pad);\n    });\n    contentRight = maxRight;\n\n    let curY = top;\n    doc.items.forEach((it, i) => {\n      const y = curY;\n      const itemH = itemHeights[i]!;\n      const x = margin + it.depth * indentPx;\n      const w = rhu(contentRight - x);\n      const info = itemInfos[i]!;\n\n      const children: SceneElement[] = [\n        p.rect({ x, y, width: w, height: itemH }, palette.surface, palette.border, 1, {\n          rx: doc.style === 'block' ? 6 : 4,\n        }),\n      ];\n      if (doc.style === 'box') {\n        const c = markerColor(it.depth, palette);\n        children.push(p.rect({ x, y, width: barW, height: itemH }, c, c, 0, { rx: 2 }));\n      }\n      children.push(\n        ...renderItemText(\n          p,\n          info,\n          x,\n          y,\n          w,\n          itemH,\n          font,\n          smallFont,\n          palette.text,\n          palette.textMuted,\n          'start',\n          barW + pad,\n        ),\n      );\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x, y, width: w, height: itemH } };\n      curY += itemH + gap;\n    });\n\n    height = rhu(curY - gap + margin);\n  } else if (doc.style === 'tree') {\n    // Top-down org-chart layout of the nested list (a forest of depth-0 roots).\n    const pad = rhu(font * 0.8);\n    const hGap = rhu(font * 1.2);\n    const vGap = rhu(font * 1.8);\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    let maxTextW = 0;\n    let maxLines = 1;\n    itemInfos.forEach((info) => {\n      maxTextW = Math.max(maxTextW, info.maxLineWidth);\n      const lc = getItemLineCount(info);\n      maxLines = Math.max(maxLines, lc);\n    });\n    const nodeH = maxLines > 1 ? rhu(maxLines * (font * 1.25) + 2 * pad) : rhu(font * 2.2);\n    const nodeW = rhu(maxTextW + 2 * pad);\n    const colStep = nodeW + hGap;\n\n    // Derive parent/child structure from the depth ordering.\n    const parentOf = new Array<number>(doc.items.length).fill(-1);\n    const childrenOf = new Map<number, number[]>();\n    const ancestor: number[] = [];\n    doc.items.forEach((it, i) => {\n      ancestor.length = it.depth;\n      const parent = it.depth === 0 ? -1 : ancestor[it.depth - 1]!;\n      parentOf[i] = parent;\n      const arr = childrenOf.get(parent) ?? [];\n      arr.push(i);\n      childrenOf.set(parent, arr);\n      ancestor[it.depth] = i;\n    });\n\n    // Assign columns post-order: leaves take sequential slots, parents centre.\n    const col = new Array<number>(doc.items.length).fill(0);\n    let nextCol = 0;\n    const assign = (i: number): void => {\n      const kids = childrenOf.get(i) ?? [];\n      if (kids.length === 0) {\n        col[i] = nextCol;\n        nextCol += 1;\n        return;\n      }\n      kids.forEach(assign);\n      col[i] = (col[kids[0]!]! + col[kids[kids.length - 1]!]!) / 2;\n    };\n    (childrenOf.get(-1) ?? []).forEach(assign);\n\n    const xOf = (i: number) => rhu(margin + col[i]! * colStep);\n    const yOf = (i: number) => rhu(top + doc.items[i]!.depth * (nodeH + vGap));\n\n    let maxDepth = 0;\n    doc.items.forEach((it, i) => {\n      const x = xOf(i);\n      const y = yOf(i);\n      const cx = rhu(x + nodeW / 2);\n      contentRight = Math.max(contentRight, x + nodeW);\n      maxDepth = Math.max(maxDepth, it.depth);\n\n      const children: SceneElement[] = [];\n      // Connector to parent lives in the CHILD group so it reveals together.\n      if (parentOf[i]! >= 0) {\n        const pi = parentOf[i]!;\n        const px = rhu(xOf(pi) + nodeW / 2);\n        const py = rhu(yOf(pi) + nodeH);\n        const midY = rhu((py + y) / 2);\n        const d = `M ${px} ${py} L ${px} ${midY} L ${cx} ${midY} L ${cx} ${y}`;\n        children.push(p.path(d, palette.border, 1.5));\n      }\n      const stroke = it.depth === 0 ? palette.primary : palette.border;\n      children.push(\n        p.rect(\n          { x, y, width: nodeW, height: nodeH },\n          palette.surface,\n          stroke,\n          it.depth === 0 ? 2 : 1,\n          { rx: 6 },\n        ),\n      );\n      children.push(\n        ...renderItemText(\n          p,\n          itemInfos[i]!,\n          x,\n          y,\n          nodeW,\n          nodeH,\n          font,\n          smallFont,\n          palette.text,\n          palette.textMuted,\n          'middle',\n        ),\n      );\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x, y, width: nodeW, height: nodeH } };\n    });\n\n    height = rhu(top + maxDepth * (nodeH + vGap) + nodeH + margin);\n  } else if (doc.style === 'chevron') {\n    // Horizontal left\u2192right interlocking arrow blocks.\n    const padX = rhu(font * 1.0);\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    let maxTextW = 0;\n    let maxLines = 1;\n    itemInfos.forEach((info) => {\n      maxTextW = Math.max(maxTextW, info.maxLineWidth);\n      const lc = getItemLineCount(info);\n      maxLines = Math.max(maxLines, lc);\n    });\n    const boxH = maxLines > 1 ? rhu(maxLines * (font * 1.3) + font * 1.4) : rhu(font * 2.8);\n    const notch = rhu(boxH * 0.3);\n    const boxW = rhu(maxTextW + 2 * padX + 2 * notch);\n    const stepX = rhu(boxW - notch);\n    const y = top;\n    const cy = rhu(y + boxH / 2);\n    const yb = rhu(y + boxH);\n\n    doc.items.forEach((it, i) => {\n      const x = rhu(margin + i * stepX);\n      const fill = theme.name === 'default' || i % 2 === 0 ? palette.primary : palette.secondary;\n      const k = notch;\n      const tipR = rhu(x + boxW);\n      const innerR = rhu(x + boxW - k);\n      const d =\n        i === 0\n          ? `M ${x} ${y} L ${innerR} ${y} L ${tipR} ${cy} L ${innerR} ${yb} L ${x} ${yb} Z`\n          : `M ${x} ${y} L ${innerR} ${y} L ${tipR} ${cy} L ${innerR} ${yb} L ${x} ${yb} L ${rhu(x + k)} ${cy} Z`;\n      const txtColor = readableText(fill, theme);\n      const mutedTxtColor = txtColor === '#ffffff' ? 'rgba(255, 255, 255, 0.8)' : palette.textMuted;\n      const children: SceneElement[] = [\n        p.path(d, fill, 0, { fill }),\n        ...renderItemText(\n          p,\n          itemInfos[i]!,\n          rhu(x + k / 2),\n          y,\n          rhu(boxW - k),\n          boxH,\n          font,\n          smallFont,\n          txtColor,\n          mutedTxtColor,\n          'middle',\n        ),\n      ];\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x, y, width: boxW, height: boxH } };\n      contentRight = Math.max(contentRight, x + boxW);\n    });\n\n    height = rhu(top + boxH + margin);\n  } else if (doc.style === 'process') {\n    const flow = doc.flow ?? 'ltr';\n    const padX = rhu(font * 1.0);\n    const arrowGap = rhu(font * 1.8);\n    const al = Math.max(8, rhu(font * 0.65));\n    const aw = Math.max(4.5, rhu(font * 0.35));\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    let maxTextW = 0;\n    let maxLines = 1;\n    itemInfos.forEach((info) => {\n      maxTextW = Math.max(maxTextW, info.maxLineWidth);\n      const lc = getItemLineCount(info);\n      maxLines = Math.max(maxLines, lc);\n    });\n    const boxH = maxLines > 1 ? rhu(maxLines * (font * 1.3) + font * 1.4) : rhu(font * 2.8);\n    const boxW = rhu(maxTextW + 2 * padX);\n\n    if (flow === 'ltr') {\n      const stepX = rhu(boxW + arrowGap);\n      const y = top;\n      const cy = rhu(y + boxH / 2);\n\n      doc.items.forEach((it, i) => {\n        const x = rhu(margin + i * stepX);\n        const children: SceneElement[] = [];\n        if (i > 0) {\n          const ax1 = rhu(x);\n          const ax0 = rhu(x - arrowGap);\n          children.push(p.path(`M ${ax0} ${cy} L ${rhu(ax1 - al)} ${cy}`, palette.textMuted, 2));\n          children.push(\n            p.path(arrowTriangle(ax1, cy, 'right', al, aw), palette.textMuted, 0, {\n              fill: palette.textMuted,\n            }),\n          );\n        }\n        children.push(\n          p.rect({ x, y, width: boxW, height: boxH }, palette.surface, palette.primary, 1.5, {\n            rx: 6,\n          }),\n        );\n        children.push(\n          ...renderItemText(\n            p,\n            itemInfos[i]!,\n            x,\n            y,\n            boxW,\n            boxH,\n            font,\n            smallFont,\n            palette.text,\n            palette.textMuted,\n            'middle',\n          ),\n        );\n        elements.push(p.group(children, { id: it.id }));\n        anchors[it.id] = { bounds: { x, y, width: boxW, height: boxH } };\n        contentRight = Math.max(contentRight, x + boxW);\n      });\n\n      height = rhu(top + boxH + margin);\n    } else {\n      // Grid engine: ttb / snake / snake-v.\n      const wrap = doc.wrap ?? Math.ceil(Math.sqrt(n));\n      const turn = doc.turn ?? 'corridor';\n      const elbow = rhu(arrowGap * 0.75);\n\n      const hasTopTurn = flow === 'snake-v' && turn === 'corridor' && n > 2 * wrap;\n      const hasBottomTurn = flow === 'snake-v' && turn === 'corridor' && n > wrap;\n      const topExtra = hasTopTurn ? rhu(elbow + font * 0.3) : 0;\n      const processTop = top + topExtra;\n\n      const cellX = (col: number) => rhu(margin + col * (boxW + arrowGap));\n      const cellY = (row: number) => rhu(processTop + row * (boxH + arrowGap));\n\n      let maxRow = 0;\n\n      doc.items.forEach((it, i) => {\n        const { row, col } = cellForIndex(i, flow, wrap);\n        maxRow = Math.max(maxRow, row);\n        const x = cellX(col);\n        const y = cellY(row);\n        const cx = rhu(x + boxW / 2);\n        const cy = rhu(y + boxH / 2);\n        const children: SceneElement[] = [];\n\n        if (i > 0) {\n          const prev = cellForIndex(i - 1, flow, wrap);\n          const prevX = cellX(prev.col);\n          const prevY = cellY(prev.row);\n          const prevCX = rhu(prevX + boxW / 2);\n          const prevCY = rhu(prevY + boxH / 2);\n\n          const isTurn = flow === 'snake' ? prev.row !== row : prev.col !== col;\n\n          if (!isTurn) {\n            if (flow === 'ttb') {\n              const ty = y;\n              children.push(\n                p.path(\n                  `M ${cx} ${rhu(prevY + boxH)} L ${cx} ${rhu(ty - al)}`,\n                  palette.textMuted,\n                  2,\n                ),\n              );\n              children.push(\n                p.path(arrowTriangle(cx, ty, 'down', al, aw), palette.textMuted, 0, {\n                  fill: palette.textMuted,\n                }),\n              );\n            } else if (flow === 'snake') {\n              if (row % 2 === 0) {\n                children.push(\n                  p.path(\n                    `M ${rhu(prevX + boxW)} ${cy} L ${rhu(x - al)} ${cy}`,\n                    palette.textMuted,\n                    2,\n                  ),\n                );\n                children.push(\n                  p.path(arrowTriangle(x, cy, 'right', al, aw), palette.textMuted, 0, {\n                    fill: palette.textMuted,\n                  }),\n                );\n              } else {\n                const tipX = rhu(x + boxW);\n                children.push(\n                  p.path(`M ${prevX} ${cy} L ${rhu(tipX + al)} ${cy}`, palette.textMuted, 2),\n                );\n                children.push(\n                  p.path(arrowTriangle(tipX, cy, 'left', al, aw), palette.textMuted, 0, {\n                    fill: palette.textMuted,\n                  }),\n                );\n              }\n            } else {\n              if (col % 2 === 0) {\n                const ty = y;\n                children.push(\n                  p.path(\n                    `M ${cx} ${rhu(prevY + boxH)} L ${cx} ${rhu(ty - al)}`,\n                    palette.textMuted,\n                    2,\n                  ),\n                );\n                children.push(\n                  p.path(arrowTriangle(cx, ty, 'down', al, aw), palette.textMuted, 0, {\n                    fill: palette.textMuted,\n                  }),\n                );\n              } else {\n                const tipY = rhu(y + boxH);\n                children.push(\n                  p.path(`M ${cx} ${prevY} L ${cx} ${rhu(tipY + al)}`, palette.textMuted, 2),\n                );\n                children.push(\n                  p.path(arrowTriangle(cx, tipY, 'up', al, aw), palette.textMuted, 0, {\n                    fill: palette.textMuted,\n                  }),\n                );\n              }\n            }\n          } else if (flow === 'snake') {\n            if (turn === 'direct') {\n              children.push(\n                p.path(\n                  `M ${prevCX} ${rhu(prevY + boxH)} L ${prevCX} ${rhu(y - al)}`,\n                  palette.textMuted,\n                  2,\n                ),\n              );\n              children.push(\n                p.path(arrowTriangle(prevCX, y, 'down', al, aw), palette.textMuted, 0, {\n                  fill: palette.textMuted,\n                }),\n              );\n            } else if (prev.row % 2 === 0) {\n              const rx = rhu(prevX + boxW);\n              children.push(\n                p.path(\n                  `M ${rx} ${prevCY} L ${rhu(rx + elbow)} ${prevCY} L ${rhu(rx + elbow)} ${cy} L ${rhu(rx + al)} ${cy}`,\n                  palette.textMuted,\n                  2,\n                ),\n              );\n              children.push(\n                p.path(arrowTriangle(rx, cy, 'left', al, aw), palette.textMuted, 0, {\n                  fill: palette.textMuted,\n                }),\n              );\n              contentRight = Math.max(contentRight, rhu(rx + elbow + margin));\n            } else {\n              const lx = prevX;\n              children.push(\n                p.path(\n                  `M ${lx} ${prevCY} L ${rhu(lx - elbow)} ${prevCY} L ${rhu(lx - elbow)} ${cy} L ${rhu(lx - al)} ${cy}`,\n                  palette.textMuted,\n                  2,\n                ),\n              );\n              children.push(\n                p.path(arrowTriangle(lx, cy, 'right', al, aw), palette.textMuted, 0, {\n                  fill: palette.textMuted,\n                }),\n              );\n            }\n          } else {\n            if (turn === 'direct') {\n              children.push(\n                p.path(`M ${rhu(prevX + boxW)} ${cy} L ${rhu(x - al)} ${cy}`, palette.textMuted, 2),\n              );\n              children.push(\n                p.path(arrowTriangle(x, cy, 'right', al, aw), palette.textMuted, 0, {\n                  fill: palette.textMuted,\n                }),\n              );\n            } else if (prev.col % 2 === 0) {\n              const by = rhu(prevY + boxH);\n              children.push(\n                p.path(\n                  `M ${prevCX} ${by} L ${prevCX} ${rhu(by + elbow)} L ${cx} ${rhu(by + elbow)} L ${cx} ${rhu(by + al)}`,\n                  palette.textMuted,\n                  2,\n                ),\n              );\n              children.push(\n                p.path(arrowTriangle(cx, by, 'up', al, aw), palette.textMuted, 0, {\n                  fill: palette.textMuted,\n                }),\n              );\n            } else {\n              const ty = prevY;\n              children.push(\n                p.path(\n                  `M ${prevCX} ${ty} L ${prevCX} ${rhu(ty - elbow)} L ${cx} ${rhu(ty - elbow)} L ${cx} ${rhu(ty - al)}`,\n                  palette.textMuted,\n                  2,\n                ),\n              );\n              children.push(\n                p.path(arrowTriangle(cx, ty, 'down', al, aw), palette.textMuted, 0, {\n                  fill: palette.textMuted,\n                }),\n              );\n            }\n          }\n        }\n\n        children.push(\n          p.rect({ x, y, width: boxW, height: boxH }, palette.surface, palette.primary, 1.5, {\n            rx: 6,\n          }),\n        );\n        children.push(\n          ...renderItemText(\n            p,\n            itemInfos[i]!,\n            x,\n            y,\n            boxW,\n            boxH,\n            font,\n            smallFont,\n            palette.text,\n            palette.textMuted,\n            'middle',\n          ),\n        );\n        elements.push(p.group(children, { id: it.id }));\n        anchors[it.id] = { bounds: { x, y, width: boxW, height: boxH } };\n        contentRight = Math.max(contentRight, x + boxW);\n      });\n\n      const bottomExtra = hasBottomTurn ? elbow : 0;\n      height = rhu(processTop + (maxRow + 1) * (boxH + arrowGap) - arrowGap + bottomExtra + margin);\n    }\n  } else if (doc.style === 'timeline') {\n    const dotR = Math.max(5, rhu(font * 0.5));\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    let maxTextW = 0;\n    let maxLines = 1;\n    itemInfos.forEach((info) => {\n      maxTextW = Math.max(maxTextW, info.maxLineWidth);\n      const lc = getItemLineCount(info);\n      maxLines = Math.max(maxLines, lc);\n    });\n    const lineH = font * 1.25;\n    const labelH = maxLines > 1 ? rhu(maxLines * lineH + font * 0.6) : rhu(font * 1.8);\n    const stepX = rhu(maxTextW + font * 2.4);\n    const axisY = rhu(top + labelH);\n\n    doc.items.forEach((it, i) => {\n      const cx = rhu(margin + stepX / 2 + i * stepX);\n      const children: SceneElement[] = [];\n      if (i > 0) {\n        const px = rhu(margin + stepX / 2 + (i - 1) * stepX);\n        children.push(p.path(`M ${px} ${axisY} L ${cx} ${axisY}`, palette.border, 2));\n      }\n      children.push(p.circle({ x: cx, y: axisY }, dotR, palette.primary, palette.background, 2));\n      const above = i % 2 === 0;\n      const ly = above\n        ? rhu(axisY - dotR - 8 - (maxLines > 1 ? (maxLines - 1) * lineH : 0))\n        : rhu(axisY + dotR + font + 4);\n      const info = itemInfos[i]!;\n\n      if (info.titleLines !== undefined) {\n        let curY = ly;\n        for (const tl of info.titleLines) {\n          children.push(\n            p.text(tl, cx, curY, font, palette.text, { weight: 'bold', anchor: 'middle' }),\n          );\n          curY = rhu(curY + lineH);\n        }\n        if (info.subtitleLines) {\n          for (const sl of info.subtitleLines) {\n            children.push(\n              p.text(sl, cx, curY, smallFont, palette.textMuted, {\n                anchor: 'middle',\n              }),\n            );\n            curY = rhu(curY + smallFont * 1.25);\n          }\n        }\n      } else if (info.lines.length > 1) {\n        info.lines.forEach((l, li) => {\n          children.push(\n            p.text(l, cx, rhu(ly + li * lineH), font, palette.text, { anchor: 'middle' }),\n          );\n        });\n      } else {\n        children.push(\n          p.text(info.lines[0] ?? it.text, cx, ly, font, palette.text, { anchor: 'middle' }),\n        );\n      }\n\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = {\n        bounds: {\n          x: rhu(cx - stepX / 2),\n          y: top,\n          width: stepX,\n          height: rhu(labelH * 2 + dotR * 2),\n        },\n      };\n      contentRight = Math.max(contentRight, cx + stepX / 2);\n    });\n\n    height = rhu(axisY + dotR + font + labelH + margin);\n  } else if (doc.style === 'pyramid') {\n    const { itemInfos, bandH, baseW } = measureTaperedBands(doc.items, font, smallFont, false);\n    const vGap = rhu(font * 0.4);\n    const apexW = rhu(baseW * 0.28);\n    const cxCenter = rhu(margin + baseW / 2);\n    const widthAt = (frac: number) => apexW + (baseW - apexW) * frac;\n\n    doc.items.forEach((it, i) => {\n      const y = top + i * (bandH + vGap);\n      const yTop = rhu(y);\n      const yBot = rhu(y + bandH);\n      const wTop = widthAt(n === 1 ? 1 : i / n);\n      const wBot = widthAt(n === 1 ? 1 : (i + 1) / n);\n      const tl = rhu(cxCenter - wTop / 2);\n      const tr = rhu(cxCenter + wTop / 2);\n      const bl = rhu(cxCenter - wBot / 2);\n      const br = rhu(cxCenter + wBot / 2);\n      const fill = theme.name === 'default' || i % 2 === 0 ? palette.primary : palette.secondary;\n      const d = `M ${tl} ${yTop} L ${tr} ${yTop} L ${br} ${yBot} L ${bl} ${yBot} Z`;\n      const txtColor = readableText(fill, theme);\n      const mutedTxtColor = txtColor === '#ffffff' ? 'rgba(255, 255, 255, 0.8)' : palette.textMuted;\n      const children: SceneElement[] = [\n        p.path(d, fill, 0, { fill }),\n        ...renderItemText(\n          p,\n          itemInfos[i]!,\n          tl,\n          yTop,\n          rhu(tr - tl),\n          bandH,\n          font,\n          smallFont,\n          txtColor,\n          mutedTxtColor,\n          'middle',\n        ),\n      ];\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x: bl, y: yTop, width: rhu(br - bl), height: bandH } };\n      contentRight = Math.max(contentRight, cxCenter + baseW / 2);\n    });\n\n    height = rhu(top + n * (bandH + vGap) - vGap + margin);\n  } else if (doc.style === 'columns') {\n    interface Col {\n      header: ListItem;\n      cells: ListItem[];\n    }\n    const cols: Col[] = [];\n    for (const it of doc.items) {\n      if (it.depth === 0 || cols.length === 0) cols.push({ header: it, cells: [] });\n      else cols[cols.length - 1]!.cells.push(it);\n    }\n    const itemInfos = new Map<string, ItemTextLines>();\n    doc.items.forEach((it) => {\n      itemInfos.set(it.id, measureItemLines(it.text, font, smallFont));\n    });\n\n    let maxHeaderLines = 1;\n    let maxCellLines = 1;\n    cols.forEach((c) => {\n      const hInfo = itemInfos.get(c.header.id)!;\n      const hCount = getItemLineCount(hInfo);\n      maxHeaderLines = Math.max(maxHeaderLines, hCount);\n      c.cells.forEach((ce) => {\n        const cInfo = itemInfos.get(ce.id)!;\n        const cCount = getItemLineCount(cInfo);\n        maxCellLines = Math.max(maxCellLines, cCount);\n      });\n    });\n\n    const headerH =\n      maxHeaderLines > 1 ? rhu(maxHeaderLines * (font * 1.3) + font * 1.0) : rhu(font * 2.4);\n    const cellH =\n      maxCellLines > 1 ? rhu(maxCellLines * (font * 1.25) + font * 0.7) : rhu(font * 2.0);\n    const gap = rhu(font * 0.5);\n    const colGap = rhu(font * 1.2);\n    const padX = rhu(font * 0.9);\n\n    let x = margin;\n    let maxCells = 0;\n    const colX: number[] = [];\n    const colW: number[] = [];\n    cols.forEach((c) => {\n      let w = itemInfos.get(c.header.id)!.maxLineWidth;\n      c.cells.forEach((ce) => {\n        w = Math.max(w, itemInfos.get(ce.id)!.maxLineWidth);\n      });\n      const cw = rhu(w + 2 * padX);\n      colX.push(rhu(x));\n      colW.push(cw);\n      x += cw + colGap;\n      maxCells = Math.max(maxCells, c.cells.length);\n    });\n    contentRight = rhu(x - colGap);\n\n    cols.forEach((c, ci) => {\n      const cx0 = colX[ci]!;\n      const cw = colW[ci]!;\n      const hInfo = itemInfos.get(c.header.id)!;\n      const hchildren: SceneElement[] = [\n        p.rect(\n          { x: cx0, y: top, width: cw, height: headerH },\n          palette.primary,\n          palette.primary,\n          0,\n          { rx: 6 },\n        ),\n        ...renderItemText(\n          p,\n          hInfo,\n          cx0,\n          top,\n          cw,\n          headerH,\n          font,\n          smallFont,\n          readableText(palette.primary, theme),\n          'rgba(255, 255, 255, 0.8)',\n          'middle',\n          0,\n          true,\n        ),\n      ];\n      elements.push(p.group(hchildren, { id: c.header.id }));\n      anchors[c.header.id] = { bounds: { x: cx0, y: top, width: cw, height: headerH } };\n\n      c.cells.forEach((ce, ri) => {\n        const cy0 = rhu(top + headerH + gap + ri * (cellH + gap));\n        const cInfo = itemInfos.get(ce.id)!;\n        const cch: SceneElement[] = [\n          p.rect({ x: cx0, y: cy0, width: cw, height: cellH }, palette.surface, palette.border, 1, {\n            rx: 4,\n          }),\n          ...renderItemText(\n            p,\n            cInfo,\n            cx0,\n            cy0,\n            cw,\n            cellH,\n            font,\n            smallFont,\n            palette.text,\n            palette.textMuted,\n            'middle',\n          ),\n        ];\n        elements.push(p.group(cch, { id: ce.id }));\n        anchors[ce.id] = { bounds: { x: cx0, y: cy0, width: cw, height: cellH } };\n      });\n    });\n\n    height = rhu(top + headerH + gap + maxCells * (cellH + gap) + margin);\n  } else if (doc.style === 'cycle') {\n    const pad = rhu(font * 0.9);\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    let maxTextW = 0;\n    let maxLines = 1;\n    itemInfos.forEach((info) => {\n      maxTextW = Math.max(maxTextW, info.maxLineWidth);\n      const lc = getItemLineCount(info);\n      maxLines = Math.max(maxLines, lc);\n    });\n    const nodeH = maxLines > 1 ? rhu(maxLines * (font * 1.25) + 2 * pad) : rhu(font * 2.2);\n    const nodeW = rhu(maxTextW + 2 * pad);\n    const chord = nodeW + rhu(font * 2.4);\n    const R = n > 1 ? rhu(Math.max(nodeH * 2.4, chord / (2 * Math.sin(Math.PI / n)))) : 0;\n    const cxC = rhu(margin + R + nodeW / 2);\n    const cyC = rhu(top + R + nodeH / 2);\n    const step = (2 * Math.PI) / Math.max(n, 1);\n    const gapAng = R > 0 ? Math.min(step * 0.3, (nodeW / 2 + pad) / R) : 0;\n\n    doc.items.forEach((it, i) => {\n      const a = -Math.PI / 2 + i * step;\n      const ncx = rhu(cxC + R * Math.cos(a));\n      const ncy = rhu(cyC + R * Math.sin(a));\n      const x = rhu(ncx - nodeW / 2);\n      const y = rhu(ncy - nodeH / 2);\n      const children: SceneElement[] = [];\n\n      if (n > 1) {\n        const a0 = a + gapAng;\n        const a1 = a + step - gapAng;\n        if (a1 > a0) {\n          const sx = rhu(cxC + R * Math.cos(a0));\n          const sy = rhu(cyC + R * Math.sin(a0));\n          const ex = rhu(cxC + R * Math.cos(a1));\n          const ey = rhu(cyC + R * Math.sin(a1));\n          children.push(p.path(`M ${sx} ${sy} A ${R} ${R} 0 0 1 ${ex} ${ey}`, palette.primary, 2));\n          const pa = a1 - 0.12;\n          const px = cxC + R * Math.cos(pa);\n          const py = cyC + R * Math.sin(pa);\n          const dx = ex - px,\n            dy = ey - py;\n          const len = Math.hypot(dx, dy) || 1;\n          const ux = dx / len,\n            uy = dy / len;\n          const ah = Math.max(6, rhu(font * 0.6));\n          const bx = ex - ux * ah,\n            by = ey - uy * ah;\n          const tri = `M ${rhu(bx - uy * ah * 0.6)} ${rhu(by + ux * ah * 0.6)} L ${ex} ${ey} L ${rhu(bx + uy * ah * 0.6)} ${rhu(by - ux * ah * 0.6)} Z`;\n          children.push(p.path(tri, palette.primary, 0, { fill: palette.primary }));\n        }\n      }\n\n      children.push(\n        p.rect({ x, y, width: nodeW, height: nodeH }, palette.surface, palette.primary, 1.5, {\n          rx: 8,\n        }),\n      );\n      children.push(\n        ...renderItemText(\n          p,\n          itemInfos[i]!,\n          x,\n          y,\n          nodeW,\n          nodeH,\n          font,\n          smallFont,\n          palette.text,\n          palette.textMuted,\n          'middle',\n        ),\n      );\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x, y, width: nodeW, height: nodeH } };\n      contentRight = Math.max(contentRight, x + nodeW);\n    });\n\n    height = rhu(top + 2 * R + nodeH + margin);\n  } else if (doc.style === 'matrix') {\n    const quad = [palette.primary, palette.secondary, palette.success, palette.warning];\n    const cols = 2;\n    const rows = Math.ceil(n / cols);\n    const pad = rhu(font * 0.9);\n    const gap = rhu(font * 0.5);\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    let maxTextW = 0;\n    let maxLines = 1;\n    itemInfos.forEach((info) => {\n      maxTextW = Math.max(maxTextW, info.maxLineWidth);\n      const lc = getItemLineCount(info);\n      maxLines = Math.max(maxLines, lc);\n    });\n    const tileW = rhu(maxTextW + 2 * pad);\n    const tileH = maxLines > 1 ? rhu(maxLines * (font * 1.3) + font * 1.8) : rhu(font * 3.2);\n\n    doc.items.forEach((it, i) => {\n      const r = Math.floor(i / cols);\n      const c = i % cols;\n      const x = rhu(margin + c * (tileW + gap));\n      const y = rhu(top + r * (tileH + gap));\n      const fill = quad[i % quad.length]!;\n      const txtColor = readableText(fill, theme);\n      const mutedTxtColor = txtColor === '#ffffff' ? 'rgba(255, 255, 255, 0.8)' : palette.textMuted;\n      const children: SceneElement[] = [\n        p.rect({ x, y, width: tileW, height: tileH }, fill, fill, 0, { rx: 6 }),\n        ...renderItemText(\n          p,\n          itemInfos[i]!,\n          x,\n          y,\n          tileW,\n          tileH,\n          font,\n          smallFont,\n          txtColor,\n          mutedTxtColor,\n          'middle',\n          0,\n          true,\n        ),\n      ];\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x, y, width: tileW, height: tileH } };\n      contentRight = Math.max(contentRight, x + tileW);\n    });\n\n    height = rhu(top + rows * (tileH + gap) - gap + margin);\n  } else if (doc.style === 'funnel') {\n    const { itemInfos, bandH, baseW } = measureTaperedBands(doc.items, font, smallFont, true);\n    const vGap = rhu(font * 0.4);\n    const apexW = rhu(baseW * 0.28);\n    const cxCenter = rhu(margin + baseW / 2);\n    const widthAt = (frac: number) => apexW + (baseW - apexW) * frac;\n\n    doc.items.forEach((it, i) => {\n      const y = top + i * (bandH + vGap);\n      const yTop = rhu(y);\n      const yBot = rhu(y + bandH);\n      const wTop = widthAt(n === 1 ? 1 : (n - i) / n);\n      const wBot = widthAt(n === 1 ? 1 : (n - i - 1) / n);\n      const tl = rhu(cxCenter - wTop / 2);\n      const tr = rhu(cxCenter + wTop / 2);\n      const bl = rhu(cxCenter - wBot / 2);\n      const br = rhu(cxCenter + wBot / 2);\n      const fill = theme.name === 'default' || i % 2 === 0 ? palette.primary : palette.secondary;\n      const d = `M ${tl} ${yTop} L ${tr} ${yTop} L ${br} ${yBot} L ${bl} ${yBot} Z`;\n      const txtColor = readableText(fill, theme);\n      const mutedTxtColor = txtColor === '#ffffff' ? 'rgba(255, 255, 255, 0.8)' : palette.textMuted;\n      const children: SceneElement[] = [\n        p.path(d, fill, 0, { fill }),\n        ...renderItemText(\n          p,\n          itemInfos[i]!,\n          bl,\n          yTop,\n          rhu(br - bl),\n          bandH,\n          font,\n          smallFont,\n          txtColor,\n          mutedTxtColor,\n          'middle',\n        ),\n      ];\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x: tl, y: yTop, width: rhu(tr - tl), height: bandH } };\n      contentRight = Math.max(contentRight, cxCenter + baseW / 2);\n    });\n\n    height = rhu(top + n * (bandH + vGap) - vGap + margin);\n  } else if (doc.style === 'stepup') {\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    let maxTextW = 0;\n    let maxLines = 1;\n    itemInfos.forEach((info) => {\n      maxTextW = Math.max(maxTextW, info.maxLineWidth);\n      const lc = getItemLineCount(info);\n      maxLines = Math.max(maxLines, lc);\n    });\n    const boxH = maxLines > 1 ? rhu(maxLines * (font * 1.3) + font * 1.2) : rhu(font * 2.4);\n    const gapX = rhu(font * 0.8);\n    const stepUp = rhu(boxH * 0.7);\n    const boxW = rhu(maxTextW + 2 * rhu(font * 0.9));\n    const topmost = top;\n    const yOf = (i: number) => rhu(topmost + (n - 1 - i) * stepUp);\n    const xOf = (i: number) => rhu(margin + i * (boxW + gapX));\n\n    doc.items.forEach((it, i) => {\n      const x = xOf(i);\n      const y = yOf(i);\n      const children: SceneElement[] = [];\n      if (i > 0) {\n        const px = rhu(xOf(i - 1) + boxW);\n        const py = rhu(yOf(i - 1) + boxH / 2);\n        const cy = rhu(y + boxH / 2);\n        children.push(\n          p.path(\n            `M ${px} ${py} L ${rhu((px + x) / 2)} ${py} L ${rhu((px + x) / 2)} ${cy} L ${x} ${cy}`,\n            palette.border,\n            1.5,\n          ),\n        );\n      }\n      children.push(\n        p.rect({ x, y, width: boxW, height: boxH }, palette.surface, palette.primary, 1.5, {\n          rx: 6,\n        }),\n      );\n      children.push(\n        ...renderItemText(\n          p,\n          itemInfos[i]!,\n          x,\n          y,\n          boxW,\n          boxH,\n          font,\n          smallFont,\n          palette.text,\n          palette.textMuted,\n          'middle',\n        ),\n      );\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x, y, width: boxW, height: boxH } };\n      contentRight = Math.max(contentRight, x + boxW);\n    });\n\n    height = rhu(top + (n - 1) * stepUp + boxH + margin);\n  } else if (doc.style === 'venn') {\n    const tint = [\n      palette.primary,\n      palette.secondary,\n      palette.success,\n      palette.warning,\n      palette.error,\n    ];\n    const itemInfos = doc.items.map((it) => measureItemLines(it.text, font, smallFont));\n    let maxTextW = 0;\n    itemInfos.forEach((it) => {\n      maxTextW = Math.max(maxTextW, it.maxLineWidth);\n    });\n    const r = rhu(Math.max(font * 3.4, maxTextW / 2 + font));\n    const d = n > 1 ? rhu(r * 0.72) : 0;\n    const start = n === 2 ? Math.PI : -Math.PI / 2;\n    const cxC = rhu(margin + d + r);\n    const cyC = rhu(top + d + r);\n    const labelR = d + rhu(r * 0.42);\n\n    doc.items.forEach((it, i) => {\n      const ang = start + (i * 2 * Math.PI) / n;\n      const cx = rhu(cxC + d * Math.cos(ang));\n      const cy = rhu(cyC + d * Math.sin(ang));\n      const lx = n === 1 ? cxC : rhu(cxC + labelR * Math.cos(ang));\n      const ly = n === 1 ? cyC : rhu(cyC + labelR * Math.sin(ang));\n      const fill = tint[i % tint.length]!;\n      const info = itemInfos[i]!;\n      const children: SceneElement[] = [\n        p.circle({ x: cx, y: cy }, r, fill, fill, 0, { opacity: 0.5 }),\n      ];\n\n      if (info.titleLines !== undefined) {\n        const titleLH = font * 1.25;\n        const subLH = smallFont * 1.25;\n        const totalLines = info.titleLines.length + (info.subtitleLines?.length ?? 0);\n        let curY = rhu(ly + font * 0.34 - ((totalLines - 1) * titleLH) / 2);\n        for (const tl of info.titleLines) {\n          children.push(\n            p.text(tl, lx, curY, font, palette.text, {\n              weight: 'bold',\n              anchor: 'middle',\n            }),\n          );\n          curY = rhu(curY + titleLH);\n        }\n        if (info.subtitleLines) {\n          for (const sl of info.subtitleLines) {\n            children.push(\n              p.text(sl, lx, curY, smallFont, palette.textMuted, {\n                anchor: 'middle',\n              }),\n            );\n            curY = rhu(curY + subLH);\n          }\n        }\n      } else if (info.lines.length > 1) {\n        const lineH = font * 1.2;\n        const startY = rhu(ly + font * 0.34 - ((info.lines.length - 1) * lineH) / 2);\n        info.lines.forEach((l, li) => {\n          children.push(\n            p.text(l, lx, rhu(startY + li * lineH), font, palette.text, {\n              weight: 'bold',\n              anchor: 'middle',\n            }),\n          );\n        });\n      } else {\n        children.push(\n          p.text(info.lines[0] ?? it.text, lx, rhu(ly + font * 0.34), font, palette.text, {\n            weight: 'bold',\n            anchor: 'middle',\n          }),\n        );\n      }\n\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = {\n        bounds: { x: rhu(cx - r), y: rhu(cy - r), width: rhu(2 * r), height: rhu(2 * r) },\n      };\n      contentRight = Math.max(contentRight, cx + r);\n    });\n\n    height = rhu(top + 2 * (d + r) + margin);\n  } else {\n    let curY = top;\n\n    doc.items.forEach((it, i) => {\n      const info = measureItemLines(it.text, font, smallFont);\n      const lineCount = getItemLineCount(info);\n      const rowH = lineCount > 1 ? rhu(lineCount * (font * 1.25) + font * 0.4) : rhu(font * 1.9);\n      const rowY = curY;\n      const cy = lineCount > 1 ? rowY + font * 0.85 : rowY + rowH / 2;\n      const x = margin + it.depth * indentPx;\n      const children: SceneElement[] = [];\n      let textX: number;\n\n      if (doc.style === 'numbered') {\n        const label = `${it.numberLabel}.`;\n        const numBaseline = lineCount > 1 ? rhu(rowY + font * 0.85) : rhu(cy + font * 0.34);\n        children.push(\n          p.text(label, x, numBaseline, font, palette.primary, { weight: 'bold', anchor: 'start' }),\n        );\n        textX = x + measureText(label, font).width + 10;\n      } else {\n        const r = markerRadius(it.depth, font);\n        const c = markerColor(it.depth, palette);\n        children.push(p.circle({ x: x + r, y: rhu(cy) }, r, c, c, 0));\n        textX = x + r * 2 + 12;\n      }\n\n      if (info.titleLines !== undefined) {\n        const titleLH = font * 1.25;\n        const subLH = smallFont * 1.25;\n        let curTextY = rhu(rowY + font * 0.85);\n\n        for (let ti = 0; ti < info.titleLines.length; ti++) {\n          children.push(\n            p.text(info.titleLines[ti]!, textX, curTextY, font, palette.text, {\n              weight: 'bold',\n              anchor: 'start',\n            }),\n          );\n          curTextY += titleLH;\n        }\n\n        if (info.subtitleLines) {\n          for (let si = 0; si < info.subtitleLines.length; si++) {\n            children.push(\n              p.text(info.subtitleLines[si]!, textX, curTextY, smallFont, palette.textMuted, {\n                anchor: 'start',\n              }),\n            );\n            curTextY += subLH;\n          }\n        }\n      } else if (info.lines.length > 1) {\n        const lineH = font * 1.25;\n        info.lines.forEach((line, li) => {\n          const ly = rhu(rowY + font * 0.85 + li * lineH);\n          children.push(p.text(line, textX, ly, font, palette.text, { anchor: 'start' }));\n        });\n      } else {\n        const textBaseline = rhu(rowY + rowH / 2 + font * 0.34);\n        children.push(\n          p.text(info.lines[0] ?? it.text, textX, textBaseline, font, palette.text, {\n            anchor: 'start',\n          }),\n        );\n      }\n\n      const tw = info.maxLineWidth;\n      contentRight = Math.max(contentRight, textX + tw);\n      elements.push(p.group(children, { id: it.id }));\n      anchors[it.id] = { bounds: { x, y: rowY, width: rhu(textX - x + tw), height: rowH } };\n      curY += rowH;\n    });\n\n    height = rhu(curY + margin);\n  }\n\n  if (doc.title) {\n    elements.unshift(\n      p.text(\n        doc.title,\n        margin,\n        rhu(margin + typography.titleFontSize),\n        typography.titleFontSize,\n        palette.text,\n        { weight: 'bold' },\n      ),\n    );\n  }\n\n  const width = rhu(contentRight + margin);\n  const scene: Scene = {\n    viewBox: { x: 0, y: 0, width, height },\n    background: palette.background,\n    elements,\n  };\n\n  // `reveal none` opts out of progressive reveal: emit NO reveal track, so the\n  // interactive path stays manifest-free and hosts render every item at once.\n  const base = { scene, anchors: anchors as NodeAnchorRegistry };\n  return doc.reveal === 'none' ? base : { ...base, reveal: { steps: buildSteps(doc) } };\n}\n\nexport const list: DiagramModule<ListDoc> = {\n  parseMermaid(input: string): ListDoc {\n    return parseList(input);\n  },\n  parseYaml(input: string): ListDoc {\n    return JSON.parse(input) as ListDoc;\n  },\n  layout(ir: ListDoc, theme: ResolvedTheme): LayoutResult {\n    return layoutList(ir, theme);\n  },\n};\n", "import type { FishboneDocument, FishboneCategory, FishboneCause } from './ir.js';\nimport { extractFrontmatter } from '../../../frontend/frontmatter.js';\n\nexport function parseFishbone(input: string): FishboneDocument {\n  const { metadata, body } = extractFrontmatter(input);\n  const lines = body.split(/\\r?\\n/);\n\n  let effect = 'Effect';\n  let title = typeof metadata.title === 'string' ? metadata.title : '';\n  const categories: FishboneCategory[] = [];\n  let currentCategory: { name: string; causes: FishboneCause[] } | null = null;\n\n  for (let rawLine of lines) {\n    const trimmed = rawLine.trim();\n    if (!trimmed || trimmed.startsWith('%%') || trimmed.startsWith('#')) {\n      continue;\n    }\n\n    if (/^fishbone\\b/i.test(trimmed)) {\n      continue;\n    }\n\n    // title\n    const titleMatch = trimmed.match(/^title(?:\\s+|:\\s*)(?:\"([^\"]+)\"|'([^']+)'|(.+))$/i);\n    if (titleMatch) {\n      title = (titleMatch[1] ?? titleMatch[2] ?? titleMatch[3] ?? '').trim();\n      continue;\n    }\n\n    // effect\n    const effectMatch = trimmed.match(/^effect(?:\\s+|:\\s*)(?:\"([^\"]+)\"|'([^']+)'|(.+))$/i);\n    if (effectMatch) {\n      effect = (effectMatch[1] ?? effectMatch[2] ?? effectMatch[3] ?? '').trim();\n      continue;\n    }\n\n    // category\n    const catMatch = trimmed.match(/^category(?:\\s+|:\\s*)(?:\"([^\"]+)\"|'([^']+)'|(.+))$/i);\n    if (catMatch) {\n      const name = (catMatch[1] ?? catMatch[2] ?? catMatch[3] ?? '').trim();\n      currentCategory = { name, causes: [] };\n      categories.push(currentCategory);\n      continue;\n    }\n\n    // cause under current category\n    if (currentCategory) {\n      const causeText = trimmed\n        .replace(/^-\\s*/, '')\n        .replace(/^\"([^\"]+)\"$/, '$1')\n        .replace(/^'([^']+)'$/, '$1')\n        .trim();\n      if (causeText) {\n        currentCategory.causes.push({ label: causeText });\n      }\n    }\n  }\n\n  return {\n    version: '1',\n    metadata: { ...metadata, title },\n    effect,\n    categories,\n  };\n}\n", "import type {\n  DiagramLayoutEngine,\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n  Rect,\n} from '../../../contracts/index.js';\nimport type { FishboneDocument } from './ir.js';\nimport { pen } from '../../../scene/build.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\n\nexport function layoutFishbone(doc: FishboneDocument, theme: ResolvedTheme): LayoutResult {\n  const p = pen(theme);\n  const { palette, typography } = theme;\n  const elements: SceneElement[] = [];\n\n  const categories = doc.categories;\n  const numCats = categories.length;\n  const topCats = categories.filter((_, i) => i % 2 === 0);\n  const botCats = categories.filter((_, i) => i % 2 === 1);\n  const numPairs = Math.max(topCats.length, botCats.length, 1);\n\n  const colWidth = 240;\n  const marginX = 60;\n  const titleH = doc.metadata.title ? 60 : 20;\n  const spineStartX = marginX;\n  const spineEndX = marginX + numPairs * colWidth + 40;\n  const effectBoxW = 180;\n  const effectBoxH = 64;\n  const effectBoxX = spineEndX + 10;\n  const spineY = titleH + 260;\n  const canvasW = effectBoxX + effectBoxW + marginX;\n  const canvasH = spineY + 280;\n\n  // Title\n  if (doc.metadata.title) {\n    elements.push(\n      p.text(String(doc.metadata.title), marginX, 40, typography.titleFontSize, palette.text, {\n        weight: 'bold',\n      }),\n    );\n  }\n\n  // Central Spine\n  elements.push(p.path(`M ${spineStartX} ${spineY} L ${spineEndX} ${spineY}`, palette.primary, 3));\n\n  // Spine Arrowhead to Effect Box\n  elements.push(\n    p.path(\n      `M ${spineEndX - 10} ${spineY - 8} L ${spineEndX + 6} ${spineY} L ${spineEndX - 10} ${spineY + 8} Z`,\n      palette.primary,\n      1,\n      { fill: palette.primary },\n    ),\n  );\n\n  // Effect Box\n  elements.push(\n    p.rect(\n      { x: effectBoxX, y: spineY - effectBoxH / 2, width: effectBoxW, height: effectBoxH },\n      palette.surface,\n      palette.primary,\n      2,\n      { rx: 6 },\n    ),\n  );\n\n  // Effect Text\n  const effectMeasured = measureText(doc.effect, typography.baseFontSize);\n  elements.push(\n    p.text(\n      doc.effect,\n      effectBoxX + effectBoxW / 2,\n      spineY + typography.baseFontSize * 0.35,\n      typography.baseFontSize,\n      palette.text,\n      { weight: 'bold', anchor: 'middle' },\n    ),\n  );\n\n  // Render Categories (Top & Bottom)\n  for (let pairIdx = 0; pairIdx < numPairs; pairIdx++) {\n    const spineAttachX = spineStartX + 120 + pairIdx * colWidth;\n\n    // Top Category\n    if (pairIdx < topCats.length) {\n      const cat = topCats[pairIdx]!;\n      const ribStartX = spineAttachX - 100;\n      const ribStartY = spineY - 200;\n\n      // Diagonal rib line\n      elements.push(\n        p.path(`M ${ribStartX} ${ribStartY} L ${spineAttachX} ${spineY}`, palette.border, 2),\n      );\n\n      // Category Header Box\n      const catTextW = Math.max(90, measureText(cat.name, typography.smallFontSize).width + 20);\n      const catBoxH = 26;\n      elements.push(\n        p.rect(\n          { x: ribStartX - catTextW / 2, y: ribStartY - catBoxH, width: catTextW, height: catBoxH },\n          palette.surface,\n          palette.border,\n          1.5,\n          { rx: 4 },\n        ),\n      );\n      elements.push(\n        p.text(\n          cat.name,\n          ribStartX,\n          ribStartY - catBoxH / 2 + typography.smallFontSize * 0.35,\n          typography.smallFontSize,\n          palette.text,\n          { weight: 'bold', anchor: 'middle' },\n        ),\n      );\n\n      // Causes along rib\n      const numCauses = cat.causes.length;\n      for (let cIdx = 0; cIdx < numCauses; cIdx++) {\n        const t = (cIdx + 1) / (numCauses + 1);\n        const ribPtX = ribStartX + (spineAttachX - ribStartX) * t;\n        const ribPtY = ribStartY + (spineY - ribStartY) * t;\n        const branchW = 100;\n        const branchEndX = ribPtX - branchW;\n\n        // Horizontal branch line\n        elements.push(\n          p.path(`M ${branchEndX} ${ribPtY} L ${ribPtX} ${ribPtY}`, palette.border, 1.2),\n        );\n        // Cause label\n        elements.push(\n          p.text(\n            cat.causes[cIdx]!.label,\n            branchEndX + 4,\n            ribPtY - 4,\n            typography.smallFontSize - 1,\n            palette.textMuted,\n          ),\n        );\n      }\n    }\n\n    // Bottom Category\n    if (pairIdx < botCats.length) {\n      const cat = botCats[pairIdx]!;\n      const ribStartX = spineAttachX - 100;\n      const ribStartY = spineY + 200;\n\n      // Diagonal rib line\n      elements.push(\n        p.path(`M ${ribStartX} ${ribStartY} L ${spineAttachX} ${spineY}`, palette.border, 2),\n      );\n\n      // Category Header Box\n      const catTextW = Math.max(90, measureText(cat.name, typography.smallFontSize).width + 20);\n      const catBoxH = 26;\n      elements.push(\n        p.rect(\n          { x: ribStartX - catTextW / 2, y: ribStartY, width: catTextW, height: catBoxH },\n          palette.surface,\n          palette.border,\n          1.5,\n          { rx: 4 },\n        ),\n      );\n      elements.push(\n        p.text(\n          cat.name,\n          ribStartX,\n          ribStartY + catBoxH / 2 + typography.smallFontSize * 0.35,\n          typography.smallFontSize,\n          palette.text,\n          { weight: 'bold', anchor: 'middle' },\n        ),\n      );\n\n      // Causes along rib\n      const numCauses = cat.causes.length;\n      for (let cIdx = 0; cIdx < numCauses; cIdx++) {\n        const t = (cIdx + 1) / (numCauses + 1);\n        const ribPtX = ribStartX + (spineAttachX - ribStartX) * t;\n        const ribPtY = ribStartY + (spineY - ribStartY) * t;\n        const branchW = 100;\n        const branchEndX = ribPtX - branchW;\n\n        // Horizontal branch line\n        elements.push(\n          p.path(`M ${branchEndX} ${ribPtY} L ${ribPtX} ${ribPtY}`, palette.border, 1.2),\n        );\n        // Cause label\n        elements.push(\n          p.text(\n            cat.causes[cIdx]!.label,\n            branchEndX + 4,\n            ribPtY - 4,\n            typography.smallFontSize - 1,\n            palette.textMuted,\n          ),\n        );\n      }\n    }\n  }\n\n  const rawScene: Scene = {\n    viewBox: { x: 0, y: 0, width: canvasW, height: canvasH },\n    background: palette.background,\n    elements,\n  };\n\n  const scene = applyOverlays(rawScene, doc.overlays, theme);\n  const anchors: NodeAnchorRegistry = {};\n\n  return { scene, anchors };\n}\n", "import type { DiagramModule } from '../../../contracts/index.js';\nimport type { FishboneDocument } from './ir.js';\nimport { parseFishbone } from './parser.js';\nimport { layoutFishbone } from './layout.js';\n\nexport const fishbone: DiagramModule<FishboneDocument> = {\n  parseMermaid: parseFishbone,\n  parseYaml(input: string): FishboneDocument {\n    return JSON.parse(input) as FishboneDocument;\n  },\n  layout: layoutFishbone,\n};\n", "import type { PyramidDocument, PyramidTier } from './ir.js';\nimport { extractFrontmatter } from '../../../frontend/frontmatter.js';\n\nexport function parsePyramid(input: string): PyramidDocument {\n  const { metadata, body } = extractFrontmatter(input);\n  const lines = body.split(/\\r?\\n/);\n\n  let direction: 'pyramid' | 'funnel' = 'pyramid';\n  let title = typeof metadata.title === 'string' ? metadata.title : '';\n  const tiers: PyramidTier[] = [];\n\n  for (const rawLine of lines) {\n    const trimmed = rawLine.trim();\n    if (!trimmed || trimmed.startsWith('%%') || trimmed.startsWith('#')) {\n      continue;\n    }\n\n    if (/^funnel\\b/i.test(trimmed)) {\n      direction = 'funnel';\n      continue;\n    }\n    if (/^pyramid\\b/i.test(trimmed)) {\n      direction = 'pyramid';\n      continue;\n    }\n\n    // title\n    const titleMatch = trimmed.match(/^title(?:\\s+|:\\s*)(?:\"([^\"]+)\"|'([^']+)'|(.+))$/i);\n    if (titleMatch) {\n      title = (titleMatch[1] ?? titleMatch[2] ?? titleMatch[3] ?? '').trim();\n      continue;\n    }\n\n    // tier line\n    let lineContent = trimmed.replace(/^tier\\s+/i, '').replace(/^-\\s*/, '');\n    const isFocal = /(:{1,3}focal\\b|\\bfocal\\b)/i.test(lineContent);\n    lineContent = lineContent.replace(/(:{1,3}focal\\b|\\bfocal\\b)/gi, '').trim();\n\n    // label and optional value: \"Label\" : Value or Label: Value\n    const colonIdx = lineContent.lastIndexOf(':');\n    let label = lineContent;\n    let value: string | undefined;\n\n    if (colonIdx > 0 && !lineContent.startsWith('http')) {\n      label = lineContent.slice(0, colonIdx).trim();\n      value = lineContent.slice(colonIdx + 1).trim();\n    }\n\n    label = label.replace(/^[\"']|[\"']$/g, '').trim();\n    if (value) {\n      value = value.replace(/^[\"']|[\"']$/g, '').trim();\n    }\n\n    if (label) {\n      tiers.push({\n        label,\n        ...(value !== undefined ? { value } : {}),\n        ...(isFocal ? { isFocal: true } : {}),\n      });\n    }\n  }\n\n  return {\n    version: '1',\n    metadata: { ...metadata, title },\n    direction,\n    tiers,\n  };\n}\n", "import type {\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../contracts/index.js';\nimport type { PyramidDocument } from './ir.js';\nimport { pen } from '../../../scene/build.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\n\nexport function layoutPyramid(doc: PyramidDocument, theme: ResolvedTheme): LayoutResult {\n  const p = pen(theme);\n  const { palette, typography } = theme;\n  const elements: SceneElement[] = [];\n\n  const tiers = doc.tiers;\n  const N = Math.max(tiers.length, 1);\n  const isFunnel = doc.direction === 'funnel';\n\n  const marginX = 80;\n  const titleH = doc.metadata.title ? 60 : 30;\n  const tierH = 54;\n  const tierGap = 6;\n  const totalTierH = N * tierH + (N - 1) * tierGap;\n\n  const minW = 200;\n  const maxW = 560;\n  const canvasW = 860;\n  const centerX = 380;\n  const canvasH = titleH + totalTierH + 60;\n\n  // Title\n  if (doc.metadata.title) {\n    elements.push(\n      p.text(String(doc.metadata.title), marginX, 40, typography.titleFontSize, palette.text, {\n        weight: 'bold',\n      }),\n    );\n  }\n\n  for (let i = 0; i < N; i++) {\n    const tier = tiers[i]!;\n    const curY = titleH + i * (tierH + tierGap);\n\n    let topFrac: number;\n    let botFrac: number;\n\n    if (!isFunnel) {\n      // Pyramid: top narrow, bottom wide\n      topFrac = i / N;\n      botFrac = (i + 1) / N;\n    } else {\n      // Funnel: top wide, bottom narrow\n      topFrac = (N - i) / N;\n      botFrac = (N - i - 1) / N;\n    }\n\n    const wTop = minW + (maxW - minW) * topFrac;\n    const wBot = minW + (maxW - minW) * botFrac;\n\n    const x1 = centerX - wTop / 2;\n    const x2 = centerX + wTop / 2;\n    const x3 = centerX + wBot / 2;\n    const x4 = centerX - wBot / 2;\n    const y1 = curY;\n    const y2 = curY + tierH;\n\n    const isFocal = tier.isFocal;\n    const fill = isFocal ? palette.primary : palette.surface;\n    const stroke = isFocal ? palette.primary : palette.border;\n    const textFill = isFocal ? (theme.name.includes('dark') ? '#1E293B' : '#FFFFFF') : palette.text;\n\n    // Trapezoid path\n    const pathD = `M ${x1} ${y1} L ${x2} ${y1} L ${x3} ${y2} L ${x4} ${y2} Z`;\n    elements.push(p.path(pathD, stroke, 1.5, { fill }));\n\n    // Tier Label\n    elements.push(\n      p.text(\n        tier.label,\n        centerX,\n        curY + tierH / 2 + typography.baseFontSize * 0.35,\n        typography.baseFontSize,\n        textFill,\n        { weight: isFocal ? 'bold' : 'normal', anchor: 'middle' },\n      ),\n    );\n\n    // Optional Value indicator on right\n    if (tier.value !== undefined) {\n      const rightX = Math.max(x2, x3) + 24;\n      const valText = String(tier.value);\n      // Guide dash\n      elements.push(\n        p.path(\n          `M ${Math.max(x2, x3) + 4} ${curY + tierH / 2} L ${rightX - 6} ${curY + tierH / 2}`,\n          palette.border,\n          1,\n          { dash: '3 2' },\n        ),\n      );\n      // Value badge\n      elements.push(\n        p.text(\n          valText,\n          rightX,\n          curY + tierH / 2 + typography.smallFontSize * 0.35,\n          typography.smallFontSize,\n          palette.primary,\n          { weight: 'bold' },\n        ),\n      );\n    }\n  }\n\n  const rawScene: Scene = {\n    viewBox: { x: 0, y: 0, width: canvasW, height: canvasH },\n    background: palette.background,\n    elements,\n  };\n\n  const scene = applyOverlays(rawScene, doc.overlays, theme);\n  const anchors: NodeAnchorRegistry = {};\n\n  return { scene, anchors };\n}\n", "import type { DiagramModule } from '../../../contracts/index.js';\nimport type { PyramidDocument } from './ir.js';\nimport { parsePyramid } from './parser.js';\nimport { layoutPyramid } from './layout.js';\n\nexport const pyramid: DiagramModule<PyramidDocument> = {\n  parseMermaid: parsePyramid,\n  parseYaml(input: string): PyramidDocument {\n    return JSON.parse(input) as PyramidDocument;\n  },\n  layout: layoutPyramid,\n};\n", "import type { LoopDocument, LoopStep } from './ir.js';\nimport { extractFrontmatter } from '../../../frontend/frontmatter.js';\n\nexport function parseLoop(input: string): LoopDocument {\n  const { metadata, body } = extractFrontmatter(input);\n  const lines = body.split(/\\r?\\n/);\n\n  let title = typeof metadata.title === 'string' ? metadata.title : '';\n  let hub: string | undefined;\n  const steps: LoopStep[] = [];\n\n  for (const rawLine of lines) {\n    const trimmed = rawLine.trim();\n    if (!trimmed || trimmed.startsWith('%%') || trimmed.startsWith('#')) {\n      continue;\n    }\n\n    if (/^(loop|flywheel)\\b/i.test(trimmed)) {\n      continue;\n    }\n\n    // title\n    const titleMatch = trimmed.match(/^title(?:\\s+|:\\s*)(?:\"([^\"]+)\"|'([^']+)'|(.+))$/i);\n    if (titleMatch) {\n      title = (titleMatch[1] ?? titleMatch[2] ?? titleMatch[3] ?? '').trim();\n      continue;\n    }\n\n    // hub\n    const hubMatch = trimmed.match(/^hub(?:\\s+|:\\s*)(?:\"([^\"]+)\"|'([^']+)'|(.+))$/i);\n    if (hubMatch) {\n      hub = (hubMatch[1] ?? hubMatch[2] ?? hubMatch[3] ?? '').trim();\n      continue;\n    }\n\n    // step\n    let stepLine = trimmed.replace(/^step\\s+/i, '').replace(/^-\\s*/, '');\n    const isFocal = /(:{1,3}focal\\b|\\bfocal\\b)/i.test(stepLine);\n    stepLine = stepLine.replace(/(:{1,3}focal\\b|\\bfocal\\b)/gi, '').trim();\n\n    // extract label and optional desc\n    let label = stepLine;\n    let desc: string | undefined;\n\n    const colonIdx = stepLine.indexOf(':');\n    if (colonIdx > 0 && !stepLine.startsWith('http')) {\n      label = stepLine.slice(0, colonIdx).trim();\n      desc = stepLine.slice(colonIdx + 1).trim();\n    }\n\n    label = label.replace(/^[\"']|[\"']$/g, '').trim();\n    if (desc) {\n      desc = desc.replace(/^[\"']|[\"']$/g, '').trim();\n    }\n\n    if (label) {\n      steps.push({\n        label,\n        ...(desc ? { desc } : {}),\n        ...(isFocal ? { isFocal: true } : {}),\n      });\n    }\n  }\n\n  return {\n    version: '1',\n    metadata: { ...metadata, title },\n    ...(hub ? { hub } : {}),\n    steps,\n  };\n}\n", "import type {\n  ResolvedTheme,\n  LayoutResult,\n  Scene,\n  SceneElement,\n  NodeAnchorRegistry,\n} from '../../../contracts/index.js';\nimport type { LoopDocument } from './ir.js';\nimport { pen } from '../../../scene/build.js';\nimport { measureText } from '../../../text/metrics.js';\nimport { applyOverlays } from '../../../overlay/apply.js';\n\nexport function layoutLoop(doc: LoopDocument, theme: ResolvedTheme): LayoutResult {\n  const p = pen(theme);\n  const { palette, typography } = theme;\n  const elements: SceneElement[] = [];\n\n  const steps = doc.steps;\n  const N = Math.max(steps.length, 1);\n\n  const canvasW = 860;\n  const canvasH = 720;\n  const titleH = doc.metadata.title ? 60 : 30;\n  const cx = canvasW / 2;\n  const cy = titleH + 310;\n  const radius = 200;\n\n  // Title\n  if (doc.metadata.title) {\n    elements.push(\n      p.text(String(doc.metadata.title), 60, 40, typography.titleFontSize, palette.text, {\n        weight: 'bold',\n      }),\n    );\n  }\n\n  // Radial dashed spokes connecting to hub (drawn behind)\n  if (doc.hub) {\n    for (let i = 0; i < N; i++) {\n      const angle = -Math.PI / 2 + (2 * Math.PI * i) / N;\n      const sx = cx + radius * Math.cos(angle);\n      const sy = cy + radius * Math.sin(angle);\n      elements.push(p.path(`M ${cx} ${cy} L ${sx} ${sy}`, palette.border, 1, { dash: '4 4' }));\n    }\n  }\n\n  // Circular connecting arrows between step i and step (i+1) % N\n  if (N > 1) {\n    for (let i = 0; i < N; i++) {\n      const nextIdx = (i + 1) % N;\n      const a1 = -Math.PI / 2 + (2 * Math.PI * i) / N;\n      const a2 = -Math.PI / 2 + (2 * Math.PI * nextIdx) / N;\n\n      // Arc points offset along circle\n      const midAngle = a1 + (a2 > a1 ? a2 - a1 : a2 + 2 * Math.PI - a1) / 2;\n      const arcR = radius + 25;\n\n      const p1x = cx + radius * Math.cos(a1 + 0.35);\n      const p1y = cy + radius * Math.sin(a1 + 0.35);\n      const p2x = cx + radius * Math.cos(a2 - 0.35);\n      const p2y = cy + radius * Math.sin(a2 - 0.35);\n      const cpx = cx + arcR * Math.cos(midAngle);\n      const cpy = cy + arcR * Math.sin(midAngle);\n\n      // Arc curve\n      elements.push(p.path(`M ${p1x} ${p1y} Q ${cpx} ${cpy} ${p2x} ${p2y}`, palette.primary, 1.8));\n\n      // Arrowhead at p2\n      const tangentX = p2x - cpx;\n      const tangentY = p2y - cpy;\n      const len = Math.hypot(tangentX, tangentY) || 1;\n      const ux = tangentX / len;\n      const uy = tangentY / len;\n      const arrowLen = theme.edges?.arrowSize ?? 8;\n      const arrowW = arrowLen * 0.6;\n\n      const ax1 = p2x - ux * arrowLen + uy * arrowW;\n      const ay1 = p2y - uy * arrowLen - ux * arrowW;\n      const ax2 = p2x - ux * arrowLen - uy * arrowW;\n      const ay2 = p2y - uy * arrowLen + ux * arrowW;\n\n      elements.push(\n        p.path(`M ${ax1} ${ay1} L ${p2x} ${p2y} L ${ax2} ${ay2} Z`, palette.primary, 1, {\n          fill: palette.primary,\n        }),\n      );\n    }\n  }\n\n  // Central Hub Node\n  if (doc.hub) {\n    const hubW = 140;\n    const hubH = 64;\n    elements.push(\n      p.rect(\n        { x: cx - hubW / 2, y: cy - hubH / 2, width: hubW, height: hubH },\n        palette.surface,\n        palette.primary,\n        2,\n        { rx: 32 },\n      ),\n    );\n    elements.push(\n      p.text(\n        doc.hub,\n        cx,\n        cy + typography.smallFontSize * 0.35,\n        typography.smallFontSize,\n        palette.text,\n        { weight: 'bold', anchor: 'middle' },\n      ),\n    );\n  }\n\n  // Step Nodes\n  const nodeW = 150;\n  const nodeH = 52;\n\n  for (let i = 0; i < N; i++) {\n    const step = steps[i]!;\n    const angle = -Math.PI / 2 + (2 * Math.PI * i) / N;\n    const nx = cx + radius * Math.cos(angle);\n    const ny = cy + radius * Math.sin(angle);\n\n    const isFocal = step.isFocal;\n    const fill = isFocal ? palette.primary : palette.surface;\n    const stroke = isFocal ? palette.primary : palette.border;\n    const textFill = isFocal ? (theme.name.includes('dark') ? '#1E293B' : '#FFFFFF') : palette.text;\n    const descFill = isFocal\n      ? theme.name.includes('dark')\n        ? '#334155'\n        : 'rgba(255,255,255,0.85)'\n      : palette.textMuted;\n\n    elements.push(\n      p.rect(\n        { x: nx - nodeW / 2, y: ny - nodeH / 2, width: nodeW, height: nodeH },\n        fill,\n        stroke,\n        isFocal ? 2 : 1.5,\n        { rx: 6 },\n      ),\n    );\n\n    const hasDesc = Boolean(step.desc);\n    const titleY = hasDesc ? ny - 4 : ny + typography.smallFontSize * 0.35;\n\n    elements.push(\n      p.text(step.label, nx, titleY, typography.smallFontSize, textFill, {\n        weight: 'bold',\n        anchor: 'middle',\n      }),\n    );\n\n    if (hasDesc && step.desc) {\n      elements.push(\n        p.text(step.desc, nx, ny + 12, typography.smallFontSize - 2, descFill, {\n          anchor: 'middle',\n        }),\n      );\n    }\n  }\n\n  const rawScene: Scene = {\n    viewBox: { x: 0, y: 0, width: canvasW, height: canvasH },\n    background: palette.background,\n    elements,\n  };\n\n  const scene = applyOverlays(rawScene, doc.overlays, theme);\n  const anchors: NodeAnchorRegistry = {};\n\n  return { scene, anchors };\n}\n", "import type { DiagramModule } from '../../../contracts/index.js';\nimport type { LoopDocument } from './ir.js';\nimport { parseLoop } from './parser.js';\nimport { layoutLoop } from './layout.js';\n\nexport const loop: DiagramModule<LoopDocument> = {\n  parseMermaid: parseLoop,\n  parseYaml(input: string): LoopDocument {\n    return JSON.parse(input) as LoopDocument;\n  },\n  layout: layoutLoop,\n};\n", "export const sourceSans3FontCss = \"/* Google Inc.\\n\\nThis Font Software is licensed under the SIL Open Font License, Version 1.1.\\nThis license is copied below, and is also available with a FAQ at:\\nhttp://scripts.sil.org/OFL\\n\\n\\n-----------------------------------------------------------\\nSIL OPEN FONT LICENSE Version 1.1 - 26 February 2007\\n-----------------------------------------------------------\\n\\nPREAMBLE\\nThe goals of the Open Font License (OFL) are to stimulate worldwide\\ndevelopment of collaborative font projects, to support the font creation\\nefforts of academic and linguistic communities, and to provide a free and\\nopen framework in which fonts may be shared and improved in partnership\\nwith others.\\n\\nThe OFL allows the licensed fonts to be used, studied, modified and\\nredistributed freely as long as they are not sold by themselves. The\\nfonts, including any derivative works, can be bundled, embedded,\\nredistributed and/or sold with any software provided that any reserved\\nnames are not used by derivative works. The fonts and derivatives,\\nhowever, cannot be released under any other type of license. The\\nrequirement for fonts to remain under this license does not apply\\nto any document created using the fonts or their derivatives.\\n\\nDEFINITIONS\\n\\\"Font Software\\\" refers to the set of files released by the Copyright\\nHolder(s) under this license and clearly marked as such. This may\\ninclude source files, build scripts and documentation.\\n\\n\\\"Reserved Font Name\\\" refers to any names specified as such after the\\ncopyright statement(s).\\n\\n\\\"Original Version\\\" refers to the collection of Font Software components as\\ndistributed by the Copyright Holder(s).\\n\\n\\\"Modified Version\\\" refers to any derivative made by adding to, deleting,\\nor substituting -- in part or in whole -- any of the components of the\\nOriginal Version, by changing formats or by porting the Font Software to a\\nnew environment.\\n\\n\\\"Author\\\" refers to any designer, engineer, programmer, technical\\nwriter or other person who contributed to the Font Software.\\n\\nPERMISSION & CONDITIONS\\nPermission is hereby granted, free of charge, to any person obtaining\\na copy of the Font Software, to use, study, copy, merge, embed, modify,\\nredistribute, and sell modified and unmodified copies of the Font\\nSoftware, subject to the following conditions:\\n\\n1) Neither the Font Software nor any of its individual components,\\nin Original or Modified Versions, may be sold by itself.\\n\\n2) Original or Modified Versions of the Font Software may be bundled,\\nredistributed and/or sold with any software, provided that each copy\\ncontains the above copyright notice and this license. These can be\\nincluded either as stand-alone text files, human-readable headers or\\nin the appropriate machine-readable metadata fields within text or\\nbinary files as long as those fields can be easily viewed by the user.\\n\\n3) No Modified Version of the Font Software may use the Reserved Font\\nName(s) unless explicit written permission is granted by the corresponding\\nCopyright Holder. This restriction only applies to the primary font name as\\npresented to the users.\\n\\n4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font\\nSoftware shall not be used to promote, endorse or advertise any\\nModified Version, except to acknowledge the contribution(s) of the\\nCopyright Holder(s) and the Author(s) or with their explicit written\\npermission.\\n\\n5) The Font Software, modified or unmodified, in part or in whole,\\nmust be distributed entirely under this license, and must not be\\ndistributed under any other license. The requirement for fonts to\\nremain under this license does not apply to any document created\\nusing the Font Software.\\n\\nTERMINATION\\nThis license becomes null and void if any of the above conditions are\\nnot met.\\n\\nDISCLAIMER\\nTHE FONT SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND,\\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF\\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT\\nOF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE\\nCOPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\\nINCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL\\nDAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\\nFROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM\\nOTHER DEALINGS IN THE FONT SOFTWARE. */\\n@font-face{font-family:'Source Sans 3';font-style:normal;font-weight:400;font-display:swap;src:url(data:font/woff2;base64,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) format('woff2');}\\n@font-face{font-family:'Source Sans 3';font-style:normal;font-weight:700;font-display:swap;src:url(data:font/woff2;base64,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) format('woff2');}\";\n", "import type { Point } from '../contracts/primitives.js';\nimport type { RenderedConnectorAnimation } from '../contracts/animations.js';\n\nexport const ANIMATION_BASE_PERIOD_SECONDS = 0.8;\n\nexport const ANIMATION_PERIOD_SECONDS = {\n  march: 0.8,\n  particle: 1.6,\n  draw: 2.4,\n  pulse: 1.6,\n  glow: 1.6,\n  comet: 1.6,\n  stream: 2.4,\n  flow: 1.6,\n  colorcycle: 2.4,\n} as const satisfies Record<RenderedConnectorAnimation, number>;\n\nexport const COLOR_CYCLE_STROKES = ['#4A90D9', '#9b51e0', '#e54444', '#2ecc71', '#4A90D9'] as const;\nexport const FLOW_STOP_OFFSETS = [\n  [0, 60, 100],\n  [10, 70, 100],\n  [20, 80, 100],\n] as const;\n\nexport interface MotionParticleSpec {\n  readonly radius: number;\n  readonly opacity?: number;\n  readonly phase: number;\n}\n\nexport function animationPeriodSeconds(animation: RenderedConnectorAnimation): number {\n  return ANIMATION_PERIOD_SECONDS[animation];\n}\n\nexport function animationDuration(animation: RenderedConnectorAnimation): string {\n  return `${formatNum(animationPeriodSeconds(animation))}s`;\n}\n\nexport function marchDashoffsetAt(timeSeconds: number, dasharray: string): number {\n  const offset =\n    -parseDasharrayPeriod(dasharray) * normalizedTime(timeSeconds, ANIMATION_PERIOD_SECONDS.march);\n  return Object.is(offset, -0) ? 0 : offset;\n}\n\nexport function marchDashoffsetValues(dasharray: string): {\n  readonly from: number;\n  readonly to: number;\n} {\n  return { from: 0, to: -parseDasharrayPeriod(dasharray) };\n}\n\nexport function drawDashoffsetAt(timeSeconds: number, pathLength: number): number {\n  return triangularValue(timeSeconds, ANIMATION_PERIOD_SECONDS.draw, 0, pathLength);\n}\n\nexport function drawDashoffsetValues(pathLength: number): readonly [number, number, number] {\n  return [0, pathLength, 0];\n}\n\nexport function pulseStrokeWidthAt(timeSeconds: number, strokeWidth: number): number {\n  return triangularValue(timeSeconds, ANIMATION_PERIOD_SECONDS.pulse, strokeWidth, strokeWidth * 2);\n}\n\nexport function pulseStrokeWidthValues(strokeWidth: number): readonly [number, number, number] {\n  return [strokeWidth, Number(formatNum(strokeWidth * 2)), strokeWidth];\n}\n\nexport function glowStrokeOpacityAt(timeSeconds: number): number {\n  return triangularValue(timeSeconds, ANIMATION_PERIOD_SECONDS.glow, 1, 0.3);\n}\n\nexport function glowStrokeOpacityValues(): readonly [number, number, number] {\n  return [1, 0.3, 1];\n}\n\nexport function colorCycleStrokeAt(timeSeconds: number): string {\n  return interpolatedHex(\n    COLOR_CYCLE_STROKES,\n    normalizedTime(timeSeconds, ANIMATION_PERIOD_SECONDS.colorcycle),\n  );\n}\n\nexport function colorCycleStrokeValues(): typeof COLOR_CYCLE_STROKES {\n  return COLOR_CYCLE_STROKES;\n}\n\nexport function flowStopOffsetAt(timeSeconds: number, stopIndex: 0 | 1 | 2): number {\n  return keyframedNumber(\n    FLOW_STOP_OFFSETS[stopIndex],\n    normalizedTime(timeSeconds, ANIMATION_PERIOD_SECONDS.flow),\n  );\n}\n\nexport function flowStopOffsetValues(stopIndex: 0 | 1 | 2): readonly [number, number, number] {\n  return FLOW_STOP_OFFSETS[stopIndex];\n}\n\nexport function motionFractionAt(\n  timeSeconds: number,\n  animation: 'particle' | 'comet' | 'stream',\n  phase = 0,\n): number {\n  return wrap01(normalizedTime(timeSeconds, ANIMATION_PERIOD_SECONDS[animation]) + phase);\n}\n\nexport function motionParticleSpecs(\n  animation: 'particle' | 'comet' | 'stream',\n): readonly MotionParticleSpec[] {\n  if (animation === 'particle') return [{ radius: 4, phase: 0 }];\n  if (animation === 'comet') {\n    return [\n      { radius: 4.2, opacity: 0.95, phase: 0 },\n      { radius: 3.1, opacity: 0.45, phase: 0.1 },\n      { radius: 2.2, opacity: 0.22, phase: 0.2 },\n    ];\n  }\n  return [\n    { radius: 3.2, opacity: 0.9, phase: 0 },\n    { radius: 3.2, opacity: 0.9, phase: 0.25 },\n    { radius: 3.2, opacity: 0.9, phase: 0.5 },\n    { radius: 3.2, opacity: 0.9, phase: 0.75 },\n  ];\n}\n\nexport function motionBeginSeconds(\n  animation: 'particle' | 'comet' | 'stream',\n  phase: number,\n): number {\n  return -phase * ANIMATION_PERIOD_SECONDS[animation];\n}\n\nexport function pointAtPathFraction(path: string, fraction: number): Point {\n  const pts = pathPoints(path);\n  if (pts.length === 0) return { x: 0, y: 0 };\n  if (pts.length === 1) return pts[0]!;\n\n  const clamped = Math.min(1, Math.max(0, fraction));\n  const target = pathLengthApprox(path) * clamped;\n  let walked = 0;\n  for (let i = 1; i < pts.length; i++) {\n    const a = pts[i - 1]!;\n    const b = pts[i]!;\n    const segmentLength = Math.hypot(b.x - a.x, b.y - a.y);\n    if (segmentLength === 0) continue;\n    if (walked + segmentLength >= target) {\n      const t = (target - walked) / segmentLength;\n      return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };\n    }\n    walked += segmentLength;\n  }\n  return pts[pts.length - 1]!;\n}\n\nexport function pathLengthApprox(path: string): number {\n  const pts = pathPoints(path);\n  if (pts.length < 2) return 1000;\n  let length = 0;\n  for (let i = 1; i < pts.length; i++) {\n    length += Math.hypot(pts[i]!.x - pts[i - 1]!.x, pts[i]!.y - pts[i - 1]!.y);\n  }\n  return Math.max(1, Number(formatNum(length)));\n}\n\nexport function pathPoints(path: string): Point[] {\n  const nums = [...path.matchAll(/-?\\d+(?:\\.\\d+)?(?:e[-+]?\\d+)?/gi)].map((m) => Number(m[0]));\n  const pts: Point[] = [];\n  for (let i = 0; i + 1 < nums.length; i += 2) {\n    const x = nums[i]!;\n    const y = nums[i + 1]!;\n    if (Number.isFinite(x) && Number.isFinite(y)) pts.push({ x, y });\n  }\n  return pts;\n}\n\nexport function parseDasharrayPeriod(dasharray: string): number {\n  return dasharray\n    .trim()\n    .split(/[\\s,]+/)\n    .map(Number)\n    .filter((n) => !isNaN(n) && n > 0)\n    .reduce((sum, n) => sum + n, 0);\n}\n\nexport function formatNum(value: number): string {\n  return Number.isFinite(value) ? String(Math.round(value * 1000) / 1000) : '0';\n}\n\nfunction normalizedTime(timeSeconds: number, periodSeconds: number): number {\n  return wrap01(timeSeconds / periodSeconds);\n}\n\nfunction triangularValue(\n  timeSeconds: number,\n  periodSeconds: number,\n  start: number,\n  mid: number,\n): number {\n  const p = normalizedTime(timeSeconds, periodSeconds);\n  const local = p <= 0.5 ? p * 2 : (1 - p) * 2;\n  return start + (mid - start) * local;\n}\n\nfunction keyframedNumber(values: readonly number[], progress: number): number {\n  if (values.length === 0) return 0;\n  if (values.length === 1) return values[0]!;\n  const scaled = progress * (values.length - 1);\n  const index = Math.min(values.length - 2, Math.floor(scaled));\n  const local = scaled - index;\n  return values[index]! + (values[index + 1]! - values[index]!) * local;\n}\n\nfunction interpolatedHex(values: readonly string[], progress: number): string {\n  if (values.length === 0) return '#000000';\n  if (values.length === 1) return values[0]!;\n  const scaled = progress * (values.length - 1);\n  const index = Math.min(values.length - 2, Math.floor(scaled));\n  const local = scaled - index;\n  if (local === 0) return values[index]!;\n  return mixHex(values[index]!, values[index + 1]!, local);\n}\n\nfunction mixHex(a: string, b: string, t: number): string {\n  const left = parseHex(a);\n  const right = parseHex(b);\n  return `#${[0, 1, 2].map((i) => formatHex(left[i]! + (right[i]! - left[i]!) * t)).join('')}`;\n}\n\nfunction parseHex(value: string): readonly [number, number, number] {\n  const hex = value.replace(/^#/, '');\n  return [\n    Number.parseInt(hex.slice(0, 2), 16),\n    Number.parseInt(hex.slice(2, 4), 16),\n    Number.parseInt(hex.slice(4, 6), 16),\n  ];\n}\n\nfunction formatHex(value: number): string {\n  return Math.round(value).toString(16).padStart(2, '0');\n}\n\nfunction wrap01(value: number): number {\n  if (!Number.isFinite(value)) return 0;\n  const wrapped = value % 1;\n  return wrapped < 0 ? wrapped + 1 : wrapped;\n}\n", "import type {\n  Scene,\n  SceneElement,\n  SceneIcon,\n  Renderer,\n  NodeAnchorRegistry,\n  RevealTrack,\n} from '../contracts/index.js';\nimport type { IconTransforms } from '../contracts/icons.js';\nimport { sourceSans3FontCss } from '../theme/sourceSans3.generated.js';\nimport {\n  animationDuration,\n  colorCycleStrokeValues,\n  drawDashoffsetValues,\n  flowStopOffsetValues,\n  formatNum,\n  glowStrokeOpacityValues,\n  marchDashoffsetValues,\n  motionBeginSeconds,\n  motionParticleSpecs,\n  pathLengthApprox,\n  pathPoints,\n  pulseStrokeWidthValues,\n} from '../animation/index.js';\n\n/**\n * Render a fully-resolved Scene to an SVG string.\n *\n * Contract: the caller must have already incorporated all overlay geometry\n * into Scene.elements before calling this. The renderer is diagram-agnostic.\n */\nexport interface SvgRenderOptions {\n  readonly background?: 'opaque' | 'transparent';\n  readonly fonts?: 'embedded' | 'external';\n}\n\nexport function renderSVG(scene: Scene, options: SvgRenderOptions = {}): string {\n  const { viewBox, background, elements, defs } = scene;\n  const vb = `${viewBox.x} ${viewBox.y} ${viewBox.width} ${viewBox.height}`;\n  const markerMetrics = markerMetricsById(defs ?? []);\n  const embedFont = options.fonts !== 'external' && usesSourceSans3(elements);\n\n  const lines: string[] = [\n    `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${vb}\" width=\"${viewBox.width}\" height=\"${viewBox.height}\">`,\n  ];\n\n  if ((defs && defs.length > 0) || embedFont) {\n    lines.push('  <defs>');\n    if (embedFont) lines.push(`    <style>${escapeXml(sourceSans3FontCss)}</style>`);\n    for (const def of defs ?? []) lines.push(`    ${def}`);\n    lines.push('  </defs>');\n  }\n\n  if (background && options.background !== 'transparent') {\n    // Use explicit x/width to cover the full viewBox, including negative x origins.\n    lines.push(\n      `  <rect x=\"${viewBox.x}\" y=\"${viewBox.y}\" width=\"${viewBox.width}\" height=\"${viewBox.height}\" fill=\"${background}\" />`,\n    );\n  }\n\n  for (const el of elements) {\n    lines.push(renderElement(el, 1, markerMetrics));\n  }\n\n  lines.push('</svg>');\n  return lines.join('\\n');\n}\n\nfunction usesSourceSans3(elements: readonly SceneElement[]): boolean {\n  return elements.some(element => element.type === 'group'\n    ? usesSourceSans3(element.children)\n    : element.type === 'text' && element.fontFamily.includes('Source Sans 3'));\n}\n\n// \u2500\u2500\u2500 Element Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderElement(\n  el: SceneElement,\n  depth: number,\n  markerMetrics: Map<string, MarkerMetrics>,\n): string {\n  const pad = '  '.repeat(depth);\n\n  switch (el.type) {\n    case 'rect': {\n      const rx = el.rx != null ? ` rx=\"${el.rx}\"` : '';\n      const fillOpacity = el.fillOpacity != null ? ` fill-opacity=\"${el.fillOpacity}\"` : '';\n      const opacity = el.opacity != null ? ` opacity=\"${el.opacity}\"` : '';\n      return `${pad}<rect x=\"${el.bounds.x}\" y=\"${el.bounds.y}\" width=\"${el.bounds.width}\" height=\"${el.bounds.height}\" fill=\"${fillVal(el.fill)}\"${fillOpacity} stroke=\"${el.stroke}\" stroke-width=\"${el.strokeWidth}\"${rx}${opacity} />`;\n    }\n\n    case 'circle': {\n      const opacity = el.opacity != null ? ` opacity=\"${el.opacity}\"` : '';\n      return `${pad}<circle cx=\"${el.center.x}\" cy=\"${el.center.y}\" r=\"${el.radius}\" fill=\"${fillVal(el.fill)}\" stroke=\"${el.stroke}\" stroke-width=\"${el.strokeWidth}\"${opacity} />`;\n    }\n\n    case 'text': {\n      const anchor = el.anchor != null ? ` text-anchor=\"${el.anchor}\"` : '';\n      const weight = el.fontWeight != null ? ` font-weight=\"${el.fontWeight}\"` : '';\n      const opacity = el.opacity != null ? ` opacity=\"${el.opacity}\"` : '';\n      return `${pad}<text x=\"${el.position.x}\" y=\"${el.position.y}\" font-size=\"${el.fontSize}\" font-family=\"${escapeAttr(el.fontFamily)}\" fill=\"${fillVal(el.fill)}\"${anchor}${weight}${opacity}>${escapeXml(el.content)}</text>`;\n    }\n\n    case 'path': {\n      const drawLength = el.animated === 'draw' ? pathLengthApprox(el.d) : undefined;\n      const dashValue = drawLength != null ? `${drawLength} ${drawLength}` : el.strokeDasharray;\n      const dash = dashValue != null ? ` stroke-dasharray=\"${escapeAttr(dashValue)}\"` : '';\n      const mEnd = el.markerEnd != null ? ` marker-end=\"url(#${escapeAttr(el.markerEnd)})\"` : '';\n      const mStart =\n        el.markerStart != null ? ` marker-start=\"url(#${escapeAttr(el.markerStart)})\"` : '';\n      const fill = ` fill=\"${fillVal(el.fill)}\"`;\n      const opacity = el.opacity != null ? ` opacity=\"${el.opacity}\"` : '';\n      const stroke =\n        el.animated === 'flow' ? `url(#${flowGradientId(el.d, el.stroke)})` : el.stroke;\n      const attrs = `${pad}<path d=\"${escapeAttr(el.d)}\" stroke=\"${escapeAttr(stroke)}\" stroke-width=\"${el.strokeWidth}\"${fill}${dash}${mEnd}${mStart}${opacity}`;\n      if (el.animated === 'march' && el.strokeDasharray) {\n        const values = marchDashoffsetValues(el.strokeDasharray);\n        const animate = `<animate attributeName=\"stroke-dashoffset\" from=\"${values.from}\" to=\"${values.to}\" dur=\"${animationDuration('march')}\" repeatCount=\"indefinite\"/>`;\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'draw') {\n        const values = drawDashoffsetValues(drawLength ?? pathLengthApprox(el.d));\n        const animate = `<animate attributeName=\"stroke-dashoffset\" values=\"${values.join(';')}\" dur=\"${animationDuration('draw')}\" repeatCount=\"indefinite\"/>`;\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'pulse') {\n        const values = pulseStrokeWidthValues(el.strokeWidth).map(formatNum);\n        const animate = `<animate attributeName=\"stroke-width\" values=\"${values.join(';')}\" dur=\"${animationDuration('pulse')}\" repeatCount=\"indefinite\"/>`;\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'glow') {\n        const animate = `<animate attributeName=\"stroke-opacity\" values=\"${glowStrokeOpacityValues().join(';')}\" dur=\"${animationDuration('glow')}\" repeatCount=\"indefinite\"/>`;\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'colorcycle') {\n        const animate = `<animate attributeName=\"stroke\" values=\"${colorCycleStrokeValues().join(';')}\" dur=\"${animationDuration('colorcycle')}\" repeatCount=\"indefinite\"/>`;\n        return `${attrs}>\\n${pad}  ${animate}\\n${pad}</path>`;\n      }\n      if (el.animated === 'flow') {\n        const gradient = renderFlowGradient(el, pad);\n        return `${gradient}\\n${attrs} />`;\n      }\n      if (el.animated === 'particle') {\n        const spec = motionParticleSpecs('particle')[0]!;\n        const motionPath = trimMotionPathForArrowhead(\n          el.d,\n          motionArrowheadClearance(el, spec.radius, markerMetrics),\n        );\n        const circle = renderMotionCircle(motionPath, el.stroke, spec, 'particle', pad);\n        return `${attrs} />\\n${circle}`;\n      }\n      if (el.animated === 'comet') {\n        const specs = motionParticleSpecs('comet');\n        const motionPath = trimMotionPathForArrowhead(\n          el.d,\n          motionArrowheadClearance(el, specs[0]!.radius, markerMetrics),\n        );\n        const circles = specs\n          .map((spec) => renderMotionCircle(motionPath, el.stroke, spec, 'comet', pad))\n          .join('\\n');\n        return `${attrs} />\\n${circles}`;\n      }\n      if (el.animated === 'stream') {\n        const specs = motionParticleSpecs('stream');\n        const motionPath = trimMotionPathForArrowhead(\n          el.d,\n          motionArrowheadClearance(el, specs[0]!.radius, markerMetrics),\n        );\n        const circles = specs\n          .map((spec) => renderMotionCircle(motionPath, el.stroke, spec, 'stream', pad))\n          .join('\\n');\n        return `${attrs} />\\n${circles}`;\n      }\n      return `${attrs} />`;\n    }\n\n    case 'icon': {\n      return renderIcon(el, depth);\n    }\n\n    case 'group': {\n      const id = el.id != null ? ` id=\"${escapeAttr(el.id)}\"` : '';\n      const transform = el.transform != null ? ` transform=\"${escapeAttr(el.transform)}\"` : '';\n      const opacity = el.opacity != null ? ` opacity=\"${el.opacity}\"` : '';\n      if (el.children.length === 0) {\n        return `${pad}<g${id}${transform}${opacity} />`;\n      }\n      const inner = el.children.map((c) => renderElement(c, depth + 1, markerMetrics)).join('\\n');\n      return `${pad}<g${id}${transform}${opacity}>\\n${inner}\\n${pad}</g>`;\n    }\n  }\n}\n\n// \u2500\u2500\u2500 Icon Rendering \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Module-level counter for namespacing brand icon gradient/clip IDs.\n * Incremented once per brand icon emitted; never reset (monotonic within a\n * process lifetime). Produces unique prefixes like \"icn0-\", \"icn1-\", etc.\n */\nlet iconEmitCounter = 0;\n\n/** Render a SceneIcon as a nested <svg> element. */\nfunction renderIcon(el: SceneIcon, depth: number): string {\n  const pad = '  '.repeat(depth);\n  const { icon, x, y, size } = el;\n  const { viewBox, transforms, colorMode } = icon;\n\n  const vbW = viewBox.width;\n  const vbH = viewBox.height;\n  const vbL = viewBox.left;\n  const vbT = viewBox.top;\n\n  // Scale to fit size\u00D7size box preserving aspect ratio; center inside box.\n  const scale = Math.min(size / vbW, size / vbH);\n  const scaledW = formatNum(vbW * scale);\n  const scaledH = formatNum(vbH * scale);\n  const offX = formatNum(x + (size - vbW * scale) / 2);\n  const offY = formatNum(y + (size - vbH * scale) / 2);\n\n  // Monochrome tint via CSS color inheritance.\n  const styleAttr =\n    colorMode === 'monochrome' && el.color ? ` style=\"color:${escapeAttr(el.color)}\"` : '';\n  const opacityAttr = el.opacity != null ? ` opacity=\"${el.opacity}\"` : '';\n\n  // Build body \u2014 namespace brand IDs or use verbatim.\n  const body =\n    colorMode === 'brand' ? namespaceIconIds(icon.body, `icn${iconEmitCounter++}`) : icon.body;\n\n  // Transform (rotate/flip) applied inside the icon's viewBox coordinate space.\n  const cx = vbL + vbW / 2;\n  const cy = vbT + vbH / 2;\n  const innerTransform = buildIconTransform(transforms, cx, cy);\n\n  const vbAttr = `${vbL} ${vbT} ${formatNum(vbW)} ${formatNum(vbH)}`;\n  const inner = innerTransform\n    ? `${pad}  <g transform=\"${innerTransform}\">${body}</g>`\n    : `${pad}  ${body}`;\n\n  return [\n    `${pad}<svg x=\"${offX}\" y=\"${offY}\" width=\"${scaledW}\" height=\"${scaledH}\" viewBox=\"${vbAttr}\"${styleAttr}${opacityAttr}>`,\n    inner,\n    `${pad}</svg>`,\n  ].join('\\n');\n}\n\n/**\n * Build an SVG transform string that applies rotate then flip around (cx, cy).\n * Returns null when no transform is needed (identity).\n *\n * Transform order (icon spec): rotate first, then flips.\n * SVG applies transforms right-to-left, so the string is:\n *   translate(cx cy) scale(sf vf) rotate(deg) translate(-cx -cy)\n * which maps to: move center to origin \u2192 rotate \u2192 flip \u2192 move back.\n */\nfunction buildIconTransform(t: IconTransforms, cx: number, cy: number): string | null {\n  if (t.rotate === 0 && !t.hFlip && !t.vFlip) return null;\n\n  const deg = t.rotate * 90;\n  const sf = t.hFlip ? -1 : 1;\n  const vf = t.vFlip ? -1 : 1;\n  const cxs = formatNum(cx);\n  const cys = formatNum(cy);\n\n  const parts: string[] = [];\n  parts.push(`translate(${cxs} ${cys})`);\n  if (t.hFlip || t.vFlip) parts.push(`scale(${sf} ${vf})`);\n  if (t.rotate !== 0) parts.push(`rotate(${deg})`);\n  parts.push(`translate(${formatNum(-cx)} ${formatNum(-cy)})`);\n\n  return parts.join(' ');\n}\n\n/**\n * Namespace all id=\"...\" values in a brand icon body and rewrite matching\n * url(#id) and href=\"#id\" references. Prevents ID collisions when multiple\n * brand icons with gradients or clip-paths appear in the same SVG document.\n *\n * Strategy: collect all id= values, then globally replace them and their refs.\n * Uses a per-emit prefix (e.g. \"icn3\") generated from the module counter.\n */\nfunction namespaceIconIds(body: string, prefix: string): string {\n  const idRe = /\\bid=\"([^\"]+)\"/g;\n  const ids = new Set<string>();\n  let m: RegExpExecArray | null;\n\n  while ((m = idRe.exec(body)) !== null) {\n    ids.add(m[1]!);\n  }\n  if (ids.size === 0) return body;\n\n  let result = body;\n  for (const id of ids) {\n    const newId = `${prefix}-${id}`;\n    // id declarations\n    result = result.split(`id=\"${id}\"`).join(`id=\"${newId}\"`);\n    // url(#id) fill/stroke refs\n    result = result.split(`url(#${id})`).join(`url(#${newId})`);\n    // href=\"#id\" (xlink or plain)\n    result = result.split(`href=\"#${id}\"`).join(`href=\"#${newId}\"`);\n    result = result.split(`href='#${id}'`).join(`href='#${newId}'`);\n  }\n  return result;\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction renderMotionCircle(\n  path: string,\n  fill: string,\n  spec: { readonly radius: number; readonly opacity?: number; readonly phase: number },\n  animation: 'particle' | 'comet' | 'stream',\n  pad: string,\n): string {\n  const opacityAttr = spec.opacity != null ? ` opacity=\"${spec.opacity}\"` : '';\n  const beginSeconds = motionBeginSeconds(animation, spec.phase);\n  const begin = beginSeconds === 0 ? '0s' : `${formatNum(beginSeconds)}s`;\n  return `${pad}<circle r=\"${spec.radius}\" fill=\"${escapeAttr(fill)}\"${opacityAttr}>\\n${pad}  <animateMotion dur=\"${animationDuration(animation)}\" begin=\"${begin}\" repeatCount=\"indefinite\" rotate=\"auto\" path=\"${escapeAttr(path)}\"/>\\n${pad}</circle>`;\n}\n\ninterface MarkerMetrics {\n  readonly refX: number;\n  readonly markerUnits: 'strokeWidth' | 'userSpaceOnUse';\n}\n\nconst DEFAULT_MARKER_REF_X = 7;\nconst MIN_MOTION_SEGMENT_LENGTH = 1;\n\nfunction trimMotionPathForArrowhead(path: string, clearance: number): string {\n  if (clearance <= 0) return path;\n  const pts = pathPoints(path);\n  if (pts.length < 2) return path;\n\n  const end = pts[pts.length - 1]!;\n  for (let i = pts.length - 2; i >= 0; i--) {\n    const a = pts[i]!;\n    const b = pts[i + 1]!;\n    const distA = Math.hypot(end.x - a.x, end.y - a.y);\n    const distB = Math.hypot(end.x - b.x, end.y - b.y);\n    if (distA >= clearance && distB <= clearance) {\n      const dx = b.x - a.x;\n      const dy = b.y - a.y;\n      const fx = a.x - end.x;\n      const fy = a.y - end.y;\n      const qa = dx * dx + dy * dy;\n      const qb = 2 * (fx * dx + fy * dy);\n      const qc = fx * fx + fy * fy - clearance * clearance;\n      const discriminant = qb * qb - 4 * qa * qc;\n      if (qa > 0 && discriminant >= 0) {\n        const roots = [\n          (-qb - Math.sqrt(discriminant)) / (2 * qa),\n          (-qb + Math.sqrt(discriminant)) / (2 * qa),\n        ].filter((t) => t >= 0 && t <= 1);\n        const t = roots.sort((left, right) => right - left)[0];\n        if (t != null) {\n          return [...pts.slice(0, i + 1), { x: a.x + dx * t, y: a.y + dy * t }]\n            .map((pt, j) => `${j === 0 ? 'M' : 'L'} ${formatNum(pt.x)} ${formatNum(pt.y)}`)\n            .join(' ');\n        }\n      }\n    }\n  }\n\n  let totalLength = 0;\n  const segmentLengths: number[] = [];\n  for (let i = 1; i < pts.length; i++) {\n    const a = pts[i - 1]!;\n    const b = pts[i]!;\n    const segmentLength = Math.hypot(b.x - a.x, b.y - a.y);\n    segmentLengths.push(segmentLength);\n    totalLength += segmentLength;\n  }\n  if (totalLength === 0) return path;\n\n  const targetLength =\n    totalLength > MIN_MOTION_SEGMENT_LENGTH\n      ? Math.max(MIN_MOTION_SEGMENT_LENGTH, totalLength - clearance)\n      : totalLength / 2;\n  let walked = 0;\n  const motionPts = [pts[0]!];\n  for (let i = 1; i < pts.length; i++) {\n    const segmentLength = segmentLengths[i - 1]!;\n    if (segmentLength === 0) continue;\n    const a = pts[i - 1]!;\n    const b = pts[i]!;\n    if (walked + segmentLength >= targetLength) {\n      const t = (targetLength - walked) / segmentLength;\n      motionPts.push({\n        x: a.x + (b.x - a.x) * t,\n        y: a.y + (b.y - a.y) * t,\n      });\n      break;\n    }\n    motionPts.push(b);\n    walked += segmentLength;\n  }\n  return motionPts\n    .map((pt, i) => `${i === 0 ? 'M' : 'L'} ${formatNum(pt.x)} ${formatNum(pt.y)}`)\n    .join(' ');\n}\n\nfunction motionArrowheadClearance(\n  el: Extract<SceneElement, { type: 'path' }>,\n  dotRadius: number,\n  markerMetrics: Map<string, MarkerMetrics>,\n): number {\n  if (el.markerEnd == null) return 0;\n  const marker = markerMetrics.get(el.markerEnd) ?? {\n    refX: DEFAULT_MARKER_REF_X,\n    markerUnits: 'strokeWidth' as const,\n  };\n  const markerBackOffset =\n    marker.markerUnits === 'strokeWidth' ? marker.refX * el.strokeWidth : marker.refX;\n  return markerBackOffset + dotRadius;\n}\n\nfunction markerMetricsById(defs: readonly string[]): Map<string, MarkerMetrics> {\n  const markers = new Map<string, MarkerMetrics>();\n  for (const def of defs) {\n    for (const match of def.matchAll(/<marker\\b[^>]*>/g)) {\n      const marker = match[0];\n      const id = attrValue(marker, 'id');\n      const refX = attrNumber(marker, 'refX');\n      if (id == null || refX == null) continue;\n      const markerUnits =\n        attrValue(marker, 'markerUnits') === 'userSpaceOnUse' ? 'userSpaceOnUse' : 'strokeWidth';\n      markers.set(id, { refX, markerUnits });\n    }\n  }\n  return markers;\n}\n\nfunction attrValue(text: string, name: string): string | undefined {\n  return (\n    text.match(new RegExp(`\\\\b${name}\\\\s*=\\\\s*\"([^\"]+)\"`))?.[1] ??\n    text.match(new RegExp(`\\\\b${name}\\\\s*=\\\\s*'([^']+)'`))?.[1]\n  );\n}\n\nfunction attrNumber(text: string, name: string): number | undefined {\n  const value = attrValue(text, name);\n  if (value == null) return undefined;\n  const n = Number.parseFloat(value);\n  return Number.isFinite(n) ? n : undefined;\n}\n\nfunction renderFlowGradient(el: Extract<SceneElement, { type: 'path' }>, pad: string): string {\n  const id = flowGradientId(el.d, el.stroke);\n  const { start, end } = pathEndpoints(el.d);\n  const base = escapeAttr(el.stroke);\n  return [\n    `${pad}<defs>`,\n    `${pad}  <linearGradient id=\"${id}\" gradientUnits=\"userSpaceOnUse\" x1=\"${start.x}\" y1=\"${start.y}\" x2=\"${end.x}\" y2=\"${end.y}\">`,\n    `${pad}    <stop offset=\"0%\" stop-color=\"${base}\" stop-opacity=\"0.75\"/>`,\n    `${pad}    <stop offset=\"20%\" stop-color=\"${base}\" stop-opacity=\"0.85\">`,\n    `${pad}      <animate attributeName=\"offset\" values=\"${flowStopOffsetValues(0)\n      .map((v) => `${v}%`)\n      .join(';')}\" dur=\"${animationDuration('flow')}\" repeatCount=\"indefinite\"/>`,\n    `${pad}    </stop>`,\n    `${pad}    <stop offset=\"35%\" stop-color=\"#FFFFFF\" stop-opacity=\"1\">`,\n    `${pad}      <animate attributeName=\"offset\" values=\"${flowStopOffsetValues(1)\n      .map((v) => `${v}%`)\n      .join(';')}\" dur=\"${animationDuration('flow')}\" repeatCount=\"indefinite\"/>`,\n    `${pad}    </stop>`,\n    `${pad}    <stop offset=\"50%\" stop-color=\"${base}\" stop-opacity=\"0.85\">`,\n    `${pad}      <animate attributeName=\"offset\" values=\"${flowStopOffsetValues(2)\n      .map((v) => `${v}%`)\n      .join(';')}\" dur=\"${animationDuration('flow')}\" repeatCount=\"indefinite\"/>`,\n    `${pad}    </stop>`,\n    `${pad}    <stop offset=\"100%\" stop-color=\"${base}\" stop-opacity=\"0.75\"/>`,\n    `${pad}  </linearGradient>`,\n    `${pad}</defs>`,\n  ].join('\\n');\n}\n\nfunction flowGradientId(path: string, stroke: string): string {\n  return `triton-flow-${hashString(`${path}|${stroke}`)}`;\n}\n\nfunction pathEndpoints(path: string): {\n  start: { x: number; y: number };\n  end: { x: number; y: number };\n} {\n  const pts = pathPoints(path);\n  const start = pts[0] ?? { x: 0, y: 0 };\n  const end = pts[pts.length - 1] ?? { x: 1, y: 0 };\n  if (start.x === end.x && start.y === end.y) {\n    return { start, end: { x: end.x + 1, y: end.y } };\n  }\n  return { start, end };\n}\n\nfunction hashString(value: string): string {\n  let hash = 0x811c9dc5;\n  for (let i = 0; i < value.length; i++) {\n    hash ^= value.charCodeAt(i);\n    hash = Math.imul(hash, 0x01000193);\n  }\n  return (hash >>> 0).toString(36);\n}\n\nfunction fillVal(fill: string | null | undefined): string {\n  return fill != null && fill.trim() !== '' ? fill : 'none';\n}\n\nfunction escapeXml(text: string): string {\n  return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nfunction escapeAttr(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/\"/g, '&quot;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\n// \u2500\u2500\u2500 Anchor manifest embed \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Embed a JSON anchor manifest into an SVG string as an inert data script tag,\n * immediately before the closing `</svg>`.\n *\n * The JSON object has keys sorted deterministically so the output is stable\n * across invocations. Any `</` sequences inside the JSON are escaped as `<\\/`\n * so they cannot accidentally terminate the script element.\n */\nexport function embedAnchorManifest(svg: string, anchors: NodeAnchorRegistry): string {\n  const sorted: Record<string, unknown> = {};\n  for (const key of Object.keys(anchors).sort()) {\n    sorted[key] = anchors[key];\n  }\n  const json = JSON.stringify(sorted).replace(/<\\//g, '<\\\\/');\n  const block = `<script type=\"application/json\" id=\"triton-anchors\">${json}</script>`;\n  return svg.replace('</svg>', `${block}\\n</svg>`);\n}\n\n// \u2500\u2500\u2500 Reveal manifest embed \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Embed a progressive-reveal choreography into an SVG string as an inert data\n * script tag, immediately before the closing `</svg>`.\n *\n * This is reveal-specific output and is emitted ONLY by hosts that opt into\n * progressive reveal (e.g. Deckpilot) \u2014 never by the plain `renderSync` path.\n * Any `</` sequences inside the JSON are escaped as `<\\/` so they cannot\n * accidentally terminate the script element. The output is deterministic.\n */\nexport function embedRevealManifest(svg: string, reveal: RevealTrack): string {\n  const json = JSON.stringify(reveal).replace(/<\\//g, '<\\\\/');\n  const block = `<script type=\"application/json\" id=\"triton-reveal\">${json}</script>`;\n  return svg.replace('</svg>', `${block}\\n</svg>`);\n}\n\n// \u2500\u2500\u2500 Renderer object \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** The built-in SVG renderer. Registered by default in frontend/index.ts. */\nexport const svgRenderer: Renderer<string> = {\n  name: 'svg',\n  render: renderSVG,\n};\n", "/**\n * validateThemeInput\n *\n * Pure validator for external `.triton-theme.json` files. No file or network\n * I/O \u2014 only validates an already-parsed JSON value against the ThemeInput\n * contract. Returns a Result so callers never need try/catch.\n *\n * Policy (Cristian's decision): unknown keys at any level are a HARD ERROR,\n * not a warning. This catches typos early and keeps the schema unambiguous.\n */\n\nimport type { ThemeInput } from '../contracts/theme.js';\nimport { ok, err, type Result } from '../contracts/result.js';\nimport { themePresetNames } from './preset.js';\n\n// \u2500\u2500\u2500 isBuiltinThemeName \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Returns true iff `name` is one of the built-in preset names. */\nexport function isBuiltinThemeName(name: string): boolean {\n  return (themePresetNames as readonly string[]).includes(name);\n}\n\n// \u2500\u2500\u2500 Known key sets \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst TOP_LEVEL_KEYS = new Set([\n  'name',\n  'base',\n  'palette',\n  'typography',\n  'spacing',\n  'edges',\n  'panel',\n]);\n\nconst PALETTE_KEYS = new Set([\n  'primary',\n  'secondary',\n  'background',\n  'surface',\n  'border',\n  'text',\n  'textMuted',\n  'success',\n  'warning',\n  'error',\n]);\n\nconst TYPOGRAPHY_KEYS = new Set([\n  'fontFamily',\n  'monoFamily',\n  'baseFontSize',\n  'titleFontSize',\n  'smallFontSize',\n  'lineHeight',\n]);\n\nconst SPACING_KEYS = new Set(['unit', 'nodePadding', 'nodeGap', 'diagramMargin']);\n\nconst EDGES_KEYS = new Set(['strokeWidth', 'arrowSize', 'labelFontSize', 'curveTension']);\n\nconst PANEL_KEYS = new Set(['titleAlign', 'titlePosition', 'titleChrome']);\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst HEX_COLOR = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\nconst SLUG = /^[a-z0-9-]+$/;\nconst CSS_INJECTION = /url\\s*\\(|expression\\s*\\(/i;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n  return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction fail(message: string): Result<never> {\n  return err('THEME_VALIDATION_ERROR', message);\n}\n\n// \u2500\u2500\u2500 Group validators \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction validatePalette(\n  obj: unknown,\n): Result<Partial<import('../contracts/theme.js').ThemePalette>> {\n  if (!isPlainObject(obj)) return fail('\"palette\" must be a plain object');\n\n  for (const key of Object.keys(obj)) {\n    if (!PALETTE_KEYS.has(key)) return fail(`Unknown key in palette: \"${key}\"`);\n  }\n\n  for (const key of Object.keys(obj)) {\n    const val = obj[key];\n    if (typeof val !== 'string' || !HEX_COLOR.test(val)) {\n      return fail(\n        `palette.${key} must be a CSS hex color (e.g. \"#RGB\" or \"#RRGGBB\"), got ${JSON.stringify(val)}`,\n      );\n    }\n  }\n\n  return ok(obj as Partial<import('../contracts/theme.js').ThemePalette>);\n}\n\nfunction validateTypography(\n  obj: unknown,\n): Result<Partial<import('../contracts/theme.js').ThemeTypography>> {\n  if (!isPlainObject(obj)) return fail('\"typography\" must be a plain object');\n\n  for (const key of Object.keys(obj)) {\n    if (!TYPOGRAPHY_KEYS.has(key)) return fail(`Unknown key in typography: \"${key}\"`);\n  }\n\n  const stringFields = ['fontFamily', 'monoFamily'] as const;\n  for (const key of stringFields) {\n    if (key in obj) {\n      const val = obj[key];\n      if (typeof val !== 'string') return fail(`typography.${key} must be a string`);\n      if (CSS_INJECTION.test(val))\n        return fail(`typography.${key} contains disallowed CSS expression`);\n    }\n  }\n\n  const positiveFields = ['baseFontSize', 'titleFontSize', 'smallFontSize', 'lineHeight'] as const;\n  for (const key of positiveFields) {\n    if (key in obj) {\n      const val = obj[key];\n      if (typeof val !== 'number' || val <= 0) {\n        return fail(`typography.${key} must be a positive number, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  return ok(obj as Partial<import('../contracts/theme.js').ThemeTypography>);\n}\n\nfunction validateSpacing(\n  obj: unknown,\n): Result<Partial<import('../contracts/theme.js').ThemeSpacing>> {\n  if (!isPlainObject(obj)) return fail('\"spacing\" must be a plain object');\n\n  for (const key of Object.keys(obj)) {\n    if (!SPACING_KEYS.has(key)) return fail(`Unknown key in spacing: \"${key}\"`);\n  }\n\n  for (const key of Object.keys(obj)) {\n    const val = obj[key];\n    if (typeof val !== 'number' || val < 0) {\n      return fail(`spacing.${key} must be a non-negative number, got ${JSON.stringify(val)}`);\n    }\n  }\n\n  return ok(obj as Partial<import('../contracts/theme.js').ThemeSpacing>);\n}\n\nfunction validateEdges(obj: unknown): Result<Partial<import('../contracts/theme.js').ThemeEdges>> {\n  if (!isPlainObject(obj)) return fail('\"edges\" must be a plain object');\n\n  for (const key of Object.keys(obj)) {\n    if (!EDGES_KEYS.has(key)) return fail(`Unknown key in edges: \"${key}\"`);\n  }\n\n  const nonNegativeFields = ['strokeWidth', 'arrowSize', 'labelFontSize'] as const;\n  for (const key of nonNegativeFields) {\n    if (key in obj) {\n      const val = obj[key];\n      if (typeof val !== 'number' || val < 0) {\n        return fail(`edges.${key} must be a non-negative number, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  if ('curveTension' in obj) {\n    const val = obj['curveTension'];\n    if (typeof val !== 'number' || val < 0 || val > 1) {\n      return fail(\n        `edges.curveTension must be a number between 0 and 1, got ${JSON.stringify(val)}`,\n      );\n    }\n  }\n\n  return ok(obj as Partial<import('../contracts/theme.js').ThemeEdges>);\n}\n\nfunction validatePanel(obj: unknown): Result<Partial<import('../contracts/theme.js').ThemePanel>> {\n  if (!isPlainObject(obj)) return fail('\"panel\" must be a plain object');\n\n  for (const key of Object.keys(obj)) {\n    if (!PANEL_KEYS.has(key)) return fail(`Unknown key in panel: \"${key}\"`);\n  }\n\n  if ('titleAlign' in obj) {\n    const val = obj['titleAlign'];\n    if (val !== 'left' && val !== 'center' && val !== 'right') {\n      return fail(\n        `panel.titleAlign must be \"left\", \"center\", or \"right\", got ${JSON.stringify(val)}`,\n      );\n    }\n  }\n\n  if ('titlePosition' in obj) {\n    const val = obj['titlePosition'];\n    if (val !== 'inside' && val !== 'on-border' && val !== 'above') {\n      return fail(\n        `panel.titlePosition must be \"inside\", \"on-border\", or \"above\", got ${JSON.stringify(val)}`,\n      );\n    }\n  }\n\n  if ('titleChrome' in obj) {\n    const val = obj['titleChrome'];\n    if (val !== 'none' && val !== 'box' && val !== 'pill') {\n      return fail(`panel.titleChrome must be \"none\", \"box\", or \"pill\", got ${JSON.stringify(val)}`);\n    }\n  }\n\n  return ok(obj as Partial<import('../contracts/theme.js').ThemePanel>);\n}\n\n// \u2500\u2500\u2500 Main validator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Validate an unknown value against the ThemeInput contract.\n *\n * Pure and synchronous \u2014 never throws, never reads files.\n * Returns ok(ThemeInput) on success, err(...) on any violation.\n */\nexport function validateThemeInput(json: unknown): Result<ThemeInput> {\n  if (!isPlainObject(json)) {\n    return fail(\n      `ThemeInput must be a non-null plain object, got ${json === null ? 'null' : Array.isArray(json) ? 'array' : typeof json}`,\n    );\n  }\n\n  // Strict unknown-key check at top level\n  for (const key of Object.keys(json)) {\n    if (!TOP_LEVEL_KEYS.has(key)) return fail(`Unknown top-level key: \"${key}\"`);\n  }\n\n  const result: Record<string, unknown> = {};\n\n  // name\n  if ('name' in json) {\n    const v = json['name'];\n    if (typeof v !== 'string') return fail(`\"name\" must be a string, got ${JSON.stringify(v)}`);\n    if (v.length < 1 || v.length > 64)\n      return fail(`\"name\" must be 1\u201364 characters, got length ${v.length}`);\n    if (!SLUG.test(v)) return fail(`\"name\" must match ^[a-z0-9-]+$, got ${JSON.stringify(v)}`);\n    result['name'] = v;\n  }\n\n  // base\n  if ('base' in json) {\n    const v = json['base'];\n    if (typeof v !== 'string') return fail(`\"base\" must be a string, got ${JSON.stringify(v)}`);\n    if (!isBuiltinThemeName(v))\n      return fail(`\"base\" must be a built-in preset name; \"${v}\" is not recognised`);\n    result['base'] = v;\n  }\n\n  // palette\n  if ('palette' in json) {\n    const r = validatePalette(json['palette']);\n    if (!r.ok) return r;\n    result['palette'] = r.value;\n  }\n\n  // typography\n  if ('typography' in json) {\n    const r = validateTypography(json['typography']);\n    if (!r.ok) return r;\n    result['typography'] = r.value;\n  }\n\n  // spacing\n  if ('spacing' in json) {\n    const r = validateSpacing(json['spacing']);\n    if (!r.ok) return r;\n    result['spacing'] = r.value;\n  }\n\n  // edges\n  if ('edges' in json) {\n    const r = validateEdges(json['edges']);\n    if (!r.ok) return r;\n    result['edges'] = r.value;\n  }\n\n  // panel\n  if ('panel' in json) {\n    const r = validatePanel(json['panel']);\n    if (!r.ok) return r;\n    result['panel'] = r.value;\n  }\n\n  return ok(result as ThemeInput);\n}\n", "import type {\n  Scene,\n  ThemeInput,\n  Result,\n  BaseIR,\n  LayoutResult,\n  NodeAnchorRegistry,\n  LayoutOptions,\n  RevealTrack,\n} from '../contracts/index.js';\nimport type { IconPackMap } from '../contracts/icons.js';\nimport { ok, err } from '../contracts/index.js';\nimport { detect } from './detect.js';\nimport { stripComments } from './preprocess.js';\nimport { registerDiagram, getModule } from './registry.js';\nimport { registerRenderer, getRenderer } from '../render/registry.js';\nimport { defaultTheme, getThemePreset } from '../theme/preset.js';\nimport { resolveTheme } from '../theme/resolver.js';\nimport { validateThemeInput, isBuiltinThemeName } from '../theme/validate.js';\nimport { extractFrontmatter } from './frontmatter.js';\nimport { flowchart } from '../diagrams/mermaid/flowchart/index.js';\nimport { timeline } from '../diagrams/mermaid/timeline/index.js';\nimport { poster } from '../diagrams/triton/poster/index.js';\nimport { pie } from '../diagrams/mermaid/pie/index.js';\nimport { xychart } from '../diagrams/mermaid/xychart/index.js';\nimport { quadrant } from '../diagrams/mermaid/quadrant/index.js';\nimport { radar } from '../diagrams/mermaid/radar/index.js';\nimport { gantt } from '../diagrams/mermaid/gantt/index.js';\nimport { journey } from '../diagrams/mermaid/journey/index.js';\nimport { kanban } from '../diagrams/mermaid/kanban/index.js';\nimport { sequence } from '../diagrams/mermaid/sequence/index.js';\nimport { classDiagram } from '../diagrams/mermaid/class/index.js';\nimport { state } from '../diagrams/mermaid/state/index.js';\nimport { er } from '../diagrams/mermaid/er/index.js';\nimport { block } from '../diagrams/triton/block/index.js';\nimport { requirement } from '../diagrams/mermaid/requirement/index.js';\nimport { sankey } from '../diagrams/mermaid/sankey/index.js';\nimport { mindmap } from '../diagrams/mermaid/mindmap/index.js';\nimport { gitgraph } from '../diagrams/mermaid/gitgraph/index.js';\nimport { c4 } from '../diagrams/mermaid/c4/index.js';\nimport { architecture } from '../diagrams/mermaid/architecture/index.js';\nimport { packet } from '../diagrams/triton/packet/index.js';\nimport { tree } from '../diagrams/triton/ds/tree/index.js';\nimport { plan } from '../diagrams/triton/ds/tree/plan.js';\nimport { avl } from '../diagrams/triton/ds/tree/avl.js';\nimport { rbtree } from '../diagrams/triton/ds/tree/rbtree.js';\nimport { btree } from '../diagrams/triton/ds/tree/btree.js';\nimport { bplustree } from '../diagrams/triton/ds/tree/bplustree.js';\nimport { radix } from '../diagrams/triton/ds/tree/radix.js';\nimport { segtree } from '../diagrams/triton/ds/tree/segtree.js';\nimport { heap } from '../diagrams/triton/ds/tree/heap.js';\nimport { array } from '../diagrams/triton/ds/struct/array.js';\nimport { linkedlist } from '../diagrams/triton/ds/struct/linkedlist.js';\nimport { memory } from '../diagrams/triton/ds/struct/memory.js';\nimport { page } from '../diagrams/triton/ds/struct/page.js';\nimport { queue } from '../diagrams/triton/ds/queue/queue.js';\nimport { cqueue } from '../diagrams/triton/ds/queue/cqueue.js';\nimport { deque } from '../diagrams/triton/ds/queue/deque.js';\nimport { pqueue } from '../diagrams/triton/ds/queue/pqueue.js';\nimport { stack } from '../diagrams/triton/ds/stack/stack.js';\nimport { hashmap } from '../diagrams/triton/ds/hashmap/hashmap.js';\nimport { matrix } from '../diagrams/triton/ds/matrix/matrix.js';\nimport { trie } from '../diagrams/triton/ds/trie/trie.js';\nimport { graph } from '../diagrams/triton/ds/graph/graph.js';\nimport { unionfind } from '../diagrams/triton/ds/unionfind/unionfind.js';\nimport { topology } from '../diagrams/triton/topology/topology.js';\nimport { list } from '../diagrams/triton/deck/list/list.js';\nimport { merkletree } from '../diagrams/triton/ds/tree/merkletree.js';\nimport { lsmtree } from '../diagrams/triton/ds/tree/lsmtree.js';\nimport { behaviortree } from '../diagrams/triton/ds/tree/behaviortree.js';\nimport { quadtree } from '../diagrams/triton/ds/tree/quadtree.js';\nimport { treap } from '../diagrams/triton/ds/tree/treap.js';\nimport { tree234 } from '../diagrams/triton/ds/tree/tree234.js';\nimport { fishbone } from '../diagrams/triton/fishbone/index.js';\nimport { pyramid } from '../diagrams/triton/pyramid/index.js';\nimport { loop } from '../diagrams/triton/loop/index.js';\nimport { svgRenderer, embedAnchorManifest } from '../render/svg.js';\nimport { registerRouter } from '../routing/registry.js';\nimport {\n  straightRouter,\n  orthogonalRouter,\n  bezierRouter,\n  polylineRouter,\n} from '../routing/router.js';\n\n// \u2500\u2500\u2500 Register built-ins \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nregisterDiagram('flowchart', flowchart);\nregisterDiagram('timeline', timeline);\nregisterDiagram('poster', poster);\nregisterDiagram('pie', pie);\nregisterDiagram('xychart', xychart);\nregisterDiagram('quadrant', quadrant);\nregisterDiagram('radar', radar);\nregisterDiagram('gantt', gantt);\nregisterDiagram('journey', journey);\nregisterDiagram('kanban', kanban);\nregisterDiagram('sequence', sequence);\nregisterDiagram('class', classDiagram);\nregisterDiagram('state', state);\nregisterDiagram('er', er);\nregisterDiagram('block', block);\nregisterDiagram('requirement', requirement);\nregisterDiagram('sankey', sankey);\nregisterDiagram('mindmap', mindmap);\nregisterDiagram('gitgraph', gitgraph);\nregisterDiagram('c4', c4);\nregisterDiagram('architecture', architecture);\nregisterDiagram('packet', packet);\nregisterDiagram('tree', tree);\nregisterDiagram('plan', plan);\nregisterDiagram('avl', avl);\nregisterDiagram('rbtree', rbtree);\nregisterDiagram('btree', btree);\nregisterDiagram('bplustree', bplustree);\nregisterDiagram('b+tree', bplustree);\nregisterDiagram('radix', radix);\nregisterDiagram('segtree', segtree);\nregisterDiagram('heap', heap);\nregisterDiagram('array', array);\nregisterDiagram('linkedlist', linkedlist);\nregisterDiagram('memory', memory);\nregisterDiagram('page', page);\nregisterDiagram('queue', queue);\nregisterDiagram('cqueue', cqueue);\nregisterDiagram('deque', deque);\nregisterDiagram('pqueue', pqueue);\nregisterDiagram('stack', stack);\nregisterDiagram('hashmap', hashmap);\nregisterDiagram('matrix', matrix);\nregisterDiagram('trie', trie);\nregisterDiagram('nodegraph', graph);\nregisterDiagram('unionfind', unionfind);\nregisterDiagram('topology', topology);\nregisterDiagram('list', list);\nregisterDiagram('fishbone', fishbone);\nregisterDiagram('pyramid', pyramid);\nregisterDiagram('loop', loop);\nregisterDiagram('merkletree', merkletree);\nregisterDiagram('lsmtree', lsmtree);\nregisterDiagram('behaviortree', behaviortree);\nregisterDiagram('quadtree', quadtree);\nregisterDiagram('treap', treap);\nregisterDiagram('234tree', tree234);\nregisterDiagram('2-3-4tree', tree234);\nregisterRenderer(svgRenderer);\nregisterRouter('straight', straightRouter);\nregisterRouter('orthogonal', orthogonalRouter);\nregisterRouter('bezier', bezierRouter);\nregisterRouter('polyline', polylineRouter);\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Compile input text to a LayoutResult (Scene + anchor registry) \u2014 synchronous.\n *\n * Every Triton layout engine is synchronous (no font I/O, WASM, or fetching),\n * so the whole parse \u2192 theme \u2192 layout pipeline runs without promises. This is\n * the canonical implementation; the async `compile()` is a thin wrapper.\n *\n * Theme resolution order (later overrides earlier):\n *   defaultTheme \u2190 themeInput \u2190 module.defaultThemeOverride \u2190 ir.themeOverride\n *\n * Returns a Result \u2014 never throws.\n */\nexport function compileSync(\n  input: string,\n  themeInput?: ThemeInput,\n  forcedThemeName?: string,\n  icons?: IconPackMap,\n): Result<LayoutResult> {\n  const compiled = compileSyncWithTheme(input, themeInput, forcedThemeName, icons);\n  return compiled.ok ? ok(compiled.value.layout) : compiled;\n}\n\nfunction compileSyncWithTheme(\n  input: string,\n  themeInput?: ThemeInput,\n  forcedThemeName?: string,\n  icons?: IconPackMap,\n): Result<{ readonly layout: LayoutResult; readonly theme: ReturnType<typeof resolveTheme> }> {\n  const cleaned = stripComments(input);\n  const { metadata: fmMeta, body: fmBody } = extractFrontmatter(cleaned);\n  const { format, diagramType } = detect(cleaned);\n\n  const module = getModule(diagramType);\n  if (!module) {\n    return err('UNKNOWN_DIAGRAM', `No module registered for diagram type: ${diagramType}`);\n  }\n\n  try {\n    let ir: BaseIR;\n    if (format === 'yaml') {\n      ir = module.parseYaml(cleaned);\n    } else {\n      try {\n        ir = module.parseMermaid(cleaned);\n      } catch (firstErr) {\n        // If parsing with full frontmatter failed, try parsing the body without frontmatter (for custom DSLs)\n        if (Object.keys(fmMeta).length > 0) {\n          ir = module.parseMermaid(fmBody);\n        } else {\n          throw firstErr;\n        }\n      }\n    }\n\n    // Merge extracted frontmatter metadata with any metadata parsed by the module\n    const mergedMetadata = { ...fmMeta, ...(ir.metadata ?? {}) };\n    ir = { ...ir, metadata: mergedMetadata };\n\n    // Build theme: forced preset \u2192 metadata preset \u2192 global input \u2192 module defaults \u2192 per-IR override\n    const themeName = typeof mergedMetadata.theme === 'string' ? mergedMetadata.theme : undefined;\n    const base = resolveTheme(themeInput ?? {}, getThemePreset(forcedThemeName ?? themeName));\n    const withModuleDefaults = module.defaultThemeOverride\n      ? resolveTheme(module.defaultThemeOverride, base)\n      : base;\n    const finalTheme = ir.themeOverride\n      ? resolveTheme(ir.themeOverride, withModuleDefaults)\n      : withModuleDefaults;\n\n    const layoutOptions: LayoutOptions | undefined = icons !== undefined ? { icons } : undefined;\n    const result = module.layout(ir, finalTheme, layoutOptions);\n    return ok({ layout: result, theme: finalTheme });\n  } catch (cause) {\n    const message = cause instanceof Error ? cause.message : String(cause);\n    return err('PARSE_ERROR', message, cause);\n  }\n}\n\n/**\n * Render input text to an output string (default: SVG) \u2014 synchronous.\n *\n * This is the canonical render path; the async `render()` is a thin wrapper.\n * Returns a Result \u2014 never throws.\n * Pass rendererName to use a non-default registered renderer.\n */\nexport function renderSync(\n  input: string,\n  themeInput?: ThemeInput,\n  rendererName = 'svg',\n  forcedThemeName?: string,\n  icons?: IconPackMap,\n): Result<string> {\n  const compileResult = compileSync(input, themeInput, forcedThemeName, icons);\n  if (!compileResult.ok) return compileResult;\n\n  const renderer = getRenderer<string>(rendererName);\n  if (!renderer) {\n    return err('UNKNOWN_RENDERER', `No renderer registered: ${rendererName}`);\n  }\n\n  try {\n    return ok(renderer.render(compileResult.value.scene));\n  } catch (cause) {\n    const message = cause instanceof Error ? cause.message : String(cause);\n    return err('LAYOUT_ERROR', message, cause);\n  }\n}\n\n/**\n * Compile and render input text to SVG with an embedded anchor manifest.\n *\n * Identical parameter list to {@link renderSync}. Returns both the SVG string\n * (with the anchor manifest embedded as an inert `<script type=\"application/json\">`\n * element) and the raw anchor registry for callers that need programmatic access.\n *\n * Use this in interactive contexts (e.g. VS Code preview) where node-reference\n * discovery is desired. For plain SVG output (golden tests, markdown preview)\n * use {@link renderSync} \u2014 it is intentionally kept anchor-manifest-free.\n *\n * Returns a Result \u2014 never throws.\n */\nexport function compileAndRenderSync(\n  input: string,\n  themeInput?: ThemeInput,\n  rendererName = 'svg',\n  forcedThemeName?: string,\n  icons?: IconPackMap,\n): Result<{ svg: string; anchors: NodeAnchorRegistry; reveal?: RevealTrack }> {\n  const compileResult = compileSync(input, themeInput, forcedThemeName, icons);\n  if (!compileResult.ok) return compileResult;\n\n  const renderer = getRenderer<string>(rendererName);\n  if (!renderer) {\n    return err('UNKNOWN_RENDERER', `No renderer registered: ${rendererName}`);\n  }\n\n  try {\n    const { scene, anchors, reveal } = compileResult.value;\n    const svg = renderer.render(scene);\n    // `reveal` is returned as DATA (svg stays manifest-free, mirroring anchors).\n    // Hosts that opt into progressive reveal embed it via embedRevealManifest.\n    return ok(reveal ? { svg, anchors, reveal } : { svg, anchors });\n  } catch (cause) {\n    const message = cause instanceof Error ? cause.message : String(cause);\n    return err('LAYOUT_ERROR', message, cause);\n  }\n}\n\nexport function compileAndRenderWithThemeSync(\n  input: string,\n  themeInput?: ThemeInput,\n  rendererName = 'svg',\n  forcedThemeName?: string,\n  icons?: IconPackMap,\n): Result<{ svg: string; anchors: NodeAnchorRegistry; theme: ReturnType<typeof resolveTheme> }> {\n  const compileResult = compileSyncWithTheme(input, themeInput, forcedThemeName, icons);\n  if (!compileResult.ok) return compileResult;\n\n  const renderer = getRenderer<string>(rendererName);\n  if (!renderer) {\n    return err('UNKNOWN_RENDERER', `No renderer registered: ${rendererName}`);\n  }\n\n  try {\n    const { layout, theme } = compileResult.value;\n    const svg = renderer.render(layout.scene);\n    return ok({ svg, anchors: layout.anchors, theme });\n  } catch (cause) {\n    const message = cause instanceof Error ? cause.message : String(cause);\n    return err('LAYOUT_ERROR', message, cause);\n  }\n}\n\n/**\n * Compile input text to a LayoutResult (Scene + anchor registry).\n *\n * Async wrapper over {@link compileSync} \u2014 the signature and behavior are\n * unchanged for existing callers. Theme resolution order (later overrides\n * earlier):\n *   defaultTheme \u2190 themeInput \u2190 module.defaultThemeOverride \u2190 ir.themeOverride\n *\n * Returns a Result \u2014 never throws.\n */\nexport async function compile(\n  input: string,\n  themeInput?: ThemeInput,\n  forcedThemeName?: string,\n): Promise<Result<LayoutResult>> {\n  return compileSync(input, themeInput, forcedThemeName);\n}\n\n/**\n * Render input text to an output string (default: SVG).\n *\n * Async wrapper over {@link renderSync} \u2014 the signature and behavior are\n * unchanged for existing callers.\n *\n * Returns a Result \u2014 never throws.\n * Pass rendererName to use a non-default registered renderer.\n */\nexport async function render(\n  input: string,\n  themeInput?: ThemeInput,\n  rendererName = 'svg',\n  forcedThemeName?: string,\n): Promise<Result<string>> {\n  return renderSync(input, themeInput, rendererName, forcedThemeName);\n}\n\n// \u2500\u2500\u2500 Theme validation & Presets (re-exported for npm consumers) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport { validateThemeInput, isBuiltinThemeName } from '../theme/validate.js';\nexport { getThemePreset, themePresetNames, THEMES } from '../theme/preset.js';\nexport { resolveTheme } from '../theme/resolver.js';\n", "/**\n * SVG \u2192 vector PDF, pure-JS (pdfkit + svg-to-pdfkit). No system binaries.\n *\n * Triton's renderer emits an SVG string (see ../../src/render/svg.ts). LaTeX's\n * `\\includegraphics` cannot ingest SVG, so this module converts that SVG into a\n * single-page vector PDF whose page box is sized to the diagram's viewBox.\n *\n * Why these libraries:\n *   - `pdfkit` writes real vector PDF content streams (paths, text, fills) and\n *     embeds the base-14 fonts (Helvetica/Times/Courier) with NO external font\n *     file \u2014 so Triton text becomes selectable, scalable vector text with no\n *     font-drift between dev / CI / Overleaf.\n *   - `svg-to-pdfkit` walks the SVG DOM and replays it onto a pdfkit document:\n *     rects, circles, paths (incl. the `d=` data Triton emits), `<text>` with\n *     `text-anchor`, and `<marker>` arrowheads referenced via `marker-end`.\n *\n * SMIL animations (`<animate>`, `<animateMotion>`) are intentionally dropped \u2014\n * a PDF is static; the first frame is the correct print representation.\n */\n\n// pdfkit / svg-to-pdfkit are CJS and kept EXTERNAL by esbuild (real node_modules).\nimport PDFDocument from 'pdfkit';\nimport SVGtoPDF from 'svg-to-pdfkit';\n\nexport interface PdfOptions {\n  /** Uniform scale applied to the PDF page box (1 = SVG units \u2192 PDF points). */\n  readonly scale?: number;\n}\n\n/** Extract the intrinsic pixel size of a Triton SVG from width/height or viewBox. */\nexport function svgSize(svg: string): { width: number; height: number } {\n  const w = /\\bwidth=\"([\\d.]+)\"/.exec(svg);\n  const h = /\\bheight=\"([\\d.]+)\"/.exec(svg);\n  if (w && h) return { width: Number(w[1]), height: Number(h[1]) };\n\n  const vb = /viewBox=\"([\\d.\\s-]+)\"/.exec(svg);\n  if (vb) {\n    const parts = vb[1].trim().split(/[\\s,]+/).map(Number);\n    if (parts.length === 4) return { width: parts[2], height: parts[3] };\n  }\n  // Sensible fallback \u2014 keeps the converter from throwing on odd input.\n  return { width: 800, height: 600 };\n}\n\n/**\n * Convert a Triton SVG string to a vector PDF buffer.\n *\n * The PDF page is sized to (width \u00D7 scale) by (height \u00D7 scale) POINTS, with zero\n * margin, so the diagram fills the page edge-to-edge. `\\includegraphics` then\n * scales the whole page to the requested LaTeX width.\n */\nexport function svgToPdf(svg: string, opts: PdfOptions = {}): Promise<Buffer> {\n  const scale = opts.scale ?? 1;\n  const { width, height } = svgSize(svg);\n  const pageW = Math.max(1, width * scale);\n  const pageH = Math.max(1, height * scale);\n\n  return new Promise<Buffer>((resolvePromise, reject) => {\n    try {\n      const doc = new PDFDocument({\n        size: [pageW, pageH],\n        margin: 0,\n        // Compress the content stream \u2014 keeps committed PDFs small for Overleaf.\n        compress: true,\n      });\n\n      const chunks: Buffer[] = [];\n      doc.on('data', (c: Buffer) => chunks.push(c));\n      doc.on('end', () => resolvePromise(Buffer.concat(chunks)));\n      doc.on('error', reject);\n\n      SVGtoPDF(doc, svg, 0, 0, {\n        width: pageW,\n        height: pageH,\n        // Triton emits unit-less user coordinates that map 1:1 to points.\n        assumePt: true,\n        // Triton never relies on external CSS \u2014 attributes carry all style.\n        useCSS: false,\n      });\n\n      doc.end();\n    } catch (cause) {\n      reject(cause instanceof Error ? cause : new Error(String(cause)));\n    }\n  });\n}\n", "/**\n * latex/src/theme-resolve.ts\n *\n * Standalone theme-resolution logic for the triton-latex CLI.\n *\n * Intentionally imports ONLY Node built-ins and packages under ../../src/**\n * (the Triton core compiler). It does NOT import ./pdf.ts or any latex-only\n * dependency (pdfkit, svg-to-pdfkit), so it can be imported by vitest at root\n * `pnpm test` time without installing latex's isolated node_modules.\n *\n * Resolution priority (same as the CLI flag semantics):\n *   1. themeFile \u2192 loadThemeFile that path; throw on error (caller handles exit).\n *   2. Build registry: auto-discover .triton/themes/ ancestor + themesDir overlay.\n *      theme \u2192 registry lookup, then fall back to built-in preset.\n *   3. No args set \u2192 undefined (core uses frontmatter / default preset).\n */\n\nimport { resolve } from 'node:path';\nimport type { ResolvedTheme } from '../../src/contracts/theme.js';\nimport { loadThemeFile, discoverThemes, findTritonThemesDir } from '../../src/theme/discover.js';\nimport { getThemePreset } from '../../src/theme/preset.js';\n\n// \u2500\u2500\u2500 Public types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Minimal parameter interface for the theme-resolution inputs.\n * A superset of this (e.g. the full CLI Args) satisfies it structurally.\n */\nexport interface ThemeArgs {\n  themeFile?: string;\n  themesDir?: string;\n  theme?: string;\n}\n\n// \u2500\u2500\u2500 resolveCliTheme \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Resolve the theme to apply for a render, honouring flag priority:\n *\n *   1. themeFile \u2192 load that exact file; THROWS on error (no process.exit here \u2014\n *      the CLI entry point wraps calls in try/catch and exits with code 1).\n *   2. Build registry: auto-discover .triton/themes/ ancestor from `inputDir`,\n *      then overlay themesDir. Use `theme` to select by name (registry first,\n *      then built-in preset fallback).\n *   3. No args set \u2192 undefined (core uses diagram frontmatter / default preset).\n *\n * `inputDir` is the directory of the diagram being rendered, used for walk-up\n * auto-discovery. Never calls process.exit \u2014 never throws except on a bad\n * themeFile path (so the caller can catch and surface cleanly).\n */\nexport function resolveCliTheme(\n  args: ThemeArgs,\n  inputDir: string,\n): ResolvedTheme | undefined {\n  // Priority 1: explicit theme file\n  if (args.themeFile) {\n    const result = loadThemeFile(resolve(args.themeFile));\n    if (!result.ok) {\n      throw new Error(`--theme-file: ${result.error.message}`);\n    }\n    return result.value;\n  }\n\n  // Priority 2: build name registry\n  const registry = new Map<string, ResolvedTheme>();\n\n  // Auto-discover .triton/themes/ walking up from inputDir\n  const autoDir = findTritonThemesDir(inputDir);\n  if (autoDir) {\n    const { themes, warnings } = discoverThemes(autoDir);\n    for (const [name, theme] of themes) registry.set(name, theme);\n    for (const w of warnings) console.error(`warning: ${w}`);\n  }\n\n  // themesDir override (merged on top; overrides auto on collision)\n  if (args.themesDir) {\n    const { themes, warnings } = discoverThemes(resolve(args.themesDir));\n    for (const [name, theme] of themes) registry.set(name, theme);\n    for (const w of warnings) console.error(`warning: ${w}`);\n  }\n\n  // theme <name>: registry first, then built-in preset\n  if (args.theme) {\n    if (registry.has(args.theme)) {\n      return registry.get(args.theme)!;\n    }\n    // Falls back to built-in preset (getThemePreset returns default if unknown)\n    return getThemePreset(args.theme);\n  }\n\n  // No theme flags \u2014 core decides\n  return undefined;\n}\n", "/**\n * Theme Discovery Utility \u2014 src/theme/discover.ts\n *\n * Scans directories for `.triton-theme.json` files, validates them, resolves\n * them over their declared base preset, and returns a name\u2192ResolvedTheme\n * registry.\n *\n * \u26A0\uFE0F  This module performs filesystem I/O (node:fs / node:path).\n *     It MUST NOT be imported from src/index.ts or src/frontend/index.ts.\n *     Hosts (VS Code extension, triton-latex CLI) consume it by relative path:\n *       import { discoverThemes } from '../../src/theme/discover.js'\n */\n\nimport { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';\nimport { join, basename, resolve } from 'node:path';\nimport type { ResolvedTheme } from '../contracts/theme.js';\nimport { ok, err, type Result } from '../contracts/result.js';\nimport { validateThemeInput, isBuiltinThemeName } from './validate.js';\nimport { resolveTheme } from './resolver.js';\nimport { getThemePreset } from './preset.js';\n\n// \u2500\u2500\u2500 Public types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface ThemeDiscoveryResult {\n  /** Resolved themes keyed by name (declared `name` field or filename-derived). */\n  readonly themes: ReadonlyMap<string, ResolvedTheme>;\n  /** Human-readable warnings for skipped/invalid files. Never throws. */\n  readonly warnings: readonly string[];\n}\n\n// \u2500\u2500\u2500 Name derivation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst THEME_SUFFIX = '.triton-theme.json';\nconst SLUG = /^[a-z0-9-]+$/;\n\n/** Strip `.triton-theme.json` from a filename to derive a theme name. */\nfunction deriveNameFromFilename(filename: string): string {\n  return basename(filename, THEME_SUFFIX);\n}\n\n// \u2500\u2500\u2500 loadThemeFile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Load, validate, and resolve a single `.triton-theme.json` file.\n *\n * Returns ok(ResolvedTheme) on success, err(...) on any failure.\n * Never throws.\n */\nexport function loadThemeFile(filePath: string): Result<ResolvedTheme> {\n  // 1. Read file\n  let raw: string;\n  try {\n    raw = readFileSync(filePath, 'utf8');\n  } catch (cause) {\n    return err(\n      'THEME_VALIDATION_ERROR',\n      `Cannot read theme file \"${filePath}\": ${String(cause)}`,\n      cause,\n    );\n  }\n\n  // 2. Parse JSON\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(raw);\n  } catch (cause) {\n    return err(\n      'THEME_VALIDATION_ERROR',\n      `Invalid JSON in theme file \"${filePath}\": ${String(cause)}`,\n      cause,\n    );\n  }\n\n  // 3. Validate against ThemeInput schema (strict \u2014 unknown keys are errors)\n  const validated = validateThemeInput(parsed);\n  if (!validated.ok) {\n    return err(\n      'THEME_VALIDATION_ERROR',\n      `Theme file \"${filePath}\" failed validation: ${validated.error.message}`,\n      validated.error,\n    );\n  }\n\n  // 4. Resolve over declared base (or 'default' if absent)\n  const input = validated.value;\n  const baseName = ((parsed as Record<string, unknown>)['base'] as string | undefined) ?? 'default';\n  const base = getThemePreset(baseName);\n  const resolved = resolveTheme(input, base);\n\n  return ok(resolved);\n}\n\n// \u2500\u2500\u2500 discoverThemes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Scan `dir` for all `.triton-theme.json` files, load and resolve each one,\n * and return a name\u2192ResolvedTheme map plus any warnings for skipped files.\n *\n * Rules (Cristian's decisions):\n *  - Name = the theme's `name` field if present; else derived from filename.\n *  - Derived name must satisfy slug rule; if not \u2192 warning + skipped.\n *  - If name is a built-in preset name \u2192 warning + skipped (no shadowing).\n *  - Duplicate custom name within same dir \u2192 last wins + warning.\n *  - Errors (bad JSON, validation failure) \u2192 warning + skipped. Never throws.\n */\nexport function discoverThemes(dir: string): ThemeDiscoveryResult {\n  const themes = new Map<string, ResolvedTheme>();\n  const warnings: string[] = [];\n\n  // Gracefully handle missing directory\n  if (!existsSync(dir)) {\n    return { themes, warnings };\n  }\n\n  // Gracefully handle unreadable directory\n  let entries: string[];\n  try {\n    entries = readdirSync(dir);\n  } catch (cause) {\n    // A missing directory is the normal case (project has no custom themes) \u2014\n    // not a warning. Only surface genuinely unreadable/invalid paths (EACCES, ENOTDIR, \u2026).\n    const code = (cause as NodeJS.ErrnoException)?.code;\n    if (code !== 'ENOENT') {\n      warnings.push(`Cannot read themes directory \"${dir}\": ${String(cause)}`);\n    }\n    return { themes, warnings };\n  }\n\n  const themeFiles = entries.filter((e) => e.endsWith(THEME_SUFFIX));\n\n  for (const filename of themeFiles) {\n    const filePath = join(dir, filename);\n\n    // Load + validate + resolve\n    const result = loadThemeFile(filePath);\n    if (!result.ok) {\n      warnings.push(result.error.message);\n      continue;\n    }\n\n    const resolved = result.value;\n\n    // Determine registered name:\n    //   - declared `name` field in the file \u2192 use it (already validated as a slug)\n    //   - no `name` field \u2192 derive from filename\n    // We re-read the raw name field here rather than relying on resolved.name,\n    // because resolveTheme always fills name from the base preset when absent.\n    const name: string = extractNameFromFile(filePath) ?? deriveNameFromFilename(filename);\n\n    // Validate slug rule on derived name\n    if (!SLUG.test(name)) {\n      warnings.push(\n        `Theme file \"${filename}\": derived name \"${name}\" is not a valid slug (^[a-z0-9-]+$); skipped`,\n      );\n      continue;\n    }\n\n    // Built-in collision check\n    if (isBuiltinThemeName(name)) {\n      warnings.push(`Theme \"${name}\" shadows a built-in preset; skipped`);\n      continue;\n    }\n\n    // Duplicate within same dir \u2192 last wins + warning\n    if (themes.has(name)) {\n      warnings.push(\n        `Duplicate theme name \"${name}\": \"${filename}\" overrides an earlier definition`,\n      );\n    }\n\n    themes.set(name, resolved);\n  }\n\n  return { themes, warnings };\n}\n\n// \u2500\u2500\u2500 extractNameFromFile \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Read the `name` field directly from the raw JSON (returns null if absent or unreadable). */\nfunction extractNameFromFile(filePath: string): string | null {\n  try {\n    const raw = readFileSync(filePath, 'utf8');\n    const parsed = JSON.parse(raw) as Record<string, unknown>;\n    return typeof parsed['name'] === 'string' ? (parsed['name'] as string) : null;\n  } catch {\n    return null;\n  }\n}\n\n// \u2500\u2500\u2500 findTritonThemesDir \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Walk up from `startDir` looking for a `.triton/themes/` directory.\n * Returns its absolute path when found, or undefined if not found.\n *\n * Stops at the filesystem root or after 10 levels (infinite-loop guard).\n */\nexport function findTritonThemesDir(startDir: string): string | undefined {\n  const MAX_LEVELS = 10;\n  let current = resolve(startDir);\n\n  for (let level = 0; level < MAX_LEVELS; level++) {\n    const candidate = join(current, '.triton', 'themes');\n    try {\n      if (existsSync(candidate) && statSync(candidate).isDirectory()) {\n        return candidate;\n      }\n    } catch {\n      // permission error or similar \u2014 keep walking up\n    }\n\n    const parent = resolve(join(current, '..'));\n    if (parent === current) break; // filesystem root\n    current = parent;\n  }\n\n  return undefined;\n}\n", "/**\n * latex/src/icon-resolve.ts\n *\n * Standalone icon-pack resolution logic for the triton-latex CLI.\n *\n * Intentionally imports ONLY Node built-ins and packages under ../../src/**\n * (the Triton core compiler). It does NOT import ./pdf.ts or any latex-only\n * dependency (pdfkit, svg-to-pdfkit), so it can be imported by vitest at root\n * `pnpm test` time without installing latex's isolated node_modules.\n *\n * Resolution priority (mirrors resolveCliTheme's three-level pattern):\n *   1. iconPack  \u2192 loadIconPack that exact file; THROWS on error (no process.exit \u2014\n *                  caller wraps in try/catch and exits with code 1). Merged LAST\n *                  (highest precedence).\n *   2. iconsDir  \u2192 discoverIconPacks(iconsDir); merged on top of auto-discovery.\n *   3. Auto-discovery \u2192 findTritonIconsDir(inputDir) + discoverIconPacks.\n *\n * Duplicate prefix: later source wins (last-wins, consistent with discoverIconPacks).\n * Returns an empty map when no flags and no .triton/icons/ is found \u2014 valid.\n */\n\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport type { IconPackMap } from '../../src/contracts/icons.js';\nimport {\n  findTritonIconsDir,\n  discoverIconPacks,\n} from '../../src/icons/discover.js';\nimport { validateIconPack } from '../../src/icons/validate.js';\n\n// \u2500\u2500\u2500 Public types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Minimal parameter interface for icon-resolution inputs.\n * A superset (e.g. the full CLI Args) satisfies it structurally.\n */\nexport interface IconArgs {\n  iconPack?: string;\n  iconsDir?: string;\n}\n\n// \u2500\u2500\u2500 resolveCliIcons \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Resolve the icon packs to pass to the renderer, honouring flag priority:\n *\n *   1. --icon-pack <path> \u2014 load that exact .triton-icons.json file; THROWS on\n *      any error (not process.exit \u2014 the CLI catches and exits 1). Merged last\n *      so it takes precedence over all other sources.\n *   2. --icons-dir <dir>  \u2014 discover packs in that directory, merged on top of\n *      auto-discovery (overrides on duplicate prefix).\n *   3. Auto-discovery     \u2014 walk up from `inputDir` looking for .triton/icons/,\n *      load all packs found there (lowest precedence).\n *\n * Returns the combined IconPackMap (Map<prefix, IconifyJSON>).\n * Returns an empty map when no flags are set and no .triton/icons/ is found.\n * Never calls process.exit.\n */\nexport function resolveCliIcons(args: IconArgs, inputDir: string): IconPackMap {\n  const merged: IconPackMap = new Map();\n\n  // Priority 3 (lowest): auto-discover .triton/icons/ walking up from inputDir\n  const autoDir = findTritonIconsDir(inputDir);\n  if (autoDir) {\n    const { map, warnings } = discoverIconPacks(autoDir);\n    for (const [prefix, pack] of map) merged.set(prefix, pack);\n    for (const w of warnings) console.error(`warning: ${w}`);\n  }\n\n  // Priority 2: explicit --icons-dir (overrides auto on duplicate prefix)\n  if (args.iconsDir) {\n    const { map, warnings } = discoverIconPacks(resolve(args.iconsDir));\n    for (const [prefix, pack] of map) merged.set(prefix, pack);\n    for (const w of warnings) console.error(`warning: ${w}`);\n  }\n\n  // Priority 1 (highest): explicit --icon-pack file (throws on any error)\n  if (args.iconPack) {\n    const packPath = resolve(args.iconPack);\n\n    let raw: string;\n    try {\n      raw = readFileSync(packPath, 'utf8');\n    } catch (cause) {\n      throw new Error(`--icon-pack: cannot read \"${packPath}\": ${(cause as Error).message}`);\n    }\n\n    let parsed: unknown;\n    try {\n      parsed = JSON.parse(raw);\n    } catch (cause) {\n      throw new Error(`--icon-pack: invalid JSON in \"${packPath}\": ${(cause as Error).message}`);\n    }\n\n    const result = validateIconPack(parsed);\n    if (!result.ok) {\n      throw new Error(`--icon-pack: \"${packPath}\" failed validation: ${result.error.message}`);\n    }\n\n    merged.set(result.value.prefix, result.value);\n  }\n\n  return merged;\n}\n", "/**\n * Icon Pack Discovery Utility \u2014 src/icons/discover.ts\n *\n * Scans directories for `.triton-icons.json` files, validates them via\n * validateIconPack, and returns a prefix\u2192IconifyJSON map (IconPackMap)\n * for host consumption.\n *\n * \u26A0\uFE0F  This module performs filesystem I/O (node:fs / node:path).\n *     It MUST NOT be imported from src/index.ts or src/frontend/index.ts.\n *     Hosts (VS Code extension, triton-latex CLI) consume it by relative path:\n *       import { loadIconPacks } from '../../src/icons/discover.js'\n */\n\nimport { readFileSync, readdirSync, existsSync, statSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport type { IconifyJSON, IconPackMap } from '../contracts/icons.js';\nimport { validateIconPack } from './validate.js';\n\n// \u2500\u2500\u2500 Public types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface IconDiscoveryResult {\n  /** Loaded icon packs keyed by each pack's `prefix` field (the authoritative key). */\n  readonly map: IconPackMap;\n  /** Human-readable warnings for skipped/invalid files. Never throws. */\n  readonly warnings: readonly string[];\n}\n\n// \u2500\u2500\u2500 Constants \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ICON_SUFFIX = '.triton-icons.json';\n\n// \u2500\u2500\u2500 discoverIconPacks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Scan `dir` for all `.triton-icons.json` files, validate each one, and\n * return an IconPackMap keyed by each pack's `prefix` field, plus any\n * warnings for skipped files.\n *\n * Rules:\n *  - Key = the pack's `prefix` field (authoritative; filename is ignored for keying).\n *  - Missing directory \u2192 returns empty map + warning. Never throws.\n *  - Malformed JSON \u2192 warning + skipped.\n *  - Validation failure (validateIconPack returns err) \u2192 warning + skipped.\n *  - Duplicate prefix across files \u2192 last-wins + warning.\n *    (Mirrors theme discovery's duplicate-name policy: the later file in readdir\n *    order overrides any earlier definition with the same prefix.)\n */\nexport function discoverIconPacks(dir: string): IconDiscoveryResult {\n  const map: Map<string, IconifyJSON> = new Map();\n  const warnings: string[] = [];\n\n  // Gracefully handle missing directory\n  if (!existsSync(dir)) {\n    return { map, warnings };\n  }\n\n  // Gracefully handle unreadable directory\n  let entries: string[];\n  try {\n    entries = readdirSync(dir);\n  } catch (cause) {\n    // A missing directory is the normal case (project has no custom icon packs) \u2014\n    // not a warning. Only surface genuinely unreadable/invalid paths (EACCES, ENOTDIR, \u2026).\n    const code = (cause as NodeJS.ErrnoException)?.code;\n    if (code !== 'ENOENT') {\n      warnings.push(`Cannot read icons directory \"${dir}\": ${String(cause)}`);\n    }\n    return { map, warnings };\n  }\n\n  const iconFiles = entries.filter((e) => e.endsWith(ICON_SUFFIX));\n\n  for (const filename of iconFiles) {\n    const filePath = join(dir, filename);\n\n    // 1. Read file\n    let raw: string;\n    try {\n      raw = readFileSync(filePath, 'utf8');\n    } catch (cause) {\n      warnings.push(`Cannot read icon pack file \"${filePath}\": ${String(cause)}`);\n      continue;\n    }\n\n    // 2. Parse JSON\n    let parsed: unknown;\n    try {\n      parsed = JSON.parse(raw);\n    } catch (cause) {\n      warnings.push(`Invalid JSON in icon pack file \"${filePath}\": ${String(cause)}`);\n      continue;\n    }\n\n    // 3. Validate against IconifyJSON contract\n    const result = validateIconPack(parsed);\n    if (!result.ok) {\n      warnings.push(`Icon pack file \"${filePath}\" failed validation: ${result.error.message}`);\n      continue;\n    }\n\n    const pack = result.value;\n\n    // 4. Duplicate prefix \u2192 last-wins + warning\n    if (map.has(pack.prefix)) {\n      warnings.push(\n        `Duplicate icon pack prefix \"${pack.prefix}\": \"${filename}\" overrides an earlier definition`,\n      );\n    }\n\n    map.set(pack.prefix, pack);\n  }\n\n  return { map, warnings };\n}\n\n// \u2500\u2500\u2500 findTritonIconsDir \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Walk up from `startDir` looking for a `.triton/icons/` directory.\n * Returns its absolute path when found, or undefined if not found.\n *\n * Stops at the filesystem root or after 10 levels (infinite-loop guard).\n */\nexport function findTritonIconsDir(startDir: string): string | undefined {\n  const MAX_LEVELS = 10;\n  let current = resolve(startDir);\n\n  for (let level = 0; level < MAX_LEVELS; level++) {\n    const candidate = join(current, '.triton', 'icons');\n    try {\n      if (existsSync(candidate) && statSync(candidate).isDirectory()) {\n        return candidate;\n      }\n    } catch {\n      // permission error or similar \u2014 keep walking up\n    }\n\n    const parent = resolve(join(current, '..'));\n    if (parent === current) break; // filesystem root\n    current = parent;\n  }\n\n  return undefined;\n}\n\n// \u2500\u2500\u2500 loadIconPacks \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Convenience entry point for hosts: walk up from `startDir` to find the\n * nearest `.triton/icons/` directory, then discover and load all packs within it.\n *\n * Returns an empty map (with no warnings) when no `.triton/icons/` dir is found \u2014\n * a project without any icon packs is valid. Returns discoverIconPacks result\n * (map + warnings) when the directory is found.\n */\nexport function loadIconPacks(startDir: string): IconDiscoveryResult {\n  const iconsDir = findTritonIconsDir(startDir);\n  if (iconsDir === undefined) {\n    return { map: new Map(), warnings: [] };\n  }\n  return discoverIconPacks(iconsDir);\n}\n", "/**\n * validateIconPack\n *\n * Pure validator for `.triton-icons.json` icon pack files. No file or network\n * I/O \u2014 only validates an already-parsed JSON value against the IconifyJSON\n * contract. Returns a Result so callers never need try/catch.\n *\n * Strictness policy:\n *   - Top-level Triton keys: strict (unknown keys are an error).\n *   - IconData and IconAlias entries: strict (unknown keys are an error).\n *   - All required fields must be present with the correct types.\n *   - Icon names and prefix format are validated against the token grammar.\n *\n * Token grammar (enforced here):\n *   prefix  ::= [a-z][a-z0-9-]*\n *   name    ::= [a-z0-9][a-z0-9-]*\n */\n\nimport type { IconifyJSON, IconData, IconAlias } from '../contracts/icons.js';\nimport { ok, err, type Result } from '../contracts/result.js';\n\n// \u2500\u2500\u2500 Known key sets \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst TOP_LEVEL_KEYS = new Set(['prefix', 'icons', 'aliases', 'width', 'height', 'left', 'top']);\n\nconst ICON_DATA_KEYS = new Set([\n  'body',\n  'width',\n  'height',\n  'left',\n  'top',\n  'rotate',\n  'hFlip',\n  'vFlip',\n]);\n\nconst ICON_ALIAS_KEYS = new Set([\n  'parent',\n  'rotate',\n  'hFlip',\n  'vFlip',\n  'width',\n  'height',\n  'left',\n  'top',\n]);\n\n// \u2500\u2500\u2500 Token grammar regexes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/** Pack prefix: starts with a lowercase letter, then lowercase alnum/hyphens. */\nconst PREFIX_RE = /^[a-z][a-z0-9-]*$/;\n\n/** Icon/alias name: starts with lowercase alnum, then lowercase alnum/hyphens. */\nconst NAME_RE = /^[a-z0-9][a-z0-9-]*$/;\n\nconst VALID_ROTATE = new Set([0, 1, 2, 3]);\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n  return v !== null && typeof v === 'object' && !Array.isArray(v);\n}\n\nfunction fail(message: string): Result<never> {\n  return err('ICON_VALIDATION_ERROR', message);\n}\n\n// \u2500\u2500\u2500 IconData validator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction validateIconData(iconName: string, obj: unknown): Result<IconData> {\n  const ctx = `icons[\"${iconName}\"]`;\n\n  if (!isPlainObject(obj)) {\n    return fail(`${ctx} must be a plain object`);\n  }\n\n  for (const key of Object.keys(obj)) {\n    if (!ICON_DATA_KEYS.has(key)) {\n      return fail(`Unknown key in ${ctx}: \"${key}\"`);\n    }\n  }\n\n  // body \u2014 required, non-empty string\n  if (!('body' in obj)) {\n    return fail(`${ctx} is missing required field \"body\"`);\n  }\n  const body = obj['body'];\n  if (typeof body !== 'string' || body.length === 0) {\n    return fail(`${ctx}.body must be a non-empty string, got ${JSON.stringify(body)}`);\n  }\n\n  // width / height \u2014 optional positive numbers\n  for (const dim of ['width', 'height'] as const) {\n    if (dim in obj) {\n      const val = obj[dim];\n      if (typeof val !== 'number' || val <= 0) {\n        return fail(`${ctx}.${dim} must be a positive number, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  // left / top \u2014 optional numbers (may be zero or negative for unusual viewBoxes)\n  for (const origin of ['left', 'top'] as const) {\n    if (origin in obj) {\n      const val = obj[origin];\n      if (typeof val !== 'number') {\n        return fail(`${ctx}.${origin} must be a number, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  // rotate \u2014 optional, must be 0 | 1 | 2 | 3\n  if ('rotate' in obj) {\n    const val = obj['rotate'];\n    if (!VALID_ROTATE.has(val as number)) {\n      return fail(`${ctx}.rotate must be 0, 1, 2, or 3, got ${JSON.stringify(val)}`);\n    }\n  }\n\n  // hFlip / vFlip \u2014 optional booleans\n  for (const flip of ['hFlip', 'vFlip'] as const) {\n    if (flip in obj) {\n      const val = obj[flip];\n      if (typeof val !== 'boolean') {\n        return fail(`${ctx}.${flip} must be a boolean, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  return ok(obj as unknown as IconData);\n}\n\n// \u2500\u2500\u2500 IconAlias validator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction validateIconAlias(aliasName: string, obj: unknown): Result<IconAlias> {\n  const ctx = `aliases[\"${aliasName}\"]`;\n\n  if (!isPlainObject(obj)) {\n    return fail(`${ctx} must be a plain object`);\n  }\n\n  for (const key of Object.keys(obj)) {\n    if (!ICON_ALIAS_KEYS.has(key)) {\n      return fail(`Unknown key in ${ctx}: \"${key}\"`);\n    }\n  }\n\n  // parent \u2014 required, non-empty string\n  if (!('parent' in obj)) {\n    return fail(`${ctx} is missing required field \"parent\"`);\n  }\n  const parent = obj['parent'];\n  if (typeof parent !== 'string' || parent.length === 0) {\n    return fail(`${ctx}.parent must be a non-empty string, got ${JSON.stringify(parent)}`);\n  }\n\n  // rotate \u2014 optional, 0 | 1 | 2 | 3\n  if ('rotate' in obj) {\n    const val = obj['rotate'];\n    if (!VALID_ROTATE.has(val as number)) {\n      return fail(`${ctx}.rotate must be 0, 1, 2, or 3, got ${JSON.stringify(val)}`);\n    }\n  }\n\n  // hFlip / vFlip \u2014 optional booleans\n  for (const flip of ['hFlip', 'vFlip'] as const) {\n    if (flip in obj) {\n      const val = obj[flip];\n      if (typeof val !== 'boolean') {\n        return fail(`${ctx}.${flip} must be a boolean, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  // width / height \u2014 optional positive numbers\n  for (const dim of ['width', 'height'] as const) {\n    if (dim in obj) {\n      const val = obj[dim];\n      if (typeof val !== 'number' || val <= 0) {\n        return fail(`${ctx}.${dim} must be a positive number, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  // left / top \u2014 optional numbers\n  for (const origin of ['left', 'top'] as const) {\n    if (origin in obj) {\n      const val = obj[origin];\n      if (typeof val !== 'number') {\n        return fail(`${ctx}.${origin} must be a number, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  return ok(obj as unknown as IconAlias);\n}\n\n// \u2500\u2500\u2500 Main validator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Validate an unknown value against the IconifyJSON contract.\n *\n * Pure and synchronous \u2014 never throws, never reads files.\n * Returns ok(IconifyJSON) on success, err(ICON_VALIDATION_ERROR, ...) on any violation.\n *\n * Validates:\n *   - Required fields: prefix, icons\n *   - prefix format: [a-z][a-z0-9-]*\n *   - icons: at least one entry; each key matches [a-z0-9][a-z0-9-]*\n *   - Each IconData: required body, optional dims (positive), rotate (0\u20133), flips (boolean)\n *   - aliases: each alias key matches [a-z0-9][a-z0-9-]*; required parent\n *   - Pack-level dims: positive numbers if present\n *   - Unknown keys at any level: hard error\n */\nexport function validateIconPack(json: unknown): Result<IconifyJSON> {\n  if (!isPlainObject(json)) {\n    return fail(\n      `IconifyJSON must be a non-null plain object, got ${json === null ? 'null' : Array.isArray(json) ? 'array' : typeof json}`,\n    );\n  }\n\n  // Unknown top-level key check\n  for (const key of Object.keys(json)) {\n    if (!TOP_LEVEL_KEYS.has(key)) {\n      return fail(`Unknown top-level key: \"${key}\"`);\n    }\n  }\n\n  // prefix \u2014 required string matching [a-z][a-z0-9-]*\n  if (!('prefix' in json)) {\n    return fail('Missing required field \"prefix\"');\n  }\n  const prefix = json['prefix'];\n  if (typeof prefix !== 'string') {\n    return fail(`\"prefix\" must be a string, got ${JSON.stringify(prefix)}`);\n  }\n  if (!PREFIX_RE.test(prefix)) {\n    return fail(\n      `\"prefix\" must match ^[a-z][a-z0-9-]*$ (lowercase letter start, then lowercase alnum/hyphens), got ${JSON.stringify(prefix)}`,\n    );\n  }\n\n  // icons \u2014 required plain object with \u22651 entry\n  if (!('icons' in json)) {\n    return fail('Missing required field \"icons\"');\n  }\n  const iconsRaw = json['icons'];\n  if (!isPlainObject(iconsRaw)) {\n    return fail('\"icons\" must be a plain object');\n  }\n  const iconNames = Object.keys(iconsRaw);\n  if (iconNames.length === 0) {\n    return fail('\"icons\" must contain at least one icon entry');\n  }\n\n  const icons: Record<string, IconData> = {};\n  for (const name of iconNames) {\n    if (!NAME_RE.test(name)) {\n      return fail(\n        `Icon name ${JSON.stringify(name)} must match ^[a-z0-9][a-z0-9-]*$ (lowercase alnum start, then lowercase alnum/hyphens)`,\n      );\n    }\n    const r = validateIconData(name, iconsRaw[name]);\n    if (!r.ok) return r;\n    icons[name] = r.value;\n  }\n\n  // aliases \u2014 optional plain object\n  let aliases: Record<string, IconAlias> | undefined;\n  if ('aliases' in json) {\n    const aliasesRaw = json['aliases'];\n    if (!isPlainObject(aliasesRaw)) {\n      return fail('\"aliases\" must be a plain object');\n    }\n    aliases = {};\n    for (const aliasName of Object.keys(aliasesRaw)) {\n      if (!NAME_RE.test(aliasName)) {\n        return fail(`Alias name ${JSON.stringify(aliasName)} must match ^[a-z0-9][a-z0-9-]*$`);\n      }\n      const r = validateIconAlias(aliasName, aliasesRaw[aliasName]);\n      if (!r.ok) return r;\n      aliases[aliasName] = r.value;\n    }\n  }\n\n  // Pack-level dimension defaults \u2014 optional positive numbers (width/height) or numbers (left/top)\n  for (const dim of ['width', 'height'] as const) {\n    if (dim in json) {\n      const val = json[dim];\n      if (typeof val !== 'number' || val <= 0) {\n        return fail(`\"${dim}\" must be a positive number, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n  for (const origin of ['left', 'top'] as const) {\n    if (origin in json) {\n      const val = json[origin];\n      if (typeof val !== 'number') {\n        return fail(`\"${origin}\" must be a number, got ${JSON.stringify(val)}`);\n      }\n    }\n  }\n\n  const result: IconifyJSON = {\n    prefix: prefix as string,\n    icons,\n    ...(aliases !== undefined ? { aliases } : {}),\n    ...('width' in json ? { width: json['width'] as number } : {}),\n    ...('height' in json ? { height: json['height'] as number } : {}),\n    ...('left' in json ? { left: json['left'] as number } : {}),\n    ...('top' in json ? { top: json['top'] as number } : {}),\n  };\n\n  return ok(result);\n}\n"],
  "mappings": "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AI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,aAAa,KAAK;AACtD,MAAI,SAAS,uBAAuB,SAAS,KAAK;AAClD,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC9E,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,GAAG,GAAG,MAAM,KAAK;AACrD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,MAAM,GAAG,GAAG,MAAM,KAAK;AAC3D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,GAAG,GAAG,MAAM,KAAK;AACrD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,cAAc,KAAK;AACxD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO,KAAK;AAC/F,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,uBAAuB,cAAc,KAAK;AACxD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK;AACrE,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC9E,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAM,MAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,MAAM,KAAK;AAC/G,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAG,GAAG,MAAM,KAAK;AACrD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAG,GAAG,MAAM,KAAK;AACrD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAG,GAAG,MAAM,KAAK;AACrD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,qBAAqB,CAAC,MAAM,GAAG,GAAG,MAAM,KAAK;AAC3D,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,WAAW,KAAK;AACrD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,WAAW,uBAAuB,KAAK,KAAK;AAChD,MAAI,WAAW,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC9D,MAAI,WAAW,uBAAuB,UAAU,KAAK;AACrD,MAAI,WAAW,uBAAuB,gBAAgB,KAAK;AAC3D,MAAI,WAAW,uBAAuB,eAAe,KAAK;AAC1D,MAAI,WAAW,uBAAuB,aAAa,KAAK;AACxD,MAAI,WAAW,uBAAuB,YAAY,KAAK;AACvD,MAAI,WAAW,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC5D,MAAI,WAAW,qBAAqB,qBAAqB;AACzD,MAAI,WAAW,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAC7D,MAAI,WAAW,qBAAqB,qBAAqB;AACzD,MAAI,WAAW,qBAAqB,SAAS;AAC7C,MAAI,WAAW,uBAAuB,QAAQ,KAAK;AACnD,MAAI,WAAW,qBAAqB,CAAC,MAAM,IAAI,GAAG,OAAO,KAAK;AAE9D,MAAI,SAAS,SAAS,aAAa,QAAQ,YAAY;AACnD,WAAO;AAAA,MACL,SAAW;AAAA,MACX,UAAW,eAAe,CAAC;AAAA,MAC3B,WAAW,OAAO;AAAA,MAClB,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC,GAAG,MAAM;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AACd,eAAW,QAAQA,QAAO;AACxB,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAChD,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACF,MAAI,SAAS,SAAS,KAAK;AAAE,WAAO,EAAE,WAAW,IAAI;AAAA,EAAG;AACxD,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,MAAM,OAAO,OAAO;AAAA,EAAG;AAC7D,MAAI,SAAS,SAAS,MAAM;AACxB,WAAO;AAAA,EACT;AACF,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,IAAI,OAAO,MAAM;AACnC,WAAO,EAAE,MAAM,YAAY,IAAI,OAAO,SAAS,IAAI,KAAK;AAAA,EAC1D;AACF,MAAI,SAAS,SAASC,OAAM;AAAE,WAAO,YAAYA,MAAK,KAAK,CAAC;AAAA,EAAG;AAC/D,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,YAAY,MAAM,KAAK,CAAC;AAAA,EAAG;AACjE,MAAI,UAAU,SAAS,MAAM,MAAM,QAAQ,MAAM,OAAO;AACpD,UAAM,MAAM,QAAQ,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,CAAC;AACvC,eAAW,cAAc,KAAM,QAAO,OAAO,KAAK,WAAW,CAAC,CAAC;AAC/D,WAAO,EAAE,MAAM,QAAQ,IAAI;AAAA,EAC7B;AACF,MAAI,UAAU,SAAS,MAAM,MAAM;AAC/B,QAAI,OAAO;AACX,eAAW,EAAE,MAAM,QAAQ,IAAI,KAAK,MAAM;AACxC,cAAQ,KAAK,IAAI,OAAO,IAAI,KAAK,OAAO,KAAK,OAAO,KAAK,IAAI;AAC7D,aAAO;AAAA,IACT;AACA,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AACF,MAAI,UAAU,SAAS,IAAI,OAAO;AAAE,WAAO,EAAE,GAAG,IAAI,OAAO,SAAS,OAAU;AAAA,EAAG;AACjF,MAAI,UAAU,SAASA,OAAM;AAAE,WAAOA,MAAK,KAAK;AAAA,EAAG;AACnD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,QAAU,eAAe,KAAM;AAAA,EAAG;AAC7E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,UAAU,eAAe,KAAM;AAAA,EAAG;AAC7E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,UAAU,eAAe,KAAM;AAAA,EAAG;AAC7E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAU,eAAe,KAAM;AAAA,EAAG;AAC7E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAU,eAAe,KAAM;AAAA,EAAG;AAC7E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,OAAS;AAAA,EAAG;AACvD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAS;AAAA,EAAG;AACvD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAS;AAAA,EAAG;AACvD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAS;AAAA,EAAG;AACvD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,QAAS;AAAA,EAAG;AACvD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,QAAS;AAAA,EAAG;AACvD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,QAAS;AAAA,EAAG;AACvD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,QAAS;AAAA,EAAG;AACvD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAS,WAAW,QAAS;AAAA,EAAG;AAC3E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAS,WAAW,SAAS;AAAA,EAAG;AAC3E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,QAAU,YAAY,KAAK;AAAA,EAAG;AACzE,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,UAAU,YAAY,KAAK;AAAA,EAAG;AACzE,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,UAAU,YAAY,KAAK;AAAA,EAAG;AACzE,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAU,YAAY,KAAK;AAAA,EAAG;AACzE,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,OAAO,SAAU,YAAY,KAAK;AAAA,EAAG;AACzE,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,EAAE,WAAW,MAAM;AAAA,EAAG;AAC7D,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO;AAAA,EAAO;AAC9C,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,EAAE,WAAW,MAAM;AAAA,EAAG;AAC7D,MAAI,UAAU,SAAS,OAAO,OAAO;AAAE,WAAO,EAAE,SAAS,OAAO,GAAI,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAG;AAAA,EAAG;AAC9F,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO;AAAA,EAAO;AAC9C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAY;AAC9C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAc;AAChD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAU;AAC5C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAY;AAC9C,MAAI,UAAU,SAAS,MAAM,OAAO;AAAE,WAAO,EAAE,UAAU,MAAM,WAAW,MAAM;AAAA,EAAG;AACnF,MAAI,UAAU,SAAS,MAAM;AAAE,WAAO,EAAE,UAAU,KAAK;AAAA,EAAG;AAC1D,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,SAAS,IAAI,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AACjD,MAAI,UAAU,SAAS,IAAI,OAAO,KAAK;AACnC,UAAM,eAAe,aAAa,IAAI,QAAQ,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,IAAI;AAC5F,QAAI,KAAK;AACP,YAAM,OAAO,QAAQ,IAAI,YAAY;AACrC,UAAI,MAAM;AACR,aAAK,UAAU,KAAK,WAAW,CAAC;AAChC,aAAK,QAAQ,KAAK,GAAG;AACrB,YAAI,QAAQ,QAAS,MAAK,SAAS;AAAA,MACrC;AAAA,IACF;AACA,WAAO,EAAE,IAAI,aAAa;AAAA,EAC5B;AACF,MAAI,UAAU,SAAS,KAAK,KAAK,OAAO;AAAE,WAAO,EAAE,KAAK,MAAM;AAAA,EAAG;AACjE,MAAI,UAAU,SAAS,KAAK,MAAM;AAC9B,QAAI,KAAK,SAAS,GAAG;AACnB,YAAM,OAAO,QAAQ,IAAI,IAAI,EAAE;AAC/B,UAAI,MAAM;AACR,mBAAW,OAAO,MAAM;AACtB,cAAI,IAAI,QAAQ,QAAY,MAAK,QAAQ,IAAI;AAC7C,cAAI,IAAI,QAAQ,OAAY,MAAK,YAAY,IAAI;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,MAAM,QAAQ,GAAG,IAAI;AAAA,EAChC;AACF,MAAI,UAAU,SAAS,KAAK;AAAE,WAAO;AAAA,EAAK;AAC1C,MAAI,UAAU,SAAS,IAAI;AAAE,WAAO;AAAA,EAAI;AACxC,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,UAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,WAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,cAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,YAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,WAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,iBAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,qBAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,cAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,QAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,WAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAASA,OAAM;AAAE,WAAO,EAAE,OAAO,gBAAoB,OAAO,YAAYA,MAAK,KAAK,CAAC,EAAE;AAAA,EAAG;AACtG,MAAI,UAAU,SAAS,SAAS;AAAE,WAAO,EAAE,MAAM,SAAY,KAAK,QAAQ;AAAA,EAAG;AAC7E,MAAI,UAAU,SAAS,SAAS;AAAE,WAAO,EAAE,MAAM,SAAS,KAAK,QAAQ;AAAA,EAAG;AAC1E,MAAI,UAAU,SAAS,SAAS;AAAE,WAAO,EAAE,MAAM,SAAY,KAAK,QAAQ;AAAA,EAAG;AAC7E,MAAI,UAAU,SAAS,MAAMA,OAAM,GAAG;AAAE,WAAO;AAAA,EAAG;AAClD,MAAI,UAAU,SAAS,MAAMA,OAAM,QAAQC,SAAQ;AAC/C,UAAM,OAAO,EAAE,MAAM,MAAM,MAAAD,OAAM,QAAQ,QAAQC,WAAU,OAAU;AACrE,aAAS,KAAK,IAAI;AAClB,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,IAAI,IAAI;AAAE,WAAO,EAAE,IAAI,GAAG;AAAA,EAAG;AACpD,MAAI,UAAU,SAAS,MAAM,QAAQ;AAAE,WAAO,UAAU,QAAQ,MAAM,QAAQ,EAAE;AAAA,EAAG;AACnF,MAAI,UAAU,SAAS,QAAQ,GAAG;AAAE,WAAO;AAAA,EAAG;AAC9C,MAAI,UAAU,SAAS,QAAQ,OAAO,SAAS;AAC3C,UAAM,SAAS,EAAE,MAAM,UAAU,QAAQ,OAAO,SAAS,QAAW,QAAQ;AAC5E,aAAS,KAAK,MAAM;AACpB,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,KAAK,OAAO;AAAE,WAAO,EAAE,KAAK,IAAI,KAAK,GAAG,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AACtF,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBF,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASJ,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASK,WAAU;AAC/C,WAAO,IAAI,gBAAgB,SAAS,MAAM,MAAMA,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBL,WAAU,OAAOK,WAAU;AAC3D,WAAO,IAAI;AAAA,MACT,gBAAgB,aAAaL,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,gBAAgB;AACrB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,oBAAoB;AACzB,WAAK,WAAW;AAChB,qBAAe;AACf,WAAK,OAAO,IAAI,IAAI,EAAE;AAAA,IACxB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AACxB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,mBAAmB;AAAA,IAC1B;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AACA,mBAAe;AACf,SAAK,OAAO,EAAE;AACd,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,uBAAuB;AAC5B,QAAI,OAAO,YAAY;AACrB,WAAK,qBAAqB;AAC1B,UAAI,OAAO,YAAY;AACrB,aAAK,uBAAuB;AAC5B,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AACxB,cAAI,OAAO,YAAY;AACrB,iBAAK,kBAAkB;AACvB,gBAAI,OAAO,YAAY;AACrB,mBAAK,wBAAwB;AAC7B,kBAAI,OAAO,YAAY;AACrB,qBAAK,wBAAwB;AAC7B,oBAAI,OAAO,YAAY;AACrB,uBAAK,wBAAwB;AAAA,gBAC/B;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL;AACA,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA;AACA,cAAI,OAAO,YAAY;AACrB,0BAAc;AACd,iBAAK;AAAA,UACP,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL;AACA,gBAAI,MAAM,SAAS,aAAa;AAC9B,mBAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO;AAAA,IACd,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,uBAAuB;AAC5B,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP;AACA,eAAK,WAAW;AAChB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,oBAAoB;AACzB,gBAAI,OAAO,YAAY;AACrB,mBAAK,WAAW;AAChB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,sBAAM;AACN,+BAAe;AAAA,cACjB,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,+BAAe;AACf,qBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,cACxB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB;AACA,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AAEtD,SAAK;AACL,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,gBAAgB;AACrB,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,eAAK;AACL,gBAAM,WAAW;AACjB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,kBAAM;AACN;AAAA,UACF,OAAO;AACL,kBAAM;AACN,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,QAAQ,YAAY;AACtB,kBAAM,wBAAwB;AAC9B,gBAAI,QAAQ,YAAY;AACtB,oBAAM,CAAC,KAAK,KAAK,GAAG;AACpB,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK;AACL,kBAAM,WAAW;AACjB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,oBAAM;AACN;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,QAAQ,YAAY;AACtB,oBAAM,wBAAwB;AAC9B,kBAAI,QAAQ,YAAY;AACtB,sBAAM,CAAC,KAAK,KAAK,GAAG;AACpB,qBAAK;AAAA,cACP,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF;AACA,eAAK;AACL,gBAAM,WAAW;AACjB,gBAAM,6BAA6B;AACnC,cAAI,QAAQ,YAAY;AACtB,kBAAM,CAAC,KAAK,GAAG;AACf,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP;AACA,yBAAe;AACf,eAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,QACjC,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK,WAAW;AAChB,eAAK,gBAAgB;AACrB,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,iBAAiB;AACtB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC;AACN,mBAAK;AACL,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,wBAAwB;AAC9B,oBAAI,QAAQ,YAAY;AACtB,wBAAM,CAAC,KAAK,KAAK,GAAG;AACpB,uBAAK;AAAA,gBACP,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AACA,qBAAO,OAAO,YAAY;AACxB,mBAAG,KAAK,EAAE;AACV,qBAAK;AACL,sBAAM,WAAW;AACjB,oBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,wBAAM;AACN;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,QAAQ,YAAY;AACtB,wBAAM,wBAAwB;AAC9B,sBAAI,QAAQ,YAAY;AACtB,0BAAM,CAAC,KAAK,KAAK,GAAG;AACpB,yBAAK;AAAA,kBACP,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF;AACA,mBAAK;AACL,oBAAM,WAAW;AACjB,oBAAM,6BAA6B;AACnC,kBAAI,QAAQ,YAAY;AACtB,sBAAM,CAAC,KAAK,GAAG;AACf,qBAAK;AAAA,cACP,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK;AAAA,cACP;AACA,6BAAe;AACf,mBAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,YACjC,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,IAAI,EAAE;AAAA,MACrB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ;AAAA,MACf;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ;AAAA,QACf;AACA,aAAK;AACL,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ;AAAA,UACf;AACA,eAAK;AACL,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ;AAAA,YACf;AACA,iBAAK;AACL,gBAAI,OAAO,YAAY;AACrB,mBAAK;AACL,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,QAAQ;AAAA,cACf;AACA,mBAAK;AACL,kBAAI,OAAO,YAAY;AACrB,qBAAK;AACL,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,iCAAe;AACf,uBAAK,QAAQ;AAAA,gBACf;AACA,qBAAK;AACL,oBAAI,OAAO,YAAY;AACrB,uBAAK;AACL,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,mCAAe;AACf,yBAAK,QAAQ;AAAA,kBACf;AACA,uBAAK;AACL,sBAAI,OAAO,YAAY;AACrB,yBAAK;AACL,wBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,2BAAK;AACL,qCAAe;AAAA,oBACjB,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,qCAAe;AACf,2BAAK,QAAQ;AAAA,oBACf;AACA,yBAAK;AACL,wBAAI,OAAO,YAAY;AACrB,2BAAK;AACL,0BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,6BAAK;AACL,uCAAe;AAAA,sBACjB,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,0BAAI,OAAO,YAAY;AACrB,uCAAe;AACf,6BAAK,QAAQ;AAAA,sBACf;AACA,2BAAK;AACL,0BAAI,OAAO,YAAY;AACrB,6BAAK;AACL,4BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,+BAAK;AACL,yCAAe;AAAA,wBACjB,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AACA,4BAAI,OAAO,YAAY;AACrB,yCAAe;AACf,+BAAK,QAAQ;AAAA,wBACf;AACA,6BAAK;AACL,4BAAI,OAAO,YAAY;AACrB,+BAAK;AACL,8BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iCAAK;AACL,2CAAe;AAAA,0BACjB,OAAO;AACL,iCAAK;AACL,gCAAI,oBAAoB,GAAG;AAAE,uCAAS,OAAO;AAAA,4BAAG;AAAA,0BAClD;AACA,8BAAI,OAAO,YAAY;AACrB,2CAAe;AACf,iCAAK,QAAQ;AAAA,0BACf;AACA,+BAAK;AACL,8BAAI,OAAO,YAAY;AACrB,iCAAK;AACL,gCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mCAAK;AACL,6CAAe;AAAA,4BACjB,OAAO;AACL,mCAAK;AACL,kCAAI,oBAAoB,GAAG;AAAE,yCAAS,OAAO;AAAA,8BAAG;AAAA,4BAClD;AACA,gCAAI,OAAO,YAAY;AACrB,6CAAe;AACf,mCAAK,QAAQ;AAAA,4BACf;AACA,iCAAK;AACL,gCAAI,OAAO,YAAY;AACrB,mCAAK;AACL,kCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qCAAK;AACL,+CAAe;AAAA,8BACjB,OAAO;AACL,qCAAK;AACL,oCAAI,oBAAoB,GAAG;AAAE,2CAAS,OAAO;AAAA,gCAAG;AAAA,8BAClD;AACA,kCAAI,OAAO,YAAY;AACrB,+CAAe;AACf,qCAAK,QAAQ;AAAA,8BACf;AACA,mCAAK;AACL,kCAAI,OAAO,YAAY;AACrB,qCAAK;AACL,oCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uCAAK;AACL,iDAAe;AAAA,gCACjB,OAAO;AACL,uCAAK;AACL,sCAAI,oBAAoB,GAAG;AAAE,6CAAS,OAAO;AAAA,kCAAG;AAAA,gCAClD;AACA,oCAAI,OAAO,YAAY;AACrB,iDAAe;AACf,uCAAK,QAAQ;AAAA,gCACf;AACA,qCAAK;AACL,oCAAI,OAAO,YAAY;AACrB,uCAAK;AACL,sCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yCAAK;AACL,mDAAe;AAAA,kCACjB,OAAO;AACL,yCAAK;AACL,wCAAI,oBAAoB,GAAG;AAAE,+CAAS,OAAO;AAAA,oCAAG;AAAA,kCAClD;AACA,sCAAI,OAAO,YAAY;AACrB,mDAAe;AACf,yCAAK,QAAQ;AAAA,kCACf;AACA,uCAAK;AACL,sCAAI,OAAO,YAAY;AACrB,yCAAK;AACL,wCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,2CAAK;AACL,qDAAe;AAAA,oCACjB,OAAO;AACL,2CAAK;AACL,0CAAI,oBAAoB,GAAG;AAAE,iDAAS,OAAO;AAAA,sCAAG;AAAA,oCAClD;AACA,wCAAI,OAAO,YAAY;AACrB,qDAAe;AACf,2CAAK,QAAQ;AAAA,oCACf;AACA,yCAAK;AACL,wCAAI,OAAO,YAAY;AACrB,2CAAK;AACL,0CAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,6CAAK;AACL,uDAAe;AAAA,sCACjB,OAAO;AACL,6CAAK;AACL,4CAAI,oBAAoB,GAAG;AAAE,mDAAS,OAAO;AAAA,wCAAG;AAAA,sCAClD;AACA,0CAAI,OAAO,YAAY;AACrB,uDAAe;AACf,6CAAK,QAAQ;AAAA,sCACf;AACA,2CAAK;AACL,0CAAI,OAAO,YAAY;AACrB,6CAAK;AACL,4CAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,+CAAK;AACL,yDAAe;AAAA,wCACjB,OAAO;AACL,+CAAK;AACL,8CAAI,oBAAoB,GAAG;AAAE,qDAAS,OAAO;AAAA,0CAAG;AAAA,wCAClD;AACA,4CAAI,OAAO,YAAY;AACrB,yDAAe;AACf,+CAAK,QAAQ;AAAA,wCACf;AACA,6CAAK;AACL,4CAAI,OAAO,YAAY;AACrB,+CAAK;AACL,8CAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iDAAK;AACL,2DAAe;AAAA,0CACjB,OAAO;AACL,iDAAK;AACL,gDAAI,oBAAoB,GAAG;AAAE,uDAAS,MAAM;AAAA,4CAAG;AAAA,0CACjD;AACA,8CAAI,OAAO,YAAY;AACrB,2DAAe;AACf,iDAAK,QAAQ;AAAA,0CACf;AACA,+CAAK;AAAA,wCACP;AAAA,sCACF;AAAA,oCACF;AAAA,kCACF;AAAA,gCACF;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,wBAAwB;AAC7B,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,yBAAyB;AAAA,IAChC;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,wBAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,2BAAK;AACL,qCAAe;AAAA,oBACjB,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,0BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,6BAAK;AACL,uCAAe;AAAA,sBACjB,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,+BAA+B;AACtC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,wBAAwB;AAC7B,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,EAAE;AAAA,YACjB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,2BAA2B;AAClC,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB;AACA,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ;AAAA,MACf;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ;AAAA,QACf;AACA,aAAK;AACL,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ;AAAA,UACf;AACA,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,cAAc;AACnB,QAAI,OAAO,YAAY;AACrB,WAAK,cAAc;AACnB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,IAAI,EAAE;AAAA,MACrB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,cAAc;AACnB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB;AACA,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI,IAAI;AAER,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK,gBAAgB;AACrB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,eAAe;AACpB,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,QACzB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,IACzB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK;AACL,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,gBAAM,MAAM,OAAO,WAAW;AAC9B,cAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,UACF,OAAO;AACL,kBAAM;AACN,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,iBAAO,QAAQ,YAAY;AACzB,eAAG,KAAK,GAAG;AACX,kBAAM,MAAM,OAAO,WAAW;AAC9B,gBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AACA,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,yBAAyB;AAC9B,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,YACzB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK;AACL,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC;AACN,kBAAM,MAAM,OAAO,WAAW;AAC9B,gBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,mBAAO,QAAQ,YAAY;AACzB,iBAAG,KAAK,GAAG;AACX,oBAAM,MAAM,OAAO,WAAW;AAC9B,kBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AAAA,YACF;AACA,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,UAAU,IAAI,WAAW;AAAA,UACtC,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,yBAAyB;AAC9B,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,cACzB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AACA,WAAK;AACL;AACA,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,IAAI,EAAE;AAAA,MACrB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,2BAA2B;AAClC,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK;AACL;AACA,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL;AACA,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK;AACL,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AACA,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AACA,aAAK,MAAM,UAAU,IAAI,WAAW;AACpC,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,EAAE;AAAA,UACjB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,EAAE;AAAA,YACjB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AACL,mBAAK,CAAC;AACN,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,qBAAO,OAAO,YAAY;AACxB,mBAAG,KAAK,EAAE;AACV,qBAAK,MAAM,OAAO,WAAW;AAC7B,oBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,gBACF,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AAAA,cACF;AACA,mBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,QAAQ,EAAE;AAAA,cACjB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AACL,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK;AACL,qBAAK,CAAC;AACN,qBAAK,MAAM,OAAO,WAAW;AAC7B,oBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,gBACF,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,uBAAO,OAAO,YAAY;AACxB,qBAAG,KAAK,EAAE;AACV,uBAAK,MAAM,OAAO,WAAW;AAC7B,sBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,kBACF,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AAAA,gBACF;AACA,qBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,iCAAe;AACf,uBAAK,QAAQ,EAAE;AAAA,gBACjB,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK;AACL,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,uBAAK;AACL,uBAAK,CAAC;AACN,uBAAK,MAAM,OAAO,WAAW;AAC7B,sBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,kBACF,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,yBAAO,OAAO,YAAY;AACxB,uBAAG,KAAK,EAAE;AACV,yBAAK,MAAM,OAAO,WAAW;AAC7B,wBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,oBACF,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AAAA,kBACF;AACA,uBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,mCAAe;AACf,yBAAK,QAAQ,EAAE;AAAA,kBACjB,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AACA,oBAAI,OAAO,YAAY;AACrB,uBAAK;AACL,sBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,yBAAK;AACL;AAAA,kBACF,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,yBAAK;AACL,yBAAK,CAAC;AACN,yBAAK,MAAM,OAAO,WAAW;AAC7B,wBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,oBACF,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,2BAAO,OAAO,YAAY;AACxB,yBAAG,KAAK,EAAE;AACV,2BAAK,MAAM,OAAO,WAAW;AAC7B,0BAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,sBACF,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AAAA,oBACF;AACA,yBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,wBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,2BAAK;AACL;AAAA,oBACF,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,qCAAe;AACf,2BAAK,QAAQ,EAAE;AAAA,oBACjB,OAAO;AACL,oCAAc;AACd,2BAAK;AAAA,oBACP;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AACA,sBAAI,OAAO,YAAY;AACrB,yBAAK;AACL,wBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,2BAAK;AACL;AAAA,oBACF,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,2BAAK;AACL,2BAAK,CAAC;AACN,2BAAK,MAAM,OAAO,WAAW;AAC7B,0BAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,sBACF,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,6BAAO,OAAO,YAAY;AACxB,2BAAG,KAAK,EAAE;AACV,6BAAK,MAAM,OAAO,WAAW;AAC7B,4BAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,wBACF,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AAAA,sBACF;AACA,2BAAK,MAAM,UAAU,IAAI,WAAW;AACpC,0BAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,6BAAK;AACL;AAAA,sBACF,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,0BAAI,OAAO,YAAY;AACrB,uCAAe;AACf,6BAAK,QAAQ,EAAE;AAAA,sBACjB,OAAO;AACL,sCAAc;AACd,6BAAK;AAAA,sBACP;AAAA,oBACF,OAAO;AACL,oCAAc;AACd,2BAAK;AAAA,oBACP;AACA,wBAAI,OAAO,YAAY;AACrB,2BAAK;AACL,0BAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,6BAAK;AACL;AAAA,sBACF,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,0BAAI,OAAO,YAAY;AACrB,6BAAK;AACL,6BAAK,CAAC;AACN,6BAAK,MAAM,OAAO,WAAW;AAC7B,4BAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,wBACF,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AACA,+BAAO,OAAO,YAAY;AACxB,6BAAG,KAAK,EAAE;AACV,+BAAK,MAAM,OAAO,WAAW;AAC7B,8BAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,0BACF,OAAO;AACL,iCAAK;AACL,gCAAI,oBAAoB,GAAG;AAAE,uCAAS,OAAO;AAAA,4BAAG;AAAA,0BAClD;AAAA,wBACF;AACA,6BAAK,MAAM,UAAU,IAAI,WAAW;AACpC,4BAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,+BAAK;AACL;AAAA,wBACF,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AACA,4BAAI,OAAO,YAAY;AACrB,yCAAe;AACf,+BAAK,QAAQ,EAAE;AAAA,wBACjB,OAAO;AACL,wCAAc;AACd,+BAAK;AAAA,wBACP;AAAA,sBACF,OAAO;AACL,sCAAc;AACd,6BAAK;AAAA,sBACP;AACA,0BAAI,OAAO,YAAY;AACrB,6BAAK;AACL,4BAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,+BAAK;AACL;AAAA,wBACF,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AACA,4BAAI,OAAO,YAAY;AACrB,+BAAK;AACL,+BAAK,CAAC;AACN,+BAAK,MAAM,OAAO,WAAW;AAC7B,8BAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,0BACF,OAAO;AACL,iCAAK;AACL,gCAAI,oBAAoB,GAAG;AAAE,uCAAS,OAAO;AAAA,4BAAG;AAAA,0BAClD;AACA,iCAAO,OAAO,YAAY;AACxB,+BAAG,KAAK,EAAE;AACV,iCAAK,MAAM,OAAO,WAAW;AAC7B,gCAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,4BACF,OAAO;AACL,mCAAK;AACL,kCAAI,oBAAoB,GAAG;AAAE,yCAAS,OAAO;AAAA,8BAAG;AAAA,4BAClD;AAAA,0BACF;AACA,+BAAK,MAAM,UAAU,IAAI,WAAW;AACpC,8BAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iCAAK;AACL;AAAA,0BACF,OAAO;AACL,iCAAK;AACL,gCAAI,oBAAoB,GAAG;AAAE,uCAAS,OAAO;AAAA,4BAAG;AAAA,0BAClD;AACA,8BAAI,OAAO,YAAY;AACrB,2CAAe;AACf,iCAAK,QAAQ,EAAE;AAAA,0BACjB,OAAO;AACL,0CAAc;AACd,iCAAK;AAAA,0BACP;AAAA,wBACF,OAAO;AACL,wCAAc;AACd,+BAAK;AAAA,wBACP;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;AAE3D,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK,YAAY;AACjB,oBAAI,OAAO,YAAY;AACrB,uBAAK;AACL,sBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,0BAAM;AACN;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AACN,0BAAM,CAAC;AACP,0BAAM,MAAM,OAAO,WAAW;AAC9B,wBAAI,QAAQ,KAAK,GAAG,GAAG;AACrB;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,2BAAO,QAAQ,YAAY;AACzB,0BAAI,KAAK,GAAG;AACZ,4BAAM,MAAM,OAAO,WAAW;AAC9B,0BAAI,QAAQ,KAAK,GAAG,GAAG;AACrB;AAAA,sBACF,OAAO;AACL,8BAAM;AACN,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AAAA,oBACF;AACA,0BAAM,MAAM,UAAU,KAAK,WAAW;AACtC,wBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,4BAAM;AACN;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,qCAAe;AACf,2BAAK,QAAQ,IAAI,IAAI,GAAG;AAAA,oBAC1B,OAAO;AACL,oCAAc;AACd,2BAAK;AAAA,oBACP;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AACA,sBAAI,OAAO,YAAY;AACrB,yBAAK;AACL,0BAAM;AACN,0BAAM,MAAM,OAAO,WAAW;AAC9B,wBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,4BAAM,CAAC;AACP,4BAAM,MAAM,OAAO,WAAW;AAC9B,0BAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,sBACF,OAAO;AACL,8BAAM;AACN,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,6BAAO,QAAQ,YAAY;AACzB,4BAAI,KAAK,GAAG;AACZ,8BAAM,MAAM,OAAO,WAAW;AAC9B,4BAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,wBACF,OAAO;AACL,gCAAM;AACN,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AAAA,sBACF;AACA,4BAAM,CAAC,KAAK,GAAG;AACf,4BAAM;AAAA,oBACR,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AACA,wBAAI,QAAQ,YAAY;AACtB,2BAAK,MAAM,UAAU,IAAI,WAAW;AAAA,oBACtC,OAAO;AACL,2BAAK;AAAA,oBACP;AAAA,kBACF;AACA,sBAAI,OAAO,YAAY;AACrB,0BAAM,oBAAoB;AAC1B,wBAAI,QAAQ,YAAY;AACtB,4BAAM;AAAA,oBACR;AACA,mCAAe;AACf,yBAAK,QAAQ,IAAI,IAAI,IAAI,GAAG;AAAA,kBAC9B,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AACxB,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,WAAW;AAChB,mBAAK,mBAAmB;AACxB,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,QAAQ,IAAI,EAAE;AAAA,cACrB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,QAAQ;AAAA,UAAG;AAAA,QACnD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,sBAAsB;AAC3B,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,IAAI,EAAE;AAAA,YACrB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP;AACA,eAAK,WAAW;AAChB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC;AACN,iBAAK,yBAAyB;AAC9B,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,yBAAyB;AAAA,YAChC;AACA,iBAAK,WAAW;AAChB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,YACzB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,QAAQ;AAAA,QAAG;AAAA,MACnD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,QAAQ;AAAA,UAAG;AAAA,QACnD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,QAAQ;AAAA,YAAG;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,2BAA2B;AAClC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL;AACA,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,QAAQ;AAAA,QAAG;AAAA,MACnD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,QAAQ;AAAA,YAAG;AAAA,UACnD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,UAAU,IAAI,WAAW;AAAA,UACtC,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,IAAI,EAAE;AAAA,YACrB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER;AACA,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,QAAQ;AAAA,QAAG;AAAA,MACnD;AAAA,IACF;AACA;AACA,SAAK;AACL,QAAI,oBAAoB,GAAG;AAAE,eAAS,QAAQ;AAAA,IAAG;AAEjD,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER;AACA,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,QAAQ;AAAA,UAAG;AAAA,QACnD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER;AACA,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,QAAQ;AAAA,QAAG;AAAA,MACnD;AAAA,IACF;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,QAAQ;AAAA,MAAG;AAAA,IACnD;AAEA,WAAO;AAAA,EACT;AAGA,QAAM;AAEN,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACxxIO,IAAM,YAAyC;AAAA,EACpD,aAAa,OAA6B;AACxC,UAAM,MAAa,UAAM,KAAK;AAC9B,UAAM,QAAqB,IAAI,KAAK,MAAgB,IAAI,CAAC,MAAqB;AAC5E,YAAM,OAAiB;AAAA,QACrB,IAAI,EAAE;AAAA,QACN,OAAO,EAAE;AAAA,QACT,OAAO,EAAE,SAAS;AAAA,QAClB,QAAQ,EAAE,UAAU;AAAA,QACpB,GAAI,EAAE,aAAa,SAAY,EAAE,UAAU,EAAE,SAAmB,IAAI,CAAC;AAAA,MACvE;AACA,UAAI,EAAE,cAAc,QAAW;AAC7B,cAAM,SAAS,aAAa,OAAO,EAAE,SAAS,CAAC;AAC/C,YAAI,CAAC,OAAO,IAAI;AACd,gBAAM,IAAI;AAAA,YACR,+CAA+C,EAAE,SAAS,MAAM,OAAO,MAAM,OAAO;AAAA,UACtF;AAAA,QACF;AACA,eAAO,EAAE,GAAG,MAAM,MAAM,OAAO,MAAM;AAAA,MACvC;AACA,aAAO;AAAA,IACT,CAAC;AACD,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU,IAAI,YAAY,CAAC;AAAA,MAC3B,WAAW,IAAI;AAAA,MACf;AAAA,MACA,OAAO,IAAI,KAAK;AAAA,MAChB,WAAW,IAAI,aAAa,CAAC;AAAA,MAC7B,UAAU,IAAI,UAAU,SAAS,IAAI,IAAI,WAAW;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,UAAU,OAA6B;AAErC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAkB,OAAsB,SAAuC;AACpF,WAAO,gBAAgB,IAAI,OAAO,OAAO;AAAA,EAC3C;AACF;;;AC1BO,SAAS,WAAW,MAAuB;AAChD,SAAQ,OAAO,MAAM,KAAK,OAAO,QAAQ,KAAM,OAAO,QAAQ;AAChE;AAEO,SAAS,YAAY,MAAc,OAAuB;AAC/D,QAAM,QAAQ,CAAC,IAAI,WAAW,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AACrF,SAAO,MAAM,QAAQ,CAAC,KAAK;AAC7B;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,WAAW,IAAI,IAAI,MAAM;AAClC;AAIO,SAAS,cAAc,MAAc,OAAe,KAAqB;AAC9E,MAAI,MAAM;AACV,MAAI,QAAQ,KAAM;AAChB,aAAS,IAAI,KAAM,IAAI,MAAM,IAAK,QAAO,WAAW,CAAC;AAAA,EACvD,OAAO;AACL,aAAS,IAAI,MAAM,IAAI,KAAM,IAAK,QAAO,WAAW,CAAC;AAAA,EACvD;AACA,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,QAAO,YAAY,MAAM,CAAC;AAC1D,SAAO,MAAM;AACb,SAAO;AACT;AAEO,SAAS,cAAc,KAAuC;AACnE,MAAI,OAAO;AACX,MAAI,YAAY;AAChB,MAAI,aAAa,GAAG;AAClB,WAAO,aAAa,WAAW,IAAI,GAAG;AACpC,mBAAa,WAAW,IAAI;AAC5B,cAAQ;AAAA,IACV;AAAA,EACF,OAAO;AACL,WAAO,YAAY,GAAG;AACpB,cAAQ;AACR,mBAAa,WAAW,IAAI;AAAA,IAC9B;AAAA,EACF;AACA,MAAI,QAAQ;AACZ,SAAO,SAAS,MAAM,aAAa,YAAY,MAAM,KAAK,GAAG;AAC3D,iBAAa,YAAY,MAAM,KAAK;AACpC,aAAS;AAAA,EACX;AACA,SAAO,CAAC,MAAM,OAAO,YAAY,CAAC;AACpC;AASO,SAAS,YAAY,GAAuB;AACjD,QAAM,OAAO,4BAA4B,KAAK,CAAC;AAC/C,MAAI,KAAM,QAAO,EAAE,WAAW,OAAO,MAAM,CAAC,KAAK,CAAC,GAAI,OAAO,CAAC,KAAK,CAAC,GAAI,KAAK,CAAC,KAAK,CAAC,EAAG;AAEvF,QAAM,SAAS,oBAAoB,KAAK,CAAC;AACzC,MAAI,OAAQ,QAAO,EAAE,WAAW,SAAS,MAAM,CAAC,OAAO,CAAC,GAAI,OAAO,CAAC,OAAO,CAAC,EAAG;AAE/E,QAAM,WAAW,qBAAqB,KAAK,CAAC;AAC5C,MAAI,SAAU,QAAO,EAAE,WAAW,WAAW,MAAM,CAAC,SAAS,CAAC,GAAI,SAAS,CAAC,SAAS,CAAC,EAAG;AAEzF,QAAM,QAAQ,oBAAoB,KAAK,CAAC;AACxC,MAAI,MAAO,QAAO,EAAE,WAAW,QAAQ,MAAM,CAAC,MAAM,CAAC,GAAI,MAAM,CAAC,MAAM,CAAC,EAAG;AAE1E,QAAM,QAAQ,YAAY,KAAK,CAAC;AAChC,MAAI,MAAO,QAAO,EAAE,WAAW,QAAQ,MAAM,CAAC,MAAM,CAAC,EAAG;AAExD,QAAM,IAAI,MAAM,+BAA+B,CAAC,GAAG;AACrD;AAKO,SAAS,WAAW,QAA8C;AACvE,UAAQ,OAAO,WAAW;AAAA,IACxB,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,OAAO,OAAQ,OAAO,GAAI;AAAA,IACjD,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,OAAO,OAAQ,CAAC;AAAA,IACvC,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,GAAG,CAAC;AAAA,IAC3B,KAAK;AACH,aAAO,CAAC,OAAO,OAAO,OAAO,UAAW,KAAK,IAAI,GAAG,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,OAAO,SAAU,IAAI,IAAI,GAAG,CAAC;AAAA,EACtD;AACF;AAGO,SAAS,YAAY,QAA8C;AACxE,UAAQ,OAAO,WAAW;AAAA,IACxB,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,OAAO,OAAQ,OAAO,GAAI;AAAA,IACjD,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,OAAO,OAAQ,YAAY,OAAO,MAAM,OAAO,KAAM,CAAC;AAAA,IAC7E,KAAK;AACH,aAAO,CAAC,OAAO,MAAM,IAAI,EAAE;AAAA,IAC7B,KAAK,WAAW;AACd,YAAM,YAAY,OAAO,UAAW;AACpC,aAAO,CAAC,OAAO,MAAM,WAAW,YAAY,OAAO,MAAM,SAAS,CAAC;AAAA,IACrE;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,YAAY,OAAO,SAAU,IAAI,IAAI;AAC3C,aAAO,CAAC,OAAO,MAAM,WAAW,YAAY,OAAO,MAAM,SAAS,CAAC;AAAA,IACrE;AAAA,EACF;AACF;AAiBO,SAAS,cAAc,UAA4B;AACxD,MAAI,YAAY,GAAI,QAAO;AAC3B,MAAI,YAAY,GAAI,QAAO;AAC3B,MAAI,YAAY,IAAK,QAAO;AAC5B,MAAI,YAAY,KAAM,QAAO;AAC7B,MAAI,YAAY,KAAM,QAAO;AAC7B,SAAO;AACT;AAYA,SAAS,cACP,MACA,OACA,KACA,MAC0B;AAC1B,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,cAAc,cAAc,MAAM,OAAO,GAAG,IAAI,CAAC;AAAA,IAC1D,KAAK;AACH,aAAO,cAAc,cAAc,MAAM,OAAO,GAAG,IAAI,CAAC;AAAA,IAC1D,KAAK,SAAS;AACZ,UAAI,IAAI,QAAQ,GACd,IAAI;AACN,UAAI,IAAI,IAAI;AACV,YAAI;AACJ,aAAK;AAAA,MACP;AACA,aAAO,CAAC,GAAG,GAAG,CAAC;AAAA,IACjB;AAAA,IACA,KAAK,WAAW;AACd,UAAI,IAAI,QAAQ,GACd,IAAI;AACN,UAAI,IAAI,IAAI;AACV,YAAI,IAAI;AACR,aAAK;AAAA,MACP;AACA,aAAO,CAAC,GAAG,GAAG,CAAC;AAAA,IACjB;AAAA,IACA,KAAK,QAAQ;AACX,UAAI,IAAI,QAAQ,GACd,IAAI;AACN,UAAI,IAAI,IAAI;AACV,YAAI,IAAI;AACR,aAAK;AAAA,MACP;AACA,aAAO,CAAC,GAAG,GAAG,CAAC;AAAA,IACjB;AAAA,IACA,KAAK;AACH,aAAO,CAAC,OAAO,GAAG,GAAG,CAAC;AAAA,EAC1B;AACF;AAGA,SAAS,kBACP,MACA,OACA,MACA,MAC0B;AAC1B,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,CAAC,MAAM,OAAO,IAAI;AAAA,IAC3B,KAAK,QAAQ;AACX,YAAM,IAAI,cAAc,MAAM,OAAO,IAAI;AACzC,YAAM,UAAU;AAChB,YAAM,KAAK,UAAU,IAAI;AACzB,YAAM,QAAQ,IAAI,KAAK,EAAE,EAAE,UAAU;AACrC,YAAM,eAAe,UAAU,IAAI,IAAI,QAAQ;AAC/C,aAAO,cAAc,IAAI,YAAY;AAAA,IACvC;AAAA,IACA,KAAK;AACH,aAAO,CAAC,MAAM,OAAO,CAAC;AAAA,IACxB,KAAK,WAAW;AACd,YAAM,IAAI,KAAK,OAAO,QAAQ,KAAK,CAAC;AACpC,aAAO,CAAC,MAAM,IAAI,IAAI,GAAG,CAAC;AAAA,IAC5B;AAAA,IACA,KAAK;AACH,aAAO,CAAC,MAAM,SAAS,IAAI,IAAI,GAAG,CAAC;AAAA,IACrC,KAAK;AACH,aAAO,CAAC,MAAM,GAAG,CAAC;AAAA,EACtB;AACF;AAGO,SAAS,UAAU,OAAe,OAAe,MAA4B;AAClF,QAAM,QAAoB,CAAC;AAC3B,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,cAAc,KAAK;AACxC,MAAI,CAAC,IAAI,IAAI,EAAE,IAAI,kBAAkB,IAAI,IAAI,IAAI,IAAI;AACrD,MAAI,SAAS,cAAc,IAAI,IAAI,EAAE;AAErC,MAAI,SAAS,OAAO;AAClB,KAAC,IAAI,IAAI,EAAE,IAAI,cAAc,IAAI,IAAI,IAAI,IAAI;AAC7C,aAAS,cAAc,IAAI,IAAI,EAAE;AAAA,EACnC;AAEA,MAAI,SAAS;AACb,SAAO,UAAU,SAAS,SAAS,KAAM;AACvC,UAAM,KAAK,EAAE,MAAM,IAAI,OAAO,IAAI,KAAK,IAAI,SAAS,OAAO,CAAC;AAC5D,KAAC,IAAI,IAAI,EAAE,IAAI,cAAc,IAAI,IAAI,IAAI,IAAI;AAC7C,aAAS,cAAc,IAAI,IAAI,EAAE;AACjC,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAIA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,cAAc,GAAmB;AACxC,QAAM,MAAM,KAAK,IAAI,CAAC;AACtB,QAAM,SAAS,MAAM;AACrB,MAAI,UAAU,MAAM,UAAU,GAAI,QAAO,GAAG,CAAC;AAC7C,UAAQ,MAAM,IAAI;AAAA,IAChB,KAAK;AACH,aAAO,GAAG,CAAC;AAAA,IACb,KAAK;AACH,aAAO,GAAG,CAAC;AAAA,IACb,KAAK;AACH,aAAO,GAAG,CAAC;AAAA,IACb;AACE,aAAO,GAAG,CAAC;AAAA,EACf;AACF;AAGO,SAAS,gBAAgB,MAAgB,MAAgB,WAA2B;AACzF,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,UAAI,YAAY,MAAM,EAAG,QAAO,WAAW,KAAK,QAAQ,CAAC,KAAK;AAC9D,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB,KAAK;AACH,UAAI,YAAY,MAAM,EAAG,QAAO,WAAW,KAAK,QAAQ,CAAC,KAAK;AAC9D,aAAO,OAAO,KAAK,GAAG;AAAA,IACxB,KAAK;AACH,UAAI,KAAK,UAAU,KAAK,cAAc,EAAG,QAAO,OAAO,KAAK,IAAI;AAChE,aAAO,WAAW,KAAK,QAAQ,CAAC,KAAK;AAAA,IACvC,KAAK,WAAW;AACd,YAAM,IAAI,KAAK,KAAK,KAAK,QAAQ,CAAC;AAClC,UAAI,MAAM,KAAK,cAAc,EAAG,QAAO,IAAI,CAAC,IAAI,KAAK,IAAI;AACzD,aAAO,IAAI,CAAC;AAAA,IACd;AAAA,IACA,KAAK,QAAQ;AACX,YAAMC,KAAI,KAAK,SAAS,IAAI,IAAI;AAChC,UAAIA,OAAM,KAAK,cAAc,EAAG,QAAO,IAAIA,EAAC,IAAI,KAAK,IAAI;AACzD,aAAO,IAAIA,EAAC;AAAA,IACd;AAAA,IACA,KAAK;AACH,aAAO,OAAO,KAAK,IAAI;AAAA,EAC3B;AACF;AAGO,SAAS,oBAAoB,MAAc,OAAe,KAAqB;AACpF,SAAO,GAAG,cAAc,GAAG,CAAC,IAAI,WAAW,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI;AACrE;AAKO,SAAS,aAAa,MAAsB;AACjD,MAAI;AACF,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,WAAW,YAAY,IAAI,CAAC;AAC9C,WAAO,cAAc,GAAG,GAAG,CAAC;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,WAAW,MAAsB;AAC/C,MAAI;AACF,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,YAAY,YAAY,IAAI,CAAC;AAC/C,WAAO,cAAc,GAAG,GAAG,CAAC;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUO,SAAS,WAAW,MAAc,QAAwB,QAAgB;AAC/E,MAAI;AACF,UAAM,IAAI,YAAY,IAAI;AAC1B,YAAQ,EAAE,WAAW;AAAA,MACnB,KAAK;AACH,eAAO,UAAU,SACb,oBAAoB,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE,OAAO,CAAC,IACpD,GAAG,YAAY,EAAE,SAAS,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;AAAA,MAC3D,KAAK;AACH,eAAO,GAAG,YAAY,EAAE,SAAS,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;AAAA,MAC1D,KAAK;AACH,eAAO,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI;AAAA,MACtC,KAAK;AACH,eAAO,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI;AAAA,MACnC,KAAK;AACH,eAAO,OAAO,EAAE,IAAI;AAAA,IACxB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;;;ACzYO,IAAM,mBAAsC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,wBAA2C;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,uBAA0C;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,SAAS,eAAe,OAAe,OAA+B;AAC3E,MAAI,OAAO;AACT,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAMC,KAAI,qBAAqB;AAC/B,aAAO,sBAAuB,QAAQA,KAAKA,MAAKA,EAAC;AAAA,IACnD;AACA,QAAI,MAAM,SAAS,cAAc,MAAM,SAAS,WAAW;AACzD,YAAMA,KAAI,sBAAsB;AAChC,aAAO,uBAAwB,QAAQA,KAAKA,MAAKA,EAAC;AAAA,IACpD;AAAA,EACF;AACA,QAAM,IAAI,iBAAiB;AAC3B,SAAO,kBAAmB,QAAQ,IAAK,KAAK,CAAC;AAC/C;;;ACzCO,SAAS,YAAY,SAAmC,QAAyB;AACtF,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB;AACE,aAAO,QAAQ;AAAA,EACnB;AACF;AAuBO,SAAS,eAAe,IAAuC;AACpE,QAAM,UAAgD,CAAC;AACvD,MAAI,UAAU;AACd,aAAW,KAAK,GAAG,YAAY;AAC7B,YAAQ,KAAK;AAAA,MACX,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,MACT,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,MACR,KAAK,aAAa,EAAE,IAAI;AAAA,MACxB,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,MACjC,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,MACtD,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,aAAW,KAAK,GAAG,YAAY;AAC7B,YAAQ,KAAK;AAAA,MACX,IAAI,EAAE;AAAA,MACN,OAAO,EAAE;AAAA,MACT,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,MACR,KAAK,aAAa,EAAE,KAAK;AAAA,MACzB,GAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;AAAA,MAC9B,GAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,MACvC,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,MACtD,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AACA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI;AACvD,SAAO;AACT;;;ACtCA,IAAM,kBAAkB,CAAC,SAAyB,WAAW,MAAM,MAAM;AAElE,SAAS,oBAAoB,IAAsB,OAAoC;AAC5F,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,SAAS,QAAQ;AAGvB,QAAM,UAAwB,eAAe,EAAE,EAAE,IAAI,CAAC,OAAO;AAAA,IAC3D,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,SAAS,gBAAgB,EAAE,IAAI;AAAA,IAC/B,KAAK,EAAE;AAAA,IACP,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,IAAI,CAAC;AAAA,IACtD,MAAM,EAAE;AAAA,IACR,GAAI,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3C,UAAU,QAAQ;AAAA,EACpB,EAAE;AAIF,UAAQ,QAAQ,CAAC,GAAG,MAAM;AACxB,MAAE,WACA,EAAE,eAAe,WACb,QAAQ,UACR,EAAE,eAAe,YACf,QAAQ,QACR,eAAe,GAAG,KAAK;AAAA,EACjC,CAAC;AAGD,QAAM,QAAQ;AACd,QAAM,UAAU;AAChB,QAAM,WAAW;AACjB,QAAM,SAAS;AACf,QAAM,OAAO;AACb,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,YAAY,WAAW;AAC7B,QAAM,WAAW,WAAW;AAC5B,QAAM,WAAW,WAAW;AAC5B,QAAM,UAAU,OAAO,YAAY,GAAG;AACtC,QAAM,SAAS,OAAO,WAAW,IAAI;AAErC,QAAM,SAAS,OAAO,SAAS,QAAQ,QAAQ;AAC/C,QAAM,YAAY,SAAS;AAC3B,QAAM,aAAa,SAAS;AAC5B,QAAM,SAAS,OAAO,aAAa,QAAQ,MAAM;AAEjD,QAAM,WAAW,OAAO,GAAG,SAAS,aAAa,WAAW,GAAG,SAAS,WAAW;AACnF,QAAM,UAAU,GAAG,SAAS,QACxB,WAAW,iBAAiB,WAAW,WAAW,eAAe,KAAK,KAAK,KAC3E;AACJ,MAAI,IAAI,SAAS,UAAU;AAC3B,QAAM,SAAS;AAOf,QAAM,SAAmB,QAAQ,IAAI,CAAC,MAAM;AAC1C,UAAM,YAAY,qBAAqB,EAAE,OAAO,WAAW,UAAU,QAAQ,CAAC;AAC9E,UAAM,WAAW,EAAE,cACf,qBAAqB,EAAE,aAAa,UAAU,UAAU,QAAQ,CAAC,IACjE;AACJ,UAAM,SAAS,UAAU,YAAY;AACrC,UAAM,QAAQ,WAAW,IAAI,SAAS,YAAY,SAAS;AAC3D,UAAM,QAAQ,OAAO,UAAU,WAAW,MAAM,IAAI,SAAS,QAAQ,OAAO;AAC5E,WAAO,EAAE,GAAG,GAAG,WAAW,UAAU,MAAM;AAAA,EAC5C,CAAC;AAED,QAAM,WAA2B,CAAC;AAClC,QAAM,IAAI,IAAI,KAAK;AAGnB,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ,OAAO,SAAS,CAAC;AAAA,QACjB,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AACA,QAAI,UAAU;AACZ,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA,OAAO,SAAS,CAAC;AAAA,UACjB,SAAS,WAAW,gBAAgB,WAAW,eAAe;AAAA,UAC9D,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY;AAChB,SAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,UAAM,UAAU,IAAI,MAAM;AAC1B,UAAM,QAAQ,OAAO,IAAI,EAAE,QAAQ,CAAC;AACpC,UAAM,QAAQ,UAAU,aAAa,YAAY;AACjD,UAAM,QAAQ,OAAO,CAAC;AAGtB,UAAM,SAAS,UAAU,aAAa;AACtC,aAAS,KAAK,EAAE,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,IAAI,QAAQ,QAAQ,GAAG,CAAC;AAGtF,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,QAAQ,EAAE,MAAM;AAAA,QACpD,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AAEA,UAAM,UAAU,UAAU,QAAQ,QAAQ,QAAQ;AAClD,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,GAAG,SAAS,GAAG,OAAO,OAAO,GAAG,QAAQ,EAAE,MAAM,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC;AAAA,IACvF;AAGA,UAAM,QAAQ,QAAQ;AACtB,QAAI,KAAK,QAAQ,UAAU;AAC3B,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,SAAS,OAAO,IAAI,UAAU,EAAE,UAAU,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,CAAC;AAAA,IACxF;AACA,UAAM;AACN,UAAM,SAAS,EAAE,UAAU,YAAY;AACvC,aAAS;AAAA,MACP,GAAG;AAAA,QACD;AAAA,QACA,EAAE;AAAA,QACF;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,EAAE,OAAO,SAAS,aAAa,KAAK;AAAA,MACtC;AAAA,IACF;AACA,UAAM;AACN,QAAI,EAAE,UAAU;AACd,YAAM;AACN,YAAM,QAAQ,EAAE,SAAS,YAAY;AACrC,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,EAAE;AAAA,UACF;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,EAAE,OAAO,QAAQ;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,EAAE,SAAS,aAAa;AAC1B,YAAM,IAAI,OAAO;AACjB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,MAAM,IAAI,QAAQ,CAAC,MAAM,SAAS,CAAC,IAAI,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,SAAS,CAAC,IAAI,KAAK;AAAA,UACnG,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,MAAM,EAAE,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,CAAC,CAAC;AAAA,IAC1F;AAEA,gBAAY;AACZ,SAAK,EAAE,QAAQ;AAAA,EACjB,CAAC;AAGD,WAAS,QAAQ,EAAE,KAAK,KAAK,MAAM,IAAI,MAAM,MAAM,MAAM,IAAI,SAAS,IAAI,QAAQ,QAAQ,GAAG,CAAC;AAE9F,QAAM,SAAS,OAAO,IAAI,SAAS,MAAM;AAEzC,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACtNA,SAAS,aAAa,GAAW,KAAoC;AACnE,QAAM,EAAE,IAAI,IAAI,YAAY,OAAO,YAAY,YAAY,GAAG,SAAS,IAAI;AAC3E,QAAM,SAAS,KAAK,KAAK;AACzB,MAAI,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,WAAW,CAAC;AAExD,WAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,UAAM,QAAQ,aAAa,MAAM;AACjC,QAAI,aAAa,WAAW,MAAM;AAChC,YAAM,IAAI,KAAK,IAAI,WAAW,QAAQ;AACtC,aAAO,MAAM,MAAM,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,IAC7F;AACA,iBAAa;AACb,QAAI,MAAM,QAAQ,GAAG;AACnB,UAAI,aAAa,SAAS,MAAM;AAC9B,cAAM,QAAQ,KAAK,IAAI,WAAW,MAAM,IAAI;AAC5C,eAAO,MAAM,MAAM,IACf,EAAE,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,EAAE,IAC9E,EAAE,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,EAAE;AAAA,MACpF;AACA,mBAAa;AAAA,IACf;AAAA,EACF;AACA,QAAM,UAAU,QAAQ;AACxB,QAAM,SAAS,IAAI,aAAa,UAAU,UAAU;AACpD,SAAO,UAAU,MAAM,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO;AACjF;AAGA,SAAS,WAAW,KAAkB;AACpC,QAAM,EAAE,IAAI,IAAI,YAAY,OAAO,YAAY,YAAY,EAAE,IAAI;AACjE,QAAM,QAAkB,CAAC;AACzB,WAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,UAAM,IAAI,IAAI,aAAa,MAAM,UAAU;AAC3C,UAAM,SAAS,IAAI,cAAc,MAAM,KAAK,UAAU;AACtD,QAAI,QAAQ,EAAG,OAAM,KAAK,KAAK,EAAE,IAAI,CAAC,EAAE;AACxC,QAAI,MAAM,MAAM,GAAG;AACjB,YAAM,KAAK,KAAK,EAAE,IAAI,CAAC,EAAE;AACzB,UAAI,MAAM,QAAQ,EAAG,OAAM,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,MAAM,EAAE;AAAA,IACrE,OAAO;AACL,YAAM,KAAK,KAAK,EAAE,IAAI,CAAC,EAAE;AACzB,UAAI,MAAM,QAAQ,EAAG,OAAM,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,MAAM,EAAE;AAAA,IACrE;AAAA,EACF;AACA,SAAO,MAAM,KAAK,GAAG;AACvB;AASO,SAAS,iBAAiB,IAAsB,OAAoC;AACzF,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,IAAI,IAAI,KAAK;AAGnB,QAAM,UAAuB,eAAe,EAAE,EAAE,IAAI,CAAC,OAAO;AAAA,IAC1D,IAAI,EAAE;AAAA,IACN,OAAO,EAAE;AAAA,IACT,KAAK,EAAE;AAAA,IACP,OAAO,EAAE,SAAS,cAAc,QAAQ,UAAU,YAAY,SAAS,EAAE,MAAM;AAAA,EACjF,EAAE;AACF,QAAM,IAAI,QAAQ;AAGlB,QAAM,IAAI;AACV,QAAM,aAAa;AACnB,QAAM,aAAa;AACnB,QAAM,aAAa;AACnB,QAAM,QAAQ;AACd,QAAM,SAAS;AACf,QAAM,UAAU,IAAI,aAAa,EAAE;AACnC,QAAM,UAAU,IAAI,IAAI,aAAa,EAAE;AACvC,QAAM,QAAQ,IAAI,UAAU,OAAO;AAEnC,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC;AAC1C,QAAM,UAAU,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACpE,QAAM,UAAU;AAChB,QAAM,aAAa;AACnB,QAAM,aAAa,IAAI,UAAU,OAAO;AACxC,QAAM,SAAS,IAAI,KAAK,KAAK,UAAU;AACvC,QAAM,cAAc,IAAI,QAAQ,SAAS,QAAQ,KAAK,MAAM;AAC5D,QAAM,WAAW,IAAI,cAAc,QAAQ,KAAK,UAAU;AAC1D,QAAM,UAAU,OAAO,WAAW,UAAU;AAE5C,QAAM,MAAW;AAAA,IACf,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF;AAEA,QAAM,WAA2B,CAAC;AAGlC,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ,IAAI,IAAI,CAAC;AAAA,QACT,OAAO,WAAW,gBAAgB,CAAC;AAAA,QACnC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,WAAW,GAAG;AAC5B,QAAM,YAAY,aAAa,GAAG,GAAG;AACrC,QAAM,UAAU,aAAa,aAAa,GAAG;AAE7C,WAAS,KAAK,EAAE,KAAK,OAAO,QAAQ,SAAS,YAAY,EAAE,MAAM,OAAO,CAAC,CAAC;AAG1E,WAAS,QAAQ,GAAmB;AAClC,QAAI,YAAY,KAAK,IAAI,GAAG,CAAC;AAC7B,aAAS,MAAM,GAAG,MAAM,OAAO,OAAO;AACpC,UAAI,aAAa,QAAQ,KAAM,QAAO;AACtC,mBAAa;AACb,UAAI,MAAM,QAAQ,GAAG;AACnB,YAAI,aAAa,SAAS,KAAM,QAAO;AACvC,qBAAa;AAAA,MACf;AAAA,IACF;AACA,WAAO,QAAQ;AAAA,EACjB;AAEA,QAAM,gBAAgB,WAAW;AACjC,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,IAAI,KAAM,IAAI,OAAO,IAAK,WAAW;AAC3C,UAAM,KAAK,aAAa,GAAG,GAAG;AAC9B,UAAM,IAAI,QAAQ,CAAC;AAEnB,aAAS,KAAK,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,OAAO,QAAQ,YAAY,EAAE,OAAO,CAAC,CAAC;AAEnF,UAAM,YAAY,QAAQ,CAAC,IAAI,MAAM;AACrC,UAAM,SAAS,YAAY,IAAI,GAAG,IAAI,QAAQ,IAAI,gBAAgB,GAAG,IAAI,IAAI,GAAG,IAAI,QAAQ,CAAC;AAC7F,UAAM,YAAY,EAAE,MAAM,SAAS,KAAK,GAAG,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC,WAAM,EAAE;AACvE,aAAS;AAAA,MACP,EAAE,KAAK,WAAW,GAAG,GAAG,QAAQ,eAAe,QAAQ,MAAM,EAAE,QAAQ,SAAS,CAAC;AAAA,IACnF;AAAA,EACF;AAGA,WAAS;AAAA,IACP,EAAE,OAAO,EAAE,GAAG,UAAU,GAAG,GAAG,UAAU,EAAE,GAAG,QAAQ,QAAQ,SAAS,QAAQ,SAAS,CAAC;AAAA,EAC1F;AACA;AACE,UAAM,KAAK,UAAU,GACnB,KAAK,UAAU,GACf,IAAI,SAAS;AACf,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;AAAA,QACvG,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,MAAM,QAAQ,WAAW;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,WAAS;AAAA,IACP,EAAE,OAAO,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE,GAAG,QAAQ,QAAQ,SAAS,QAAQ,SAAS,CAAC;AAAA,EACtF;AACA,WAAS;AAAA,IACP,EAAE,OAAO,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE,GAAG,IAAI,SAAS,IAAI,GAAG,QAAQ,QAAQ,YAAY,GAAG;AAAA,EAC9F;AACA,WAAS;AAAA,IACP,EAAE;AAAA,MACA,EAAE,GAAG,QAAQ,GAAG,GAAG,QAAQ,EAAE;AAAA,MAC7B,IAAI,SAAS,IAAI;AAAA,MACjB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,QAAQ;AAAA,MACjD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AChNA,IAAM,UAAU;AAChB,IAAM,WAAW;AACjB,IAAM,UAAU,CAAC,SAAyB,WAAW,MAAM,MAAM;AAU1D,SAAS,cAAc,IAAsB,OAAoC;AACtF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,OAAO,IAAI,KAAK;AACtB,QAAM,SAAS,QAAQ;AAGvB,QAAM,OAAO,GAAG;AAChB,QAAM,QAAQ,GAAG;AACjB,QAAM,UAAoB,CAAC;AAC3B,aAAW,KAAK,MAAM;AACpB,YAAQ,KAAK,QAAQ,EAAE,KAAK,GAAG,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;AAAA,EAC3D;AACA,aAAW,KAAK,MAAO,SAAQ,KAAK,QAAQ,EAAE,IAAI,CAAC;AACnD,MAAI,QAAQ,WAAW,EAAG,SAAQ,KAAK,GAAG,CAAC;AAC3C,QAAM,SAAS,KAAK,IAAI,GAAG,OAAO;AAClC,QAAM,SAAS,KAAK,IAAI,GAAG,OAAO;AAClC,QAAM,OAAO,KAAK,IAAI,GAAG,SAAS,MAAM;AAGxC,QAAM,IAAI;AACV,QAAM,WAAW,SAAS;AAC1B,QAAM,YAAY,IAAI,SAAS;AAC/B,QAAM,QAAQ,YAAY;AAC1B,QAAM,QAAQ,CAAC,QAAwB,OAAO,YAAa,MAAM,UAAU,OAAQ,KAAK;AAGxF,QAAM,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,MAAM,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,CAAC;AAC3E,QAAM,WAAqB,CAAC;AAC5B,QAAM,QAAgB,OAAO,IAAI,CAAC,MAAM;AACtC,UAAM,IAAI,QAAQ,EAAE,KAAK;AACzB,UAAM,IAAI,KAAK,IAAI,SAAS,EAAE,OAAO,EAAE,KAAK,GAAG,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC;AACxE,QAAI,OAAO,SAAS,UAAU,CAAC,QAAQ,KAAK,GAAG;AAC/C,QAAI,SAAS,IAAI;AACf,aAAO,SAAS;AAChB,eAAS,KAAK,CAAC;AAAA,IACjB,MAAO,UAAS,IAAI,IAAI;AACxB,WAAO,EAAE,OAAO,EAAE,OAAO,UAAU,GAAG,QAAQ,GAAG,OAAO,YAAY,SAAS,EAAE,MAAM,GAAG,KAAK;AAAA,EAC/F,CAAC;AACD,QAAM,WAAW,KAAK,IAAI,GAAG,SAAS,MAAM;AAG5C,QAAM,UAAU,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACpE,QAAM,WAAW,MAAM,SAAS,KAAK;AACrC,QAAM,QAAQ;AACd,QAAM,UAAU;AAChB,QAAM,UAAU,SAAS,UAAU;AACnC,QAAM,QAAQ,WAAW,SAAS,WAAW,KAAK;AAClD,QAAM,UAAU,UAAU;AAC1B,QAAM,QAAQ,UAAU;AACxB,QAAM,SAAS,OAAO,QAAQ,WAAW,gBAAgB,MAAM;AAE/D,QAAM,WAA2B,CAAC;AAGlC,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,KAAK;AAAA,QACH,GAAG,SAAS;AAAA,QACZ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAGA,WAAS;AAAA,IACP,KAAK;AAAA,MACH,EAAE,GAAG,UAAU,GAAG,SAAS,OAAO,OAAO,QAAQ,MAAM;AAAA,MACvD,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,IAAI,EAAE;AAAA,IACV;AAAA,EACF;AAGA,QAAM,WAAW,WAAW;AAC5B,aAAW,KAAK,OAAO;AACrB,UAAM,KAAK,MAAM,EAAE,QAAQ,GACzB,KAAK,MAAM,EAAE,MAAM;AACrB,UAAM,KAAK,IACT,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE;AAC3B,UAAM,KAAK,UAAU,EAAE,QAAQ,QAAQ;AACvC,aAAS;AAAA,MACP,KAAK,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,QAAQ,MAAM,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,IACtF;AACA,UAAM,QAAQ,aAAa,EAAE,OAAO,UAAU,KAAK,EAAE;AACrD,QAAI,SAAS,YAAY,OAAO,QAAQ,EAAE,SAAS,KAAK,GAAG;AACzD,eAAS;AAAA,QACP,KAAK;AAAA,UACH;AAAA,UACA,KAAK,KAAK;AAAA,UACV,KAAK,QAAQ,IAAI,WAAW;AAAA,UAC5B;AAAA,UACA,QAAQ;AAAA,UACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,KAAK,OAAO;AACrB,UAAM,KAAK,MAAM,QAAQ,EAAE,IAAI,CAAC;AAChC,UAAM,SAAS,SAAS,UAAU,WAAW;AAC7C,aAAS;AAAA,MACP,KAAK,KAAK,EAAE,OAAO,IAAI,QAAQ,WAAW,cAAc,QAAQ,MAAM;AAAA,QACpE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,aAAS;AAAA,MACP,KAAK;AAAA,QACH,IAAI,QAAQ,EAAE,IAAI,CAAC;AAAA,QACnB;AAAA,QACA,SAAS,WAAW,gBAAgB;AAAA,QACpC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,SAAS;AAAA,MACrB;AAAA,IACF;AAEA,aAAS;AAAA,MACP,KAAK;AAAA,QACH,KAAK,EAAE,IAAI,SAAS,WAAW,gBAAgB,CAAC,MAAM,EAAE,IAAI,OAAO;AAAA,QACnE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,aAAS,KAAK,KAAK,OAAO,EAAE,GAAG,IAAI,GAAG,QAAQ,GAAG,GAAG,QAAQ,SAAS,QAAQ,YAAY,GAAG,CAAC;AAAA,EAC/F;AAGA,WAAS,KAAK,KAAK,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,SAAS,IAAI,KAAK,IAAI,QAAQ,QAAQ,GAAG,CAAC;AAC9F,QAAM,YAAY,oBAAI,IAAY;AAClC,aAAW,KAAK,MAAO,WAAU,IAAI,EAAE,IAAI;AAC3C,aAAW,KAAK,MAAM;AACpB,cAAU,IAAI,EAAE,KAAK;AACrB,QAAI,EAAE,IAAK,WAAU,IAAI,EAAE,GAAG;AAAA,EAChC;AACA,aAAW,KAAK,WAAW;AACzB,UAAM,IAAI,MAAM,QAAQ,CAAC,CAAC;AAC1B,aAAS,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC,CAAC;AACrF,aAAS;AAAA,MACP,KAAK;AAAA,QACH,QAAQ,CAAC;AAAA,QACT;AAAA,QACA,QAAQ,WAAW,gBAAgB;AAAA,QACnC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,OAAO;AAAA,MAChD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AC3MA,SAAS,SAAS,GAA2C;AAC3D,QAAM,IAAI,EAAE,KAAK;AACjB,QAAM,KAAK,EAAE,MAAM,oCAAoC;AACvD,MAAI;AACF,WAAO;AAAA,MACL,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,MAC5B,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,MAC5B,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,IAC9B;AACF,QAAM,KAAK,EAAE,MAAM,6CAA6C;AAChE,MAAI,GAAI,QAAO,CAAC,SAAS,GAAG,CAAC,GAAI,EAAE,GAAG,SAAS,GAAG,CAAC,GAAI,EAAE,GAAG,SAAS,GAAG,CAAC,GAAI,EAAE,CAAC;AAChF,SAAO;AACT;AAEO,SAAS,kBAAkB,OAAkC;AAClE,QAAM,MAAM,SAAS,KAAK;AAC1B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,CAAC,MAAsB;AACpC,UAAM,IAAI,IAAI;AACd,WAAO,KAAK,UAAU,IAAI,UAAU,IAAI,SAAS,UAAU;AAAA,EAC7D;AACA,SAAO,SAAS,OAAO,IAAI,CAAC,CAAC,IAAI,SAAS,OAAO,IAAI,CAAC,CAAC,IAAI,SAAS,OAAO,IAAI,CAAC,CAAC;AACnF;AAEO,SAAS,cAAc,GAAU,GAAkB;AACxD,QAAM,KAAK,kBAAkB,CAAC,GAC5B,KAAK,kBAAkB,CAAC;AAC1B,MAAI,OAAO,UAAa,OAAO,OAAW,QAAO;AACjD,QAAM,KAAK,KAAK,IAAI,IAAI,EAAE,GACxB,KAAK,KAAK,IAAI,IAAI,EAAE;AACtB,UAAQ,KAAK,SAAS,KAAK;AAC7B;AAEO,SAAS,aAAa,MAAa,YAA8B,UAAwB;AAC9F,MAAI,OAAO,UACT,QAAQ,cAAc,UAAU,IAAI;AACtC,aAAW,KAAK,YAAY;AAC1B,QAAI,kBAAkB,CAAC,MAAM,OAAW;AACxC,UAAM,OAAO,cAAc,GAAG,IAAI;AAClC,QAAI,OAAO,OAAO;AAChB,aAAO;AACP,cAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,aAAa,MAAa,OAA6B;AAOrE,QAAM,IAAI,MAAM;AAChB,SAAO,aAAa,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,EAAE,IAAI;AAC5F;AAEO,SAAS,YAAY,OAA+B;AACzD,QAAM,MAAM,kBAAkB,MAAM,QAAQ,UAAU;AACtD,SAAO,QAAQ,SAAY,MAAM,MAAM;AACzC;;;AC7BA,IAAM,kBAAmC;AAAA,EACvC;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AACF;AAEA,IAAM,gBAAgB;AACtB,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AACvB,IAAM,YAAY;AAClB,IAAM,YAAY;AAClB,IAAM,SAAS;AAEf,IAAMC,WAAU;AAChB,IAAM,YAAY,CAAC,SAAyB,WAAW,MAAM,MAAM;AAa5D,SAAS,sBAAsB,IAAsB,OAAoC;AAC9F,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,OAAO,YAAY,KAAK;AAC9B,QAAM,mBAAmB,CAAC,QAA+B;AACvD,UAAM,MAAM,gBAAgB,MAAM,gBAAgB,MAAM;AACxD,QAAI,MAAM;AACR,aAAO;AAAA,QACL,QAAQ,IAAI;AAAA,QACZ,QAAQ,IAAI;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,YAAY;AAAA,QACZ,WAAW,QAAQ;AAAA,QACnB,aAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,aAAc,GAAG,YAAY,CAAC;AACpC,QAAM,YACJ,WAAW,SACP,WAAW,IAAI,CAAC,OAAO;AAAA,IACrB,OAAO,EAAE;AAAA,IACT,UAAUA,SAAQ,EAAE,KAAK;AAAA,IACzB,SAAS,CAAC;AAAA,EACZ,EAAE,IACF,CAAC,EAAE,OAAO,GAAG,SAAS,SAAS,YAAY,UAAU,WAAW,SAAS,CAAC,EAAc,CAAC,GAC7F,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAExC,QAAM,gBAAgB,CAAC,QAAqB;AAC1C,QAAI,SAAS,SAAS,CAAC;AACvB,eAAW,KAAK,SAAU,KAAI,EAAE,YAAY,IAAK,UAAS;AAC1D,WAAO;AAAA,EACT;AAOA,QAAM,UAAmB,CAAC;AAC1B,aAAW,KAAK,GAAG;AACjB,YAAQ,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,CAAC;AAC/C,aAAW,KAAK,GAAG;AACjB,YAAQ,KAAK,EAAE,MAAM,EAAE,OAAO,OAAO,EAAE,MAAM,CAAC;AAEhD,aAAW,KAAK,SAAS;AACvB,UAAM,MAAMA,SAAQ,EAAE,IAAI;AAC1B,UAAM,MAAM,cAAc,GAAG;AAC7B,QAAI,SAAS,IAAI,QAAQ,KAAK,CAACC,OAAMA,GAAE,SAAS,EAAE,IAAI;AACtD,QAAI,CAAC,QAAQ;AACX,eAAS,EAAE,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC,EAAE;AACzC,UAAI,QAAQ,KAAK,MAAM;AAAA,IACzB;AACA,WAAO,OAAO,KAAK,EAAE,KAAK;AAAA,EAC5B;AAEA,QAAMC,YAAW,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,SAAS,CAAC;AAC5D,aAAW,KAAKA,UAAU,GAAE,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG;AAEhE,QAAM,eAAeA,UAAS,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,QAAQ,CAAC;AACtE,QAAM,YAAYA,UAAS;AAAA,IACzB,CAAC,GAAG,MACF,KAAK;AAAA,MACH;AAAA,MACA,EAAE,QAAQ,OAAO,CAACD,IAAG,QAAQ,KAAK,IAAIA,IAAG,IAAI,OAAO,MAAM,GAAG,CAAC;AAAA,IAChE;AAAA,IACF;AAAA,EACF;AAGA,QAAM,OAAO;AACb,QAAM,UAAU,OAAO,KAAK,IAAI,cAAc,CAAC,IAAI,OAAO,SAAS,CAAC;AACpE,QAAM,SAAS,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACnE,QAAM,aAAa;AAAA,IACjB,iBACE,YAAY,cACZ,KAAK,IAAI,GAAG,YAAY,CAAC,IAAI,gBAC7B;AAAA,EACJ;AAEA,QAAM,kBAAkB,SAAS;AACjC,QAAM,gBAAgB,kBAAkB;AACxC,QAAM,gBAAgB,gBAAgB;AACtC,QAAM,WAAW;AACjB,QAAM,YAAY,gBAAgB;AAClC,QAAM,aAAa,YAAY;AAC/B,QAAM,UAAU,OAAO,YAAY,aAAa,MAAM;AAEtD,QAAM,WAA2B,CAAC;AAClC,QAAM,IAAI,IAAI,KAAK;AAGnB,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ,OAAO,UAAU,CAAC;AAAA,QAClB,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,WAAW;AAC7B,MAAI,UAAU;AACd,EAAAC,UAAS,QAAQ,CAAC,SAAS,OAAO;AAChC,UAAM,SAAS,iBAAiB,EAAE;AAClC,UAAM,WAAW,OAAO,OAAO,QAAQ,QAAQ,MAAM;AAGrD,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,SAAS,GAAG,iBAAiB,OAAO,UAAU,QAAQ,cAAc;AAAA,QACzE,OAAO;AAAA,QACP,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,QAAQ;AAAA,QACR,UAAU,WAAW;AAAA,QACrB,kBAAkB,gBAAgB,IAAI,YAAY;AAAA,QAClD,WAAW;AAAA,QACX,OAAO;AAAA,QACP,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAGA,YAAQ,QAAQ,QAAQ,CAAC,QAAQ,OAAO;AACtC,YAAM,KAAK,UAAU,KAAK;AAG1B,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,GAAG,eAAe,OAAO,MAAM,QAAQ,aAAa;AAAA,UAC7D,OAAO;AAAA,UACP,OAAO;AAAA,UACP;AAAA,QACF;AAAA,MACF;AACA,UAAI,KAAK,GAAG;AACV,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK,EAAE,IAAI,aAAa,MAAM,EAAE,IAAI,gBAAgB,YAAY;AAAA,YAChE,OAAO;AAAA,YACP;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA,UAAU,OAAO,IAAI;AAAA,UACrB,KAAK,OAAO;AAAA,UACZ,gBAAgB,eAAe,IAAI,YAAY;AAAA,UAC/C;AAAA,UACA,OAAO;AAAA,UACP,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,QACrC;AAAA,MACF;AAGA,aAAO,OAAO,QAAQ,CAAC,OAAO,OAAO;AACnC,cAAM,KAAK,aAAa,MAAM,cAAc;AAC5C,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,EAAE,GAAG,KAAK,WAAW,GAAG,IAAI,OAAO,OAAO,IAAI,WAAW,QAAQ,YAAY;AAAA,YAC7E,OAAO;AAAA,YACP,OAAO;AAAA,YACP;AAAA,YACA,EAAE,IAAI,EAAE;AAAA,UACV;AAAA,QACF;AACA,cAAMC,SAAQC,UAAS,OAAO,WAAW,OAAO,IAAI,YAAY,GAAG,CAAC,EAAE;AACtE,cAAM,QAAQ,OAAO,YAAY,IAAI;AACrC,cAAM,SAAS,KAAK,cAAc,KAAMD,OAAM,SAAS,KAAK,QAAS,IAAI,YAAY;AACrF,QAAAA,OAAM,QAAQ,CAAC,IAAI,OAAO;AACxB,mBAAS;AAAA,YACP,EAAE,KAAK,IAAI,KAAK,OAAO,GAAG,SAAS,KAAK,OAAO,WAAW,OAAO,WAAW;AAAA,cAC1E,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAED,eAAW;AAAA,EACb,CAAC;AAGD,QAAM,WAAW;AACjB,WAAS;AAAA,IACP,EAAE,KAAK,KAAK,MAAM,IAAI,SAAS,MAAM,QAAQ,IAAI,SAAS,IAAI,QAAQ,WAAW,CAAC;AAAA,EACpF;AACA,WAAS;AAAA,IACP,EAAE;AAAA,MACA,KAAK,QAAQ,IAAI,SAAS,MAAM,WAAW,CAAC,IAAI,YAAY,CAAC,MAAM,WAAW,CAAC,IAAI,YAAY,CAAC;AAAA,MAChG,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,MAAM,QAAQ,UAAU;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,SAAS,QAAQ,QAAQ;AAAA,MACvD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACnUO,SAAS,eAAe,IAAsB,OAAoC;AACvF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,UAAU,eAAe,EAAE;AACjC,QAAM,IAAI,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAGpC,QAAM,UAAU;AAChB,QAAM,UAAU,OAAO,WAAW,gBAAgB,CAAC;AACnD,QAAM,WAAW,WAAW;AAC5B,QAAM,YAAY,WAAW;AAC7B,QAAM,SAAS;AACf,QAAM,UAAU,OAAO,YAAY,GAAG;AACtC,QAAM,UAAU;AAChB,QAAM,aAAa,UAAU;AAG7B,QAAM,SAAS,QAAQ,IAAI,CAAC,OAAO;AAAA,IACjC,GAAG;AAAA,IACH,SAAS,WAAW,EAAE,MAAM,MAAM;AAAA,IAClC,YAAYE,UAAS,EAAE,OAAO,WAAW,QAAQ,CAAC,EAAE;AAAA,EACtD,EAAE;AACF,QAAM,gBAAgB,KAAK,IAAI,GAAG,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,MAAM,CAAC;AAC3E,QAAM,WAAW,aAAa,WAAW,UAAU,gBAAgB,UAAU;AAE7E,QAAM,WAAW,OAAO,GAAG,SAAS,aAAa,WAAW,GAAG,SAAS,WAAW;AACnF,QAAM,UAAU,GAAG,SAAS,QACxB,WAAW,iBAAiB,WAAW,WAAW,eAAe,KAAK,KAAK,KAC3E;AAEJ,QAAM,QAAQ,SAAS,UAAU,WAAW;AAC5C,QAAM,QAAQ,KAAK,IAAI,SAAS,IAAI,UAAU,IAAI,EAAE;AACpD,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAQ,CAAC,MAAsB,QAAQ,IAAI,QAAQ;AACzD,QAAM,SAAS,OAAO,MAAM,IAAI,CAAC,IAAI,UAAU,KAAK,MAAM;AAC1D,QAAM,SAAS,OAAO,QAAQ,UAAU,WAAW,MAAM;AAEzD,QAAM,WAA2B,CAAC;AAGlC,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ,OAAO,SAAS,CAAC;AAAA,QACjB,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AACA,QAAI,UAAU;AACZ,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA,OAAO,SAAS,CAAC;AAAA,UACjB,SAAS,WAAW,gBAAgB,WAAW,eAAe;AAAA,UAC9D,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,QAAM,OAAO,UAAU;AACvB,MAAI,QAAQ,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;AAC1C,QAAM,SAA0C,CAAC;AACjD,SAAO,QAAQ,CAAC,IAAI,MAAM;AACxB,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,YAAY,IAAI,MAAM;AAC5B,UAAM,QAAQ,YAAY,IAAI;AAC9B,aAAS,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;AACxG,WAAO,KAAK,EAAE,GAAG,GAAG,YAAY,QAAQ,OAAO,QAAQ,KAAK,CAAC;AAAA,EAC/D,CAAC;AACD,WAAS,MAAM,IAAI,SAAS,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC;AACjD,WAAS,KAAK,EAAE,KAAK,OAAO,QAAQ,QAAQ,CAAC,CAAC;AAG9C,aAAW,KAAK;AACd,aAAS;AAAA,MACP,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,QAAQ,SAAS,QAAQ,YAAY,GAAG;AAAA,IACpF;AAGF,SAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,QAAQ,IAAI,MAAM;AACxB,UAAM,SAAS,EAAE,WAAW;AAC5B,UAAM,WAAW,SAAS,YAAY,QAAQ;AAG9C,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE;AAAA,QAC3B;AAAA,QACA,SAAS,QAAQ,UAAU,QAAQ;AAAA,QACnC,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AAAA,QAC7B,IAAI,CAAC;AAAA,QACL,IAAI,QAAQ,UAAU,IAAI;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAGA,QAAI,OAAO;AACT,YAAM,QAAQ,QAAQ;AACtB,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,SAAS,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,UAAU,QAAQ,WAAW,EAAE,QAAQ,SAAS,CAAC;AAAA,MACzF;AACA,UAAI,KAAK,QAAQ,WAAW;AAC5B,eAAS,KAAK,EAAE,WAAW,SAAS,GAAG,MAAM,GAAG,MAAM;AACpD,iBAAS;AAAA,UACP,EAAE,KAAK,EAAE,WAAW,EAAE,GAAI,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,WAAW,QAAQ,SAAS;AAAA,YACrE,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,cAAM;AAAA,MACR;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,QAAQ;AACtB,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,SAAS,IAAI,CAAC,GAAG,IAAI,KAAK,GAAG,UAAU,QAAQ,WAAW,EAAE,QAAQ,SAAS,CAAC;AAAA,MACzF;AACA,UAAI,KAAK,QAAQ;AACjB,iBAAW,MAAM,EAAE,YAAY;AAC7B,iBAAS;AAAA,UACP,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,WAAW,QAAQ,SAAS;AAAA,YACtD,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AChKA,IAAM,mBAAqC;AAAA,EACzC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEA,IAAM,gBAAkC;AAAA,EACtC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEA,SAAS,iBACP,GACA,GACA,OACA,OACO;AACP,MAAI,MAAM,UAAU,MAAM,WAAW,WAAW;AAC9C,WAAO,YAAY,MAAM,SAAS,MAAM,MAAM;AAAA,EAChD;AACA,QAAM,SACJ,MAAM,SAAS,aACf,MAAM,KAAK,WAAW,KAAK,KAC3B,MAAM,SAAS;AACjB,MAAI,QAAQ;AACV,WAAO,IAAI,MAAM,IAAI,MAAM,QAAQ,UAAU,MAAM,QAAQ;AAAA,EAC7D;AACA,QAAM,MAAM,kBAAkB,MAAM,QAAQ,UAAU;AACtD,QAAM,SAAS,QAAQ,SAAY,MAAM,MAAM;AAC/C,QAAM,OAAO,SAAS,mBAAmB;AACzC,SAAO,KAAK,IAAI,KAAK,MAAM;AAC7B;AAEA,SAAS,cAAc,IAAY,IAAY,GAAW,MAAsB;AAC9E,QAAM,OAAO,KAAK,IAAI;AACtB,SAAO,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAC9N;AAEA,SAAS,YAAY,IAAY,IAAY,GAAmB;AAC9D,SAAO,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAC5H;AAEO,SAAS,WACd,IACA,OACA,SACc;AACd,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ,gBAAgB;AACvC,QAAM,WAA2B,CAAC;AAElC,QAAM,UAAU,eAAe,EAAE;AACjC,QAAM,IAAI,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAGpC,QAAM,UAAU;AAChB,QAAM,SAAS;AACf,QAAM,UAAU;AAChB,QAAM,cAAc;AACpB,QAAM,YAAY;AAClB,QAAM,QAAQ,KAAK,IAAI,KAAK,OAAO,WAAW,eAAe,EAAE,CAAC;AAChE,QAAM,SAAS,QAAQ;AAEvB,QAAM,YAAY,WAAW;AAC7B,QAAM,UAAU,OAAO,YAAY,GAAG;AACtC,QAAM,WAAW,WAAW;AAC5B,QAAM,SAAS,OAAO,WAAW,GAAG;AAGpC,QAAM,SAAkB,QAAQ,IAAI,CAAC,GAAG,MAAM,iBAAiB,GAAG,GAAG,OAAO,CAAC,CAAC;AAG9E,QAAM,SAAS,QAAQ,IAAI,CAAC,MAAM;AAChC,UAAM,kBACJ,8CAA8C,KAAK,EAAE,IAAI,KAAK,EAAE,QAAQ;AAC1E,UAAM,UAAU,CAAC,kBAAkB,WAAW,EAAE,MAAM,MAAM,IAAI;AAChE,UAAM,aAAaC,UAAS,EAAE,OAAO,WAAW,QAAQ,CAAC,EAAE;AAC3D,UAAM,YAAY,EAAE,cAAcA,UAAS,EAAE,aAAa,UAAU,QAAQ,CAAC,EAAE,QAAQ,CAAC;AACxF,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,KAAK,IAAI,GAAG,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,WAAW,MAAM,CAAC;AAC3E,QAAM,eAAe,KAAK,IAAI,GAAG,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,MAAM,CAAC;AACzE,QAAM,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,YAAY,MAAS;AAE3D,QAAM,eACH,WAAW,SAAS,IAAI,KACzB,gBAAgB,WACf,eAAe,IAAI,eAAe,SAAS,IAAI;AAGlD,QAAM,WAAW,OAAO,GAAG,SAAS,aAAa,WAAW,GAAG,SAAS,WAAW;AACnF,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,UAAU,QACZ,WAAW,gBAAgB,KAAK,WAAW,WAAW,eAAe,IAAI,KAAK,KAC9E;AAGJ,QAAM,WAAW,SAAS,UAAU,UAAU;AAC9C,QAAM,SAAS,WAAW;AAC1B,QAAM,WAAW,WAAW;AAE5B,QAAM,QAAQ,SAAS,UAAU;AACjC,QAAM,QAAQ,CAAC,MAAsB,QAAQ,IAAI;AACjD,QAAM,QAAQ,CAAC,MAAuB,IAAI,MAAM,IAAI,WAAW;AAE/D,QAAM,SAAS,OAAO,MAAM,IAAI,CAAC,IAAI,UAAU,SAAS,EAAE;AAC1D,QAAM,YAAY,WAAW,UAAU,UAAU;AACjD,QAAM,SAAS,OAAO,YAAY,cAAc,MAAM;AAGtD,MAAI,OAAO;AACT,UAAM,SAAS,SAAS,WAAW;AACnC,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,SAAS,GAAG,QAAQ,WAAW,gBAAgB,GAAG,QAAQ,MAAM;AAAA,QAC5E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,UAAU;AACZ,eAAS;AAAA,QACP,EAAE,KAAK,UAAU,SAAS,GAAG,SAAS,WAAW,eAAe,IAAI,WAAW,cAAc,QAAQ,WAAW;AAAA,UAC9G,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,MAAkC,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,OAAO;AAAA,IAC3E,GAAG,MAAM,CAAC;AAAA,IACV,GAAG,MAAM,CAAC;AAAA,EACZ,EAAE;AAGF,QAAM,OAAiB,CAAC;AACxB,MAAI,IAAI,GAAG;AACT,UAAM,SAAS;AACf,UAAM,QAAQ,OACX,IAAI,CAAC,GAAG,QAAQ;AACf,YAAM,MAAM,IAAK,OAAO,IAAI,KAAM,GAAG;AACrC,aAAO,iBAAiB,GAAG,kBAAkB,CAAC;AAAA,IAChD,CAAC,EACA,KAAK,EAAE;AACV,SAAK;AAAA,MACH,uBAAuB,MAAM,wCAAwC,IAAI,IAAI,CAAC,EAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,IAAI,CAAC,EAAG,CAAC,CAAC,YAAY,KAAK;AAAA,IACxI;AAEA,QAAI,IAAI,KAAK,IAAI,IAAI,CAAC,EAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,EAAG,CAAC,CAAC;AAC7C,aAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,YAAM,KAAK,IAAI,CAAC;AAChB,YAAM,KAAK,IAAI,IAAI,CAAC;AACpB,YAAM,KAAK,GAAG,IAAI,GAAG;AACrB,YAAM,OAAO,IAAI,GAAG,IAAI,KAAK,GAAG;AAChC,YAAM,OAAO,IAAI,GAAG,CAAC;AACrB,YAAM,OAAO,IAAI,GAAG,IAAI,KAAK,GAAG;AAChC,YAAM,OAAO,IAAI,GAAG,CAAC;AACrB,WAAK,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IACrE;AAEA,aAAS;AAAA,MACP,EAAE,KAAK,GAAG,QAAQ,MAAM,KAAK,WAAW;AAAA,IAC1C;AAAA,EACF;AAGA,QAAM,UAA+F,CAAC;AAEtG,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,KAAK,IAAI,CAAC;AAChB,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,WAAW,IAAI,MAAM;AAG3B,UAAM,OAAO,WACT,cAAc,GAAG,GAAG,GAAG,GAAG,SAAS,OAAO,IAC1C,YAAY,GAAG,GAAG,GAAG,GAAG,OAAO;AAEnC,aAAS,KAAK,EAAE,KAAK,MAAM,OAAO,GAAG,EAAE,MAAM,MAAM,CAAC,CAAC;AAGrD,aAAS,KAAK,EAAE,OAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,WAAW,WAAW,CAAC,CAAC;AAG7E,QAAI,eAAe;AACnB,QAAI,MAAM,QAAQ,SAAS,OAAO;AAChC,YAAM,MAAM,aAAa,MAAM,IAAI;AACnC,UAAI,IAAI,IAAI;AACV,cAAM,WAAW,YAAY,IAAI,OAAO,QAAQ,KAAK;AACrD,YAAI,SAAS,IAAI;AACf,gBAAM,WAAW;AACjB,mBAAS;AAAA,YACP,EAAE,KAAK,SAAS,OAAO,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,IAAI,GAAG,IAAI,WAAW,CAAC,GAAG,QAAQ;AAAA,UACrF;AACA,yBAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,cAAc;AACjB,YAAM,aAAa,OAAO,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AAChD,eAAS;AAAA,QACP,EAAE,KAAK,YAAY,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,WAAW;AAAA,UAClD,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,OAAO;AAEX,QAAI,MAAM,SAAS;AACjB,eAAS;AAAA,QACP,EAAE,KAAK,MAAM,SAAS,GAAG,GAAG,MAAM,UAAU,QAAQ,WAAW;AAAA,UAC7D,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,cAAQ,SAAS;AAAA,IACnB;AAEA,aAAS,KAAK,GAAG,KAAK,MAAM,WAAW,QAAQ,MAAM;AACnD,YAAM,WAAW,MAAM,WAAW,EAAE,KAAK;AACzC,eAAS;AAAA,QACP,EAAE,KAAK,UAAU,GAAG,GAAG,OAAO,KAAK,SAAS,WAAW,QAAQ,MAAM;AAAA,UACnE,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AACA,YAAQ,MAAM,WAAW,SAAS;AAElC,aAAS,KAAK,GAAG,KAAK,MAAM,UAAU,QAAQ,MAAM;AAClD,YAAM,WAAW,MAAM,UAAU,EAAE,KAAK;AACxC,eAAS;AAAA,QACP,EAAE,KAAK,UAAU,GAAG,GAAG,OAAO,KAAK,QAAQ,UAAU,QAAQ,WAAW;AAAA,UACtE,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAGA,YAAQ,MAAM,EAAE,IAAI;AAAA,MAClB,QAAQ;AAAA,QACN,GAAG,GAAG,IAAI;AAAA,QACV,GAAG,GAAG,IAAI;AAAA,QACV,OAAO,UAAU;AAAA,QACjB,QAAQ,WAAW,UAAU,IAAI,UAAU,UAAU;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAmB;AAAA,IACvB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,IACrD,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,GAAI,KAAK,SAAS,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,EACpC;AAEA,QAAM,aAAa,cAAc,WAAY,GAAW,UAAU,KAAK;AAEvE,SAAO,EAAE,OAAO,YAAY,QAAQ;AACtC;;;AChSO,SAAS,eACd,IACA,OACA,SACc;AACd,UAAQ,GAAG,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO,oBAAoB,IAAI,KAAK;AAAA,IACtC,KAAK;AACH,aAAO,iBAAiB,IAAI,KAAK;AAAA,IACnC,KAAK;AACH,aAAO,cAAc,IAAI,KAAK;AAAA,IAChC,KAAK;AACH,aAAO,sBAAsB,IAAI,KAAK;AAAA,IACxC,KAAK;AACH,aAAO,eAAe,IAAI,KAAK;AAAA,IACjC,KAAK;AAAA,IACL,KAAK;AACH,aAAO,WAAW,IAAI,OAAO,OAAO;AAAA,IACtC,KAAK;AAAA,IACL;AACE,aAAO,iBAAiB,IAAI,KAAK;AAAA,EACrC;AACF;AAIA,SAAS,iBAAiB,IAAsB,OAAoC;AAClF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,WAA2B,CAAC;AAElC,QAAM,YAAY,WAAW,gBAAgB;AAC7C,QAAM,UAAU;AAChB,QAAM,aAAa;AACnB,QAAM,UAAU;AAChB,QAAM,aAAa;AACnB,QAAM,cAAc;AACpB,QAAM,WAAW;AACjB,QAAM,aAAa;AAEnB,QAAM,aAAa,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE;AAC5C,QAAM,aAAa,IAAI,IAAI,WAAW,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAK7D,QAAM,UAAU,aAAa;AAAA,IAC3B,GAAG,GAAG,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAClC,GAAG,GAAG,WAAW,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,GAAI,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,CAAE,CAAC;AAAA,IACpE,GAAI,GAAG,UAAU,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC;AAAA,EACxD,CAAC;AAED,QAAM,cAAc;AAAA,IAClB,GAAG,oBAAI,IAAI;AAAA,MACT,GAAG,GAAG,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MAClC,GAAG,GAAG,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,MACnC,GAAG,GAAG,WAAW,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAI;AAAA,MACvD,GAAI,GAAG,UAAU,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC;AAAA,IACxD,CAAC;AAAA,EACH,EAAE,KAAK,CAAC,GAAG,MAAM,QAAQ,MAAM,CAAC,IAAI,QAAQ,MAAM,CAAC,CAAC;AAGpD,WAAS,YAAY,KAAuB;AAC1C,UAAM,QAAQ,IAAI,MAAM,SAAS,YAAY;AAC7C,WAAO,KAAK,IAAI,OAAO,OAAO;AAAA,EAChC;AAGA,QAAM,mBAAmB,oBAAI,IAAwB;AACrD,aAAW,OAAO,GAAG,YAAY;AAC/B,QAAI,CAAC,iBAAiB,IAAI,IAAI,KAAK,EAAG,kBAAiB,IAAI,IAAI,OAAO,CAAC,CAAC;AACxE,qBAAiB,IAAI,IAAI,KAAK,EAAG,KAAK,GAAG;AAAA,EAC3C;AAGA,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,QAAQ,aAAa;AAC9B,UAAM,OAAO,iBAAiB,IAAI,IAAI;AACtC,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,gBAAU,IAAI,MAAM,CAAC;AACrB;AAAA,IACF;AAGA,UAAM,UAAU,oBAAI,IAAwB;AAC5C,eAAW,KAAK,MAAM;AACpB,UAAI,CAAC,QAAQ,IAAI,EAAE,KAAK,EAAG,SAAQ,IAAI,EAAE,OAAO,CAAC,CAAC;AAClD,cAAQ,IAAI,EAAE,KAAK,EAAG,KAAK,CAAC;AAAA,IAC9B;AAGA,QAAI,SAAS;AACb,eAAW,CAAC,EAAE,SAAS,KAAK,SAAS;AACnC,UAAI,IAAI;AACR,eAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,YAAI,IAAI,EAAG,MAAK;AAChB,aAAK,YAAY,UAAU,CAAC,CAAE;AAAA,MAChC;AACA,eAAS,KAAK,IAAI,QAAQ,CAAC;AAAA,IAC7B;AACA,cAAU,IAAI,MAAM,MAAM;AAAA,EAC5B;AAIA,QAAM,WAAW,SAAS;AAC1B,QAAM,QAAQ,oBAAI,IAAoB;AAItC,QAAM,qBAAqB,KAAK,IAAI,KAAM,QAAQ,QAAQ,MAAO,EAAE;AACnE,MAAI,SAAS;AAEb,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,UAAM,OAAO,YAAY,CAAC;AAC1B,UAAM,gBACJ,YAAa,QAAQ,MAAM,IAAI,IAAI,QAAQ,QAAQ,QAAQ,SAAS,KAAM;AAC5E,UAAM,IAAI,KAAK,IAAI,eAAe,MAAM;AACxC,UAAM,IAAI,MAAM,CAAC;AACjB,aAAS,KAAK,UAAU,IAAI,IAAI,KAAK,KAAK;AAAA,EAC5C;AAEA,QAAM,YAAY,SAAS,UAAU;AACrC,QAAM,QAAQ,UAAU,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK,KAAK;AAGjF,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,GAAG,UAAU;AACf,UAAM,WAAW,KAAK,WAAW,UAAU,cAAc,YAAY;AACrE,eAAW,OAAO,GAAG,UAAU;AAC7B,YAAM,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK;AACnC,YAAM,WAAW,MAAM,IAAI,IAAI,GAAG,KAAK;AACvC,YAAM,WAAW,UAAU,IAAI,IAAI,GAAG,KAAK;AAC3C,YAAM,KAAK,WAAW,KAAK,IAAI,UAAU,EAAE;AAC3C,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,KAAK,GAAG,GAAG,QAAQ,IAAI,OAAO,KAAK,KAAK,IAAI,QAAQ,SAAS;AAAA,UAClE,QAAQ,UAAU;AAAA,UAClB,QAAQ,UAAU;AAAA,UAClB;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,IAAI,OAAO,KAAK,GAAG,QAAQ,IAAI,WAAW,eAAe,QAAQ,SAAS;AAAA,UAC/E,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,WAAS,KAAK,EAAE,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,SAAS,IAAI,KAAK,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAKzF,QAAM,kBAAkB,EAAE,WAAW,WAAW,KAAK,WAAW,CAAC,MAAM;AACvE,MAAI,iBAAiB;AACnB,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC,CAAC;AAC1D,UAAI,CAAC,MAAO;AACZ,YAAM,QAAQ,QAAQ,aAAa,WAAW,KAAK,cAAc;AACjE,eAAS;AAAA,QACP,EAAE;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA,QAAQ,cAAc,IAAI,WAAW,gBAAgB;AAAA,UACrD,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,QAAM,aAAa,oBAAI,IAAoB;AAE3C,aAAW,OAAO,GAAG,YAAY;AAC/B,UAAM,OAAO,WAAW,IAAI,IAAI,KAAK,KAAK;AAC1C,UAAM,QAAQ,QAAQ,aAAa,WAAW,QAAQ,cAAc;AACpE,UAAM,KAAK,MAAM,IAAI,IAAI,KAAK,KAAK;AAEnC,UAAM,OAAO,IAAI,MACb,KAAK,KAAK,MAAM,IAAI,IAAI,GAAG,KAAK,MAAM,IAAI,YAAY,GAAG,CAAC,IAC1D,YAAY,GAAG;AAGnB,UAAM,WAAW,GAAG,IAAI,KAAK,IAAI,IAAI,KAAK;AAC1C,UAAM,SAAS,WAAW,IAAI,QAAQ,KAAK;AAC3C,eAAW,IAAI,UAAU,SAAS,OAAO,UAAU;AAEnD,UAAM,OAAO,KAAK;AAClB,UAAM,OAAO,cAAc;AAC3B,UAAM,OAAO,QAAQ;AAErB,UAAM,OAAO,aAAa,KAAK,OAAO;AACtC,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,MAAM,QAAQ,KAAK,GAAG,MAAM,QAAQ,QAAQ,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,IAC5F;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ,OAAO,OAAO;AAAA,QACd,OAAO,OAAO,IAAI,WAAW,gBAAgB;AAAA,QAC7C,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,MAAM,GAAG,YAAY;AAC9B,UAAM,KAAK,MAAM,IAAI,GAAG,IAAI,KAAK;AACjC,UAAM,KAAK;AACX,UAAM,IAAI;AAEV,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE;AAAA,QACvE,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,MAAM,QAAQ,QAAQ;AAAA,MAC1B;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,WAAW,eAAe,QAAQ,WAAW;AAAA,QAC3E,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG;AAAA,QACH;AAAA,QACA,KAAK,IAAI,WAAW,eAAe;AAAA,QACnC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,KAAK,IAAI,WAAW,QAAQ,CAAC;AAC/C,QAAM,SACJ,QACA,aACA,WACA,aAAa,cAAc,YAC3B,WAAW,eACX,KACA;AAEF,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,YAAY,QAAQ,QAAQ,OAAO;AAAA,MACjE,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;AAYA,SAAS,WAAW,MAAsB;AACxC,MAAI;AACF,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,WAAW,YAAY,IAAI,CAAC;AAC9C,WAAO,cAAc,GAAG,GAAG,CAAC;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,SAAS,aAAa,OAA8B;AAClD,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AACjC,QAAM,OAAO,OAAO,IAAI,UAAU;AAClC,QAAM,QAAQ,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAE1C,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK;AAC7B,UAAM,MAAM,KAAK,IAAI,GAAG,KAAK;AAC7B,UAAM,QAAQ,MAAM,OAAO;AAC3B,WAAO;AAAA,MACL,OAAO,CAAC,MAAM;AACZ,cAAM,IAAI,WAAW,CAAC;AACtB,eAAO,MAAM,CAAC,IAAI,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,IAAI,IAAI,OAAO,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,SAAO;AAAA,IACL,OAAO,CAAC,MAAM,MAAM,IAAI,CAAC,KAAK;AAAA,IAC9B,KAAK;AAAA,IACL,KAAK,OAAO,SAAS;AAAA,IACrB,OAAO,OAAO;AAAA,EAChB;AACF;AAEA,SAAS,aAAa,KAAe,SAA2C;AAC9E,UAAQ,IAAI,QAAQ;AAAA,IAClB,KAAK;AACH,aAAO,QAAQ,UAAU;AAAA,IAC3B,KAAK;AACH,aAAO,QAAQ,UAAU;AAAA,IAC3B,KAAK;AACH,aAAO,QAAQ,QAAQ;AAAA,IACzB;AACE,aAAO,QAAQ;AAAA,EACnB;AACF;;;AClWE,SAASC,SAAQ,MAAM;AACrB,SAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,UAAU,EAAE,KAAK;AAC9B;AAEA,IAAM,SAAa,oBAAI,IAAI;AAC3B,IAAM,aAAa,CAAC;AACpB,IAAM,aAAa,CAAC;AACpB,IAAM,WAAa,CAAC;AACpB,IAAMC,YAAa,CAAC;AACpB,IAAI,aAAc;AAClB,IAAI,YAAc;AAClB,IAAI,aAAc;AAClB,IAAI,aAAc;AAElB,SAAS,YAAY,IAAI;AACvB,MAAI,CAAC,GAAI,MAAK;AACd,MAAI,CAAC,OAAO,IAAI,EAAE,EAAG,QAAO,IAAI,IAAI,EAAE,IAAI,OAAO,GAAG,OAAO,CAAC,EAAE,YAAY,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC;AAC3F,SAAO;AACT;AAEA,SAAS,YAAY,OAAO,KAAK,OAAO,QAAQ,SAAS,aAAa;AACpE;AACA,aAAW,KAAK;AAAA,IACd,IAAID,SAAQ,KAAK,KAAK,YAAY,UAAU;AAAA,IAC5C;AAAA,IAAO,OAAO,YAAY,OAAO;AAAA,IACjC;AAAA,IAAO,KAAK,OAAO;AAAA,IACnB,QAAQ,UAAU;AAAA,IAClB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,EACvC,CAAC;AACH;AAEA,SAAS,aAAa,MAAM,OAAO,SAAS,aAAa;AACvD;AACA,aAAW,KAAK;AAAA,IACd,IAAIA,SAAQ,KAAK,KAAK,aAAa,SAAS;AAAA,IAC5C;AAAA,IAAO;AAAA,IACP,OAAO,UAAU,YAAY,OAAO,IAAI;AAAA,IACxC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,EACvC,CAAC;AACH;AAEA,SAAS,YAAY,OAAO;AAC1B;AACA,eAAa,EAAE,IAAIA,SAAQ,KAAK,KAAK,WAAW,UAAU,IAAI,OAAO,OAAO,MAAM,KAAK,KAAK;AAC9F;AAEA,SAAS,kBAAkB,MAAM;AAC/B,MAAI,YAAY;AACd,QAAI,CAAC,WAAW,MAAO,YAAW,QAAQ;AAC1C,eAAW,MAAM;AAAA,EACnB;AACF;AAEA,SAAS,eAAe;AACtB,MAAI,cAAc,WAAW,OAAO;AAClC,aAAS,KAAK,UAAU;AAAA,EAC1B;AACA,eAAa;AACf;AAEA,SAASE,SAAQ;AACf,SAAO,MAAM;AACb,aAAW,SAAS;AACpB,aAAW,SAAS;AACpB,WAAS,SAAW;AACpB,EAAAD,UAAS,SAAW;AACpB,eAAc;AACd,cAAc;AACd,eAAc;AACd,eAAc;AAChB;AAEF,SAASE,cAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,iBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,iBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,cAAaC,kBAAiB,KAAK;AAEnC,SAASC,YAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,iBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,YAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,YAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,YAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,iBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,WAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AAEd,MAAI,SAAS,uBAAuB,YAAY,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,KAAK;AAClD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,YAAY,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,KAAK;AAClD,MAAI,SAAS,uBAAuB,UAAU,KAAK;AACnD,MAAI,SAAS,uBAAuB,YAAY,KAAK;AACrD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,uBAAuB,WAAW,KAAK;AACpD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,KAAK,MAAM,KAAK,GAAG,GAAG,MAAM,KAAK;AACrE,MAAI,UAAU,uBAAuB,aAAa,KAAK;AACvD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,WAAW,KAAK;AACrD,MAAI,UAAU,uBAAuB,WAAW,KAAK;AACrD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK;AACzG,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC9E,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO,KAAK;AAC/F,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,WAAW,KAAK;AACrD,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,gBAAgB,KAAK;AAC1D,MAAI,UAAU,uBAAuB,eAAe,KAAK;AACzD,MAAI,UAAU,uBAAuB,aAAa,KAAK;AACvD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC3D,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAC5D,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,qBAAqB,CAAC,MAAM,IAAI,GAAG,OAAO,KAAK;AAE7D,MAAI,SAAS,SAAS,IAAI,QAAQ,YAAY,MAAM;AAChD,iBAAa;AACb,UAAM,WAAW,WAAW,KAAK,OAAK,KAAK,EAAE,QAAQ,OAAO;AAC5D,UAAM,cAAc,WAAW,KAAK,OAAK,KAAK,EAAE,QAAQ,UAAU;AAClE,UAAM,WAAW,WAAW,KAAK,OAAK,KAAK,EAAE,QAAQ,OAAO;AAC5D,UAAM,YAAY,WAAW,KAAK,OAAK,KAAK,EAAE,QAAQ,QAAQ;AAC9D,WAAO;AAAA,MACL,SAAU;AAAA,MACV,UAAU;AAAA,QACR,GAAI,MAAM,CAAC;AAAA,QACX,GAAI,WAAW,EAAE,OAAO,SAAS,MAAM,IAAI,CAAC;AAAA,QAC5C,GAAI,cAAc,EAAE,UAAU,YAAY,MAAM,IAAI,CAAC;AAAA,QACrD,GAAI,WAAW,EAAE,OAAO,SAAS,MAAM,IAAI,CAAC;AAAA,MAC9C;AAAA,MACA,QAAU,YAAY,UAAU,QAAQ;AAAA,MACxC,QAAU,OAAO,OAAO,IAAI,CAAC,GAAG,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,WAAW,OAAO,UAAU,CAAC;AAAA,MACvF;AAAA,MAAY;AAAA,MACZ,UAAU,SAAS,SAAS,IAAI,WAAW;AAAA,MAC3C,UAAAP;AAAA,IACF;AAAA,EACF;AACF,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAY;AAC7C,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,EAAE,KAAK,SAAS,OAAO,MAAM,KAAK,EAAE,QAAQ,gBAAgB,EAAE,EAAE;AAAA,EAAG;AACzG,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,EAAE,KAAK,YAAY,OAAO,MAAM,KAAK,EAAE,QAAQ,gBAAgB,EAAE,EAAE;AAAA,EAAG;AAC5G,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,EAAE,KAAK,SAAS,OAAO,MAAM,KAAK,EAAE,QAAQ,gBAAgB,EAAE,EAAE;AAAA,EAAG;AACzG,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAK;AACtC,MAAI,SAAS,SAAS,KAAK,OAAO;AAAE,WAAO,EAAE,KAAK,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AACzE,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAK;AACtC,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASQ,QAAO;AACzB,UAAM,OAAO,CAAC;AACd,eAAW,QAAQA,QAAO;AACxB,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAChD,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,MAAM,OAAO,OAAO;AAAA,EAAG;AAC9D,MAAI,UAAU,SAAS,OAAO;AAC1B,iBAAa;AACb,gBAAY,MAAM,KAAK,CAAC;AACxB,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO;AAAA,EAAO;AAC9C,MAAI,UAAU,SAAS,MAAM,OAAO;AAChC,gBAAY,MAAM,MAAM,OAAO,WAAW,IAAI;AAC9C,sBAAkB,IAAI;AACtB,WAAO,EAAE,MAAM,YAAY,MAAM;AAAA,EACnC;AACF,MAAI,UAAU,SAASC,OAAM;AAAE,WAAOA,MAAK,KAAK;AAAA,EAAG;AACnD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAK;AACvC,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO;AAAA,EAAO;AAC9C,MAAI,UAAU,SAAS,OAAO,KAAK,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AACzD,MAAI,UAAU,SAAS,OAAO,KAAK,OAAO,QAAQ,IAAI;AAAE,WAAO;AAAA,EAAI;AACnE,MAAI,UAAU,SAAS,OAAO,KAAK,OAAO,QAAQ,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AACxE,MAAI,UAAU,SAAS,OAAO,KAAK,OAAO,QAAQ,OAAO,MAAM;AAC3D,gBAAY,OAAO,KAAK,OAAO,QAAQ,OAAO,IAAI;AAClD,sBAAkB,KAAK;AACvB,sBAAkB,GAAG;AACrB,WAAO,EAAE,MAAM,YAAY,MAAM;AAAA,EACnC;AACF,MAAI,UAAU,SAAS,MAAM,OAAO,MAAM,IAAI;AAAE,WAAO;AAAA,EAAI;AAC3D,MAAI,UAAU,SAAS,MAAM,OAAO,MAAM,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAChE,MAAI,UAAU,SAAS,MAAM,OAAO,MAAM,OAAO,MAAM;AACnD,QAAI,SAAS,YAAa,cAAa,MAAM,OAAO,OAAO,IAAI;AAAA,QAC1D,aAAY,MAAM,MAAM,OAAO,MAAM,OAAO,IAAI;AACrD,sBAAkB,IAAI;AACtB,WAAO,EAAE,MAAM,SAAS,cAAc,cAAc,YAAY,MAAM;AAAA,EACxE;AACF,MAAI,UAAU,SAASA,OAAM;AAAE,WAAOA,MAAK,KAAK;AAAA,EAAG;AACnD,MAAI,UAAU,SAASA,OAAM;AAAE,WAAOA,MAAK,KAAK;AAAA,EAAG;AACnD,MAAI,UAAU,SAAS,MAAMA,OAAM,GAAG;AAAE,WAAO;AAAA,EAAG;AAClD,MAAI,UAAU,SAAS,MAAMA,OAAM,QAAQC,SAAQ;AAC/C,UAAM,OAAO,EAAE,MAAM,MAAM,MAAAD,OAAM,QAAQ,QAAQC,WAAU,OAAU;AACrE,IAAAV,UAAS,KAAK,IAAI;AAClB,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,IAAI,IAAI;AAAE,WAAO,EAAE,IAAI,GAAG;AAAA,EAAG;AACpD,MAAI,UAAU,SAAS,MAAM,QAAQ;AAAE,WAAO,UAAU,QAAQ,MAAM,QAAQ,EAAE;AAAA,EAAG;AACnF,MAAI,UAAU,SAAS,QAAQ,GAAG;AAAE,WAAO;AAAA,EAAG;AAC9C,MAAI,UAAU,SAAS,QAAQ,OAAO,SAAS;AAC3C,UAAM,SAAS,EAAE,MAAM,UAAU,QAAQ,OAAO,SAAS,QAAW,QAAQ;AAC5E,IAAAA,UAAS,KAAK,MAAM;AACpB,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,KAAK,OAAO;AAAE,WAAO,EAAE,KAAK,IAAI,KAAK,GAAG,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AACtF,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaW,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBF,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASL,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASM,WAAU;AAC/C,WAAO,IAAIR,iBAAgB,SAAS,MAAM,MAAMQ,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBN,WAAU,OAAOM,WAAU;AAC3D,WAAO,IAAIR;AAAA,MACTA,iBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAM;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK,wBAAwB;AAC7B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,gBAAgB;AACrB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,CAAC;AACN,WAAK,mBAAmB;AACxB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,mBAAmB;AAAA,MAC1B;AACA,WAAK,WAAW;AAChB,WAAK,cAAc;AACnB,WAAK,WAAW;AAChB,qBAAe;AACf,WAAK,OAAO,IAAI,IAAI,IAAI,EAAE;AAAA,IAC5B,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,sBAAsB;AAC3B,QAAI,OAAO,YAAY;AACrB,WAAK,0BAA0B;AAAA,IACjC;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,4BAA4B;AACnC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,UAAU,IAAI,WAAW;AAAA,UACtC,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,iBAAiB;AACtB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,qBAAO,OAAO,YAAY;AACxB,mBAAG,KAAK,EAAE;AACV,qBAAK,MAAM,OAAO,WAAW;AAC7B,oBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,gBACF,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,MAAM;AAAA,kBAAG;AAAA,gBACjD;AAAA,cACF;AAAA,YACF,OAAO;AACL,mBAAK;AAAA,YACP;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,MAAM,UAAU,IAAI,WAAW;AAAA,YACtC,OAAO;AACL,mBAAK;AAAA,YACP;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,WAAW;AAChB,mBAAK,iBAAiB;AACtB,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,OAAO,EAAE;AAAA,cAChB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,mBAAe;AACf,SAAK,OAAO;AACZ,QAAI,IAAI;AACN,WAAK;AAAA,IACP,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,UAAU,IAAI,WAAW;AAAA,UACtC,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,iBAAiB;AACtB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,IAAI,EAAE;AAAA,YACpB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,mBAAe;AACf,SAAK,OAAO;AACZ,QAAI,IAAI;AACN,WAAK;AAAA,IACP,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK;AACL,iBAAK;AACL;AACA,iBAAK;AACL,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,YAAY;AACjB,kBAAI,OAAO,YAAY;AACrB,qBAAK,CAAC,IAAI,EAAE;AACZ,qBAAK;AAAA,cACP,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AACA;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AACL,mBAAK,CAAC;AACN,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,qBAAO,OAAO,YAAY;AACxB,mBAAG,KAAK,EAAE;AACV,qBAAK,MAAM,OAAO,WAAW;AAC7B,oBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,gBACF,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,MAAM;AAAA,kBAAG;AAAA,gBACjD;AAAA,cACF;AACA,mBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,mBAAK,YAAY;AACjB,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,OAAO,EAAE;AAAA,cAChB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF;AACA,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,uBAAuB;AAC5B,QAAI,OAAO,YAAY;AACrB,WAAK,qBAAqB;AAC1B,UAAI,OAAO,YAAY;AACrB,aAAK,uBAAuB;AAC5B,YAAI,OAAO,YAAY;AACrB,eAAK,eAAe;AACpB,cAAI,OAAO,YAAY;AACrB,iBAAK,mBAAmB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,uBAAuB;AAC5B,UAAI,OAAO,YAAY;AACrB,aAAK,qBAAqB;AAC1B,YAAI,OAAO,YAAY;AACrB,eAAK,uBAAuB;AAC5B,cAAI,OAAO,YAAY;AACrB,iBAAK,eAAe;AACpB,gBAAI,OAAO,YAAY;AACrB,mBAAK,mBAAmB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,mBAAe;AACf,SAAK,QAAQ,EAAE;AACf,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,EAAE;AAAA,UACjB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY;AACrB,WAAK,sBAAsB;AAAA,IAC7B;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,sBAAsB;AAC3B,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,mBAAe;AACf,SAAK,QAAQ;AACb,QAAI,IAAI;AACN,WAAK;AAAA,IACP,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,0BAA0B;AAC/B,UAAI,OAAO,YAAY;AACrB,aAAK,uBAAuB;AAAA,MAC9B;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,4BAA4B;AACnC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAE1E,SAAK;AACL,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,mBAAmB;AACxB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,kBAAkB;AACvB,gBAAI,OAAO,YAAY;AACrB,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,mBAAmB;AACzB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,wBAAM,QAAQ,IAAI,IAAI,IAAI,GAAG;AAAA,gBAC/B,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,oBAAoB;AAC1B,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,wBAAM,QAAQ,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,gBACpC,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,kBAAkB;AACxB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,wBAAM,QAAQ,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AAAA,gBACzC,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,6BAAe;AACf,mBAAK,QAAQ,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AAAA,YACxC,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK;AAEhE,SAAK;AACL,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,sBAAsB;AAC3B,gBAAI,OAAO,YAAY;AACrB,mBAAK;AACL,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,oBAAoB;AAC1B,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,uBAAK,QAAQ,IAAI,IAAI,IAAI,GAAG;AAAA,gBAC9B,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK;AAAA,cACP;AACA,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,kBAAkB;AACxB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,wBAAM,QAAQ,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,gBACnC,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,6BAAe;AACf,mBAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,YAClC,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,mBAAmB;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK;AAEhE,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK,YAAY;AACjB,oBAAI,OAAO,YAAY;AACrB,wBAAM;AACN,sBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,0BAAM;AACN;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AACN,0BAAM,CAAC;AACP,0BAAM,MAAM,OAAO,WAAW;AAC9B,wBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,2BAAO,QAAQ,YAAY;AACzB,0BAAI,KAAK,GAAG;AACZ,4BAAM,MAAM,OAAO,WAAW;AAC9B,0BAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,sBACF,OAAO;AACL,8BAAM;AACN,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AAAA,oBACF;AACA,0BAAM,MAAM,UAAU,KAAK,WAAW;AACtC,wBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,4BAAM;AACN;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,qCAAe;AACf,4BAAM,QAAQ,IAAI,IAAI,GAAG;AAAA,oBAC3B,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AACN,0BAAM,CAAC;AACP,0BAAM,MAAM,OAAO,WAAW;AAC9B,wBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,6BAAO,QAAQ,YAAY;AACzB,4BAAI,KAAK,GAAG;AACZ,8BAAM,MAAM,OAAO,WAAW;AAC9B,4BAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,wBACF,OAAO;AACL,gCAAM;AACN,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AAAA,sBACF;AAAA,oBACF,OAAO;AACL,4BAAM;AAAA,oBACR;AACA,wBAAI,QAAQ,YAAY;AACtB,4BAAM,MAAM,UAAU,KAAK,WAAW;AAAA,oBACxC,OAAO;AACL,4BAAM;AAAA,oBACR;AAAA,kBACF;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM,oBAAoB;AAC1B,wBAAI,QAAQ,YAAY;AACtB,4BAAM;AAAA,oBACR;AACA,0BAAM,WAAW;AACjB,0BAAM,iBAAiB;AACvB,wBAAI,QAAQ,YAAY;AACtB,4BAAM;AAAA,oBACR;AACA,0BAAM,iBAAiB;AACvB,wBAAI,QAAQ,YAAY;AACtB,qCAAe;AACf,2BAAK,QAAQ,IAAI,IAAI,KAAK,GAAG;AAAA,oBAC/B,OAAO;AACL,oCAAc;AACd,2BAAK;AAAA,oBACP;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AACxB,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,WAAW;AAChB,mBAAK,mBAAmB;AACxB,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,QAAQ,IAAI,EAAE;AAAA,cACrB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AAEtD,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,2BAA2B;AAChC,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,kBAAM,MAAM,OAAO,WAAW;AAC9B,gBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,mBAAO,QAAQ,YAAY;AACzB,iBAAG,KAAK,GAAG;AACX,oBAAM,MAAM,OAAO,WAAW;AAC9B,kBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,IAAI,EAAE;AAAA,YACrB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP;AACA,eAAK,WAAW;AAChB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC;AACN,iBAAK,yBAAyB;AAC9B,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,yBAAyB;AAAA,YAChC;AACA,iBAAK,WAAW;AAChB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,oBAAM;AACN,6BAAe;AAAA,YACjB,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,QAAQ,YAAY;AACtB,oBAAM,WAAW;AACjB,oBAAM,iBAAiB;AACvB,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,6BAAe;AACf,mBAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,YACzB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,6BAA6B;AACpC,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,2BAA2B;AAClC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL;AACA,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,UAAU,IAAI,WAAW;AAAA,UACtC,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,iBAAiB;AACtB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,IAAI,EAAE;AAAA,YACrB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI;AAER,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAGA,EAAAV,OAAM;AACN,QAAM,MAAM,QAAQ,eAAe;AAEnC,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACllFO,IAAM,WAA4C;AAAA,EACvD,aAAa,OAAiC;AAC5C,UAAM,MAAaW,WAAM,OAAO,EAAE,YAAY,KAAK,CAAC;AACpD,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU,IAAI,UAAU,SAAS,IAAI,IAAI,WAAW;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,UAAU,OAAiC;AAEzC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAsB,OAAsB,SAAuC;AACxF,WAAO,eAAe,IAAI,OAAO,OAAO;AAAA,EAC1C;AACF;;;ACtCA,IAAM,cAAc;AACpB,IAAM,aAAa;AAEZ,SAAS,kBAAkB,QAAgB,OAAuB;AACvE,SAAO,GAAG,MAAM,IAAI,WAAW,KAAK,CAAC;AACvC;AAEA,SAAS,WAAW,OAAuB;AACzC,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,QAAM,MAAM,WAAW,MAAM,gBAAgB;AAC7C,MAAI,IAAK,QAAO,IAAI,CAAC;AAErB,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,YAAQ,WAAW,WAAW,CAAC;AAC/B,WAAO,KAAK,KAAK,MAAM,UAAU,MAAM;AAAA,EACzC;AACA,SAAO,IAAI,KAAK,SAAS,EAAE,CAAC;AAC9B;;;AC8xCO,SAAS,WACd,QACA,WACA,YACQ;AACR,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,OAAO,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,EAC9E;AAEA,QAAM,iBAAiB,aAAa;AAGpC,QAAM,SAAmB,CAAC,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,IAAI,OAAO,IAAI,CAAC,GACpB,IAAI,OAAO,CAAC;AACd,UAAM,KAAK,EAAE,IAAI,EAAE,GACjB,KAAK,EAAE,IAAI,EAAE;AACf,WAAO,KAAK,OAAO,IAAI,CAAC,IAAK,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC;AAAA,EAC3D;AACA,QAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AACzC,MAAI,WAAW,GAAG;AAChB,WAAO,KAAK,OAAO,CAAC,EAAG,CAAC,IAAI,OAAO,CAAC,EAAG,CAAC;AAAA,EAC1C;AAIA,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,KAAK,WAAW,cAAc,IAAI,CAAC;AACxE,QAAM,UAAmB,CAAC;AAC1B,QAAM,gBAA0B,CAAC;AAGjC,WAAS,WAAW,GAA8D;AAChF,QAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC;AACrC,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,OAAO,CAAC,KAAM,IAAI,MAAM;AAC1B,cAAM,WAAW,OAAO,IAAI,CAAC;AAC7B,cAAM,SAAS,OAAO,CAAC;AACvB,cAAM,SAAS,SAAS;AACxB,cAAM,IAAI,SAAS,OAAO,KAAK,IAAI,YAAY;AAC/C,cAAM,IAAI,OAAO,IAAI,CAAC,GACpB,IAAI,OAAO,CAAC;AACd,cAAM,KAAK,EAAE,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG;AAChE,cAAMC,MAAK,EAAE,IAAI,EAAE,GACjBC,MAAK,EAAE,IAAI,EAAE;AACf,cAAMC,OAAM,KAAK,KAAKF,MAAKA,MAAKC,MAAKA,GAAE;AACvC,cAAM,KAAKC,OAAM,OAAOF,MAAKE,OAAM;AACnC,cAAM,KAAKA,OAAM,OAAOD,MAAKC,OAAM;AACnC,eAAO,EAAE,IAAI,UAAU,IAAI,UAAU,GAAG;AAAA,MAC1C;AAAA,IACF;AACA,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC,GACnC,OAAO,OAAO,OAAO,SAAS,CAAC;AACjC,UAAM,KAAK,KAAK,IAAI,KAAK,GACvB,KAAK,KAAK,IAAI,KAAK;AACrB,UAAM,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AACvC,WAAO,EAAE,IAAI,MAAM,UAAU,MAAM,OAAO,KAAK,MAAM,GAAG,UAAU,MAAM,OAAO,KAAK,MAAM,EAAE;AAAA,EAC9F;AAIA,QAAM,gBAA0B,CAAC;AACjC,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,UAAM,IAAI,OAAO,IAAI,CAAC,GACpB,IAAI,OAAO,CAAC,GACZ,IAAI,OAAO,IAAI,CAAC;AAClB,UAAM,MAAM,EAAE,IAAI,EAAE,GAClB,MAAM,EAAE,IAAI,EAAE;AAChB,UAAM,MAAM,EAAE,IAAI,EAAE,GAClB,MAAM,EAAE,IAAI,EAAE;AAChB,UAAM,OAAO,KAAK,KAAK,MAAM,MAAM,MAAM,GAAG;AAC5C,UAAM,OAAO,KAAK,KAAK,MAAM,MAAM,MAAM,GAAG;AAC5C,QAAI,OAAO,QAAQ,OAAO,KAAM;AAChC,UAAM,MAAO,MAAM,QAAS,MAAM,QAAS,MAAM,QAAS,MAAM;AAChE,QAAI,MAAM,KAAK;AAEb,oBAAc,KAAK,OAAO,CAAC,CAAE;AAAA,IAC/B;AAAA,EACF;AAEA,WAAS,sBAAsB,GAAmB;AAChD,QAAI,UAAU;AACd,eAAW,MAAM,eAAe;AAC9B,gBAAU,KAAK,IAAI,SAAS,KAAK,IAAI,IAAI,EAAE,CAAC;AAAA,IAC9C;AACA,QAAI,WAAW,WAAY,QAAO;AAClC,WAAO,UAAU;AAAA,EACnB;AAEA,WAAS,wBAAwB,GAAmB;AAClD,UAAM,eAAe,KAAK,IAAI,GAAG,WAAW,CAAC;AAG7C,WAAO,KAAK;AAAA,MACV;AAAA,MACA,KAAK,IAAI,IAAI,eAAe,mBAAmB,aAAa,eAAe;AAAA,IAC7E;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,UAAM,IAAK,KAAK,cAAc,KAAM;AACpC,UAAM,EAAE,IAAI,UAAU,SAAS,IAAI,WAAW,CAAC;AAE/C,UAAM,KAAK,CAAC;AACZ,UAAM,KAAK;AACX,UAAM,QAAS,IAAI,KAAK,KAAK,IAAK;AAClC,UAAM,eAAe,sBAAsB,CAAC;AAC5C,UAAM,SAAS,KAAK,IAAI,cAAc,wBAAwB,CAAC,CAAC;AAChE,UAAM,eAAe,KAAK,KAAK,KAAK,cAAc;AAClD,UAAM,eAAe,eAAe,IAAI,YAAY,SAAS,KAAK,IAAI,KAAK;AAC3E,YAAQ,KAAK,EAAE,GAAG,GAAG,IAAI,KAAK,cAAc,GAAG,GAAG,IAAI,KAAK,aAAa,CAAC;AACzE,kBAAc,KAAK,CAAC;AAAA,EACtB;AAKA,QAAM,UAAU;AAChB,MAAI,IAAI,KAAK,EAAE,QAAQ,CAAC,EAAG,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAG,CAAC,CAAC;AAEjD,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAM,KAAK,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AACrC,UAAM,KAAK,QAAQ,IAAI,CAAC;AACxB,UAAM,KAAK,QAAQ,CAAC;AACpB,UAAM,KAAK,QAAQ,KAAK,IAAI,QAAQ,SAAS,GAAG,IAAI,CAAC,CAAC;AAEtD,UAAM,OAAO,GAAG,KAAM,GAAG,IAAI,GAAG,KAAK,UAAW;AAChD,UAAM,OAAO,GAAG,KAAM,GAAG,IAAI,GAAG,KAAK,UAAW;AAChD,UAAM,OAAO,GAAG,KAAM,GAAG,IAAI,GAAG,KAAK,UAAW;AAChD,UAAM,OAAO,GAAG,KAAM,GAAG,IAAI,GAAG,KAAK,UAAW;AAEhD,SAAK,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAAA,EAC3E;AAEA,SAAO;AACT;AAGA,SAAS,EAAE,GAAmB;AAC5B,SAAO,KAAK,MAAM,IAAI,GAAG,IAAI,MAAM;AACrC;;;AC54CA,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,UAAU;AAChB,IAAM,SAAS;AACf,IAAM,QAAQ;AACd,IAAM,UAAU;AAEhB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,gBAAgB;AAGtB,IAAM,UAA6B,CAAC,KAAK,MAAM,KAAK,MAAM,GAAG;AAa7D,IAAM,WAAW;AACjB,IAAM,cAAc;AAyDb,SAAS,0BACdC,QACA,OACA,SACA,YACA,eACA,kBACA,WACuB;AACvB,QAAM,EAAE,SAAS,YAAY,OAAO,UAAU,IAAI;AAClD,QAAM,WAA2B,CAAC;AAClC,QAAM,OAAiB,CAAC;AAGxB,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,mBAAmB;AAEvB,QAAM,gBAAwB,OAAO,OAAO,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM;AAExE,QAAM,UAAU,CAAC,SACf,CAAC,GAAG,KAAK,UAAU,KAAK,MAAM,EAAE,KAAK,GAAG;AAE1C,WAAS,SAAS,KAAoB;AACpC,UAAM,IAAI,QAAQ,GAAG;AACrB,WAAO,IACH,EAAE,GAAG,EAAE,OAAO,IAAI,EAAE,OAAO,QAAQ,GAAG,GAAG,EAAE,OAAO,IAAI,EAAE,OAAO,SAAS,EAAE,IAC1E,EAAE,GAAG,GAAG,GAAG,EAAE;AAAA,EACnB;AAGA,QAAM,aAAaA,OAAM,OAAO,CAAC,MAAM,QAAQ,QAAQ,EAAE,IAAI,CAAC,KAAK,QAAQ,QAAQ,EAAE,EAAE,CAAC,CAAC;AAMzF,QAAM,YAAY,qBAAqB,YAAY,OAAO;AAE1D,QAAM,cAAc,CAAC,GAAG,UAAU,EAC/B,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,KAAK,SAAS,QAAQ,EAAE,IAAI,CAAC,GACjC,KAAK,SAAS,QAAQ,EAAE,EAAE,CAAC;AAC7B,UAAM,KAAK,SAAS,QAAQ,EAAE,IAAI,CAAC,GACjC,KAAK,SAAS,QAAQ,EAAE,EAAE,CAAC;AAC7B,UAAM,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,GAC9B,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC;AAC5B,UAAM,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,GAC9B,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC;AAC5B,UAAM,KAAK,KAAK,IAAI,KAAK,GAAG,KAAK,KAAK,IAAI,KAAK,GAAG,IAAI;AACtD,UAAM,KAAK,KAAK,IAAI,KAAK,GAAG,KAAK,KAAK,IAAI,KAAK,GAAG,IAAI;AACtD,QAAI,KAAK,IAAI,KAAK,EAAE,IAAI,KAAM,QAAO,KAAK;AAC1C,WAAO,KAAK,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAAA,EACnF,CAAC,EACA,QAAQ;AAGX,QAAM,YAA8B,CAAC;AACrC,QAAM,uBAAuB,oBAAI,IAA0B;AAE3D,WAAS,KAAK,GAAG,KAAK,YAAY,QAAQ,MAAM;AAC9C,UAAM,OAAO,YAAY,EAAE;AAC3B,UAAM,OAAO,WAAW,QAAQ,IAAI;AACpC,UAAM,OAAO,QAAQ,IAAI,UAAU,IAAI,IAAI,IAAI;AAC/C,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,CAAC;AAAA,MACf;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,KAAM;AACX,QAAI,qBAAqB,KAAK,UAAU,QAAQ,aAAa,IAAI,GAAG;AAClE,cAAQ;AAAA,QACN,mDAAmD,QAAQ,KAAK,IAAI,CAAC,QAAQ,QAAQ,KAAK,EAAE,CAAC;AAAA,MAC/F;AAAA,IACF;AACA,cAAU,KAAK,KAAK,SAAS;AAE7B,QAAI;AACJ,UAAM,gBAAgB,OAAO,KAAK,OAAO,UAAU,WAAW,KAAK,MAAM,QAAQ;AACjF,UAAM,SAAS,MAAM,KAAK,WAAW,KAAK,KAAK,MAAM,KAAK,SAAS,MAAM;AACzE,QAAI,eAAe;AACjB,cAAQ;AAAA,IACV,WAAW,QAAQ;AACjB,cAAQ,QAAQ;AAAA,IAClB,OAAO;AACL,cAAQ,QAAQ,mBAAmB,QAAQ,MAAM;AACjD;AAAA,IACF;AAEA,UAAM,OAAO,gBAAgB,KAAK,KAAK;AAEvC,UAAM,YACJ,KAAK,cAAc,SACf,SACA,6BAA6B,KAAK,SAAS,IACzC,KAAK,YACL;AAER,QAAI;AACJ,QAAI;AACJ,QAAI,KAAK,cAAc,YAAY;AACjC,kBAAY,kBAAkB,UAAU,KAAK;AAAA,IAC/C,WAAW,KAAK,cAAc,iBAAiB;AAC7C,kBAAY,kBAAkB,UAAU,KAAK;AAC7C,oBAAc,kBAAkB,aAAa,KAAK;AAAA,IACpD;AAEA,UAAM,cAAc,KAAK,UAAU,WAAW,UAAU,cAAc,OAAO,IAAI;AACjF,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,UAAW,KAAK,OAAO,aAAoC;AACjE,UAAM,aAAc,KAAK,OAAO,cAAqC;AAErE,UAAM,UAAUA,OAAM,QAAQ,IAAI;AAClC,yBAAqB,IAAI,WAAW,IAAI,UAAU,qBAAqB,MAAM;AAAA,MAC3E,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,MACvB,GAAI,KAAK,UAAU,WAAW,EAAE,UAAU,KAAc,IAAI,CAAC;AAAA,MAC7D;AAAA,MACA,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,MACrC,GAAI,SAAS,EAAE,QAAQ,MAAM,eAAe,SAAS,gBAAgB,WAAW,IAAI,CAAC;AAAA,MACrF,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjC,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,MACrC,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MAC1C,GAAI,KAAK,OAAO,mBAAmB,kBAC/B,EAAE,gBAAgB,gBAAyB,IAC3C,CAAC;AAAA,IACP,CAAC;AAAA,EACH;AAGA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC;AAAA,IACf;AAAA,IACAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,gBAAgC,CAAC;AACvC,WAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,KAAK;AACrC,UAAM,KAAK,qBAAqB,IAAI,CAAC;AACrC,QAAI,GAAI,eAAc,KAAK,EAAE;AAAA,EAC/B;AAGA,MAAI,oBAAoB,iBAAiB,SAAS,GAAG;AACnD,oBAAgB,eAAe,gBAAgB;AAAA,EACjD;AAGA,mBAAiB,aAAa;AAG9B,QAAM,eAAe;AACrB,QAAM,iBAAiB,IAAI,MAAc,cAAc,MAAM,EAAE,KAAK,GAAG;AACvE,QAAM,cAAc,cAAc,IAAI,CAAC,GAAG,MAAO,EAAE,QAAQ,IAAI,EAAG,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;AACxF,QAAM,YAAY,oBAAI,IAAY;AAElC,aAAW,KAAK,aAAa;AAC3B,QAAI,UAAU,IAAI,CAAC,EAAG;AACtB,UAAM,MAAM,cAAc,CAAC;AAC3B,UAAM,OAAO,WAAW,GAAG;AAC3B,UAAM,QAAQ,gBAAgB,IAAI;AAClC,UAAM,QAAQ,CAAC,CAAC;AAChB,eAAW,KAAK,aAAa;AAC3B,UAAI,MAAM,KAAK,UAAU,IAAI,CAAC,EAAG;AACjC,YAAM,MAAM,cAAc,CAAC;AAC3B,YAAM,OAAO,WAAW,GAAG;AAC3B,YAAM,QAAQ,gBAAgB,IAAI;AAClC,UAAI,MAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,MAAM,KAAK,IAAI,cAAc;AACnF,cAAM,KAAK,CAAC;AAAA,MACd;AAAA,IACF;AACA,QAAI,MAAM,SAAS,GAAG;AACpB,YAAM,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC1B,YAAM,QAAQ,CAAC,KAAK,MAAM;AACxB,uBAAe,GAAG,KAAK,IAAI,MAAM,MAAM,SAAS;AAAA,MAClD,CAAC;AACD,YAAM,QAAQ,CAAC,QAAQ,UAAU,IAAI,GAAG,CAAC;AAAA,IAC3C;AAAA,EACF;AAGA,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,QAAM,sBAAsB,oBAAI,IAAoB;AAEpD,QAAM,gBAOD,CAAC;AAEN,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAM,KAAK,cAAc,CAAC;AAC1B,QAAI,OAAO,GAAG,WACV,KAAK,GAAG,OAAO,CAAC,EAAG,CAAC,IAAI,GAAG,OAAO,CAAC,EAAG,CAAC,MAAM,GAAG,OAAO,CAAC,EAAG,CAAC,IAAI,GAAG,OAAO,CAAC,EAAG,CAAC,IAAI,GAAG,OAAO,CAAC,EAAG,CAAC,IAAI,GAAG,OAAO,CAAC,EAAG,CAAC,IAAI,GAAG,OAAO,CAAC,EAAG,CAAC,IAAI,GAAG,OAAO,CAAC,EAAG,CAAC,KAC3J,GAAG,OAAO,IAAI,CAAC,GAAG,OAAO,GAAG,OAAO,IAAI,MAAM,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,GAAG;AAE9E,QAAI,GAAG,QAAQ;AACb,aAAO,WAAW,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,iBAAiB,GAAG,GAAG,kBAAkB,EAAE;AAAA,IAClF;AAEA,QAAI,GAAG,UAAW,mBAAkB,IAAI,GAAG,WAAW,GAAG,KAAK;AAC9D,QAAI,GAAG,YAAa,qBAAoB,IAAI,GAAG,aAAa,GAAG,KAAK;AAEpE,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,GAAG;AAAA,MACH,QAAQ,GAAG;AAAA,MACX,aAAa,GAAG,eAAe,UAAU,cAAc;AAAA,MACvD,GAAI,GAAG,OAAO,EAAE,iBAAiB,GAAG,KAAK,IAAI,CAAC;AAAA,MAC9C,GAAI,GAAG,YAAY,EAAE,UAAU,GAAG,UAAU,IAAI,CAAC;AAAA,MACjD,GAAI,GAAG,YAAY,EAAE,WAAW,GAAG,UAAU,IAAI,CAAC;AAAA,MAClD,GAAI,GAAG,cAAc,EAAE,aAAa,GAAG,YAAY,IAAI,CAAC;AAAA,IAC1D,CAAC;AAED,QAAI,GAAG,OAAO;AACZ,YAAM,MAAM,WAAW,EAAE;AAMzB,YAAM,WACJ,UAAU,IAAI,CAAC,KAAK,GAAG,YAAY,GAAG,mBAAmB,kBACrD,YAAY,KAAK,eAAe,CAAC,KAAK,GAAG,IACzC,YAAY,GAAG;AACrB,oBAAc,KAAK;AAAA,QACjB,SAAS,GAAG;AAAA,QACZ,GAAG,SAAS;AAAA,QACZ,GAAG,SAAS,IAAI;AAAA,QAChB,UAAU,UAAU;AAAA,QACpB,YAAY,WAAW;AAAA,QACvB,MAAM,GAAG;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,SAAS;AACf,QAAM,YAAY;AAClB,QAAM,aAAqB,CAAC,GAAG,eAAe,GAAI,iBAAiB,CAAC,CAAE;AACtE,QAAM,aAAa,cAAc,IAAI,CAAC,OAAO;AAAA,IAC3C,GAAG,EAAE,IAAK,EAAE,QAAQ,SAAS,EAAE,WAAW,SAAU,IAAI;AAAA,IACxD,GAAG,EAAE,IAAI,EAAE;AAAA,IACX,OAAO,EAAE,QAAQ,SAAS,EAAE,WAAW,SAAS,YAAY;AAAA,IAC5D,QAAQ,EAAE,WAAW,YAAY;AAAA,EACnC,EAAE;AACF,kBAAgB,YAAY,UAAU;AAEtC,WAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,UAAM,IAAI,cAAc,CAAC;AACzB,UAAM,IAAI,WAAW,CAAC;AACtB,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,GAAG,EAAE;AAAA,QACL,GAAG,EAAE;AAAA,QACL,OAAO,EAAE;AAAA,QACT,QAAQ,EAAE;AAAA,MACZ;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,IAAI;AAAA,IACN,CAAC;AACD,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,EAAE;AAAA,MACX,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,UAAU;AAAA,MAChE,UAAU,EAAE;AAAA,MACZ,YAAY,WAAW;AAAA,MACvB,MAAM,EAAE;AAAA,MACR,QAAQ;AAAA,MACR,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,QAAM,IAAI,UAAU;AACpB,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AACvB,aAAW,CAAC,IAAI,KAAK,KAAK,mBAAmB;AAC3C,SAAK;AAAA,MACH,eAAe,EAAE,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAC9D,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK;AAAA,IAChE;AAAA,EACF;AACA,aAAW,CAAC,IAAI,KAAK,KAAK,qBAAqB;AAC7C,SAAK;AAAA,MACH,eAAe,EAAE,kBAAkB,CAAC,mBAAmB,EAAE,oBAAoB,KAAK,iEAC5D,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,EAAE,WAAW,KAAK;AAAA,IACnE;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,SAAS;AAC1B;AAIA,SAAS,cACP,SACA,MACA,SACA,eACA,WACA,WACA,YACA,UACA,eACgE;AAChE,QAAM,UAAU,CAAC,SACf,CAAC,GAAG,KAAK,UAAU,KAAK,MAAM,EAAE,KAAK,GAAG;AAE1C,QAAM,SAAS,QAAQ,KAAK,IAAI;AAChC,QAAM,SAAS,QAAQ,KAAK,EAAE;AAC9B,QAAM,YAAY,QAAQ,MAAM;AAChC,QAAM,YAAY,QAAQ,MAAM;AAChC,MAAI,CAAC,aAAa,CAAC,UAAW,QAAO;AAErC,QAAM,YAAmB;AAAA,IACvB,GAAG,UAAU,OAAO,IAAI,UAAU,OAAO,QAAQ;AAAA,IACjD,GAAG,UAAU,OAAO,IAAI,UAAU,OAAO,SAAS;AAAA,EACpD;AACA,QAAM,YAAmB;AAAA,IACvB,GAAG,UAAU,OAAO,IAAI,UAAU,OAAO,QAAQ;AAAA,IACjD,GAAG,UAAU,OAAO,IAAI,UAAU,OAAO,SAAS;AAAA,EACpD;AAOA,QAAM,YAAY,KAAK,KAAK,SAAS,KAAK,GAAG;AAC7C,QAAM,YAAY,KAAK,GAAG,SAAS,KAAK,GAAG;AAC3C,QAAM,iBAAiB,CAAC,QACtB,UAAU,SAAS,KAAK,IAAI,WAAW,YAAY,GAAG;AACxD,QAAM,iBAAiB,CAAC,QACtB,UAAU,SAAS,KAAK,IAAI,WAAW,YAAY,GAAG;AACxD,QAAM,gBAAwB,OAAO,QAAQ,OAAO,EACjD,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,UAAU,QAAQ,MAAM,EAClD,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM;AACjB,QAAI,eAAe,GAAG,KAAK,eAAe,GAAG,GAAG;AAC9C,YAAM,MAAM;AACZ,aAAO;AAAA,QACL,GAAG,EAAE,OAAO,IAAI;AAAA,QAChB,GAAG,EAAE,OAAO,IAAI;AAAA,QAChB,OAAO,KAAK,IAAI,GAAG,EAAE,OAAO,QAAQ,IAAI,GAAG;AAAA,QAC3C,QAAQ,KAAK,IAAI,GAAG,EAAE,OAAO,SAAS,IAAI,GAAG;AAAA,MAC/C;AAAA,IACF;AACA,WAAO,EAAE;AAAA,EACX,CAAC;AACH,MAAI,WAAW;AACb,eAAW,CAAC,QAAQ,CAAC,KAAK,WAAW;AACnC,UAAI,WAAW,aAAa,WAAW,UAAW;AAClD,YAAM,KAAK,EAAE,QAAQ,IAAI;AACzB,YAAM,KAAK,EAAE,SAAS,IAAI;AAC1B,UAAI,KAAK,KAAK,KAAK,GAAG;AACpB,sBAAc,KAAK,EAAE,GAAG,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,aAAa,OAAO,IAAI,QAAQ,GAAG,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACA,MAAI,iBAAiB,cAAc,SAAS,GAAG;AAC7C,kBAAc,KAAK,GAAG,aAAa;AAAA,EACrC;AAEA,QAAM,aAAa,KAAK,WAAW;AACnC,QAAM,aAAa,eAAe;AAClC,QAAM,QAAwB,CAAC,KAAK,KAAK,KAAK,GAAG;AAGjD,QAAM,WAA2B,KAAK,WAClC,CAAC,KAAK,QAAQ,IACd,UAAU,UACR,CAAC,SAAS,OAAO,IACjB,aACE,CAAC,aAAa,WAAW,SAAS,CAAC,IACnC;AACR,QAAM,WAA2B,KAAK,YAClC,CAAC,KAAK,SAAS,IACf,UAAU,UACR,CAAC,SAAS,OAAO,IACjB,aACE,CAAC,aAAa,WAAW,SAAS,CAAC,IACnC;AAIR,QAAM,QACJ,UAAU,SAAS,SAAY,CAAC,SAAS,IAAI,IAAI,aAAa,CAAC,GAAG,IAAI;AACxE,QAAM,QACJ,UAAU,SAAS,SAAY,CAAC,SAAS,IAAI,IAAI,aAAa,CAAC,GAAG,IAAI;AAExE,MAAI,WAAW,UACb,WAAW,WACX,WAAW,UACX,WAAW;AACb,MAAI,aAAa,UAAU,OAAO,GAAG;AACnC,eAAW,KAAK,UAAU,OAAO,GAAG;AAClC,UAAI,EAAE,IAAI,SAAU,YAAW,EAAE;AACjC,UAAI,EAAE,IAAI,EAAE,QAAQ,SAAU,YAAW,EAAE,IAAI,EAAE;AACjD,UAAI,EAAE,IAAI,SAAU,YAAW,EAAE;AACjC,UAAI,EAAE,IAAI,EAAE,SAAS,SAAU,YAAW,EAAE,IAAI,EAAE;AAAA,IACpD;AAAA,EACF;AACA,QAAM,gBAAgB,WAAW;AAEjC,MAAI,YAAY;AAChB,MAAI;AACJ,MAAI;AAEJ,aAAW,MAAM,UAAU;AACzB,eAAW,MAAM,UAAU;AACzB,iBAAW,QAAQ,OAAO;AACxB,mBAAW,QAAQ,OAAO;AACxB,cAAI,KAAK,UAAU,UAAU,QAAQ,IAAI,IAAI;AAC7C,cAAI,KAAK,UAAU,UAAU,QAAQ,IAAI,IAAI;AAG7C,gBAAM,UAAU,cAAc,IAAI,IAAI,IAAI,EAAE;AAC5C,eAAK,QAAQ;AACb,eAAK,QAAQ;AAEb,gBAAM,SAAS,aAAa,UAAU;AACtC,gBAAM,eACJ,OAAO,KAAK,OAAO,iBAAiB,WAAW,KAAK,MAAM,eAAe;AAC3E,gBAAM,iBAAiB;AAAA,YACrB,GAAG;AAAA,YACH,GAAG;AAAA,cACD;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AACA,gBAAM,QAAQ,OAAO,MAAM;AAAA,YACzB,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,OAAO;AAAA,YACP,WAAW;AAAA,YACX,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO;AAAA,YACP,QAAQ;AAAA,UACV,CAAQ;AACR,gBAAM,SAAS,MAAM;AAErB,gBAAM,QAAQ,eAAe,YAAY,OAAO,WAAW;AAC3D,gBAAM,MAAwB,QAC1B,kBAAkB,OAAO,CAAC,GAAI,OAAO,CAAC,GAAI,OAAO,CAAC,GAAI,OAAO,CAAC,GAAI,EAAE,IACpE;AAEJ,gBAAM,EAAE,OAAO,MAAM,IAAI,YAAY,KAAK,UAAU;AAGpD,gBAAM,aAAa,qBAAqB,KAAK,cAAc;AAC3D,gBAAM,gBACJ,iBACA,IAAI;AAAA,YACF,CAAC,MACC,EAAE,IAAI,WAAW,KACjB,EAAE,IAAI,WAAW,KACjB,EAAE,IAAI,WAAW,KACjB,EAAE,IAAI,WAAW;AAAA,UACrB,IACI,MACA;AACN,gBAAM,QACJ,aAAa,MACb,gBACA,YAAY,IAAI,IAAI,WAAW,SAAS,IACxC,cAAc,KAAK,OAAO,OAAO,OAAO,SAAS,IACjD;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,KACC,QAAQ,IAAI,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,IAAI,UAC9C,QAAQ,GAAG,IAAI,SACd,QAAQ,IAAI,aAAa,MAAM;AAElC,cAAI,QAAQ,WAAW;AACrB,wBAAY;AACZ,yBAAa;AACb,4BAAgB;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA,SAAS;AAAA,cACT;AAAA,cACA,SAAS;AAAA,cACT,SAAS;AAAA,cACT;AAAA,cACA,SAAS;AAAA,cACT,QAAQ;AAAA,cACR;AAAA,cACA,UAAU;AAAA,cACV;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,YAAY,WAAW,EAAE,WAAW,eAAe,QAAQ,WAAW,IAAI;AACnF;AAEA,SAAS,4BACP,MACA,SACA,SACA,WACA,WACA,SACA,WACA,QACA,QACA,WACA,WACA,gBACA,gBACQ;AACR,QAAM,WAAW,KAAK,aAAa,UAAa,cAAc,SAAS,WAAW,SAAS;AAC3F,QAAM,YAAY,KAAK,cAAc,UAAa,cAAc,SAAS,WAAW,SAAS;AAC7F,QAAM,QAAgB,CAAC,QAAQ,MAAM,GAAG,QAAQ,QAAQ,MAAM,GAAG,MAAM,EAAE;AAAA,IACvE,CAAC,MAAiB,MAAM;AAAA,EAC1B;AAEA,MAAI,YAAY,WAAW;AACzB,eAAW,CAAC,KAAK,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AACnD,UAAI,eAAe,GAAG,KAAK,eAAe,GAAG,EAAG,OAAM,KAAK,OAAO,MAAM;AAAA,IAC1E;AACA,UAAM,UAAU,WAAW,IAAI,SAAS;AACxC,UAAM,UAAU,WAAW,IAAI,SAAS;AACxC,QAAI,QAAS,OAAM,KAAK,OAAO;AAC/B,QAAI,QAAS,OAAM,KAAK,OAAO;AAAA,EACjC;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAAoB,YAAmB,UAA0B;AACtF,QAAM,KAAK,SAAS,MAAM,IAAI,SAAS,MAAM,KAAK;AAClD,QAAM,KAAK,SAAS,MAAM,IAAI,SAAS,MAAM,KAAK;AAClD,QAAM,KAAK,SAAS,IAAI,WAAW;AACnC,QAAM,KAAK,SAAS,IAAI,WAAW;AACnC,SAAO,KAAK,KAAK,KAAK,KAAK;AAC7B;AAIA,SAAS,gBACP,WACA,aACA,SACA,eACA,WACA,YACA,kBACAA,QACA,WACA,YACA,eACM;AAEN,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,MAAM,UAAU,CAAC;AAGvB,QAAI,aAAa;AACjB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,oBAAc,sBAAsB,UAAU,CAAC,GAAI,GAAG;AAAA,IACxD;AACA,QAAI,eAAe,EAAG;AAGtB,UAAM,oBAAoB,UAAU,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC;AAC5D,UAAM,OAAO,YAAY,IAAI,OAAO;AACpC,QAAI,CAAC,KAAM;AAEX,UAAM,OAAO,WAAW,QAAQ,IAAI;AACpC,UAAM,OAAO,QAAQ,IAAI,UAAU,IAAI,IAAI,IAAI;AAC/C,UAAM,SAAS;AAAA,MACb,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,CAAC,OAAQ;AAGb,QAAI,eAAe;AACnB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,sBAAgB,sBAAsB,UAAU,CAAC,GAAI,OAAO,SAAS;AAAA,IACvE;AACA,QAAI,gBAAgB,WAAY;AAEhC,cAAU,CAAC,IAAI,OAAO;AACtB,UAAM,UAAUA,OAAM,QAAQ,IAAI;AAClC,UAAM,KAAK,iBAAiB,IAAI,WAAW,IAAI,UAAU,EAAE;AAC3D,QAAI,IAAI;AACN,SAAG,SAAS,CAAC,GAAG,OAAO,MAAM;AAC7B,UAAI,OAAO,UAAU,UAAU;AAC7B,QAAC,GAA2B,WAAW;AAAA,MACzC,OAAO;AACL,eAAQ,GAA2B;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACF;AAQA,SAAS,YACP,KACA,OAC0C;AAC1C,QAAM,QAAoB,CAAC;AAC3B,QAAM,QAAoB,CAAC;AAC3B,MAAI,UAAU,aAAc,QAAO,EAAE,OAAO,MAAM;AAClD,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,UAAM,IAAI,IAAI,CAAC,GACb,IAAI,IAAI,IAAI,CAAC;AACf,QAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK;AAC1D,YAAM,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAAA,IACnF,WAAW,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK;AACjE,YAAM,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAAA,IACnF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,MAAM;AACxB;AAGA,SAAS,iBACP,IACA,IACA,IACA,IACQ;AACR,MAAI,IAAI;AACR,aAAWC,MAAK,GAAI,YAAW,KAAK,GAAI,KAAI,QAAQA,IAAG,CAAC,EAAG;AAC3D,aAAW,KAAK,GAAI,YAAWA,MAAK,GAAI,KAAI,QAAQA,IAAG,CAAC,EAAG;AAC3D,SAAO;AACT;AAGA,SAAS,QAAQA,IAAa,GAAsB;AAClD,SAAO,EAAE,IAAIA,GAAE,MAAM,EAAE,IAAIA,GAAE,MAAMA,GAAE,IAAI,EAAE,MAAMA,GAAE,IAAI,EAAE;AAC3D;AAGA,SAAS,uBAAuB,GAAqB,GAA6B;AAChF,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK;AACrC,UAAM,KAAK,EAAE,CAAC,GACZ,KAAK,EAAE,IAAI,CAAC;AACd,UAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,GAC/B,QAAQ,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC;AAC7B,UAAM,QAAQ,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,GAC/B,QAAQ,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC;AAC7B,aAAS,IAAI,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK;AACrC,YAAM,KAAK,EAAE,CAAC,GACZ,KAAK,EAAE,IAAI,CAAC;AAEd,UAAI,QAAQ,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,QAAQ,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,EAAG;AAClE,UAAI,QAAQ,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,KAAK,QAAQ,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC,EAAG;AAClE,UAAI,cAAc,IAAI,IAAI,IAAI,EAAE,EAAG;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAGA,SAAS,sBAAsB,GAAmB,GAA2B;AAC3E,MAAI,CAAC,EAAE,YAAY,CAAC,EAAE,UAAU;AAC9B,WAAO,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK;AAAA,EAC5D;AACA,SAAO,uBAAuB,EAAE,QAAQ,EAAE,MAAM;AAClD;AAGA,SAAS,cACP,KACA,OACA,OACA,UACA,WACQ;AACR,MAAI,YAAY;AAChB,aAAW,MAAM,WAAW;AAC1B,QAAI,CAAC,YAAY,CAAC,GAAG,UAAU;AAC7B,mBAAa,iBAAiB,OAAO,OAAO,GAAG,OAAO,GAAG,KAAK;AAAA,IAChE,OAAO;AACL,mBAAa,uBAAuB,KAAK,GAAG,MAAM;AAAA,IACpD;AAAA,EACF;AACA,SAAO,YAAY;AACrB;AASA,SAAS,YACP,SACA,SACA,WACA,WACQ;AACR,QAAM,KAAK,UAAU,IAAI,UAAU;AACnC,QAAM,KAAK,UAAU,IAAI,UAAU;AACnC,QAAM,OAAO,KAAK,IAAI,EAAE,GACtB,OAAO,KAAK,IAAI,EAAE;AAEpB,QAAM,WAAyB,QAAQ,OAAQ,MAAM,IAAI,MAAM,MAAO,MAAM,IAAI,MAAM;AACtF,QAAM,WAAyB,QAAQ,OAAQ,MAAM,IAAI,MAAM,MAAO,MAAM,IAAI,MAAM;AAEtF,SAAO,UAAU,SAAS,QAAQ,IAAI,SAAS,UAAU,SAAS,QAAQ,IAAI;AAChF;AAEA,SAAS,UAAU,MAAoB,OAA6B;AAClE,MAAI,SAAS,MAAO,QAAO;AAC3B,QAAM,MAA0C,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AACjF,SAAO,IAAI,IAAI,MAAM,QAAQ,IAAI;AACnC;AAOA,SAAS,kBACP,QACA,SACA,OACA,OACA,QACA,SACA,OACA,OACA,WACA,YACA,SACQ;AACR,MAAI,UAAU;AAGd,aAAW,MAAM,WAAW;AAC1B,eAAW,CAAC,KAAK,MAAM,EAAE,KAAK;AAAA,MAC5B,CAAC,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO;AAAA,MAClC,CAAC,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO;AAAA,IACpC,GAAG;AACD,UAAI,QAAQ,UAAU,SAAS,SAAS;AACtC,cAAM,IAAI,KAAK,MAAM,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,CAAC;AACnD,YAAI,IAAI,gBAAiB,YAAW,WAAW,IAAI,IAAI;AAAA,MACzD;AACA,UAAI,QAAQ,UAAU,SAAS,SAAS;AACtC,cAAM,IAAI,KAAK,MAAM,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,CAAC;AACnD,YAAI,IAAI,gBAAiB,YAAW,WAAW,IAAI,IAAI;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAGA,aAAW,MAAM,YAAY;AAC3B,UAAM,SAAS,QAAQ,GAAG,OAAO;AACjC,QAAI,CAAC,OAAQ;AACb,UAAM,OAAO,UAAU,OAAO,QAAQ,GAAG,MAAM,GAAG,CAAC;AACnD,QAAI,GAAG,YAAY,UAAU,GAAG,SAAS,SAAS;AAChD,YAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,GAAG,MAAM,IAAI,KAAK,CAAC;AACvD,UAAI,IAAI,gBAAiB,YAAW,WAAW,IAAI,IAAI;AAAA,IACzD;AACA,QAAI,GAAG,YAAY,UAAU,GAAG,SAAS,SAAS;AAChD,YAAM,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,GAAG,MAAM,IAAI,KAAK,CAAC;AACvD,UAAI,IAAI,gBAAiB,YAAW,WAAW,IAAI,IAAI;AAAA,IACzD;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,aAAa,KAA+B;AACnD,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,UAAM,IAAI,IAAI,CAAC,GACb,IAAI,IAAI,IAAI,CAAC;AACf,QAAI,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,eAAgB,MAAK;AAAA,EAC9D;AACA,SAAO;AACT;AAIA,SAAS,cACP,IACA,IACA,IACA,IACoC;AACpC,QAAM,KAAK,OAAO,OAAO,OAAO,KAC9B,KAAK,OAAO,OAAO,OAAO;AAC5B,MAAI,MAAM,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,gBAAgB;AACtD,UAAM,QAAQ,GAAG,IAAI,GAAG,KAAK;AAC7B,WAAO,EAAE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,EAAE;AAAA,EACxE;AACA,QAAM,KAAK,OAAO,OAAO,OAAO,KAC9B,KAAK,OAAO,OAAO,OAAO;AAC5B,MAAI,MAAM,MAAM,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,gBAAgB;AACtD,UAAM,QAAQ,GAAG,IAAI,GAAG,KAAK;AAC7B,WAAO,EAAE,SAAS,EAAE,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,MAAM,GAAG,GAAG,EAAE,EAAE;AAAA,EACxE;AACA,SAAO,EAAE,SAAS,IAAI,SAAS,GAAG;AACpC;AAaA,SAAS,qBACPD,QACA,SACuB;AACvB,QAAM,MAAM,CAAC,SACX,CAAC,GAAG,KAAK,UAAU,KAAK,MAAM,EAAE,KAAK,GAAG;AAG1C,QAAM,QAAiEA,OAAM,IAAI,CAAC,SAAS;AACzF,UAAM,KAAK,QAAQ,IAAI,KAAK,IAAI,CAAC;AACjC,UAAM,KAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;AAC/B,QAAI,CAAC,MAAM,CAAC,GAAI,QAAO,EAAE,SAAS,KAAqB,SAAS,IAAoB;AACpF,UAAM,KAAK,WAAW,GAAG,MAAM,GAC7B,KAAK,WAAW,GAAG,MAAM;AAC3B,WAAO;AAAA,MACL,SAAS,KAAK,YAAY,aAAa,IAAI,EAAE;AAAA,MAC7C,SAAS,KAAK,aAAa,aAAa,IAAI,EAAE;AAAA,IAChD;AAAA,EACF,CAAC;AAID,QAAM,SAAS,oBAAI,IAAqB;AAExC,WAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,KAAK;AACrC,UAAM,OAAOA,OAAM,CAAC;AACpB,UAAM,SAAS,IAAI,KAAK,IAAI;AAC5B,UAAM,SAAS,IAAI,KAAK,EAAE;AAC1B,UAAM,KAAK,QAAQ,MAAM;AACzB,UAAM,KAAK,QAAQ,MAAM;AACzB,QAAI,CAAC,MAAM,CAAC,GAAI;AAEhB,UAAM,EAAE,SAAS,QAAQ,IAAI,MAAM,CAAC;AACpC,UAAM,KAAK,WAAW,GAAG,MAAM,GAC7B,KAAK,WAAW,GAAG,MAAM;AAI3B,UAAM,QAAQ,YAAY,OAAO,YAAY,MAAM,GAAG,IAAI,GAAG;AAC7D,UAAM,QAAQ,YAAY,OAAO,YAAY,MAAM,GAAG,IAAI,GAAG;AAE7D,UAAM,KAAK,GAAG,MAAM,IAAI,OAAO;AAC/B,UAAM,KAAK,GAAG,MAAM,IAAI,OAAO;AAC/B,QAAI,CAAC,OAAO,IAAI,EAAE,EAAG,QAAO,IAAI,IAAI,CAAC,CAAC;AACtC,QAAI,CAAC,OAAO,IAAI,EAAE,EAAG,QAAO,IAAI,IAAI,CAAC,CAAC;AACtC,WAAO,IAAI,EAAE,EAAG,KAAK,EAAE,SAAS,GAAG,UAAU,MAAM,YAAY,MAAM,CAAC;AACtE,WAAO,IAAI,EAAE,EAAG,KAAK,EAAE,SAAS,GAAG,UAAU,OAAO,YAAY,MAAM,CAAC;AAAA,EACzE;AAQA,QAAM,SAAS,oBAAI,IAAsB;AAEzC,aAAW,CAAC,UAAU,OAAO,KAAK,QAAQ;AACxC,UAAM,OAAO,SAAS,MAAM,GAAG,EAAE,GAAG,EAAE;AACtC,UAAM,aAAa,QAAQ,OAAO,CAAC,MAAM;AACvC,YAAM,IAAIA,OAAM,EAAE,OAAO;AACzB,aAAO,EAAE,WAAW,EAAE,aAAa,OAAO,EAAE,cAAc;AAAA,IAC5D,CAAC;AAKD,UAAM,SAAS,WAAW,SAAS,IAAI,aAAa;AACpD,QAAI,OAAO,SAAS,KAAK,WAAW,WAAW,EAAG;AAElD,WAAO,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AACjD,UAAM,IAAI,OAAO;AAEjB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,EAAE,SAAS,SAAS,IAAI,OAAO,CAAC;AACtC,YAAM,KAAK,IAAI,MAAM,IAAI;AACzB,YAAM,KAAK,OAAO,IAAI,OAAO,KAAK,CAAC;AACnC,aAAO;AAAA,QACL;AAAA,QACA,WAAW,EAAE,GAAG,IAAI,SAAS,MAAM,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,SAAS,MAAM,MAAM,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,WAAW,GAAgB;AAClC,SAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AACvD;AAGA,SAAS,aAAa,IAAW,IAAyB;AACxD,QAAM,KAAK,GAAG,IAAI,GAAG,GACnB,KAAK,GAAG,IAAI,GAAG;AACjB,SAAO,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,IAAK,MAAM,IAAI,MAAM,MAAO,MAAM,IAAI,MAAM;AAChF;AAGA,SAAS,aAAa,IAAW,IAAyB;AACxD,QAAM,MAA0C,EAAE,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;AACjF,SAAO,IAAI,aAAa,IAAI,EAAE,CAAC;AACjC;AASA,SAAS,UAAU,QAAc,MAAoB,GAAkB;AACrE,QAAM,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQC,GAAE,IAAI;AACtC,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,IAC3B,KAAK;AACH,aAAO,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,IAAIA,GAAE;AAAA,IAClC,KAAK;AACH,aAAO,EAAE,GAAG,GAAG,IAAIA,KAAI,EAAE;AAAA,IAC3B,KAAK;AACH,aAAO,EAAE,GAAG,IAAI,GAAG,GAAG,IAAIA,KAAI,EAAE;AAAA,EACpC;AACF;AAGA,SAAS,kBAAkB,IAAW,IAAW,IAAW,IAAW,GAAoB;AACzF,QAAM,MAAe,CAAC;AACtB,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,UAAM,IAAI,IAAI,GACZ,KAAK,IAAI,GACT,KAAK,KAAK;AACZ,UAAM,KAAK,IAAI,GACb,MAAM,KAAK,IACX,MAAM,MAAM;AACd,QAAI,KAAK;AAAA,MACP,GAAG,MAAM,GAAG,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,GAAG;AAAA,MAClE,GAAG,MAAM,GAAG,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,GAAG;AAAA,IACpE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAGA,SAAS,WAAW,IAA2B;AAC7C,MAAI,GAAG,YAAY,GAAG,OAAO,WAAW,GAAG;AACzC,WAAO,kBAAkB,GAAG,OAAO,CAAC,GAAI,GAAG,OAAO,CAAC,GAAI,GAAG,OAAO,CAAC,GAAI,GAAG,OAAO,CAAC,GAAI,EAAE;AAAA,EACzF;AACA,SAAO,GAAG;AACZ;AAGA,SAAS,cAAc,IAAW,IAAW,IAAW,IAAoB;AAC1E,QAAM,KAAK,OAAO,IAAI,IAAI,EAAE,GAC1B,KAAK,OAAO,IAAI,IAAI,EAAE;AACxB,QAAM,KAAK,OAAO,IAAI,IAAI,EAAE,GAC1B,KAAK,OAAO,IAAI,IAAI,EAAE;AACxB,UAAS,KAAK,KAAK,KAAK,KAAO,KAAK,KAAK,KAAK,OAAS,KAAK,KAAK,KAAK,KAAO,KAAK,KAAK,KAAK;AAC9F;AAEA,SAAS,OAAO,GAAU,GAAU,GAAkB;AACpD,UAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AAC5D;AAEA,SAAS,QAAQ,KAA+B;AAC9C,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,UAAM,IAAI,IAAI,CAAC,GACb,IAAI,IAAI,IAAI,CAAC;AACf,WAAO,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,EACxC;AACA,SAAO;AACT;AAEA,SAAS,YAAY,KAAuB,GAAkB;AAC5D,MAAI,IAAI,WAAW,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAC1C,MAAI,IAAI,WAAW,EAAG,QAAO,IAAI,CAAC;AAClC,QAAM,OAAiB,CAAC;AACxB,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,UAAM,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,EAAG,IAAI,IAAI,CAAC,EAAG,GAAG,IAAI,IAAI,CAAC,EAAG,IAAI,IAAI,CAAC,EAAG,CAAC;AACzE,SAAK,KAAK,CAAC;AACX,aAAS;AAAA,EACX;AACA,MAAI,UAAU,EAAG,QAAO,IAAI,CAAC;AAC7B,MAAI,MAAM;AACV,QAAM,SAAS,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;AACjD,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,MAAM,KAAK,QAAQ;AACrB,YAAM,OAAO,IAAI,KAAK,SAAS,OAAO,IAAI;AAC1C,YAAM,IAAI,IAAI,CAAC,GACb,IAAI,IAAI,IAAI,CAAC;AACf,aAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,MAAM,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,KAAK;AAAA,IACpE;AACA,WAAO;AAAA,EACT;AACA,SAAO,IAAI,IAAI,SAAS,CAAC;AAC3B;AAEA,SAAS,gBAAgB,KAA2D;AAClF,MAAI,UAAU,GACZ,OAAkB,KAClB,QAAQ;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,UAAM,IAAI,IAAI,CAAC,GACb,IAAI,IAAI,IAAI,CAAC;AACf,UAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,GAC3B,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AACzB,UAAM,MAAM,KAAK;AACjB,QAAI,MAAM,SAAS;AACjB,gBAAU;AACV,UAAI,KAAK,IAAI;AACX,eAAO;AACP,iBAAS,EAAE,IAAI,EAAE,KAAK;AAAA,MACxB,OAAO;AACL,eAAO;AACP,iBAAS,EAAE,IAAI,EAAE,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAQA,SAAS,YAAY,KAA8B;AACjD,MAAI,IAAI,WAAW,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AAC1C,MAAI,IAAI,WAAW,EAAG,QAAO,IAAI,CAAC;AAClC,MAAI,QAAQ;AACZ,MAAI,OAAqB;AACzB,MAAI,UAAU;AACd,MAAI,SAAgB,IAAI,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,UAAM,IAAI,IAAI,CAAC,GACb,IAAI,IAAI,IAAI,CAAC;AACf,UAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,GAC3B,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AACzB,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAC7B,QAAI,MAAM,SAAS;AACjB,gBAAU;AACV,eAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;AAAA,IACpD;AACA,QAAI,KAAK,MAAM,KAAK,OAAO;AACzB,cAAQ;AACR,aAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE;AAAA,IAClD;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAEA,SAAS,gBAAgB,OAA+C;AACtE,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,SAAU,QAAO;AAE/B,SAAO;AACT;AAIA,SAAS,gBAAgB,QAAwB,SAAgC;AAC/E,QAAM,YAAY,GAChB,QAAQ;AACV,QAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC;AACzF,QAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;AACzF,QAAM,aAAa,UAAU,SAAS,IAAI,KAAK,IAAI,GAAG,SAAS,IAAI;AACnE,QAAM,aAAa,UAAU,SAAS,IAAI,KAAK,IAAI,GAAG,SAAS,IAAI;AACnE,QAAM,aAAa,UAAU,SAAS,IAAI,KAAK,IAAI,GAAG,SAAS,IAAI;AACnE,QAAM,aAAa,UAAU,SAAS,IAAI,KAAK,IAAI,GAAG,SAAS,IAAI;AAEnE,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAU;AACpB,UAAM,MAAM,MAAM;AAClB,aAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,YAAM,IAAI,IAAI,CAAC,GACb,IAAI,IAAI,IAAI,CAAC;AACf,UAAI,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG;AACtD,mBAAW,WAAW,WAAW;AAC/B,cAAI,KAAK,IAAI,EAAE,IAAI,OAAO,IAAI,WAAW;AACvC,gBAAI;AACJ,gBAAI,KAAK,IAAI,UAAU,UAAU,IAAI,WAAW;AAC9C,mBAAK;AAAA,YACP,WAAW,KAAK,IAAI,UAAU,UAAU,IAAI,WAAW;AACrD,mBAAK,CAAC;AAAA,YACR,OAAO;AACL,oBAAM,QACH,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK;AAC1E,mBAAK,EAAE,IAAI,OAAO,CAAC,QAAQ;AAAA,YAC7B;AACA,gBAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,GAAG;AAC/B,gBAAI,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,GAAG;AACnC;AAAA,UACF;AAAA,QACF;AAAA,MACF,WAAW,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG;AAC7D,mBAAW,WAAW,WAAW;AAC/B,cAAI,KAAK,IAAI,EAAE,IAAI,OAAO,IAAI,WAAW;AACvC,gBAAI;AACJ,gBAAI,KAAK,IAAI,UAAU,UAAU,IAAI,WAAW;AAC9C,mBAAK;AAAA,YACP,WAAW,KAAK,IAAI,UAAU,UAAU,IAAI,WAAW;AACrD,mBAAK,CAAC;AAAA,YACR,OAAO;AACL,oBAAM,QACH,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK;AAC1E,mBAAK,EAAE,IAAI,OAAO,CAAC,QAAQ;AAAA,YAC7B;AACA,gBAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE;AAC/B,gBAAI,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,EAAE;AACnC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAIA,SAAS,iBAAiB,QAA8B;AAStD,QAAM,OAAc,CAAC;AACrB,WAAS,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM;AACzC,QAAI,OAAO,EAAE,EAAG,SAAU;AAC1B,UAAM,MAAM,OAAO,EAAE,EAAG;AACxB,aAAS,KAAK,GAAG,KAAK,IAAI,SAAS,GAAG,MAAM;AAC1C,YAAM,IAAI,IAAI,EAAE,GACd,IAAI,IAAI,KAAK,CAAC;AAChB,YAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,GAC3B,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC;AACzB,UAAI,KAAK,KAAK,KAAK,GAAG;AACpB,aAAK,KAAK;AAAA,UACR;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,QAAQ,EAAE,IAAI,EAAE,KAAK;AAAA,UACrB,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,UACrB,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,QACvB,CAAC;AAAA,MACH,WAAW,KAAK,KAAK,KAAK,GAAG;AAC3B,aAAK,KAAK;AAAA,UACR;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,QAAQ,EAAE,IAAI,EAAE,KAAK;AAAA,UACrB,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,UACrB,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY;AAClB,QAAM,OAAO,oBAAI,IAAY;AAC7B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,IAAI,CAAC,EAAG;AACjB,UAAM,KAAK,KAAK,CAAC;AACjB,UAAM,QAAQ,CAAC,CAAC;AAChB,aAAS,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACxC,UAAI,KAAK,IAAI,CAAC,EAAG;AACjB,YAAM,KAAK,KAAK,CAAC;AACjB,UAAI,GAAG,QAAQ,GAAG,IAAK;AACvB,UAAI,KAAK,IAAI,GAAG,QAAQ,GAAG,KAAK,IAAI,UAAW;AAC/C,UAAI,GAAG,KAAK,GAAG,KAAK,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG;AAC1C,cAAM,KAAK,CAAC;AACZ,aAAK,IAAI,CAAC;AAAA,MACZ;AAAA,IACF;AACA,SAAK,IAAI,CAAC;AACV,QAAI,MAAM,SAAS,EAAG;AACtB,UAAM,IAAI,MAAM;AAChB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,MAAM,KAAK,MAAM,CAAC,CAAE;AAC1B,YAAM,UAAU,KAAK,IAAI,KAAK,KAAK;AACnC,YAAM,MAAM,OAAO,IAAI,EAAE,EAAG;AAC5B,UAAI,IAAI,KAAK;AACX,YAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,EAAG,IAAI,QAAQ,GAAG,IAAI,IAAI,EAAE,EAAG,EAAE;AAC9D,YAAI,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,EAAG,IAAI,QAAQ,GAAG,IAAI,IAAI,KAAK,CAAC,EAAG,EAAE;AAAA,MAC5E,OAAO;AACL,YAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,EAAG,GAAG,GAAG,IAAI,IAAI,EAAE,EAAG,IAAI,OAAO;AAC9D,YAAI,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,EAAG,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,EAAG,IAAI,OAAO;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AACF;AAIA,SAAS,gBACP,YACA,YACM;AACN,QAAM,aAAa,IACjB,QAAQ;AACV,WAAS,OAAO,GAAG,OAAO,YAAY,QAAQ;AAC5C,QAAI,QAAQ;AACZ,eAAW,MAAM,YAAY;AAC3B,iBAAW,MAAM,YAAY;AAC3B,YAAI,CAAC,aAAa,IAAI,EAAE,EAAG;AAC3B,cAAM,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC;AAC3E,cAAM,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,IAAI,KAAK,IAAI,GAAG,GAAG,GAAG,CAAC;AAC7E,YAAI,MAAM,IAAI;AACZ,aAAG,IACD,GAAG,IAAI,GAAG,QAAQ,KAAK,GAAG,IAAI,GAAG,QAAQ,IACrC,GAAG,IAAI,GAAG,QAAQ,QAClB,GAAG,IAAI,GAAG,QAAQ;AAAA,QAC1B,OAAO;AACL,aAAG,IACD,GAAG,IAAI,GAAG,SAAS,KAAK,GAAG,IAAI,GAAG,SAAS,IACvC,GAAG,IAAI,GAAG,SAAS,QACnB,GAAG,IAAI,GAAG,SAAS;AAAA,QAC3B;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,eAAS,IAAI,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC9C,cAAM,IAAI,WAAW,CAAC,GACpB,IAAI,WAAW,CAAC;AAClB,YAAI,CAAC,aAAa,GAAG,CAAC,EAAG;AACzB,cAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC;AACvE,YAAI,EAAE,IAAI,EAAE,SAAS,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG;AAC5C,YAAE,KAAK,KAAK,IAAI;AAChB,YAAE,KAAK,KAAK,IAAI;AAAA,QAClB,OAAO;AACL,YAAE,KAAK,KAAK,IAAI;AAChB,YAAE,KAAK,KAAK,IAAI;AAAA,QAClB;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,QAAI,CAAC,MAAO;AAAA,EACd;AACF;AAEA,SAAS,aAAa,GAAS,GAAkB;AAC/C,SAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;AAClG;;;ACh3CO,SAAS,gBAAgB,OAAkD;AAChF,QAAM,cAAc,qBAAqB,MAAM,YAAY,MAAM,OAAO;AACxE,QAAM,aAAa,MAAM,WAAW;AAAA,IAClC,CAAC,SAAS,MAAM,QAAQ,KAAK,OAAO,MAAM,UAAa,MAAM,QAAQ,KAAK,KAAK,MAAM;AAAA,EACvF;AAEA,QAAMC,SAAQ,WAAW,IAAI,eAAe;AAC5C,QAAM,WACJA,OAAM,SAAS,IACX;AAAA,IACEA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACR,IACA,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE;AAE/B,QAAM,eAAe,SAAS,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AACtE,QAAM,gBAAgB,SAAS,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAEvE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,UAAU,SAAS;AAAA,IACnB,MAAM,SAAS;AAAA,IACf;AAAA,IACA,SAAS,iBAAiB,SAAS,QAAQ;AAAA,EAC7C;AACF;AAEO,SAAS,2BACdA,QACA,UAC2B;AAC3B,SAAOA,OAAM,IAAI,CAAC,SAAS;AACzB,UAAM,UAAU,aAAa,KAAK,IAAI;AACtC,UAAM,QAAQ,aAAa,KAAK,EAAE;AAClC,UAAM,aAAa,KAAK,cAAc,UAAU;AAChD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MACxD,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC9D,GAAI,eAAe,SAAY,EAAE,WAAW,IAAI,CAAC;AAAA,MACjD,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,MACjE,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,MACpE,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,MACpE,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MACxD,GAAI,KAAK,KAAK,SAAS,SAAS,IAAI,EAAE,kBAAkB,KAAK,KAAK,SAAS,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,MAC1F,GAAI,KAAK,GAAG,SAAS,SAAS,IAAI,EAAE,gBAAgB,KAAK,GAAG,SAAS,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,IACtF;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBACP,YACA,SACuB;AACvB,QAAM,cAAqC,CAAC;AAC5C,WAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,KAAK;AAC1C,UAAM,OAAO,WAAW,CAAC;AACzB,QAAI,CAAC,QAAQ,KAAK,OAAO,GAAG;AAC1B,kBAAY,KAAK;AAAA,QACf,gBAAgB;AAAA,QAChB,SAAS,2BAA2B,KAAK,OAAO;AAAA,MAClD,CAAC;AAAA,IACH;AACA,QAAI,CAAC,QAAQ,KAAK,KAAK,GAAG;AACxB,kBAAY,KAAK;AAAA,QACf,gBAAgB;AAAA,QAChB,SAAS,2BAA2B,KAAK,KAAK;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAA0C;AACjE,SAAO;AAAA,IACL,MAAM,aAAa,KAAK,SAAS,KAAK,gBAAgB;AAAA,IACtD,IAAI,aAAa,KAAK,OAAO,KAAK,cAAc;AAAA,IAChD,WAAW,KAAK;AAAA,IAChB,OAAO,KAAK;AAAA,IACZ,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,IACxD,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;AAAA,IAC9D,GAAI,KAAK,eAAe,SAAY,EAAE,YAAY,KAAK,WAAW,IAAI,CAAC;AAAA,IACvE,GAAI,KAAK,aAAa,SAAY,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,IACjE,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IACpE,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,IACpE,GAAI,KAAK,UAAU,SAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,EAC1D;AACF;AAEA,SAAS,aAAa,KAAa,cAAoC;AACrE,MAAI,gBAAgB,IAAI,WAAW,GAAG,YAAY,GAAG,GAAG;AACtD,WAAO;AAAA,MACL,UAAU,aAAa,MAAM,GAAG;AAAA,MAChC,QAAQ,IAAI,MAAM,aAAa,SAAS,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,IAAI;AACrC;AAEA,SAAS,aAAa,MAA2B;AAC/C,SAAO,CAAC,GAAG,KAAK,UAAU,KAAK,MAAM,EAAE,KAAK,GAAG;AACjD;AAEA,SAAS,iBAAiB,UAAqD;AAC7E,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE;AAAA,EAC9C;AAEA,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AAEX,aAAW,MAAM,UAAU;AACzB,QAAI,GAAG,SAAS,QAAQ;AACtB,YAAM,OAAiB,CAAC;AACxB,iBAAW,KAAK,GAAG,EAAE,SAAS,kBAAkB,GAAG;AACjD,cAAM,IAAI,WAAW,EAAE,CAAC,CAAC;AACzB,YAAI,CAAC,OAAO,MAAM,CAAC,EAAG,MAAK,KAAK,CAAC;AAAA,MACnC;AACA,eAAS,IAAI,GAAG,IAAI,IAAI,KAAK,QAAQ,KAAK,GAAG;AAC3C,eAAO,KAAK,IAAI,MAAM,KAAK,CAAC,CAAE;AAC9B,eAAO,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,CAAE;AAClC,eAAO,KAAK,IAAI,MAAM,KAAK,CAAC,CAAE;AAC9B,eAAO,KAAK,IAAI,MAAM,KAAK,IAAI,CAAC,CAAE;AAAA,MACpC;AAAA,IACF,WAAW,GAAG,SAAS,QAAQ;AAC7B,YAAM,UAAU,GAAG,QAAQ,UAAU,GAAG,YAAY,MAAM;AAC1D,YAAM,OACJ,GAAG,WAAW,WACV,GAAG,SAAS,IAAI,UAAU,IAC1B,GAAG,WAAW,QACZ,GAAG,SAAS,IAAI,UAChB,GAAG,SAAS;AACpB,YAAM,MAAM,GAAG,SAAS,KAAK,GAAG,YAAY;AAC5C,aAAO,KAAK,IAAI,MAAM,IAAI;AAC1B,aAAO,KAAK,IAAI,MAAM,GAAG;AACzB,aAAO,KAAK,IAAI,MAAM,OAAO,OAAO;AACpC,aAAO,KAAK,IAAI,MAAM,GAAG,SAAS,KAAK,GAAG,YAAY,GAAG;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,CAAC,OAAO,SAAS,IAAI,EAAG,QAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE;AACxE,SAAO,EAAE,MAAM,MAAM,MAAM,KAAK;AAClC;;;AChOO,IAAMC,YAAW;AAUjB,SAAS,SAAS,OAAe,MAAuB;AAC7D,QAAM,IAAI,QAAQ,OAAO,OAAO,MAAM;AACtC,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,KAAK,KAAK;AACxB,SAAO,eAAeA,SAAQ,kBAAkB,CAAC,mBAAmB,CAAC,WAAW,KAAK,WAAW,KAAK,+DAA+D,CAAC,IAAI,KAAK,OAAO,CAAC,aAAa,KAAK;AAC1M;AAGO,SAAS,MAAM,OAAyB;AAC7C,SAAO,MACJ,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACnB;AASO,SAAS,kBAAkB,MAAwB;AACxD,QAAM,SAAmB,CAAC;AAC1B,MAAI,IAAI;AAER,SAAO,IAAI,KAAK,QAAQ;AACtB,WAAO,IAAI,KAAK,UAAU,KAAK,KAAK,KAAK,CAAC,CAAE,EAAG;AAC/C,QAAI,KAAK,KAAK,OAAQ;AAEtB,QAAI,KAAK,CAAC,MAAM,KAAK;AACnB;AACA,UAAI,QAAQ;AACZ,aAAO,IAAI,KAAK,QAAQ;AACtB,cAAM,KAAK,KAAK,CAAC;AACjB,YAAI,OAAO,KAAK;AACd;AACA;AAAA,QACF;AACA,YAAI,OAAO,MAAM;AACf,gBAAM,OAAO,KAAK,IAAI,CAAC;AACvB,cAAI,SAAS,OAAO,SAAS,MAAM;AACjC,qBAAS;AACT,iBAAK;AACL;AAAA,UACF;AAAA,QACF;AACA,iBAAS;AACT;AAAA,MACF;AACA,UAAI,KAAK,IAAI,CAAC,MAAM,IAAK,OAAM,IAAI,MAAM,+BAA+B,IAAI,EAAE;AAC9E,aAAO,KAAK,KAAK;AACjB;AAAA,IACF;AAEA,UAAM,QAAQ;AACd,WAAO,IAAI,KAAK,UAAU,CAAC,KAAK,KAAK,KAAK,CAAC,CAAE,EAAG;AAChD,WAAO,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC;AAAA,EAClC;AAEA,SAAO;AACT;;;ACmBA,SAAS,YAAY,GAAW,KAAsB;AACpD,MAAI,QAAQ,UAAa,OAAO,EAAG,QAAO,OAAO,CAAC;AAClD,MAAI,IAAI,GAAG;AACT,WAAO,MAAM,OAAO,KAAK,IAAI,CAAC,CAAC,EAAE,SAAS,KAAK,GAAG;AAAA,EACpD;AACA,SAAO,OAAO,CAAC,EAAE,SAAS,KAAK,GAAG;AACpC;AAEA,SAAS,MAAM,OAAyB;AACtC,MAAI;AACJ,MAAIC,SAAqB,CAAC;AAC1B,MAAI,OAAkB;AACtB,MAAI,YAAY;AAChB,MAAI,YAA4B;AAChC,MAAI,aAA8B;AAClC,MAAI;AACJ,MAAI;AACJ,QAAM,OAAuB,CAAC;AAC9B,MAAI;AACJ,MAAI;AAEJ,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,kBAAkB,IAAI;AAChC,QAAI,EAAE,WAAW,EAAG;AAEpB,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,UAAI,EAAE,SAAS,EAAG,CAAAA,SAAQ,WAAW,EAAE,MAAM,CAAC,CAAC;AAC/C;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAC3B;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,MAAAA,SAAQ,WAAW,EAAE,MAAM,CAAC,CAAC;AAC7B;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,QAAQ;AACnB,UAAI,EAAE,CAAC,MAAM,cAAc,EAAE,CAAC,MAAM,aAAc,QAAO,EAAE,CAAC;AAC5D;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,kBAAY;AACZ,eAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK;AACjC,cAAM,MAAM,EAAE,CAAC;AACf,YAAI,QAAQ,YAAY,QAAQ,SAAS;AACvC,sBAAY;AAAA,QACd,WAAW,QAAQ,SAAS,QAAQ,UAAU;AAC5C,sBAAY;AAAA,QACd,WAAW,QAAQ,WAAW;AAC5B,uBAAa;AAAA,QACf,WAAW,QAAQ,UAAU;AAC3B,uBAAa;AAAA,QACf,WAAW,QAAQ,SAAS;AAC1B,gBAAM,OAAO,EAAE,IAAI,CAAC;AACpB,cAAI,MAAM;AACR,kBAAM,IAAI,KAAK,MAAM,sBAAsB;AAC3C,gBAAI,GAAG;AACL,2BAAa,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC,CAAC,EAAE;AACtD;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,QAAQ,OAAO;AACxB,gBAAM,OAAO,EAAE,IAAI,CAAC;AACpB,cAAI,QAAQ,QAAQ,KAAK,IAAI,GAAG;AAC9B,uBAAW,OAAO,IAAI;AACtB;AAAA,UACF;AAAA,QACF,OAAO;AACL,gBAAM,SAAS,IAAI,MAAM,sBAAsB;AAC/C,cAAI,QAAQ;AACV,yBAAa,EAAE,OAAO,OAAO,OAAO,CAAC,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,CAAC,EAAE;AAChE;AAAA,UACF;AACA,gBAAM,OAAO,IAAI,MAAM,YAAY;AACnC,cAAI,MAAM;AACR,uBAAW,OAAO,KAAK,CAAC,CAAC;AACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,kBAAY;AACZ,YAAM,QAAQ,EAAE,CAAC,MAAM,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC;AAC3C,UAAI,OAAO;AACT,cAAM,IAAI,MAAM,MAAM,sBAAsB;AAC5C,YAAI,EAAG,cAAa,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC,CAAC,EAAE;AAAA,MAC/D,WAAW,EAAE,UAAU,KAAK,UAAU,KAAK,EAAE,CAAC,CAAE,KAAK,UAAU,KAAK,EAAE,CAAC,CAAE,GAAG;AAC1E,qBAAa,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC,CAAC,EAAE;AAAA,MACxD;AACA;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,SAAS,EAAE,CAAC,KAAK,QAAQ,KAAK,EAAE,CAAC,CAAC,GAAG;AAChD,iBAAW,OAAO,EAAE,CAAC,CAAC;AACtB;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,aAAa;AACxB,mBAAa,EACV,MAAM,CAAC,EACP,IAAI,MAAM,EACV,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,OAAO,UAAU,CAAC,CAAC;AACjD;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,YAAY,EAAE,CAAC,GAAG;AAC7B,YAAM,IAAI,EAAE,CAAC,EAAE,MAAM,4BAA4B;AACjD,UAAI,EAAG,OAAM,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC,CAAC,EAAE;AACtD;AAAA,IACF;AAEA,QAAI,EAAE,CAAC,MAAM,SAAS,EAAE,UAAU,KAAK,EAAE,CAAC,MAAM,MAAM;AACpD,WAAK,KAAK;AAAA,QACR,IAAI,EAAE,CAAC;AAAA,QACP,QAAQ,mBAAmB,EAAE,CAAC,CAAE;AAAA,QAChC,GAAI,EAAE,CAAC,MAAM,SAAY,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,GAAI,eAAe,SAAY,EAAE,OAAO,WAAW,IAAI,CAAC;AAAA,MACxD,GAAI,aAAa,SAAY,EAAE,KAAK,SAAS,IAAI,CAAC;AAAA,IACpD;AAAA,IACA,OAAAA;AAAA,IACA;AAAA,IACA,GAAI,eAAe,UAAa,WAAW,SAAS,IAAI,EAAE,WAAW,IAAI,CAAC;AAAA,IAC1E,GAAI,QAAQ,SAAY,EAAE,QAAQ,IAAI,IAAI,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,WAAW,QAAwC;AAC1D,QAAMA,SAAQ,OAAO;AAAA,IAAI,CAAC,UACxB,UAAU,QAAS,EAAE,MAAM,MAAM,IAAe,EAAE,MAAM,SAAS,OAAO,MAAM;AAAA,EAChF;AACA,QAAM,eAAeA,OAAM,IAAI,CAAC,MAAM,MAAO,KAAK,SAAS,QAAQ,IAAI,EAAG,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;AAEhG,MAAI,aAAa,SAAS,EAAG,OAAM,IAAI,MAAM,6CAA6C;AAC1F,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,MAAM,aAAa,CAAC;AAC1B,QAAI,QAAQ,KAAK,QAAQA,OAAM,SAAS;AACtC,YAAM,IAAI,MAAM,8CAA8C;AAAA,EAClE;AAEA,SAAOA;AACT;AAEA,SAAS,mBAAmB,KAAiC;AAC3D,MAAI,UAAU,KAAK,GAAG,EAAG,QAAO,EAAE,KAAK,OAAO,OAAO,GAAG,EAAE;AAC1D,MAAI,WAAW,KAAK,GAAG,KAAK,QAAQ,YAAY,QAAQ,WAAW,QAAQ;AACzE,WAAO,EAAE,KAAK,QAAQ,IAAI;AAC5B,SAAO,EAAE,KAAK,QAAQ,IAAI;AAC5B;AAEA,SAAS,YAAY,KAAmC;AACtD,QAAM,oBAAoB,IAAI,MAAqB,IAAI,MAAM,MAAM,EAAE,KAAK,IAAI;AAC9E,QAAM,iBAAiB,IAAI,MAAqB,IAAI,MAAM,MAAM,EAAE,KAAK,IAAI;AAC3E,QAAM,kBAAkB,oBAAI,IAAoB;AAChD,QAAM,kBAA4B,CAAC;AACnC,MAAI;AAEJ,MAAI,MAAM,QAAQ,CAAC,MAAM,aAAa;AACpC,QAAI,KAAK,SAAS,OAAO;AACvB,oBAAc;AAAA,IAChB,OAAO;AACL,sBAAgB,KAAK,QAAQ;AAAA,IAC/B;AAAA,EACF,CAAC;AAED,QAAM,eAAe,gBAAgB;AACrC,QAAM,QAAQ,IAAI,MAAM;AACxB,QAAM,MAAM,IAAI,MAAM;AAEtB,MAAI,OAAO;AACT,UAAM,EAAE,OAAO,IAAI,IAAI;AACvB,QAAI,QAAQ,KAAK;AACf,YAAM,IAAI,MAAM,4BAA4B,KAAK,iCAAiC,GAAG,GAAG;AAAA,IAC1F;AAEA,QAAI,gBAAgB,QAAW;AAC7B,YAAM,iBAAiB;AACvB,YAAM,gBAAgB,IAAI,MAAM,SAAS,IAAI;AAC7C,YAAM,gBAAgB,iBAAiB;AACvC,YAAM,YAAY,MAAM,QAAQ;AAEhC,UAAI,YAAY,gBAAgB,GAAG;AACjC,cAAM,IAAI;AAAA,UACR,qBAAqB,KAAK,KAAK,GAAG,qBAAqB,aAAa;AAAA,QACtE;AAAA,MACF;AAEA,UAAI,IAAI,MAAM,UAAU,WAAW;AAEjC,iBAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,gBAAM,UAAU,MAAM;AACtB,4BAAkB,CAAC,IAAI;AACvB,0BAAgB,IAAI,SAAS,CAAC;AAC9B,yBAAe,CAAC,IAAI,YAAY,SAAS,GAAG;AAAA,QAC9C;AAGA,cAAM,UAAU,MAAM;AACtB,cAAM,SAAS,QAAQ;AACvB,cAAM,WACJ,YAAY,SACR,YAAY,SAAS,GAAG,IACxB,GAAG,YAAY,SAAS,GAAG,CAAC,IAAI,YAAY,QAAQ,GAAG,CAAC;AAC9D,uBAAe,WAAW,IAAI;AAG9B,iBAAS,IAAI,cAAc,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;AACvD,gBAAM,IAAI,IAAI,MAAM,SAAS,IAAI;AACjC,gBAAM,UAAU,QAAQ;AACxB,4BAAkB,CAAC,IAAI;AACvB,0BAAgB,IAAI,SAAS,CAAC;AAC9B,yBAAe,CAAC,IAAI,YAAY,SAAS,GAAG;AAAA,QAC9C;AAAA,MACF,OAAO;AAEL,iBAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACvC,gBAAM,UAAU,QAAQ;AACxB,4BAAkB,CAAC,IAAI;AACvB,0BAAgB,IAAI,SAAS,CAAC;AAC9B,yBAAe,CAAC,IAAI,YAAY,SAAS,GAAG;AAAA,QAC9C;AAGA,cAAM,WAAW,QAAQ;AACzB,cAAM,SAAS,MAAM;AACrB,cAAM,WACJ,aAAa,SACT,YAAY,UAAU,GAAG,IACzB,GAAG,YAAY,UAAU,GAAG,CAAC,IAAI,YAAY,QAAQ,GAAG,CAAC;AAC/D,uBAAe,WAAW,IAAI;AAG9B,iBAAS,IAAI,cAAc,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;AACvD,gBAAM,IAAI,IAAI,MAAM,SAAS,IAAI;AACjC,gBAAM,UAAU,MAAM;AACtB,4BAAkB,CAAC,IAAI;AACvB,0BAAgB,IAAI,SAAS,CAAC;AAC9B,yBAAe,CAAC,IAAI,YAAY,SAAS,GAAG;AAAA,QAC9C;AAAA,MACF;AAAA,IACF,OAAO;AAEL,YAAM,YAAY,MAAM,QAAQ;AAChC,UAAI,YAAY,IAAI,MAAM,QAAQ;AAChC,cAAM,IAAI;AAAA,UACR,qBAAqB,KAAK,KAAK,GAAG,qBAAqB,IAAI,MAAM,MAAM;AAAA,QACzE;AAAA,MACF;AAEA,UAAI,IAAI,MAAM,UAAU,WAAW;AACjC,YAAI,MAAM,QAAQ,CAAC,GAAG,aAAa;AACjC,gBAAM,UAAU,MAAM;AACtB,4BAAkB,QAAQ,IAAI;AAC9B,0BAAgB,IAAI,SAAS,QAAQ;AACrC,yBAAe,QAAQ,IAAI,YAAY,SAAS,GAAG;AAAA,QACrD,CAAC;AAAA,MACH,OAAO;AACL,YAAI,MAAM,QAAQ,CAAC,GAAG,aAAa;AACjC,gBAAM,UAAU,QAAQ;AACxB,4BAAkB,QAAQ,IAAI;AAC9B,0BAAgB,IAAI,SAAS,QAAQ;AACrC,yBAAe,QAAQ,IAAI,YAAY,SAAS,GAAG;AAAA,QACrD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,OAAO;AAEL,oBAAgB,QAAQ,CAAC,UAAU,SAAS;AAC1C,YAAM,UAAU,IAAI,MAAM,UAAU,YAAY,eAAe,IAAI,OAAO;AAC1E,wBAAkB,QAAQ,IAAI;AAC9B,sBAAgB,IAAI,SAAS,QAAQ;AACrC,qBAAe,QAAQ,IAAI,YAAY,SAAS,GAAG;AAAA,IACrD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,EACrD;AACF;AAEO,SAAS,4BACd,KACA,cACoB;AACpB,QAAM,OAAO,YAAY,kBAAkB,GAAG,CAAC;AAC/C,QAAM,eAAe,KAAK,gBAAgB;AAE1C,MAAI,eAAe,GAAG;AACpB,UAAM,UAAU,KAAK,IAAI,YAAY;AACrC,QAAI,UAAU,KAAK,UAAU,aAAc,QAAO;AAClD,QAAI,YAAY,EAAG,QAAO,KAAK,gBAAgB,SAAS,IAAI,UAAU;AACtE,UAAM,iBAAiB,KAAK,gBAAgB,KAAK,gBAAgB,SAAS,OAAO;AACjF,UAAM,UAAU,KAAK,kBAAkB,cAAc;AACrD,WAAO,YAAY,QAAQ,YAAY,SAAY,IAAI,OAAO,KAAK,IAAI,eAAe,OAAO;AAAA,EAC/F;AAEA,MAAI,IAAI,MAAM,YAAY,GAAG,SAAS,MAAO,QAAO;AACpD,SAAO,KAAK,gBAAgB,IAAI,YAAY,IAAI,IAAI,YAAY,KAAK;AACvE;AAEO,SAAS,YAAY,UAAoB,OAAoC;AAClF,QAAM,MAAM,kBAAkB,QAAQ;AACtC,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAC7B,QAAM,QAAQ;AACd,QAAM,OAAO,YAAY,GAAG;AAC5B,QAAM,QAAQ,KAAK;AAAA,IACjB;AAAA,IACA,GAAG,IAAI,MAAM,IAAI,CAAC,MAAM,YAAY,EAAE,SAAS,QAAQ,WAAM,EAAE,OAAO,IAAI,EAAE,QAAQ,EAAE;AAAA,IACtF,GAAI,IAAI,MAAM,OACV,KAAK,eACF,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC,EACrC,IAAI,CAAC,MAAM,YAAY,GAAG,SAAS,EAAE,QAAQ,EAAE,IAClD,CAAC;AAAA,EACP;AACA,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,YAAY,IAAI,MAAM,OAAO,YAAY,KAAK;AACpD,QAAM,WAAW;AACjB,QAAM,WAAW;AACjB,QAAM,WAAW;AACjB,QAAM,aAAa,IAAI,SAAS;AAChC,QAAM,eAAe,IAAI,KACtB,IAAI,CAAC,QAAgC;AACpC,UAAM,WAAW,uBAAuB,IAAI,QAAQ,KAAK,IAAI;AAC7D,WAAO,aAAa,SAAY,OAAO,EAAE,KAAK,SAAS;AAAA,EACzD,CAAC,EACA,OAAO,CAAC,QAAgC,QAAQ,IAAI;AAEvD,QAAM,YAAY;AAClB,QAAM,eAAe,YAAY;AACjC,QAAM,cAA8B,IAAI,MAAM,SAAS,WAAW,UAAU;AAC5E,QAAM,kBAAkB,aACpB,6BAA6B,cAAc,KAAK,MAAM,OAAO,SAAS,IACtE,CAAC;AACL,QAAM,mBAAmB,KAAK,IAAI,GAAG,GAAG,gBAAgB,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;AACzE,QAAM,cACJ,aAAa,WAAW,IACpB,IACA,aACE,WAAW,WAAW,YAAY,KAAK,IAAI,GAAG,mBAAmB,CAAC,IAAI,eAAe,IACrF,WAAW,WAAW,qBAAqB,cAAc,SAAS,IAAI;AAE9E,QAAM,UAAU,cACX,IAAI,MAAM,QAAQ,IAAI,MAAM,SAAS,WAAW,YAAY,MAC5D,gBAAgB,WAAW,cAAc,KAC1C;AACJ,QAAM,iBACJ,IAAI,MAAM,QAAQ,CAAC,aACf,KAAK;AAAA,IACH,YAAY;AAAA,IACZ,GAAG,KAAK,eACL,OAAO,CAAC,MAAmB,QAAQ,CAAC,CAAC,EACrC,IAAI,CAAC,MAAM,YAAY,GAAG,SAAS,EAAE,KAAK;AAAA,EAC/C,IACA,YAAY;AAClB,QAAM,WAAW,CAAC,cACb,IAAI,MAAM,QAAQ,IAAI,MAAM,SAAS,WAAW,iBAAiB,WAAW,MAC5E,gBAAgB,WAAW,cAAc,KAC1C;AACJ,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,GAAG,SAAS;AAAA,EACd;AACA,QAAM,QAAQ,WAAW,IAAI,MAAM,QAAQ,QAAQ,OAAO,OAAO,IAAI,IAAI;AAEzE,QAAM,WAA2B,CAAC;AAClC,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,CAAC,MAAM,aAAa;AACpC,UAAM,OAAO,MAAM,QAAQ;AAC3B,QAAI,KAAK,SAAS,OAAO;AACvB,eAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,SAAS,QAAQ,QAAQ,KAAK,EAAE,IAAI,GAAG,SAAS,KAAK,CAAC,CAAC;AAC1F,eAAS;AAAA,QACP,EAAE,KAAK,UAAK,KAAK,IAAI,QAAQ,GAAG,KAAK,IAAI,QAAQ,IAAI,GAAG,MAAM,QAAQ,WAAW;AAAA,UAC/E,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,OAAO;AACL,YAAM,eAAe,KAAK,kBAAkB,QAAQ;AACpD,YAAM,UAAyB,gBAAgB;AAC/C,YAAM,YACJ,YAAY,UACV,IAAI,YAAY,SAAS,OAAO,KAAK,UACpC,IAAI,WAAW,UAAa,WAAW,IAAI,OAAO,SAAS,WAAW,IAAI,OAAO;AAEtF,UAAI,WAAW;AACb,iBAAS;AAAA,UACP,EAAE,KAAK,MAAM,QAAQ,SAAS,QAAQ,SAAS,GAAG,EAAE,IAAI,GAAG,aAAa,KAAK,CAAC;AAAA,QAChF;AAAA,MACF,OAAO;AACL,iBAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,SAAS,QAAQ,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAAA,MAC7E;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK;AAAA,UACL,KAAK,IAAI,QAAQ;AAAA,UACjB,KAAK,IAAI,QAAQ,IAAI;AAAA,UACrB;AAAA,UACA,YAAY,QAAQ,UAAU,QAAQ;AAAA,UACtC,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAEA,QAAI,IAAI,MAAM,MAAM;AAClB,YAAM,QAAQ,KAAK,eAAe,QAAQ;AAC1C,UAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,iBAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI;AAAA,YACJ,IAAI,MAAM;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,YAAY;AACd;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,IAAI,MAAM;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAA4C,CAAC;AACnD,OAAK,gBAAgB,QAAQ,CAAC,UAAU,YAAY;AAClD,YAAQ,IAAI,OAAO,EAAE,IAAI,EAAE,QAAQ,MAAM,QAAQ,EAAG;AAAA,EACtD,CAAC;AACD,MAAI,KAAK,gBAAgB,SAAS,GAAG;AACnC,YAAQ,SAAS,EAAE,QAAQ,MAAM,KAAK,gBAAgB,CAAC,CAAE,EAAG;AAC5D,YAAQ,QAAQ,EAAE,QAAQ,MAAM,KAAK,gBAAgB,KAAK,gBAAgB,SAAS,CAAC,CAAE,EAAG;AAAA,EAC3F;AACA,MAAI,KAAK,gBAAgB,QAAW;AAClC,YAAQ,OAAO,EAAE,QAAQ,MAAM,KAAK,WAAW,EAAG;AAAA,EACpD;AAEA,QAAM,gBAAgB,kBAAkB,QAAQ;AAChD,QAAM,KAAK,SAAS,cAAc;AAClC,QAAM,KAAK,SAAS,cAAc;AAClC,QAAM,kBAAkB,kBAAkB,UAAU,IAAI,EAAE;AAC1D,QAAM,iBAAiB,iBAAiB,SAAS,IAAI,EAAE;AACvD,QAAM,QAAe;AAAA,IACnB,SAAS;AAAA,MACP,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO,IAAI,cAAc,QAAQ,SAAS,CAAC;AAAA,MAC3C,QAAQ,IAAI,cAAc,SAAS,SAAS,CAAC;AAAA,IAC/C;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB,UAAU;AAAA,IACV,MAAM,CAAC,SAAS,QAAQ,SAAS,MAAM,OAAO,SAAS,CAAC;AAAA,EAC1D;AACA,SAAO,EAAE,OAAO,SAAS,eAAqC;AAChE;AAEA,SAAS,kBAAkB,KAA+B;AACxD,QAAMA,UAAsB,IAAI,SAAS,CAAC,GAAG;AAAA,IAAI,CAAC,SAChD,OAAO,SAAS,WACZ,SAAS,QACP,EAAE,MAAM,MAAM,IACd,EAAE,MAAM,SAAS,OAAO,KAAK,IAC/B;AAAA,EACN;AACA,QAAM,QACJ,OAAO,IAAI,UAAU,YACjB,EAAE,MAAM,IAAI,OAAO,MAAM,UAAmB,OAAO,SAAkB,IACrE;AAAA,IACE,MAAM,QAAQ,IAAI,OAAO,IAAI;AAAA,IAC7B,MAAM,IAAI,OAAO,SAAS,UAAW,UAAqB;AAAA,IAC1D,OAAO,IAAI,OAAO,UAAU,YAAa,YAAuB;AAAA,IAChE,GAAI,IAAI,OAAO,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,MAAM,IAAI,CAAC;AAAA,IACnE,GAAI,IAAI,OAAO,QAAQ,SAAY,EAAE,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC;AAAA,EAC/D;AACN,SAAO;AAAA,IACL,GAAI,IAAI,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,IACtD,MAAM,IAAI,SAAS,aAAa,aAAa;AAAA,IAC7C;AAAA,IACA,OAAAA;AAAA,IACA,OAAO,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAa;AACvC,UAAI,SAAS;AACX,eAAO,EAAE,IAAI,IAAI,QAAQ,IAAI,IAAI,QAAQ,EAAE,KAAK,OAAO,IAAI,GAAG,GAAG,OAAO,OAAO,IAAI,GAAG,EAAE,EAAE;AAC5F,aAAO;AAAA,IACT,CAAC;AAAA,IACD,GAAI,MAAM,QAAQ,IAAI,UAAU,KAAK,IAAI,WAAW,SAAS,IACzD,EAAE,YAAY,IAAI,WAAuB,IACzC,CAAC;AAAA,IACL,GAAI,IAAI,WAAW,SAAY,EAAE,QAAQ,IAAI,OAAyC,IAAI,CAAC;AAAA,EAC7F;AACF;AAEA,SAAS,WACP,OACA,QACA,OACA,OACA,MACQ;AACR,SAAO,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,OAAO;AAAA,IAC9C,GAAG,OAAO,KAAK,SAAS,eAAe,IAAI,QAAQ;AAAA,IACnD,GAAG,OAAO,KAAK,SAAS,eAAe,IAAI,IAAI;AAAA,IAC/C,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,EAAE;AACJ;AAEA,SAAS,uBACP,QACA,KACA,MACoB;AACpB,MAAI,OAAO,UAAU,QAAW;AAC9B,UAAM,WAAW,KAAK,gBAAgB,IAAI,OAAO,KAAK;AACtD,QAAI,aAAa,OAAW,QAAO;AACnC,QAAI,IAAI,MAAM,OAAO,KAAK,GAAG,SAAS,MAAO,QAAO,KAAK;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,MAAI,OAAO,WAAW,SAAU,QAAO,KAAK,gBAAgB,CAAC;AAC7D,MAAI,OAAO,WAAW,QAAS,QAAO,KAAK,gBAAgB,KAAK,gBAAgB,SAAS,CAAC;AAC1F,MAAI,OAAO,WAAW,OAAQ,QAAO,KAAK;AAC1C,QAAM,SAAS,OAAO,OAAO,MAAM,UAAU;AAC7C,MAAI,OAAQ,QAAO,KAAK,gBAAgB,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC;AAC7D,SAAO;AACT;AAEA,SAAS,gBACP,GACA,OACA,OACA,MACA,OACA,OACA,MACA,MACA,UACc;AACd,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,MAAI,SAAS,cAAc;AACzB,UAAMC,KAAI,KAAK,IAAI,QAAQ;AAC3B,UAAM,IAAI,SAAS,WAAW,KAAK,IAAI,IAAI,KAAK,IAAI,QAAQ,WAAW,gBAAgB;AACvF,WAAO,EAAE,KAAK,OAAOA,IAAG,GAAG,WAAW,eAAe,QAAQ,WAAW,EAAE,QAAQ,SAAS,CAAC;AAAA,EAC9F;AAEA,QAAM,UAAU,KAAK,IAAI,QAAQ;AACjC,QAAM,IAAI,SAAS,WAAW,KAAK,IAAI,WAAW,KAAK,IAAI,QAAQ;AACnE,QAAM,SAAqB,SAAS,WAAW,QAAQ;AACvD,SAAO,EAAE,KAAK,OAAO,GAAG,UAAU,GAAG,WAAW,eAAe,QAAQ,WAAW,EAAE,OAAO,CAAC;AAC9F;AAEA,SAAS,6BACP,MACA,KACA,MACA,OACA,MACU;AACV,QAAM,YAA8B,KAAK,IAAI,CAAC,KAAK,aAAa;AAC9D,UAAM,KAAK,YAAY,IAAI,UAAU,KAAK;AAC1C,UAAM,OAAO,aAAa,IAAI,GAAG;AACjC,UAAM,QAAQ,YAAY,MAAM,IAAI,EAAE,QAAQ;AAC9C,WAAO,EAAE,UAAU,OAAO,KAAK,QAAQ,GAAG,KAAK,KAAK,QAAQ,EAAE;AAAA,EAChE,CAAC;AAGD,SAAO,eAAe,SAAS;AACjC;AAEA,SAAS,eAAe,WAAgD;AACtE,QAAM,QAAkB,IAAI,MAAM,UAAU,MAAM,EAAE,KAAK,CAAC;AAC1D,QAAM,WAAqB,CAAC;AAC5B,QAAM,SAAS,CAAC,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG;AAE/E,aAAW,YAAY,QAAQ;AAC7B,QAAI,OAAO;AACX,WAAO,SAAS,IAAI,MAAM,UAAa,SAAS,QAAQ,SAAS,IAAI,EAAI;AACzE,UAAM,SAAS,QAAQ,IAAI;AAC3B,aAAS,IAAI,IAAI,SAAS;AAAA,EAC5B;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,UAAkB,OAAuB;AAC5D,SAAO,WAAW,QAAQ,QAAQ;AACpC;AAEA,SAAS,yBACP,UACA,GACA,OACA,MACA,OACA,MACA,OACA,UACA,UACA,SACM;AACN,QAAM,IAAI,SAAS,UAAU,IAAI;AACjC,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,eAAe,uBAAuB,IAAI;AAChD,QAAM,OAAO,oBAAI,IAAoB;AAErC,OAAK,QAAQ,CAAC,KAAK,MAAM;AACvB,UAAM,OAAO,MAAM,IAAI,QAAQ;AAC/B,UAAM,QAAQ,aAAa,IAAI,IAAI,QAAQ,KAAK;AAChD,UAAM,UAAU,KAAK,IAAI,IAAI,QAAQ,KAAK;AAC1C,SAAK,IAAI,IAAI,UAAU,UAAU,CAAC;AAClC,UAAM,UAAU,KAAK,IAAI,KAAK,QAAQ,IAAI,mBAAmB,SAAS,OAAO,KAAK,KAAK;AACvF,UAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,SAAS,KAAK;AAClD,UAAM,OAAO,MAAM,CAAC,KAAK;AACzB,UAAM,OAAO;AACb,UAAM,QAAQ,QAAQ,KAAK,WAAW,OAAO;AAC7C,UAAM,SAAS,QAAQ,KAAK,YAAY,IAAI,IAAI,WAAW,eAAe;AAE1E,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,QAC9D,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,WAAWC,UAAS;AAAA,MACxB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,aAAa,IAAI,GAAG,GAAG,SAAS,QAAQ,WAAW,cAAc,QAAQ,SAAS;AAAA,QACvF,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,SAAS,uBACP,UACA,GACA,OACA,MACA,OACA,WACA,UACA,UACM;AACN,QAAM,IAAI,cAAc,WAAW,IAAI;AACvC,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,YAAY,WAAW;AAC7B,QAAM,SAAS,oBAAI,IAAsB;AAEzC,aAAW,OAAO,MAAM;AACtB,UAAM,MAAM,GAAG,IAAI,QAAQ,IAAI,CAAC;AAChC,UAAM,SAAS,OAAO,IAAI,GAAG,KAAK,CAAC;AACnC,WAAO,KAAK,YAAY,aAAa,IAAI,GAAG,GAAG,WAAW,YAAY,EAAE,KAAK;AAC7E,WAAO,IAAI,KAAK,MAAM;AAAA,EACxB;AAEA,QAAM,OAAO,oBAAI,IAAoB;AACrC,OAAK,QAAQ,CAAC,QAAQ;AACpB,UAAM,OAAO,MAAM,IAAI,QAAQ;AAC/B,UAAM,MAAM,GAAG,IAAI,QAAQ,IAAI,CAAC;AAChC,UAAM,SAAS,OAAO,IAAI,GAAG,KAAK,CAAC;AACnC,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK;AAC9B,SAAK,IAAI,KAAK,OAAO,CAAC;AACtB,UAAM,UAAU,KAAK,IAAI,KAAK,SAAS,IAAI,mBAAmB,MAAM,OAAO,QAAQ,KAAK,MAAM;AAC9F,UAAM,QAAQ,IAAI,IAAI,KAAK,IAAI,KAAK,QAAQ,KAAK;AACjD,UAAM,UAAU,mBAAmB,QAAQ,MAAM,SAAS;AAC1D,UAAM,QAAQ,QAAQ,KAAK,WAAW;AACtC,UAAM,SAAS,QAAQ,IAAI;AAC3B,UAAM,SAAqB,IAAI,IAAI,UAAU;AAE7C,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC;AAAA,QAC/D,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,WAAWA,UAAS;AAAA,MACxB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,aAAa,IAAI,GAAG,GAAG,QAAQ,UAAU,GAAG,WAAW,cAAc,QAAQ,SAAS;AAAA,QAC3F;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEA,SAAS,qBAAqB,MAAkC,MAAsB;AACpF,SAAO,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,QAAQ,YAAY,aAAa,IAAI,GAAG,GAAG,IAAI,EAAE,KAAK,CAAC;AACzF;AAEA,SAAS,uBAAuB,MAAuD;AACrF,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,OAAO,KAAM,QAAO,IAAI,IAAI,WAAW,OAAO,IAAI,IAAI,QAAQ,KAAK,KAAK,CAAC;AACpF,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAc,OAAe,MAAsB;AAC7E,MAAI,SAAS,EAAG,QAAO;AACvB,QAAM,MAAM,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC;AACtD,UAAQ,QAAQ,QAAQ,KAAK,KAAK;AACpC;AAEA,SAAS,mBAAmB,QAA2B,MAAc,KAAqB;AACxF,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,IAAK,YAAW,OAAO,CAAC,KAAK,KAAK;AAC5D,SAAO;AACT;AAEA,SAAS,kBAAkB,UAAyC;AAClE,QAAM,SAAS,SAAS,IAAI,gBAAgB,EAAE,OAAO,CAAC,MAAiB,MAAM,MAAS;AACtF,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAClE,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/C,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/C,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;AACzD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;AAC1D,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AACrE;AAEA,SAAS,iBAAiB,SAAyC;AACjE,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,QACL,GAAG,QAAQ,OAAO,IAAI,QAAQ;AAAA,QAC9B,GAAG,QAAQ,OAAO,IAAI,QAAQ;AAAA,QAC9B,OAAO,QAAQ,SAAS;AAAA,QACxB,QAAQ,QAAQ,SAAS;AAAA,MAC3B;AAAA,IACF,KAAK;AACH,aAAO,cAAc,QAAQ,GAAG,QAAQ,WAAW;AAAA,IACrD,KAAK;AACH,aAAO,cAAc,OAAO;AAAA,IAC9B,KAAK;AACH,aAAO,kBAAkB,QAAQ,QAAQ;AAAA,EAC7C;AACF;AAEA,SAAS,cAAc,MAAqD;AAC1E,QAAM,WAAW,YAAY,KAAK,SAAS,KAAK,QAAQ;AACxD,QAAM,IACJ,KAAK,WAAW,WACZ,KAAK,SAAS,IAAI,SAAS,QAAQ,IACnC,KAAK,WAAW,QACd,KAAK,SAAS,IAAI,SAAS,QAC3B,KAAK,SAAS;AACtB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,KAAK,SAAS,IAAI,KAAK;AAAA,IAC1B,OAAO,SAAS;AAAA,IAChB,QAAQ,KAAK,WAAW;AAAA,EAC1B;AACF;AAEA,SAAS,cAAc,GAAW,aAA2B;AAC3D,QAAM,OAAO,CAAC,GAAG,EAAE,SAAS,kBAAkB,CAAC,EAAE,IAAI,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC,CAAC;AAChF,MAAI,KAAK,SAAS,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAC9D,QAAM,KAAK,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;AAC5C,QAAM,KAAK,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;AAC5C,QAAM,MAAM,cAAc;AAC1B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI;AAC/B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI;AAC/B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI;AAC/B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI;AAC/B,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AACrE;AAEA,SAAS,kBACP,UACA,IACA,IACgB;AAChB,SAAO,SAAS,IAAI,CAAC,YAAY,iBAAiB,SAAS,IAAI,EAAE,CAAC;AACpE;AAEA,SAAS,iBAAiB,SAAuB,IAAY,IAA0B;AACrF,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,QAAQ,cAAc,QAAQ,QAAQ,IAAI,EAAE,EAAE;AAAA,IACrE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ,EAAE,GAAG,IAAI,QAAQ,OAAO,IAAI,EAAE,GAAG,GAAG,IAAI,QAAQ,OAAO,IAAI,EAAE,EAAE;AAAA,MACzE;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,GAAG,eAAe,QAAQ,GAAG,IAAI,EAAE,EAAE;AAAA,IAC5D,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,EAAE,GAAG,IAAI,QAAQ,SAAS,IAAI,EAAE,GAAG,GAAG,IAAI,QAAQ,SAAS,IAAI,EAAE,EAAE;AAAA,MAC/E;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,UAAU,kBAAkB,QAAQ,UAAU,IAAI,EAAE,EAAE;AAAA,IAC7E,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,GAAG,IAAI,QAAQ,IAAI,EAAE,GAAG,GAAG,IAAI,QAAQ,IAAI,EAAE,EAAE;AAAA,EACxE;AACF;AAEA,SAAS,iBACP,SACA,IACA,IACkC;AAClC,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM;AAAA,MAC7C;AAAA,MACA,EAAE,QAAQ,cAAc,OAAO,QAAQ,IAAI,EAAE,EAAE;AAAA,IACjD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,cAAc,MAAY,IAAY,IAAkB;AAC/D,SAAO,EAAE,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAC5F;AAEA,SAAS,eAAe,GAAW,IAAY,IAAoB;AACjE,MAAI,IAAI;AACR,SAAO,EAAE,QAAQ,oBAAoB,CAAC,UAAU;AAC9C,UAAM,QAAQ,MAAM,MAAM,IAAI,KAAK;AACnC,WAAO,OAAO,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,EAC1C,CAAC;AACH;AAEA,SAAS,aAAa,KAA2B;AAC/C,SAAO,IAAI,SAAS,IAAI;AAC1B;AAEO,IAAM,QAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAG,MAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,UAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,WAAO;AAAA,MACL,SAAS,OAAO,WAAW;AAAA,MAC3B,UAAU,OAAO,YAAY,CAAC;AAAA,MAC9B,GAAG,kBAAkB,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;AC78BO,SAAS,aAAa,IAAoB,OAAoC;AACnF,QAAM,EAAE,SAAS,SAAS,WAAW,IAAI;AACzC,QAAM,EAAE,MAAM,OAAAC,OAAM,IAAI;AAExB,QAAM,OAAO,QAAQ;AACrB,QAAM,MAAM,KAAK,QAAQ,SAAY,KAAK,MAAM,QAAQ,UAAU;AAClE,QAAM,UAAU,QAAQ;AACxB,QAAM,UAAU,GAAG,SAAS,QAAQ,WAAW,gBAAgB,OAAO,IAAI;AAC1E,QAAM,aAAa,OAAO;AAC1B,QAAM,aAAa,OAAO;AAC1B,QAAM,aAAa,OAAO;AAC1B,QAAM,kBAAkB;AAExB,QAAM,cAAc;AAAA,IAClB,KAAK;AAAA,IACL,GAAG,SAAS;AAAA,IACZ,GAAG,SAAS,iBAAiB,GAAG,SAAS,eAAe;AAAA,EAC1D;AAEA,QAAM,cACJ,YAAY,SAAS,YACjB,IACA,YAAY,SAAS,UAClB,YAAY,cAAc,IAC3B;AAGR,QAAM,aAAa,gBAAgBA,QAAO,KAAK,OAAO;AAKtD,QAAM,cAAc,WAAW,IAAI,CAAC,SAAS;AAC3C,UAAM,YAAY,KAAK,QAAQ,eAAe,KAAK,KAAK,IAAI;AAC5D,WAAO,EAAE,MAAM,WAAW,QAAQ,kBAAkB,KAAK,SAAS,SAAS,EAAE;AAAA,EAC/E,CAAC;AACD,QAAM,iBAAiB,IAAI;AAAA,IACzB,YAAY,IAAI,CAAC,EAAE,MAAM,OAAO,MAAM,CAAC,KAAK,MAAM,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC;AAAA,EACzE;AAEA,QAAM,UAAU,KAAK,QAAQ,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,OAAO,EAAE,OAAO,MAAM,EAAE,WAAW,EAAE,CAAC;AAI/F,QAAM,YAAY,IAAI,MAAc,KAAK,OAAO,EAAE,KAAK,UAAU;AACjE,aAAW,EAAE,MAAM,OAAO,KAAK,aAAa;AAC1C,SAAK,KAAK,WAAW,OAAO,GAAG;AAC7B,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,QAAQ,OAAO;AAErB,YAAM,cAAc,KAAK,QAAQ,SAAS,YAAY,cAAc;AACpE,YAAM,SAAS,OAAO,MAAM,QAAQ,QAAQ,cAAc,QAAQ;AAClE,gBAAU,GAAG,IAAI,KAAK,IAAI,UAAU,GAAG,GAAI,MAAM;AAAA,IACnD;AAAA,EACF;AAGA,QAAM,aAAa,IAAI,MAAc,OAAO,EAAE,KAAK,UAAU;AAC7D,aAAW,EAAE,MAAM,WAAW,OAAO,KAAK,aAAa;AACrD,SAAK,KAAK,WAAW,OAAO,GAAG;AAC7B,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,aAAa,KAAK,QAAQ,oBAAoB,WAAW,KAAK,KAAK,IAAI;AAC7E,YAAM,QAAQ,OAAO;AACrB,YAAM,OAAO,UAAU,GAAG,KAAK;AAC/B,YAAM,WAAW,OAAO,QAAQ;AAChC,YAAM,QAAQ,KAAK,IAAI,WAAW,KAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,CAAC,GAAG,CAAC;AAE5E,YAAM,iBACJ,YAAY,SAAS,YACjB,IACA,YAAY,SAAS,UAClB,YAAY,cAAc,IAC3B,KAAK,IAAI,OAAO,eAAe;AACvC,YAAM,WAAW,KAAK,UAAU,sBAAsB,SAAS,IAAI;AACnE,YAAM,UACJ,OAAO,MAAM,QAAQ,SAAS,iBAAiB,aAAa,WAAW,QAAQ;AACjF,iBAAW,GAAG,IAAI,KAAK,IAAI,WAAW,GAAG,GAAI,OAAO;AAAA,IACtD;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,YAAY,SAAS,SAAS;AAChC,kBAAc,YAAY;AAAA,EAC5B,WAAW,YAAY,SAAS,WAAW;AACzC,UAAM,gBAA0B,CAAC;AACjC,eAAW,EAAE,MAAM,WAAW,OAAO,KAAK,aAAa;AACrD,UAAI,KAAK,QAAQ,SAAS,UAAW;AACrC,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,UAAU,KAAK,WAAW;AAChC,YAAM,UAAU,KAAK,WAAW;AAChC,YAAM,QAAQ,YAAY,WAAW,KAAK,MAAM,SAAS,GAAG,IAAI;AAChE,YAAM,QAAQ,YAAY,YAAY,KAAK,MAAM,SAAS,GAAG,IAAI;AACjE,YAAM,cAAc,KAAK,QAAQ,oBAAoB,WAAW,KAAK,KAAK,IAAI;AAC9E,YAAM,WAAW,KAAK,UAAU,sBAAsB,SAAS,IAAI;AACnE,YAAM,QAAQ,OAAO;AACrB,YAAM,WAAW,QAAQ,QAAQ;AACjC,YAAM,WAAW,QAAQ,cAAc,WAAW,QAAQ;AAC1D,YAAM,KAAK,WAAW,KAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,CAAC;AAC5D,YAAM,KAAK,WAAW,KAAK,IAAI,OAAO,MAAM,QAAQ,QAAQ,CAAC;AAC7D,oBAAc,KAAK,KAAK,IAAI,IAAI,IAAI,CAAG,CAAC;AAAA,IAC1C;AACA,kBAAc,cAAc,SAAS,IAAI,KAAK,IAAI,GAAK,GAAG,aAAa,IAAI;AAAA,EAC7E,WAAW,YAAY,SAAS,WAAW;AACzC,UAAM,gBAA0B,CAAC;AACjC,eAAW,EAAE,MAAM,WAAW,OAAO,KAAK,aAAa;AACrD,UAAI,KAAK,QAAQ,SAAS,UAAW;AACrC,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,MAAM,KAAK,OAAO;AACxB,YAAM,UAAU,KAAK,WAAW;AAChC,YAAM,UAAU,KAAK,WAAW;AAChC,YAAM,QAAQ,YAAY,WAAW,KAAK,MAAM,SAAS,GAAG,IAAI;AAChE,YAAM,QAAQ,YAAY,YAAY,KAAK,MAAM,SAAS,GAAG,IAAI;AACjE,YAAM,cAAc,KAAK,QAAQ,oBAAoB,WAAW,KAAK,KAAK,IAAI;AAC9E,YAAM,WAAW,KAAK,UAAU,sBAAsB,SAAS,IAAI;AACnE,YAAM,QAAQ,OAAO;AACrB,YAAM,WAAW,QAAQ,QAAQ;AACjC,YAAM,WAAW,QAAQ,cAAc,WAAW,QAAQ;AAC1D,YAAM,KAAK,WAAW,KAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,CAAC;AAC5D,YAAM,KAAK,WAAW,KAAK,IAAI,OAAO,MAAM,QAAQ,QAAQ,CAAC;AAC7D,oBAAc,KAAK,KAAK,IAAI,IAAI,IAAI,CAAG,CAAC;AAAA,IAC1C;AACA,kBAAc,cAAc,SAAS,IAAI,KAAK,IAAI,GAAG,aAAa,IAAI;AAAA,EACxE;AAUA,QAAM,iBAAiC,CAAC;AACxC,QAAM,SAAyB,CAAC;AAChC,QAAM,cAA8B,CAAC;AACrC,QAAM,cAA4B,CAAC;AAEnC,QAAM,eAA+E,CAAC;AAEtF,QAAM,cAA8E,CAAC;AAGrF,QAAM,YAAY,oBAAI,IAAqE;AAE3F,QAAM,mBAAmC,CAAC;AAE1C,MAAI,GAAG,SAAS,OAAO;AACrB,mBAAe,KAAK;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,GAAG,SAAS;AAAA,MACrB,UAAU,EAAE,GAAG,SAAS,GAAG,UAAU,WAAW,cAAc;AAAA,MAC9D,UAAU,WAAW,gBAAgB;AAAA,MACrC,YAAY,WAAW;AAAA,MACvB,YAAY;AAAA,MACZ,MAAM,QAAQ;AAAA,IAChB,CAAC;AAED,UAAM,SAAS,GAAG,SAAS,MAAM,UAAU,WAAW,gBAAgB,KAAK;AAC3E,UAAM,SAAS,WAAW,gBAAgB;AAC1C,iBAAa,KAAK,EAAE,GAAG,SAAS,GAAG,SAAS,OAAO,QAAQ,QAAQ,SAAS,EAAE,CAAC;AAAA,EACjF;AAGA,QAAM,gBAA4C,CAAC;AAEnD,aAAW,EAAE,MAAM,WAAW,OAAO,KAAK,aAAa;AACrD,UAAM,cAAc,UAAU;AAC9B,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,UAAU,KAAK,WAAW;AAChC,UAAM,SAAS,KAAK,MAAM,wBAAwB,KAAK,GAAG;AAE1D,UAAM,QAAQ,UAAU,YAAY,WAAW,GAAG,KAAK,GAAG;AAC1D,UAAM,QAAQ,UAAU,UAAU,YAAY,YAAY,GAAG,KAAK,GAAG;AACrE,UAAM,QAAQ,YAAY,WAAW,KAAK,MAAM,SAAS,GAAG,IAAI;AAChE,UAAM,QAAQ,YAAY,YAAY,KAAK,MAAM,SAAS,GAAG,IAAI;AAIjE,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,MAC1D,MAAM,YAAY;AAAA,MAClB,QAAQ,YAAY;AAAA,MACpB,aAAa;AAAA,MACb,IAAI;AAAA,IACN,CAAC;AAGD,UAAM,cAAc;AACpB,gBAAY;AAAA,MACV,EAAE,GAAG,OAAO,GAAG,QAAQ,cAAc,GAAG,OAAO,OAAO,QAAQ,YAAY;AAAA;AAAA,MAC1E,EAAE,GAAG,OAAO,GAAG,QAAQ,QAAQ,cAAc,GAAG,OAAO,OAAO,QAAQ,YAAY;AAAA;AAAA,MAClF,EAAE,GAAG,QAAQ,cAAc,GAAG,GAAG,OAAO,OAAO,aAAa,QAAQ,MAAM;AAAA;AAAA,MAC1E,EAAE,GAAG,QAAQ,QAAQ,cAAc,GAAG,GAAG,OAAO,OAAO,aAAa,QAAQ,MAAM;AAAA;AAAA,IACpF;AAEA,cAAU,IAAI,QAAQ,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,QAAQ,MAAM,CAAC;AAEzE,UAAM,cAAc,KAAK,QAAQ,oBAAoB,WAAW,KAAK,KAAK,IAAI;AAC9E,QAAI,KAAK,OAAO;AACd,YAAM,IAAI,eAAe,KAAK,OAAO,OAAO,OAAO,OAAO,SAAS;AACnE,kBAAY,KAAK,GAAG,EAAE,QAAQ;AAC9B,mBAAa,KAAK,EAAE,QAAQ;AAAA,IAC9B;AAGA,UAAM,QAAQ,OAAO;AACrB,UAAM,WAAW,KAAK,UAAU,sBAAsB,SAAS,IAAI;AACnE,UAAM,cAAoB;AAAA,MACxB,GAAG,QAAQ;AAAA,MACX,GAAG,QAAQ,cAAc;AAAA,MACzB,OAAO,QAAQ,QAAQ;AAAA,MACvB,QAAQ,QAAQ,cAAc,WAAW,QAAQ;AAAA,IACnD;AAEA,UAAM,SAAS,YAAY,QAAQ,KAAK,IAAI,OAAO,MAAM,QAAQ,OAAO,CAAC;AACzE,UAAM,SAAS,YAAY,SAAS,KAAK,IAAI,OAAO,MAAM,QAAQ,QAAQ,CAAC;AAC3E,UAAM,aAAa,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAC7C,UAAM,QACJ,KAAK,QAAQ,SAAS,aAAa,gBAAgB,SAAY,cAAc;AAC/E,UAAM,UAAU,YAAY,KAAK,YAAY,QAAQ,OAAO,MAAM,QAAQ,QAAQ,SAAS;AAC3F,UAAM,UAAU,YAAY,KAAK,YAAY,SAAS,OAAO,MAAM,QAAQ,SAAS,SAAS;AAE7F,QAAI,aAAa,OAAO;AACxB,QAAI,OAAO,QAAQ,MAAM,QAAQ;AAC/B,YAAM,YAAY,CAAC,QAA2B,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,EAAE,EAAE;AAC/E,YAAM,eAAe,CAAC,YACpB,QAAQ,SAAS,UACb;AAAA,QACE,GAAG;AAAA,QACH,GAAI,QAAQ,KAAK,EAAE,IAAI,GAAG,MAAM,IAAI,QAAQ,EAAE,GAAG,IAAI,CAAC;AAAA,QACtD,UAAU,QAAQ,SAAS,IAAI,YAAY;AAAA,MAC7C,IACA;AACN,mBAAa,EAAE,GAAG,OAAO,OAAO,UAAU,OAAO,MAAM,SAAS,IAAI,YAAY,EAAE;AAClF,iBAAW,QAAQ,OAAO,OAAO,OAAO;AACtC,oBAAY,KAAK;AAAA,UACf,GAAG;AAAA,UACH,OAAO,YAAY,SAAS;AAAA,UAC5B,OAAO,UAAU,KAAK,KAAK;AAAA,UAC3B,GAAI,KAAK,YAAY,EAAE,WAAW,UAAU,KAAK,SAAS,EAAE,IAAI,CAAC;AAAA,UACjE,GAAI,KAAK,OAAO,EAAE,MAAM,UAAU,KAAK,IAAI,EAAE,IAAI,CAAC;AAAA,QACpD,CAAC;AAAA,MACH;AAAA,IACF;AACA,gBAAY,KAAK,WAAW,YAAY,aAAa,KAAK,CAAC;AAG3D,QAAI,KAAK,SAAS;AAChB,YAAM,WAAW,QAAQ,QAAQ,QAAQ;AACzC,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,SAAS,KAAK;AAAA,QACd,UAAU,EAAE,GAAG,QAAQ,QAAQ,GAAG,GAAG,SAAS;AAAA,QAC9C,UAAU,UAAU,WAAW;AAAA,QAC/B,YAAY,UAAU,WAAW;AAAA,QACjC,MAAM,UAAU,QAAQ;AAAA,QACxB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,SAAS,KAAK,MAAM,SAAS,GAAG;AACvC,iBAAW,QAAQ,KAAK,OAAO;AAC7B,oBAAY,KAAK,GAAG,iBAAiB,MAAM,aAAa,SAAS,CAAC;AAAA,MACpE;AAAA,IACF;AAGA,eAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,OAAO,OAAO,GAAG;AAC7D,YAAM,aAAa,GAAG,MAAM,IAAI,MAAM;AACtC,YAAM,cAA0B;AAAA,QAC9B,QAAQ;AAAA,UACN,GAAG,OAAO,OAAO,IAAI,QAAQ;AAAA,UAC7B,GAAG,OAAO,OAAO,IAAI,QAAQ;AAAA,UAC7B,OAAO,OAAO,OAAO,QAAQ;AAAA,UAC7B,QAAQ,OAAO,OAAO,SAAS;AAAA,QACjC;AAAA,QACA,GAAI,OAAO,QACP;AAAA,UACE,OAAO,OAAO;AAAA,YACZ,OAAO,QAAQ,OAAO,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM;AAAA,cAC/C;AAAA,cACA,EAAE,GAAG,GAAI,IAAI,QAAQ,SAAS,GAAG,GAAI,IAAI,QAAQ,QAAQ;AAAA,YAC3D,CAAC;AAAA,UACH;AAAA,QACF,IACA,CAAC;AAAA,MACP;AACA,oBAAc,UAAU,IAAI;AAAA,IAC9B;AAGA,eAAW,MAAM,OAAO,iBAAiB,CAAC,GAAG;AAC3C,uBAAiB,KAAK,EAAE,GAAG,IAAI,SAAS,GAAG,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC;AAAA,IACrE;AAIA,eAAW,MAAM,OAAO,eAAe,CAAC,GAAG;AACzC,mBAAa,KAAK;AAAA,QAChB,GAAG,GAAG,IAAI,QAAQ;AAAA,QAClB,GAAG,GAAG,IAAI,QAAQ;AAAA,QAClB,OAAO,GAAG,QAAQ;AAAA,QAClB,QAAQ,GAAG,SAAS;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,SAAS,UAAU,IAAI,YAAY,WAAW,GAAG,KAAK,SAAS,GAAG,IAAI;AAC5E,QAAM,SAAS,UAAU,IAAI,UAAU,YAAY,YAAY,GAAG,SAAS,GAAG,IAAI;AAGlF,QAAM,UAAoB,CAAC;AAC3B,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,EAAE,OAAO,KAAK,aAAa;AACpC,QAAI,OAAO,MAAM,MAAM;AACrB,iBAAW,OAAO,OAAO,MAAM,MAAM;AACnC,YAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACtB,mBAAS,IAAI,GAAG;AAChB,kBAAQ,KAAK,GAAG;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAMC,SAAQ,2BAA2B,GAAG,SAAS,CAAC,GAAG,cAAc;AAGvE,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAIA,OAAM,SAAS,GAAG;AACpB,UAAM,iBAAiB;AAAA,MACrBA,OAAM,IAAI,CAAC,SAAS;AAClB,cAAM,gBACJ,KAAK,eACJ,OAAO,KAAK,OAAO,eAAe,WAC9B,KAAK,MAAM,aACZ;AACN,eAAO,gBAAgB,OAAO,EAAE,GAAG,MAAM,YAAY,WAAoB;AAAA,MAC3E,CAAC;AAAA,IACH;AACA,UAAM,kBAAkB,gBAAgB;AAAA,MACtC,SAAS;AAAA,MACT,YAAY;AAAA,MACZ;AAAA,MACA,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,IACtB,CAAC;AACD,UAAM,WAAW,gBAAgB;AACjC,UAAM,eAAe,gBAAgB;AAGrC,eAAW,OAAO,UAAU;AAC1B,UAAI,CAAC,SAAS,IAAI,GAAG,GAAG;AACtB,iBAAS,IAAI,GAAG;AAChB,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AAGA,UAAM,YAAY,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAC9D,UAAM,aAAa,aAAa,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAG/D,UAAM,MAAM,gBAAgB;AAC5B,QAAI,IAAI,OAAO,OAAQ,UAAS,IAAI,OAAO;AAC3C,QAAI,IAAI,OAAO,OAAQ,UAAS,IAAI,OAAO;AAI3C,UAAMC,YAA2B;AAAA,MAC/B,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,QACL,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,QACrD,YAAY,QAAQ;AAAA,QACpB,UAAAA;AAAA,QACA,GAAI,QAAQ,SAAS,IAAI,EAAE,MAAM,QAAQ,IAAI,CAAC;AAAA,MAChD;AAAA,MACA,SAAS;AAAA,MACT,GAAI,YAAY,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,YAAY,EAAE,IAAI,CAAC;AAAA,IACrE;AAAA,EACF;AAGA,QAAM,WAA2B,CAAC,GAAG,gBAAgB,GAAG,QAAQ,GAAG,WAAW;AAE9E,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA,GAAI,QAAQ,SAAS,IAAI,EAAE,MAAM,QAAQ,IAAI,CAAC;AAAA,IAChD;AAAA,IACA,SAAS;AAAA,IACT,GAAI,YAAY,SAAS,IAAI,EAAE,QAAQ,EAAE,OAAO,YAAY,EAAE,IAAI,CAAC;AAAA,EACrE;AACF;AAEA,SAAS,2BACPD,QACA,gBACa;AACb,SAAOA,OAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,GAAG;AAAA,IACH,MAAM,6BAA6B,KAAK,MAAM,cAAc;AAAA,IAC5D,IAAI,6BAA6B,KAAK,IAAI,cAAc;AAAA,EAC1D,EAAE;AACJ;AAEA,SAAS,6BACP,SACA,gBACa;AACb,MAAI,QAAQ,iBAAiB,OAAW,QAAO;AAE/C,QAAM,SAAS,QAAQ,SAAS,KAAK,GAAG;AACxC,QAAM,aAAa,eAAe,IAAI,MAAM;AAC5C,QAAM,UAAU,YAAY,KAAK;AACjC,QAAM,cACJ,SAAS,SAAS,aAAa,QAAQ,gBAAgB,UACnD,4BAA4B,QAAQ,KAAY,QAAQ,YAAY,IACpE,wBAAwB,YAAY,OAAO,WAAW,CAAC,GAAG,QAAQ,YAAY;AAEpF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,eAAe,qBAAqB,QAAQ,YAAY;AAAA,EAClE;AACF;AAEA,SAAS,wBACP,SACA,cACoB;AACpB,MAAI,eAAe,GAAG;AACpB,QAAI,iBAAiB,MAAM,QAAQ,MAAO,QAAO;AACjD,WAAO;AAAA,EACT;AACA,SAAO,QAAQ,IAAI,YAAY,EAAE,IAAI,IAAI,YAAY,KAAK;AAC5D;AA2CA,SAAS,kBAAkB,SAAsB,OAAoC;AACnF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,OAAO,QAAQ;AACrB,QAAM,MAAM,QAAQ;AAEpB,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK,WAAW;AACd,YAAME,UAAS,UAAU,QAAQ,WAAW;AAC5C,UAAI,CAACA,SAAQ;AACX,cAAM,IAAI,OAAO;AACjB,cAAMC,KAAI,WAAW,eAAe,MAAM;AAC1C,eAAO;AAAA,UACL,OAAO;AAAA,YACL,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQA,GAAE;AAAA,YAC3C,UAAU;AAAA,cACR;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,IAAI,QAAQ,WAAW;AAAA,gBAChC,UAAU,EAAE,GAAG,KAAK,GAAG,MAAM,WAAW,eAAe,IAAI;AAAA,gBAC3D,UAAU,WAAW;AAAA,gBACrB,YAAY,WAAW;AAAA,gBACvB,MAAM,QAAQ;AAAA,cAChB;AAAA,YACF;AAAA,UACF;AAAA,UACA,SAAS,CAAC;AAAA,QACZ;AAAA,MACF;AACA,aAAOD,QAAO,OAAO,QAAQ,KAAK,KAAK;AAAA,IACzC;AAAA,IACA,KAAK,QAAQ;AAEX,YAAM,WAAW,WAAW,eAAe;AAC3C,YAAM,QAAQ,KAAK;AAAA,QACjB,OAAO;AAAA,QACP,KAAK,IAAI,OAAO,IAAI,QAAQ,KAAK,SAAS,WAAW,MAAM,CAAC;AAAA,MAC9D;AACA,YAAM,QAAQ,WAAW,eAAe,WAAW,aAAa,MAAM;AACtE,aAAO;AAAA,QACL,OAAO;AAAA,UACL,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,QAAQ,MAAM;AAAA,UACnD,UAAU;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,SAAS,QAAQ;AAAA,cACjB,UAAU,EAAE,GAAG,KAAK,GAAG,MAAM,WAAW,eAAe,IAAI;AAAA,cAC3D,UAAU,WAAW;AAAA,cACrB,YAAY,WAAW;AAAA,cACvB,MAAM,QAAQ;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAAA,QACA,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,gBAAgB,WAAW,gBAAgB;AACjD,YAAM,QAAQ,KAAK,IAAI,OAAO,IAAI,gBAAgB,CAAC;AACnD,YAAM,UAAU,QAAQ;AAExB,YAAM,SAAS,MAAM,gBAAgB;AACrC,YAAM,WAAW;AACjB,YAAM,SAAS,SAAS,WAAW,WAAW,gBAAgB;AAC9D,YAAM,QAAQ,QAAQ,QAClB,SAAS,WAAW,WAAW,gBAAgB,MAC/C,SAAS;AAEb,YAAM,MAAsB;AAAA,QAC1B;AAAA,UACE,MAAM;AAAA,UACN,SAAS,QAAQ;AAAA,UACjB,UAAU,EAAE,GAAG,SAAS,GAAG,OAAO;AAAA,UAClC,UAAU;AAAA,UACV,YAAY,WAAW;AAAA,UACvB,YAAY;AAAA,UACZ,MAAM,QAAQ;AAAA,UACd,QAAQ;AAAA,QACV;AAAA,MACF;AACA,UAAI,QAAQ,OAAO;AACjB,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,SAAS,QAAQ;AAAA,UACjB,UAAU,EAAE,GAAG,SAAS,GAAG,OAAO;AAAA,UAClC,UAAU,WAAW;AAAA,UACrB,YAAY,WAAW;AAAA,UACvB,MAAM,QAAQ;AAAA,UACd,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,aAAO;AAAA,QACL,OAAO,EAAE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,QAAQ,MAAM,GAAG,UAAU,IAAI;AAAA,QAC7E,SAAS,CAAC;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;AAWO,SAAS,mBACd,WACA,WACA,kBACqB;AACrB,QAAM,MAAM,aAAa,cAAc,mBAAmB,YAAY;AACtE,MACE,QAAQ,UACR,QAAQ,QACR,QAAQ,MACR,QAAQ,aACR,QAAQ,UACR,QAAQ,SACR;AACA,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,QAAQ,IAAI,EAAE,MAAM,UAAU,IAAI,EAAE,MAAM,SAAS,YAAY,IAAI;AAAA,EAC5E;AACA,MAAI,OAAO,QAAQ,WAAW;AAC5B,WAAO,MAAM,EAAE,MAAM,UAAU,IAAI,EAAE,MAAM,UAAU;AAAA,EACvD;AACA,QAAM,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY;AAC3C,MAAI,QAAQ,aAAa,QAAQ,OAAO,QAAQ,SAAS,QAAQ,QAAQ;AACvE,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,QAAQ,aAAa,QAAQ,gBAAgB,QAAQ,UAAU,QAAQ,QAAQ;AACjF,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,MAAI,QAAQ,aAAa,QAAQ,iBAAiB,QAAQ,OAAO;AAC/D,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AACA,QAAM,YAAY,WAAW,IAAI,SAAS,GAAG,IAAI,IAAI,MAAM,GAAG,EAAE,IAAI,GAAG;AACvE,MAAI,CAAC,MAAM,SAAS,KAAK,YAAY,GAAG;AACtC,UAAM,MAAM,IAAI,SAAS,GAAG,IAAI,YAAY,MAAM;AAClD,WAAO,QAAQ,IAAI,EAAE,MAAM,UAAU,IAAI,EAAE,MAAM,SAAS,YAAY,IAAI;AAAA,EAC5E;AACA,SAAO,EAAE,MAAM,UAAU;AAC3B;AAIA,SAAS,WAAW,OAAc,MAAY,eAAsC;AAClF,QAAM,SAAS,KAAK,QAAQ,KAAK,IAAI,MAAM,QAAQ,OAAO,CAAC;AAC3D,QAAM,SAAS,KAAK,SAAS,KAAK,IAAI,MAAM,QAAQ,QAAQ,CAAC;AAC7D,QAAM,QAAQ,kBAAkB,SAAY,gBAAgB,KAAK,IAAI,QAAQ,QAAQ,CAAC;AAGtF,QAAM,UAAU,KAAK,KAAK,KAAK,QAAQ,MAAM,QAAQ,QAAQ,SAAS;AACtE,QAAM,UAAU,KAAK,KAAK,KAAK,SAAS,MAAM,QAAQ,SAAS,SAAS;AAExE,SAAO;AAAA,IACL,MAAM;AAAA,IACN,WAAW,aAAa,OAAO,KAAK,OAAO,WAAW,KAAK;AAAA,IAC3D,UAAU,MAAM;AAAA,EAClB;AACF;AAQO,SAAS,eAAe,KAA2D;AACxF,QAAM,SAAS,IAAI,QAAQ,IAAI;AAC/B,MAAI,WAAW,IAAI;AACjB,WAAO;AAAA,MACL,EAAE,MAAM,IAAI,MAAM,GAAG,MAAM,EAAE,KAAK,GAAG,YAAY,MAAM;AAAA,MACvD,EAAE,MAAM,IAAI,MAAM,SAAS,CAAC,EAAE,KAAK,GAAG,YAAY,KAAK;AAAA,IACzD;AAAA,EACF;AACA,QAAM,QAAQ,IACX,MAAM,oBAAoB,EAC1B,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO,MAAM,IAAI,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,IAAI,EAAE,EAAE;AAAA,EAC7D;AACA,SAAO,CAAC,EAAE,MAAM,IAAI,KAAK,GAAG,YAAY,MAAM,CAAC;AACjD;AAQA,SAAS,oBAAoB,OAAsB,OAAwB;AACzE,QAAM,EAAE,SAAS,MAAM,IAAI;AAC3B,QAAM,OAAO,eAAe,OAAO,KAAK;AACxC,UAAQ,MAAM,eAAe;AAAA,IAC3B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,OAAO,IAAI,QAAQ,OAAO;AAAA,IACnC,KAAK;AAAA,IACL;AACE,aAAO,OAAO,QAAQ,OAAO;AAAA,EACjC;AACF;AAEA,SAAS,eAAe,OAAsB,OAAwB;AACpE,QAAM,KAAK,MAAM,WAAW;AAC5B,QAAM,OAAO,MAAM,MAAM,gBAAgB,SAAS,IAAI,MAAM,QAAQ,OAAO;AAC3E,MAAI,CAAC,MAAO,QAAO,KAAK,OAAO;AAC/B,QAAME,SAAQ,eAAe,KAAK;AAClC,MAAIA,OAAM,UAAU,EAAG,QAAO,KAAK,OAAO;AAC1C,QAAM,aAAa,MAAM,WAAW;AACpC,SAAO,MAAMA,OAAM,SAAS,MAAM,aAAa,QAAQ,OAAO;AAChE;AAGA,SAAS,sBAAsB,OAA8B;AAC3D,SAAO,MAAM,WAAW,gBAAgB,MAAM,QAAQ;AACxD;AAOA,SAAS,iBAAiB,MAAkB,MAAY,OAAsC;AAC5F,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,KAAK,WAAW;AACtB,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,QAAQ,KAAK,KAAK,SAAS,KAAK,OAAO,MAAM;AACnD,QAAM,OAAO,KAAK,MAAM;AACxB,QAAM,MAAM,KAAK,YAAY;AAE7B,MAAI,IAAY;AAChB,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,WAAK,KAAK,IAAI,QAAQ,OAAO;AAC7B,WAAK,KAAK,IAAI,QAAQ,OAAO;AAC7B;AAAA,IACF,KAAK;AACH,WAAK,KAAK,IAAI,KAAK,QAAQ,QAAQ,QAAQ,OAAO;AAClD,WAAK,KAAK,IAAI,QAAQ,OAAO;AAC7B;AAAA,IACF,KAAK;AACH,WAAK,KAAK,IAAI,QAAQ,OAAO;AAC7B,WAAK,KAAK,IAAI,KAAK,SAAS,OAAO,QAAQ,OAAO;AAClD;AAAA,IACF,KAAK;AACH,WAAK,KAAK,IAAI,KAAK,QAAQ,QAAQ,QAAQ,OAAO;AAClD,WAAK,KAAK,IAAI,KAAK,SAAS,OAAO,QAAQ,OAAO;AAClD;AAAA,IACF,KAAK;AACH,WAAK,KAAK,KAAK,KAAK,QAAQ,SAAS;AACrC,WAAK,KAAK,KAAK,KAAK,SAAS,QAAQ;AACrC;AAAA,IACF;AACE,WAAK,KAAK,IAAI,KAAK,QAAQ,QAAQ,QAAQ,OAAO;AAClD,WAAK,KAAK,IAAI,QAAQ,OAAO;AAAA,EACjC;AAEA,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,QAAQ,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,KAAK;AAAA,MACnD,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,aAAa;AAAA,MACb,IAAI,OAAO;AAAA,MACX,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd,UAAU,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,MAAM,KAAK,IAAI;AAAA,MACtD,UAAU;AAAA,MACV,YAAY,WAAW;AAAA,MACvB,YAAY;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAOA,SAAS,eACP,OACA,OACA,OACA,OACA,OAC8C;AAC9C,QAAM,EAAE,SAAS,YAAY,OAAO,QAAQ,IAAI;AAChD,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,WAAW;AACtB,QAAM,UAAU,WAAW;AAE3B,QAAM,OAAO,MAAM,gBAAgB,SAAS,IAAI,OAAO;AACvD,QAAM,OAAO,MAAM,gBAAgB,SAAS,IAAI,OAAO;AACvD,QAAMA,SAAQ,eAAe,KAAK;AAGlC,QAAM,QAAQ,KAAK;AAAA,IACjB,GAAGA,OAAM,IAAI,CAAC,MAAM,YAAY,EAAE,MAAM,EAAE,aAAa,UAAU,EAAE,EAAE,KAAK;AAAA,EAC5E;AACA,QAAM,OAAO,QAAQ,OAAO;AAC5B,QAAM,cAAc,UAAU;AAC9B,QAAM,OAAOA,OAAM,UAAU,IAAI,KAAK,OAAO,IAAI,MAAMA,OAAM,SAAS,KAAK,cAAc,OAAO;AAChG,QAAM,OAAO;AAGb,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,MAAM,eAAe,UAAU;AACjC,WAAO,QAAQ,QAAQ,IAAI,OAAO;AAClC,cAAU,QAAQ,QAAQ;AAC1B,aAAS;AAAA,EACX,WAAW,MAAM,eAAe,SAAS;AACvC,WAAO,QAAQ,QAAQ,OAAO;AAC9B,cAAU,OAAO,OAAO;AACxB,aAAS;AAAA,EACX,OAAO;AACL,WAAO,QAAQ;AACf,cAAU,OAAO;AACjB,aAAS;AAAA,EACX;AAGA,MAAI;AACJ,MAAI,MAAM,kBAAkB,aAAa;AACvC,aAAS,QAAQ,OAAO;AAAA,EAC1B,WAAW,MAAM,kBAAkB,SAAS;AAC1C,aAAS,QAAQ,OAAO,OAAO;AAAA,EACjC,OAAO;AACL,aAAS,QAAQ,OAAO;AAAA,EAC1B;AAEA,QAAM,WAA2B,CAAC;AAClC,MAAI,MAAM,gBAAgB,QAAQ;AAChC,UAAM,KAAK,MAAM,gBAAgB,SAAS,OAAO,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC;AACzE,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ,EAAE,GAAG,MAAM,GAAG,QAAQ,OAAO,MAAM,QAAQ,KAAK;AAAA,MACxD,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,aAAa;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,KAAK;AACrC,UAAM,OAAOA,OAAM,CAAC;AACpB,UAAM,SAAS,KAAK,aAAa,UAAU;AAC3C,UAAM,gBAAgB,SAAS,OAAO,KAAK,MAAM,IAAI;AACrD,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,KAAK;AAAA,MACd,UAAU,EAAE,GAAG,SAAS,GAAG,cAAc;AAAA,MACzC,UAAU;AAAA,MACV,YAAY,WAAW;AAAA,MACvB,YAAY,KAAK,aAAa,WAAW;AAAA,MACzC,MAAM,KAAK,aAAa,QAAQ,YAAY,QAAQ;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,WAAW,UAAU,QAAQ;AAC1C,QAAM,OAAO,WAAW,UAAU,QAAQ,OAAO,SAAS;AAC1D,QAAM,OAAO,KAAK,IAAI,OAAO,MAAM;AACnC,QAAM,OAAO,QAAQ,SAAS;AAC9B,SAAO,EAAE,UAAU,UAAU,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,MAAM,QAAQ,KAAK,EAAE;AAC/E;AAMO,SAAS,gBAAgBC,QAA8B,SAA+B;AAC3F,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,MAAM,CAAC,GAAW,MAAsB,GAAG,CAAC,IAAI,CAAC;AACvD,QAAM,OAAO,CAAC,GAAW,GAAW,IAAY,OAAqB;AACnE,aAAS,KAAK,GAAG,KAAK,IAAI,IAAI;AAC5B,eAAS,KAAK,GAAG,KAAK,IAAI,IAAI,KAAM,UAAS,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,EAChE;AACA,QAAM,OAAO,CAAC,GAAW,GAAW,IAAY,OAAwB;AACtE,QAAI,IAAI,KAAK,QAAS,QAAO;AAC7B,aAAS,KAAK,GAAG,KAAK,IAAI,IAAI;AAC5B,eAAS,KAAK,GAAG,KAAK,IAAI,IAAI,KAAM,KAAI,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,EAAG,QAAO;AAC5E,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,GACR,MAAM;AACR,SAAOA,OAAM,IAAI,CAAC,SAAS;AACzB,UAAM,KAAK,KAAK,IAAI,KAAK,WAAW,GAAG,OAAO;AAC9C,UAAM,KAAK,KAAK,WAAW;AAE3B,QAAI,KAAK,QAAQ,UAAa,KAAK,QAAQ,QAAW;AACpD,WAAK,KAAK,KAAK,KAAK,KAAK,IAAI,EAAE;AAC/B,aAAO;AAAA,IACT;AAEA,WAAO,CAAC,KAAK,KAAK,KAAK,IAAI,EAAE,GAAG;AAC9B;AACA,UAAI,OAAO,SAAS;AAClB,cAAM;AACN;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,EAAE,GAAG,MAAM,KAAK,IAAI;AACrC,SAAK,KAAK,KAAK,IAAI,EAAE;AACrB,WAAO;AACP,QAAI,OAAO,SAAS;AAClB,YAAM;AACN;AAAA,IACF;AACA,WAAO;AAAA,EACT,CAAC;AACH;AAGA,SAAS,YAAY,OAAiB,OAAe,KAAa,KAAqB;AACrF,MAAI,QAAQ;AACZ,WAAS,IAAI,OAAO,IAAI,KAAK,IAAK,WAAU,MAAM,CAAC,KAAK,KAAK;AAC7D,SAAO;AACT;AAOA,SAAS,wBAAwB,KAAa,KAAqB;AACjE,MAAI,OAAO;AACX,MAAI,IAAI;AACR,KAAG;AACD,WAAO,OAAO,aAAa,KAAM,IAAI,EAAG,IAAI;AAC5C,QAAI,KAAK,MAAM,IAAI,EAAE,IAAI;AAAA,EAC3B,SAAS,KAAK;AACd,SAAO,GAAG,IAAI,GAAG,MAAM,CAAC;AAC1B;;;ACr8BE,IAAM,QAAQ,CAAC;AACf,IAAM,QAAQ,CAAC;AACf,IAAI,cAAc;AAElB,SAASC,SAAQ,MAAM;AACrB,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,YAAY,EAAE,QAAQ,eAAe,GAAG,EAAE,QAAQ,UAAU,EAAE,KAAK;AACjF;AAEA,SAAS,QAAQ,YAAY,OAAO,MAAM,YAAY,MAAM,OAAO;AACjE;AACA,QAAM,KAAK,cAAcA,SAAQ,KAAK,KAAK,QAAQ,WAAW;AAC9D,QAAM,KAAK,EAAE,IAAI,YAAY,cAAc,QAAW,OAAO,SAAS,QAAW,MAAM,YAAY,WAAW,KAAK,GAAG,MAAM,OAAO,SAAS,OAAU,CAAC;AACzJ;AAEA,SAAS,QAAQ,MAAM,OAAO,IAAI,OAAO,OAAO;AAC9C,QAAM,KAAK,EAAE,MAAM,GAAG,OAAO,IAAI,OAAO,SAAS,QAAW,GAAI,QAAQ,QAAQ,CAAC,EAAG,CAAC;AACvF;AAEA,SAASC,SAAQ;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,gBAAc;AAChB;AAEF,SAASC,cAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,iBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,iBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,cAAaC,kBAAiB,KAAK;AAEnC,SAASC,YAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,iBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,YAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,YAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,YAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,iBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,WAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,UAAU,KAAK;AACnD,MAAI,SAAS,uBAAuB,WAAW,KAAK;AACpD,MAAI,SAAS,uBAAuB,QAAQ,KAAK;AACjD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,uBAAuB,SAAS,KAAK;AAClD,MAAI,SAAS,uBAAuB,iBAAiB,KAAK;AAC1D,MAAI,SAAS,uBAAuB,iBAAiB,KAAK;AAC1D,MAAI,SAAS,uBAAuB,QAAQ,KAAK;AACjD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,cAAc,KAAK;AACxD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,uBAAuB,cAAc,KAAK;AACxD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK;AACrE,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC9E,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO,KAAK;AAC/F,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAG,GAAG,OAAO,KAAK;AAC3D,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAC5D,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,qBAAqB,CAAC,MAAM,IAAI,GAAG,OAAO,KAAK;AAE7D,MAAI,SAAS,SAAS,aAAa,QAAQ,YAAY,MAAM;AACzD,UAAM,WAAW,WAAW,KAAK,OAAK,EAAE,QAAQ,SAAS,KAAK,CAAC,GAAG,SAAS;AAC3E,UAAM,gBAAgB,WAAW,KAAK,OAAK,EAAE,QAAQ,MAAM;AAC3D,UAAM,eAAe,WAAW,KAAK,OAAK,EAAE,QAAQ,KAAK;AACzD,UAAM,iBAAiB,WAAW,KAAK,OAAK,EAAE,QAAQ,WAAW,EAAE,QAAQ,mBAAmB,EAAE,QAAQ,eAAe;AACvH,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,EAAE,GAAI,eAAe,CAAC,GAAI,OAAO,OAAO,SAAS,OAAU;AAAA,MACrE,MAAM;AAAA,QACJ,SAAS,SAAS,SAAS,EAAE;AAAA,QAC7B,GAAI,gBAAgB,EAAE,MAAM,SAAS,cAAc,OAAO,EAAE,EAAE,IAAI,CAAC;AAAA,QACnE,GAAI,eAAe,EAAE,KAAK,WAAW,aAAa,KAAK,EAAE,IAAI,CAAC;AAAA,QAC9D,GAAI,iBAAiB,EAAE,OAAO,eAAe,MAAM,IAAI,CAAC;AAAA,MAC1D;AAAA,MACA;AAAA,MACA,GAAI,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IACtC;AAAA,EACF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AACd,eAAW,QAAQA,QAAO;AACxB,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAChD,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACF,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,EAAE,OAAO,QAAQ,MAAM,CAAC,IAAI,KAAK;AAAA,EAAG;AAC1E,MAAI,SAAS,SAAS,KAAK,OAAO;AAAE,WAAO,EAAE,KAAK,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AACzE,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,MAAM,OAAO,OAAO;AAAA,EAAG;AAC7D,MAAI,SAAS,SAAS,KAAK,MAAM,MAAM;AAAE,WAAO;AAAA,EAAM;AACtD,MAAI,SAAS,SAAS,KAAK,MAAM,cAAc,GAAG;AAAE,WAAO;AAAA,EAAG;AAC9D,MAAI,SAAS,SAAS,KAAK,MAAM,cAAc,OAAO,SAAS;AAC3D,YAAQ,IAAI,IAAI,IAAI,OAAO,gBAAgB,MAAM,SAAS,QAAQ,QAAW,SAAS,MAAS;AAC/F,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACF,MAAI,SAAS,SAAS,IAAI,OAAO;AAAE,WAAO,EAAE,IAAI,MAAM;AAAA,EAAG;AACzD,MAAI,UAAU,SAAS,IAAI;AAAE,WAAO,EAAE,IAAI,OAAO,KAAK;AAAA,EAAG;AACzD,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,EAAE,IAAI,MAAM,MAAM;AAAA,EAAG;AAC5D,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,IAAI,MAAM,OAAO,KAAK;AAAA,EAAG;AAC7D,MAAI,UAAU,SAAS,MAAM,MAAM;AAAE,WAAO,EAAE,SAAS,MAAM,SAAS,KAAK;AAAA,EAAG;AAC9E,MAAI,UAAU,SAAS,MAAM;AAAE,WAAO,EAAE,SAAS,MAAM,SAAS,EAAI;AAAA,EAAG;AACvE,MAAI,UAAU,SAAS,MAAM,OAAO,IAAI,SAAS,OAAO,UAAUC,QAAO;AAErE,UAAM,SAAS,CAAC;AAChB,QAAIA,QAAO;AACT,YAAM,IAAIA,OAAM,CAAC;AACjB,UAAI,EAAE,OAAO;AAAE,eAAO,UAAU,EAAE;AAAO,eAAO,EAAE;AAAA,MAAO;AACzD,UAAI,EAAE,MAAO;AAAE,eAAO,YAAY,EAAE;AAAO,eAAO,EAAE;AAAA,MAAO;AAC3D,UAAI,EAAE,YAAY;AAAE,eAAO,aAAa,EAAE;AAAY,eAAO,EAAE;AAAA,MAAY;AAC3E,UAAI,EAAE,OAAY;AAAE,eAAO,aAAa,EAAE;AAAY,eAAO,EAAE;AAAA,MAAY;AAC3E,UAAI,OAAO,KAAK,CAAC,EAAE,SAAS,EAAG,QAAO,QAAQ;AAAA,IAChD;AAEA,UAAM,UAAU,CAAC,GAAG,SAAS,GAAG,QAAQ;AACxC,eAAW,OAAO,SAAS;AACzB,aAAO,OAAO,QAAQ,IAAI,CAAC,CAAC;AAAA,IAC9B;AACA,YAAQ,MAAM,OAAO,IAAI,QAAQ,MAAM,CAAC,IAAI,MAAM,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS,IAAI;AAChG,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AACF,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,EAAE,WAAW,MAAM;AAAA,EAAG;AAC7D,MAAI,UAAU,SAAS,OAAO,OAAO;AACjC,WAAO,EAAE,SAAS,OAAO,GAAI,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAG;AAAA,EACtD;AACF,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO;AAAA,EAAO;AAC9C,MAAI,UAAU,SAAS,OAAO,OAAO;AACjC,WAAO,EAAE,SAAS,OAAO,GAAI,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAG;AAAA,EACtD;AACF,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO;AAAA,EAAO;AAC9C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAY;AAC9C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAc;AAChD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAU;AAC5C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAY;AAC9C,MAAI,UAAU,SAAS,MAAM,OAAO;AAAE,WAAO,EAAE,UAAU,MAAM,WAAW,MAAM;AAAA,EAAG;AACnF,MAAI,UAAU,SAAS,MAAM;AAAE,WAAO,EAAE,UAAU,KAAK;AAAA,EAAG;AAC1D,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,SAAS,OAAO,MAAM;AAChC,UAAM,SAAS,CAAC;AAChB,WAAO,MAAM,GAAG,IAAI,MAAM;AAC1B,eAAW,KAAK,MAAM;AAAE,aAAO,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE;AAAA,IAAO;AACvD,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,KAAK,OAAO;AAAE,WAAO,EAAE,KAAK,MAAM;AAAA,EAAG;AAC5D,MAAI,UAAU,SAAS,KAAK;AAAE,WAAO,WAAW,GAAG;AAAA,EAAG;AACtD,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,iBAAiB,OAAO,OAAS;AAAA,EAAG;AACnF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,iBAAiB,OAAO,SAAS;AAAA,EAAG;AACnF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,iBAAiB,OAAO,SAAS;AAAA,EAAG;AACnF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,iBAAiB,OAAO,QAAS;AAAA,EAAG;AACnF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,iBAAiB,OAAO,QAAS;AAAA,EAAG;AACnF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,YAAY,OAAO,OAAS;AAAA,EAAG;AAC9E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,YAAY,OAAO,SAAS;AAAA,EAAG;AAC9E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,YAAY,OAAO,SAAS;AAAA,EAAG;AAC9E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,YAAY,OAAO,SAAS;AAAA,EAAG;AAC9E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,YAAY,OAAO,QAAS;AAAA,EAAG;AAC9E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,YAAY,OAAO,QAAS;AAAA,EAAG;AAC9E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,YAAY,OAAO,QAAS;AAAA,EAAG;AAC9E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,YAAY,OAAO,QAAS;AAAA,EAAG;AAC9E,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,cAAc,OAAO,OAAS;AAAA,EAAG;AAChF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,cAAc,OAAO,SAAS;AAAA,EAAG;AAChF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,cAAc,OAAO,SAAS;AAAA,EAAG;AAChF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,cAAc,OAAO,QAAS;AAAA,EAAG;AAChF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,WAAW,cAAc,OAAO,QAAS;AAAA,EAAG;AAChF,MAAI,UAAU,SAAS,MAAM,OAAO;AAAE,WAAO,EAAE,UAAU,CAAC,IAAI,GAAG,QAAQ,IAAI,cAAc,MAAM;AAAA,EAAG;AACpG,MAAI,UAAU,SAAS,MAAM,MAAM;AAAE,WAAO,EAAE,UAAU,CAAC,IAAI,GAAG,QAAQ,KAAK;AAAA,EAAG;AAChF,MAAI,UAAU,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC5C,MAAI,UAAU,SAASD,QAAO;AAAE,WAAOA,OAAM,KAAK,IAAI;AAAA,EAAG;AACzD,MAAI,UAAU,SAASE,OAAM;AAAE,WAAOA;AAAA,EAAM;AAC5C,MAAI,UAAU,SAAS,QAAQ;AAAE,WAAO,SAAS,QAAQ,EAAE;AAAA,EAAG;AAC9D,MAAI,UAAU,SAAS,MAAM,QAAQ;AAAE,WAAO,UAAU,QAAQ,MAAM,QAAQ,EAAE;AAAA,EAAG;AACnF,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBD,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQE,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASP,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASM,WAAU;AAC/C,WAAO,IAAIR,iBAAgB,SAAS,MAAM,MAAMQ,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBN,WAAU,OAAOM,WAAU;AAC3D,WAAO,IAAIR;AAAA,MACTA,iBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAM;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,sBAAsB;AAC3B,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,CAAC;AACN,WAAK,uBAAuB;AAC5B,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,uBAAuB;AAAA,MAC9B;AACA,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,WAAK,WAAW;AAChB,qBAAe;AACf,WAAK,OAAO,IAAI,IAAI,IAAI,EAAE;AAAA,IAC5B,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,sBAAsB;AAC3B,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,WAAW;AAChB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,EAAE,MAAM,QAAQ;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,EAAE,MAAM,QAAQ;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AACA,mBAAe;AACf,SAAK,OAAO,EAAE;AACd,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;AAE3D,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,qBAAqB;AAC1B,UAAI,OAAO,YAAY;AACrB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,oBAAoB;AACzB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,UACxB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,kBAAM,oBAAoB;AAC1B,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,OAAO,IAAI,IAAI,IAAI,GAAG;AAAA,YAC7B,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK,WAAW;AAChB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,qBAAqB;AAC1B,gBAAM,WAAW;AACjB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,kBAAM;AACN,2BAAe;AAAA,UACjB,OAAO;AACL,kBAAM;AACN,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,QAAQ,YAAY;AACtB,kBAAM,WAAW;AACjB,kBAAM,YAAY;AAClB,gBAAI,QAAQ,YAAY;AACtB,oBAAM;AAAA,YACR;AACA,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,UAChC,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,sBAAsB;AAC3B,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,sBAAsB;AAC3B,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,EAAE;AAAA,UACjB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK;AACL,yBAAe;AACf,eAAK,QAAQ;AACb,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,oBAAM;AACN;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,QAAQ,IAAI,EAAE;AAAA,YACrB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,EAAE;AAAA,UACjB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK;AAErE,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,eAAe;AACpB,gBAAI,OAAO,YAAY;AACrB,mBAAK,YAAY;AACjB,kBAAI,OAAO,YAAY;AACrB,qBAAK,iBAAiB;AACtB,oBAAI,OAAO,YAAY;AACrB,uBAAK,CAAC;AACN,wBAAM;AACN,wBAAM,WAAW;AACjB,sBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,0BAAM;AACN;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM,oBAAoB;AAC1B,wBAAI,QAAQ,YAAY;AACtB,4BAAM,CAAC,KAAK,KAAK,GAAG;AACpB,4BAAM;AAAA,oBACR,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AACA,yBAAO,QAAQ,YAAY;AACzB,uBAAG,KAAK,GAAG;AACX,0BAAM;AACN,0BAAM,WAAW;AACjB,wBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,4BAAM;AACN;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,4BAAM,oBAAoB;AAC1B,0BAAI,QAAQ,YAAY;AACtB,8BAAM,CAAC,KAAK,KAAK,GAAG;AACpB,8BAAM;AAAA,sBACR,OAAO;AACL,sCAAc;AACd,8BAAM;AAAA,sBACR;AAAA,oBACF,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AAAA,kBACF;AACA,wBAAM;AACN,wBAAM,WAAW;AACjB,wBAAM,sBAAsB;AAC5B,sBAAI,QAAQ,YAAY;AACtB,0BAAM,CAAC,KAAK,GAAG;AACf,0BAAM;AAAA,kBACR,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AAAA,kBACR;AACA,wBAAM,CAAC;AACP,wBAAM;AACN,wBAAM,WAAW;AACjB,sBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,0BAAM;AACN;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM,oBAAoB;AAC1B,wBAAI,QAAQ,YAAY;AACtB,4BAAM,CAAC,KAAK,KAAK,GAAG;AACpB,4BAAM;AAAA,oBACR,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AACA,yBAAO,QAAQ,YAAY;AACzB,wBAAI,KAAK,GAAG;AACZ,0BAAM;AACN,0BAAM,WAAW;AACjB,wBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,4BAAM;AACN;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,4BAAM,oBAAoB;AAC1B,0BAAI,QAAQ,YAAY;AACtB,8BAAM,CAAC,KAAK,KAAK,GAAG;AACpB,8BAAM;AAAA,sBACR,OAAO;AACL,sCAAc;AACd,8BAAM;AAAA,sBACR;AAAA,oBACF,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AAAA,kBACF;AACA,wBAAM;AACN,wBAAM,WAAW;AACjB,wBAAM,mBAAmB;AACzB,sBAAI,QAAQ,YAAY;AACtB,0BAAM,CAAC,KAAK,GAAG;AACf,0BAAM;AAAA,kBACR,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AAAA,kBACR;AACA,wBAAM,WAAW;AACjB,wBAAM,YAAY;AAClB,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AACN;AACA,wBAAI,MAAM,SAAS,aAAa;AAC9B,4BAAM,MAAM,OAAO,WAAW;AAC9B;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA;AACA,wBAAI,QAAQ,YAAY;AACtB,4BAAM;AAAA,oBACR,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AAAA,kBACF;AACA,sBAAI,QAAQ,YAAY;AACtB,mCAAe;AACf,yBAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AAAA,kBAC5C,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,kBAAkB;AACvB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,uBAAe;AACf,aAAK,QAAQ,IAAI,EAAE;AAAA,MACrB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB;AACA,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,wBAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,2BAAK;AACL,qCAAe;AAAA,oBACjB,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,0BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,6BAAK;AACL,uCAAe;AAAA,sBACjB,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,2BAA2B;AAClC,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB;AACA,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ;AAAA,MACf;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ;AAAA,QACf;AACA,aAAK;AACL,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ;AAAA,UACf;AACA,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,cAAc;AACnB,QAAI,OAAO,YAAY;AACrB,WAAK,cAAc;AACnB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,IAAI,EAAE;AAAA,MACrB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,cAAc;AACnB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB;AACA,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI,IAAI;AAER,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,mBAAmB;AACxB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,mBAAmB;AACxB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,oBAAoB;AACzB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,mBAAmB;AACxB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK,sBAAsB;AAC3B,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AAAA,MAC3B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ;AAAA,MACf;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ;AAAA,QACf;AACA,aAAK;AACL,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ;AAAA,UACf;AACA,eAAK;AACL,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ;AAAA,YACf;AACA,iBAAK;AACL,gBAAI,OAAO,YAAY;AACrB,mBAAK;AACL,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,QAAQ;AAAA,cACf;AACA,mBAAK;AACL,kBAAI,OAAO,YAAY;AACrB,qBAAK;AACL,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,iCAAe;AACf,uBAAK,QAAQ;AAAA,gBACf;AACA,qBAAK;AACL,oBAAI,OAAO,YAAY;AACrB,uBAAK;AACL,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,mCAAe;AACf,yBAAK,QAAQ;AAAA,kBACf;AACA,uBAAK;AACL,sBAAI,OAAO,YAAY;AACrB,yBAAK;AACL,wBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,2BAAK;AACL,qCAAe;AAAA,oBACjB,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,qCAAe;AACf,2BAAK,QAAQ;AAAA,oBACf;AACA,yBAAK;AACL,wBAAI,OAAO,YAAY;AACrB,2BAAK;AACL,0BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,6BAAK;AACL,uCAAe;AAAA,sBACjB,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,0BAAI,OAAO,YAAY;AACrB,uCAAe;AACf,6BAAK,QAAQ;AAAA,sBACf;AACA,2BAAK;AACL,0BAAI,OAAO,YAAY;AACrB,6BAAK;AACL,4BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,+BAAK;AACL,yCAAe;AAAA,wBACjB,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AACA,4BAAI,OAAO,YAAY;AACrB,yCAAe;AACf,+BAAK,QAAQ;AAAA,wBACf;AACA,6BAAK;AACL,4BAAI,OAAO,YAAY;AACrB,+BAAK;AACL,8BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iCAAK;AACL,2CAAe;AAAA,0BACjB,OAAO;AACL,iCAAK;AACL,gCAAI,oBAAoB,GAAG;AAAE,uCAAS,OAAO;AAAA,4BAAG;AAAA,0BAClD;AACA,8BAAI,OAAO,YAAY;AACrB,2CAAe;AACf,iCAAK,QAAQ;AAAA,0BACf;AACA,+BAAK;AACL,8BAAI,OAAO,YAAY;AACrB,iCAAK;AACL,gCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mCAAK;AACL,6CAAe;AAAA,4BACjB,OAAO;AACL,mCAAK;AACL,kCAAI,oBAAoB,GAAG;AAAE,yCAAS,OAAO;AAAA,8BAAG;AAAA,4BAClD;AACA,gCAAI,OAAO,YAAY;AACrB,6CAAe;AACf,mCAAK,QAAQ;AAAA,4BACf;AACA,iCAAK;AACL,gCAAI,OAAO,YAAY;AACrB,mCAAK;AACL,kCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qCAAK;AACL,+CAAe;AAAA,8BACjB,OAAO;AACL,qCAAK;AACL,oCAAI,oBAAoB,GAAG;AAAE,2CAAS,OAAO;AAAA,gCAAG;AAAA,8BAClD;AACA,kCAAI,OAAO,YAAY;AACrB,+CAAe;AACf,qCAAK,QAAQ;AAAA,8BACf;AACA,mCAAK;AACL,kCAAI,OAAO,YAAY;AACrB,qCAAK;AACL,oCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uCAAK;AACL,iDAAe;AAAA,gCACjB,OAAO;AACL,uCAAK;AACL,sCAAI,oBAAoB,GAAG;AAAE,6CAAS,OAAO;AAAA,kCAAG;AAAA,gCAClD;AACA,oCAAI,OAAO,YAAY;AACrB,iDAAe;AACf,uCAAK,QAAQ;AAAA,gCACf;AACA,qCAAK;AACL,oCAAI,OAAO,YAAY;AACrB,uCAAK;AACL,sCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yCAAK;AACL,mDAAe;AAAA,kCACjB,OAAO;AACL,yCAAK;AACL,wCAAI,oBAAoB,GAAG;AAAE,+CAAS,OAAO;AAAA,oCAAG;AAAA,kCAClD;AACA,sCAAI,OAAO,YAAY;AACrB,mDAAe;AACf,yCAAK,QAAQ;AAAA,kCACf;AACA,uCAAK;AACL,sCAAI,OAAO,YAAY;AACrB,yCAAK;AACL,wCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,2CAAK;AACL,qDAAe;AAAA,oCACjB,OAAO;AACL,2CAAK;AACL,0CAAI,oBAAoB,GAAG;AAAE,iDAAS,OAAO;AAAA,sCAAG;AAAA,oCAClD;AACA,wCAAI,OAAO,YAAY;AACrB,qDAAe;AACf,2CAAK,QAAQ;AAAA,oCACf;AACA,yCAAK;AACL,wCAAI,OAAO,YAAY;AACrB,2CAAK;AACL,0CAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,6CAAK;AACL,uDAAe;AAAA,sCACjB,OAAO;AACL,6CAAK;AACL,4CAAI,oBAAoB,GAAG;AAAE,mDAAS,MAAM;AAAA,wCAAG;AAAA,sCACjD;AACA,0CAAI,OAAO,YAAY;AACrB,uDAAe;AACf,6CAAK,QAAQ;AAAA,sCACf;AACA,2CAAK;AAAA,oCACP;AAAA,kCACF;AAAA,gCACF;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,oBAAoB;AACzB,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,uBAAuB;AAC5B,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,IAAI,EAAE;AAAA,UACrB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,oBAAoB;AACzB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,IAAI,EAAE;AAAA,UACrB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,SAAK,CAAC;AACN,SAAK;AACL,SAAK;AACL;AACA,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL;AACA,YAAI,MAAM,SAAS,aAAa;AAC9B,eAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK;AACL,WAAK;AACL;AACA,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK;AACL;AACA,cAAI,MAAM,SAAS,aAAa;AAC9B,iBAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AACA,aAAK,MAAM,UAAU,IAAI,WAAW;AACpC,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AACA,mBAAe;AACf,SAAK,QAAQ,EAAE;AACf,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAGA,EAAAV,OAAM;AAEN,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACt3FO,IAAM,SAAwC;AAAA,EACnD,aAAa,OAA+B;AAC1C,UAAM,MAAaY,WAAM,KAAK;AAC9B,UAAMC,SAAQ,IAAI,MAAM,IAAI,CAAC,MAAW;AACtC,YAAM,EAAE,YAAY,SAAS,MAAM,IAAI,uBAAuB,EAAE,UAAoB;AACpF,YAAM,UAAU,UAAU,EAAE,GAAG,GAAG,WAAW,CAAC;AAC9C,aAAO;AAAA,QACL,IAAI,EAAE;AAAA,QACN,OAAO,EAAE;AAAA,QACT;AAAA,QACA,SAAS,EAAE,MAAM;AAAA,QACjB,SAAS,EAAE,MAAM;AAAA,QACjB,OAAO,EAAE;AAAA,QACT,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC7B,GAAI,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,MACtC;AAAA,IACF,CAAC;AAED,UAAM,gBAA6B,IAAI,SAAS,CAAC;AAEjD,UAAM,WAAW,CAAC,GAAG,aAAa;AAElC,WAAO;AAAA,MACL,SAAS,IAAI,WAAW;AAAA,MACxB,UAAU,EAAE,GAAG,IAAI,SAAS;AAAA,MAC5B,MAAM,IAAI;AAAA,MACV,OAAAA;AAAA,MACA,GAAI,SAAS,SAAS,IAAI,EAAE,OAAO,SAAS,IAAI,CAAC;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,UAAU,OAA+B;AACvC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAoB,OAAsB,SAAuC;AACtF,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACF;AAEA,IAAM,kBAAwD;AAAA,EAC5D,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,SAAS;AAAA,EACT,KAAK;AAAA,EACL,UAAU;AAAA,EACV,aAAa;AAAA,EACb,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,cAAc;AAAA,EACd,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,aAAa;AACf;AAEA,SAAS,qBAAqB,SAA0C;AACtE,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,IAAI,QAAQ,KAAK;AACvB,QAAM,QAAQ,EAAE,YAAY;AAG5B,MAAI,UAAU,KAAoB,EAAG,QAAO;AAG5C,QAAM,UAAU,aAAa,CAAC,KAAK,aAAa,KAAK;AACrD,MAAI,WAAW,UAAU,OAAO,EAAG,QAAO;AAG1C,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI,MAAM,WAAW,QAAQ,EAAG,QAAO;AACvC,MAAI,MAAM,WAAW,MAAM,EAAG,QAAO;AACrC,MAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AACpC,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI,MAAM,WAAW,IAAI,EAAG,QAAO;AACnC,MAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AACpC,MAAI,MAAM,WAAW,UAAU,EAAG,QAAO;AACzC,MAAI,MAAM,WAAW,MAAM,EAAG,QAAO;AACrC,MAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AACpC,MAAI,MAAM,WAAW,QAAQ,EAAG,QAAO;AACvC,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI,MAAM,WAAW,SAAS,EAAG,QAAO;AACxC,MAAI,MAAM,WAAW,MAAM,EAAG,QAAO;AACrC,MAAI,MAAM,WAAW,MAAM,EAAG,QAAO;AACrC,MAAI,MAAM,WAAW,OAAO,KAAK,UAAU,SAAU,QAAO;AAC5D,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI,MAAM,WAAW,QAAQ,EAAG,QAAO;AACvC,MAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AACpC,MAAI,MAAM,WAAW,UAAU,EAAG,QAAO;AACzC,MAAI,MAAM,WAAW,OAAO,EAAG,QAAO;AACtC,MAAI,MAAM,WAAW,KAAK,KAAK,MAAM,WAAW,OAAO,EAAG,QAAO;AACjE,MAAI,MAAM,WAAW,KAAK,EAAG,QAAO;AAEpC,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAmB,YAA4B;AAC1E,QAAM,UAAU,WAAW,UAAU;AACrC,MAAI,CAAC,QAAS,QAAO;AAGrB,QAAM,WAAW,aAAa,OAAO;AACrC,MAAI,aAAa,KAAM,QAAO;AAE9B,QAAM,gBAAgB,gBAAgB,IAAI;AAC1C,MAAI,eAAe;AACjB,WAAO,gBAAgB;AAAA,EACzB;AAGA,MAAI,CAAC,QAAQ,WAAW,IAAI,GAAG;AAC7B,WAAO,GAAG,IAAI,IAAI,UAAU;AAAA,EAC9B;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,KAAyC;AAC1D,QAAM,OAAkC,IAAI;AAC5C,QAAM,eAAe,cAAc,IAAI,UAAU;AACjD,MAAI,WAAW,QAAQ,gBAAgB,IAAI,KAAK;AAGhD,OAAK,CAAC,WAAW,YAAY,WAAW,CAAC,QAAQ,IAAI,YAAY;AAC/D,UAAM,SAAS,qBAAqB,IAAI,UAAU;AAClD,QAAI,QAAQ;AACV,gBAAU;AAAA,IACZ;AAAA,EACF;AAGA,MAAI,YAAY,QAAQ;AACtB,UAAM,CAAC,OAAO,KAAK,IAAI,IAAI,WAAW,MAAM,GAAG,EAAE,IAAI,CAAC,MAAc,EAAE,KAAK,CAAC;AAC5E,WAAO,EAAE,MAAM,QAAQ,OAAO,SAAS,IAAI,MAAM;AAAA,EACnD;AACA,MAAI,YAAY,QAAQ;AACtB,WAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,WAAW,KAAK,EAAE;AAAA,EACrD;AAGA,QAAM,cAAc,qBAAqB,OAAO;AAEhD,QAAMC,UAAS,cAAc,UAAU,WAAW,IAAI;AACtD,MAAI,CAACA,WAAU,CAAC,aAAa;AAE3B,WAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,WAAW,KAAK,EAAE;AAAA,EACrD;AAGA,QAAM,kBAAkB,oBAAoB,aAAa,IAAI,UAAU;AAGvE,QAAM,UAAU,gBAAgB,SAAS,IAAI,IAAI,kBAAkB,kBAAkB;AACrF,SAAO,EAAE,MAAM,WAAW,aAAa,KAAKA,QAAO,aAAa,OAAO,EAAE;AAC3E;AAEA,SAAS,cAAc,YAAmC;AACxD,QAAM,UAAU,WAAW,UAAU;AACrC,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO;AAE5B,QAAM,cAAc,aAAa,OAAO;AACxC,MAAI,YAAa,QAAO;AAExB,MAAI,QAAQ,SAAS,GAAG,EAAG,QAAO;AAClC,SAAO;AACT;AAIA,IAAM,aAAa;AACnB,IAAM,UACJ;AAMF,SAAS,uBAAuB,YAI9B;AACA,QAAM,aAAa,WAAW,MAAM,IAAI;AACxC,QAAM,WAAqB,CAAC;AAC5B,MAAI;AACJ,QAAM,QAAsB,CAAC;AAE7B,aAAW,QAAQ,YAAY;AAC7B,UAAM,KAAK,KAAK,MAAM,UAAU;AAChC,QAAI,IAAI;AACN,gBAAU,GAAG,CAAC;AACd;AAAA,IACF;AACA,UAAM,KAAK,KAAK,MAAM,OAAO;AAC7B,QAAI,IAAI;AACN,YAAM,KAAK,EAAE,MAAM,GAAG,CAAC,GAAI,GAAI,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,CAAC,EAAkB,IAAI,CAAC,EAAG,CAAC;AAClF;AAAA,IACF;AACA,aAAS,KAAK,IAAI;AAAA,EACpB;AAEA,SAAO,EAAE,YAAY,SAAS,KAAK,IAAI,GAAG,SAAS,MAAM;AAC3D;;;ACzOO,SAAS,UAAU,IAAiB,OAAoC;AAC7E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,SAAS,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACnE,QAAM,SAAS,GAAG;AAClB,QAAM,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC,KAAK;AAEzD,QAAM,IAAI;AACV,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,SAAS,SAAS;AAG7B,QAAM,aAAa,WAAW;AAC9B,QAAM,eAAe,OAAO,IAAI,CAAC,MAAO,GAAG,WAAW,GAAG,EAAE,KAAK,KAAK,EAAE,KAAK,MAAM,EAAE,KAAM;AAC1F,QAAM,cAAc,aAAa;AAAA,IAC/B,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,YAAY,GAAG,UAAU,EAAE,KAAK;AAAA,IACtD;AAAA,EACF;AACA,QAAM,SAAS;AACf,QAAM,YAAY;AAClB,QAAM,UAAU,KAAK,IAAI;AACzB,QAAM,OAAO;AACb,QAAM,YAAY,KAAM,OAAO,SAAS,OAAQ;AAEhD,QAAM,WAA2B,CAAC;AAGlC,MAAI,GAAG,SAAS,OAAO;AACrB,UAAM,YAAY,UAAU,cAAc,SAAS,YAAY;AAC/D,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ,OAAO,YAAY,CAAC;AAAA,QACpB,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,MAAI,KAAK,CAAC,KAAK,KAAK;AACpB,SAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,UAAM,OAAO,EAAE,QAAQ;AACvB,UAAM,KAAK,KAAK,OAAO,KAAK,KAAK;AACjC,UAAM,QAAQ,eAAe,GAAG,KAAK;AAErC,QAAI,OAAO,WAAW,GAAG;AACvB,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,YAAY,CAAC,CAAC;AAAA,IAC3E,OAAO;AACL,YAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,CAAC,GAClC,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,CAAC;AAChC,YAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,CAAC,GAClC,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,CAAC;AAChC,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,YAAM,IAAI,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE;AACpF,eAAS,KAAK,EAAE,KAAK,GAAG,QAAQ,YAAY,GAAG,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,IACjE;AAGA,UAAM,MAAM,OAAO;AACnB,QAAI,OAAO,GAAG;AACZ,YAAM,MAAM,KAAK,MAAM;AACvB,YAAM,KAAK,IAAI;AACf,eAAS;AAAA,QACP,EAAE;AAAA,UACA,GAAG,IAAI,QAAQ,CAAC,CAAC;AAAA,UACjB,IAAI,KAAK,KAAK,KAAK,IAAI,EAAE,CAAC;AAAA,UAC1B,IAAI,KAAK,KAAK,KAAK,IAAI,EAAE,IAAI,WAAW,gBAAgB,IAAI;AAAA,UAC5D,WAAW;AAAA,UACX,aAAa,OAAO,KAAK;AAAA,UACzB,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AACA,SAAK;AAAA,EACP,CAAC;AAGD,SAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,UAAM,KAAK,YAAY,IAAI;AAC3B,UAAM,cAAc,eAAe,GAAG,KAAK;AAC3C,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,SAAS,GAAG,IAAI,OAAO,QAAQ,QAAQ,OAAO;AAAA,QACnD;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,aAAa,CAAC;AAAA,QACd,UAAU,SAAS;AAAA,QACnB,KAAK,SAAS;AAAA,QACd;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAAS,OAAO,UAAU,cAAc,SAAS,YAAY,MAAM;AACzE,QAAM,SAAS,OAAO,KAAK,IAAI,KAAK,GAAG,YAAY,OAAO,SAAS,IAAI,IAAI,MAAM;AAEjF,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACnIA,SAASC,cAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,iBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,iBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,cAAaC,kBAAiB,KAAK;AAEnC,SAASC,YAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,iBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,YAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,YAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,YAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,iBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,WAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,OAAO,IAAI;AAC/C,MAAI,SAAS,uBAAuB,YAAY,IAAI;AACpD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,KAAM,KAAK;AAC/C,MAAI,SAAS,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACrD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,MAAM,MAAM;AAClC,UAAM,SAAS,KAAK,OAAO,OAAO;AAClC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC,EAAG;AAAA,MACxE;AAAA,MACA,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,IAC5C;AAAA,EACF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,IAAI,GAAG;AAAE,WAAO;AAAA,EAAG;AACzC,MAAI,SAAS,SAAS,IAAI,GAAG;AACzB,WAAO,EAAE,UAAU,CAAC,CAAC,IAAI,OAAO,IAAI,EAAE,KAAK,IAAI,KAAK;AAAA,EACtD;AACF,MAAI,SAAS,SAAS,OAAO,OAAO;AAAE,WAAO,EAAE,OAAO,MAAM;AAAA,EAAG;AAC/D,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACrC,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,WAAW,CAAC;AAAA,EAAG;AACjD,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,iBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,iBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,gBAAgB;AACrB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,aAAa;AAClB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,aAAa;AAAA,MACpB;AACA,WAAK,WAAW;AAChB,qBAAe;AACf,WAAK,OAAO,IAAI,IAAI,EAAE;AAAA,IACxB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,gBAAgB;AACrB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,aAAa;AAClB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK;AACL,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC,IAAI,IAAI,EAAE;AAChB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO,EAAE;AAAA,IAChB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AC1iCO,IAAM,MAAkC;AAAA,EAC7C,aAAa,OAA4B;AACvC,WAAcG,WAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA4B;AACpC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAiB,OAAoC;AAC1D,WAAO,UAAU,IAAI,KAAK;AAAA,EAC5B;AACF;;;ACFA,SAAS,UAAU,KAAa,KAAuB;AACrD,QAAM,OAAO,MAAM,OAAO;AAC1B,QAAM,UAAU,OAAO;AACvB,QAAM,MAAM,KAAK,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,OAAO,CAAC,CAAC;AACxD,QAAM,OAAO,UAAU;AACvB,QAAM,QAAQ,QAAQ,IAAI,IAAI,QAAQ,IAAI,IAAI,KAAK;AACnD,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,MAAM,KAAK,MAAM,MAAM,KAAK;AAC/D,UAAM,KAAK,KAAK,MAAM,IAAI,GAAG,IAAI,GAAG;AACtC,SAAO;AACT;AAEA,SAAS,QAAQ,GAAmB;AAClC,MAAI,KAAK,IAAI,CAAC,KAAK,IAAM,QAAO,GAAG,IAAI,GAAI;AAC3C,SAAO,OAAO,CAAC;AACjB;AAEO,SAAS,cAAc,IAAqB,OAAoC;AACrF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,OAAO,GAAG;AAChB,QAAM,QAAQ,KAAK,IAAI,KAAK,QAAQ,CAAC;AACrC,QAAM,SAAS,GAAG;AAClB,QAAM,YAAY,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK;AACvD,QAAM,aAAa,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAGzD,QAAM,UAAU,OAAO,QAAQ,CAAC,MAAM,EAAE,MAAkB;AAC1D,QAAM,UAAU,QAAQ,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI;AACxD,QAAM,UAAU,QAAQ,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI;AACxD,QAAM,OAAO,GAAG,QAAQ,KAAK,IAAI,GAAG,OAAO;AAC3C,QAAM,OAAO,GAAG,SAAS,UAAU,IAAI,UAAU,MAAM;AACvD,QAAM,QAAQ,UAAU,MAAM,IAAI;AAGlC,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,WAAW,WAAW;AAC5B,QAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,YAAY,QAAQ,CAAC,GAAG,QAAQ,EAAE,KAAK,GAAG,CAAC;AACtF,QAAM,UAAU,GAAG,SAAS,WAAW,eAAe,IAAI;AAE1D,QAAM,WAAW,SAAS,UAAU,QAAQ;AAC5C,QAAM,UAAU,SAAS;AACzB,QAAM,QAAQ;AACd,QAAM,aAAa,UAAU;AAC7B,QAAM,QAAQ;AACd,QAAM,QAAQ,QAAQ;AACtB,QAAM,YAAY,WAAW;AAE7B,QAAM,QAAQ,CAAC,MAAsB,IAAI,cAAe,IAAI,SAAS,OAAO,QAAQ,KAAM,KAAK;AAC/F,QAAM,OAAO,CAAC,MAAsB,YAAY,IAAI,OAAO;AAE3D,QAAM,WAA2B,CAAC;AAElC,MAAI,OAAO;AACT,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,MAAM,CAAC;AACjB,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,IAAI,QAAQ,QAAQ,GAAG,EAAE,SAAS,IAAI,CAAC;AAAA,IACtF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,QAAQ,CAAC,GAAG,WAAW,GAAG,IAAI,WAAW,MAAM,UAAU,QAAQ,WAAW;AAAA,QACjF,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,WAAS,KAAK,EAAE,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,QAAQ,IAAI,UAAU,IAAI,QAAQ,MAAM,GAAG,CAAC;AAC/F,WAAS;AAAA,IACP,EAAE,KAAK,KAAK,QAAQ,IAAI,UAAU,MAAM,SAAS,IAAI,UAAU,IAAI,QAAQ,MAAM,GAAG;AAAA,EACtF;AAEA,MAAI,GAAG,QAAQ;AACb,UAAM,KAAK,OAAO,UAAU,QAAQ,CAAC;AACrC,UAAM,KAAK,SAAS,WAAW;AAC/B,aAAS;AAAA,MACP,EAAE,KAAK,GAAG,QAAQ,IAAI,IAAI,WAAW,cAAc,QAAQ,WAAW;AAAA,QACpE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,UAAM,OAAO,SAAS,IAAI;AAC1B,aAAS,KAAK,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,WAAW,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAAA,EACzE;AAGA,QAAM,QAAQ,KAAK,IAAI,UAAU,QAAQ,CAAC;AAC1C,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,SAAS;AACtB,YAAU,QAAQ,CAAC,GAAG,OAAO;AAC3B,UAAM,QAAQ,eAAe,IAAI,KAAK;AACtC,IAAC,EAAE,OAAoB,QAAQ,CAAC,GAAG,MAAM;AACvC,YAAM,IAAI,KAAK,CAAC,IAAI,SAAS,IAAI,KAAK;AACtC,YAAM,IAAI,MAAM,CAAC;AACjB,YAAMC,KAAI,MAAM,IAAI,IAAI;AACxB,UAAIA,KAAI;AACN,iBAAS;AAAA,UACP,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,QAAQ,IAAIA,EAAC,EAAE,GAAG,OAAO,OAAO,GAAG;AAAA,YAC9E,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,IACJ,CAAC;AAAA,EACH,CAAC;AAGD,aAAW,QAAQ,CAAC,GAAG,OAAO;AAC5B,UAAM,QAAQ,eAAe,UAAU,SAAS,IAAI,KAAK;AACzD,UAAM,MAAO,EAAE,OAAoB,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE;AAC9E,QAAI,IAAI,QAAQ;AACd,eAAS,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC;AACxD,MAAC,EAAE,OAAoB,QAAQ,CAAC,GAAG,MAAM;AACvC,iBAAS;AAAA,UACP,EAAE,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,QAAQ,YAAY,GAAG;AAAA,QAC9E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,OAAK,QAAQ,CAAC,GAAG,MAAM;AACrB,aAAS;AAAA,MACP,EAAE,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,aAAa,WAAW,GAAG,UAAU,QAAQ,WAAW;AAAA,QAC9E,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,SAAS,OAAO,YAAY,MAAM;AACxC,QAAM,SAAS,OAAO,aAAa,WAAW,KAAK,MAAM;AAEzD,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACtKA,SAASC,cAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,iBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,iBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,cAAaC,kBAAiB,KAAK;AAEnC,SAASC,YAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,iBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,YAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,YAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,YAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,iBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,WAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,gBAAgB,IAAI;AACxD,MAAI,SAAS,uBAAuB,cAAc,IAAI;AACtD,MAAI,SAAS,uBAAuB,YAAY,IAAI;AACpD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,UAAU,IAAI;AAClD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,uBAAuB,UAAU,IAAI;AACnD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,QAAQ,IAAI;AACjD,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAK,IAAI,GAAG,MAAM,KAAK;AAChE,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,QAAI;AACJ,QAAI,aAAa,CAAC;AAClB,QAAI,QAAQ,MAAM;AAClB,UAAM,SAAS,CAAC;AAChB,eAAW,KAAK,MAAM,OAAO,OAAO,GAAG;AACrC,UAAS,EAAE,MAAM,QAAS,SAAQ,EAAE;AAAA,eAC3B,EAAE,MAAM,IAAS,cAAa,EAAE;AAAA,eAChC,EAAE,MAAM,KAAO;AAAE,iBAAS,EAAE;AAAO,eAAO,EAAE;AAAK,eAAO,EAAE;AAAA,MAAK,WAC/D,EAAE,MAAM,SAAU,QAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,EAAE,OAAO,CAAC;AAAA,IAC3E;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,MACvD;AAAA,MACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,MACzC,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,MACrC,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,SAAS,GAAG,OAAO,MAAM,WAAW,EAAE,KAAK,IAAI,EAAE;AAAA,EAAG;AAC3F,MAAI,SAAS,SAAS,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC5C,MAAI,SAAS,SAAS,OAAO,MAAM;AAC/B,WAAO,EAAE,GAAG,KAAK,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE;AAAA,EAC1C;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACrC,MAAI,SAAS,SAAS,OAAO,GAAG,GAAG;AAAE,WAAO,EAAE,KAAK,GAAG,KAAK,EAAE;AAAA,EAAG;AAChE,MAAI,SAAS,SAAS,OAAOC,QAAO;AAChC,WAAO,EAAE,GAAG,KAAK,OAAO,SAAS,QAAW,KAAKA,SAAQA,OAAM,MAAM,QAAW,KAAKA,SAAQA,OAAM,MAAM,OAAU;AAAA,EACrH;AACF,MAAI,SAAS,SAAS,MAAM,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAClD,MAAI,UAAU,SAAS,MAAM,OAAO,MAAM;AACtC,WAAO,EAAE,GAAG,UAAU,MAAM,KAAK,YAAY,GAAG,QAAQ,CAAC,OAAO,GAAG,IAAI,EAAE;AAAA,EAC3E;AACF,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC7C,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,WAAW,CAAC;AAAA,EAAG;AAClD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASP,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASK,WAAU;AAC/C,WAAO,IAAIP,iBAAgB,SAAS,MAAM,MAAMO,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBL,WAAU,OAAOK,WAAU;AAC3D,WAAO,IAAIP;AAAA,MACTA,iBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,MAAM,OAAO,aAAa,EAAE;AACjC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,CAAC;AAChC,YAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,eAAe;AACpB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,gBAAgB;AACrB,cAAI,OAAO,YAAY;AACrB,iBAAK,mBAAmB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,gBAAgB;AACrB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AAAA,MAC3B;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AAEtD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,kBAAM;AACN;AAAA,UACF,OAAO;AACL,kBAAM;AACN,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,QAAQ,YAAY;AACtB,kBAAM,WAAW;AACjB,kBAAM,kBAAkB;AACxB,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,OAAO,IAAI,GAAG;AAAA,YACrB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK;AACL,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,oBAAM;AACN;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,QAAQ,YAAY;AACtB,oBAAM,WAAW;AACjB,oBAAM,kBAAkB;AACxB,kBAAI,QAAQ,YAAY;AACtB,+BAAe;AACf,qBAAK,OAAO,IAAI,GAAG;AAAA,cACrB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF;AACA,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,kBAAM,WAAW;AACjB,kBAAM,iBAAiB;AACvB,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,OAAO,IAAI,EAAE;AAAA,YACpB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,gBAAgB;AACrB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,aAAa;AAClB,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,gBAAM,aAAa;AACnB,cAAI,QAAQ,YAAY;AACtB,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,GAAG;AAAA,UACzB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,WAAW;AAChB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AAEtD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,SAAS;AAChC,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,aAAa;AAClB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,kBAAM;AACN;AAAA,UACF,OAAO;AACL,kBAAM;AACN,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,QAAQ,YAAY;AACtB,kBAAM,WAAW;AACjB,kBAAM,aAAa;AACnB,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,OAAO,IAAI,IAAI,GAAG;AAAA,YACzB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK;AACL,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,oBAAM;AACN;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,QAAQ,YAAY;AACtB,oBAAM,WAAW;AACjB,oBAAM,aAAa;AACnB,kBAAI,QAAQ,YAAY;AACtB,+BAAe;AACf,qBAAK,OAAO,IAAI,IAAI,GAAG;AAAA,cACzB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF;AACA,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,kBAAM,WAAW;AACjB,kBAAM,iBAAiB;AACvB,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,YACzB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI;AAEZ,SAAK,gBAAgB;AACrB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK;AACL,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC,IAAI,IAAI,EAAE;AAChB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACj6CO,IAAM,UAA0C;AAAA,EACrD,aAAa,OAAgC;AAC3C,WAAcG,WAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAAgC;AACxC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAqB,OAAoC;AAC9D,WAAO,cAAc,IAAI,KAAK;AAAA,EAChC;AACF;;;ACJO,SAAS,eAAe,IAAsB,OAAoC;AACvF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AAEvD,QAAM,OAAO;AACb,QAAM,UAAU;AAChB,QAAM,WAAW,SAAS;AAC1B,QAAM,UAAU,SAAS;AACzB,QAAM,YAAY,WAAW;AAC7B,QAAM,UAAU,UAAU;AAC1B,QAAM,OAAO,QAAQ,WAAW,aAAa,CAAC;AAC9C,QAAM,OAAO,QAAQ,UAAU,WAAW,CAAC;AAC3C,QAAM,OAAO,OAAO;AAEpB,QAAM,KAAK,CAAC,MAAsB,IAAI,WAAW,IAAI,IAAI;AACzD,QAAM,KAAK,CAAC,MAAsB,IAAI,UAAU,IAAI,IAAI;AAExD,QAAM,WAA2B,CAAC;AAElC,MAAI,OAAO;AACT,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA,QAAQ,WAAW,aAAa,CAAC;AAAA,QACjC,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAsD;AAAA,IAC1D,EAAE,GAAG,MAAM,GAAG,SAAS,KAAK,EAAE;AAAA;AAAA,IAC9B,EAAE,GAAG,UAAU,GAAG,SAAS,KAAK,EAAE;AAAA;AAAA,IAClC,EAAE,GAAG,UAAU,GAAG,MAAM,KAAK,EAAE;AAAA;AAAA,IAC/B,EAAE,GAAG,MAAM,GAAG,MAAM,KAAK,EAAE;AAAA;AAAA,EAC7B;AACA,QAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,UAAM,SAAS,eAAe,EAAE,KAAK,KAAK;AAC1C,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,OAAO,MAAM,QAAQ,KAAK;AAAA,QAC5C;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,SAAS,KAAK;AAAA,MAClB;AAAA,IACF;AACA,UAAM,QAAQ,GAAG,UAAU,CAAC;AAC5B,QAAI,OAAO;AACT,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA,OAAO,EAAE,IAAI,OAAO,CAAC;AAAA,UACrB,EAAE,IAAI,WAAW,eAAe;AAAA,UAChC,WAAW;AAAA,UACX;AAAA,UACA,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,WAAS;AAAA,IACP,EAAE,KAAK,EAAE,GAAG,UAAU,GAAG,SAAS,OAAO,MAAM,QAAQ,KAAK,GAAG,QAAQ,QAAQ,QAAQ,GAAG;AAAA,EAC5F;AACA,WAAS;AAAA,IACP,EAAE,KAAK,KAAK,IAAI,IAAI,OAAO,MAAM,IAAI,IAAI,OAAO,IAAI,QAAQ,QAAQ,GAAG,EAAE,MAAM,MAAM,CAAC;AAAA,EACxF;AACA,WAAS;AAAA,IACP,EAAE,KAAK,KAAK,QAAQ,IAAI,IAAI,MAAM,SAAS,IAAI,IAAI,IAAI,QAAQ,QAAQ,GAAG,EAAE,MAAM,MAAM,CAAC;AAAA,EAC3F;AAGA,QAAM,UAAU,WAAW;AAC3B,aAAW,MAAM,GAAG,QAAQ;AAC1B,UAAM,IAAI,GAAG,GAAG,CAAC,GACf,IAAI,GAAG,GAAG,CAAC;AACb,aAAS,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,SAAS,QAAQ,YAAY,GAAG,CAAC;AAC7E,aAAS,KAAK,EAAE,KAAK,GAAG,OAAO,IAAI,GAAG,IAAI,UAAU,MAAM,SAAS,QAAQ,IAAI,CAAC;AAAA,EAClF;AAGA,QAAM,SAAS,WAAW;AAC1B,QAAM,KAAK,UAAU,SAAS;AAC9B,MAAI,GAAG;AACL,aAAS;AAAA,MACP,EAAE,KAAK,GAAG,WAAW,UAAU,IAAI,QAAQ,QAAQ,WAAW,EAAE,QAAQ,QAAQ,CAAC;AAAA,IACnF;AACF,MAAI,GAAG;AACL,aAAS;AAAA,MACP,EAAE,KAAK,GAAG,YAAY,WAAW,IAAI,QAAQ,QAAQ,WAAW,EAAE,QAAQ,MAAM,CAAC;AAAA,IACnF;AAEF,QAAM,MAAM,SAAS;AACrB,MAAI,GAAG,aAAa;AAClB,UAAM,KAAK;AACX,aAAS;AAAA,MACP,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,aAAa,KAAK,IAAI,QAAQ,QAAQ,WAAW,EAAE,QAAQ,QAAQ,CAAC,CAAC,GAAG;AAAA,QACzF,WAAW,cAAc,GAAG,IAAI,EAAE;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF;AACA,MAAI,GAAG,UAAU;AACf,UAAM,KAAK;AACX,aAAS;AAAA,MACP,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,UAAU,KAAK,IAAI,QAAQ,QAAQ,WAAW,EAAE,QAAQ,MAAM,CAAC,CAAC,GAAG;AAAA,QACpF,WAAW,cAAc,GAAG,IAAI,EAAE;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,YAAY,MAAM;AACxC,QAAM,SAAS,OAAO,UAAU,SAAS,KAAK,MAAM;AAEpD,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AC3IA,SAASC,cAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,iBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,iBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,cAAaC,kBAAiB,KAAK;AAEnC,SAASC,YAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,iBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,YAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,YAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,YAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,iBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,WAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,iBAAiB,IAAI;AACzD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,UAAU,IAAI;AAClD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,uBAAuB,UAAU,IAAI;AAClD,MAAI,SAAS,uBAAuB,aAAa,IAAI;AACrD,MAAI,SAAS,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC5D,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,QAAI,OAAO,IAAI,IAAI,IAAI;AACvB,UAAM,YAAY,CAAC,QAAW,QAAW,QAAW,MAAS;AAC7D,UAAM,SAAS,CAAC;AAChB,eAAW,KAAK,MAAM,OAAO,OAAO,GAAG;AACrC,UAAS,EAAE,MAAM,QAAS,SAAQ,EAAE;AAAA,eAC3B,EAAE,MAAM,KAAK;AAAE,aAAK,EAAE;AAAM,aAAK,EAAE;AAAA,MAAO,WAC1C,EAAE,MAAM,KAAK;AAAE,aAAK,EAAE;AAAM,aAAK,EAAE;AAAA,MAAO,WAC1C,EAAE,MAAM,IAAK,WAAU,EAAE,IAAI,CAAC,IAAI,EAAE;AAAA,eACpC,EAAE,MAAM,IAAK,QAAO,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,CAAC;AAAA,IACtE;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,MACvD,GAAI,OAAO,SAAY,EAAE,WAAW,GAAG,IAAI,CAAC;AAAA,MAC5C,GAAI,OAAO,SAAY,EAAE,YAAY,GAAG,IAAI,CAAC;AAAA,MAC7C,GAAI,OAAO,SAAY,EAAE,aAAa,GAAG,IAAI,CAAC;AAAA,MAC9C,GAAI,OAAO,SAAY,EAAE,UAAU,GAAG,IAAI,CAAC;AAAA,MAC3C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;AAAA,EAAG;AAC/D,MAAI,SAAS,SAAS,MAAM,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAClD,MAAI,SAAS,SAAS,MAAM,OAAO;AAC/B,WAAO,EAAE,GAAG,KAAK,MAAM,KAAK,KAAK,GAAG,OAAO,SAAS,OAAU;AAAA,EAChE;AACF,MAAI,SAAS,SAAS,MAAM,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAClD,MAAI,SAAS,SAAS,MAAM,OAAO;AAC/B,WAAO,EAAE,GAAG,KAAK,MAAM,KAAK,KAAK,GAAG,OAAO,SAAS,OAAU;AAAA,EAChE;AACF,MAAI,SAAS,SAAS,GAAG,OAAO;AAAE,WAAO,EAAE,GAAG,KAAK,GAAG,SAAS,GAAG,EAAE,GAAG,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AAC9F,MAAI,SAAS,SAAS,OAAO,GAAG,GAAG;AAC/B,WAAO,EAAE,GAAG,KAAK,OAAO,MAAM,KAAK,GAAG,GAAG,EAAE;AAAA,EAC7C;AACF,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,WAAW,CAAC;AAAA,EAAG;AAClD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,iBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,iBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,eAAe;AACpB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,kBAAkB;AACvB,cAAI,OAAO,YAAY;AACrB,iBAAK,eAAe;AACpB,gBAAI,OAAO,YAAY;AACrB,mBAAK,mBAAmB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,oBAAoB;AACzB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,oBAAoB;AACzB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAE1E,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,aAAa;AAClB,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,oBAAM;AACN;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,QAAQ,YAAY;AACtB,oBAAM,WAAW;AACjB,oBAAM,aAAa;AACnB,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,oBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,wBAAM;AACN;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,QAAQ,YAAY;AACtB,wBAAM,WAAW;AACjB,wBAAM,iBAAiB;AACvB,sBAAI,QAAQ,YAAY;AACtB,mCAAe;AACf,yBAAK,OAAO,IAAI,IAAI,GAAG;AAAA,kBACzB,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,CAAC;AACN,SAAK;AACL,SAAK;AACL;AACA,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK;AACL,aAAK;AACL;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK;AACL,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC,IAAI,IAAI,EAAE;AAChB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACz2CO,IAAM,WAA4C;AAAA,EACvD,aAAa,OAAiC;AAC5C,WAAcG,WAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAAiC;AACzC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAsB,OAAoC;AAC/D,WAAO,eAAe,IAAI,KAAK;AAAA,EACjC;AACF;;;ACHO,SAAS,YAAY,IAAmB,OAAoC;AACjF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,OAAO,GAAG;AAChB,QAAM,IAAI,KAAK,IAAI,KAAK,QAAQ,CAAC;AACjC,QAAM,UAAU,GAAG,OAAO,QAAQ,CAAC,MAAM,EAAE,MAAkB;AAC7D,QAAM,MAAM,GAAG,OAAO;AACtB,QAAM,MAAM,GAAG,QAAQ,QAAQ,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI;AAC/D,QAAM,OAAO,MAAM,OAAO;AAE1B,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AAEvD,QAAM,IAAI;AACV,QAAM,WAAW;AACjB,QAAM,KAAK,SAAS,WAAW;AAC/B,QAAM,KAAK,SAAS,SAAS,WAAW;AAGxC,QAAM,QAAQ,CAAC,MAAsB,CAAC,KAAK,KAAK,IAAK,IAAI,IAAK,KAAK,KAAK;AACxE,QAAM,OAAO,CAAC,GAAW,UAA4C;AAAA,IACnE,GAAG,KAAK,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI;AAAA,IACjC,GAAG,KAAK,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI;AAAA,EACnC;AAEA,QAAM,WAA2B,CAAC;AAElC,MAAI,OAAO;AACT,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA,OAAO,EAAE;AAAA,QACT,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ;AACd,WAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,UAAM,OAAO,IAAI;AACjB,UAAM,IAAI,KACP,IAAI,CAAC,GAAG,MAAM;AACb,YAAM,KAAK,KAAK,GAAG,IAAI;AACvB,aAAO,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IAClC,CAAC,EACA,KAAK,KAAK;AACb,aAAS,KAAK,EAAE,KAAK,KAAK,CAAC,MAAM,QAAQ,QAAQ,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC;AAAA,EACvE;AAGA,OAAK,QAAQ,CAAC,IAAI,MAAM;AACtB,UAAM,QAAQ,KAAK,GAAG,CAAC;AACvB,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,IAAI,QAAQ,QAAQ,GAAG;AAAA,QACrF,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,UAAM,KAAK,KAAK,GAAG,IAAI;AACvB,UAAM,IAAI,MAAM,CAAC;AACjB,UAAM,SAAS,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC,IAAI,MAAM,WAAW,KAAK,IAAI,CAAC,IAAI,IAAI,UAAU;AACpF,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG;AAAA,QACH,IAAI,GAAG,CAAC;AAAA,QACR,IAAI,GAAG,IAAI,WAAW,gBAAgB,IAAI;AAAA,QAC1C,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,OAAO;AAAA,MACX;AAAA,IACF;AAAA,EACF,CAAC;AAGD,KAAG,OAAO,QAAQ,CAAC,OAAO,OAAO;AAC/B,UAAM,QAAQ,eAAe,IAAI,KAAK;AACtC,UAAM,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM;AAC7B,YAAM,IAAI,MAAM,OAAO,CAAC,KAAK;AAC7B,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC;AACtD,YAAM,KAAK,KAAK,GAAG,IAAI;AACvB,aAAO,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IAClC,CAAC;AACD,QAAI,IAAI,QAAQ;AACd,eAAS,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,MAAM,OAAO,GAAG,EAAE,MAAM,OAAO,SAAS,KAAK,CAAC,CAAC;AACxF,eAAS,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,WAAW;AAC9B,QAAM,SAAS;AACf,QAAM,UAAU,KAAK,IAAI,WAAW;AACpC,QAAM,YAAY,SAAS;AAC3B,MAAI,UAAU;AACd,KAAG,OAAO,QAAQ,CAAC,OAAO,OAAO;AAC/B,UAAM,KAAK,YAAY,MAAM,aAAa;AAC1C,UAAM,cAAc,eAAe,IAAI,KAAK;AAC5C,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,SAAS,GAAG,IAAI,OAAO,QAAQ,QAAQ,OAAO;AAAA,QACnD;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,MAAM,OAAO,UAAU,SAAS,GAAG,KAAK,SAAS,GAAG,YAAY,QAAQ,IAAI;AAAA,IACrF;AACA,cAAU,KAAK,IAAI,SAAS,SAAS,IAAI,YAAY,MAAM,OAAO,UAAU,EAAE,KAAK;AAAA,EACrF,CAAC;AAED,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,SAAS,OAAO,KAAK,IAAI,WAAW,UAAU,OAAO,IAAI,MAAM;AACrE,QAAM,SAAS,OAAO,KAAK,IAAI,WAAW,MAAM;AAEhD,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AC3IA,SAASC,cAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,iBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,iBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,cAAaC,kBAAiB,KAAK;AAEnC,SAASC,YAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,iBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,YAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,YAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,YAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,iBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,WAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,cAAc,IAAI;AACtD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,QAAQ,IAAI;AAChD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,OAAO,IAAI;AAC/C,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC3D,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,QAAI,OAAO,KAAK;AAChB,UAAM,OAAO,CAAC;AACd,UAAM,SAAS,CAAC;AAChB,eAAW,KAAK,MAAM,OAAO,OAAO,GAAG;AACrC,UAAS,EAAE,MAAM,QAAS,SAAQ,EAAE;AAAA,eAC3B,EAAE,MAAM,OAAS,MAAK,KAAK,GAAG,EAAE,KAAK;AAAA,eACrC,EAAE,MAAM,QAAS,QAAO,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,eAC3E,EAAE,MAAM,MAAS,OAAM,EAAE;AAAA,eACzB,EAAE,MAAM,MAAS,OAAM,EAAE;AAAA,IACpC;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,MACvD;AAAA,MACA;AAAA,MACA,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,MACnC,GAAI,QAAQ,SAAY,EAAE,IAAI,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;AAAA,EAAG;AAC/D,MAAI,SAAS,SAAS,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC5C,MAAI,SAAS,SAAS,OAAO,MAAM;AAC/B,WAAO,EAAE,GAAG,QAAQ,OAAO,CAAC,OAAO,GAAG,IAAI,EAAE;AAAA,EAC9C;AACF,MAAI,SAAS,SAAS,IAAI,OAAO,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AACvD,MAAI,SAAS,SAAS,IAAI,OAAO,OAAO,MAAM;AAC1C,WAAO,EAAE,GAAG,SAAS,IAAI,OAAO,SAAS,OAAO,QAAQ,IAAI,QAAQ,CAAC,OAAO,GAAG,IAAI,EAAE;AAAA,EACvF;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,OAAO,GAAG,EAAE;AAAA,EAAG;AACtD,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,OAAO,GAAG,EAAE;AAAA,EAAG;AACtD,MAAI,UAAU,SAAS,IAAI,OAAO;AAAE,WAAO,EAAE,IAAI,OAAO,SAAS,OAAO,QAAQ,GAAG;AAAA,EAAG;AACtF,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC7C,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,WAAW,CAAC;AAAA,EAAG;AAClD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,iBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,iBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AACxB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,iBAAK,iBAAiB;AACtB,gBAAI,OAAO,YAAY;AACrB,mBAAK,mBAAmB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,gBAAM,iBAAiB;AACvB,cAAI,QAAQ,YAAY;AACtB,2BAAe;AACf,iBAAK,OAAO,IAAI,GAAG;AAAA,UACrB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,kBAAM,iBAAiB;AACvB,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,OAAO,IAAI,GAAG;AAAA,YACrB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,aAAK,WAAW;AAChB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK;AAErE,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,eAAe;AACpB,UAAI,OAAO,YAAY;AACrB,aAAK,sBAAsB;AAC3B,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,aAAa;AAClB,cAAI,OAAO,YAAY;AACrB,kBAAM,CAAC;AACP,kBAAM;AACN,kBAAM,WAAW;AACjB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,oBAAM;AACN;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,QAAQ,YAAY;AACtB,oBAAM,WAAW;AACjB,oBAAM,aAAa;AACnB,kBAAI,QAAQ,YAAY;AACtB,+BAAe;AACf,sBAAM,OAAO,IAAI,IAAI,IAAI,GAAG;AAAA,cAC9B,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AAAA,YACF,OAAO;AACL,4BAAc;AACd,oBAAM;AAAA,YACR;AACA,mBAAO,QAAQ,YAAY;AACzB,kBAAI,KAAK,GAAG;AACZ,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,aAAa;AACnB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,wBAAM,OAAO,IAAI,IAAI,IAAI,GAAG;AAAA,gBAC9B,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AAAA,YACF;AACA,kBAAM,WAAW;AACjB,gBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,oBAAM;AACN;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,QAAQ,YAAY;AACtB,oBAAM,WAAW;AACjB,oBAAM,iBAAiB;AACvB,kBAAI,QAAQ,YAAY;AACtB,+BAAe;AACf,qBAAK,OAAO,IAAI,IAAI,IAAI,GAAG;AAAA,cAC7B,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,aAAa;AAClB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,aAAa;AAClB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,sBAAsB;AAC3B,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,gBAAgB;AACrB,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,EAAE;AAAA,UACjB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK;AACL,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC,IAAI,IAAI,EAAE;AAChB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACl+CO,IAAM,QAAsC;AAAA,EACjD,aAAa,OAA8B;AACzC,WAAcG,WAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA8B;AACtC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAmB,OAAoC;AAC5D,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;ACFO,SAAS,YAAY,IAAmB,OAAoC;AACjF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAGvB,QAAM,OAAiB,CAAC;AACxB,aAAW,OAAO,GAAG;AACnB,eAAW,KAAK,IAAI,OAAO;AACzB,WAAK,KAAK,aAAa,EAAE,KAAK,GAAG,aAAa,EAAE,GAAG,CAAC;AAAA,IACtD;AACF,MAAI,KAAK,WAAW,EAAG,MAAK,KAAK,GAAG,EAAE;AACtC,QAAM,SAAS,KAAK,IAAI,GAAG,IAAI;AAC/B,QAAM,SAAS,KAAK,IAAI,GAAG,IAAI;AAC/B,QAAM,OAAO,KAAK,IAAI,GAAG,SAAS,MAAM;AACxC,QAAM,OAAO,cAAc,IAAI;AAC/B,QAAM,QAAQ,UAAU,QAAQ,QAAQ,IAAI;AAG5C,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,WAAW;AACjB,QAAM,WAAW,SAAS;AAC1B,QAAM,QAAQ;AACd,QAAM,YAAY,WAAW;AAC7B,QAAM,QAAQ;AACd,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM,UAAU;AAEhB,QAAM,UAAU,SAAS,SAAS;AAClC,QAAM,QAAQ,CAAC,QAAwB,IAAI,YAAa,MAAM,UAAU,OAAQ,KAAK;AAErF,QAAM,WAA2B,CAAC;AAElC,MAAI,OAAO;AACT,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,WAAW;AACf,aAAW,OAAO,GAAG,SAAU,aAAY,IAAI,IAAI,MAAM;AACzD,QAAM,QAAQ,YAAY,OAAO;AACjC,QAAM,aAAa,UAAU;AAG7B,QAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,UAAM,IAAI,MAAM,EAAE,OAAO;AACzB,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,IAAI,UAAU,IAAI,QAAQ,QAAQ,GAAG,EAAE,SAAS,IAAI,CAAC;AAAA,IACtF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,gBAAgB,GAAG,MAAM,CAAC;AAAA,QAC1B;AAAA,QACA,SAAS,SAAS,QAAQ;AAAA,QAC1B,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,SAAS;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAC;AAED,WAAS,KAAK,EAAE,KAAK,KAAK,QAAQ,IAAI,OAAO,MAAM,SAAS,IAAI,OAAO,IAAI,QAAQ,QAAQ,GAAG,CAAC;AAG/F,MAAI,IAAI;AACR,aAAW,OAAO,GAAG,UAAU;AAE7B,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,QAAQ,GAAG,OAAO,WAAW,OAAO,QAAQ,QAAQ;AAAA,QACzD,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,IAAI,UAAU,IAAI,WAAW,eAAe;AAAA,QAC5C,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AACA,SAAK,UAAU;AAEf,eAAW,QAAQ,IAAI,OAAO;AAC5B,YAAM,KAAK,MAAM,aAAa,KAAK,KAAK,CAAC;AACzC,YAAM,QAAQ,YAAY,SAAS,KAAK,WAAW,SAAS,YAAY,KAAK,MAAM;AAGnF,eAAS;AAAA,QACP,EAAE;AAAA,UACA,aAAa,KAAK,OAAO,WAAW,eAAe,WAAW,EAAE;AAAA,UAChE,SAAS;AAAA,UACT,IAAI,OAAO,IAAI,WAAW,gBAAgB;AAAA,UAC1C,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,MACF;AAEA,UAAI,KAAK,aAAa;AACpB,cAAM,KAAK,IACT,KAAK,IAAI,OAAO,GAChB,IAAI;AACN,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE;AAAA,YACvE,QAAQ;AAAA,YACR;AAAA,YACA,EAAE,MAAM,MAAM;AAAA,UAChB;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,KAAK,MAAM,aAAa,KAAK,GAAG,CAAC;AACvC,cAAM,OAAO,KAAK,IAAI,GAAG,KAAK,EAAE;AAChC,iBAAS;AAAA,UACP,EAAE,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,OAAO,IAAI,IAAI,GAAG,QAAQ,OAAO,EAAE,GAAG,OAAO,OAAO,GAAG;AAAA,YAC/E,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AAAA,MACF;AACA,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,YAAY,MAAM;AACxC,QAAM,SAAS,OAAO,aAAa,MAAM;AAEzC,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AChKA,SAASC,cAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,iBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,iBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,cAAaC,kBAAiB,KAAK;AAEnC,SAASC,YAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,iBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,YAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,YAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,YAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,iBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,WAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,cAAc,IAAI;AACtD,MAAI,SAAS,uBAAuB,YAAY,IAAI;AACpD,MAAI,SAAS,uBAAuB,cAAc,IAAI;AACtD,MAAI,SAAS,uBAAuB,eAAe,IAAI;AACvD,MAAI,SAAS,uBAAuB,gBAAgB,IAAI;AACxD,MAAI,SAAS,uBAAuB,WAAW,IAAI;AACnD,MAAI,UAAU,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC3D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAIC,QAAO;AAC7B,QAAI,OAAO;AACX,UAAMC,YAAW,CAAC;AAClB,eAAW,KAAKD,OAAM,OAAO,OAAO,GAAG;AACrC,UAAS,EAAE,MAAM,QAAc,SAAQ,EAAE;AAAA,eAChC,EAAE,MAAM,aAAc,cAAa,EAAE;AAAA,eACrC,EAAE,MAAM,UAAc,CAAAC,UAAS,KAAK,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC,EAAE,CAAC;AAAA,eACjE,EAAE,MAAM,QAAQ;AACvB,YAAIA,UAAS,WAAW,EAAG,CAAAA,UAAS,KAAK,EAAE,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;AACjE,QAAAA,UAASA,UAAS,SAAS,CAAC,EAAE,MAAM,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC;AAAA,MACzE;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,MACvD,YAAY,cAAc;AAAA,MAC1B,UAAAA;AAAA,IACF;AAAA,EACF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASD,QAAO;AACzB,UAAM,OAAO,CAAC;AACd,eAAW,QAAQA,QAAO;AACxB,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAChD,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;AAAA,EAAG;AAC/D,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,cAAc,GAAG,EAAE,KAAK,EAAE;AAAA,EAAG;AACpE,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,EAAE,GAAG,WAAW,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AAC7E,MAAI,SAAS,SAAS,MAAM,MAAM;AAAE,WAAO,EAAE,GAAG,QAAQ,MAAM,KAAK,KAAK,GAAG,MAAM,KAAK,KAAK,EAAE;AAAA,EAAG;AAChG,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaE,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASP,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASK,WAAU;AAC/C,WAAO,IAAIP,iBAAgB,SAAS,MAAM,MAAMO,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBL,WAAU,OAAOK,WAAU;AAC3D,WAAO,IAAIP;AAAA,MACTA,iBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,cAAc;AACnB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,cAAc;AAAA,QACrB;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI;AAEJ,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,wBAAwB;AAC7B,UAAI,OAAO,YAAY;AACrB,aAAK,sBAAsB;AAC3B,YAAI,OAAO,YAAY;AACrB,eAAK,qBAAqB;AAC1B,cAAI,OAAO,YAAY;AACrB,iBAAK,kBAAkB;AACvB,gBAAI,OAAO,YAAY;AACrB,mBAAK,mBAAmB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,EAAE;AACjC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,EAAE;AACjC,YAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,aAAa,EAAE;AACjC,cAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO;AAAA,UACd,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO;AAAA,IACd,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACznCA,IAAM,eAAe,oBAAI,IAAI,CAAC,QAAQ,UAAU,QAAQ,WAAW,CAAC;AAEpE,SAAS,eAAe,KAAqB;AAC3C,QAAM,CAAC,GAAG,GAAG,CAAC,IAAI,cAAc,GAAG;AACnC,SAAO,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACzE;AAEA,SAAS,aAAa,OAAuB;AAC3C,QAAM,IAAI,MAAM,MAAM,+BAA+B;AACrD,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,WAAW,EAAE,CAAC,CAAE;AAC1B,WAAS,EAAE,CAAC,KAAK,KAAK,YAAY,GAAG;AAAA,IACnC,KAAK;AACH,aAAO,IAAI;AAAA,IACb,KAAK;AACH,aAAO,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;AAAA,IACvC;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,MAAsB;AACzC,MAAI;AACF,UAAM,CAAC,GAAG,GAAG,CAAC,IAAI,WAAW,YAAY,IAAI,CAAC;AAC9C,WAAO,cAAc,GAAG,GAAG,CAAC;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,YAAY,KAAc,SAAyC;AAC1E,QAAM,SAAS,IAAI,KAChB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAiB,CAAC;AACxB,aAAW,OAAO,QAAQ;AACxB,QAAI,aAAa,IAAI,IAAI,YAAY,CAAC,EAAG,OAAM,KAAK,IAAI,YAAY,CAAC;AAAA,QAChE,MAAK,KAAK,GAAG;AAAA,EACpB;AAGA,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,KAAK,UAAU,GAAG;AACpB,SAAK,KAAK,CAAC;AACX,eAAW,KAAK,CAAC;AACjB,aAAS,KAAK,CAAC;AAAA,EACjB,OAAO;AACL,eAAW,KAAK,CAAC,KAAK;AACtB,aAAS,KAAK,CAAC,KAAK;AAAA,EACtB;AAEA,QAAM,WAAW,aAAa,KAAK,QAAQ,IACtC,QAAQ,IAAI,SAAS,QAAQ,cAAc,EAAE,EAAE,KAAK,CAAC,KAAK,IAC3D,YAAY,QAAQ;AAExB,QAAM,cAAc,MAAM,SAAS,WAAW,KAAK,aAAa,MAAM,MAAM;AAC5E,QAAM,SAAS,cAAc,WAAW,WAAW,aAAa,MAAM;AACtE,MAAI,GAAI,SAAQ,IAAI,IAAI,MAAM;AAE9B,QAAM,SAAsB,MAAM,SAAS,MAAM,IAC7C,SACA,MAAM,SAAS,QAAQ,IACrB,WACA,MAAM,SAAS,MAAM,IACnB,SACA;AAER,SAAO;AAAA,IACL,GAAI,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,IACnB,OAAO,IAAI;AAAA,IACX;AAAA,IACA,OAAO,eAAe,QAAQ;AAAA,IAC9B,KAAK,eAAe,MAAM;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,IAAM,QAAsC;AAAA,EACjD,aAAa,OAA8B;AACzC,UAAM,MAAaG,WAAM,KAAK;AAC9B,UAAM,UAAU,oBAAI,IAAoB;AACxC,UAAMC,YAA2B,IAAI,SAAS,IAAI,CAAC,SAAS;AAAA,MAC1D,OAAO,IAAI;AAAA,MACX,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC;AAAA,IACrD,EAAE;AACF,WAAO,EAAE,SAAS,IAAI,SAAS,UAAU,IAAI,UAAU,UAAAA,UAAS;AAAA,EAClE;AAAA,EAEA,UAAU,OAA8B;AACtC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAmB,OAAoC;AAC5D,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;AC1GA,IAAM,YAAY;AAClB,IAAM,YAAY;AAEX,SAAS,cAAc,IAAqB,OAAoC;AACrF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,aAAa,CAAC,MAAsB;AACxC,QAAI,KAAK,IAAK,QAAO,QAAQ;AAC7B,QAAI,KAAK,IAAK,QAAO,QAAQ;AAC7B,QAAI,KAAK,IAAK,QAAO,QAAQ;AAC7B,QAAI,KAAK,IAAK,QAAO,QAAQ;AAC7B,WAAO,QAAQ;AAAA,EACjB;AASA,QAAMC,QAAe,CAAC;AACtB,KAAG,SAAS;AAAA,IAAQ,CAAC,KAAK,OACxB,IAAI,MAAM;AAAA,MAAQ,CAAC,MACjBA,MAAK,KAAK,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,SAAS,GAAG,CAAC;AAAA,IAC7E;AAAA,EACF;AACA,QAAM,IAAI,KAAK,IAAIA,MAAK,QAAQ,CAAC;AAEjC,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AAEvD,QAAM,eAAe;AACrB,QAAM,WAAW,SAAS;AAC1B,QAAM,UAAU,SAAS,SAAS,eAAe;AACjD,QAAM,QAAQ;AACd,QAAM,aAAa,UAAU;AAC7B,QAAM,OAAO;AACb,QAAM,QAAQ,OAAO;AACrB,QAAM,YAAY,WAAW;AAE7B,QAAM,QAAQ,CAAC,MAAsB,YAAY,IAAI,OAAO;AAC5D,QAAM,SAAS,CAAC,MACd;AAAA,IACE,cACI,KAAK,IAAI,WAAW,KAAK,IAAI,WAAW,CAAC,CAAC,IAAI,cAAc,YAAY,aACxE;AAAA,EACN;AAEF,QAAM,WAA2B,CAAC;AAElC,MAAI,OAAO;AACT,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,WAAS,IAAI,WAAW,KAAK,WAAW,KAAK;AAC3C,UAAM,IAAI,OAAO,CAAC;AAClB,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,SAAS,IAAI,CAAC,IAAI,QAAQ,QAAQ,GAAG,EAAE,SAAS,IAAI,CAAC;AAAA,IACtF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,OAAO,CAAC;AAAA,QACR,WAAW;AAAA,QACX,IAAI,WAAW,gBAAgB;AAAA,QAC/B,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAGA,KAAG,SAAS,QAAQ,CAAC,KAAK,OAAO;AAC/B,UAAM,OAAOA,MACV,IAAI,CAACC,IAAG,OAAO,EAAE,GAAAA,IAAG,EAAE,EAAE,EACxB,OAAO,CAAC,EAAE,GAAAA,GAAE,MAAMA,GAAE,YAAY,EAAE,EAClC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC;AACnB,QAAI,KAAK,WAAW,EAAG;AACvB,UAAM,KAAK,MAAM,KAAK,CAAC,CAAE,IAAI,OAAO;AACpC,UAAM,KAAK,MAAM,KAAK,KAAK,SAAS,CAAC,CAAE,IAAI,OAAO;AAClD,UAAM,MAAM,eAAe,IAAI,KAAK;AACpC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,SAAS,QAAQ,OAAO,IAAI,KAAK,KAAK,CAAC,GAAG,QAAQ,aAAa;AAAA,QAChF;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ,QAAQ,KAAK,MAAM,IAAI,CAAC;AAAA,QACxB,SAAS,SAAS,eAAe,IAAI,WAAW,eAAe;AAAA,QAC/D,WAAW;AAAA,QACX,aAAa,KAAK,KAAK;AAAA,QACvB,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,UAAUD,MAAK,IAAI,CAACC,IAAG,OAAO,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,GAAG,OAAOA,GAAE,KAAK,EAAE,EAAE;AAC7E,MAAI,QAAQ,SAAS,GAAG;AACtB,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,QAAQ,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,KAAK,KAAK,CAAC,IAAI,QAAQ,WAAW,GAAG;AAAA,QACtF,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAGA,EAAAD,MAAK,QAAQ,CAACC,IAAG,MAAM;AACrB,UAAM,IAAI,IAAI,MAAM,CAAC,CAAC,GACpB,IAAI,OAAOA,GAAE,KAAK;AACpB,UAAM,QAAQ,WAAWA,GAAE,KAAK;AAChC,aAAS,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,OAAO,QAAQ,YAAY,CAAC,CAAC;AAClE,aAAS;AAAA,MACP,EAAE;AAAA,QACA,OAAOA,GAAE,KAAK;AAAA,QACd;AAAA,QACA,IAAI,WAAW,eAAe;AAAA,QAC9B,WAAW;AAAA,QACX,aAAa,OAAO,KAAK;AAAA,QACzB,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACAA,GAAE;AAAA,QACF;AAAA,QACA,aAAa,WAAW,gBAAgB;AAAA,QACxC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AACA,IAAAA,GAAE,OAAO,QAAQ,CAAC,GAAG,OAAO;AAC1B,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa,WAAW,gBAAgB,MAAM,KAAK,MAAM,WAAW,gBAAgB;AAAA,UACpF,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,YAAY,KAAK,IAAI,GAAG,GAAGD,MAAK,IAAI,CAACC,OAAMA,GAAE,OAAO,MAAM,CAAC;AACjE,QAAM,SAAS,OAAO,YAAY,MAAM;AACxC,QAAM,SAAS;AAAA,IACb,aACE,WAAW,gBACX,MACC,YAAY,MAAM,WAAW,gBAAgB,KAC9C;AAAA,EACJ;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AClMA,SAASC,cAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,iBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,iBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,cAAaC,kBAAiB,KAAK;AAEnC,SAASC,YAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,iBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,YAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,YAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,YAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,iBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,WAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,WAAW,IAAI;AACnD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,WAAW,IAAI;AACnD,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,QAAI;AACJ,UAAMC,YAAW,CAAC;AAClB,eAAW,KAAK,MAAM,OAAO,OAAO,GAAG;AACrC,UAAS,EAAE,MAAM,QAAS,SAAQ,EAAE;AAAA,eAC3B,EAAE,MAAM,UAAW,CAAAA,UAAS,KAAK,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC,EAAE,CAAC;AAAA,eAC9D,EAAE,MAAM,QAAQ;AACvB,YAAIA,UAAS,WAAW,EAAG,CAAAA,UAAS,KAAK,EAAE,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;AACjE,QAAAA,UAASA,UAAS,SAAS,CAAC,EAAE,MAAM,KAAK,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,MAC/F;AAAA,IACF;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG,GAAG,UAAAA,UAAS;AAAA,EAC9F;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;AAAA,EAAG;AAC/D,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,EAAE,GAAG,WAAW,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AAC7E,MAAI,SAAS,SAAS,OAAO,OAAO,QAAQ;AACxC,WAAO,EAAE,GAAG,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO,OAAO;AAAA,EACzD;AACF,MAAI,SAAS,SAAS,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC5C,MAAI,SAAS,SAAS,OAAO,MAAM;AAAE,WAAO,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,OAAO;AAAA,EAAG;AAC9E,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC5C,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,WAAW,CAAC;AAAA,EAAG;AACjD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASP,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASK,WAAU;AAC/C,WAAO,IAAIP,iBAAgB,SAAS,MAAM,MAAMO,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBL,WAAU,OAAOK,WAAU;AAC3D,WAAO,IAAIP;AAAA,MACTA,iBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,cAAc;AACnB,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAEjD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,aAAa;AAClB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,gBAAgB;AACrB,gBAAI,OAAO,YAAY;AACrB,oBAAM,WAAW;AACjB,oBAAM,iBAAiB;AACvB,kBAAI,QAAQ,YAAY;AACtB,+BAAe;AACf,qBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,cACxB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,eAAe;AACpB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AACA,qBAAe;AACf,WAAK,OAAO,IAAI,EAAE;AAAA,IACpB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO,EAAE;AAAA,IAChB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK;AACL,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC,IAAI,IAAI,EAAE;AAChB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO,EAAE;AAAA,IAChB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACtrCO,IAAM,UAA0C;AAAA,EACrD,aAAa,OAAgC;AAC3C,WAAcG,WAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAAgC;AACxC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAqB,OAAoC;AAC9D,WAAO,cAAc,IAAI,KAAK;AAAA,EAChC;AACF;;;ACHO,SAAS,aAAa,IAAoB,OAAoC;AACnF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,WAAW,WAAW;AAC5B,QAAM,YAAY,WAAW;AAC7B,QAAM,QAAQ,OAAO,WAAW,GAAG;AACnC,QAAM,aAAa,OAAO,UAAU;AAEpC,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,WAAW,SAAS;AAG1B,QAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,SAAS;AAAA,IACvC,OAAO,IAAI;AAAA,IACX,OAAO,IAAI,MAAM,IAAI,CAAC,MAAM;AAC1B,YAAM,OAAO,qBAAqB,EAAE,MAAM,UAAU,WAAW,aAAa,GAAG,CAAC;AAChF,YAAMC,KAAI,KAAK,IAAI,UAAU,IAAI,KAAK,YAAY,OAAO,EAAE;AAC3D,aAAO,EAAE,MAAM,GAAAA,GAAE;AAAA,IACnB,CAAC;AAAA,EACH,EAAE;AAEF,QAAM,WAA2B,CAAC;AAElC,MAAI,OAAO;AACT,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU;AACd,UAAQ,QAAQ,CAAC,KAAK,OAAO;AAC3B,UAAM,IAAI,SAAS,MAAM,OAAO;AAChC,UAAM,MAAM,eAAe,IAAI,KAAK;AAGpC,aAAS,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,UAAU,OAAO,MAAM,QAAQ,QAAQ,GAAG,KAAK,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9F,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,IAAI,KAAK,MAAM,IAAI,MAAM,MAAM;AAAA,QAClC,OAAO,IAAI,OAAO,CAAC;AAAA,QACnB,WAAW,UAAU,IAAI,WAAW;AAAA,QACpC,WAAW;AAAA,QACX;AAAA,QACA,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAGA,QAAI,KAAK,WAAW,UAAU;AAC9B,eAAW,QAAQ,IAAI,OAAO;AAC5B,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,OAAO,MAAM,QAAQ,KAAK,EAAE,GAAG,QAAQ,SAAS,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,MACtF;AACA,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,EAAE,OAAO,SAAS,aAAa,SAAS,cAAc,QAAQ;AAAA,QAChE;AAAA,MACF;AACA,YAAM,KAAK,IAAI;AAAA,IACjB;AACA,cAAU,KAAK,IAAI,SAAS,KAAK,QAAQ;AAAA,EAC3C,CAAC;AAED,QAAM,SAAS,OAAO,SAAS,QAAQ,SAAS,QAAQ,QAAQ,SAAS,KAAK,SAAS,MAAM;AAC7F,QAAM,SAAS,OAAO,WAAW,UAAU,MAAM;AAEjD,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AC7GA,SAASC,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,UAAU,IAAI;AAClD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO,KAAK;AAC9F,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,mBAAmB;AAChC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,MAAM;AAC5B,UAAM,UAAU,CAAC;AACjB,eAAW,KAAK,KAAK,OAAO,OAAO,GAAG;AACpC,UAAI,EAAE,MAAM,MAAO,SAAQ,KAAK,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC,EAAE,CAAC;AAAA,eACpD,EAAE,MAAM,QAAQ;AACvB,YAAI,QAAQ,WAAW,EAAG,SAAQ,KAAK,EAAE,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC;AAC/D,gBAAQ,QAAQ,SAAS,CAAC,EAAE,MAAM,KAAK,EAAE,GAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,GAAI,MAAM,EAAE,KAAK,CAAC;AAAA,MACxF;AAAA,IACF;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,QAAQ;AAAA,EAChE;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,IAAIC,OAAM;AAAE,WAAO,EAAE,GAAG,QAAQ,IAAI,MAAM,QAAW,MAAMA,MAAK,KAAK,EAAE;AAAA,EAAG;AAChG,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,EAAE,GAAG,OAAO,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AACzE,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBD,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQE,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASK,WAAU;AAC/C,WAAO,IAAIP,kBAAgB,SAAS,MAAM,MAAMO,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBL,WAAU,OAAOK,WAAU;AAC3D,WAAO,IAAIP;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,aAAa;AAClB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,aAAa;AAAA,QACpB;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI;AAEJ,SAAK,cAAc;AACnB,QAAI,OAAO,YAAY;AACrB,WAAK,gBAAgB;AACrB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO;AAAA,IACd,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AC/7BO,IAAM,SAAwC;AAAA,EACnD,aAAa,OAA+B;AAC1C,WAAcE,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA+B;AACvC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAoB,OAAoC;AAC7D,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACF;;;ACFA,IAAMC,YAAW;AACjB,IAAM,UAAU;AAET,SAAS,eAAe,IAAsB,OAAoC;AACvF,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAC,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,QAAQ,GAAG;AACjB,QAAM,MAAM,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAGpD,QAAM,WAAW,WAAW;AAC5B,QAAM,WAAW;AACjB,QAAM,QAAQ;AACd,QAAM,OAAO,KAAK;AAAA,IAChB;AAAA,IACA,GAAG,MAAM;AAAA,MACP,CAAC,OAAO,YAAY,GAAG,OAAO,QAAQ,EAAE,QAAQ,WAAW,KAAK,GAAG,UAAU,IAAI;AAAA,IACnF;AAAA,EACF;AACA,QAAM,SAAS;AACf,QAAM,WAAW,OAAO;AACxB,QAAM,OAAO,CAAC,MAAsB,SAAS,IAAI,WAAW,OAAO;AACnE,QAAM,QAAQ,CAAC,OAAuB,KAAK,IAAI,IAAI,EAAE,KAAK,CAAC;AAE3D,QAAM,SAAS,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACnE,QAAM,UAAU,SAAS;AACzB,QAAM,UAAU,UAAU,QAAQ;AAClC,QAAM,SAAS;AAEf,QAAM,WAA2B,CAAC;AAClC,QAAM,cAA8B,CAAC;AAErC,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAWA,QAAM,YAAoB,CAAC;AAC3B,QAAM,YAAoB,CAAC;AAC3B,QAAM,cAAc,oBAAI,IAAsB;AAC9C,QAAM,UAAwD,CAAC;AAE/D,MAAI,IAAI;AACR,MAAI,QAAQ;AACZ,QAAM,OAAO,KAAK,CAAC;AACnB,QAAM,OAAO,KAAK,KAAK,IAAI,MAAM,SAAS,GAAG,CAAC,CAAC;AAE/C,QAAM,UAAU,CAAC,OAAqB;AACpC,KAAC,YAAY,IAAI,EAAE,KAAK,YAAY,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,GAAI,KAAK,CAAC;AAAA,EAClE;AACA,QAAM,SAAS,CAAC,OAAqB;AACnC,UAAM,KAAK,YAAY,IAAI,EAAE;AAC7B,QAAI,MAAM,GAAG,QAAQ;AACnB,YAAM,KAAK,GAAG,IAAI;AAClB,cAAQ,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;AAAA,IAC1C;AAAA,EACF;AAEA,aAAW,MAAM,GAAG,QAAQ;AAC1B,QAAI,GAAG,SAAS,WAAW;AACzB,YAAM,IAAI;AACV,YAAM,KAAK,MAAM,EAAE,IAAI,GACrB,KAAK,MAAM,EAAE,EAAE;AACjB,YAAM,OAAO,EAAE,SAAS,EAAE;AAC1B,YAAM,QAAQ,GAAG,aAAa,GAAG,EAAE,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE;AAC1D,YAAM,OAAO,EAAE,SAAS,WAAW,QAAQ;AAC3C,YAAM,YACJ,EAAE,SAAS,UACPD,YACA,EAAE,SAAS,UAAU,EAAE,SAAS,UAC9B,UACA;AAER,UAAI,EAAE,eAAgB,SAAQ,EAAE,EAAE;AAElC,UAAI,MAAM;AACR,cAAM,IAAI;AACV,iBAAS,KAAK,EAAE,KAAK,OAAO,KAAK,IAAI,IAAI,GAAG,WAAW,eAAe,QAAQ,IAAI,CAAC;AACnF,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,YACzF,QAAQ;AAAA,YACR;AAAA,YACA,EAAE,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,GAAI,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC,EAAG;AAAA,UACnE;AAAA,QACF;AACA,aAAK,KAAK;AAAA,MACZ,OAAO;AACL,cAAM,MAAM,MAAM,KAAK,IAAI;AAC3B,iBAAS;AAAA,UACP,EAAE,KAAK,OAAO,QAAQ,KAAK,MAAM,CAAC,GAAG,IAAI,GAAG,WAAW,eAAe,QAAQ,MAAM;AAAA,YAClF,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,YAAI,EAAE,SAAS,SAAS;AACtB,mBAAS;AAAA,YACP,EAAE;AAAA,cACA,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAAA,cACvD,QAAQ;AAAA,cACR;AAAA,cACA,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,YACrB;AAAA,UACF;AACA,gBAAM,MAAM,KAAK,MAAM;AACvB,mBAAS;AAAA,YACP,EAAE;AAAA,cACA,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,cAC/H,QAAQ;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF,OAAO;AACL,mBAAS;AAAA,YACP,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,QAAQ,MAAM,KAAK;AAAA,cACzE,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,cACvB,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,YACnC,CAAC;AAAA,UACH;AAAA,QACF;AACA,aAAK;AAAA,MACP;AAEA,UAAI,EAAE,iBAAkB,QAAO,EAAE,IAAI;AAAA,IACvC,WAAW,GAAG,SAAS,QAAQ;AAC7B,YAAM,OAAO;AACb,YAAM,KAAK,KAAK,aAAa,IAAI,KAAK;AACtC,YAAM,IAAI,GAAG,OAAO,CAACE,IAAG,MAAMA,KAAI,GAAG,CAAC,IAAI,GAAG;AAC7C,YAAM,IAAI,KAAK;AAAA,QACb,YAAY,KAAK,MAAM,WAAW,aAAa,EAAE,QAAQ;AAAA,QACzD,KAAK,IAAI,GAAG,EAAE,IAAI,KAAK,IAAI,GAAG,EAAE,IAAI,OAAO;AAAA,MAC7C;AACA,YAAM,KAAK,IAAI,IAAI,IAAI,CAAC;AACxB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,QAAQ,GAAG;AAAA,UAClD,QAAQ,UAAU;AAAA,UAClB,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,MAAM,OAAO,CAAC,GAAG,IAAI,IAAI,WAAW,eAAe,QAAQ,MAAM;AAAA,UAC3E,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,WAAK,KAAK,SAAS;AAAA,IACrB,WAAW,GAAG,SAAS,cAAc;AACnC,gBAAU,KAAK;AAAA,QACb,MAAM,GAAG;AAAA,QACT,OAAO,GAAG;AAAA,QACV,KAAK,IAAI;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO,CAAC;AAAA,MACV,CAAC;AACD,WAAK;AAAA,IACP,WAAW,GAAG,SAAS,aAAa;AAClC,YAAMC,KAAI,UAAU,UAAU,SAAS,CAAC;AACxC,UAAIA,GAAG,CAAAA,GAAE,MAAM,KAAK,EAAE,GAAG,IAAI,IAAI,OAAO,GAAG,MAAM,CAAC;AAClD,WAAK;AAAA,IACP,WAAW,GAAG,SAAS,YAAY;AACjC,YAAMA,KAAI,UAAU,IAAI;AACxB,UAAIA,IAAG;AACL,QAAAA,GAAE,QAAQ;AACV,kBAAU,KAAK;AAAA,UACb,GAAGA;AAAA,UACH,KAAKA,GAAE;AAAA,UACP,MAAM,OAAO,OAAO,IAAI;AAAA,UACxB,OAAO,OAAO,OAAO,IAAI;AAAA,QAC3B,CAAC;AAAA,MACH;AACA,WAAK;AAAA,IACP;AAAA,EACF;AAEA,aAAW,CAAC,IAAI,EAAE,KAAK;AACrB,WAAO,GAAG,QAAQ;AAChB,YAAM,KAAK,GAAG,IAAI;AAClB,cAAQ,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;AAAA,IAC1C;AAEF,QAAM,aAAa,IAAI;AAGvB,QAAM,UAA0B,CAAC;AACjC,aAAWA,MAAK,WAAW;AACzB,UAAM,MAAMA,GAAE,KACZ,OAAOA,GAAE,MACT,QAAQA,GAAE;AACZ,YAAQ;AAAA,MACN,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,OAAO,IAAI,QAAQ,IAAI,GAAG,QAAQ,IAAI,aAAa,GAAG,EAAE;AAAA,QACrF;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AAEA,UAAM,OAAO,YAAYA,GAAE,KAAK,YAAY,GAAG,WAAW,aAAa,EAAE,QAAQ;AACjF,UAAM,UAAU,QAAQ;AACxB,UAAM,eAAe,aAAa,SAAS,KAAK;AAChD,YAAQ;AAAA,MACN,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,OAAO,IAAI,IAAI,GAAG,QAAQ,GAAG;AAAA,QAC1D;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,YAAQ;AAAA,MACN,EAAE;AAAA,QACAA,GAAE,KAAK,YAAY;AAAA,QACnB,IAAI,OAAO,CAAC;AAAA,QACZ,IAAI,MAAM,EAAE;AAAA,QACZ,WAAW;AAAA,QACX;AAAA,QACA,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AACA,QAAIA,GAAE;AACJ,cAAQ;AAAA,QACN,EAAE;AAAA,UACA,IAAIA,GAAE,KAAK;AAAA,UACX,IAAI,OAAO,OAAO,CAAC;AAAA,UACnB,IAAI,MAAM,EAAE;AAAA,UACZ,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,OAAO;AAAA,QACnB;AAAA,MACF;AACF,eAAW,KAAKA,GAAE,OAAO;AACvB,cAAQ;AAAA,QACN,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,QAAQ,QAAQ,KAAK;AAAA,UACpF,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA,UAAI,EAAE;AACJ,gBAAQ;AAAA,UACN,EAAE;AAAA,YACA,IAAI,EAAE,KAAK;AAAA,YACX,IAAI,OAAO,CAAC;AAAA,YACZ,IAAI,EAAE,IAAI,EAAE;AAAA,YACZ,WAAW;AAAA,YACX,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,IACJ;AAAA,EACF;AAGA,QAAM,SAAyB,QAAQ;AAAA,IAAI,CAAC,MAC1C,EAAE;AAAA,MACA,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,OAAO,IAAI,QAAQ,IAAI,KAAK,IAAI,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE;AAAA,MAClF,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,IAAI,EAAE;AAAA,IACV;AAAA,EACF;AAGA,QAAM,QAAQ,CAAC,IAAI,MAAM;AACvB,UAAM,IAAI,KAAK,CAAC;AAChB,gBAAY;AAAA,MACV,EAAE;AAAA,QACA,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,UAAU,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC;AAAA,QAClE,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,MAAM,MAAM;AAAA,MAChB;AAAA,IACF;AACA,UAAM,KAAK,IAAI,IAAI,OAAO,CAAC;AAC3B,UAAM,OAAO,GAAG,UAAU,QAAQ,UAAU,QAAQ;AACpD,UAAM,UAAU,GAAG,UAAU,aAAa,QAAQ,SAAS,KAAK,IAAI,QAAQ;AAC5E,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,GAAG,OAAO,IAAI,IAAI,GAAG,QAAQ,MAAM;AAAA,QAC1D;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,GAAG,OAAO,OAAO,CAAC,GAAG,UAAU,QAAQ,IAAI,WAAW,MAAM,UAAU,SAAS;AAAA,QACpF,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,QAAM,UAA0B,CAAC,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ;AAEnF,QAAM,SAAS,OAAO,OAAO,OAAO,IAAI,MAAM;AAC9C,QAAM,SAAS,OAAO,aAAa,MAAM;AAEzC,QAAM,IAAIF,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AACvB,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,QAAM,WAAW,IAAI,QAAQ,CAAC;AAE9B,QAAM,OAAO;AAAA,IACX,eAAeD,SAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,yCAAyC,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,IAAI;AAAA,IAClL,eAAe,OAAO,kBAAkB,KAAK,mBAAmB,KAAK,WAAW,CAAC,WAAW,QAAQ,0CAA0C,CAAC,IAAI,QAAQ,OAAO,KAAK,yBAAyB,QAAQ,IAAI;AAAA,EAC9M;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB,UAAU;AAAA,MACV;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACjWE,SAAS,WAAW,GAAG;AACrB,QAAM,OAAO,EAAE,WAAW,IAAI,IAAI,WAAW;AAC7C,MAAI,OAAO;AACX,MAAI,EAAE,SAAS,GAAG,EAAG,QAAO;AAAA,WACnB,EAAE,SAAS,GAAG,EAAG,QAAO;AAAA,WACxB,EAAE,SAAS,IAAI,EAAG,QAAO;AAAA,WACzB,EAAE,SAAS,GAAG,EAAG,QAAO;AACjC,SAAO,EAAE,MAAM,KAAK;AACtB;AAEF,SAASI,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,mBAAmB,IAAI;AAC3D,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,cAAc,IAAI;AACtD,MAAI,SAAS,uBAAuB,eAAe,IAAI;AACvD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,MAAM,IAAI;AAC9C,MAAI,SAAS,uBAAuB,QAAQ,IAAI;AAChD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,QAAQ,IAAI;AAChD,MAAI,UAAU,uBAAuB,WAAW,IAAI;AACpD,MAAI,UAAU,uBAAuB,YAAY,IAAI;AACrD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,QAAQ,IAAI;AACjD,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,YAAY,IAAI;AACrD,MAAI,UAAU,uBAAuB,SAAS,IAAI;AAClD,MAAI,UAAU,uBAAuB,QAAQ,IAAI;AACjD,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,YAAY,IAAI;AACrD,MAAI,UAAU,uBAAuB,cAAc,IAAI;AACvD,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAG,GAAG,OAAO,KAAK;AAC3D,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,UAAM,eAAe,CAAC;AACtB,UAAM,SAAS,CAAC;AAChB,QAAI,aAAa;AACjB,UAAM,SAAS,CAAC,IAAI,OAAO,YAAY;AACrC,UAAI,KAAK,aAAa,KAAK,OAAK,EAAE,OAAO,EAAE;AAC3C,UAAI,CAAC,IAAI;AAAE,aAAK,EAAE,IAAI,OAAO,SAAS,IAAI,SAAS,CAAC,CAAC,QAAQ;AAAG,qBAAa,KAAK,EAAE;AAAA,MAAG,WAC9E,MAAO,IAAG,QAAQ;AAC3B,aAAO;AAAA,IACT;AACA,eAAW,KAAK,MAAM,OAAO,OAAO,GAAG;AACrC,UAAS,EAAE,MAAM,aAAc,cAAa;AAAA,eACnC,EAAE,MAAM,cAAe,QAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO;AAAA,eACtD,EAAE,MAAM,WAAW;AAAE,eAAO,EAAE,IAAI;AAAG,eAAO,EAAE,EAAE;AAAG,eAAO,KAAK,EAAE,EAAE;AAAA,MAAG,WACtE,EAAE,MAAM,QAAQ;AAAE,mBAAW,MAAM,EAAE,GAAG,aAAc,QAAO,EAAE;AAAG,eAAO,KAAK,EAAE,EAAE;AAAA,MAAG,WACrF,EAAE,MAAM,QAAS,QAAO,KAAK,EAAE,EAAE;AAAA,IAC5C;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,cAAc,QAAQ,WAAW;AAAA,EACzF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AACd,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AACzG,WAAO;AAAA,EACT;AACF,MAAI,SAAS,WAAW;AAAE,WAAO,EAAE,GAAG,aAAa;AAAA,EAAG;AACtD,MAAI,SAAS,SAAS,IAAI,IAAI,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AACpD,MAAI,SAAS,SAAS,IAAI,IAAI,OAAO;AACjC,WAAO,EAAE,GAAG,eAAe,IAAI,OAAO,SAAS,QAAW,SAAS,GAAG,YAAY,MAAM,QAAQ;AAAA,EAClG;AACF,MAAI,SAAS,SAAS,WAAW,KAAKC,OAAM;AACxC,WAAO,EAAE,GAAG,QAAQ,IAAI,EAAE,MAAM,QAAQ,WAAW,cAAc,KAAK,MAAMA,MAAK,KAAK,EAAE,EAAE;AAAA,EAC5F;AACF,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAQ;AACzC,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAQ;AACzC,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAS;AAC1C,MAAI,UAAU,SAAS,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC7C,MAAI,UAAU,SAAS,OAAO,MAAM;AAAE,WAAO,CAAC,OAAO,GAAG,IAAI;AAAA,EAAG;AAC/D,MAAI,UAAU,SAAS,MAAM,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AACnD,MAAI,UAAU,SAAS,MAAM,OAAO;AAChC,WAAO,EAAE,GAAG,SAAS,IAAI,EAAE,MAAM,cAAc,MAAM,KAAK,YAAY,GAAG,OAAO,SAAS,GAAG,EAAE;AAAA,EAChG;AACF,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC7C,MAAI,UAAU,SAAS,OAAO;AAC1B,WAAO,EAAE,GAAG,SAAS,IAAI,EAAE,MAAM,aAAa,OAAO,SAAS,GAAG,EAAE;AAAA,EACrE;AACF,MAAI,UAAU,WAAW;AAAE,WAAO,EAAE,GAAG,SAAS,IAAI,EAAE,MAAM,WAAW,EAAE;AAAA,EAAG;AAC5E,MAAI,UAAU,WAAW;AAErB,WAAO,EAAE,GAAG,SAAS;AAAA,EACvB;AACF,MAAI,UAAU,SAAS,MAAM,OAAO,KAAK,IAAIA,OAAM;AAC/C,UAAM,EAAE,MAAM,KAAK,IAAI,WAAW,KAAK;AACvC,WAAO,EAAE,GAAG,WAAW,MAAM,IAAI,IAAI;AAAA,MACnC,MAAM;AAAA,MAAW;AAAA,MAAM;AAAA,MAAI,MAAMA,MAAK,KAAK;AAAA,MAAG;AAAA,MAAM;AAAA,MACpD,GAAI,QAAQ,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAAA,MAC9C,GAAI,QAAQ,MAAM,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAAA,IAClD,EAAE;AAAA,EACJ;AACF,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBD,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQE,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASK,WAAU;AAC/C,WAAO,IAAIP,kBAAgB,SAAS,MAAM,MAAMO,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBL,WAAU,OAAOK,WAAU;AAC3D,WAAO,IAAIP;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,oBAAoB;AACzB,QAAI,OAAO,YAAY;AACrB,WAAK,yBAAyB;AAC9B,UAAI,OAAO,YAAY;AACrB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,iBAAK,kBAAkB;AACvB,gBAAI,OAAO,YAAY;AACrB,mBAAK,mBAAmB;AACxB,kBAAI,OAAO,YAAY;AACrB,qBAAK,sBAAsB;AAC3B,oBAAI,OAAO,YAAY;AACrB,uBAAK,iBAAiB;AACtB,sBAAI,OAAO,YAAY;AACrB,yBAAK,mBAAmB;AAAA,kBAC1B;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AACA,aAAK,MAAM,UAAU,IAAI,WAAW;AACpC,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,2BAA2B;AAClC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,WAAW;AAChB,eAAK,MAAM,OAAO,aAAa,CAAC;AAChC,cAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,oBAAoB;AACzB,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,cACxB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP;AACA,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,UACxB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAEjD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,uBAAuB;AAC5B,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,iBAAiB;AACtB,gBAAI,OAAO,YAAY;AACrB,mBAAK,WAAW;AAChB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,qBAAK;AACL;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK,WAAW;AAChB,sBAAM,oBAAoB;AAC1B,oBAAI,QAAQ,YAAY;AACtB,wBAAM,iBAAiB;AACvB,sBAAI,QAAQ,YAAY;AACtB,mCAAe;AACf,yBAAK,OAAO,IAAI,IAAI,GAAG;AAAA,kBACzB,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI;AAER,SAAK;AACL,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO;AAAA,IACd;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,MAAM,OAAO,aAAa,CAAC;AAChC,YAAI,GAAG,YAAY,MAAM,SAAS;AAChC,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO;AAAA,QACd;AACA,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,eAAe;AACpB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,IAAI,EAAE;AAAA,UACrB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,SAAS;AAChC,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,CAAC;AAChC,YAAI,GAAG,YAAY,MAAM,SAAS;AAChC,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,aAAa,CAAC;AAChC,cAAI,GAAG,YAAY,MAAM,SAAS;AAChC,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,OAAO,aAAa,CAAC;AAChC,gBAAI,GAAG,YAAY,MAAM,SAAS;AAChC,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,MAAM,OAAO,aAAa,CAAC;AAChC,kBAAI,GAAG,YAAY,MAAM,SAAS;AAChC,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,IAAI,EAAE;AAAA,MACrB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,SAAS;AAChC,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ;AAAA,MACf,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,EAAE;AACjC,UAAI,GAAG,YAAY,MAAM,SAAS;AAChC,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ;AAAA,UACf,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AAEtD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,eAAe;AACpB,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,kBAAM,WAAW;AACjB,kBAAM,oBAAoB;AAC1B,gBAAI,QAAQ,YAAY;AACtB,oBAAM,iBAAiB;AACvB,kBAAI,QAAQ,YAAY;AACtB,+BAAe;AACf,qBAAK,QAAQ,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,cAClC,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AC1qDO,IAAM,WAA4C;AAAA,EACvD,aAAa,OAAiC;AAC5C,WAAcE,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAAiC;AACzC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAsB,OAAoC;AAC/D,WAAO,eAAe,IAAI,KAAK;AAAA,EACjC;AACF;;;ACLO,SAAS,YAAY,KAAc,IAAY,IAAsC;AAC1F,QAAM,KAAK,IAAI,IAAI,IAAI,QAAQ;AAC/B,QAAM,KAAK,IAAI,IAAI,IAAI,SAAS;AAChC,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,KAAK;AAChB,MAAI,OAAO,KAAK,OAAO,EAAG,QAAO,EAAE,GAAG,IAAI,GAAG,GAAG;AAChD,QAAM,KAAK,IAAI,QAAQ;AACvB,QAAM,KAAK,IAAI,SAAS;AACxB,QAAM,QAAQ,IAAI,KAAK,IAAI,KAAK,IAAI,EAAE,IAAI,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE;AAC/D,SAAO,EAAE,GAAG,KAAK,KAAK,OAAO,GAAG,KAAK,KAAK,MAAM;AAClD;AAyBO,SAAS,aACd,MACA,IAIA;AACA,QAAM,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,QAAQ,GAAG,GAAG,KAAK,IAAI,KAAK,SAAS,EAAE;AACrE,QAAM,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,EAAE;AAC7D,SAAO;AAAA,IACL,OAAO,YAAY,MAAM,GAAG,GAAG,GAAG,CAAC;AAAA,IACnC,KAAK,YAAY,IAAI,GAAG,GAAG,GAAG,CAAC;AAAA,EACjC;AACF;;;ACfA,SAAS,UAAU,SAAiB,QAA2B;AAC7D,SAAO;AAAA,IACL,IAAI,WAAW,OAAO,IAAI,MAAM;AAAA,IAChC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,cAAc;AAAA,EAChB;AACF;AA8CA,SAASC,cACP,OACAC,QACA,aACqB;AACrB,QAAM,QAAQ,oBAAI,IAAoB;AACtC,aAAW,KAAK,MAAO,OAAM,IAAI,EAAE,IAAI,CAAC;AACxC,QAAM,UAAU,CAAC,OAAwB,MAAM,IAAI,EAAE;AAErD,WAAS,OAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ;AAC9C,QAAI,UAAU;AACd,aAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,KAAK;AACrC,UAAI,aAAa,IAAI,CAAC,EAAG;AACzB,YAAM,IAAIA,OAAM,CAAC;AACjB,UAAI,CAAC,QAAQ,EAAE,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAG;AACxC,YAAM,OAAO,MAAM,IAAI,EAAE,IAAI,IAAK;AAClC,UAAI,MAAM,IAAI,EAAE,EAAE,IAAK,MAAM;AAC3B,cAAM,IAAI,EAAE,IAAI,IAAI;AACpB,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,CAAC,QAAS;AAAA,EAChB;AACA,SAAO;AACT;AAYA,SAAS,gBAAgB,OAA6BA,QAA0C;AAE9F,QAAM,MAAM,oBAAI,IAAoD;AACpE,aAAW,KAAK,MAAO,KAAI,IAAI,EAAE,IAAI,CAAC,CAAC;AACvC,EAAAA,OAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,UAAMC,QAAO,IAAI,IAAI,EAAE,IAAI;AAC3B,QAAIA,MAAM,CAAAA,MAAK,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC;AAAA,EAC9C,CAAC;AAED,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,YAAY,oBAAI,IAAY;AAElC,aAAW,aAAa,OAAO;AAC7B,QAAI,QAAQ,IAAI,UAAU,EAAE,EAAG;AAG/B,UAAMC,SAA+C,CAAC;AACtD,YAAQ,IAAI,UAAU,EAAE;AACxB,YAAQ,IAAI,UAAU,EAAE;AACxB,IAAAA,OAAM,KAAK,EAAE,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;AAE1C,WAAOA,OAAM,SAAS,GAAG;AACvB,YAAM,QAAQA,OAAMA,OAAM,SAAS,CAAC;AACpC,YAAM,YAAY,IAAI,IAAI,MAAM,EAAE,KAAK,CAAC;AAExC,UAAI,MAAM,UAAU,UAAU,QAAQ;AACpC,gBAAQ,OAAO,MAAM,EAAE;AACvB,QAAAA,OAAM,IAAI;AAAA,MACZ,OAAO;AACL,cAAM,EAAE,IAAI,QAAQ,IAAI,UAAU,MAAM,MAAM;AAC9C,cAAM;AAEN,YAAI,QAAQ,IAAI,EAAE,GAAG;AACnB,oBAAU,IAAI,OAAO;AAAA,QACvB,WAAW,CAAC,QAAQ,IAAI,EAAE,GAAG;AAC3B,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,EAAE;AACd,UAAAA,OAAM,KAAK,EAAE,IAAI,IAAI,QAAQ,EAAE,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAmBA,SAAS,iBACP,OACAF,QACA,OACA,aAMA;AACA,QAAM,WAAwB,CAAC,GAAG,KAAK;AACvC,QAAM,WAAwB,CAAC;AAC/B,QAAM,iBAAiB,oBAAI,IAAY;AACvC,QAAM,cAAc,oBAAI,IAAsB;AAE9C,WAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,KAAK;AACrC,UAAM,IAAIA,OAAM,CAAC;AAEjB,QAAI,YAAY,IAAI,CAAC,GAAG;AAEtB,qBAAe,IAAI,SAAS,MAAM;AAClC,eAAS,KAAK,CAAC;AACf;AAAA,IACF;AAEA,UAAM,KAAK,MAAM,IAAI,EAAE,IAAI,KAAK;AAChC,UAAM,KAAK,MAAM,IAAI,EAAE,EAAE,KAAK;AAC9B,UAAM,OAAO,KAAK;AAElB,QAAI,QAAQ,GAAG;AAEb,eAAS,KAAK,CAAC;AACf;AAAA,IACF;AAGA,UAAM,UAAoB,CAAC;AAC3B,aAAS,MAAM,GAAG,MAAM,OAAO,GAAG,OAAO;AACvC,YAAM,IAAI,UAAU,GAAG,GAAG;AAC1B,eAAS,KAAK,CAAC;AACf,YAAM,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG;AAC5B,cAAQ,KAAK,EAAE,EAAE;AAAA,IACnB;AACA,gBAAY,IAAI,GAAG,OAAO;AAG1B,UAAM,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE;AACvC,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,eAAS,KAAK,EAAE,MAAM,MAAM,CAAC,GAAI,IAAI,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,IACtD;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,UAAU,gBAAgB,YAAY;AAC3D;AASA,SAAS,WACP,SACAA,QACA,aACQ;AACR,QAAM,YAAY,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAE1D,QAAM,WAAW,oBAAI,IAAsB;AAC3C,aAAW,CAAC,EAAE,EAAE,KAAK,QAAS,YAAW,KAAK,GAAI,UAAS,IAAI,EAAE,IAAI,CAAC,CAAC;AACvE,EAAAA,OAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,QAAI,YAAY,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAI;AAC3C,aAAS,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE;AAAA,EACjC,CAAC;AAED,MAAI,KAAK;AACT,WAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,UAAM,kBAAkB,QAAQ,IAAI,UAAU,IAAI,CAAC,CAAE,GAAI,QAAQ,IAAI,UAAU,CAAC,CAAE,GAAI,QAAQ;AAAA,EAChG;AACA,SAAO;AACT;AAEA,SAAS,kBACP,YACA,YACA,UACQ;AACR,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,QAAQ,CAAC,GAAG,MAAM,SAAS,IAAI,EAAE,IAAI,CAAC,CAAC;AAElD,QAAM,YAAsB,WAAW;AAAA,IAAQ,CAAC,OAC7C,SAAS,IAAI,EAAE,EAAE,KAAK,CAAC,GACrB,OAAO,CAAC,QAAQ,SAAS,IAAI,GAAG,CAAC,EACjC,IAAI,CAAC,QAAQ,SAAS,IAAI,GAAG,CAAE,EAC/B,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EACzB;AACA,MAAI,UAAU,WAAW,EAAG,QAAO;AAEnC,MAAI,aAAa;AACjB,SAAO,aAAa,WAAW,OAAQ,gBAAe;AACtD,QAAM,WAAW,IAAI,aAAa;AAClC,gBAAc;AACd,QAAMG,QAAO,IAAI,MAAc,QAAQ,EAAE,KAAK,CAAC;AAE/C,MAAI,KAAK;AACT,aAAW,OAAO,WAAW;AAC3B,QAAI,MAAM,MAAM;AAChB,IAAAA,MAAK,GAAG,KAAKA,MAAK,GAAG,KAAK,KAAK;AAC/B,QAAI,YAAY;AAChB,WAAO,MAAM,GAAG;AACd,UAAI,MAAM,MAAM,EAAG,cAAaA,MAAK,MAAM,CAAC;AAC5C,YAAO,MAAM,KAAM;AACnB,MAAAA,MAAK,GAAG,KAAKA,MAAK,GAAG,KAAK,KAAK;AAAA,IACjC;AACA,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAuBA,SAASC,mBACP,SACAJ,QACA,aAC0B;AAC1B,QAAM,UAAU,oBAAI,IAAsB;AAC1C,QAAM,UAAU,oBAAI,IAAsB;AAC1C,aAAW,CAAC,EAAE,EAAE,KAAK,SAAS;AAC5B,eAAW,KAAK,IAAI;AAClB,cAAQ,IAAI,EAAE,IAAI,CAAC,CAAC;AACpB,cAAQ,IAAI,EAAE,IAAI,CAAC,CAAC;AAAA,IACtB;AAAA,EACF;AACA,EAAAA,OAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,QAAI,YAAY,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAI;AAC3C,YAAQ,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI;AAC9B,YAAQ,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE;AAAA,EAChC,CAAC;AAED,QAAM,YAAY,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAE1D,QAAM,YAAY,oBAAI,IAAuB;AAC7C,QAAM,aAAa,oBAAI,IAAoB;AAC3C,aAAW,CAAC,IAAI,EAAE,KAAK;AACrB,eAAW,KAAK,IAAI;AAClB,gBAAU,IAAI,EAAE,IAAI,CAAC;AACrB,iBAAW,IAAI,EAAE,IAAI,EAAE;AAAA,IACzB;AAKF,WAAS,YAAsC;AAC7C,UAAM,UAAU,oBAAI,IAAY;AAChC,UAAM,SAAS,oBAAI,IAAyB;AAC5C,eAAW,KAAK,UAAW,QAAO,IAAI,GAAG,CAAC,CAAC;AAE3C,aAAS,IAAI,GAAiB;AAC5B,UAAI,QAAQ,IAAI,CAAC,EAAG;AACpB,cAAQ,IAAI,CAAC;AACb,YAAM,KAAK,WAAW,IAAI,CAAC;AAC3B,UAAI,OAAO,OAAW,QAAO,IAAI,EAAE,GAAG,KAAK,UAAU,IAAI,CAAC,CAAE;AAC5D,iBAAW,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,EAAG,KAAI,CAAC;AAAA,IAC7C;AAGA,UAAM,WAAW,CAAC,GAAG,UAAU,KAAK,CAAC,EAAE;AAAA,MACrC,CAAC,GAAG,OAAO,WAAW,IAAI,CAAC,KAAK,MAAM,WAAW,IAAI,CAAC,KAAK;AAAA,IAC7D;AACA,eAAW,KAAK,SAAU,KAAI,CAAC;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,UAAU;AACxB,QAAM,aAAa,oBAAI,IAAoB;AAC3C,WAAS,aAAmB;AAC1B,eAAW,CAAC,EAAE,EAAE,KAAK,MAAO,IAAG,QAAQ,CAAC,GAAG,MAAM,WAAW,IAAI,EAAE,IAAI,CAAC,CAAC;AAAA,EAC1E;AACA,aAAW;AAKX,WAAS,UACP,UACA,aACA,WACM;AACN,UAAM,OAAO,MAAM,IAAI,QAAQ;AAE/B,UAAM,UAAU,KAAK,IAAI,CAAC,MAAM,YAAY;AAC1C,YAAM,QAAQ,YAAY,IAAI,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,WAAW,IAAI,CAAC,CAAC;AAC7E,UAAI,KAAK,WAAW,EAAG,QAAO,EAAE,MAAM,YAAY,QAAiC,QAAQ;AAC3F,YAAM,MAAM,KAAK,OAAO,CAAC,GAAG,QAAQ,IAAI,WAAW,IAAI,GAAG,GAAI,CAAC;AAC/D,aAAO,EAAE,MAAM,YAAY,MAAM,KAAK,QAAQ,QAAQ;AAAA,IACxD,CAAC;AAED,UAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,eAAe,MAAS;AACjE,UAAM,aAAa,QAChB,OAAO,CAAC,MAAM,EAAE,eAAe,MAAS,EACxC,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAEvC,aAAS,KAAK,CAAC,GAAG,MAAM;AACtB,UAAI,EAAE,eAAgB,EAAE,WAAa,QAAO,EAAE,aAAc,EAAE;AAC9D,aAAO,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE;AAAA,IAC3D,CAAC;AAED,UAAM,SAAsB,CAAC;AAC7B,QAAI,UAAU;AAGd,aAAS,oBAA0B;AACjC,aAAO,WAAW,UAAU,WAAW,WAAW,SAAS,CAAC,EAAG,WAAW,SAAS;AACjF,eAAO,KAAK,WAAW,IAAI,EAAG,IAAI;AAClC;AAAA,MACF;AAAA,IACF;AAEA,sBAAkB;AAClB,eAAW,SAAS,UAAU;AAC5B,aAAO,KAAK,MAAM,IAAI;AACtB;AACA,wBAAkB;AAAA,IACpB;AAEA,UAAM,IAAI,UAAU,MAAM;AAC1B,eAAW;AAAA,EACb;AAEA,MAAI,SAAS,WAAW,OAAOA,QAAO,WAAW;AACjD,QAAM,OAAO,oBAAI,IAAyB;AAC1C,aAAW,CAAC,GAAG,CAAC,KAAK,MAAO,MAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;AAE9C,WAAS,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,YAAY;AACjE,UAAM,YAAY,OAAO,KAAK;AAC9B,QAAI,OAAO,MAAM,GAAG;AAElB,eAAS,KAAK,GAAG,KAAK,UAAU,QAAQ,KAAM,WAAU,UAAU,EAAE,GAAI,SAAS,SAAS;AAAA,IAC5F,OAAO;AAEL,eAAS,KAAK,UAAU,SAAS,GAAG,MAAM,GAAG;AAC3C,kBAAU,UAAU,EAAE,GAAI,SAAS,SAAS;AAAA,IAChD;AACA,UAAM,KAAK,WAAW,OAAOA,QAAO,WAAW;AAC/C,QAAI,KAAK,QAAQ;AACf,iBAAW;AACX,eAAS;AACT,iBAAW,CAAC,GAAG,CAAC,KAAK,MAAO,MAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA,IAChD,WAAW,OAAO,QAAQ;AACxB,iBAAW,CAAC,GAAG,CAAC,KAAK,MAAO,MAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AACT;AAaA,SAAS,qBACP,SACAA,QACA,aACA,MACA,SACA,UACA,QACsE;AACtE,QAAM,QAAQ,CAAC,MAAkB,OAAO,EAAE,SAAS,EAAE;AACrD,QAAM,QAAQ,CAAC,MAAkB,OAAO,EAAE,QAAQ,EAAE;AACpD,QAAM,UAAU,CAAC,OAAe,GAAG,WAAW,UAAU;AAExD,QAAM,WAAW,oBAAI,IAAuB;AAC5C,aAAW,CAAC,EAAE,EAAE,KAAK,QAAS,YAAW,KAAK,GAAI,UAAS,IAAI,EAAE,IAAI,CAAC;AAKtE,WAAS,IAAI,GAAW,GAAmB;AACzC,QAAI,QAAQ,CAAC,KAAK,QAAQ,CAAC,EAAG,QAAO;AACrC,UAAM,KAAK,SAAS,IAAI,CAAC;AACzB,UAAM,KAAK,SAAS,IAAI,CAAC;AACzB,WAAO,MAAM,EAAE,IAAI,IAAI,UAAU,MAAM,EAAE,IAAI;AAAA,EAC/C;AAEA,QAAM,YAAY,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC1D,QAAM,YAAY,UAAU;AAC5B,QAAM,aAAyB,UAAU,IAAI,CAAC,OAAO,QAAQ,IAAI,EAAE,EAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAGtF,QAAM,eAAe,oBAAI,IAAoB;AAC7C,WAAS,KAAK,GAAG,KAAK,WAAW,MAAM;AACrC,eAAW,MAAM,WAAW,EAAE,EAAI,cAAa,IAAI,IAAI,EAAE;AAAA,EAC3D;AAEA,QAAM,UAAU,oBAAI,IAAsB;AAC1C,QAAM,UAAU,oBAAI,IAAsB;AAC1C,aAAW,CAAC,EAAE,EAAE,KAAK;AACnB,eAAW,KAAK,IAAI;AAClB,cAAQ,IAAI,EAAE,IAAI,CAAC,CAAC;AACpB,cAAQ,IAAI,EAAE,IAAI,CAAC,CAAC;AAAA,IACtB;AACF,EAAAA,OAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,QAAI,YAAY,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,GAAI;AAC3C,YAAQ,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,IAAI;AAC9B,YAAQ,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE;AAAA,EAChC,CAAC;AAID,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,KAAK,CAAC,GAAW,MAAe,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC;AACvE,QAAM,cAAc,CAAC,GAAW,MAAc,UAAU,IAAI,GAAG,GAAG,CAAC,CAAC;AACpE,QAAM,cAAc,CAAC,GAAW,MAAc,UAAU,IAAI,GAAG,GAAG,CAAC,CAAC;AAEpE,WAAS,KAAK,GAAG,KAAK,WAAW,MAAM;AACrC,UAAM,YAAY,WAAW,KAAK,CAAC;AACnC,UAAM,QAAQ,WAAW,EAAE;AAE3B,UAAM,UAAU,oBAAI,IAAoB;AACxC,cAAU,QAAQ,CAAC,IAAI,MAAM,QAAQ,IAAI,IAAI,CAAC,CAAC;AAE/C,QAAI,KAAK;AACT,QAAI,UAAU;AACd,UAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AAEvC,UAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,UAAI;AACJ,UAAI,QAAQ,CAAC,GAAG;AACd,mBAAW,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG;AACpC,cAAI,QAAQ,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG;AAChC,2BAAe,QAAQ,IAAI,CAAC;AAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,YAAM,KAAK,iBAAiB,SAAY,eAAe,UAAU;AAEjE,UAAI,iBAAiB,UAAa,MAAM,UAAU;AAChD,iBAAS,KAAK,SAAS,MAAM,GAAG,MAAM;AACpC,gBAAM,KAAK,MAAM,EAAE;AACnB,qBAAW,KAAK,QAAQ,IAAI,EAAE,KAAK,CAAC,GAAG;AACrC,gBAAI,CAAC,QAAQ,IAAI,CAAC,EAAG;AACrB,kBAAM,OAAO,QAAQ,IAAI,CAAC;AAC1B,iBAAK,OAAO,MAAM,OAAO,OAAO,EAAE,QAAQ,CAAC,KAAK,QAAQ,EAAE,IAAI;AAC5D,0BAAY,GAAG,EAAE;AAAA,YACnB;AAAA,UACF;AAAA,QACF;AACA,kBAAU,IAAI;AACd,aAAK;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAMA,WAAS,kBACP,aACA,YAC2D;AAC3D,UAAM,OAAO,oBAAI,IAAoB;AACrC,UAAM,QAAQ,oBAAI,IAAoB;AACtC,UAAM,MAAM,oBAAI,IAAoB;AAEpC,eAAW,SAAS,aAAa;AAC/B,YAAM,QAAQ,CAAC,GAAG,MAAM;AACtB,aAAK,IAAI,GAAG,CAAC;AACb,cAAM,IAAI,GAAG,CAAC;AACd,YAAI,IAAI,GAAG,CAAC;AAAA,MACd,CAAC;AAAA,IACH;AAEA,eAAW,SAAS,aAAa;AAC/B,UAAI,UAAU;AACd,iBAAW,KAAK,OAAO;AAErB,cAAM,QAAQ,WAAW,CAAC;AAC1B,YAAI,CAAC,MAAM,OAAQ;AAEnB,cAAM,KAAK,MAAM,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC,IAAK,IAAI,IAAI,CAAC,CAAE;AACnF,YAAI,GAAG,WAAW,EAAG;AAErB,cAAM,MAAM,GAAG,SAAS,KAAK;AAC7B,iBAAS,KAAK,KAAK,MAAM,EAAE,GAAG,OAAO,KAAK,KAAK,EAAE,GAAG,MAAM,MAAM,MAAM;AACpE,gBAAM,IAAI,GAAG,EAAE;AACf,gBAAM,OAAO,IAAI,IAAI,CAAC;AACtB,cAAI,MAAM,IAAI,CAAC,MAAM,KAAK,UAAU,QAAQ,CAAC,YAAY,GAAG,CAAC,GAAG;AAC9D,kBAAM,IAAI,GAAG,CAAC;AACd,iBAAK,IAAI,GAAG,KAAK,IAAI,CAAC,CAAE;AACxB,kBAAM,IAAI,GAAG,KAAK,IAAI,CAAC,CAAE;AACzB,sBAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAGA,WAAS,qBACP,aACA,MACqB;AACrB,UAAM,YAAY,oBAAI,IAAiC;AACvD,UAAM,YAAY,oBAAI,IAAiC;AAEvD,aAAS,YAAY,GAAiB;AACpC,UAAI,CAAC,UAAU,IAAI,CAAC,GAAG;AACrB,kBAAU,IAAI,GAAG,oBAAI,IAAI,CAAC;AAC1B,kBAAU,IAAI,GAAG,oBAAI,IAAI,CAAC;AAAA,MAC5B;AAAA,IACF;AAEA,eAAW,SAAS,aAAa;AAC/B,UAAI;AACJ,iBAAW,KAAK,OAAO;AACrB,cAAM,KAAK,KAAK,IAAI,CAAC;AACrB,oBAAY,EAAE;AACd,YAAI,WAAW,QAAW;AACxB,gBAAM,KAAK,KAAK,IAAI,MAAM;AAC1B,cAAI,OAAO,IAAI;AACb,kBAAM,IAAI,IAAI,QAAQ,CAAC;AACvB,kBAAM,OAAO,UAAU,IAAI,EAAE,EAAG,IAAI,EAAE,KAAK;AAC3C,gBAAI,IAAI,MAAM;AACZ,wBAAU,IAAI,EAAE,EAAG,IAAI,IAAI,CAAC;AAC5B,wBAAU,IAAI,EAAE,EAAG,IAAI,IAAI,CAAC;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AACA,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,KAAK,oBAAI,IAAoB;AAEnC,aAAS,QACP,SACA,QACM;AACN,YAAME,SAAQ,CAAC,GAAG,UAAU,KAAK,CAAC;AAClC,YAAM,UAAU,oBAAI,IAAY;AAChC,aAAOA,OAAM,SAAS,GAAG;AACvB,cAAM,OAAOA,OAAMA,OAAM,SAAS,CAAC;AACnC,YAAI,QAAQ,IAAI,IAAI,GAAG;AACrB,UAAAA,OAAM,IAAI;AACV,kBAAQ,IAAI;AAAA,QACd,OAAO;AACL,kBAAQ,IAAI,IAAI;AAChB,qBAAW,OAAO,OAAO,IAAI,EAAG,CAAAA,OAAM,KAAK,GAAG;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAGA;AAAA,MACE,CAAC,SAAS;AACR,YAAI,MAAM;AACV,mBAAW,CAAC,MAAM,CAAC,KAAK,UAAU,IAAI,IAAI,KAAK,oBAAI,IAAI;AACrD,gBAAM,KAAK,IAAI,MAAM,GAAG,IAAI,IAAI,KAAK,KAAK,CAAC;AAC7C,WAAG,IAAI,MAAM,GAAG;AAAA,MAClB;AAAA,MACA,CAAC,SAAS,UAAU,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAC5C;AAGA;AAAA,MACE,CAAC,SAAS;AACR,cAAM,QAAQ,UAAU,IAAI,IAAI;AAChC,YAAI,SAAS,MAAM,OAAO,GAAG;AAC3B,cAAI,MAAM;AACV,qBAAW,CAAC,IAAI,CAAC,KAAK,MAAO,OAAM,KAAK,IAAI,MAAM,GAAG,IAAI,EAAE,KAAK,KAAK,CAAC;AACtE,cAAI,QAAQ,SAAU,IAAG,IAAI,MAAM,KAAK,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC;AAAA,QACrE;AAAA,MACF;AAAA,MACA,CAAC,SAAS,UAAU,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAC5C;AAGA,eAAW,SAAS,aAAa;AAC/B,iBAAW,KAAK,MAAO,IAAG,IAAI,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC,CAAE,CAAE;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAGA,QAAM,MAAM,oBAAI,IAAiC;AAEjD,aAAW,QAAQ,CAAC,KAAK,GAAG,GAAY;AACtC,UAAM,aAAa,SAAS,MAAM,aAAa,CAAC,GAAG,UAAU,EAAE,QAAQ;AACvE,eAAW,SAAS,CAAC,KAAK,GAAG,GAAY;AACvC,YAAM,cACJ,UAAU,MAAM,WAAW,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,EAAE,QAAQ,CAAC,IAAI;AACpE,YAAM,aACJ,SAAS,MAAM,CAAC,MAAc,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAc,QAAQ,IAAI,CAAC,KAAK,CAAC;AAEzF,YAAM,EAAE,KAAK,IAAI,kBAAkB,aAAa,UAAU;AAC1D,UAAI,KAAK,qBAAqB,aAAa,IAAI;AAE/C,UAAI,UAAU,KAAK;AAEjB,cAAM,MAAM,oBAAI,IAAoB;AACpC,mBAAW,CAAC,GAAG,CAAC,KAAK,GAAI,KAAI,IAAI,GAAG,CAAC,CAAC;AACtC,aAAK;AAAA,MACP;AACA,UAAI,IAAI,OAAO,OAAO,EAAE;AAAA,IAC1B;AAAA,EACF;AAIA,QAAM,aAAa,CAAC,MAAM,MAAM,MAAM,IAAI;AAC1C,QAAM,eAAe,oBAAI,IAAsB;AAC/C,aAAW,MAAM,SAAS,KAAK,GAAG;AAChC,QAAI,CAAC,QAAQ,EAAE,EAAG;AAClB,UAAM,OAAO,WAAW,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC;AAC3D,iBAAa,IAAI,IAAI,IAAI;AAAA,EAC3B;AAGA,MAAI,UAAU;AACd,MAAI,aAAa,IAAI,IAAI,IAAI;AAC7B,aAAW,CAAC,EAAE,EAAE,KAAK,KAAK;AACxB,QAAI,KAAK,UACP,KAAK;AACP,eAAW,CAAC,IAAI,CAAC,KAAK,IAAI;AACxB,YAAM,IAAI,SAAS,IAAI,EAAE;AACzB,UAAI,CAAC,EAAG;AACR,YAAM,OAAO,MAAM,CAAC,IAAI;AACxB,WAAK,KAAK,IAAI,IAAI,IAAI,IAAI;AAC1B,WAAK,KAAK,IAAI,IAAI,IAAI,IAAI;AAAA,IAC5B;AACA,QAAI,KAAK,KAAK,SAAS;AACrB,gBAAU,KAAK;AACf,mBAAa;AAAA,IACf;AAAA,EACF;AAGA,QAAM,UAAU,CAAC,GAAG,WAAW,OAAO,CAAC;AACvC,QAAM,SAAS,KAAK,IAAI,GAAG,OAAO;AAClC,QAAM,SAAS,KAAK,IAAI,GAAG,OAAO;AAElC,aAAW,CAAC,KAAK,EAAE,KAAK,KAAK;AAC3B,QAAI,OAAO,WAAY;AACvB,UAAM,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC;AAC5B,UAAM,UAAU,IAAI,SAAS,GAAG;AAChC,UAAM,QAAQ,UAAU,SAAS,KAAK,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK,IAAI,GAAG,IAAI;AAC9E,QAAI,UAAU,GAAG;AACf,YAAM,UAAU,oBAAI,IAAoB;AACxC,iBAAW,CAAC,IAAI,CAAC,KAAK,GAAI,SAAQ,IAAI,IAAI,IAAI,KAAK;AACnD,UAAI,IAAI,KAAK,OAAO;AAAA,IACtB;AAAA,EACF;AAGA,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,GAAI;AACjC,UAAM,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAChF,aAAS,IAAI,MAAM,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,KAAK,MAAM,CAAC;AAAA,EACxD;AAOA,QAAM,sBAAsB;AAE5B,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,SAAS,CAAC,OAAuB;AACrC,QAAI,IAAI,SAAS,IAAI,EAAE,KAAK;AAC5B,WAAO,SAAS,IAAI,CAAC,MAAM,UAAa,SAAS,IAAI,CAAC,MAAM,EAAG,KAAI,SAAS,IAAI,CAAC;AACjF,aAAS,IAAI,IAAI,CAAC;AAClB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,CAAC,GAAW,MAAoB;AAC9C,UAAM,KAAK,OAAO,CAAC,GACjB,KAAK,OAAO,CAAC;AACf,QAAI,OAAO,GAAI,UAAS,IAAI,IAAI,EAAE;AAAA,EACpC;AAEA,EAAAF,OAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,QAAI,YAAY,IAAI,CAAC,KAAK,KAAK,SAAS,KAAK,GAAI;AACjD,QAAI,QAAQ,KAAK,IAAI,KAAK,QAAQ,KAAK,EAAE,EAAG;AAE5C,UAAM,YAAY,aAAa,IAAI,KAAK,IAAI;AAC5C,UAAM,UAAU,aAAa,IAAI,KAAK,EAAE;AACxC,QAAI,cAAc,UAAa,YAAY,OAAW;AACtD,QAAI,KAAK,IAAI,UAAU,SAAS,MAAM,EAAG;AAEzC,UAAM,QAAQ,SAAS,IAAI,KAAK,IAAI;AACpC,UAAM,MAAM,SAAS,IAAI,KAAK,EAAE;AAChC,QAAI,UAAU,UAAa,QAAQ,OAAW;AAC9C,QAAI,KAAK,IAAI,QAAQ,GAAG,IAAI,oBAAqB;AAEjD,YAAQ,KAAK,MAAM,KAAK,EAAE;AAAA,EAC5B,CAAC;AAGD,QAAM,WAAW,oBAAI,IAAsB;AAC3C,aAAW,MAAM,SAAS,KAAK,GAAG;AAChC,QAAI,QAAQ,EAAE,EAAG;AACjB,UAAM,OAAO,OAAO,EAAE;AACtB,QAAI,CAAC,SAAS,IAAI,IAAI,EAAG,UAAS,IAAI,MAAM,CAAC,CAAC;AAC9C,aAAS,IAAI,IAAI,EAAG,KAAK,EAAE;AAAA,EAC7B;AACA,aAAW,WAAW,SAAS,OAAO,GAAG;AACvC,QAAI,QAAQ,SAAS,EAAG;AACxB,UAAM,KAAK,QAAQ,IAAI,CAAC,OAAO,SAAS,IAAI,EAAE,CAAE,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACtE,UAAM,OACJ,GAAG,SAAS,MAAM,IACd,GAAG,KAAK,MAAM,GAAG,SAAS,CAAC,CAAC,KAC3B,GAAG,GAAG,SAAS,IAAI,CAAC,IAAK,GAAG,GAAG,SAAS,CAAC,KAAM;AACtD,eAAW,MAAM,QAAS,UAAS,IAAI,IAAI,IAAI;AAAA,EACjD;AAGA,MAAI,UAAU;AACd,aAAW,CAAC,IAAI,EAAE,KAAK,UAAU;AAC/B,UAAM,IAAI,SAAS,IAAI,EAAE;AACzB,QAAI,EAAG,WAAU,KAAK,IAAI,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC;AAAA,EACtD;AACA,QAAM,QAAQ,UAAU,SAAS,OAAO,IAAI,UAAU;AAGtD,QAAM,UAAU,oBAAI,IAAqB;AACzC,MAAI,cAAc;AAElB,WAAS,KAAK,GAAG,KAAK,WAAW,MAAM;AACrC,UAAM,WAAW,UAAU,EAAE;AAC7B,UAAM,KAAK,QAAQ,IAAI,QAAQ;AAC/B,UAAM,YAAY,GAAG,SAAS,IAAI,KAAK,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI;AAE/D,eAAW,QAAQ,IAAI;AACrB,YAAM,MAAM,SAAS,IAAI,KAAK,EAAE,KAAK,KAAK;AAC1C,YAAM,YAAY,KAAK,MAAM,IAAI,IAAI;AACrC,YAAM,WACJ,QAAQ,KAAK,EAAE,KAAK,KAAK,IACrB,cAAc,WAAW,IACzB,eAAe,YAAY,MAAM,IAAI,KAAK;AAEhD,cAAQ,IAAI,KAAK,IAAI;AAAA,QACnB,IAAI,KAAK;AAAA,QACT,GAAG,OAAO,WAAW;AAAA,QACrB,GAAG,OAAO,YAAY;AAAA,QACtB,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,MACf,CAAC;AAAA,IACH;AACA,mBAAe,YAAY;AAAA,EAC7B;AAEA,SAAO,EAAE,OAAO,SAAS,aAAa;AACxC;AAIO,SAAS,cACd,OACAA,QACA,UAA0B,CAAC,GACZ;AACf,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,OAAO,cAAc;AAE3B,MAAI,MAAM,WAAW;AACnB,WAAO;AAAA,MACL,OAAO,oBAAI,IAAI;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,QAAQ,SAAS;AAAA,MACjB,WAAW,oBAAI,IAAI;AAAA,MACnB,cAAc,oBAAI,IAAI;AAAA,MACtB,eAAe,oBAAI,IAAI;AAAA,IACzB;AAGF,QAAM,YAAY,gBAAgB,OAAOA,MAAK;AAG9C,QAAM,QAAQD,cAAa,OAAOC,QAAO,SAAS;AAIlD,QAAM,EAAE,UAAU,UAAU,gBAAgB,YAAY,IAAI;AAAA,IAC1D;AAAA,IACAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,cAAc,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,MAAM,IAAI,EAAE,EAAE,CAAE,CAAC;AACrE,QAAM,aAAuC,oBAAI,IAAI;AACrD,WAAS,IAAI,GAAG,KAAK,aAAa,IAAK,YAAW,IAAI,GAAG,CAAC,CAAC;AAC3D,aAAW,KAAK,SAAU,YAAW,IAAI,MAAM,IAAI,EAAE,EAAE,CAAE,EAAG,KAAK,CAAC;AAGlE,QAAM,iBAAiBI,mBAAkB,YAAY,UAAU,cAAc;AAG7E,QAAM,EAAE,OAAO,aAAa,aAAa,IAAI;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,YAAY,oBAAI,IAA6C;AACnE,aAAW,CAAC,aAAa,QAAQ,KAAK,aAAa;AACjD,UAAM,QAAQ,SAAS,IAAI,CAAC,OAAO;AACjC,YAAM,IAAI,YAAY,IAAI,EAAE;AAC5B,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AAAA,IACvD,CAAC;AACD,cAAU,IAAI,aAAa,KAAK;AAAA,EAClC;AAGA,QAAM,QAAQ,oBAAI,IAAqB;AACvC,aAAW,CAAC,IAAI,GAAG,KAAK,aAAa;AACnC,QAAI,CAAC,GAAG,WAAW,UAAU,EAAG,OAAM,IAAI,IAAI,GAAG;AAAA,EACnD;AAGA,MAAI,MAAM,OAAO,GAAG;AAClB,UAAM,KAAK,IAAI,IAAoB,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AACjE,UAAMC,QAAO,CAAC,MAAsB;AAClC,aAAO,GAAG,IAAI,CAAC,MAAM,GAAG;AACtB,WAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC,CAAE,CAAE;AAC7B,YAAI,GAAG,IAAI,CAAC;AAAA,MACd;AACA,aAAO;AAAA,IACT;AACA,eAAW,KAAKL,QAAO;AACrB,UAAI,MAAM,IAAI,EAAE,IAAI,KAAK,MAAM,IAAI,EAAE,EAAE,GAAG;AACxC,cAAM,KAAKK,MAAK,EAAE,IAAI,GACpB,KAAKA,MAAK,EAAE,EAAE;AAChB,YAAI,OAAO,GAAI,IAAG,IAAI,IAAI,EAAE;AAAA,MAC9B;AAAA,IACF;AACA,UAAM,QAAQ,oBAAI,IAAsB;AACxC,eAAW,MAAM,MAAM,KAAK,GAAG;AAC7B,YAAM,IAAIA,MAAK,EAAE;AACjB,UAAI,CAAC,MAAM,IAAI,CAAC,EAAG,OAAM,IAAI,GAAG,CAAC,CAAC;AAClC,YAAM,IAAI,CAAC,EAAG,KAAK,EAAE;AAAA,IACvB;AACA,QAAI,MAAM,OAAO,GAAG;AAClB,YAAM,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,EACjC,IAAI,CAAC,SAAS;AAAA,QACb;AAAA,QACA,MAAM,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,MAAM,IAAI,EAAE,EAAG,CAAC,CAAC;AAAA,QACnD,OAAO,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,MAAM,IAAI,EAAE,EAAG,IAAI,MAAM,IAAI,EAAE,EAAG,KAAK,CAAC;AAAA,MAC7E,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAEjC,UAAI,SAAS,UAAU,CAAC,EAAG;AAC3B,eAAS,KAAK,GAAG,KAAK,UAAU,QAAQ,MAAM;AAC5C,cAAM,OAAO,UAAU,EAAE;AACzB,cAAM,MAAM,KAAK,OAAO;AACxB,cAAM,YAAY,UAAU;AAC5B,YAAI,MAAM,WAAW;AACnB,gBAAM,KAAK,EAAE,MAAM;AACnB,qBAAW,MAAM,KAAK,KAAK;AACzB,kBAAM,IAAI,MAAM,IAAI,EAAE;AACtB,kBAAM,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,UACnF;AACA,eAAK,QAAQ;AACb,eAAK,SAAS;AAAA,QAChB;AACA,iBAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC;AACnC,QAAM,QACJ,SAAS,SAAS,IAAI,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,SAAS,SAAS;AAC5F,QAAM,SACJ,SAAS,SAAS,IAAI,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,SAAS,SAAS;AAE7F,SAAO,EAAE,OAAO,OAAO,QAAQ,WAAW,cAAc,eAAe,YAAY;AACrF;AAQA,SAAS,yBACP,IACA,IACA,WACA,SACS;AACT,QAAM,KAAK,GAAG,IAAI,GAAG,GACnB,KAAK,GAAG,IAAI,GAAG;AACjB,aAAW,OAAO,WAAW;AAC3B,UAAM,OAAO,IAAI,IAAI,SACnB,OAAO,IAAI,IAAI,IAAI,QAAQ;AAC7B,UAAM,OAAO,IAAI,IAAI,SACnB,OAAO,IAAI,IAAI,IAAI,SAAS;AAC9B,QAAI,OAAO,GACT,OAAO;AACT,UAAM,QAAQ;AAAA,MACZ,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,KAAK;AAAA,MACzB,EAAE,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE;AAAA,MACxB,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI,KAAK;AAAA,MACzB,EAAE,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE;AAAA,IAC1B;AACA,QAAI,UAAU;AACd,eAAW,EAAE,GAAG,EAAE,KAAK,OAAO;AAC5B,UAAI,KAAK,IAAI,CAAC,IAAI,OAAO;AACvB,YAAI,KAAK,GAAG;AACV,oBAAU;AACV;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,IAAI,IAAI;AACd,YAAI,IAAI,EAAG,QAAO,KAAK,IAAI,MAAM,CAAC;AAAA,YAC7B,QAAO,KAAK,IAAI,MAAM,CAAC;AAC5B,YAAI,QAAQ,MAAM;AAChB,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,QAAS,QAAO;AAAA,EACtB;AACA,SAAO;AACT;AAiBO,SAAS,UACd,SACA,OACA,UACA,OAAO,GACP,QACA,MACA,kBAAkB,OACyC;AAC3D,QAAM,WAAiB;AAAA,IACrB,GAAG,QAAQ;AAAA,IACX,GAAG,QAAQ,IAAI;AAAA,IACf,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB;AACA,QAAMC,UAAe,EAAE,GAAG,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO,QAAQ,MAAM,OAAO;AAE/F,QAAM,SAAS,SAAS,IAAI,SAAS,QAAQ;AAC7C,QAAM,SAAS,SAAS,IAAI,SAAS,SAAS;AAC9C,QAAM,OAAOA,QAAO,IAAIA,QAAO,QAAQ;AACvC,QAAM,OAAOA,QAAO,IAAIA,QAAO,SAAS;AAGxC,QAAM,KAAK,OAAO;AAClB,QAAM,KAAK,OAAO;AAClB,MAAI;AACJ,MAAI;AACJ,MAAI,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,GAAG;AAChC,cAAU,KAAK,IAAI,MAAM;AACzB,YAAQ,KAAK,IAAI,MAAM;AAAA,EACzB,OAAO;AACL,cAAU,KAAK,IAAI,MAAM;AACzB,YAAQ,KAAK,IAAI,MAAM;AAAA,EACzB;AAGA,QAAM,KAAK,UAAU,YAAY,UAAU,MAAM,IAAI;AACrD,QAAM,KAAK,QAAQ,YAAYA,SAAQ,QAAQ,MAAM;AAGrD,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,MAAM;AACnB,QAAM,YAAoB,SACvB,OAAO,CAAC,MAAM,EAAE,OAAO,UAAU,EAAE,OAAO,IAAI,EAC9C,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,MAAM,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,EAAE;AAI3E,MACE,CAAC,oBACA,UAAU,WAAW,KAAK,yBAAyB,IAAI,IAAI,WAAW,EAAE,IACzE;AACA,WAAO;AAAA,MACL,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC;AAAA,MACzC,eAAe,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,EAAE;AAAA,IAC9D;AAAA,EACF;AAEA,QAAM,QAAQ,iBAAiB,MAAM;AAAA,IACnC,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,CAAC;AAID,QAAM,OACJ,MAAM,SACL,kBACG,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,KACrD,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC;AACzC,SAAO,EAAE,MAAM,eAAe,MAAM,cAAc;AACpD;;;ACnmCA,SAAS,qBACP,IACA,IACA,IACA,IACA,KACS;AACT,QAAM,MAAM,IAAI,GACd,MAAM,IAAI,IAAI,IAAI;AACpB,QAAM,MAAM,IAAI,GACd,MAAM,IAAI,IAAI,IAAI;AACpB,MAAI,OAAO,IAAI;AACb,UAAM,KAAK,KAAK,IAAI,IAAI,EAAE,GACxB,KAAK,KAAK,IAAI,IAAI,EAAE;AACtB,WAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK;AAAA,EAClD;AACA,QAAM,KAAK,KAAK,IAAI,IAAI,EAAE,GACxB,KAAK,KAAK,IAAI,IAAI,EAAE;AACtB,SAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK;AAClD;AAGA,SAAS,OAAO,IAAY,IAAY,IAAY,IAA2B;AAC7E,QAAM,IAAI;AACV,SAAO;AAAA,IACL,IAAI,KAAK,IAAI,IAAI,EAAE,IAAI;AAAA,IACvB,IAAI,KAAK,IAAI,IAAI,EAAE,IAAI;AAAA,IACvB,IAAI,KAAK,IAAI,IAAI,EAAE,IAAI;AAAA,IACvB,IAAI,KAAK,IAAI,IAAI,EAAE,IAAI;AAAA,EACzB;AACF;AAGA,SAAS,mBAAmB,GAAkB,GAA0B;AACtE,QAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;AACrD,QAAM,KAAK,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,EAAE,EAAE;AACrD,MAAI,MAAM,KAAK,MAAM,EAAG,QAAO;AAC/B,SAAO,KAAK,IAAI,IAAI,EAAE;AACxB;AAEA,IAAM,YAAY;AAClB,IAAM,iBAAiB;AAGvB,SAAS,WAAW,IAAY,IAAY,OAAkB,UAAU,GAAY;AAClF,SAAO,MAAM;AAAA,IACX,CAAC,MACC,KAAK,EAAE,IAAI,WACX,KAAK,EAAE,IAAI,EAAE,QAAQ,WACrB,KAAK,EAAE,IAAI,WACX,KAAK,EAAE,IAAI,EAAE,SAAS;AAAA,EAC1B;AACF;AAGA,SAAS,MAAM,KAAe,KAAuB;AACnD,QAAM,SAAmB,CAAC;AAC1B,aAAW,KAAK,KAAK;AACnB,QAAI,CAAC,OAAO,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,EAAG,QAAO,KAAK,CAAC;AAAA,EAC/D;AACA,SAAO;AACT;AAGA,SAAS,eAAe,MAAuD;AAC7E,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC;AAAA,EAC5F;AACA,QAAM,MAAgB,CAAC,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,EAAE;AAClE,aAAW,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,KAAM,KAAI,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;AACnE,SAAO,IAAI,KAAK,GAAG;AACrB;AAcA,SAAS,aACP,GACA,GACA,OACW;AACX,QAAM,MAAM,EAAE,IAAI,EAAE,QAAQ;AAC5B,QAAM,MAAM,EAAE,IAAI,EAAE,QAAQ;AAC5B,QAAM,UAAU,KAAK,IAAI,MAAM,GAAG,IAAI;AACtC,QAAM,SAAS,SAAS,QAAQ,MAAM,SAAS;AAC/C,MAAI,OAAQ,QAAO,UAAU,qBAAqB;AAClD,SAAO,UAAU,uBAAuB;AAC1C;AAEA,IAAM,eAAe;AACrB,IAAM,cAAc;AAOpB,SAAS,aAAa,QAAkB,IAAY,IAAY,QAA0B;AACxF,QAAM,IAAI,OAAO;AACjB,MAAI,MAAM,EAAG,QAAO,CAAC;AACrB,MAAI,MAAM,EAAG,QAAO,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,CAAE,CAAC,CAAC;AAC3D,OAAK,IAAI,KAAK,SAAS,KAAK,IAAI;AAC9B,UAAM,QAAQ,KAAK,OAAO,IAAI;AAC9B,WAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,KAAK,QAAQ,IAAI,EAAE;AAAA,EAChE;AACA,QAAM,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC;AAC3D,WAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,QAAI,UAAU;AACd,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,OAAO,IAAI,IAAI,CAAC,IAAK;AAC3B,UAAI,IAAI,CAAC,IAAK,MAAM;AAClB,YAAI,CAAC,IAAI;AACT,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,aAAS,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;AAC/B,YAAM,OAAO,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAK;AAC9C,UAAI,IAAI,CAAC,IAAK,MAAM;AAClB,YAAI,CAAC,IAAI;AACT,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,IAAI,CAAC,IAAK,IAAI;AAChB,UAAI,CAAC,IAAI;AACT,gBAAU;AAAA,IACZ;AACA,QAAI,CAAC,QAAS;AAAA,EAChB;AACA,SAAO;AACT;AAQA,SAAS,iBACP,KACA,MACA,OACA,MACuC;AACvC,QAAM,SAAS,oBAAI,IAAsC;AACzD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,eAAe,EAAE,YAAY;AAExE,MAAI,UAAkB,SAAiB,YAAoB;AAC3D,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,iBAAW,IAAI;AACf,gBAAU,IAAI;AACd,mBAAa,IAAI,IAAI;AACrB,qBAAe;AACf;AAAA,IACF,KAAK;AACH,iBAAW,IAAI;AACf,gBAAU,IAAI;AACd,mBAAa,IAAI,IAAI,OAAO,IAAI;AAChC,qBAAe;AACf;AAAA,IACF,KAAK;AACH,iBAAW,IAAI,IAAI;AACnB,gBAAU,IAAI;AACd,mBAAa,IAAI;AACjB,qBAAe;AACf;AAAA,IACF;AACE,iBAAW,IAAI,IAAI;AACnB,gBAAU,IAAI;AACd,mBAAa,IAAI,IAAI,IAAI;AACzB,qBAAe;AACf;AAAA,EACJ;AAEA,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,WAAW,UAAU;AAChC,QAAM,SAAS,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,EAAE,YAAY,CAAC,CAAC;AAC3E,QAAM,YAAY,aAAa,QAAQ,IAAI,IAAI,YAAY;AAE3D,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,IAAI,UAAU,CAAC;AACrB,WAAO,IAAI,OAAO,CAAC,EAAG,IAAI,eAAe,EAAE,GAAG,GAAG,GAAG,WAAW,IAAI,EAAE,GAAG,YAAY,GAAG,EAAE,CAAC;AAAA,EAC5F;AACA,SAAO;AACT;AAEO,SAAS,YAAY,IAAmB,OAAoC;AACjF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,UAAU,WAAW;AAC3B,QAAM,WAAW,WAAW;AAC5B,QAAM,QAAQ,OAAO,UAAU,GAAG;AAClC,QAAM,QAAQ,OAAO,WAAW,GAAG;AAGnC,QAAM,SAAS,CAAC,MAAyD;AACvE,UAAM,cAAc;AAAA,MAClB,GAAI,EAAE,aAAa,CAAC,OAAI,EAAE,UAAU,MAAG,IAAI,CAAC;AAAA,MAC5C,GAAG,EAAE,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,MACjC,GAAG,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,IAChC;AACA,UAAM,QAAQ,YAAY,EAAE,MAAM,QAAQ,EAAE,QAAQ;AACpD,UAAM,IAAI,KAAK,IAAI,KAAK,OAAO,GAAG,YAAY,IAAI,CAAC,MAAM,YAAY,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC5F,UAAM,UAAU,EAAE,aAAa,UAAU,IAAI;AAC7C,UAAM,QAAQ,EAAE,WAAW,SAAS,QAAQ;AAC5C,UAAM,QAAQ,EAAE,QAAQ,SAAS,QAAQ;AACzC,UAAMC,KAAI,QAAQ,UAAU,QAAQ;AACpC,WAAO,EAAE,GAAG,GAAAA,IAAG,OAAO,QAAQ,UAAU,MAAM;AAAA,EAChD;AACA,QAAM,QAAQ,IAAI,IAAI,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhE,QAAM,QAAqB,GAAG,QAAQ,IAAI,CAAC,OAAO;AAAA,IAChD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,IAAI,EAAG;AAAA,IAC1B,QAAQ,MAAM,IAAI,EAAE,IAAI,EAAG;AAAA,EAC7B,EAAE;AACF,QAAMC,SAAqB,GAAG,UAAU;AAAA,IAAI,CAAC,MAC3C,EAAE,aAAa,aAAa,EAAE,MAAM,EAAE,OAAO,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,MAAM;AAAA,EAC1F;AACA,QAAM,YAAY;AAClB,QAAM,OAAO,cAAc,OAAOA,QAAO;AAAA,IACvC,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,cAAc,KAAK,QAAQ,SAAS;AAC1C,QAAM,eAAe,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAG5C,QAAM,iBAAkC,CAAC;AAGzC,QAAM,eAAe,CAAC,GAAG,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE;AAAA,IAC5E,CAAC,GAAG,MAAM,IAAI;AAAA,EAChB;AAGA,QAAM,oBAA8B,CAAC;AACrC,WAAS,KAAK,GAAG,KAAK,aAAa,SAAS,GAAG,MAAM;AACnD,sBAAkB,MAAM,aAAa,EAAE,IAAK,aAAa,KAAK,CAAC,KAAM,CAAC;AAAA,EACxE;AAMA,WAAS,UACP,OACA,UACA,YACA,QACA,SACA,UACA,kBAA0B,GAC1B,gBAAwB,GACxB,gBAAwB,GACxB,WAA4C,MACpC;AACR,QAAI,QAAQ,QAAS,QAAO;AAE5B,QAAI,aAAa;AACjB,QAAI,WAAW,SAAS;AACxB,QAAI,UAAU;AACd,QAAI,cAAc;AAElB,eAAW,CAAC,IAAI,IAAI,IAAI,EAAE,KAAK,UAAU;AACvC,YAAM,KAAK,KAAK,IACd,KAAK,KAAK;AACZ,oBAAc,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAEzC,iBAAW,MAAM,YAAY;AAC3B,YAAI,qBAAqB,IAAI,IAAI,IAAI,IAAI,EAAE,EAAG;AAAA,MAChD;AAEA,YAAM,UAAU,OAAO,IAAI,IAAI,IAAI,EAAE;AACrC,iBAAW,MAAM,QAAQ;AACvB,YAAI,mBAAmB,SAAS,EAAE,KAAK,GAAI;AAAA,MAC7C;AAAA,IACF;AAEA,UAAM,aAAa,SAAS,WAAW,YAAY,IAAI;AAIvD,UAAM,mBAAmB,QAAQ,YAAY,WAAW,SAAS,OAAO;AAExE,UAAM,eACJ,YAAY,QAAQ,WAAW,SAAS,GAAG,SAAS,GAAG,YAAY,IAAI,MAAM;AAE/E,WACE,MAAM,aACN,KAAO,WACP,MAAO,UACP,KAAK,cACL,aACA,mBACA,kBACA;AAAA,IACA;AAAA,IACA;AAAA,EAEJ;AAEA,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,OAAO;AAEb,QAAM,WAA2B,CAAC;AAClC,MAAI;AACF,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAGF,QAAM,WAAW,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAExC,QAAM,eAAe,CAAC,MAAe,OAAsB;AACzD,QAAI,KAAK,IAAI,KAAK,UAAU,GAAG,EAAG,QAAO;AACzC,QAAI,GAAG,IAAI,GAAG,UAAU,KAAK,EAAG,QAAO;AACvC,UAAM,KAAK,GAAG,IAAI,GAAG,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ;AACxD,UAAM,KAAK,GAAG,IAAI,GAAG,SAAS,KAAK,KAAK,IAAI,KAAK,SAAS;AAC1D,QAAI,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,EAAG,QAAO,MAAM,IAAI,QAAQ;AAC3D,WAAO,MAAM,IAAI,SAAS;AAAA,EAC5B;AAEA,QAAMC,aAAY,CAChB,KACA,MACA,GACA,UAC6B;AAC7B,UAAM,KAAK,IAAI,GACb,KAAK,IAAI,IAAI,OACb,KAAK,IAAI,OACT,KAAK,IAAI;AACX,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,EAAE,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG;AAAA,MACjC,KAAK;AACH,eAAO,EAAE,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,GAAG;AAAA,MACtC,KAAK;AACH,eAAO,EAAE,GAAG,IAAI,GAAG,KAAK,IAAI,GAAG;AAAA,MACjC,KAAK;AACH,eAAO,EAAE,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG;AAAA,IACxC;AAAA,EACF;AAQA,QAAM,eAAe,oBAAI,IAAyD;AAClF,WAAS,KAAK,GAAG,KAAK,GAAG,UAAU,QAAQ,MAAM;AAC/C,UAAM,IAAI,GAAG,UAAU,EAAE;AACzB,UAAM,YAAY,EAAE,aAAa;AACjC,UAAM,IAAI,KAAK,MAAM,IAAI,YAAY,EAAE,QAAQ,EAAE,IAAI,GACnD,IAAI,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,EAAE,KAAK;AACjD,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,OAAO,aAAa,GAAG,CAAC;AAC9B,UAAM,MAAM,GAAG,EAAE,EAAE,IAAI,IAAI;AAC3B,UAAM,QAAQ,KAAK,UAAU,IAAI,EAAE;AACnC,UAAM,eACJ,SAAS,SAAS,SAAS,WACvB,SAAS,MAAM,SAAS,IACtB,MAAM,CAAC,EAAG,IACV,EAAE,IAAI,EAAE,QAAQ,IAClB,EAAE,IAAI,EAAE,SAAS,IAAI;AAC3B,QAAI,CAAC,aAAa,IAAI,GAAG,EAAG,cAAa,IAAI,KAAK,CAAC,CAAC;AACpD,iBAAa,IAAI,GAAG,EAAG,KAAK,EAAE,IAAI,aAAa,CAAC;AAAA,EAClD;AACA,QAAM,aAAa,oBAAI,IAAmD;AAC1E,aAAW,CAAC,KAAK,KAAK,KAAK,cAAc;AACvC,UAAM,SAAS,IAAI,MAAM,GAAG,EAAE,CAAC;AAC/B,UAAM,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC;AAC7B,eAAW,IAAI,KAAK,iBAAiB,KAAK,MAAM,IAAI,MAAM,GAAI,MAAM,OAAO,IAAI,CAAC;AAAA,EAClF;AAMA,QAAM,iBAAiB,oBAAI,IAAyD;AACpF,WAAS,KAAK,GAAG,KAAK,GAAG,UAAU,QAAQ,MAAM;AAC/C,UAAM,IAAI,GAAG,UAAU,EAAE;AACzB,UAAM,YAAY,EAAE,aAAa;AACjC,UAAM,IAAI,KAAK,MAAM,IAAI,YAAY,EAAE,QAAQ,EAAE,IAAI,GACnD,IAAI,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,EAAE,KAAK;AACjD,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,OAAO,aAAa,GAAG,CAAC;AAC9B,UAAM,MAAM,GAAG,EAAE,EAAE,IAAI,IAAI;AAC3B,UAAM,QAAQ,KAAK,UAAU,IAAI,EAAE;AACnC,UAAM,eACJ,SAAS,SAAS,SAAS,WACvB,SAAS,MAAM,SAAS,IACtB,MAAM,CAAC,EAAG,IACV,EAAE,IAAI,EAAE,QAAQ,IAClB,EAAE,IAAI,EAAE,SAAS,IAAI;AAC3B,QAAI,CAAC,eAAe,IAAI,GAAG,EAAG,gBAAe,IAAI,KAAK,CAAC,CAAC;AACxD,mBAAe,IAAI,GAAG,EAAG,KAAK,EAAE,IAAI,cAAc,aAAa,CAAC;AAAA,EAClE;AACA,QAAM,eAAe,oBAAI,IAAmD;AAC5E,aAAW,CAAC,KAAK,KAAK,KAAK,gBAAgB;AACzC,UAAM,SAAS,IAAI,MAAM,GAAG,EAAE,CAAC;AAC/B,UAAM,OAAO,IAAI,MAAM,GAAG,EAAE,CAAC;AAC7B,iBAAa,IAAI,KAAK,iBAAiB,KAAK,MAAM,IAAI,MAAM,GAAI,MAAM,OAAO,IAAI,CAAC;AAAA,EACpF;AAGA,QAAM,UAAU,CAAC,MAAY,OAA2D;AACtF,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AAAA,MAChC,KAAK;AACH,eAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE;AAAA,MAChC,KAAK;AACH,eAAO,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,MAChC,KAAK;AACH,eAAO,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE;AAAA,IAClC;AAAA,EACF;AAUA,QAAM,cAA2B,CAAC;AAClC,WAAS,MAAM,GAAG,MAAM,GAAG,UAAU,QAAQ,OAAO;AAClD,UAAM,KAAK,GAAG,UAAU,GAAG;AAC3B,UAAM,aAAa,GAAG,aAAa;AACnC,UAAM,KAAK,KAAK,MAAM,IAAI,aAAa,GAAG,QAAQ,GAAG,IAAI,GACvD,KAAK,KAAK,MAAM,IAAI,aAAa,GAAG,OAAO,GAAG,KAAK;AACrD,QAAI,CAAC,MAAM,CAAC,GAAI;AAChB,UAAM,SAAS,KAAK,UAAU,IAAI,GAAG;AACrC,UAAM,OAAO,aAAa,IAAI,IAAI,MAAM;AACxC,UAAM,QACJ,KAAK,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK,GAAG,IAAI,GAAG,QAAQ,EAAE,IACpD,KAAK,IAAI,GAAG,IAAI,GAAG,SAAS,KAAK,GAAG,IAAI,GAAG,SAAS,EAAE;AACxD,gBAAY,KAAK,EAAE,IAAI,KAAK,KAAK,MAAM,MAAM,MAAM,CAAC;AAAA,EACtD;AACA,QAAM,aAAwC;AAAA,IAC5C,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AACA,cAAY,KAAK,CAAC,IAAI,OAAO,WAAW,GAAG,GAAG,IAAI,WAAW,GAAG,GAAG,KAAK,GAAG,OAAO,GAAG,IAAI;AAEzF,aAAW,EAAE,IAAI,IAAI,KAAK,aAAa;AACrC,UAAM,IAAI,GAAG,UAAU,EAAE;AAGzB,UAAM,YAAY,EAAE,aAAa;AACjC,UAAM,IAAI,KAAK,MAAM,IAAI,YAAY,EAAE,QAAQ,EAAE,IAAI,GACnD,IAAI,KAAK,MAAM,IAAI,YAAY,EAAE,OAAO,EAAE,KAAK;AACjD,QAAI,CAAC,KAAK,CAAC,EAAG;AAGd,UAAM,SAAS,aAAa,GAAG,CAAC;AAChC,UAAM,OAAO,WAAW,IAAI,GAAG,EAAE,EAAE,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,KAAKA,WAAU,GAAG,QAAQ,KAAK,IAAI;AAG3F,UAAM,WAAW,aAAa,GAAG,CAAC;AAClC,UAAM,SACJ,aAAa,IAAI,GAAG,EAAE,EAAE,IAAI,QAAQ,EAAE,GAAG,IAAI,EAAE,KAC/C,YAAY,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAErD,UAAM,QAAQ,KAAK,UAAU,IAAI,EAAE;AACnC,QAAI;AACJ,QAAI;AACJ,QAAI,0BAA0B;AAC9B,QAAI,kBAA4C;AAChD,QAAI,oBAA0B;AAC9B,QAAI,gBAA0C;AAC9C,QAAI,kBAAwB;AAE5B,QAAI,SAAS,MAAM,SAAS,GAAG;AA6F7B,UAAS,iBAAT,SAAwB,OAAwD;AAC9E,cAAM,KAAK,OAAO,GAChB,KAAK,OAAO;AACd,cAAM,KAAK,KAAK,GACd,KAAK,KAAK;AACZ,YAAI,KAAK,IAAI,QAAQ,EAAE,IAAI,KAAK,KAAK,IAAI,QAAQ,EAAE,IAAI,GAAG;AACxD,iBAAO,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,QAC1B;AACA,eAAO;AAAA,UACL,CAAC,IAAI,IAAI,IAAI,KAAK;AAAA,UAClB,CAAC,IAAI,OAAO,OAAO,KAAK;AAAA,UACxB,CAAC,OAAO,OAAO,OAAO,MAAM;AAAA,UAC5B,CAAC,OAAO,QAAQ,IAAI,MAAM;AAAA,UAC1B,CAAC,IAAI,QAAQ,IAAI,EAAE;AAAA,QACrB;AAAA,MACF,GAES,iBAAT,SAAwB,OAAwD;AAC9E,eAAO;AAAA,UACL,CAAC,UAAU,UAAU,OAAO,QAAQ;AAAA,UACpC,CAAC,OAAO,UAAU,OAAO,QAAQ;AAAA,UACjC,CAAC,OAAO,UAAU,UAAU,QAAQ;AAAA,QACtC;AAAA,MACF,GAES,iBAAT,SAAwB,OAAwD;AAC9E,eAAO;AAAA,UACL,CAAC,WAAW,UAAU,OAAO,QAAQ;AAAA,UACrC,CAAC,OAAO,UAAU,OAAO,QAAQ;AAAA,UACjC,CAAC,OAAO,UAAU,WAAW,QAAQ;AAAA,QACvC;AAAA,MACF,GAES,iBAAT,SAAwB,OAAwD;AAC9E,eAAO;AAAA,UACL,CAAC,UAAU,UAAU,OAAO,QAAQ;AAAA,UACpC,CAAC,OAAO,UAAU,OAAO,MAAM;AAAA,UAC/B,CAAC,OAAO,QAAQ,KAAK,GAAG,MAAM;AAAA,UAC9B,CAAC,KAAK,GAAG,QAAQ,KAAK,GAAG,KAAK,CAAC;AAAA,QACjC;AAAA,MACF,GAES,iBAAT,SAAwB,OAAwD;AAC9E,eAAO;AAAA,UACL,CAAC,WAAW,UAAU,OAAO,QAAQ;AAAA,UACrC,CAAC,OAAO,UAAU,OAAO,MAAM;AAAA,UAC/B,CAAC,OAAO,QAAQ,KAAK,GAAG,MAAM;AAAA,UAC9B,CAAC,KAAK,GAAG,QAAQ,KAAK,GAAG,KAAK,CAAC;AAAA,QACjC;AAAA,MACF,GAES,iBAAT,SAAwB,OAAwD;AAC9E,eAAO;AAAA,UACL,CAAC,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK;AAAA,UACpC,CAAC,OAAO,GAAG,OAAO,OAAO,KAAK;AAAA,UAC9B,CAAC,OAAO,OAAO,OAAO,QAAQ;AAAA,UAC9B,CAAC,OAAO,UAAU,UAAU,QAAQ;AAAA,QACtC;AAAA,MACF;AArJA,YAAM,YAAY,EAAE;AACpB,YAAM,YAAY,EAAE;AACpB,YAAM,OAAO,KAAK,IAAI,WAAW,SAAS;AAC1C,YAAM,OAAO,KAAK,IAAI,WAAW,SAAS;AAC1C,YAAM,aAAa,aAAa,OAAO,CAAC,OAAO;AAC7C,cAAM,KAAK,GAAG,IAAI,GAAG,SAAS;AAC9B,eAAO,KAAK,QAAQ,KAAK;AAAA,MAC3B,CAAC;AAGD,YAAM,eAAe,KAAK,cAAc,IAAI,EAAE,IAAI,CAAC,KAAK;AACxD,YAAM,kBAA4B,eAC7B,KAAK,aAAa,IAAI,YAAY,KAAK,CAAC,IACzC,CAAC;AAEL,YAAM,eAAe,KAAK,IAAI,GAAG,aAAa,IAAI,CAACC,OAAMA,GAAE,IAAIA,GAAE,KAAK,CAAC,IAAI;AAC3E,YAAM,UAAU,OAAO;AACvB,YAAM,WAAW,KAAK,IAAI,GAAG,aAAa,IAAI,CAACA,OAAMA,GAAE,CAAC,CAAC;AAGzD,YAAM,QAAQ,MAAM,CAAC,EAAG,IAAI;AAC5B,YAAM,SAAS,KAAK,IAAI,YAAY;AAQpC,YAAM,iBAAiB,WAAW,OAAO,CAACA,OAAM,QAAQA,GAAE,KAAK,QAAQA,GAAE,IAAIA,GAAE,MAAM;AACrF,YAAM,kBAAkB,WAAW,OAAO,CAACA,OAAM,SAASA,GAAE,KAAK,SAASA,GAAE,IAAIA,GAAE,MAAM;AACxF,YAAM,cAAc,CAAC,GAAG,gBAAgB,GAAG,eAAe;AAE1D,YAAM,gBACJ,YAAY,SAAS,IACjB,KAAK,IAAI,GAAG,YAAY,IAAI,CAACA,OAAMA,GAAE,CAAC,CAAC,IAAI,YAC3C,WAAW;AAEjB,YAAM,eAAyB;AAAA,QAC7B,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL;AAGA,YAAM,WAAW,EAAE,IAAI,EAAE,SAAS,IAAI;AACtC,YAAM,WAAW,EAAE,IAAI,EAAE,SAAS,IAAI;AACtC,YAAM,WAAW,EAAE;AACnB,YAAM,YAAY,EAAE,IAAI,EAAE;AAC1B,YAAM,WAAW,EAAE;AACnB,YAAM,YAAY,EAAE,IAAI,EAAE;AAI1B,YAAM,gBAAgB,aAAa,OAAO,CAAC,OAAO;AAChD,cAAM,KAAK,GAAG,IAAI,GAAG,SAAS;AAC9B,eAAO,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE;AAAA,MAC1E,CAAC;AAGD,YAAM,aAAa,aAAa,OAAO,CAAC,OAAO;AAC7C,cAAM,KAAK,GAAG,GACZ,KAAK,GAAG;AACV,eAAQ,WAAW,MAAM,WAAW,KAAK,MAAQ,WAAW,MAAM,WAAW,KAAK;AAAA,MACpF,CAAC;AACD,YAAM,mBACJ,WAAW,SAAS,IAChB,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,iBAC5C,WAAW;AAGjB,YAAM,oBACJ,WAAW,SAAS,IAChB,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,iBACvD;AAGN,YAAM,YAAY,aAAa,OAAO,CAAC,OAAO;AAC5C,eACG,QAAQ,GAAG,KAAK,QAAQ,GAAG,IAAI,GAAG,UAClC,WAAW,GAAG,KAAK,WAAW,GAAG,IAAI,GAAG;AAAA,MAE7C,CAAC;AACD,YAAM,kBACJ,UAAU,SAAS,IACf,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,iBAC3C,WAAW;AAgEjB,YAAM,gBAAkC,CAAC;AAEzC,iBAAW,SAAS,cAAc;AAChC,sBAAc,KAAK;AAAA,UACjB,UAAU;AAAA,UACV;AAAA,UACA,SAAS;AAAA,UACT,UAAU,eAAe,KAAK;AAAA,UAC9B,UAAU,EAAE,GAAG,OAAO,IAAI,QAAQ,UAAU,EAAE;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,YAAM,kBAAkB,KAAK,IAAI,UAAU,QAAQ,IAAI;AACvD,YAAM,UAAU;AAAA,QACd;AAAA;AAAA,QACA,WAAW,iBAAiB;AAAA,QAC5B,WAAW,iBAAiB;AAAA,QAC5B,WAAW,iBAAiB;AAAA,QAC5B,GAAG;AAAA,MACL,EAAE,OAAO,CAAC,MAAM,KAAK,eAAe;AACpC,iBAAW,SAAS,SAAS;AAC3B,sBAAc,KAAK;AAAA,UACjB,UAAU;AAAA,UACV;AAAA,UACA,SAAS;AAAA,UACT,UAAU,eAAe,KAAK;AAAA,UAC9B,UAAU,EAAE,GAAG,OAAO,IAAI,WAAW,YAAY,EAAE;AAAA,QACrD,CAAC;AAAA,MACH;AAEA,YAAM,UAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA,eAAe,iBAAiB;AAAA,QAChC,eAAe;AAAA,QACf,GAAG;AAAA,MACL,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK,IAAI,WAAW,SAAS,CAAC;AAClD,iBAAW,SAAS,SAAS;AAC3B,sBAAc,KAAK;AAAA,UACjB,UAAU;AAAA,UACV;AAAA,UACA,SAAS;AAAA,UACT,UAAU,eAAe,KAAK;AAAA,UAC9B,UAAU,EAAE,GAAG,OAAO,IAAI,WAAW,YAAY,EAAE;AAAA,QACrD,CAAC;AAAA,MACH;AAEA,YAAM,UAAU,CAAC,kBAAkB,WAAW,WAAW,GAAG,eAAe,EAAE;AAAA,QAC3E,CAAC,MAAM,IAAI;AAAA,MACb;AACA,iBAAW,SAAS,SAAS;AAC3B,sBAAc,KAAK;AAAA,UACjB,UAAU;AAAA,UACV;AAAA,UACA,SAAS;AAAA,UACT,UAAU,eAAe,KAAK;AAAA,UAC9B,UAAU,EAAE,GAAG,OAAO,IAAI,WAAW,UAAU,EAAE;AAAA,QACnD,CAAC;AAAA,MACH;AAEA,YAAM,UAAU,CAAC,mBAAmB,cAAc,GAAG,eAAe,EAAE;AAAA,QACpE,CAAC,MAAM,IAAI;AAAA,MACb;AACA,iBAAW,SAAS,SAAS;AAC3B,sBAAc,KAAK;AAAA,UACjB,UAAU;AAAA,UACV;AAAA,UACA,SAAS;AAAA,UACT,UAAU,eAAe,KAAK;AAAA,UAC9B,UAAU,EAAE,GAAG,OAAO,IAAI,WAAW,UAAU,EAAE;AAAA,QACnD,CAAC;AAAA,MACH;AAEA,YAAM,UAAU,CAAC,iBAAiB,WAAW,WAAW,GAAG,eAAe,EAAE;AAAA,QAC1E,CAAC,MAAM,IAAI;AAAA,MACb;AACA,iBAAW,SAAS,SAAS;AAC3B,sBAAc,KAAK;AAAA,UACjB,UAAU;AAAA,UACV;AAAA,UACA,SAAS;AAAA,UACT,UAAU,eAAe,KAAK;AAAA,UAC9B,UAAU,EAAE,GAAG,OAAO,IAAI,QAAQ,YAAY,EAAE;AAAA,QAClD,CAAC;AAAA,MACH;AAGA,UAAI,YAAY;AAChB,UAAI,gBAAgC,cAAc,CAAC,KAAK;AAAA,QACtD,UAAU;AAAA,QACV,OAAO,MAAM,CAAC,EAAG;AAAA,QACjB,SAAS;AAAA,QACT,UAAU,eAAe,MAAM,CAAC,EAAG,CAAC;AAAA,QACpC,UAAU,EAAE,GAAG,MAAM,CAAC,EAAG,GAAG,IAAI,QAAQ,UAAU,EAAE;AAAA,MACtD;AAEA,iBAAW,KAAK,eAAe;AAI7B,cAAM,gBAAgB,EAAE,aAAa,OAAO,EAAE,aAAa,MAAM,KAAK;AACtE,cAAM,QAAQ;AAAA,UACZ,EAAE;AAAA,UACF,EAAE;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE,UAAU,IAAM;AAAA,UAClB;AAAA,UACA;AAAA,UACA,EAAE;AAAA,QACJ;AACA,YAAI,QAAQ,WAAW;AACrB,sBAAY;AACZ,0BAAgB;AAAA,QAClB;AAAA,MACF;AAGA,iBAAW,CAAC,IAAI,IAAI,IAAI,EAAE,KAAK,cAAc,UAAU;AACrD,uBAAe,KAAK,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,MAC5C;AACA,gCAA0B,cAAc,aAAa,OAAO,cAAc,aAAa;AAGvF,cAAQ,cAAc,UAAU;AAAA,QAC9B,KAAK;AACH,4BAAkB,EAAE,GAAG,UAAU,GAAG,SAAS;AAC7C,8BAAoB;AACpB,0BAAgB,EAAE,GAAG,UAAU,GAAG,SAAS;AAC3C,4BAAkB;AAClB;AAAA,QACF,KAAK;AACH,4BAAkB,EAAE,GAAG,WAAW,GAAG,SAAS;AAC9C,8BAAoB;AACpB,0BAAgB,EAAE,GAAG,WAAW,GAAG,SAAS;AAC5C,4BAAkB;AAClB;AAAA,QACF,KAAK;AACH,4BAAkB,EAAE,GAAG,UAAU,GAAG,SAAS;AAC7C,8BAAoB;AACpB;AAAA,QACF,KAAK;AACH,4BAAkB,EAAE,GAAG,WAAW,GAAG,SAAS;AAC9C,8BAAoB;AACpB;AAAA,QACF,KAAK;AACH,0BAAgB,EAAE,GAAG,UAAU,GAAG,SAAS;AAC3C,4BAAkB;AAClB;AAAA,MACJ;AAGA,YAAM,OAAO,cAAc;AAC3B,UAAI,KAAK,WAAW,GAAG;AACrB,mBAAW,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC;AAAA,MAChG,OAAO;AACL,cAAM,MAAgB,CAAC,KAAK,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,EAAG,CAAC,CAAC,CAAC,EAAE;AAClE,mBAAW,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,MAAM;AAC/B,cAAI,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;AAAA,QACpC;AACA,mBAAW,IAAI,KAAK,GAAG;AAAA,MACzB;AACA,iBAAW,cAAc;AAEzB,eAAS,KAAK,EAAE,KAAK,UAAU,QAAQ,WAAW,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC;AAGvF,YAAM,WAAW,YAAY,EAAE,YAAY,EAAE;AAC7C,YAAM,SAAS,YAAY,EAAE,WAAW,EAAE;AAC1C,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA,QAAQ,mBAAmB,eAAe;AAAA,UAC1C;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP,GAAG,UAAU,GAAG,eAAe,QAAQ,iBAAiB,aAAa,GAAG,QAAQ,OAAO;AAAA,MACzF;AAAA,IACF,OAAO;AAEL,YAAM,KAAK,OAAO,GAChB,KAAK,OAAO,GACZ,KAAK,KAAK,GACV,KAAK,KAAK;AACZ,YAAM,aAAa,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;AAC7D,YAAM,iBAAiB,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI;AAEhF,YAAM,mBAAmB,aAAa,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAErF,YAAM,mBAAqC,CAAC;AAE5C,UAAI,QAAQ,sBAAsB;AAEhC,yBAAiB,KAAK;AAAA,UACpB,UAAU;AAAA,UACV,OAAO;AAAA,UACP,SAAS;AAAA,UACT,UAAU,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,UAC3B,UAAU,EAAE,GAAG,IAAI,IAAI,KAAK,MAAM,EAAE;AAAA,QACtC,CAAC;AAED,cAAM,YAAY,EAAE,IAAI,EAAE,SAAS,IAAI;AACvC,cAAM,YAAY,EAAE,IAAI,EAAE,SAAS,IAAI;AACvC,cAAM,YAAY,EAAE;AACpB,cAAM,aAAa,EAAE,IAAI,EAAE;AAC3B,cAAM,YAAY,EAAE;AACpB,cAAM,aAAa,EAAE,IAAI,EAAE;AAC3B,cAAM,eAAe,aAAa,OAAO,CAAC,OAAO;AAC/C,gBAAM,KAAK,GAAG,GACZ,KAAK,GAAG;AACV,iBAAQ,YAAY,MAAM,YAAY,KAAK,MAAQ,YAAY,MAAM,YAAY,KAAK;AAAA,QACxF,CAAC;AACD,cAAM,qBACJ,aAAa,SAAS,IAClB,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,iBAC9C,aAAa;AACnB,cAAM,sBACJ,aAAa,SAAS,IAClB,KAAK,IAAI,GAAG,aAAa,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,iBACzD;AACN,YAAI,qBAAqB,WAAW;AAClC,2BAAiB,KAAK;AAAA,YACpB,UAAU;AAAA,YACV,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,cACR,CAAC,WAAW,WAAW,oBAAoB,SAAS;AAAA,cACpD,CAAC,oBAAoB,WAAW,oBAAoB,SAAS;AAAA,cAC7D,CAAC,oBAAoB,WAAW,WAAW,SAAS;AAAA,YACtD;AAAA,YACA,UAAU,EAAE,GAAG,oBAAoB,IAAI,YAAY,aAAa,EAAE;AAAA,UACpE,CAAC;AAAA,QACH;AACA,YAAI,sBAAsB,YAAY;AACpC,2BAAiB,KAAK;AAAA,YACpB,UAAU;AAAA,YACV,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,cACR,CAAC,YAAY,WAAW,qBAAqB,SAAS;AAAA,cACtD,CAAC,qBAAqB,WAAW,qBAAqB,SAAS;AAAA,cAC/D,CAAC,qBAAqB,WAAW,YAAY,SAAS;AAAA,YACxD;AAAA,YACA,UAAU,EAAE,GAAG,qBAAqB,IAAI,YAAY,aAAa,EAAE;AAAA,UACrE,CAAC;AAAA,QACH;AAAA,MACF,OAAO;AAGL,cAAM,UAAU,EAAE,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,KAAK,YAAY,CAAC;AACtE,mBAAW,QAAQ,MAAM,SAAS,CAAC,GAAG;AACpC,gBAAM,SACJ,KAAK,IAAI,KAAK,EAAE,IAAI,IAChB,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,IACjB;AAAA,YACE,CAAC,IAAI,IAAI,IAAI,IAAI;AAAA,YACjB,CAAC,IAAI,MAAM,IAAI,IAAI;AAAA,YACnB,CAAC,IAAI,MAAM,IAAI,EAAE;AAAA,UACnB;AACN,2BAAiB,KAAK;AAAA,YACpB,UAAU;AAAA,YACV,QAAQ,KAAK,MAAM;AAAA,YACnB,SAAS;AAAA,YACT,UAAU;AAAA,YACV,UAAU,EAAE,IAAI,KAAK,MAAM,GAAG,GAAG,KAAK;AAAA,UACxC,CAAC;AAAA,QACH;AAEA,cAAM,UAAU;AAAA,UACd,GAAG,kBAAkB,OAAO,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;AAAA,UAC/E,aAAa;AAAA,UACb;AAAA,QACF;AACA,mBAAW,QAAQ,MAAM,SAAS,CAAC,GAAG;AACpC,gBAAM,SACJ,KAAK,IAAI,KAAK,EAAE,IAAI,IAChB,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,IACjB;AAAA,YACE,CAAC,IAAI,IAAI,MAAM,EAAE;AAAA,YACjB,CAAC,MAAM,IAAI,MAAM,EAAE;AAAA,YACnB,CAAC,MAAM,IAAI,IAAI,EAAE;AAAA,UACnB;AACN,2BAAiB,KAAK;AAAA,YACpB,UAAU;AAAA,YACV,OAAO;AAAA,YACP,SAAS;AAAA,YACT,UAAU;AAAA,YACV,UAAU,EAAE,GAAG,MAAM,IAAI,KAAK,MAAM,EAAE;AAAA,UACxC,CAAC;AAAA,QACH;AAAA,MACF;AAGA,UAAI,kBAAkB;AACtB,UAAI,aAAoC,iBAAiB,CAAC,KAAK;AAC/D,iBAAW,KAAK,kBAAkB;AAChC,cAAM,cAAc,EAAE,aAAa,MAAM,KAAK;AAG9C,cAAM,kBACJ,EAAE,aAAa,QAAQ,EAAE,aAAa,OAAO,eAAe;AAC9D,cAAM,QAAQ;AAAA,UACZ,EAAE;AAAA,UACF,EAAE;AAAA,UACF;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE,UAAU,IAAM;AAAA,UAClB;AAAA,UACA;AAAA,UACA,EAAE;AAAA,QACJ;AACA,YAAI,QAAQ,iBAAiB;AAC3B,4BAAkB;AAClB,uBAAa;AAAA,QACf;AAAA,MACF;AAEA,UAAI,oBAAoB,YAAY,cAAc,QAAQ,QAAQ,sBAAsB;AAItF,cAAM,SAAS,UAAU,GAAG,GAAG,UAAU,MAAM,QAAQ,MAAM,IAAI;AACjE,mBAAW,OAAO,QAAQ,KAAK,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC;AACzE,mBAAW,OAAO;AAElB,uBAAe,KAAK,OAAO,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC;AAAA,MAChE,OAAO;AAEL,mBAAW,CAAC,IAAI,IAAI,IAAI,EAAE,KAAK,WAAW,UAAU;AAClD,yBAAe,KAAK,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,QAC5C;AACA,mBAAW,eAAe,WAAW,QAAQ;AAC7C,mBAAW,WAAW;AAAA,MACxB;AAEA,eAAS,KAAK,EAAE,KAAK,UAAU,QAAQ,WAAW,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC;AACvF,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA,QAAQ,mBAAmB,eAAe;AAAA,UAC1C,YAAY,EAAE,YAAY,EAAE;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA,QAAQ,iBAAiB,aAAa;AAAA,UACtC,YAAY,EAAE,WAAW,EAAE;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,SAAS,GAClB,KAAK,SAAS;AAChB,QAAI,EAAE,OAAO;AACX,UAAI,QAAgBC;AACpB,UAAI,2BAA2B,SAAS,IAAI,KAAK,IAAI,GAAG,aAAa,IAAI,CAACD,OAAMA,GAAE,CAAC,CAAC,GAAG;AACrF,iBAAS,KAAK;AACd,QAAAC,eAAc;AAAA,MAChB,WAAW,yBAAyB;AAClC,iBAAS,KAAK;AACd,QAAAA,eAAc;AAAA,MAChB,OAAO;AACL,iBAAS;AACT,QAAAA,eAAc;AAAA,MAChB;AACA,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,OAAO,OAAO,MAAM,GAAG,OAAO,KAAK,CAAC,GAAG,SAAS,QAAQ,WAAW;AAAA,UAC1E,QAAQA;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,aAAa,CAAC,MAAY,OAA6D;AAC3F,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,iBAAO,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG;AAAA,QACxC,KAAK;AACH,iBAAO,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG;AAAA,QACxC,KAAK;AACH,iBAAO,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG;AAAA,QACxC;AACE,iBAAO,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG;AAAA,MAC1C;AAAA,IACF;AACA,QAAI,EAAE,UAAU;AACd,YAAM,IAAI;AAAA,QACR,YAAY,kBAAkB;AAAA,QAC9B,YAAY,gBAAgB;AAAA,MAC9B;AACA,eAAS,KAAK,EAAE,KAAK,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,SAAS,QAAQ,SAAS,CAAC;AAAA,IACpF;AACA,QAAI,EAAE,WAAW;AACf,YAAM,IAAI;AAAA,QACR,YAAY,oBAAoB;AAAA,QAChC,YAAY,kBAAkB;AAAA,MAChC;AACA,eAAS,KAAK,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,SAAS,QAAQ,SAAS,CAAC;AAAA,IACrF;AAAA,EACF;AAGA,aAAW,KAAK,GAAG,SAAS;AAC1B,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE,IAAI;AACjC,UAAM,IAAI,MAAM,IAAI,EAAE,IAAI;AAC1B,UAAM,IAAI,IAAI,GACZ,IAAI,IAAI,IAAI;AACd,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC,EAAE;AAAA,QAC1D,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AAGA,UAAM,aAAa,IAAI,QAAQ;AAC/B,QAAI,KAAK,aAAa,WAAW;AACjC,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,MAAM,OAAO,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,UAAU,QAAQ,MAAM;AAAA,QACnE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,EAAE,YAAY;AAChB,YAAM,UAAU;AAChB,eAAS;AAAA,QACP,EAAE,KAAK,OAAI,EAAE,UAAU,QAAK,OAAO,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS,QAAQ,WAAW;AAAA,UACpF,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AACA,UAAM,eAAe,IAAI,SAAS,EAAE,aAAa,UAAU,IAAI;AAC/D,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC;AAAA,QACvE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,eAAe,QAAQ;AAChC,eAAW,KAAK,EAAE,YAAY;AAC5B,eAAS,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS,QAAQ,IAAI,CAAC;AACxE,YAAM;AAAA,IACR;AACA,UAAM,aAAa,IAAI,EAAE;AACzB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC;AAAA,QACnE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,aAAa,QAAQ;AAC/B,eAAW,KAAK,EAAE,SAAS;AACzB,eAAS,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC,GAAG,IAAI,GAAG,GAAG,SAAS,QAAQ,IAAI,CAAC;AACzE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,KAAK,QAAQ,MAAM;AACzC,QAAM,SAAS,OAAO,KAAK,SAAS,OAAO,MAAM;AAIjD,QAAM,cAAc;AACpB,QAAM,cAAc,KAAK,IAAI,GAAG,GAAG,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAClE,QAAM,gBAAgB,cAAc,SAAS,KAAK,KAAK,SAAS,WAAW,IAAI,cAAc;AAE7F,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,CAAC,eAAe,GAAG,GAAG,OAAO,SAAS,eAAe,QAAQ,OAAO;AAAA,MAClF,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;AAGA,SAAS,UACP,GACA,IACA,QACA,MACA,SACgB;AAChB,MAAI,SAAS,OAAQ,QAAO,CAAC;AAC7B,QAAM,MAAM,KAAK,MAAM,GAAG,IAAI,OAAO,GAAG,GAAG,IAAI,OAAO,CAAC;AACvD,QAAM,OAAO,MAAM,KAAK;AACxB,QAAM,MAAM,CAAC,KAAa,YAAoB;AAAA,IAC5C,GAAG,GAAG,IAAI,KAAK,IAAI,OAAO,MAAM,IAAI;AAAA,IACpC,GAAG,GAAG,IAAI,KAAK,IAAI,OAAO,MAAM,IAAI;AAAA,EACtC;AACA,QAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAErC,MAAI,SAAS,SAAS;AACpB,UAAMC,KAAI,IAAI,IAAI,GAAG,GACnBF,KAAI,IAAI,IAAI,IAAI;AAClB,WAAO;AAAA,MACL,EAAE;AAAA,QACA,KAAK,IAAIE,GAAE,CAAC,CAAC,IAAI,IAAIA,GAAE,CAAC,CAAC,MAAM,GAAG,MAAM,IAAIF,GAAE,CAAC,CAAC,IAAI,IAAIA,GAAE,CAAC,CAAC;AAAA,QAC5D,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS,YAAY;AACvB,UAAME,KAAI,IAAI,IAAI,IAAI,GACpBF,KAAI,IAAI,IAAI,KAAK;AACnB,WAAO;AAAA,MACL,EAAE;AAAA,QACA,KAAK,GAAG,MAAM,IAAIE,GAAE,CAAC,CAAC,IAAI,IAAIA,GAAE,CAAC,CAAC,MAAM,IAAIF,GAAE,CAAC,CAAC,IAAI,IAAIA,GAAE,CAAC,CAAC;AAAA,QAC5D,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,MAAM,QAAQ,WAAW;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,IAAI,IAAI,CAAC;AACtB,QAAM,IAAI,IAAI,GAAG,GAAG,GAClB,IAAI,IAAI,GAAG,IAAI;AACjB,QAAM,OAAO,SAAS,aAAa,QAAQ,YAAY,QAAQ;AAC/D,SAAO;AAAA,IACL,EAAE;AAAA,MACA,KAAK,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAAA,MAC5F,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,KAAK;AAAA,IACT;AAAA,EACF;AACF;;;AC7tCE,SAAS,SAAS,KAAK;AACrB,QAAM,SAAS,IAAI,SAAS,IAAI;AAChC,MAAI,WAAW,QAAQ,YAAY;AACnC,MAAI,IAAI,WAAW,IAAI,EAAG,YAAW;AAAA,WAC5B,IAAI,WAAW,GAAG,EAAG,YAAW;AAAA,WAChC,IAAI,WAAW,GAAG,EAAG,YAAW;AAAA,WAChC,IAAI,WAAW,GAAG,EAAG,YAAW;AACzC,MAAI,IAAI,SAAS,IAAI,EAAG,aAAY;AAAA,WAC3B,IAAI,SAAS,GAAG,EAAG,aAAY;AAAA,WAC/B,IAAI,SAAS,GAAG,EAAG,aAAY;AAAA,WAC/B,IAAI,SAAS,GAAG,EAAG,aAAY;AACxC,SAAO,EAAE,UAAU,WAAW,OAAO;AACvC;AAEF,SAASG,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,gBAAgB,IAAI;AACxD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,uBAAuB,QAAQ,IAAI;AACjD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO,KAAK;AAC/F,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,UAAM,UAAU,CAAC;AACjB,UAAM,YAAY,CAAC;AACnB,UAAM,SAAS,CAAC,SAAS;AACvB,UAAI,IAAI,QAAQ,KAAK,OAAK,EAAE,SAAS,IAAI;AACzC,UAAI,CAAC,GAAG;AAAE,YAAI,EAAE,MAAM,YAAY,CAAC,GAAG,SAAS,CAAC,EAAE;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAAG;AACtE,aAAO;AAAA,IACT;AACA,UAAM,YAAY,CAAC,GAAG,QAAQ;AAC5B,YAAM,IAAI,IAAI,KAAK;AACnB,UAAI,CAAC,EAAG;AACR,UAAI,EAAE,WAAW,IAAI,GAAG;AAAE,UAAE,aAAa,EAAE,QAAQ,SAAS,EAAE,EAAE,KAAK;AAAG;AAAA,MAAQ;AAChF,YAAM,WAAW,EAAE,SAAS,GAAG;AAC/B,OAAC,WAAW,EAAE,UAAU,EAAE,YAAY,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;AAAA,IAClE;AACA,eAAW,MAAM,MAAM,OAAO,OAAO,GAAG;AACtC,UAAI,GAAG,MAAM,SAAS;AAAE,cAAM,IAAI,OAAO,GAAG,IAAI;AAAG,mBAAW,KAAK,GAAG,QAAS,WAAU,GAAG,CAAC;AAAA,MAAG,WACvF,GAAG,MAAM,SAAU,WAAU,OAAO,GAAG,IAAI,GAAG,GAAG,OAAO;AAAA,eACxD,GAAG,MAAM,YAAY;AAC5B,eAAO,GAAG,IAAI;AAAG,eAAO,GAAG,KAAK;AAChC,cAAM,EAAE,UAAU,WAAW,OAAO,IAAI,SAAS,GAAG,GAAG;AACvD,kBAAU,KAAK;AAAA,UAAE,MAAM,GAAG;AAAA,UAAM,OAAO,GAAG;AAAA,UAAO;AAAA,UAAU;AAAA,UAAW;AAAA,UACpE,GAAI,GAAG,QAAQ,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC;AAAA,UACtC,GAAI,GAAG,KAAK,EAAE,UAAU,GAAG,GAAG,IAAI,CAAC;AAAA,UACnC,GAAI,GAAG,KAAK,EAAE,WAAW,GAAG,GAAG,IAAI,CAAC;AAAA,QAAG,CAAC;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,SAAS,UAAU;AAAA,EAC3E;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,MAAM,MAAM;AAAE,WAAO,EAAE,GAAG,SAAS,MAAM,SAAS,KAAK,OAAO,OAAO,EAAE;AAAA,EAAG;AAChG,MAAI,SAAS,SAAS,SAAS;AAAE,WAAO,QAAQ,KAAK;AAAA,EAAG;AACxD,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,MAAM,SAAS;AAAE,WAAO,EAAE,GAAG,UAAU,MAAM,SAAS,QAAQ,KAAK,EAAE;AAAA,EAAG;AAC9F,MAAI,SAAS,SAAS,MAAM,IAAI,KAAK,IAAI,OAAO,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AACtE,MAAI,SAAS,SAAS,MAAM,IAAI,KAAK,IAAI,OAAO,OAAO;AACnD,WAAO,EAAE,GAAG,YAAY,MAAM,OAAO,KAAK,IAAI,MAAM,QAAW,IAAI,MAAM,QAAW,OAAO,SAAS,OAAU;AAAA,EAChH;AACF,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,kBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,oBAAoB;AACzB,QAAI,OAAO,YAAY;AACrB,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK,yBAAyB;AAC9B,YAAI,OAAO,YAAY;AACrB,eAAK,kBAAkB;AACvB,cAAI,OAAO,YAAY;AACrB,iBAAK,mBAAmB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;AAE3D,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP;AACA,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,oBAAM,CAAC;AACP,oBAAM,mBAAmB;AACzB,qBAAO,QAAQ,YAAY;AACzB,oBAAI,KAAK,GAAG;AACZ,sBAAM,mBAAmB;AAAA,cAC3B;AACA,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,iBAAiB;AACvB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,uBAAK,OAAO,IAAI,GAAG;AAAA,gBACrB,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,2BAA2B;AAClC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK;AAErE,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,WAAW;AAChB,WAAK,gBAAgB;AACrB,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK,WAAW;AAChB,cAAM,eAAe;AACrB,YAAI,QAAQ,YAAY;AACtB,gBAAM;AACN,gBAAM,WAAW;AACjB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,kBAAM;AACN;AAAA,UACF,OAAO;AACL,kBAAM;AACN,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,QAAQ,YAAY;AACtB,kBAAM,WAAW;AACjB,kBAAM,oBAAoB;AAC1B,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,oBAAM,OAAO,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,YACvC,OAAO;AACL,4BAAc;AACd,oBAAM;AAAA,YACR;AAAA,UACF,OAAO;AACL,0BAAc;AACd,kBAAM;AAAA,UACR;AACA,cAAI,QAAQ,YAAY;AACtB,kBAAM;AAAA,UACR;AACA,gBAAM,iBAAiB;AACvB,cAAI,QAAQ,YAAY;AACtB,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,UACtC,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO;AAAA,UACd,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,wBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,2BAAK;AACL,qCAAe;AAAA,oBACjB,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,0BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,6BAAK;AACL,uCAAe;AAAA,sBACjB,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,0BAAI,OAAO,YAAY;AACrB,4BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,+BAAK;AACL,yCAAe;AAAA,wBACjB,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AACA,4BAAI,OAAO,YAAY;AACrB,8BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iCAAK;AACL,2CAAe;AAAA,0BACjB,OAAO;AACL,iCAAK;AACL,gCAAI,oBAAoB,GAAG;AAAE,uCAAS,OAAO;AAAA,4BAAG;AAAA,0BAClD;AACA,8BAAI,OAAO,YAAY;AACrB,gCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mCAAK;AACL,6CAAe;AAAA,4BACjB,OAAO;AACL,mCAAK;AACL,kCAAI,oBAAoB,GAAG;AAAE,yCAAS,OAAO;AAAA,8BAAG;AAAA,4BAClD;AACA,gCAAI,OAAO,YAAY;AACrB,kCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qCAAK;AACL,+CAAe;AAAA,8BACjB,OAAO;AACL,qCAAK;AACL,oCAAI,oBAAoB,GAAG;AAAE,2CAAS,OAAO;AAAA,gCAAG;AAAA,8BAClD;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AClhDO,IAAM,eAA6C;AAAA,EACxD,aAAa,OAA8B;AACzC,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA8B;AACtC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAmB,OAAoC;AAC5D,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;ACQA,IAAMC,YAAW;AAEV,SAAS,YAAY,IAAmB,OAAoC;AACjF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,QAAM,aAAa,oBAAI,IAAgC;AACvD,QAAM,SAAS,CAACC,OAA2C;AACzD,QAAIA,GAAE,SAAS,WAAWA,GAAE,SAAS,MAAO,QAAO,EAAE,GAAG,IAAI,GAAG,GAAG;AAClE,QAAIA,GAAE,SAAS,SAAU,QAAO,EAAE,GAAG,IAAI,GAAG,GAAG;AAC/C,UAAM,OAAO,qBAAqBA,GAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAClE,eAAW,IAAIA,GAAE,IAAI,IAAI;AACzB,UAAM,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,eAAe,EAAE,CAAC;AACxD,UAAMC,KAAI,KAAK,YAAY,IAAI,IAAI,KAAK,aAAa,OAAO,QAAQ,EAAE,IAAI;AAC1E,WAAO,EAAE,GAAG,GAAAA,GAAE;AAAA,EAChB;AACA,QAAM,QAAQ,IAAI,IAAI,GAAG,OAAO,IAAI,CAACD,OAAM,CAACA,GAAE,IAAI,OAAOA,EAAC,CAAC,CAAC,CAAC;AAE7D,QAAM,aAAa,GAAG,cAAc,CAAC;AACrC,QAAM,eAAe,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACxD,QAAM,eAAe,IAAI,IAAI,WAAW,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAG7D,QAAM,oBAAoB,oBAAI,IAAY;AAC1C,aAAW,QAAQ,YAAY;AAC7B,eAAW,MAAM,KAAK,SAAS;AAC7B,UAAI,GAAG,WAAW,UAAU,KAAK,GAAG,WAAW,QAAQ,GAAG;AACxD,0BAAkB,IAAI,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,qBAAqB,oBAAI,IAA+B;AAC9D,aAAW,QAAQ,YAAY;AAC7B,UAAM,cAAc,KAAK,QAAQ,OAAO,CAAC,OAAO,CAAC,kBAAkB,IAAI,EAAE,CAAC;AAC1E,uBAAmB,IAAI,KAAK,IAAI,YAAY,SAAS,IAAI,cAAc,KAAK,OAAO;AAAA,EACrF;AAIA,QAAM,eAAe,GAAG,OAAO;AAAA,IAC7B,CAACA,OAAM,CAAC,aAAa,IAAIA,GAAE,EAAE,KAAK,CAAC,kBAAkB,IAAIA,GAAE,EAAE;AAAA,EAC/D;AACA,QAAM,QAAqB,aAAa,IAAI,CAACA,QAAO;AAAA,IAClD,IAAIA,GAAE;AAAA,IACN,OAAO,MAAM,IAAIA,GAAE,EAAE,EAAG;AAAA,IACxB,QAAQ,MAAM,IAAIA,GAAE,EAAE,EAAG;AAAA,EAC3B,EAAE;AAKF,QAAME,SAAqB,CAAC;AAC5B,aAAW,KAAK,GAAG,aAAa;AAC9B,QAAI,kBAAkB,IAAI,EAAE,IAAI,KAAK,kBAAkB,IAAI,EAAE,EAAE,GAAG;AAChE;AAAA,IACF;AACA,QAAI,OAAO,EAAE;AACb,QAAI,KAAK,EAAE;AACX,UAAM,cAAc,mBAAmB,IAAI,IAAI;AAC/C,QAAI,eAAe,YAAY,SAAS,GAAG;AACzC,aAAO,YAAY,YAAY,SAAS,CAAC;AAAA,IAC3C;AACA,UAAM,YAAY,mBAAmB,IAAI,EAAE;AAC3C,QAAI,aAAa,UAAU,SAAS,GAAG;AACrC,WAAK,UAAU,CAAC;AAAA,IAClB;AACA,IAAAA,OAAM,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,EACzB;AACA,QAAM,OAAO,cAAc,OAAOA,QAAO,EAAE,WAAW,MAAM,UAAU,IAAI,SAAS,IAAI,OAAO,CAAC;AAE/F,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,OAAO;AAEb,QAAM,WAA2B,CAAC;AAClC,MAAI;AACF,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAGF,QAAM,gBAAgB,oBAAI,IAAqE;AAC/F,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,QAAQ,YAAY;AAC7B,UAAM,UAAU,mBAAmB,IAAI,KAAK,EAAE,KAAK,KAAK;AACxD,UAAM,cAAc,IAAI,IAAI,OAAO;AACnC,UAAM,QAAQ,QACX,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,EAAE,CAAC,EAC9B,OAAO,CAAC,MAAkC,CAAC,CAAC,CAAC;AAChD,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,MAAM;AACZ,QAAI,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI;AAChD,QAAI,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,MAAM,KAAK;AAC3D,QAAI,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI;AAC1D,QAAI,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM;AAIjE,eAAW,CAAC,IAAI,GAAG,KAAK,KAAK,OAAO;AAClC,UAAI,YAAY,IAAI,EAAE,KAAK,OAAO,IAAI,EAAE,EAAG;AAC3C,YAAM,SAAS,IAAI;AACnB,YAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,YAAM,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI;AACrD,YAAM,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI;AAEhE,UAAI,UAAU,WAAW,UAAU,QAAS;AAE5C,YAAM,SAAS,IAAI,GACjB,UAAU,IAAI,IAAI,IAAI;AACxB,YAAM,iBACH,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK;AACxF,UAAI,SAAS,QAAQ,UAAU,MAAM;AACnC,YAAI,WAAW,eAAe;AAE5B,iBAAO,KAAK,IAAI,MAAM,UAAU,CAAC;AAAA,QACnC,OAAO;AAEL,iBAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AACzE,kBAAc,IAAI,KAAK,IAAI,IAAI;AAC/B,WAAO,IAAI,KAAK,EAAE;AAClB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,QAAQ,IAAI,KAAK,MAAM,EAAE;AAAA,QAC/E,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,IAAI,SAAS,IAAI;AAAA,MACzB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,OAAO,IAAI,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,GAAG,WAAW,eAAe,QAAQ,MAAM;AAAA,QACzF,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,UAAU,CACd,OACwE;AACxE,UAAM,IAAI,cAAc,IAAI,EAAE;AAC9B,QAAI,EAAG,QAAO;AACd,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAC3B,WAAO,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,MAAM,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,IAAI;AAAA,EAC3E;AAGA,QAAM,WAAW,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AACxC,MAAI,eAAe;AACnB,aAAW,KAAK,GAAG,aAAa;AAC9B,QAAI,kBAAkB,IAAI,EAAE,IAAI,KAAK,kBAAkB,IAAI,EAAE,EAAE,EAAG;AAClE,UAAM,iBAAiB;AACvB,UAAM,IAAI,QAAQ,EAAE,IAAI,GACtB,IAAI,QAAQ,EAAE,EAAE;AAClB,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AACzD,UAAM,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AACzD,UAAM,KAAK,YAAY,GAAG,GAAG,GAAG,GAAG,CAAC;AACpC,UAAM,KAAK,YAAY,GAAG,GAAG,GAAG,GAAG,CAAC;AAGpC,UAAM,UAAU,KAAK,MAAM,IAAI,EAAE,IAAI,GACnC,QAAQ,KAAK,MAAM,IAAI,EAAE,EAAE;AAC7B,QAAI;AACJ,UAAM,QAAQ,KAAK,UAAU,IAAI,cAAc;AAC/C,QAAI,SAAS,MAAM,SAAS,KAAK,WAAW,OAAO;AACjD,YAAM,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,OAAO;AACzD,YAAM,aAAa,SAAS,OAAO,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,QAAQ,EAAE,CAAC;AAC5E,YAAM,uBACJ,WAAW,SAAS,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,IAAI,OAAO;AACnG,YAAM,SAAS,uBAAuB,EAAE,KAAK;AAC7C,YAAM,WAAW,YAAY,GAAG,OAAO,GAAG,KAAK;AAC/C,YAAM,MAAM,CAAC,QAAQ,EAAE,GAAG,OAAO,GAAG,GAAG,MAAM,GAAG,QAAQ;AACxD,iBAAW,IAAI,IAAI,CAACC,IAAG,QAAQ,GAAG,QAAQ,IAAI,MAAM,GAAG,IAAI,IAAIA,GAAE,CAAC,CAAC,IAAI,IAAIA,GAAE,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AAAA,IAC7F,WAAW,WAAW,OAAO;AAC3B,OAAC,EAAE,MAAM,SAAS,IAAI,UAAU,SAAS,OAAO,UAAU,IAAI;AAAA,IAChE,OAAO;AACL,iBAAW,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,IACpE;AACA,aAAS,KAAK,EAAE,KAAK,UAAU,QAAQ,WAAW,KAAK,EAAE,WAAWJ,UAAS,CAAC,CAAC;AAC/E,QAAI,EAAE,OAAO;AACX,UAAI,MAAM,GAAG,IAAI,GAAG,KAAK,GACvB,MAAM,GAAG,IAAI,GAAG,KAAK;AAIvB,iBAAW,CAAC,QAAQ,EAAE,KAAK,eAAe;AACxC,cAAM,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACnD,YAAI,CAAC,KAAM;AACX,cAAM,aAAa,KAAK,QAAQ,SAAS,EAAE,IAAI;AAC/C,cAAM,WAAW,KAAK,QAAQ,SAAS,EAAE,EAAE;AAC3C,YAAI,cAAc,SAAU;AAC5B,YAAI,CAAC,cAAc,CAAC,SAAU;AAE9B,YAAI,KAAK,GAAG,KAAK,KAAK,GAAG,IAAI,GAAG,SAAS,KAAK,GAAG,KAAK,KAAK,GAAG,IAAI,GAAG,QAAQ;AAC3E,eAAK,GAAG,IAAI,WAAW,gBAAgB;AACvC;AAAA,QACF;AAAA,MACF;AACA,YAAM,IAAI,YAAY,EAAE,OAAO,WAAW,aAAa,EAAE,QAAQ;AACjE,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,YACE,GAAG,IAAI,KAAK,IAAI,CAAC;AAAA,YACjB,GAAG,IAAI,KAAK,WAAW,aAAa;AAAA,YACpC,OAAO,IAAI,CAAC;AAAA,YACZ,QAAQ,WAAW,gBAAgB;AAAA,UACrC;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,OAAO,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,WAAW,eAAe,QAAQ,WAAW;AAAA,UACpF,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,aAAWC,MAAK,GAAG,QAAQ;AACzB,QAAI,OAAO,IAAIA,GAAE,EAAE,KAAK,kBAAkB,IAAIA,GAAE,EAAE,EAAG;AACrD,UAAM,MAAM,KAAK,MAAM,IAAIA,GAAE,EAAE;AAC/B,UAAM,IAAI,IAAI,GACZ,IAAI,IAAI,IAAI;AACd,UAAM,KAAK,IAAI,IAAI,QAAQ,GACzB,KAAK,IAAI,IAAI,SAAS;AACxB,QAAIA,GAAE,SAAS,SAAS;AACtB,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,QAAQ,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA,IACtF,WAAWA,GAAE,SAAS,OAAO;AAC3B,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,QAAQ,QAAQ,MAAM,GAAG,CAAC;AACjF,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,QAAQ,MAAM,QAAQ,MAAM,CAAC,CAAC;AAAA,IACtF,WAAWA,GAAE,SAAS,UAAU;AAC9B,YAAM,IAAI,IAAI,QAAQ;AACtB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,UAC/G,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,MAAM,QAAQ,QAAQ;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,IAAI,KAAK,GAAG,QAAQ,IAAI,IAAI,MAAM,EAAE;AAAA,UACvE,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,GAAG;AAAA,QACX;AAAA,MACF;AACA,YAAM,OAAO,WAAW,IAAIA,GAAE,EAAE;AAChC,UAAI,MAAM;AACR,iBAAS;AAAA,UACP,GAAG;AAAA,YACD;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,EAAE,OAAO,UAAU,aAAa,KAAK;AAAA,UACvC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,KAAK,QAAQ,MAAM;AACzC,QAAM,SAAS,OAAO,KAAK,SAAS,OAAO,MAAM;AACjD,QAAM,IAAI,MAAM,OAAO,aAAa;AACpC,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AACvB,QAAM,OAAO;AAAA,IACX,eAAeD,SAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,yCAAyC,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,EACzL;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;AC7UE,SAAS,QAAQ,OAAO,QAAQ,aAAa,YAAY,OAAO;AAC9D,QAAM,SAAS,CAAC,IAAI,OAAO,SAAS;AAClC,QAAI,IAAI,OAAO,KAAK,OAAK,EAAE,OAAO,EAAE;AACpC,QAAI,CAAC,GAAG;AAAE,UAAI,EAAE,IAAI,OAAO,SAAS,IAAI,MAAM,QAAQ,SAAS;AAAG,aAAO,KAAK,CAAC;AAAA,IAAG,OAC7E;AACH,UAAI,MAAO,GAAE,QAAQ;AACrB,UAAI,QAAQ,EAAE,SAAS,SAAU,GAAE,OAAO;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM,CAAC,GAAG,SAAS;AACvB,QAAI,MAAM,OAAO;AACf,YAAM,KAAK,SAAS,SAAS,cAAc;AAC3C,aAAO,IAAI,IAAI,SAAS,SAAS,UAAU,KAAK;AAChD,aAAO;AAAA,IACT;AACA,WAAO,CAAC;AACR,WAAO;AAAA,EACT;AACA,QAAM,WAAW,oBAAI,IAAI;AACzB,aAAW,MAAM,MAAM,OAAO,OAAO,GAAG;AACtC,QAAI,GAAG,MAAM,UAAU;AAAE,aAAO,GAAG,IAAI,GAAG,IAAI,QAAQ;AAAG,eAAS,IAAI,GAAG,EAAE;AAAA,IAAG,WACrE,GAAG,MAAM,SAAS;AAAE,aAAO,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,QAAQ;AAAG,eAAS,IAAI,GAAG,EAAE;AAAA,IAAG,WACrF,GAAG,MAAM,SAAS;AACzB,UAAI,UAAU,GAAG,SAAS,SAAS,GAAG,OAAO,QAAQ;AACnD,YAAI,GAAG,SAAS,OAAO;AAAE,iBAAO,GAAG,IAAI;AAAG,mBAAS,IAAI,GAAG,IAAI;AAAA,QAAG;AACjE,YAAI,GAAG,OAAO,OAAO;AAAE,iBAAO,GAAG,EAAE;AAAG,mBAAS,IAAI,GAAG,EAAE;AAAA,QAAG;AAAA,MAC7D,OAAO;AACL,cAAMK,KAAI,IAAI,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI;AACpD,oBAAY,KAAK,EAAE,MAAMA,IAAG,IAAQ,GAAI,GAAG,QAAQ,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC;AAC9E,YAAIA,OAAM,eAAeA,OAAM,UAAW,UAAS,IAAIA,EAAC;AACxD,YAAI,OAAO,eAAe,OAAO,UAAW,UAAS,IAAI,EAAE;AAAA,MAC7D;AAAA,IACF,WAAW,GAAG,MAAM,SAAS;AAC3B,YAAM,WAAW,QAAQ,GAAG,OAAO,QAAQ,aAAa,YAAY,GAAG,IAAI;AAC3E,YAAM,YAAY,CAAC,GAAG,QAAQ;AAC9B,iBAAW,KAAK,EAAE,IAAI,GAAG,MAAM,OAAO,GAAG,MAAM,SAAS,UAAU,CAAC;AACnE,iBAAW,MAAM,SAAU,UAAS,IAAI,EAAE;AAAA,IAC5C;AAAA,EACF;AACA,SAAO;AACT;AAEF,SAASC,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,gBAAgB,IAAI;AACxD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,IAAI;AAC/C,MAAI,UAAU,uBAAuB,aAAa,IAAI;AACtD,MAAI,UAAU,uBAAuB,QAAQ,IAAI;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,UAAM,SAAS,CAAC;AAChB,UAAM,cAAc,CAAC;AACrB,UAAM,aAAa,CAAC;AACpB,YAAQ,OAAO,QAAQ,aAAa,UAAU;AAC9C,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,QAAQ,aAAa,GAAI,WAAW,SAAS,EAAE,WAAW,IAAI,CAAC,EAAG;AAAA,EAC1H;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,MAAM,OAAO;AAAE,WAAO,EAAE,GAAG,SAAS,MAAM,MAAM;AAAA,EAAG;AACzE,MAAI,SAAS,SAAS,IAAI;AAAE,WAAO,EAAE,GAAG,UAAU,GAAG;AAAA,EAAG;AACxD,MAAI,SAAS,SAAS,MAAM,IAAI,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AACtD,MAAI,SAAS,SAAS,MAAM,IAAI,OAAO;AACnC,WAAO,EAAE,GAAG,SAAS,MAAM,IAAI,OAAO,SAAS,OAAU;AAAA,EAC3D;AACF,MAAI,SAAS,SAAS,OAAO,IAAI;AAAE,WAAO,EAAE,GAAG,SAAS,IAAI,MAAM;AAAA,EAAG;AACrE,MAAI,SAAS,SAAS,IAAI;AAAE,WAAO,EAAE,GAAG,SAAS,IAAI,OAAO,GAAG;AAAA,EAAG;AAClE,MAAI,SAAS,SAAS,IAAI,OAAO;AAAE,WAAO,EAAE,GAAG,SAAS,IAAI,OAAO,MAAM,KAAK,EAAE;AAAA,EAAG;AACnF,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAO;AACzC,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,kBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,oBAAoB;AACzB,QAAI,OAAO,YAAY;AACrB,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AACxB,cAAI,OAAO,YAAY;AACrB,iBAAK,uBAAuB;AAC5B,gBAAI,OAAO,YAAY;AACrB,mBAAK,uBAAuB;AAC5B,kBAAI,OAAO,YAAY;AACrB,qBAAK,mBAAmB;AAAA,cAC1B;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;AAE3D,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP;AACA,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,oBAAM,CAAC;AACP,oBAAM,mBAAmB;AACzB,qBAAO,QAAQ,YAAY;AACzB,oBAAI,KAAK,GAAG;AACZ,sBAAM,mBAAmB;AAAA,cAC3B;AACA,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,iBAAiB;AACvB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,uBAAK,OAAO,IAAI,GAAG;AAAA,gBACrB,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,OAAO,YAAY;AACrB,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,uBAAK,iBAAiB;AACtB,sBAAI,OAAO,YAAY;AACrB,mCAAe;AACf,yBAAK,OAAO,EAAE;AAAA,kBAChB,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAEjD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,kBAAM,WAAW;AACjB,kBAAM,oBAAoB;AAC1B,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,OAAO,IAAI,IAAI,GAAG;AAAA,YACzB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP;AACA,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,UACxB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,OAAO,aAAa,CAAC;AAChC,gBAAI,GAAG,YAAY,MAAM,SAAS;AAChC,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,YAAY;AACjB,kBAAI,OAAO,YAAY;AACrB,qBAAK,eAAe;AACpB,oBAAI,OAAO,YAAY;AACrB,uBAAK,iBAAiB;AACtB,sBAAI,OAAO,YAAY;AACrB,mCAAe;AACf,yBAAK,OAAO,IAAI,EAAE;AAAA,kBACpB,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,eAAe;AACpB,cAAI,OAAO,YAAY;AACrB,iBAAK,iBAAiB;AACtB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,SAAS;AAChC,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ;AAAA,UACf,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK,eAAe;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,eAAe;AAAA,IACtB;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AC1gDO,IAAM,QAAsC;AAAA,EACjD,aAAa,OAA8B;AACzC,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA8B;AACtC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAmB,OAAoC;AAC5D,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;ACIO,SAAS,SAAS,IAAgB,OAAoC;AAC3E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,WAAW,WAAW;AAC5B,QAAM,UAAU,WAAW;AAC3B,QAAM,OAAO,OAAO,UAAU,GAAG;AACjC,QAAM,QAAQ,OAAO,WAAW,GAAG;AAEnC,QAAM,SAAS,CAAC,MAA0C;AACxD,UAAM,UAAU,CAAC,MACf,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,GAAG,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE;AAClD,UAAM,IAAI,KAAK;AAAA,MACb;AAAA,MACA,YAAY,EAAE,MAAM,QAAQ,EAAE,QAAQ;AAAA,MACtC,GAAG,EAAE,WAAW,IAAI,CAAC,MAAM,YAAY,QAAQ,CAAC,GAAG,OAAO,EAAE,QAAQ,EAAE;AAAA,IACxE;AACA,UAAMC,KAAI,QAAQ,EAAE,WAAW,SAAS,QAAQ,EAAE,WAAW,SAAS,IAAI;AAC1E,WAAO,EAAE,GAAG,GAAAA,GAAE;AAAA,EAChB;AACA,QAAM,QAAQ,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;AAEjE,QAAM,QAAqB,GAAG,SAAS,IAAI,CAAC,OAAO;AAAA,IACjD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,IAAI,EAAG;AAAA,IAC1B,QAAQ,MAAM,IAAI,EAAE,IAAI,EAAG;AAAA,EAC7B,EAAE;AACF,QAAMC,SAAqB,GAAG,UAAU,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE;AAClF,QAAM,OAAO,cAAc,OAAOA,QAAO,EAAE,WAAW,MAAM,UAAU,IAAI,SAAS,IAAI,OAAO,CAAC;AAE/F,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,OAAO;AAEb,QAAM,WAA2B,CAAC;AAClC,MAAI;AACF,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAGF,QAAM,WAAW,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AACxC,aAAW,KAAK,GAAG,WAAW;AAC5B,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE,IAAI,GAC7B,IAAI,KAAK,MAAM,IAAI,EAAE,KAAK;AAC5B,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK;AAChE,UAAM,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK;AAChE,UAAM,KAAK,YAAY,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1D,UAAM,KAAK,YAAY,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC;AAC1D,UAAM,EAAE,KAAK,IAAI,UAAU,GAAG,GAAG,UAAU,IAAI;AAC/C,aAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,WAAW,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC;AACnF,aAAS,KAAK,GAAG,SAAS,GAAG,IAAI,IAAI,EAAE,UAAU,OAAO,CAAC;AACzD,aAAS,KAAK,GAAG,SAAS,GAAG,IAAI,IAAI,EAAE,WAAW,OAAO,CAAC;AAC1D,QAAI,EAAE,OAAO;AACX,YAAM,MAAM,GAAG,IAAI,GAAG,KAAK,GACzB,MAAM,GAAG,IAAI,GAAG,KAAK;AACvB,YAAM,IAAI,YAAY,EAAE,OAAO,OAAO,EAAE,QAAQ;AAChD,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,OAAO,GAAG,OAAO,IAAI,CAAC,GAAG,QAAQ,UAAU,EAAE;AAAA,UAC/E,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,OAAO,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,SAAS,QAAQ,WAAW,EAAE,QAAQ,SAAS,CAAC;AAAA,MAC3F;AAAA,IACF;AAAA,EACF;AAGA,aAAW,KAAK,GAAG,UAAU;AAC3B,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE,IAAI;AACjC,UAAM,IAAI,MAAM,IAAI,EAAE,IAAI;AAC1B,UAAM,IAAI,IAAI,GACZ,IAAI,IAAI,IAAI;AACd,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC,EAAE;AAAA,QAC1D,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC,GAAG,QAAQ,MAAM;AAAA,QACvD,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE;AAAA,QACF,OAAO,IAAI,EAAE,IAAI,CAAC;AAAA,QAClB,IAAI,IAAI,QAAQ,IAAI,WAAW,IAAI;AAAA,QACnC;AAAA,QACA,aAAa,QAAQ,SAAS,KAAK;AAAA,QACnC,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AACA,QAAI,KAAK,IAAI,QAAQ,OAAO;AAC5B,eAAW,KAAK,EAAE,YAAY;AAC5B,eAAS,KAAK,EAAE,KAAK,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS,QAAQ,IAAI,CAAC;AACxF,UAAI,EAAE;AACJ,iBAAS;AAAA,UACP,EAAE,KAAK,EAAE,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,SAAS,QAAQ,WAAW;AAAA,YACnE,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACF,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,KAAK,QAAQ,MAAM;AACzC,QAAM,SAAS,OAAO,KAAK,SAAS,OAAO,MAAM;AAEjD,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;AAGA,SAAS,SACP,GACA,IACA,QACA,MACA,SACgB;AAChB,QAAM,MAAM,KAAK,MAAM,OAAO,IAAI,GAAG,GAAG,OAAO,IAAI,GAAG,CAAC,KAAK;AAC5D,QAAM,MAAM,OAAO,IAAI,GAAG,KAAK,KAC7B,MAAM,OAAO,IAAI,GAAG,KAAK;AAC3B,QAAM,KAAK,CAAC,IACV,KAAK;AACP,QAAM,MAAM,CAAC,GAAW,OAAe,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,IAAI,KAAK,EAAE;AAC9F,QAAM,MAAsB,CAAC;AAC7B,QAAM,QAAQ,QAAQ;AAEtB,QAAM,OAAO,OAAO,KAAK,IAAI;AAC7B,QAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,QAAM,MAAM,KAAK,KAAK,IAAI;AAE1B,MAAI,MAAM;AACR,UAAM,OAAO,IAAI,IAAI,CAAC;AACtB,UAAM,IAAI,IAAI,GAAG,CAAC,GAChB,IAAI,IAAI,GAAG,EAAE;AACf,QAAI,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC;AACxF,QAAI,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC;AACxF,QAAI,KAAK,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC;AAAA,EAC5F,WAAW,KAAK;AACd,UAAM,KAAK,IAAI,IAAI,CAAC,GAClB,KAAK,IAAI,IAAI,EAAE;AACjB,QAAI,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC;AAAA,EACxF;AACA,MAAI,MAAM;AACR,UAAM,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC;AAC/B,QAAI,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,EAAE,GAAG,GAAG,QAAQ,YAAY,OAAO,GAAG,CAAC;AAAA,EACpF,WAAW,OAAO,CAAC,MAAM;AACvB,UAAM,KAAK,IAAI,IAAI,CAAC,GAClB,KAAK,IAAI,IAAI,EAAE;AACjB,QAAI,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,OAAO,GAAG,CAAC;AAAA,EACxF;AACA,SAAO;AACT;;;ACvMA,SAASC,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,aAAa,IAAI;AACrD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAM,KAAK;AAC/C,MAAI,SAAS,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK;AACrE,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,UAAM,WAAW,CAAC;AAClB,UAAM,YAAY,CAAC;AACnB,UAAM,SAAS,CAAC,SAAS;AAAE,UAAI,IAAI,SAAS,KAAK,OAAK,EAAE,SAAS,IAAI;AAAG,UAAI,CAAC,GAAG;AAAE,YAAI,EAAE,MAAM,YAAY,CAAC,EAAE;AAAG,iBAAS,KAAK,CAAC;AAAA,MAAG;AAAE,aAAO;AAAA,IAAG;AAC9I,eAAW,MAAM,MAAM,OAAO,OAAO,GAAG;AACtC,UAAI,GAAG,MAAM,UAAU;AAAE,cAAM,IAAI,OAAO,GAAG,IAAI;AAAG,mBAAW,KAAK,GAAG,MAAO,GAAE,WAAW,KAAK,CAAC;AAAA,MAAG,WAC3F,GAAG,MAAM,OAAO;AACvB,eAAO,GAAG,IAAI;AAAG,eAAO,GAAG,KAAK;AAChC,cAAM,SAAS,GAAG,IAAI,SAAS,IAAI;AACnC,cAAM,WAAW,GAAG,IAAI,MAAM,GAAG,CAAC;AAClC,cAAM,YAAY,GAAG,IAAI,MAAM,EAAE;AACjC,kBAAU,KAAK,EAAE,MAAM,GAAG,MAAM,OAAO,GAAG,OAAO,UAAU,WAAW,QAAQ,GAAI,GAAG,QAAQ,EAAE,OAAO,GAAG,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,MAC1H;AAAA,IACF;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,UAAU,UAAU;AAAA,EAC5E;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,MAAM,MAAM;AAAE,WAAO,EAAE,GAAG,UAAU,MAAM,OAAO,KAAK,OAAO,OAAO,EAAE;AAAA,EAAG;AAC/F,MAAI,SAAS,SAAS,MAAM,MAAM,GAAG;AAAE,WAAO;AAAA,EAAG;AACjD,MAAI,SAAS,SAAS,MAAM,MAAM,KAAK;AACnC,WAAO,EAAE,MAAM,MAAM,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC,EAAG;AAAA,EAC/C;AACF,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,MAAM,KAAK,OAAO,OAAO;AAC3C,WAAO,EAAE,GAAG,OAAO,MAAM,OAAO,KAAK,MAAM;AAAA,EAC7C;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACrC,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC5C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,kBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAEjD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,eAAK,iBAAiB;AACtB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,iBAAiB;AAAA,UACxB;AACA,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,kBAAM;AACN;AAAA,UACF,OAAO;AACL,kBAAM;AACN,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,QAAQ,YAAY;AACtB,kBAAM,iBAAiB;AACvB,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,OAAO,IAAI,EAAE;AAAA,YACpB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAEjD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,eAAe;AACpB,UAAI,OAAO,YAAY;AACrB,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,eAAe;AACpB,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,aAAa;AAClB,kBAAI,OAAO,YAAY;AACrB,+BAAe;AACf,qBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,cACxB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP;AACA,iBAAK;AACL,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,qBAAK;AACL;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,OAAO,YAAY;AACrB,sBAAM,CAAC;AACP,sBAAM,MAAM,OAAO,WAAW;AAC9B,oBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,MAAM;AAAA,kBAAG;AAAA,gBACjD;AACA,uBAAO,QAAQ,YAAY;AACzB,sBAAI,KAAK,GAAG;AACZ,wBAAM,MAAM,OAAO,WAAW;AAC9B,sBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,MAAM;AAAA,oBAAG;AAAA,kBACjD;AAAA,gBACF;AACA,oBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,wBAAM;AACN;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,MAAM;AAAA,kBAAG;AAAA,gBACjD;AACA,oBAAI,QAAQ,YAAY;AACtB,uBAAK,CAAC,IAAI,IAAI,KAAK,GAAG;AACtB,uBAAK;AAAA,gBACP,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP;AACA,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP;AACA,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,oBAAM;AACN;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,QAAQ,YAAY;AACtB,6BAAe;AACf,mBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,YACxB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK;AAEjD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,eAAe;AACpB,gBAAI,OAAO,YAAY;AACrB,mBAAK,WAAW;AAChB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,qBAAK;AACL;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK,WAAW;AAChB,sBAAM,kBAAkB;AACxB,oBAAI,QAAQ,YAAY;AACtB,wBAAM,iBAAiB;AACvB,sBAAI,QAAQ,YAAY;AACtB,mCAAe;AACf,yBAAK,OAAO,IAAI,IAAI,IAAI,GAAG;AAAA,kBAC7B,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB;AACA,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,IAAI,IAAI,IAAI,EAAE;AACxB,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACn3CO,IAAM,KAAgC;AAAA,EAC3C,aAAa,OAA2B;AACtC,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA2B;AACnC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAgB,OAAoC;AACzD,WAAO,SAAS,IAAI,KAAK;AAAA,EAC3B;AACF;;;ACIA,IAAM,eAAe;AACrB,IAAM,iBAAiB;AAEvB,SAAS,SAAS,OAA+C;AAC/D,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,gBAAgB,OAA2B,MAAsB;AACxE,SAAO,UAAU,UAAU,OAAO,IAAI;AACxC;AAEO,SAAS,YAAY,IAAmB,OAAoC;AACjF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,QAAM,OAAO,KAAK,IAAI,GAAG,GAAG,OAAO;AACnC,QAAM,QAAQ;AACd,QAAM,MAAM;AACZ,QAAM,cAAc;AACpB,QAAM,SAAS,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACnE,QAAM,MAAM,SAAS;AAGrB,QAAM,aAAa,oBAAI,IAAgC;AACvD,aAAW,KAAK,GAAG,QAAQ;AACzB,UAAM,OAAO,KAAK,IAAI,EAAE,MAAM,IAAI;AAClC,UAAM,IAAI,OAAO,SAAS,OAAO,KAAK;AACtC,UAAM,OAAO,qBAAqB,EAAE,OAAO,MAAM,WAAW,IAAI,IAAI,CAAC;AACrE,eAAW,IAAI,EAAE,IAAI,IAAI;AAAA,EAC3B;AAGA,QAAM,QAAQ,oBAAI,IAAkB;AACpC,MAAI,MAAM,GACR,MAAM;AACR,QAAM,WAAwF,CAAC;AAC/F,QAAM,cAAc,oBAAI,IAAoB;AAE5C,aAAW,KAAK,GAAG,QAAQ;AACzB,UAAM,OAAO,KAAK,IAAI,EAAE,MAAM,IAAI;AAClC,QAAI,MAAM,OAAO,MAAM;AACrB,YAAM;AACN,aAAO;AAAA,IACT;AACA,UAAM,OAAO,WAAW,IAAI,EAAE,EAAE;AAChC,gBAAY,IAAI,KAAK,KAAK,IAAI,YAAY,IAAI,GAAG,KAAK,GAAG,KAAK,SAAS,CAAC;AACxE,aAAS,KAAK,EAAE,GAAG,MAAM,KAAK,IAAI,CAAC;AACnC,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,oBAAI,IAAoB;AACrC,QAAM,eAAe,oBAAI,IAAoB;AAC7C,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,KAAK,KAAK,KAAK;AAC7B,UAAM,OAAO,YAAY,IAAI,CAAC,KAAK;AACnC,UAAMC,KAAI,OAAO,IAAI,IAAI,QAAQ,OAAO,QAAQ,EAAE,IAAI;AACtD,SAAK,IAAI,GAAG,IAAI;AAChB,iBAAa,IAAI,GAAGA,EAAC;AACrB,YAAQA,KAAI;AAAA,EACd;AAEA,aAAW,QAAQ,UAAU;AAC3B,UAAM,IAAI,SAAS,KAAK,OAAO,QAAQ;AACvC,UAAM,IAAI,KAAK,OAAO,SAAS,KAAK,OAAO,KAAK;AAChD,UAAM,IAAI,KAAK,IAAI,KAAK,GAAG;AAC3B,UAAMA,KAAI,aAAa,IAAI,KAAK,GAAG;AACnC,UAAM,IAAI,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQA,GAAE,CAAC;AAAA,EACpD;AAEA,QAAM,WAA2B,CAAC;AAClC,MAAI,GAAG,SAAS;AACd,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAGF,aAAW,KAAK,GAAG,OAAO;AACxB,UAAM,IAAI,MAAM,IAAI,EAAE,IAAI,GACxB,IAAI,MAAM,IAAI,EAAE,EAAE;AACpB,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AACzD,UAAM,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AACzD,UAAM,KAAK,YAAY,GAAG,GAAG,GAAG,GAAG,CAAC;AACpC,UAAM,KAAK,YAAY,GAAG,GAAG,GAAG,GAAG,CAAC;AACpC,UAAM,QAAQ,EAAE,SAAS;AACzB,UAAM,WAAyC,CAAC;AAChD,SAAK,EAAE,aAAa,aAAa,QAAS,UAAS,YAAY;AAC/D,QAAI,EAAE,gBAAgB,QAAS,UAAS,cAAc;AACtD,UAAM,OAAO,SAAS,KAAK;AAC3B,QAAI,KAAM,UAAS,OAAO;AAC1B,QAAI;AACJ,QAAI,EAAE,cAAc,OAAQ,QAAO;AAAA,aAC1B,EAAE,UAAW,QAAO,EAAE;AAAA,aACtB,UAAU,YAAY,UAAU,SAAU,QAAO;AAC1D,QAAI,KAAM,UAAS,WAAW;AAC9B,UAAM,OACJ,UAAU,SACN,WAAW,CAAC,IAAI,EAAE,GAAG,GAAG,EAAE,IAC1B,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAC7D,aAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,SAAS,gBAAgB,OAAO,GAAG,GAAG,QAAQ,CAAC;AAClF,QAAI,EAAE;AACJ,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE;AAAA,UACF,QAAQ,GAAG,IAAI,GAAG,KAAK,CAAC;AAAA,UACxB,QAAQ,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC;AAAA,UAC5B,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,EACJ;AAGA,KAAG,OAAO,QAAQ,CAAC,GAAG,MAAM;AAC1B,UAAM,IAAI,MAAM,IAAI,EAAE,EAAE;AACxB,UAAM,MAAM,eAAe,GAAG,KAAK;AACnC,UAAM,OAAO,WAAW,IAAI,EAAE,EAAE;AAChC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,IAAI,EAAE,KAAK,GAAG,QAAQ,IAAI,EAAE,MAAM,EAAE;AAAA,QACvE,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,QAAI,MAAM;AACR,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,UACF;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,EAAE,OAAO,UAAU,aAAa,KAAK;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAMC,YAAW,KAAK,IAAI,QAAQ,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;AAClF,QAAMC,aAAY,KAAK,IAAI,KAAK,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;AACjF,QAAM,IAAI,MAAM,OAAO,aAAa;AACpC,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AACvB,QAAM,OAAO;AAAA,IACX,eAAe,YAAY,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,IACtN,eAAe,cAAc,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,oFAAoF,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,EACxO;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAOD,YAAW,MAAM,GAAG,QAAQ,OAAOC,aAAY,MAAM,EAAE;AAAA,MAC5F,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACxME,IAAM,gBAAgB,IAAI,IAAI,oBAAoB;AAClD,IAAM,sBAAsB;AAAA,EAC1B,QAAS,EAAE,OAAO,SAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EACrE,SAAS,EAAE,OAAO,UAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EACrE,QAAS,EAAE,OAAO,SAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EACrE,SAAS,EAAE,OAAO,UAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EACrE,SAAS,EAAE,OAAO,QAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EAErE,OAAS,EAAE,OAAO,SAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EACpE,QAAS,EAAE,OAAO,UAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EACpE,OAAS,EAAE,OAAO,SAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EACpE,QAAS,EAAE,OAAO,UAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EACpE,QAAS,EAAE,OAAO,QAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EAEpE,OAAS,EAAE,OAAO,SAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,EACnE,OAAS,EAAE,OAAO,UAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,EACnE,OAAS,EAAE,OAAO,SAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,EACnE,OAAS,EAAE,OAAO,UAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,EACnE,OAAS,EAAE,OAAO,QAAU,aAAa,QAAQ,WAAW,OAAO;AACrE;AAEA,SAAS,WAAW,OAAO;AACzB,MAAI,UAAU,OAAQ,QAAO;AAC7B,MAAI,CAAC,cAAc,IAAI,KAAK,GAAG;AAC7B,UAAM,IAAI,MAAM,gCAAgC,KAAK,GAAG;AAAA,EAC1D;AACA,SAAO;AACT;AAEF,SAASC,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,cAAc,IAAI;AACtD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,WAAW,IAAI;AACnD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,SAAS,uBAAuB,SAAS,KAAK;AAClD,MAAI,SAAS,uBAAuB,SAAS,KAAK;AAClD,MAAI,SAAS,uBAAuB,SAAS,KAAK;AAClD,MAAI,SAAS,uBAAuB,QAAQ,KAAK;AACjD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC3D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,QAAI,UAAU;AACd,UAAM,SAAS,CAAC;AAChB,UAAMC,SAAQ,CAAC;AACf,eAAW,KAAK,MAAM,OAAO,OAAO,GAAG;AACrC,UAAS,EAAE,MAAM,UAAW,WAAU,EAAE;AAAA,eAC/B,EAAE,MAAM,SAAW,YAAW,KAAK,EAAE,MAAO,QAAO,KAAK,CAAC;AAAA,eACzD,EAAE,MAAM,OAAW,CAAAA,OAAM,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,GAAI,OAAO,EAAE,OAAO,aAAa,EAAE,aAAa,WAAW,EAAE,WAAW,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC,EAAG,CAAC;AAAA,IACjP;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,SAAS,QAAQ,OAAAA,OAAM;AAAA,EAC/E;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,WAAW,EAAE;AAAA,EAAG;AACvD,MAAI,SAAS,SAAS,MAAM,MAAM,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AACxD,MAAI,SAAS,SAAS,MAAM,MAAM,OAAO,IAAI,MAAM;AAC/C,WAAO,EAAE,GAAG,QAAQ,MAAM,IAAI,OAAO,SAAS,QAAW,GAAG,MAAM,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC,EAAG;AAAA,EAC3I;AACF,MAAI,SAAS,SAAS,OAAO;AACzB,WAAO,oBAAoB,KAAK;AAAA,EAClC;AACF,MAAI,SAAS,SAAS,MAAMC,QAAO,MAAM;AACrC,QAAI,SAAS,KAAK,IAAI,GAAG;AACvB,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AACA,UAAM,SAAS,CAAC;AAChB,QAAIA,QAAO;AACT,YAAM,IAAIA,OAAM,CAAC;AACjB,UAAI,EAAE,SAAS,OAAW,QAAO,YAAY,WAAW,EAAE,IAAI;AAAA,IAChE;AACA,eAAW,OAAO,MAAM;AACtB,aAAO,OAAO,QAAQ,IAAI,CAAC,CAAC;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AACF,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,EAAE,WAAW,MAAM;AAAA,EAAG;AAC5D,MAAI,SAAS,SAAS,OAAO;AAAE,WAAO,WAAW,KAAK;AAAA,EAAG;AACzD,MAAI,UAAU,SAAS,OAAO,MAAM;AAChC,UAAM,SAAS,CAAC;AAChB,WAAO,MAAM,GAAG,IAAI,MAAM;AAC1B,eAAW,KAAK,MAAM;AAAE,aAAO,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE;AAAA,IAAO;AACvD,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,KAAK,OAAO;AAAE,WAAO,EAAE,KAAK,MAAM;AAAA,EAAG;AAC5D,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO;AAAA,EAAO;AAC9C,MAAI,UAAU,SAAS,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC7C,MAAI,UAAU,SAAS,OAAO,MAAM;AAChC,WAAO,EAAE,GAAG,UAAU,OAAO,CAAC,OAAO,GAAG,IAAI,EAAE;AAAA,EAChD;AACF,MAAI,UAAU,SAAS,IAAI,GAAG;AAAE,WAAO;AAAA,EAAG;AAC1C,MAAI,UAAU,SAAS,IAAI,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AACjD,MAAI,UAAU,SAAS,IAAI,OAAO,MAAM;AACpC,WAAO,EAAE,IAAI,OAAO,SAAS,OAAO,MAAM,QAAQ,gBAAgB,EAAE,IAAI,IAAI,MAAM,QAAQ,EAAE;AAAA,EAC9F;AACF,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,SAAS,GAAG,EAAE;AAAA,EAAG;AACpD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASR,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASM,WAAU;AAC/C,WAAO,IAAIR,kBAAgB,SAAS,MAAM,MAAMQ,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBN,WAAU,OAAOM,WAAU;AAC3D,WAAO,IAAIR;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAM;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AACxB,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AAAA,QAC1B;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK;AACL,YAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,gBAAM,MAAM,OAAO,WAAW;AAC9B,cAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,UACF,OAAO;AACL,kBAAM;AACN,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,QAAQ,YAAY;AACtB,mBAAO,QAAQ,YAAY;AACzB,iBAAG,KAAK,GAAG;AACX,oBAAM,MAAM,OAAO,WAAW;AAC9B,kBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,UAAU,IAAI,WAAW;AAAA,UACtC,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,YACxB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,kBAAkB;AACvB,gBAAM,iBAAiB;AACvB,cAAI,QAAQ,YAAY;AACtB,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,IAAI,IAAI,EAAE;AAAA,UAChC,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,wBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,2BAAK;AACL,qCAAe;AAAA,oBACjB,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,0BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,6BAAK;AACL,uCAAe;AAAA,sBACjB,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,0BAAI,OAAO,YAAY;AACrB,4BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,+BAAK;AACL,yCAAe;AAAA,wBACjB,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AACA,4BAAI,OAAO,YAAY;AACrB,8BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iCAAK;AACL,2CAAe;AAAA,0BACjB,OAAO;AACL,iCAAK;AACL,gCAAI,oBAAoB,GAAG;AAAE,uCAAS,OAAO;AAAA,4BAAG;AAAA,0BAClD;AACA,8BAAI,OAAO,YAAY;AACrB,gCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mCAAK;AACL,6CAAe;AAAA,4BACjB,OAAO;AACL,mCAAK;AACL,kCAAI,oBAAoB,GAAG;AAAE,yCAAS,OAAO;AAAA,8BAAG;AAAA,4BAClD;AACA,gCAAI,OAAO,YAAY;AACrB,kCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qCAAK;AACL,+CAAe;AAAA,8BACjB,OAAO;AACL,qCAAK;AACL,oCAAI,oBAAoB,GAAG;AAAE,2CAAS,OAAO;AAAA,gCAAG;AAAA,8BAClD;AACA,kCAAI,OAAO,YAAY;AACrB,oCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,uCAAK;AACL,iDAAe;AAAA,gCACjB,OAAO;AACL,uCAAK;AACL,sCAAI,oBAAoB,GAAG;AAAE,6CAAS,MAAM;AAAA,kCAAG;AAAA,gCACjD;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO,EAAE;AAAA,IAChB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,CAAC;AACN,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,IAAI,EAAE;AAChB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,IAAI,EAAE;AAChB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AACA,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,SAAK,MAAM,UAAU,IAAI,WAAW;AACpC,mBAAe;AACf,SAAK,OAAO,IAAI,IAAI,EAAE;AAEtB,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO,EAAE;AAAA,IAChB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,mBAAmB;AACxB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,mBAAmB;AACxB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,mBAAmB;AACxB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK;AACL,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK;AACL,aAAK,YAAY;AACjB,YAAI,OAAO,YAAY;AACrB,eAAK,kBAAkB;AACvB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,IAAI,EAAE;AAAA,UACrB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AACA,WAAK,WAAW;AAChB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,IAAI,EAAE;AAAA,MACrB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,IAAI,EAAE;AAAA,UACrB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,QACzB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,IACzB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AC/rDO,IAAM,QAAsC;AAAA,EACjD,aAAa,OAA8B;AACzC,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA8B;AACtC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAmB,OAAoC;AAC5D,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;ACGA,IAAMC,YAAW;AACjB,IAAM,QAAQ;AAEP,SAAS,kBAAkB,IAAyB,OAAoC;AAC7F,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,WAAW,WAAW;AAC5B,QAAM,YAAY,WAAW;AAC7B,QAAM,QAAQ,OAAO,YAAY,GAAG;AAGpC,QAAM,WAAW,oBAAI,IAA4C;AACjE,QAAM,SAAS,CAAC,MAAyC;AACvD,UAAMC,SAAkB,CAAC;AACzB,eAAWC,MAAK,EAAE,QAAQ;AACxB,YAAM,UAAUC,UAAS,GAAGD,GAAE,GAAG,KAAKA,GAAE,KAAK,IAAI,WAAW,QAAQ,IAAI,CAAC,EAAE;AAC3E,MAAAD,OAAM,KAAK,GAAG,OAAO;AAAA,IACvB;AACA,UAAM,QAAQ,OAAO,WAAW,GAAG,IAAI,YAAY;AACnD,UAAMG,KAAI,QAAQH,OAAM,SAAS,QAAQ;AACzC,aAAS,IAAI,EAAE,IAAI,EAAE,OAAAA,QAAO,GAAAG,GAAE,CAAC;AAC/B,WAAO,EAAE,GAAG,OAAO,GAAAA,GAAE;AAAA,EACvB;AACA,QAAM,QAAQ,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;AAE5D,QAAM,QAAqB,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IAC9C,IAAI,EAAE;AAAA,IACN,OAAO;AAAA,IACP,QAAQ,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,EAC3B,EAAE;AACF,QAAMC,SAAqB,GAAG,UAAU,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE;AAC/E,QAAM,OAAO,cAAc,OAAOA,QAAO,EAAE,WAAW,MAAM,UAAU,IAAI,SAAS,IAAI,OAAO,CAAC;AAE/F,QAAM,WAA2B,CAAC;AAGlC,QAAM,WAAW,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AACxC,KAAG,UAAU,QAAQ,CAAC,GAAG,OAAO;AAC9B,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE,IAAI,GAC7B,IAAI,KAAK,MAAM,IAAI,EAAE,EAAE;AACzB,QAAI,CAAC,KAAK,CAAC,EAAG;AAEd,QAAI;AACJ,QAAI;AAEJ,UAAM,QAAQ,KAAK,UAAU,IAAI,EAAE;AACnC,QAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,YAAM,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,OAAO;AACzD,YAAM,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,EAAE;AAC5C,YAAM,MAAuC,CAAC,MAAM;AACpD,iBAAW,MAAM,OAAO;AACtB,YAAI,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AAAA,MAC/B;AACA,YAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,YAAM,aAAa,SAAS,OAAO,CAAC,QAAQ,IAAI,IAAI,IAAI,UAAU,KAAK,CAAC;AACxE,YAAM,uBACJ,WAAW,SAAS,IAAI,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,OAAO;AAC5F,YAAM,SAAS,uBAAuB,KAAK,KAAK;AAChD,UAAI,SAAS;AACb,UAAI,KAAK,MAAM;AACf,UAAI,KAAK,EAAE,GAAG,OAAO,GAAG,GAAG,MAAM,CAAC;AAClC,UAAI,KAAK,EAAE,GAAG,KAAK,GAAG,GAAG,MAAM,CAAC;AAChC,UAAI,KAAK,IAAI;AAEb,aAAO,IAAI,IAAI,CAACC,IAAG,QAAQ,GAAG,QAAQ,IAAI,MAAM,GAAG,IAAI,IAAIA,GAAE,CAAC,CAAC,IAAI,IAAIA,GAAE,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AACvF,sBAAgB,EAAE,IAAI,OAAO,IAAI,KAAK,KAAK,GAAG,GAAG,MAAM;AAAA,IACzD,OAAO;AACL,OAAC,EAAE,MAAM,cAAc,IAAI,UAAU,GAAG,GAAG,QAAQ;AAAA,IACrD;AAEA,aAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,WAAW,KAAK,EAAE,MAAM,OAAO,WAAWN,UAAS,CAAC,CAAC;AACxF,UAAM,KAAK,cAAc,GACvB,KAAK,cAAc;AACrB,UAAM,IAAI,YAAY,OAAI,EAAE,IAAI,QAAK,SAAS,EAAE,QAAQ;AACxD,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,QAAQ,YAAY,EAAE;AAAA,QACnF,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,OAAI,EAAE,IAAI,QAAK,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,WAAW,QAAQ,WAAW;AAAA,QAC3E,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,aAAW,KAAK,GAAG,OAAO;AACxB,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE,EAAE;AAC/B,UAAM,OAAO,SAAS,IAAI,EAAE,EAAE;AAC9B,UAAM,EAAE,GAAG,EAAE,IAAI;AACjB,UAAM,QAAQ,OAAO,WAAW,GAAG,IAAI,YAAY;AACnD,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,OAAO,QAAQ,IAAI,IAAI,MAAM,EAAE;AAAA,QAC9D,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,OAAI,EAAE,IAAI;AAAA,QACV,OAAO,IAAI,QAAQ,CAAC;AAAA,QACpB,IAAI,IAAI,YAAY,CAAC;AAAA,QACrB;AAAA,QACA,QAAQ;AAAA,QACR,EAAE,QAAQ,SAAS;AAAA,MACrB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE;AAAA,QACF,OAAO,IAAI,QAAQ,CAAC;AAAA,QACpB,IAAI,IAAI,YAAY,IAAI,QAAQ;AAAA,QAChC;AAAA,QACA,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC;AAAA,QACnE,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,IAAI,QAAQ,QAAQ;AAC7B,eAAW,MAAM,KAAK,OAAO;AAC3B,eAAS,KAAK,EAAE,KAAK,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,WAAW,QAAQ,IAAI,CAAC;AACvE,YAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,OAAO,aAAa;AACpC,QAAM,QAAQ,IAAI;AAClB,QAAM,QAAQ,IAAI,IAAI,GAAG;AACzB,QAAM,WAAW,IAAI,QAAQ,CAAC;AAC9B,QAAM,OAAO;AAAA,IACX,eAAeA,SAAQ,kBAAkB,KAAK,mBAAmB,KAAK,WAAW,CAAC,WAAW,QAAQ,0CAA0C,CAAC,IAAI,QAAQ,OAAO,KAAK,yBAAyB,QAAQ,SAAS;AAAA,EACpN;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,OAAO,KAAK,QAAQ,MAAM;AAAA,QACjC,QAAQ,OAAO,KAAK,SAAS,MAAM;AAAA,MACrC;AAAA,MACA,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACjLA,SAASO,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,sBAAsB,IAAI;AAC9D,MAAI,SAAS,uBAAuB,eAAe,IAAI;AACvD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,yBAAyB,IAAI;AAClE,MAAI,UAAU,uBAAuB,wBAAwB,IAAI;AACjE,MAAI,UAAU,uBAAuB,0BAA0B,IAAI;AACnE,MAAI,UAAU,uBAAuB,uBAAuB,IAAI;AAChE,MAAI,UAAU,uBAAuB,oBAAoB,IAAI;AAC7D,MAAI,UAAU,uBAAuB,WAAW,IAAI;AACpD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,UAAM,QAAQ,CAAC;AACf,UAAM,YAAY,CAAC;AACnB,eAAW,KAAK,MAAM,OAAO,OAAO,GAAG;AACrC,UAAS,EAAE,MAAM,OAAQ,OAAM,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,EAAE,MAAM,QAAQ,EAAE,OAAO,CAAC;AAAA,eACzE,EAAE,MAAM,MAAQ,WAAU,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK,CAAC;AAAA,IAClF;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,OAAO,UAAU;AAAA,EACzE;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,MAAM,MAAM,MAAM;AACpC,WAAO,EAAE,GAAG,QAAQ,MAAM,MAAM,QAAQ,KAAK,OAAO,OAAO,EAAE;AAAA,EAC/D;AACF,MAAI,SAAS,SAAS,KAAK,KAAK;AAAE,WAAO,EAAE,KAAK,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,EAAE;AAAA,EAAG;AACjF,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,MAAM,MAAM,IAAI;AAAE,WAAO,EAAE,GAAG,OAAO,MAAM,IAAI,KAAK;AAAA,EAAG;AAC7E,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,kBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,EAAE;AACjC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK;AAE3D,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP;AACA,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,oBAAM,CAAC;AACP,oBAAM,kBAAkB;AACxB,qBAAO,QAAQ,YAAY;AACzB,oBAAI,KAAK,GAAG;AACZ,sBAAM,kBAAkB;AAAA,cAC1B;AACA,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,iBAAiB;AACvB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,uBAAK,OAAO,IAAI,IAAI,GAAG;AAAA,gBACzB,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AAAA,UACF,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,UAAU,IAAI,WAAW;AAAA,UACtC,OAAO;AACL,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK;AAAA,YACP;AACA,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,IAAI,EAAE;AAAA,YACpB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AAEtD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,kBAAM,eAAe;AACrB,gBAAI,QAAQ,YAAY;AACtB,oBAAM,WAAW;AACjB,oBAAM,iBAAiB;AACvB,kBAAI,QAAQ,YAAY;AACtB,+BAAe;AACf,qBAAK,OAAO,IAAI,IAAI,GAAG;AAAA,cACzB,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI;AAEJ,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,EAAE;AACjC,UAAI,GAAG,YAAY,MAAM,SAAS;AAChC,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,EAAE;AACjC,YAAI,GAAG,YAAY,MAAM,SAAS;AAChC,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,aAAa,EAAE;AACjC,cAAI,GAAG,YAAY,MAAM,SAAS;AAChC,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,OAAO,aAAa,EAAE;AACjC,gBAAI,GAAG,YAAY,MAAM,SAAS;AAChC,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,MAAM,OAAO,aAAa,EAAE;AACjC,kBAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK,MAAM,OAAO,aAAa,CAAC;AAChC,oBAAI,GAAG,YAAY,MAAM,SAAS;AAChC,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO;AAAA,IACd,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACruCO,IAAM,cAAkD;AAAA,EAC7D,aAAa,OAAoC;AAC/C,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAAoC;AAC5C,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAyB,OAAoC;AAClE,WAAO,kBAAkB,IAAI,KAAK;AAAA,EACpC;AACF;;;ACHO,SAAS,aAAa,IAAoB,OAAoC;AACnF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAGvB,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,MAAM,CAAC,MAAc;AACzB,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,YAAM,KAAK,CAAC;AAAA,IACd;AAAA,EACF;AACA,aAAW,KAAK,GAAG,OAAO;AACxB,QAAI,EAAE,MAAM;AACZ,QAAI,EAAE,MAAM;AAAA,EACd;AAEA,QAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,WAAS,OAAO,GAAG,OAAO,MAAM,QAAQ,QAAQ;AAC9C,QAAI,UAAU;AACd,eAAW,KAAK,GAAG,OAAO;AACxB,YAAM,OAAO,MAAM,IAAI,EAAE,MAAM,IAAK;AACpC,UAAI,MAAM,IAAI,EAAE,MAAM,IAAK,MAAM;AAC/B,cAAM,IAAI,EAAE,QAAQ,IAAI;AACxB,kBAAU;AAAA,MACZ;AAAA,IACF;AACA,QAAI,CAAC,QAAS;AAAA,EAChB;AACA,QAAM,WAAW,KAAK,IAAI,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,CAAE,CAAC;AAE/D,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,QAAQ,oBAAI,IAAoB;AACtC,aAAW,KAAK,GAAG,OAAO;AACxB,WAAO,IAAI,EAAE,SAAS,OAAO,IAAI,EAAE,MAAM,KAAK,KAAK,EAAE,KAAK;AAC1D,UAAM,IAAI,EAAE,SAAS,MAAM,IAAI,EAAE,MAAM,KAAK,KAAK,EAAE,KAAK;AAAA,EAC1D;AACA,QAAM,YAAY,CAAC,MAAsB,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC;AAGvF,QAAM,UAAsB,MAAM,KAAK,EAAE,QAAQ,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC;AACzE,aAAW,KAAK,MAAO,SAAQ,MAAM,IAAI,CAAC,CAAE,EAAG,KAAK,CAAC;AACrD,QAAM,SAAS,QAAQ,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;AAC7E,QAAM,YAAY,KAAK,IAAI,GAAG,GAAG,MAAM;AAGvC,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,QAAQ;AACd,QAAM,QAAQ;AACd,QAAM,SAAS;AACf,QAAM,UAAU;AAChB,QAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAM,WAAW,SAAS;AAC1B,QAAM,UAAU,SAAS,SAAS;AAClC,QAAM,OAAO,CAAC,OAAuB,WAAW,MAAM,QAAQ;AAQ9D,QAAM,QAAQ,oBAAI,IAAqB;AACvC,UAAQ,QAAQ,CAAC,KAAK,OAAO;AAC3B,UAAMC,UAAS,IAAI,OAAO,CAAC,GAAG,MAAM,IAAI,UAAU,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,SAAS,KAAK;AACrF,QAAI,IAAI,WAAW,QAAQA,WAAU;AACrC,eAAW,KAAK,KAAK;AACnB,YAAMC,KAAI,KAAK,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI;AACzC,YAAM,IAAI,GAAG,EAAE,GAAG,KAAK,EAAE,GAAG,GAAG,GAAAA,GAAE,CAAC;AAClC,WAAKA,KAAI;AAAA,IACX;AAAA,EACF,CAAC;AAED,QAAM,WAA2B,CAAC;AAClC,MAAI;AACF,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAGF,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC;AACxE,aAAW,KAAK,GAAG,OAAO;AACxB,UAAM,KAAK,MAAM,IAAI,EAAE,MAAM,GAC3B,KAAK,MAAM,IAAI,EAAE,MAAM;AACzB,UAAM,KAAK,KAAK,IAAI,GAAG,EAAE,QAAQ,IAAI;AACrC,UAAM,KAAK,OAAO,IAAI,EAAE,MAAM,KAAK;AACnC,WAAO,IAAI,EAAE,QAAQ,KAAK,EAAE;AAC5B,UAAM,KAAK,MAAM,IAAI,EAAE,MAAM,KAAK;AAClC,UAAM,IAAI,EAAE,QAAQ,KAAK,EAAE;AAC3B,UAAM,KAAK,GAAG,IAAI,OAChB,KAAK,GAAG;AACV,UAAM,MAAM,GAAG,IAAI,IACjB,MAAM,MAAM;AACd,UAAM,MAAM,GAAG,IAAI,IACjB,MAAM,MAAM;AACd,UAAM,MAAM,KAAK,MAAM;AACvB,UAAM,IACJ,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,MAC5F,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC;AACnG,aAAS,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,EAAE,MAAM,MAAM,IAAI,EAAE,MAAM,GAAI,SAAS,IAAI,CAAC,CAAC;AAAA,EAClF;AAGA,UAAQ,QAAQ,CAAC,KAAK,OAAO;AAC3B,UAAM,UAAU,OAAO;AACvB,eAAW,KAAK,KAAK;AACnB,YAAM,IAAI,MAAM,IAAI,CAAC;AACrB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,OAAO,QAAQ,IAAI,EAAE,CAAC,EAAE;AAAA,UAC3D,MAAM,IAAI,CAAC;AAAA,UACX,MAAM,IAAI,CAAC;AAAA,UACX;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,YAAM,KAAK,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,WAAW,gBAAgB,IAAI;AAC9D,UAAI;AACF,iBAAS;AAAA,UACP,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,IAAI,WAAW,eAAe,QAAQ,MAAM,EAAE,QAAQ,MAAM,CAAC;AAAA,QACvF;AAAA;AAEA,iBAAS,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,QAAQ,CAAC,GAAG,IAAI,WAAW,eAAe,QAAQ,IAAI,CAAC;AAAA,IAC7F;AAAA,EACF,CAAC;AAGD,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,GAAG,QAAQ,QAAQ,EAAG,IAAI,CAAC,MAAM,YAAY,GAAG,WAAW,aAAa,EAAE,KAAK;AAAA,EACjF;AACA,QAAM,cAAc;AACpB,QAAM,SAAS;AAAA,IACb,KAAK,QAAQ,IAAI,SAAS,aAAa,IAAI,cAAc,KAAK,IAAI,aAAa,CAAC,KAAK;AAAA,EACvF;AACA,QAAM,SAAS,OAAO,UAAU,QAAQ,MAAM;AAG9C,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACxKA,SAASC,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,eAAe,IAAI;AACvD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,mBAAmB;AAChC,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,MAAM;AAC5B,UAAMC,SAAQ,KAAK,OAAO,OAAO;AACjC,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,OAAAA,OAAM;AAAA,EAC9D;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,KAAK,KAAK,KAAK;AAAE,WAAO,EAAE,QAAQ,IAAI,KAAK,GAAG,QAAQ,IAAI,KAAK,GAAG,OAAO,IAAI;AAAA,EAAG;AACtG,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,WAAW,CAAC;AAAA,EAAG;AACjD,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASP,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASK,WAAU;AAC/C,WAAO,IAAIP,kBAAgB,SAAS,MAAM,MAAMO,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBL,WAAU,OAAOK,WAAU;AAC3D,WAAO,IAAIP;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,aAAa;AAClB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,aAAa;AAAA,QACpB;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,eAAe;AACpB,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,eAAe;AACpB,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,WAAW;AAChB,mBAAK,aAAa;AAClB,kBAAI,OAAO,YAAY;AACrB,qBAAK,WAAW;AAChB,qBAAK,iBAAiB;AACtB,oBAAI,OAAO,YAAY;AACrB,iCAAe;AACf,uBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,gBACxB,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO;AAAA,QACd,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL;AACA,YAAI,MAAM,SAAS,aAAa;AAC9B,eAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK;AACL,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC,IAAI,IAAI,EAAE;AAChB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO,EAAE;AAAA,IAChB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACzhCO,IAAM,SAAwC;AAAA,EACnD,aAAa,OAA+B;AAC1C,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA+B;AACvC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAoB,OAAoC;AAC7D,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACF;;;ACcO,SAAS,cAAc,IAAqB,OAAoC;AACrF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,MAAI,CAAC,GAAG,MAAM;AACZ,WAAO;AAAA,MACL,OAAO;AAAA,QACL,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG;AAAA,QAC9C,YAAY,QAAQ;AAAA,QACpB,UAAU,CAAC;AAAA,MACb;AAAA,MACA,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAC7B,QAAM,WAAW;AACjB,QAAM,SAAS,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AAEnE,QAAM,UAAU,CAAC,MACf,MAAM,IAAI,WAAW,gBAAgB,MAAM,IAAI,OAAO;AACxD,QAAM,eAAe,CAAC,MAAuB,MAAM,IAAI,OAAO;AAG9D,MAAI,aAAa,SAAS,SAAS;AACnC,QAAM,QAAQ,CAAC,MAAgB,OAAe,QAAwB;AACpE,UAAMC,KAAI,QAAQ,KAAK;AACvB,UAAM,KAAK,aAAa,KAAK;AAC7B,UAAM,OAAO,qBAAqB,KAAK,OAAOA,IAAG,EAAE;AACnD,UAAM,OAAO,UAAU,IAAI,KAAK;AAChC,UAAM,IAAI,KAAK,IAAI,IAAI,KAAK,eAAe,IAAI,GAAG,UAAU,IAAI,KAAK,EAAE;AACvE,UAAM,QAAQ,UAAU,IAAI,KAAK,UAAU,IAAI,KAAK;AACpD,UAAMC,KAAI,KAAK,YAAY,IAAI,IAAI,KAAK,aAAaD,KAAI,QAAQ,EAAE,IAAI;AAEvE,UAAM,OAAO,KAAK,SAAS;AAAA,MAAI,CAAC,GAAG,MACjC,MAAM,GAAG,QAAQ,GAAG,UAAU,IAAI,eAAe,GAAG,KAAK,IAAI,GAAG;AAAA,IAClE;AACA,QAAI;AACJ,QAAI,KAAK,WAAW,GAAG;AACrB,UAAI,aAAaC,KAAI;AACrB,oBAAc,KAAK,IAAI,IAAIA,KAAI,EAAE;AAAA,IACnC,OAAO;AACL,WAAK,KAAK,CAAC,EAAG,IAAI,KAAK,KAAK,SAAS,CAAC,EAAG,KAAK;AAAA,IAChD;AACA,WAAO;AAAA,MACL,OAAO,KAAK;AAAA,MACZ;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACvC,UAAU;AAAA,IACZ;AAAA,EACF;AACA,QAAM,OAAO,MAAM,GAAG,MAAM,GAAG,QAAQ,OAAO;AAG9C,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,WAAW,SAAS,IAAI;AAC9B,QAAM,OAAiB,CAAC;AACxB,aAAW,KAAK,IAAK,MAAK,EAAE,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE,KAAK,KAAK,GAAG,EAAE,CAAC;AACrE,QAAM,WAAqB,CAAC,MAAM;AAClC,WAAS,IAAI,GAAG,KAAK,UAAU;AAC7B,aAAS,CAAC,IAAI,SAAS,IAAI,CAAC,KAAM,KAAK,IAAI,CAAC,KAAK,KAAK;AACxD,aAAW,KAAK,IAAK,GAAE,IAAI,SAAS,EAAE,KAAK;AAE3C,QAAM,WAA2B,CAAC;AAClC,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR;AAAA,UACE,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,CAAC,MAAoB;AACrC,eAAW,KAAK,EAAE,UAAU;AAC1B,YAAM,KAAK,EAAE,IAAI,EAAE,GACjB,KAAK,EAAE,GACP,KAAK,EAAE,GACP,KAAK,EAAE;AACT,YAAM,MAAM,KAAK,MAAM;AACvB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,UAC7F,EAAE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,gBAAU,CAAC;AAAA,IACb;AAAA,EACF;AACA,YAAU,IAAI;AAGd,QAAM,WAAW,CAAC,MAAoB;AACpC,UAAMA,KAAI,EAAE;AACZ,UAAM,KAAK,EAAE;AACb,UAAMD,KAAI,QAAQ,EAAE,KAAK;AACzB,UAAM,KAAK,aAAa,EAAE,KAAK;AAC/B,UAAM,IAAI,IAAI,EAAE,CAAC;AACjB,UAAM,IAAI,IAAI,KAAKC,KAAI,CAAC;AAExB,QAAI,EAAE,UAAU,GAAG;AACjB,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,IAAI,EAAE,CAAC,GAAG,QAAQA,GAAE,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;AAAA,UAChF,IAAI,KAAK,IAAIA,KAAI,GAAG,EAAE;AAAA,QACxB,CAAC;AAAA,MACH;AACA,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,EAAE;AAAA,UACF;AAAA,UACA;AAAA,UACA,EAAE;AAAA,UACFA;AAAA,UACAD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,EAAE,UAAU,GAAG;AACxB,eAAS,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,IAAI,EAAE,CAAC,GAAG,QAAQC,GAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AACtF,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,EAAE;AAAA,UACF;AAAA,UACA;AAAA,UACA,EAAE;AAAA,UACFA;AAAA,UACAD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,YACE,OAAO;AAAA,YACP,aAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,IAAI,EAAE,CAAC,GAAG,QAAQC,GAAE,GAAG,QAAQ,SAAS,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,CAAC;AAAA,MACrF;AACA,eAAS;AAAA,QACP,GAAG,oBAAoB,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,GAAGA,IAAGD,IAAG,IAAI,QAAQ,MAAM,QAAQ,WAAW;AAAA,UACtF,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,EAAE;AACJ,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,KAAK,QAAQ,YAAY,GAAG,CAAC;AAC5F,eAAW,KAAK,EAAE,SAAU,UAAS,CAAC;AAAA,EACxC;AACA,WAAS,IAAI;AAEb,QAAM,SAAS,OAAO,KAAK,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,MAAM;AACrE,QAAM,SAAS,OAAO,aAAa,MAAM;AAEzC,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;AAEA,SAAS,KAAK,GAAW,MAAgB,CAAC,GAAa;AACrD,MAAI,KAAK,CAAC;AACV,aAAW,KAAK,EAAE,SAAU,MAAK,GAAG,GAAG;AACvC,SAAO;AACT;AACA,SAAS,SAAS,GAAmB;AACnC,SAAO,EAAE,SAAS,SAAS,KAAK,IAAI,GAAG,EAAE,SAAS,IAAI,QAAQ,CAAC,IAAI,EAAE;AACvE;;;AC/NA,SAASE,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,WAAW,IAAI;AACnD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAC3D,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,mBAAmB;AAChC,MAAI,SAAS,qBAAqB,CAAC,KAAK,KAAM,IAAI,GAAG,MAAM,KAAK;AAEhE,MAAI,SAAS,SAAS,IAAIC,QAAO;AAC7B,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,OAAOA,OAAM,OAAO,OAAO,EAAE;AAAA,EACrF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAAS,SAAS;AAC3B,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQ,SAAS;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACvI;AACF,MAAI,SAAS,SAAS,QAAQ,SAAS;AAAE,WAAO,EAAE,QAAQ,OAAO,QAAQ,KAAK,QAAQ,KAAK,EAAE;AAAA,EAAG;AAChG,MAAI,SAAS,SAAS,SAAS;AAAE,WAAO,EAAE,QAAQ,GAAG,KAAK,QAAQ,KAAK,EAAE;AAAA,EAAG;AAC5E,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,kBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,cAAc;AACnB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,cAAc;AAAA,QACrB;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL;AACA,cAAI,MAAM,SAAS,aAAa;AAC9B,iBAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AACA,aAAK;AACL,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL;AACA,cAAI,MAAM,SAAS,aAAa;AAC9B,iBAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AAAA,QACF;AACA,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP;AACA,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO;AAAA,QACd,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACv7BA,SAAS,WAAW,KAAqB;AAEvC,QAAM,IAAI,IAAI,MAAM,6BAA6B;AACjD,UAAQ,IAAI,EAAE,CAAC,IAAK,KAAK,KAAK;AAChC;AAEA,SAAS,UAAUG,QAAwC;AACzD,MAAIA,OAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,QAAQA,OAAM,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,WAAW,IAAI,CAAC;AACvD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAgB,EAAE,OAAO,WAAW,MAAM,GAAG,GAAG,UAAU,CAAC,EAAE;AACnE,QAAMC,SAAkD,CAAC,EAAE,MAAM,MAAM,QAAQ,MAAM,OAAO,CAAC;AAC7F,MAAI,OAAgB;AACpB,MAAI,UAAU;AACd,aAAW,MAAMD,QAAO;AACtB,QAAI,CAAC,SAAS;AACZ,UAAI,OAAO,MAAO,WAAU;AAC5B;AAAA,IACF;AAEA,UAAM,YAAY,GAAG,IAAI,MAAM,oBAAoB;AACnD,QAAI,WAAW;AACb,WAAK,OAAO,UAAU,CAAC,EAAG,KAAK;AAC/B;AAAA,IACF;AACA,UAAM,OAAgB,EAAE,OAAO,WAAW,GAAG,GAAG,GAAG,UAAU,CAAC,EAAE;AAChE,WAAOC,OAAM,SAAS,KAAKA,OAAMA,OAAM,SAAS,CAAC,EAAG,UAAU,GAAG,OAAQ,CAAAA,OAAM,IAAI;AACnF,IAAAA,OAAMA,OAAM,SAAS,CAAC,EAAG,KAAK,SAAS,KAAK,IAAI;AAChD,IAAAA,OAAM,KAAK,EAAE,MAAM,QAAQ,GAAG,OAAO,CAAC;AACtC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,UAA0C;AAAA,EACrD,aAAa,OAAgC;AAC3C,UAAM,MAAaC,YAAM,KAAK;AAC9B,UAAM,OAAO,UAAU,IAAI,KAAK;AAChC,WAAO,EAAE,SAAS,IAAI,SAAS,UAAU,IAAI,UAAU,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG;AAAA,EACnF;AAAA,EAEA,UAAU,OAAgC;AACxC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAqB,OAAoC;AAC9D,WAAO,cAAc,IAAI,KAAK;AAAA,EAChC;AACF;;;ACvDO,SAAS,eAAe,IAAsB,OAAoC;AACvF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,SAAS,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACnE,QAAM,OAAO;AACb,QAAM,UAAU;AAChB,QAAM,UAAU,SAAS;AACzB,QAAM,SAAS,SAAS,SAAS;AACjC,QAAM,OAAO,KAAK,IAAI,GAAG,GAAG,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAEtD,QAAM,KAAK,CAAC,MAAsB,UAAU,IAAI;AAChD,QAAM,KAAK,CAAC,SAAyB,SAAS,OAAO;AACrD,QAAM,MAAM,CAAC,SAAyB,eAAe,MAAM,KAAK;AAEhE,QAAM,WAA2B,CAAC;AAClC,MAAI,GAAG,SAAS;AACd,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG,SAAS;AAAA,QACZ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAGF,WAAS,OAAO,GAAG,OAAO,GAAG,OAAO,QAAQ;AAC1C,UAAM,cAAc,GAAG,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAC5D,QAAI,YAAY,WAAW,KAAK,SAAS,EAAG;AAC5C,UAAM,KAAK,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;AACrC,UAAM,KAAK,GAAG,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACtD,UAAM,SAAS,KACX,KAAK,IAAI,GAAG,GAAG,GAAI,GAAG,SAAS,KAAK,CAAC,GAAG,CAAC,CAAE,IAC3C,KAAK,IAAI,GAAG,GAAI,GAAG,SAAS,KAAK,CAAC,CAAC,CAAE;AACzC,UAAM,OAAO,GAAG,SAAS,KAAK,IAAI,GAAG,EAAE,IAAI;AAC3C,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,QACzE,IAAI,IAAI;AAAA,QACR;AAAA,QACA,EAAE,SAAS,KAAK;AAAA,MAClB;AAAA,IACF;AACA,UAAM,OAAO,GAAG,UAAU,IAAI;AAC9B,QAAI;AACF,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA;AAAA,UACA,IAAI,GAAG,IAAI,IAAI,WAAW,gBAAgB,IAAI;AAAA,UAC9C,WAAW;AAAA,UACX,IAAI,IAAI;AAAA,UACR,EAAE,QAAQ,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,EACJ;AAGA,aAAW,KAAK,GAAG,cAAc;AAC/B,UAAM,KAAK,GAAG,EAAE,OAAO,GACrB,KAAK,GAAG,EAAE,UAAU;AACtB,UAAM,KAAK,GAAG,EAAE,CAAC,GACf,KAAK,GAAG,EAAE,IAAI;AAChB,UAAM,MAAM,KAAK,MAAM;AACvB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,QAC7F,IAAI,EAAE,IAAI;AAAA,QACV;AAAA,QACA,EAAE,SAAS,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,KAAK,GAAG,SAAS;AAC1B,QAAI,CAAC,EAAE,WAAW,EAAE,aAAa,UAAa,EAAE,UAAU,OAAW;AACrE,UAAM,KAAK,GAAG,EAAE,KAAK,GACnB,KAAK,GAAG,EAAE,QAAQ;AACpB,UAAM,KAAK,GAAG,EAAE,CAAC,GACf,KAAK,GAAG,EAAE,IAAI;AAChB,UAAM,MAAM,KAAK,MAAM;AACvB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,QAC7F,IAAI,EAAE,QAAQ;AAAA,QACd;AAAA,QACA,EAAE,SAAS,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,KAAK,GAAG,SAAS;AAC1B,UAAM,IAAI,GAAG,EAAE,CAAC,GACd,IAAI,GAAG,EAAE,IAAI;AACf,UAAM,MAAM,IAAI,EAAE,IAAI;AACtB,QAAI,EAAE,SAAS,aAAa;AAC1B,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,IAAI,QAAQ,GAAG;AAAA,UACtD,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AAAA,IACF,WAAW,EAAE,SAAS;AACpB,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,QAAQ,YAAY,KAAK,GAAG,CAAC;AACjF,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC;AAAA,IACpE,OAAO;AACL,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,KAAK,QAAQ,YAAY,CAAC,CAAC;AAAA,IACjF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,WAAW,eAAe,QAAQ,WAAW;AAAA,QAC7E,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,QAAI,EAAE,KAAK;AACT,YAAM,IAAI,YAAY,EAAE,KAAK,WAAW,aAAa,EAAE,QAAQ;AAC/D,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,OAAO,IAAI,CAAC,GAAG,QAAQ,GAAG;AAAA,UAC/D,QAAQ,UAAU;AAAA,UAClB,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,WAAW,eAAe,QAAQ,MAAM;AAAA,UACzE,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,GAAG,IAAI,IAAI,KAAK,MAAM;AAC5C,QAAM,SAAS,OAAO,GAAG,GAAG,QAAQ,CAAC,IAAI,UAAU,MAAM;AAEzD,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACpKE,SAAS,KAAKC,OAAM;AAClB,QAAM,IAAI,CAAC;AACX,aAAW,MAAMA,MAAM,GAAE,GAAG,EAAE,YAAY,CAAC,IAAI,GAAG;AAClD,SAAO;AACT;AAEF,SAASC,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,YAAY,IAAI;AACpD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,uBAAuB,UAAU,IAAI;AAClD,MAAI,SAAS,uBAAuB,UAAU,IAAI;AAClD,MAAI,SAAS,uBAAuB,UAAU,KAAK;AACnD,MAAI,SAAS,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC5D,MAAI,SAAS,uBAAuB,YAAY,IAAI;AACpD,MAAI,SAAS,uBAAuB,UAAU,IAAI;AAClD,MAAI,UAAU,uBAAuB,SAAS,IAAI;AAClD,MAAI,UAAU,uBAAuB,MAAM,IAAI;AAC/C,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,QAAQ,IAAI;AACjD,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK;AACzG,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,YAAY,MAAM,OAAO,OAAO,EAAE;AAAA,EAC1F;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,UAAM,IAAI,KAAK,CAAC;AAAG,WAAO,EAAE,GAAG,UAAU,IAAI,EAAE,IAAI,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK;AAAA,EAAG;AAC1G,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO,EAAE,GAAG,UAAU,KAAK;AAAA,EAAG;AAC5D,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO,EAAE,GAAG,YAAY,KAAK;AAAA,EAAG;AAC9D,MAAI,SAAS,SAAS,MAAM,GAAG;AAAE,UAAM,IAAI,KAAK,CAAC;AAAG,WAAO,EAAE,GAAG,SAAS,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,KAAK,MAAM,EAAE,KAAK;AAAA,EAAG;AACrH,MAAI,SAAS,SAAS,GAAG,GAAG;AAAE,WAAO,EAAE,GAAG,EAAE;AAAA,EAAG;AAC/C,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACrC,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,kBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,WAAW;AAChB,WAAK;AACL,WAAK,CAAC;AACN,YAAM,MAAM,OAAO,WAAW;AAC9B,UAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,MACF,OAAO;AACL,cAAM;AACN,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,QAAQ,YAAY;AACzB,WAAG,KAAK,GAAG;AACX,cAAM,MAAM,OAAO,WAAW;AAC9B,YAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,QACF,OAAO;AACL,gBAAM;AACN,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,WAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,WAAK;AACL,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,gBAAgB;AACrB,QAAI,OAAO,YAAY;AACrB,WAAK,gBAAgB;AACrB,UAAI,OAAO,YAAY;AACrB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK,eAAe;AACpB,cAAI,OAAO,YAAY;AACrB,iBAAK,mBAAmB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,aAAa;AAClB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,aAAa;AAAA,MACpB;AACA,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,CAAC;AACN,kBAAM,MAAM,OAAO,WAAW;AAC9B,gBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,YACF,OAAO;AACL,oBAAM;AACN,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,QAAQ,YAAY;AACtB,qBAAO,QAAQ,YAAY;AACzB,mBAAG,KAAK,GAAG;AACX,sBAAM,MAAM,OAAO,WAAW;AAC9B,oBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,MAAM;AAAA,kBAAG;AAAA,gBACjD;AAAA,cACF;AAAA,YACF,OAAO;AACL,mBAAK;AAAA,YACP;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP;AACA,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,eAAK,aAAa;AAClB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,aAAa;AAAA,UACpB;AACA,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,CAAC;AAChC,YAAI,GAAG,YAAY,MAAM,SAAS;AAChC,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,aAAa,CAAC;AAChC,cAAI,GAAG,YAAY,MAAM,SAAS;AAChC,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,gBAAgB;AACrB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,EAAE;AAAA,UACpB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO;AAAA,IACd,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AC7uCA,SAAS,WAAW,KAA6B;AAC/C,QAAM,KAAK,OAAO,IAAI,YAAY;AAClC,SAAO,MAAM,cAAc,cAAc,MAAM,YAAY,YAAY;AACzE;AAEO,IAAM,WAA4C;AAAA,EACvD,aAAa,OAAiC;AAC5C,UAAM,MAAaG,YAAM,KAAK;AAC9B,UAAM,SAAS,oBAAI,IAAoB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpD,UAAM,YAAY,CAAC,MAAM;AACzB,UAAM,QAAQ,oBAAI,IAAoB;AACtC,UAAM,UAAuB,CAAC;AAC9B,UAAM,eAAiC,CAAC;AACxC,QAAI,UAAU;AACd,QAAI,WAAW;AACf,QAAI,QAAQ;AACZ,QAAI,OAAO;AAEX,eAAW,KAAK,IAAI,YAAY;AAC9B,UAAI,EAAE,MAAM,UAAU;AACpB,cAAM,OAAO,OAAO,IAAI,OAAO;AAC/B,gBAAQ,KAAK;AAAA,UACX,IAAI,EAAE,MAAM,IAAI,MAAM;AAAA,UACtB;AAAA,UACA,GAAG;AAAA,UACH,MAAM,WAAW,EAAE,IAAI;AAAA,UACvB,SAAS;AAAA,UACT,GAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;AAAA,QAChC,CAAC;AACD,cAAM,IAAI,MAAM,KAAK;AACrB;AAAA,MACF,WAAW,EAAE,MAAM,UAAU;AAC3B,YAAI,CAAC,OAAO,IAAI,EAAE,IAAK,GAAG;AACxB,iBAAO,IAAI,EAAE,MAAO,QAAQ;AAC5B,oBAAU,QAAQ,IAAI,EAAE;AACxB;AAAA,QACF;AACA,cAAM,OAAO,OAAO,IAAI,EAAE,IAAK;AAC/B,cAAM,aAAa,OAAO,IAAI,OAAO;AACrC,qBAAa,KAAK,EAAE,MAAM,YAAY,GAAG,OAAO,SAAS,MAAM,IAAI,UAAU,KAAK,EAAE,CAAC;AACrF,kBAAU,EAAE;AAAA,MACd,WAAW,EAAE,MAAM,YAAY;AAC7B,YAAI,OAAO,IAAI,EAAE,IAAK,EAAG,WAAU,EAAE;AAAA,MACvC,WAAW,EAAE,MAAM,SAAS;AAC1B,cAAM,OAAO,OAAO,IAAI,OAAO;AAC/B,cAAM,WAAW,OAAO,IAAI,EAAE,IAAK,KAAK;AACxC,gBAAQ,KAAK;AAAA,UACX,IAAI,EAAE,MAAM,IAAI,MAAM;AAAA,UACtB;AAAA,UACA,GAAG;AAAA,UACH,MAAM,WAAW,EAAE,IAAI;AAAA,UACvB,SAAS;AAAA,UACT;AAAA,UACA,OAAO,MAAM,IAAI,QAAQ,KAAK;AAAA,UAC9B,GAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;AAAA,QAChC,CAAC;AACD,cAAM,IAAI,MAAM,KAAK;AACrB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU,IAAI;AAAA,MACd,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAAiC;AACzC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAsB,OAAoC;AAC/D,WAAO,eAAe,IAAI,KAAK;AAAA,EACjC;AACF;;;ACvEA,IAAMC,YAAW;AACjB,IAAMC,UAAS;AAER,SAAS,SAAS,IAAgB,OAAoC;AAC3E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AAExB,QAAM,WAAW,CAAC,MAAsB,MAAM,YAAY,MAAM;AAChE,QAAM,QAAQ,CAAC,MAAsB,EAAE,SAAS,MAAM;AAGtD,QAAM,OAAO,oBAAI,IAGf;AACF,aAAW,KAAK,GAAG,OAAO;AACxB,UAAM,YAAY,qBAAqB,EAAE,OAAO,WAAW,cAAc,MAAMA,UAAS,IAAI,CAAC;AAC7F,UAAM,YAAY,EAAE,QAChB,qBAAqB,EAAE,OAAO,MAAM,MAAMA,UAAS,IAAI,CAAC,IACxD;AACJ,UAAM,SAAS,UAAU,YAAY,OAAO,WAAW,eAAe,IAAI;AAC1E,UAAM,SAAS,YAAY,UAAU,YAAY,OAAO,OAAO,GAAG,IAAI,IAAI;AAC1E,UAAMC,KAAI,KAAK,SAAS,IAAI,SAAS,MAAM,SAAS,EAAE,IAAI,IAAI,KAAK;AACnE,SAAK,IAAI,EAAE,IAAI,EAAE,WAAW,WAAW,GAAAA,GAAE,CAAC;AAAA,EAC5C;AAEA,QAAM,QAAqB,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IAC9C,IAAI,EAAE;AAAA,IACN,OAAOD;AAAA,IACP,QAAQ,KAAK,IAAI,EAAE,EAAE,EAAG;AAAA,EAC1B,EAAE;AACF,QAAME,SAAqB,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE;AAC1E,QAAM,OAAO,cAAc,OAAOA,QAAO;AAAA,IACvC,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQ,SAAS;AAAA,EACnB,CAAC;AAED,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,OAAO,SAAS;AAEtB,QAAM,WAA2B,CAAC;AAClC,MAAI;AACF,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAGF,QAAM,SAAS,CAAC,GAAG,GAAG,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAClE,aAAW,OAAO,QAAQ;AACxB,UAAM,QAAQ,IAAI,QACf,IAAI,CAAC,OAAO,KAAK,MAAM,IAAI,EAAE,CAAC,EAC9B,OAAO,CAAC,MAAkC,CAAC,CAAC,CAAC;AAChD,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,MAAM,KAAK,IAAI,QAAQ;AAC7B,UAAM,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI;AAClD,UAAM,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,MAAM,KAAK;AAC7D,UAAM,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI;AAC5D,UAAM,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM;AACnE,UAAM,KAAK,IAAI,IAAI,GACjB,KAAK,IAAI,IAAI,GACb,KAAK,IAAI,OAAO,IAAI,GACpB,KAAK,IAAI,OAAO,IAAI;AACtB,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,QAAQ,WAAW,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,IAC5F;AACA,aAAS;AAAA,MACP,EAAE,KAAK,IAAI,OAAO,IAAI,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,GAAG,MAAM,QAAQ,WAAW;AAAA,QACzE,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,WAAW,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AACxC,aAAW,KAAK,GAAG,MAAM;AACvB,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE,IAAI,GAC7B,IAAI,KAAK,MAAM,IAAI,EAAE,EAAE;AACzB,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK,GAC/B,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,KAAK;AAC7B,UAAM,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,EAAE;AAC7D,UAAM,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,EAAE;AAC7D,UAAM,KAAK,YAAY,IAAI,GAAG,GAAG,GAAG,CAAC;AACrC,UAAM,KAAK,YAAY,IAAI,GAAG,GAAG,GAAG,CAAC;AACrC,UAAM,EAAE,MAAM,cAAc,IAAI,UAAU,GAAG,GAAG,UAAU,IAAI;AAC9D,aAAS;AAAA,MACP,EAAE,KAAK,MAAM,QAAQ,WAAW,KAAK;AAAA,QACnC,GAAI,EAAE,MAAM,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,QAC/B,WAAWH;AAAA,MACb,CAAC;AAAA,IACH;AACA,UAAM,KAAK,cAAc,GACvB,KAAK,cAAc;AACrB,UAAM,MAAM,EAAE,OAAO,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,MAAO,EAAE,SAAS;AAClE,QAAI,KAAK;AACP,YAAM,IAAI,YAAY,KAAK,IAAI,EAAE,QAAQ;AACzC,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,GAAG,QAAQ,OAAO,EAAE;AAAA,UACzE,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,MAAM,QAAQ,WAAW,EAAE,QAAQ,SAAS,CAAC;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,KAAK,GAAG,OAAO;AACxB,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE,EAAE;AAC/B,UAAM,KAAK,KAAK,IAAI,EAAE,EAAE;AACxB,UAAM,IAAI,IAAI,GACZ,IAAI,IAAI,IAAI,MACZ,IAAIC,SACJC,KAAI,IAAI;AACV,UAAM,OAAO,MAAM,EAAE,IAAI,IACrB,QAAQ,UACR,SAAS,EAAE,IAAI,IACb,QAAQ,YACR,QAAQ;AACd,UAAM,MAAM,MAAM,EAAE,IAAI,IAAI,QAAQ,OAAO;AAC3C,UAAM,WAAW,MAAM,EAAE,IAAI,IAAI,QAAQ,YAAY;AACrD,UAAM,KAAK,SAAS,EAAE,IAAI,IAAI,KAAK;AACnC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,QAAQ,IAAIA,EAAC,EAAE;AAAA,QACjD;AAAA,QACA,MAAM,EAAE,IAAI,IAAI,QAAQ,YAAY;AAAA,QACpC,MAAM,EAAE,IAAI,IAAI,MAAM;AAAA,QACtB,EAAE,GAAG;AAAA,MACP;AAAA,IACF;AACA,QAAI,KAAK,IAAI;AACb,UAAM,SAAS,GAAG,UAAU,YAAY,OAAO,WAAW,eAAe,IAAI;AAC7E,aAAS;AAAA,MACP,GAAG;AAAA,QACD;AAAA,QACA,GAAG;AAAA,QACH;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,OAAO,UAAU,aAAa,KAAK;AAAA,MACvC;AAAA,IACF;AACA,UAAM;AACN,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI,EAAE,KAAK,QAAQ,KAAK,GAAG,CAAC;AAAA,QAC5B,OAAO,IAAI,IAAI,CAAC;AAAA,QAChB,IAAI,EAAE;AAAA,QACN;AAAA,QACA,MAAM,EAAE,IAAI,IAAI,QAAQ,YAAY;AAAA,QACpC,EAAE,QAAQ,SAAS;AAAA,MACrB;AAAA,IACF;AACA,UAAM,OAAO,OAAO,GAAG,IAAI;AAC3B,QAAI,GAAG,WAAW;AAChB,YAAM,SAAS,GAAG,UAAU,YAAY,OAAO,OAAO,GAAG;AACzD,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,GAAG;AAAA,UACH;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA,MAAM,EAAE,IAAI,IAAI,QAAQ,YAAY;AAAA,UACpC,MAAM,EAAE,IAAI,IAAI,QAAQ,YAAY;AAAA,UACpC,EAAE,OAAO,UAAU,SAAS,IAAI;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAmB,GAAG,MAAM,IAAI,CAAC,MAAM;AAC3C,UAAM,IAAI,KAAK,MAAM,IAAI,EAAE,EAAE;AAC7B,WAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,MAAM,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,EACnE,CAAC;AACD,QAAM,SAAS,OAAO,KAAK,IAAI,KAAK,OAAO,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE;AAC/F,QAAM,SAAS,OAAO,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE;AACpF,QAAM,IAAI,MAAM,OAAO,aAAa;AACpC,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AACvB,QAAM,OAAO;AAAA,IACX,eAAeF,SAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,yCAAyC,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,EACzL;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;;;ACjPE,SAAS,OAAO,GAAG;AACjB,QAAM,IAAI,EAAE,YAAY;AACxB,MAAI,MAAM,SAAU,QAAO;AAC3B,MAAI,MAAM,aAAc,QAAO;AAC/B,MAAI,MAAM,aAAc,QAAO;AAC/B,MAAI,MAAM,cAAc,MAAM,cAAe,QAAO;AACpD,MAAI,EAAE,WAAW,WAAW,EAAG,QAAO,EAAE,SAAS,MAAM,IAAI,kBAAkB;AAC7E,MAAI,EAAE,WAAW,WAAW,EAAG,QAAO;AACtC,SAAO;AACT;AAEF,SAASI,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,MAAM,IAAI;AAC9C,MAAI,SAAS,uBAAuB,WAAW,IAAI;AACnD,MAAI,SAAS,uBAAuB,aAAa,IAAI;AACrD,MAAI,SAAS,uBAAuB,aAAa,IAAI;AACrD,MAAI,SAAS,uBAAuB,WAAW,IAAI;AACnD,MAAI,SAAS,uBAAuB,cAAc,IAAI;AACtD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,uBAAuB,IAAI;AAC/D,MAAI,UAAU,uBAAuB,mBAAmB,IAAI;AAC5D,MAAI,UAAU,uBAAuB,sBAAsB,IAAI;AAC/D,MAAI,UAAU,uBAAuB,YAAY,IAAI;AACrD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,WAAW,IAAI;AACpD,MAAI,UAAU,uBAAuB,SAAS,IAAI;AAClD,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AACzE,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,UAAM,QAAQ,CAAC;AACf,UAAM,aAAa,CAAC;AACpB,UAAM,OAAO,CAAC;AACd,QAAI;AACJ,UAAM,OAAO,CAACC,OAAM,UAAU;AAC5B,YAAM,MAAM,CAAC;AACb,iBAAW,KAAKA,MAAK,OAAO,OAAO,GAAG;AACpC,YAAI,EAAE,MAAM,QAAS,SAAQ,EAAE;AAAA,iBACtB,EAAE,MAAM,QAAQ;AAAE,gBAAM,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,EAAG,CAAC;AAAG,cAAI,KAAK,EAAE,EAAE;AAAA,QAAG,WAClI,EAAE,MAAM,MAAO,MAAK,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,KAAK,GAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,EAAG,CAAC;AAAA,iBAC5I,EAAE,MAAM,YAAY;AAC3B,gBAAM,QAAQ,KAAK,EAAE,OAAO,QAAQ,CAAC;AACrC,qBAAW,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,OAAO,SAAS,MAAM,CAAC;AACnE,qBAAW,MAAM,MAAO,KAAI,KAAK,EAAE;AAAA,QACrC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AACA,SAAK,OAAO,CAAC;AACb,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG,GAAG,OAAO,YAAY,KAAK;AAAA,EAC7G;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;AAAA,EAAG;AAC/D,MAAI,SAAS,SAAS,IAAI,OAAO,OAAO;AACpC,WAAO,EAAE,GAAG,YAAY,IAAI,OAAO,MAAM;AAAA,EAC3C;AACF,MAAI,SAAS,SAAS,GAAG,IAAI,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AACnD,MAAI,SAAS,SAAS,GAAG,IAAI,OAAO,OAAO;AACvC,WAAO,EAAE,GAAG,QAAQ,MAAM,OAAO,CAAC,GAAG,IAAI,OAAO,OAAO,SAAS,OAAU;AAAA,EAC5E;AACF,MAAI,SAAS,SAAS,MAAM,MAAM,IAAI,GAAG;AAAE,WAAO;AAAA,EAAG;AACrD,MAAI,SAAS,SAAS,MAAM,MAAM,IAAI,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC5D,MAAI,SAAS,SAAS,MAAM,MAAM,IAAI,OAAO,MAAM;AAC/C,WAAO,EAAE,GAAG,OAAO,MAAM,IAAI,OAAO,SAAS,QAAW,MAAM,QAAQ,QAAW,KAAK,KAAK,YAAY,MAAM,UAAU;AAAA,EACzH;AACF,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,EAAE,QAAQ,gBAAgB,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAAA,EAAG;AAC/F,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASP,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASK,WAAU;AAC/C,WAAO,IAAIP,kBAAgB,SAAS,MAAM,MAAMO,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBL,WAAU,OAAOK,WAAU;AAC3D,WAAO,IAAIP;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAK;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,CAAC;AAChC,YAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,aAAa,CAAC;AAChC,cAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,OAAO,aAAa,CAAC;AAChC,gBAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,MAAM,OAAO,aAAa,EAAE;AACjC,kBAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC;AACN,eAAK,mBAAmB;AACxB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,mBAAmB;AAAA,UAC1B;AACA,eAAK,WAAW;AAChB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,uBAAuB;AAC5B,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,eAAK,kBAAkB;AACvB,cAAI,OAAO,YAAY;AACrB,iBAAK,mBAAmB;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,yBAAyB;AAChC,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAEnG,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,EAAE;AACjC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,EAAE;AACjC,YAAI,GAAG,YAAY,MAAM,SAAS;AAChC,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,aAAa,CAAC;AAChC,cAAI,GAAG,YAAY,MAAM,SAAS;AAChC,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,gBAAgB;AACrB,gBAAI,OAAO,YAAY;AACrB,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,gBAAgB;AACtB,oBAAI,QAAQ,YAAY;AACtB,wBAAM,CAAC,KAAK,KAAK,KAAK,GAAG;AACzB,wBAAM;AAAA,gBACR,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,oBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,wBAAM;AACN;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,QAAQ,YAAY;AACtB,wBAAM,WAAW;AACjB,sBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,0BAAM;AACN;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AAAA,kBACR;AACA,sBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,0BAAM;AACN;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM,CAAC;AACP,0BAAM,mBAAmB;AACzB,2BAAO,QAAQ,YAAY;AACzB,0BAAI,KAAK,GAAG;AACZ,4BAAM,mBAAmB;AAAA,oBAC3B;AACA,0BAAM,WAAW;AACjB,wBAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,4BAAM;AACN;AAAA,oBACF,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,4BAAM,iBAAiB;AACvB,0BAAI,QAAQ,YAAY;AACtB,uCAAe;AACf,6BAAK,OAAO,IAAI,IAAI,GAAG;AAAA,sBACzB,OAAO;AACL,sCAAc;AACd,6BAAK;AAAA,sBACP;AAAA,oBACF,OAAO;AACL,oCAAc;AACd,2BAAK;AAAA,oBACP;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAE1E,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,gBAAgB;AACrB,gBAAI,OAAO,YAAY;AACrB,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,gBAAgB;AACtB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,wBAAM,OAAO,IAAI,IAAI,IAAI,GAAG;AAAA,gBAC9B,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,oBAAM,CAAC;AACP,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,gBAAgB;AACtB,oBAAI,QAAQ,YAAY;AACtB,wBAAM,CAAC,KAAK,KAAK,KAAK,GAAG;AACzB,wBAAM;AAAA,gBACR,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,qBAAO,QAAQ,YAAY;AACzB,oBAAI,KAAK,GAAG;AACZ,sBAAM;AACN,sBAAM,WAAW;AACjB,oBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,wBAAM;AACN;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,QAAQ,YAAY;AACtB,wBAAM,WAAW;AACjB,wBAAM,gBAAgB;AACtB,sBAAI,QAAQ,YAAY;AACtB,0BAAM,CAAC,KAAK,KAAK,KAAK,GAAG;AACzB,0BAAM;AAAA,kBACR,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF;AACA,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,iBAAiB;AACvB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,uBAAK,OAAO,IAAI,IAAI,IAAI,GAAG;AAAA,gBAC7B,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK;AAE/E,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,SAAS;AAChC,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,CAAC;AAChC,YAAI,GAAG,YAAY,MAAM,SAAS;AAChC,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,eAAe;AACpB,gBAAI,OAAO,YAAY;AACrB,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,gBAAgB;AACtB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,wBAAM,OAAO,IAAI,IAAI,IAAI,GAAG;AAAA,gBAC9B,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,gBAAgB;AACtB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,wBAAM,OAAO,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,gBACnC,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM;AAAA,cACR;AACA,oBAAM,CAAC;AACP,oBAAM;AACN,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,WAAW;AACjB,sBAAM,gBAAgB;AACtB,oBAAI,QAAQ,YAAY;AACtB,wBAAM,CAAC,KAAK,KAAK,KAAK,GAAG;AACzB,wBAAM;AAAA,gBACR,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF,OAAO;AACL,8BAAc;AACd,sBAAM;AAAA,cACR;AACA,qBAAO,QAAQ,YAAY;AACzB,oBAAI,KAAK,GAAG;AACZ,sBAAM;AACN,sBAAM,WAAW;AACjB,oBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,wBAAM;AACN;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,QAAQ,YAAY;AACtB,wBAAM,WAAW;AACjB,wBAAM,gBAAgB;AACtB,sBAAI,QAAQ,YAAY;AACtB,0BAAM,CAAC,KAAK,KAAK,KAAK,GAAG;AACzB,0BAAM;AAAA,kBACR,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,wBAAM;AAAA,gBACR;AAAA,cACF;AACA,oBAAM,WAAW;AACjB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,sBAAM;AACN;AAAA,cACF,OAAO;AACL,sBAAM;AACN,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,QAAQ,YAAY;AACtB,sBAAM,iBAAiB;AACvB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,uBAAK,OAAO,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,gBAClC,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AChpDO,IAAM,KAAgC;AAAA,EAC3C,aAAa,OAA2B;AACtC,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA2B;AACnC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAgB,OAAoC;AACzD,WAAO,SAAS,IAAI,KAAK;AAAA,EAC3B;AACF;;;AC4DA,IAAM,2BAA2B;AAOjC,IAAM,QAA6D;AAAA,EACjE,IAAI,CAAC,IAAI,CAAC;AAAA,EACV,IAAI,CAAC,GAAI,CAAC;AAAA,EACV,IAAI,CAAC,GAAG,EAAE;AAAA,EACV,IAAI,CAAC,GAAG,CAAE;AAAA,EACV,IAAI,CAAC,IAAI,EAAE;AAAA,EACX,IAAI,CAAC,IAAI,CAAE;AAAA,EACX,IAAI,CAAC,GAAI,EAAE;AAAA,EACX,IAAI,CAAC,GAAI,CAAE;AAAA,EACX,IAAI,CAAC,IAAI,EAAE;AAAA,EACX,IAAI,CAAC,GAAI,EAAE;AAAA,EACX,IAAI,CAAC,IAAI,CAAE;AAAA,EACX,IAAI,CAAC,GAAI,CAAE;AACb;AAEA,SAAS,UAAU,MAAgC;AACjD,QAAM,IAAI,KAAK,YAAY;AAC3B,SAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,MAAM,IAAI;AAChE;AAiIO,SAAS,gCACd,IAC+B;AAC/B,QAAM,UAAU,oBAAI,IAAY;AAAA,IAC9B,GAAG,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IAC9B,GAAG,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EACjC,CAAC;AACD,MAAI,QAAQ,SAAS,EAAG,QAAO,oBAAI,IAAI;AAEvC,QAAM,WAAW,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AACnD,QAAM,gBAAgB,oBAAI,IAAyB;AACnD,aAAW,KAAK,GAAG,QAAQ;AACzB,kBAAc,IAAI,EAAE,IAAI,EAAE,UAAU,SAAS,IAAI,EAAE,MAAM,IAAI,EAAE,SAAS,UAAU;AAAA,EACpF;AAEA,QAAM,cAAc,oBAAI,IAAyB;AACjD,aAAW,KAAK,GAAG;AACjB,gBAAY,IAAI,EAAE,IAAI,EAAE,SAAS,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,QAAQ,UAAU;AAC/E,aAAW,KAAK,GAAG;AACjB,gBAAY,IAAI,EAAE,IAAI,EAAE,SAAS,SAAS,IAAI,EAAE,KAAK,IAAI,EAAE,QAAQ,UAAU;AAE/E,QAAM,aAAa,oBAAI,IAAoB;AAC3C,KAAG,OAAO,QAAQ,CAAC,GAAG,MAAM,WAAW,IAAI,EAAE,IAAI,CAAC,CAAC;AACnD,QAAM,eAAe,oBAAI,IAAoB;AAC7C,KAAG,SAAS,QAAQ,CAAC,GAAG,MAAM,aAAa,IAAI,EAAE,IAAI,CAAC,CAAC;AACvD,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,KAAG,UAAU,QAAQ,CAAC,GAAG,MAAM,cAAc,IAAI,EAAE,IAAI,CAAC,CAAC;AAEzD,QAAM,qBAAqB,oBAAI,IAA0B;AAEzD,WAAS,iBAAiB,QAAgB,WAAiC;AACzE,QAAI,CAAC,QAAQ,IAAI,MAAM,EAAG,QAAO;AACjC,QAAI,cAAc,WAAY,QAAO;AACrC,QAAI,QAAQ,YAAY,IAAI,MAAM;AAClC,WAAO,SAAS,UAAU,YAAY;AACpC,UAAI,UAAU,UAAW,QAAO;AAChC,cAAQ,cAAc,IAAI,KAAK;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB,WAAwB,QAAoC;AACnF,QAAI,CAAC,QAAQ,IAAI,MAAM,EAAG,QAAO;AACjC,UAAM,QAAQ,YAAY,IAAI,MAAM,KAAK;AACzC,QAAI,UAAU,UAAW,QAAO,QAAQ,MAAM;AAC9C,QAAI,UAAU,WAAY,QAAO;AAEjC,QAAI,aAAa;AACjB,QAAI,SAAS,cAAc,IAAI,UAAU,KAAK;AAC9C,WAAO,WAAW,WAAW;AAC3B,UAAI,WAAW,WAAY,QAAO;AAClC,mBAAa;AACb,eAAS,cAAc,IAAI,UAAU,KAAK;AAAA,IAC5C;AACA,WAAO,SAAS,UAAU;AAAA,EAC5B;AAEA,WAAS,mBAAmB,QAA+B;AACzD,UAAM,YAA2B,CAAC,UAAU;AAC5C,UAAM,QAAkB,CAAC;AACzB,QAAI,QAAQ,YAAY,IAAI,MAAM;AAClC,WAAO,SAAS,UAAU,YAAY;AACpC,YAAM,KAAK,KAAK;AAChB,cAAQ,cAAc,IAAI,KAAK;AAAA,IACjC;AACA,cAAU,KAAK,GAAG,MAAM,QAAQ,CAAC;AACjC,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB,WAAuD;AACnF,UAAM,QAAQ,UAAU,OAAO,CAAC,OAAO,QAAQ,IAAI,EAAE,CAAC;AACtD,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,UAAM,SAAS,MAAM,IAAI,kBAAkB;AAC3C,QAAI,MAAmB;AACvB,UAAM,SAAS,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACtD,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,YAAM,YAAY,OAAO,CAAC,EAAG,CAAC;AAC9B,UAAI,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,SAAS,EAAG,OAAM;AAAA,UAC9C;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa,WAAiC;AACrD,UAAM,SAAS,mBAAmB,IAAI,SAAS;AAC/C,QAAI,OAAQ,QAAO;AAEnB,UAAM,QAAgB,CAAC;AACvB,eAAW,KAAK,GAAG,QAAQ;AACzB,WAAK,cAAc,IAAI,EAAE,EAAE,KAAK,gBAAgB,UAAW;AAC3D,YAAM,QAAQ,aAAa,EAAE,EAAE;AAC/B,UAAI,MAAM,UAAU,KAAK,MAAM,WAAW,EAAG;AAC7C,YAAM,KAAK;AAAA,QACT,IAAI,SAAS,EAAE,EAAE;AAAA,QACjB,MAAM;AAAA,QACN,UAAU,EAAE;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,QACd,OAAO,WAAW,IAAI,EAAE,EAAE,KAAK;AAAA,QAC/B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AACA,eAAW,KAAK,GAAG,UAAU;AAC3B,WAAK,YAAY,IAAI,EAAE,EAAE,KAAK,gBAAgB,WAAW;AACvD,cAAM,KAAK;AAAA,UACT,IAAI,QAAQ,EAAE,EAAE;AAAA,UAChB,MAAM;AAAA,UACN,UAAU,EAAE;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO,aAAa,IAAI,EAAE,EAAE,KAAK;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF;AACA,eAAW,KAAK,GAAG,WAAW;AAC5B,WAAK,YAAY,IAAI,EAAE,EAAE,KAAK,gBAAgB,WAAW;AACvD,cAAM,KAAK;AAAA,UACT,IAAI,QAAQ,EAAE,EAAE;AAAA,UAChB,MAAM;AAAA,UACN,UAAU,EAAE;AAAA,UACZ,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO,cAAc,IAAI,EAAE,EAAE,KAAK;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,cAA4B,CAAC;AACnC,OAAG,MAAM,QAAQ,CAAC,GAAG,cAAc;AACjC,UAAI,CAAC,iBAAiB,EAAE,MAAM,SAAS,KAAK,CAAC,iBAAiB,EAAE,IAAI,SAAS,EAAG;AAChF,YAAM,WAAW,UAAU,EAAE,QAAQ;AACrC,YAAM,SAAS,UAAU,EAAE,MAAM;AACjC,UAAI,CAAC,YAAY,CAAC,OAAQ;AAC1B,YAAM,OAAO,gBAAgB,WAAW,EAAE,IAAI;AAC9C,YAAM,KAAK,gBAAgB,WAAW,EAAE,EAAE;AAC1C,UAAI,CAAC,QAAQ,CAAC,MAAM,SAAS,GAAI;AACjC,kBAAY,KAAK;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,eAAe,MAAM,EAAE,IAAI;AAAA,QACtC,SAAS,eAAe,IAAI,EAAE,EAAE;AAAA,QAChC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,UAAU,uBAAuB,OAAO,WAAW;AACzD;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAEA,UAAM,UAAU,oBAAI,IAAyB;AAC7C,eAAW,QAAQ,OAAO;AACxB,YAAM,OAAO,QAAQ,IAAI,KAAK,EAAE;AAChC,UAAI,CAAC,KAAM;AACX,UAAI,KAAK,SAAS,QAAQ;AACxB,gBAAQ,IAAI,KAAK,UAAU,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,MAC7D,OAAO;AACL,mBAAW,CAAC,QAAQ,KAAK,KAAK,KAAK,QAAS,SAAS;AACnD,kBAAQ,IAAI,QAAQ,EAAE,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,QAC9E;AAAA,MACF;AAAA,IACF;AAEA,uBAAmB,SAAS,OAAO;AACnC,UAAM,SAAS,eAAe,OAAO,OAAO;AAC5C,UAAM,UAAmB;AAAA,MACvB,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB;AACA,uBAAmB,IAAI,WAAW,OAAO;AACzC,WAAO;AAAA,EACT;AAEA,WAAS,eAAe,QAAgB,QAA6B;AACnE,QAAI,OAAO,WAAW,OAAO,EAAG,QAAO,EAAE,KAAK,GAAG,KAAK,EAAE;AACxD,UAAM,UAAU,OAAO,MAAM,SAAS,MAAM;AAC5C,UAAM,QAAQ,mBAAmB,IAAI,OAAO,GAAG,QAAQ,IAAI,MAAM;AACjE,WAAO,QAAQ,EAAE,KAAK,MAAM,KAAK,KAAK,MAAM,IAAI,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE;AAAA,EACvE;AAEA,QAAM,OAAO,aAAa,UAAU;AACpC,SAAO,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC;AAC9F;AAIA,SAAS,uBACP,OACA,aAC0B;AAC1B,QAAM,MAAM,oBAAI,IAAyB;AACzC,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACpD,QAAM,MAAM,eAAe,OAAO,WAAW;AAC7C,QAAM,WAAuB,CAAC;AAE9B,QAAM,YAAY,oBAAI,IAAY;AAClC,aAAW,KAAK,aAAa;AAC3B,QAAI,SAAS,IAAI,EAAE,IAAI,KAAK,SAAS,IAAI,EAAE,EAAE,GAAG;AAC9C,gBAAU,IAAI,EAAE,IAAI;AACpB,gBAAU,IAAI,EAAE,EAAE;AAAA,IACpB;AAAA,EACF;AACA,QAAM,iBAAiB,MAAM,OAAO,CAAC,MAAM,UAAU,IAAI,EAAE,EAAE,CAAC;AAC9D,QAAM,QACJ,eAAe,SAAS,IACpB,CAAC,GAAG,gBAAgB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC,IAChE,CAAC,GAAG,KAAK;AAEf,WAAS,MAAM,MAAY,MAAyB;AAClD,QAAI,IAAI,KAAK,IAAI,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AACjD,aAAS,KAAK;AAAA,MACZ,IAAI,KAAK;AAAA,MACT,KAAK,KAAK;AAAA,MACV,KAAK,KAAK;AAAA,MACV,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,IAAI,IAAI,KAAK,EAAE,GAAG;AACrB,YAAM,iBAAiB,SAAS,KAAK,CAAC,MAAM,SAAS,IAAI,EAAE,EAAE,GAAG,SAAS,OAAO;AAChF,YAAM,UAAU,KAAK,SAAS,WAAW,iBAAiB,2BAA2B;AACrF,YAAM,WACJ,SAAS,WAAW,IAAI,EAAE,KAAK,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,SAAS,QAAQ,IAAI,SAAS,KAAK,EAAE;AAC3F,YAAM,MAAM,cAAc,UAAU,MAAM,QAAQ,CAAC;AAAA,IACrD;AAEA,UAAMC,SAAgB,CAAC,IAAI;AAC3B,WAAOA,OAAM,SAAS,GAAG;AACvB,YAAM,OAAOA,OAAM,MAAM;AACzB,YAAM,UAAU,IAAI,IAAI,KAAK,EAAE;AAC/B,UAAI,CAAC,QAAS;AACd,iBAAW,KAAK,IAAI,IAAI,KAAK,EAAE,KAAK,CAAC,GAAG;AACtC,cAAM,OAAO,SAAS,IAAI,EAAE,EAAE;AAC9B,YAAI,CAAC,QAAQ,IAAI,IAAI,KAAK,EAAE,EAAG;AAC/B,cAAM,YAAY;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,QACJ;AACA,cAAM,OAAO,6BAA6B,WAAW,MAAM,MAAM,GAAG,QAAQ;AAC5E,cAAM,MAAM,IAAI;AAChB,QAAAA,OAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,yBAAuB,GAAG;AAC1B,SAAO;AACT;AAEA,SAAS,eACP,OACA,aAC8B;AAC9B,QAAM,UAAU,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC9C,QAAM,YAAY,oBAAI,IAAwC;AAC9D,aAAW,QAAQ,MAAO,WAAU,IAAI,KAAK,IAAI,oBAAI,IAAI,CAAC;AAE1D,aAAW,KAAK,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS,GAAG;AAC1E,QAAI,CAAC,QAAQ,IAAI,EAAE,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAG;AAChD,WAAO,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ;AAAA,MAC/C,IAAI,EAAE;AAAA,MACN,UAAU,EAAE;AAAA,MACZ,QAAQ,EAAE;AAAA,MACV,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,IACf,CAAC;AACD,WAAO,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU;AAAA,MAC7C,IAAI,EAAE;AAAA,MACN,UAAU,EAAE;AAAA,MACZ,QAAQ,EAAE;AAAA,MACV,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,MACb,WAAW,EAAE;AAAA,IACf,CAAC;AAAA,EACH;AAEA,SAAO,IAAI;AAAA,IACT,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,MAAM,MAAM;AAAA,MACnC;AAAA,MACA,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,IAC/D,CAAC;AAAA,EACH;AACF;AAEA,SAAS,OACP,KACA,MACA,MACA,GACM;AACN,QAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,MAAI,CAAC,OAAQ;AACb,MAAI,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,EAAG,OAAO,EAAE,IAAI;AACrD,YAAQ;AAAA,MACN,6CAA6C,IAAI,eAAe,IAAI;AAAA,IACtE;AACA;AAAA,EACF;AACA,MAAI,CAAC,OAAO,IAAI,IAAI,EAAG,QAAO,IAAI,MAAM,CAAC;AAC3C;AAEA,SAAS,sBACP,MACA,SACA,MACA,UACA,QACA,WACA,WACa;AACb,QAAM,IAAI,MAAM,WAAW,MAAM;AACjC,MAAI,CAAC,EAAG,QAAO,EAAE,KAAK,QAAQ,KAAK,KAAK,QAAQ,IAAI;AACpD,QAAM,UAAU,KAAK,SAAS,WAAW,KAAK,SAAS,UAAU,2BAA2B;AAC5F,MAAI,gBAAgB,UAAU,MAAM,GAAG;AACrC,WAAO,mBAAmB,MAAM,SAAS,MAAM,UAAU,QAAQ,WAAW,WAAW,OAAO;AAAA,EAChG;AACA,MAAI,MAAM,QAAQ;AAClB,MAAI,MAAM,QAAQ;AAClB,MAAI,EAAE,CAAC,IAAI,EAAG,OAAM,QAAQ,MAAM,KAAK,QAAQ;AAAA,WACtC,EAAE,CAAC,IAAI,EAAG,OAAM,QAAQ,MAAM,KAAK,QAAQ;AACpD,MAAI,EAAE,CAAC,IAAI,EAAG,OAAM,QAAQ,MAAM,KAAK,SAAS;AAAA,WACvC,EAAE,CAAC,IAAI,EAAG,OAAM,QAAQ,MAAM,KAAK,SAAS;AACrD,SAAO,EAAE,KAAK,IAAI;AACpB;AAEA,SAAS,iBAAiB,MAAqB;AAC7C,SAAO,SAAS,OAAO,SAAS;AAClC;AAEA,SAAS,gBAAgB,UAAgB,QAAuB;AAC9D,SAAO,iBAAiB,QAAQ,MAAM,iBAAiB,MAAM;AAC/D;AAEA,SAAS,mBACP,MACA,SACA,MACA,UACA,QACA,WACA,WACA,SACa;AACb,MAAI,MAAM,QAAQ;AAClB,MAAI,MAAM,QAAQ;AAClB,QAAM,WAAW,QAAQ,MAAM,UAAU;AACzC,QAAM,WAAW,QAAQ,MAAM,UAAU;AAEzC,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,YAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC;AAAA,IACF,KAAK;AACH,YAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC;AAAA,IACF,KAAK;AACH,YAAM,QAAQ,MAAM,KAAK,SAAS;AAClC;AAAA,IACF,KAAK;AACH,YAAM,QAAQ,MAAM,KAAK,SAAS;AAClC;AAAA,EACJ;AAEA,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,YAAM,WAAW,IAAI,UAAU;AAC/B;AAAA,IACF,KAAK;AACH,YAAM,WAAW,IAAI,UAAU;AAC/B;AAAA,IACF,KAAK;AACH,YAAM,WAAW,IAAI,UAAU;AAC/B;AAAA,IACF,KAAK;AACH,YAAM,WAAW,IAAI,UAAU;AAC/B;AAAA,EACJ;AAEA,SAAO,EAAE,KAAK,IAAI;AACpB;AAEA,SAAS,6BACP,WACA,MACA,MACA,GACA,UACa;AACb,MAAI,CAAC,YAAY,WAAW,MAAM,QAAQ,EAAG,QAAO;AAEpD,QAAM,IAAI,wBAAwB,EAAE,UAAU,EAAE,MAAM;AACtD,QAAM,WAAW,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE;AACtD,QAAM,QAAQ,KAAK;AAAA,IACjB;AAAA,IACA,SAAS,SAAS,IAAI,SAAS,QAAQ,IAAI,UAAU,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAAA,EACrF;AAEA,QAAM,UAAU,eAAe,KAAK;AACpC,MAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,GAAG;AAC5B,eAAW,OAAO,SAAS;AACzB,YAAM,OAAO,EAAE,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,IAAI;AAC5D,UAAI,mBAAmB,MAAM,MAAM,UAAU,CAAC,KAAK,CAAC,YAAY,MAAM,MAAM,QAAQ;AAClF,eAAO;AAAA,IACX;AAAA,EACF,WAAW,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,GAAG;AACnC,eAAW,OAAO,SAAS;AACzB,YAAM,OAAO,EAAE,KAAK,UAAU,MAAM,KAAK,KAAK,UAAU,IAAI;AAC5D,UAAI,mBAAmB,MAAM,MAAM,UAAU,CAAC,KAAK,CAAC,YAAY,MAAM,MAAM,QAAQ;AAClF,eAAO;AAAA,IACX;AAAA,EACF,OAAO;AACL,aAAS,SAAS,GAAG,UAAU,OAAO,UAAU;AAC9C,eAAS,KAAK,CAAC,QAAQ,MAAM,QAAQ,MAAM;AACzC,cAAM,QAAQ,SAAS,KAAK,IAAI,EAAE;AAClC,mBAAW,MAAM,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,GAAG;AACpD,gBAAM,OAAO,EAAE,KAAK,UAAU,MAAM,IAAI,KAAK,UAAU,MAAM,GAAG;AAChE,cAAI,mBAAmB,MAAM,MAAM,UAAU,CAAC,KAAK,CAAC,YAAY,MAAM,MAAM,QAAQ;AAClF,mBAAO;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ;AAAA,IACN,0CAA0C,UAAU,GAAG,IAAI,UAAU,GAAG,eAAe,KAAK,EAAE;AAAA,EAChG;AACA,SAAO,cAAc,EAAE,KAAK,SAAS,QAAQ,GAAG,KAAK,EAAE,GAAG,MAAM,QAAQ;AAC1E;AAEA,SAAS,wBAAwB,UAAgB,QAAyC;AACxF,MAAI,gBAAgB,UAAU,MAAM,GAAG;AACrC,WAAO,iBAAiB,QAAQ,IAC5B,CAAC,aAAa,MAAM,KAAK,GAAG,CAAC,IAC7B,CAAC,GAAG,aAAa,MAAM,KAAK,CAAC;AAAA,EACnC;AACA,SAAO,MAAM,WAAW,MAAM,KAAK,CAAC,GAAG,CAAC;AAC1C;AAEA,SAAS,eAAe,OAAyB;AAC/C,QAAM,MAAM,CAAC,CAAC;AACd,WAAS,IAAI,GAAG,KAAK,OAAO,IAAK,KAAI,KAAK,GAAG,CAAC,CAAC;AAC/C,SAAO;AACT;AAEA,SAAS,mBACP,MACA,MACA,MACA,GACS;AACT,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,KAAK,EAAE,CAAC,KAAK;AACnB,QAAM,KAAK,EAAE,CAAC,KAAK;AACnB,MAAI,KAAK,KAAK,KAAK,MAAM,KAAK,QAAQ,KAAK,IAAK,QAAO;AACvD,MAAI,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,MAAO,QAAO;AACvD,MAAI,KAAK,KAAK,KAAK,MAAM,KAAK,SAAS,KAAK,IAAK,QAAO;AACxD,MAAI,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,KAAK,OAAQ,QAAO;AACxD,SAAO;AACT;AAEA,SAAS,cAAc,OAAoB,MAAY,UAA4C;AACjG,MAAI,MAAM,MAAM;AAChB,QAAM,aAAa,KAAK,IAAI,MAAM,MAAM,GAAG,SAAS,QAAQ,IAAI,KAAK,QAAQ,SAAS,SAAS,CAAC;AAChG,aAAS;AACP,aAAS,MAAM,MAAM,KAAK,OAAO,YAAY,OAAO;AAClD,YAAM,OAAO,EAAE,KAAK,IAAI;AACxB,UAAI,CAAC,YAAY,MAAM,MAAM,QAAQ,EAAG,QAAO;AAAA,IACjD;AACA;AAAA,EACF;AACF;AAEA,SAAS,YACP,MACA,MACA,UACA,SAA8B,oBAAI,IAAI,GAC7B;AACT,SAAO,SAAS;AAAA,IACd,CAAC,MACC,CAAC,OAAO,IAAI,EAAE,EAAE,KAChBC,cAAa,KAAK,KAAK,KAAK,KAAK,KAAK,OAAO,KAAK,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM;AAAA,EAC7F;AACF;AAEA,SAASA,cACP,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACS;AACT,SAAO,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK;AACnE;AAEA,SAAS,SAAS,OAAoC;AACpD,SAAO,MAAM,WAAW,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC;AAC/E;AAEA,SAAS,UAAU,OAAoC;AACrD,SAAO,MAAM,WAAW,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;AAChF;AAEA,SAAS,uBAAuB,KAAqC;AACnE,MAAI,IAAI,SAAS,EAAG;AACpB,QAAM,SAAS,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9D,QAAM,SAAS,KAAK,IAAI,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAC9D,aAAW,KAAK,IAAI,OAAO,GAAG;AAC5B,MAAE,OAAO;AACT,MAAE,OAAO;AAAA,EACX;AACF;AAEA,SAAS,mBACP,SACA,SACM;AACN,MAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS,EAAG;AAC9C,QAAM,OAAO,CAAC,GAAG,QAAQ,OAAO,GAAG,GAAG,QAAQ,OAAO,CAAC;AACtD,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACjD,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACjD,aAAW,KAAK,QAAQ,OAAO,GAAG;AAChC,MAAE,OAAO;AACT,MAAE,OAAO;AAAA,EACX;AACA,aAAW,KAAK,QAAQ,OAAO,GAAG;AAChC,MAAE,OAAO;AACT,MAAE,OAAO;AAAA,EACX;AACF;AAEA,SAAS,eAAe,OAAwB,SAAiD;AAC/F,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,OAAO,GAAG,QAAQ,EAAE;AACrD,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,aAAW,QAAQ,OAAO;AACxB,UAAM,IAAI,QAAQ,IAAI,KAAK,EAAE;AAC7B,QAAI,CAAC,EAAG;AACR,YAAQ,KAAK,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK;AAC1C,aAAS,KAAK,IAAI,QAAQ,EAAE,MAAM,KAAK,MAAM;AAAA,EAC/C;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAIA,SAAS,qBACP,WACA,OACA,SACA,QACA,sBACA,iBACM;AACN,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACpD,aAAW,SAAS,QAAQ;AAC1B,QAAI,qBAAqB,MAAM,OAAO,MAAM,UAAW;AACvD,UAAM,UAAU;AAAA,MACd,GAAG,IAAI;AAAA,QACL,MAAM,QACH,IAAI,CAAC,OAAO,gBAAgB,WAAW,EAAE,CAAC,EAC1C,OAAO,CAAC,OAAqB,CAAC,CAAC,EAAE;AAAA,MACtC;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,EAAG;AACxB,QAAI,CAAC,QAAQ,MAAM,CAAC,OAAO,SAAS,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,EAAG;AAEjE,UAAM,SAAS,QACZ,IAAI,CAAC,OAAO,QAAQ,IAAI,EAAE,EAAG,MAAM,SAAS,QAAQ,QAAQ,KAAK,CAAC,EAClE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACvB,UAAM,SAAS,OAAO,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC;AACnD,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,CAAC,CAAC;AAAA,IAChE;AACA,eAAW,MAAM,SAAS;AACxB,YAAM,IAAI,SAAS,IAAI,EAAE;AACzB,UAAI,MAAM,SAAS,MAAO,GAAE,MAAM;AAAA,UAC7B,GAAE,MAAM;AAAA,IACf;AAEA,QAAI,iBAAiB,OAAO,QAAQ,GAAG;AACrC,cAAQ;AAAA,QACN,+BAA+B,MAAM,IAAI,KAAK,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,MACxE;AACA;AAAA,IACF;AACA,eAAW,CAAC,IAAI,CAAC,KAAK,SAAU,SAAQ,IAAI,IAAI,CAAC;AAAA,EACnD;AACA,yBAAuB,OAAO;AAChC;AAEA,SAAS,iBAAiB,OAAwB,KAAgD;AAChG,QAAM,QAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO;AACxB,UAAM,IAAI,IAAI,IAAI,KAAK,EAAE;AACzB,QAAI,CAAC,EAAG;AACR,QAAI,YAAY,GAAG,MAAM,KAAK,EAAG,QAAO;AACxC,UAAM,KAAK,EAAE,IAAI,KAAK,IAAI,KAAK,EAAE,KAAK,KAAK,EAAE,KAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,CAAC;AAAA,EAC5F;AACA,SAAO;AACT;;;ACxyBA,IAAMC,gBAAe;AACrB,IAAMC,kBAAiB;AAIvB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AACtB,IAAM,cAAc;AACpB,IAAM,YAAY;AAClB,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,oBAAoB;AAC1B,IAAM,kBAAkB;AAExB,SAAS,oBAAoB,OAAiD;AAC5E,SAAO,SAAS;AAClB;AAEA,SAAS,gBAAgB,OAA+B;AACtD,SAAO,UAAU,OAAO,UAAU;AACpC;AAEA,SAAS,YACP,OACA,OACA,MACA,WAC6D;AAC7D,QAAM,IAAI,oBAAoB,KAAK;AACnC,QAAM,OAAO,qBAAqB,OAAO,MAAM,WAAW,KAAK,CAAC;AAChE,QAAM,QAAQ,gBAAgB,CAAC,IAAI,cAAc;AACjD,QAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,eAAe,QAAQ,KAAK,eAAe,cAAc,CAAC,CAAC;AAC5F,QAAM,QAAQ,KAAK,YAAY,IAAI,KAAK,aAAa,OAAO,QAAQ,OAAO;AAC3E,QAAM,QACJ,MAAM,MACF,KAAK;AAAA,IACH,KAAK;AAAA,MACH;AAAA,MACA,oBAAoB,YAAY,kBAAkB,QAAQ;AAAA,IAC5D;AAAA,EACF,IACA;AACN,QAAM,SACJ,KAAK,YAAY,IACb,KAAK;AAAA,IACH;AAAA,IACA,KAAK;AAAA,MACH,oBACE,SACC,MAAM,OAAO,MAAM,QAAQ,MAAM,OAAO,cAAc,KACvD;AAAA,IACJ;AAAA,EACF,IACA;AACN,SAAO,EAAE,OAAO,QAAQ,KAAK;AAC/B;AAEA,SAAS,KAAK,GAAS,MAAc,IAAI,KAA+B;AACtE,UAAQ,KAAK,YAAY,GAAG;AAAA,IAC1B,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AAAA,IACzC,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AAAA,IACnD,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,EAAE;AAAA,IACxC;AACE,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,OAAO;AAAA,EACrD;AACF;AAEA,SAAS,UAAU,MAA6B;AAC9C,UAAQ,KAAK,YAAY,GAAG;AAAA,IAC1B,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,UAAU,KAA4B;AAC7C,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,SAASC,YAAW,GAAgB;AAClC,SAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE;AACvD;AAEA,SAAS,aAAa,MAA6C,UAA2B;AAC5F,QAAM,OAAO,WAAW,KAAK,WAAW,KAAK;AAC7C,SAAO,OAAO,UAAU,IAAI,IAAI,WAAW,KAAK,WAAW,KAAK;AAClE;AAEA,SAAS,kBAAkB,MAAc,aAA4B;AACnE,UAAQ,KAAK,YAAY,GAAG;AAAA,IAC1B,KAAK;AAAA,IACL,KAAK;AACH,aAAO,YAAY;AAAA,IACrB;AACE,aAAO,YAAY;AAAA,EACvB;AACF;AAEA,SAASC,UAAS,OAA+C;AAC/D,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASC,iBAAgB,OAA2B,MAAsB;AACxE,SAAO,UAAU,UAAU,OAAO,IAAI;AACxC;AAEA,SAAS,WAAW,GAAS,OAA4D;AACvF,QAAM,IAAI,oBAAoB,KAAK;AACnC,QAAM,QAAQ,EAAE,IAAI,qBAAqB,EAAE,SAAS,qBAAqB;AACzE,QAAM,OAAO,EAAE,IAAI,oBAAoB,YAAY;AACnD,QAAM,UAAU,EAAE,IAAI,EAAE,SAAS,YAAY,IAAI;AACjD,UAAQ,GAAG;AAAA,IACT,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,QAAQ;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,cAAc,GAAG,GAAG,MAAM;AAAA,IACxD,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,cAAc,GAAG,GAAG,MAAM;AAAA,IAC9C,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,cAAc,GAAG,GAAG,KAAK;AAAA,IACvD,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,cAAc,GAAG,GAAG,KAAK;AAAA,IAC7C,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,cAAc,GAAG,GAAG,QAAQ;AAAA,IAC1D,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,cAAc,GAAG,GAAG,QAAQ;AAAA,IAChD,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,KAAK;AAAA,IACzC,KAAK;AAAA,IACL;AACE,aAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,GAAG,KAAK;AAAA,EAC3C;AACF;AAEA,SAAS,iBACP,GACA,OAQA;AACA,QAAM,IAAI,oBAAoB,KAAK;AACnC,UAAQ,GAAG;AAAA,IACT,KAAK;AACH,aAAO;AAAA,QACL,GAAG,EAAE,IAAI,cAAc;AAAA,QACvB,GAAG,EAAE,IAAI;AAAA,QACT,OAAO,EAAE,QAAQ,cAAc,cAAc;AAAA,QAC7C,QAAQ,EAAE,SAAS;AAAA,QACnB,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,GAAG,EAAE,IAAI;AAAA,QACT,GAAG,EAAE,IAAI;AAAA,QACT,OAAO,EAAE,QAAQ,cAAc,cAAc;AAAA,QAC7C,QAAQ,EAAE,SAAS;AAAA,QACnB,QAAQ;AAAA,MACV;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,GAAG,EAAE,IAAI;AAAA,QACT,GAAG,EAAE,IAAI;AAAA,QACT,OAAO,EAAE,QAAQ,cAAc;AAAA,QAC/B,QAAQ,EAAE,SAAS,oBAAoB;AAAA,QACvC,QAAQ;AAAA,MACV;AAAA,IACF,KAAK,KAAK;AACR,YAAM,MAAM,EAAE,IAAI,oBAAoB,YAAY;AAClD,aAAO;AAAA,QACL,GAAG,EAAE,IAAI;AAAA,QACT,GAAG;AAAA,QACH,OAAO,EAAE,QAAQ,cAAc;AAAA,QAC/B,QAAQ,EAAE,IAAI,EAAE,SAAS,cAAc;AAAA,QACvC,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,SAAS;AACP,YAAM,MAAM,EAAE,IAAI,oBAAoB;AACtC,aAAO;AAAA,QACL,GAAG,EAAE,IAAI;AAAA,QACT,GAAG;AAAA,QACH,OAAO,EAAE,QAAQ,cAAc;AAAA,QAC/B,QAAQ,EAAE,IAAI,EAAE,SAAS;AAAA,QACzB,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,sBAAsB;AAC5B,IAAM,2BAA2B;AACjC,IAAM,wBAAwB;AAE9B,SAAS,sBAAsB,OAA2C;AACxE,SAAO,UAAU,OAAO,UAAU,QAAQ,UAAU;AACtD;AAEA,SAAS,qBACP,GACA,OACA,SAIA;AACA,QAAM,IAAI,EAAE,IAAI;AAChB,MAAI,WAAW,sBAAsB,KAAK,GAAG;AAC3C,WAAO;AAAA,MACL,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,qBAAqB,EAAE;AAAA,MAClD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,0BAA0B,GAAG,QAAQ,MAAM;AAAA,IACzE;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM,EAAE,GAAG,EAAE,IAAI,qBAAqB,EAAE;AAAA,IACxC,OAAO,EAAE,GAAG,EAAE,KAAK,UAAU,2BAA2B,KAAK,GAAG,QAAQ,QAAQ;AAAA,EAClF;AACF;AAIA,SAAS,cAAc,QAA2C;AAChE,QAAM,SAAsB,CAAC;AAC7B,QAAM,QAAQ,oBAAI,IAAY;AAC9B,WAAS,IAAI,GAAc;AACzB,QAAI,MAAM,IAAI,EAAE,EAAE,EAAG;AACrB,QAAI,EAAE,QAAQ;AACZ,YAAM,MAAM,OAAO,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,MAAM;AAClD,UAAI,IAAK,KAAI,GAAG;AAAA,IAClB;AACA,WAAO,KAAK,CAAC;AACb,UAAM,IAAI,EAAE,EAAE;AAAA,EAChB;AACA,aAAW,KAAK,OAAQ,KAAI,CAAC;AAC7B,SAAO;AACT;AAIO,SAAS,mBACd,IACA,OACA,SACc;AACd,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAC7B,QAAM,YAAY,SAAS;AAG3B,QAAM,OAAO,IACX,OAAO;AAGT,QAAM,YAAY,oBAAI,IAA+C;AACrE,QAAM,eAAe,oBAAI,IAAgC;AACzD,aAAWC,MAAK,GAAG,UAAU;AAC3B,UAAM,KAAK,YAAYA,GAAE,OAAOA,GAAE,WAAW,MAAM,SAAS;AAC5D,cAAU,IAAIA,GAAE,IAAI,EAAE;AACtB,iBAAa,IAAIA,GAAE,IAAI,GAAG,IAAI;AAAA,EAChC;AACA,aAAW,KAAK,GAAG,UAAW,WAAU,IAAI,EAAE,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,CAAC;AAG/E,QAAM,SAAS,IACb,SAAS;AACX,QAAM,YAAY,gCAAgC,EAAE;AAGpD,QAAM,YAAY,oBAAI,IAAoB;AAC1C,QAAM,aAAa,oBAAI,IAAoB;AAC3C,aAAW,CAAC,IAAI,IAAI,KAAK,WAAW;AAClC,UAAM,KAAK,UAAU,IAAI,EAAE;AAC3B,QAAI,CAAC,GAAI;AACT,cAAU,IAAI,KAAK,KAAK,KAAK,IAAI,UAAU,IAAI,KAAK,GAAG,KAAK,eAAe,GAAG,KAAK,CAAC;AACpF,eAAW,IAAI,KAAK,KAAK,KAAK,IAAI,WAAW,IAAI,KAAK,GAAG,KAAK,eAAe,GAAG,MAAM,CAAC;AAAA,EACzF;AACA,QAAMC,SAAQ,CAAC,GAAG,UAAU,OAAO,CAAC;AACpC,QAAM,SAAS,KAAK,IAAI,GAAG,GAAGA,OAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACrD,QAAM,SAAS,KAAK,IAAI,GAAG,GAAGA,OAAM,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AACrD,QAAM,OAAO,oBAAI,IAAoB;AACrC,QAAM,OAAO,oBAAI,IAAoB;AACrC,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,KAAK,QAAQ,KAAK;AAChC,SAAK,IAAI,GAAG,OAAO;AACnB,gBAAY,UAAU,IAAI,CAAC,KAAK,iBAAiB;AAAA,EACnD;AACA,MAAI,UAAU;AACd,WAAS,IAAI,GAAG,KAAK,QAAQ,KAAK;AAChC,SAAK,IAAI,GAAG,OAAO;AACnB,gBAAY,WAAW,IAAI,CAAC,KAAK,iBAAiB;AAAA,EACpD;AACA,QAAM,YAAY,oBAAI,IAAsC;AAC5D,aAAW,CAAC,IAAI,IAAI,KAAK,WAAW;AAClC,cAAU,IAAI,IAAI;AAAA,MAChB,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK;AAAA,MACzB,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AAGA,QAAM,SAAS,GAAG,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACnE,QAAM,OAAO;AACb,QAAM,SAAS,CAAC,OAAiC;AAC/C,UAAM,MAAM,UAAU,IAAI,EAAE;AAC5B,UAAM,KAAK,UAAU,IAAI,EAAE;AAC3B,UAAM,OAAO,UAAU,IAAI,EAAE;AAC7B,QAAI,CAAC,OAAO,CAAC,GAAI,QAAO;AACxB,UAAM,QAAQ,GAAG,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,UAAM,QAAQ,QAAQ,GAAG,QAAQ,OAAQ,UAAU,IAAI,KAAK,GAAG,KAAK,GAAG,QAAS,GAAG;AACnF,WAAO,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,MAAM,OAAO,QAAQ,GAAG,OAAO;AAAA,EAC/D;AAGA,QAAM,iBAAiB,oBAAI,IAAkB;AAC7C,QAAM,mBAAmB,CAAC,QAAkC;AAC1D,QAAI,eAAe,IAAI,GAAG,EAAG,QAAO,eAAe,IAAI,GAAG;AAC1D,UAAM,MAAM;AACZ,UAAM,cAAsB;AAAA,MAC1B,GAAG,GAAG,SACH,OAAO,CAACD,OAAMA,GAAE,UAAU,GAAG,EAC7B,IAAI,CAACA,OAAM,OAAOA,GAAE,EAAE,CAAC,EACvB,OAAO,CAAC,MAAiB,CAAC,CAAC,CAAC;AAAA,MAC/B,GAAG,GAAG,UACH,OAAO,CAAC,MAAM,EAAE,UAAU,GAAG,EAC7B,IAAI,CAAC,MAAM,OAAO,EAAE,EAAE,CAAC,EACvB,OAAO,CAAC,MAAiB,CAAC,CAAC,CAAC;AAAA,MAC/B,GAAG,GAAG,OACH,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,EAC9B,IAAI,CAAC,MAAM,iBAAiB,EAAE,EAAE,CAAC,EACjC,OAAO,CAAC,MAAiB,CAAC,CAAC,CAAC;AAAA,IACjC;AACA,QAAI,YAAY,WAAW,EAAG,QAAO;AACrC,UAAM,OAAO,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI;AACxD,UAAM,OAAO,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,MAAM;AAC9D,UAAM,OAAO,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI;AAClE,UAAM,OAAO,KAAK,IAAI,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI;AACnE,UAAM,OAAa,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AAC/E,mBAAe,IAAI,KAAK,IAAI;AAC5B,WAAO;AAAA,EACT;AAEA,aAAW,KAAK,GAAG,OAAQ,kBAAiB,EAAE,EAAE;AAGhD,QAAM,WAA2B,CAAC;AAClC,QAAM,cAAc,oBAAI,IAAY;AAGpC,MAAI,GAAG,SAAS,OAAO;AACrB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,OAAO,GAAG,SAAS,KAAK;AAAA,QACxB;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAS,MAAM,SAAS,cAAc,MAAM,SAAS,aAAa,MAAM,SAAS;AACvF,QAAM,gBAAgB,cAAc,GAAG,MAAM;AAC7C,gBAAc,QAAQ,CAAC,GAAG,OAAO;AAC/B,UAAM,IAAI,iBAAiB,EAAE,EAAE;AAC/B,QAAI,CAAC,EAAG;AACR,UAAM,MAAM,eAAe,IAAI,KAAK;AACpC,UAAM,cAAc,SAAS,QAAQ,SAAS;AAC9C,UAAM,YAAY,SAAS,QAAQ,UAAU,MAAM;AACnD,UAAM,kBAAkB,SAAS,QAAQ,OAAO;AAChD,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,IAAI,EAAE,KAAK,GAAG,QAAQ,IAAI,EAAE,MAAM,EAAE;AAAA,QACvE;AAAA,QACA;AAAA,QACA;AAAA,QACA,EAAE,IAAI,GAAG;AAAA,MACX;AAAA,IACF;AACA,UAAM,SAAS,qBAAqB,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,SAAS;AACjE,QAAI,EAAE,WAAW;AACf,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,EAAE;AAAA,UACF,OAAO,KAAK;AAAA,UACZ,OAAO,KAAK;AAAA,UACZ,SAAS,QAAQ,YAAY;AAAA,UAC7B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE;AAAA,QACF,IAAI,OAAO,MAAM,CAAC;AAAA,QAClB,IAAI,OAAO,MAAM,CAAC;AAAA,QAClB,WAAW;AAAA,QACX;AAAA,QACA;AAAA,UACE,QAAQ;AAAA,UACR,QAAQ,OAAO,MAAM;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,WAAuF,CAAC;AAC9F,aAAW,CAAC,IAAI,GAAG,KAAK,WAAW;AACjC,UAAM,KAAK,UAAU,IAAI,EAAE;AAC3B,QAAI,GAAI,UAAS,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,QAAQ,GAAG,OAAO,CAAC;AAAA,EACtF;AAEA,QAAM,eAAe,CACnB,MACA,aACqB;AACrB,UAAM,KAAK,WAAW,KAAK,OAAO,KAAK;AACvC,QAAI,IAAI,OAAO,EAAE;AACjB,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,WAAW,WAAW,KAAK,YAAY,KAAK;AAClD,QAAI,UAAU;AACZ,YAAM,MAAM,GAAG,SAAS,KAAK,CAACA,OAAMA,GAAE,OAAO,EAAE;AAC/C,UAAI,KAAK,OAAO;AACd,cAAM,KAAK,iBAAiB,IAAI,KAAK;AACrC,YAAI,GAAI,KAAI;AAAA,MACd;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAQA,QAAM,iBAAiB,oBAAI,IAA8B;AACzD,QAAM,gBAAgB,oBAAI,IAA0B;AAEpD,KAAG,MAAM,QAAQ,CAAC,GAAG,cAAc;AACjC,UAAM,WAAW,aAAa,GAAG,IAAI;AACrC,UAAME,UAAS,aAAa,GAAG,KAAK;AACpC,QAAI,CAAC,YAAY,CAACA,QAAQ;AAE1B,UAAM,WAAW,aAAa,GAAG,IAAI;AACrC,UAAM,SAAS,aAAa,GAAG,KAAK;AACpC,UAAM,aAAaL,YAAW,QAAQ;AACtC,UAAM,WAAWA,YAAWK,OAAM;AAElC,UAAM,YAAY,GAAG,EAAE,IAAI,IAAI,SAAS,YAAY,CAAC;AACrD,UAAM,YAAY,GAAG,EAAE,EAAE,IAAI,OAAO,YAAY,CAAC;AACjD,QAAI,CAAC,eAAe,IAAI,SAAS,EAAG,gBAAe,IAAI,WAAW,CAAC,CAAC;AACpE,QAAI,CAAC,eAAe,IAAI,SAAS,EAAG,gBAAe,IAAI,WAAW,CAAC,CAAC;AACpE,mBACG,IAAI,SAAS,EACb,KAAK,EAAE,WAAW,UAAU,MAAM,YAAY,kBAAkB,UAAU,QAAQ,EAAE,CAAC;AACxF,mBACG,IAAI,SAAS,EACb,KAAK,EAAE,WAAW,UAAU,OAAO,YAAY,kBAAkB,QAAQ,UAAU,EAAE,CAAC;AAAA,EAC3F,CAAC;AAED,aAAW,WAAW,eAAe,OAAO,GAAG;AAC7C,YAAQ;AAAA,MACN,CAAC,GAAG,MACF,EAAE,aAAa,EAAE,cACjB,EAAE,YAAY,EAAE,aAChB,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,QAAQ;AAAA,IAC1C;AACA,UAAM,IAAI,QAAQ;AAClB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,SAAS,QAAQ,CAAC;AACxB,YAAM,KAAK,IAAI,MAAM,IAAI;AACzB,YAAM,OAAO,cAAc,IAAI,OAAO,SAAS,KAAK,CAAC;AACrD,oBAAc;AAAA,QACZ,OAAO;AAAA,QACP,OAAO,WAAW,EAAE,GAAG,MAAM,SAAS,EAAE,IAAI,EAAE,GAAG,MAAM,SAAS,EAAE;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAGA,KAAG,MAAM,QAAQ,CAAC,GAAG,cAAc;AACjC,UAAM,WAAW,aAAa,GAAG,IAAI;AACrC,UAAMA,UAAS,aAAa,GAAG,KAAK;AACpC,QAAI,CAAC,YAAY,CAACA,QAAQ;AAE1B,UAAM,WAAW,aAAa,GAAG,IAAI,EAAE,YAAY;AACnD,UAAM,SAAS,aAAa,GAAG,KAAK,EAAE,YAAY;AAClD,UAAM,aAAaL,YAAW,QAAQ;AACtC,UAAM,WAAWA,YAAWK,OAAM;AAElC,UAAM,sBACF,aAAa,OAAO,WAAW,OAAS,aAAa,OAAO,WAAW,QACzE,KAAK,IAAI,WAAW,IAAI,SAAS,CAAC,IAAI;AAExC,UAAM,wBACF,aAAa,OAAO,WAAW,OAAS,aAAa,OAAO,WAAW,QACzE,KAAK,IAAI,WAAW,IAAI,SAAS,CAAC,IAAI;AAExC,QAAI,sBAAsB,sBAAsB;AAC9C,YAAM,YAAY,GAAG,EAAE,IAAI,IAAI,QAAQ;AACvC,YAAM,YAAY,GAAG,EAAE,EAAE,IAAI,MAAM;AACnC,YAAM,cAAc,eAAe,IAAI,SAAS,GAAG,UAAU;AAC7D,YAAM,cAAc,eAAe,IAAI,SAAS,GAAG,UAAU;AAAA,IAE/D;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,oBAAI,IAAiD;AAC5E,aAAW,CAAC,KAAK,OAAO,KAAK,gBAAgB;AAC3C,QAAI,QAAQ,SAAS,EAAG;AACxB,UAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,QAAQ;AAChD,QAAI,QAAQ,SAAS,EAAG;AAExB,UAAM,CAAC,EAAE,IAAI,IAAI,IAAI,MAAM,GAAG;AAC9B,UAAM,aAAa,SAAS,OAAO,SAAS;AAC5C,UAAM,IAAI,QAAQ;AAGlB,UAAM,SAAS,QACZ,IAAI,CAAC,MAAM;AACV,YAAM,IAAI,GAAG,MAAM,EAAE,SAAS;AAC9B,YAAM,KAAK,aAAa,GAAG,IAAI;AAC/B,YAAM,KAAK,aAAa,GAAG,KAAK;AAChC,UAAI,CAAC,MAAM,CAAC,GAAI,QAAO,EAAE,WAAW,EAAE,WAAW,MAAM,GAAG,KAAK,EAAE;AACjE,YAAM,KAAKL,YAAW,EAAE;AACxB,YAAM,KAAKA,YAAW,EAAE;AACxB,YAAM,OAAO,aAAa,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,CAAC;AACtE,YAAM,MAAM,aAAc,GAAG,KAAK,GAAG,IAAI,IAAI,KAAM,GAAG,KAAK,GAAG,IAAI,IAAI;AACtE,aAAO,EAAE,WAAW,EAAE,WAAW,MAAM,IAAI;AAAA,IAC7C,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAEjC,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,OAAO,OAAO,CAAC;AACrB,YAAM,cAAc,KAAK,IAAI,KAAK,KAAK,KAAK,KAAK;AACjD,qBAAe,IAAI,KAAK,WAAW;AAAA,QACjC,MAAM,aAAa,MAAM;AAAA,QACzB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,YAAY,GAAG,YAAY,GAAG,MAAM,QAAQ,aAAa;AAChE,UAAM,IAAI,GAAG,MAAM,SAAS;AAE5B,QAAI,WAAW,aAAa,GAAG,IAAI;AACnC,QAAI,CAAC,SAAU;AAGf,QAAIK,UAAS,aAAa,GAAG,KAAK;AAClC,QAAI,CAACA,QAAQ;AAEb,UAAM,UAAU,EAAE,YAAY,UAAU,EAAE,QAAQ;AAClD,UAAM,QAAQ,EAAE,aAAa,UAAU,EAAE,MAAM;AAC/C,UAAM,QAAQ,cAAc,IAAI,SAAS;AACzC,UAAM,KAAK,KAAK,UAAU,aAAa,GAAG,IAAI,GAAG,OAAO,OAAO;AAC/D,UAAM,KAAK,KAAKA,SAAQ,aAAa,GAAG,KAAK,GAAG,OAAO,OAAO;AAE9D,UAAM,YAAoB,SACvB,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,EAAE,EACjD,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,MAAM,OAAO,GAAG,OAAO,QAAQ,GAAG,OAAO,EAAE;AAEhF,UAAM,UAAsB,EAAE,WAAW;AACzC,UAAM,QAAQ,aAAa,OAAO,EAAE,MAAM;AAAA,MACxC,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,eACF,YAAY,gBAAgB,gBAAgB,OAAO,MAAM,gBAAgB,KAAK,IAC1E,2BAA2B,IAAI,IAAI,SAAS,OAAO,WAAW,EAAE,IAChE,MAAM;AAEZ,UAAM,YAAY,eAAe,IAAI,SAAS;AAC9C,QACE,aACA,YAAY,gBACZ,MAAM,OAAO,WAAW,KACxB,gBAAgB,OAAO,MAAM,gBAAgB,KAAK,GAClD;AACA,YAAM,KAAK,MAAM,OAAO,CAAC;AACzB,YAAM,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,EAAG;AACjC,YAAM,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,EAAG;AACjC,YAAM,KAAK,MAAM,OAAO,CAAC;AACzB,UAAI,UAAU,SAAS,KAAK;AAC1B,cAAM,OAAO,GAAG,IAAI,UAAU;AAC9B,cAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,EAAE;AACzE,YAAI,qBAAqB,eAAe,SAAS,MAAM,GAAG;AACxD,aAAG,IAAI;AACP,aAAG,IAAI;AACP,yBAAe,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,QAChC;AAAA,MACF,OAAO;AACL,cAAM,OAAO,GAAG,IAAI,UAAU;AAC9B,cAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE;AACzE,YAAI,qBAAqB,eAAe,SAAS,MAAM,GAAG;AACxD,aAAG,IAAI;AACP,aAAG,IAAI;AACP,yBAAe,CAAC,IAAI,IAAI,IAAI,EAAE;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,iBAAiB,YAAY;AACjD,QAAI,qBAAqB,aAAa,SAAS,IAAI,GAAG;AACpD,cAAQ;AAAA,QACN,oCAAoC,EAAE,IAAI,QAAQ,EAAE,EAAE;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,QAAQ,EAAE,SAAS;AAIzB,UAAM,WAAyC,CAAC;AAChD,QAAI,EAAE,cAAc,WAAY,CAAC,EAAE,aAAa,EAAE;AAChD,eAAS,YAAYP;AACvB,QAAI,EAAE,gBAAgB,WAAY,CAAC,EAAE,eAAe,EAAE;AACpD,eAAS,cAAcC;AACzB,UAAM,OAAOE,UAAS,KAAK;AAC3B,QAAI,KAAM,UAAS,OAAO;AAC1B,QAAI,EAAE,aAAa,EAAE,cAAc,OAAQ,UAAS,WAAW,EAAE;AAEjE,UAAM,OACJ,UAAU,SACN,WAAW,aAAa,GAAG,EAAE,IAC7B,YAAY,WACV,MAAM,OACN,kBAAkB,aAAa,MAAM,IAAI;AACjD,aAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,SAASC,iBAAgB,OAAO,GAAG,GAAG,QAAQ,CAAC;AAAA,EACpF;AAGA,KAAG,SAAS,QAAQ,CAACC,IAAG,MAAM;AAC5B,UAAM,IAAI,OAAOA,GAAE,EAAE;AACrB,QAAI,CAAC,EAAG;AACR,UAAM,MAAM,eAAe,GAAG,KAAK;AACnC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,IAAI,EAAE,KAAK,GAAG,QAAQ,IAAI,EAAE,MAAM,EAAE;AAAA,QACvE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,IAAI,EAAE,KAAK,GAAG,QAAQ,EAAE,GAAG,KAAK,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,IAC7F;AAGA,UAAM,UAAU,WAAW,GAAGA,GAAE,SAAS;AACzC,UAAM,YAAY;AAAA,MAChB;AAAA,MACAA,GAAE;AAAA,MACF,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS,QAAQ,OAAO;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,aAAS,KAAK,GAAG,SAAS;AAE1B,UAAM,OAAO,iBAAiB,GAAGA,GAAE,SAAS;AAC5C,UAAM,OAAO,aAAa,IAAIA,GAAE,EAAE;AAClC,QAAI,MAAM;AACR,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,EAAE,OAAO,KAAK,QAAQ,aAAa,KAAK;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,KAAG,UAAU,QAAQ,CAAC,MAAM;AAC1B,UAAM,IAAI,OAAO,EAAE,EAAE;AACrB,QAAI,CAAC,EAAG;AACR,UAAM,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;AAChC,UAAM,KAAK,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;AACjC,UAAM,IAAI;AAEV,aAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,QAAQ,SAAS,QAAQ,SAAS,CAAC,CAAC;AAEhF,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC;AAAA,QAC3F,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,eAAuB;AAAA,IAC3B,GAAG,GAAG,SAAS,IAAI,CAACA,OAAM,OAAOA,GAAE,EAAE,CAAC,EAAE,OAAO,CAAC,MAAiB,CAAC,CAAC,CAAC;AAAA,IACpE,GAAG,GAAG,UAAU,IAAI,CAAC,MAAM,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,MAAiB,CAAC,CAAC,CAAC;AAAA,EACvE;AAEA,QAAM,gBAAwB,CAAC,GAAG,eAAe,OAAO,CAAC;AACzD,QAAM,WAAW,CAAC,GAAG,cAAc,GAAG,aAAa;AAEnD,MAAI,SAAS,WAAW,GAAG;AAEzB,UAAMG,SAAe;AAAA,MACnB;AAAA,QACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,IAAI;AAAA,QAC/C,YAAY,QAAQ;AAAA,QACpB;AAAA,QACA,MAAM,CAAC;AAAA,MACT;AAAA,MACA,GAAG;AAAA,MACH;AAAA,IACF;AACA,WAAO,EAAE,OAAAA,QAAO,SAAS,CAAC,EAAE;AAAA,EAC9B;AAEA,QAAM,SAAS,OAAO,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE;AACnF,QAAM,SAAS,OAAO,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,SAAS,EAAE;AAGpF,QAAM,MAAM,OAAO,KAAK,IAAI,GAAG,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,MAAM;AACpE,QAAM,MAAM,OAAO,KAAK,IAAI,GAAG,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,MAAM;AAEpE,QAAM,IAAI,MAAM,OAAO,aAAa;AACpC,QAAM,KAAK,IAAI;AACf,QAAM,KAAK,IAAI,KAAK,MAAM;AAC1B,QAAM,QAAQ,IAAI,KAAK,CAAC;AACxB,QAAM,QAAQ,IAAI,KAAK,GAAG;AAC1B,QAAM,aAAa,IAAI,KAAK,GAAG;AAE/B,QAAM,OAAO;AAAA,IACX,eAAeR,aAAY,+CAA+C,EAAE,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,yCACtG,EAAE,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,IACzE,eAAeC,eAAc,+CAA+C,EAAE,mBAAmB,EAAE,WAAW,UAAU,WAAW,KAAK,uDAC7G,EAAE,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,EAC3E;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,SAAS,KAAK,QAAQ,SAAS,IAAI;AAAA,MACrE,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;AAEA,SAAS,iBACP,QACiC;AACjC,QAAM,MAAuC,CAAC;AAC9C,aAAW,KAAK,QAAQ;AACtB,UAAM,OAAO,IAAI,IAAI,SAAS,CAAC;AAC/B,QAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,KAAK,KAAK,MAAM,EAAE,EAAG,KAAI,KAAK,CAAC;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAA6C,UAA0B;AAChG,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,OAAO,WAAW,EAAG,QAAO,KAAK,IAAI,OAAO,CAAC,EAAG,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAG,CAAC,CAAC;AAC3E,SAAO,OAAO,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AACxF;AAEA,SAAS,gBAAgB,KAA6B;AACpD,SAAO,QAAQ,OAAO,QAAQ;AAChC;AAEA,SAAS,2BACP,MACA,IACA,SACA,OACA,WACA,KACS;AAET,QAAM,eAAsB,gBAAgB,OAAO,IAC/C,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,EAAE,IACrB,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,EAAE;AACzB,QAAM,UAAU,CAAC,MAAM,cAAc,EAAE;AACvC,MAAI,oBAAoB,SAAS,SAAS,MAAM,GAAG;AACjD,WAAO;AAAA,EACT;AAGA,QAAM,UAAU,KAAK,IAAI,KAAK,EAAE;AAChC,QAAM,QAAQ,YAAY,MAAM,SAAS,OAAO;AAChD,QAAM,QAAQ,YAAY,IAAI,OAAO,OAAO;AAE5C,MAAI,gBAAgB,OAAO,GAAG;AAC5B,QAAIQ,UAAS,KAAK,IAAI,GAAG,KAAK;AAC9B,UAAMC,qBAAoB,UAAU;AAAA,MAClC,CAAC,OACG,YAAY,OAAO,EAAE,IAAI,KAAK,KAAK,EAAE,IAAI,GAAG,KAC3C,YAAY,OAAO,EAAE,IAAI,EAAE,QAAQ,KAAK,KAAK,EAAE,IAAI,EAAE,QAAQ,GAAG,MACnE,KAAK,KAAK,EAAE,IAAI,OAChB,KAAK,KAAK,EAAE,IAAI,EAAE,SAAS;AAAA,IAC/B;AACA,QAAIA,mBAAkB,SAAS,GAAG;AAChC,UAAI,YAAY,KAAK;AACnB,cAAM,UAAU,KAAK,IAAI,GAAGA,mBAAkB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7D,QAAAD,UAAS,KAAK,IAAI,WAAW;AAAA,MAC/B,OAAO;AACL,cAAM,UAAU,KAAK,IAAI,GAAGC,mBAAkB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;AACvE,QAAAD,UAAS,KAAK,IAAI,WAAW;AAAA,MAC/B;AAAA,IACF;AAEA,UAAME,cAAa;AAAA,OAChB,KAAK,IAAI,GAAG,KAAK;AAAA,OACjB,MAAM,IAAI,MAAM,KAAK;AAAA,MACtB,GAAG,UAAU,QAAQ,CAAC,MAAM;AAAA,QAC1B,EAAE,IAAI;AAAA,QACN,EAAE,IAAI,EAAE,SAAS;AAAA,SAChB,EAAE,IAAI,GAAG,KAAK;AAAA,SACd,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH;AACA,UAAMC,SAAQ;AAAA,MACZD;AAAA,MACA,CAAC,MAAM,CAAC,MAAM,EAAE,GAAGF,QAAO,GAAG,KAAK,EAAE,GAAG,EAAE,GAAGA,QAAO,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE;AAAA,MAC1E;AAAA,IACF;AACA,UAAMI,aAAY;AAAA,MAChB;AAAA,MACA,EAAE,GAAGJ,QAAO,GAAG,KAAK,EAAE;AAAA,MACtB,EAAE,GAAGA,QAAO,GAAGG,OAAM;AAAA,MACrB,EAAE,GAAG,GAAG,GAAG,GAAGA,OAAM;AAAA,MACpB;AAAA,IACF;AACA,WAAO,gBAAgBC,YAAW,MAAM,IAAI,OAAO,OAAO,WAAW,GAAG;AAAA,EAC1E;AAEA,MAAI,SAAS,KAAK,IAAI,GAAG,KAAK;AAC9B,QAAM,oBAAoB,UAAU;AAAA,IAClC,CAAC,OACG,YAAY,OAAO,EAAE,IAAI,KAAK,KAAK,EAAE,IAAI,GAAG,KAC3C,YAAY,OAAO,EAAE,IAAI,EAAE,SAAS,KAAK,KAAK,EAAE,IAAI,EAAE,SAAS,GAAG,MACrE,KAAK,KAAK,EAAE,IAAI,OAChB,KAAK,KAAK,EAAE,IAAI,EAAE,QAAQ;AAAA,EAC9B;AACA,MAAI,kBAAkB,SAAS,GAAG;AAChC,QAAI,YAAY,KAAK;AACnB,YAAM,UAAU,KAAK,IAAI,GAAG,kBAAkB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7D,eAAS,KAAK,IAAI,WAAW;AAAA,IAC/B,OAAO;AACL,YAAM,UAAU,KAAK,IAAI,GAAG,kBAAkB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;AACxE,eAAS,KAAK,IAAI,WAAW;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,KAChB,KAAK,IAAI,GAAG,KAAK;AAAA,KACjB,MAAM,IAAI,MAAM,KAAK;AAAA,IACtB,GAAG,UAAU,QAAQ,CAAC,MAAM;AAAA,MAC1B,EAAE,IAAI;AAAA,MACN,EAAE,IAAI,EAAE,QAAQ;AAAA,OACf,EAAE,IAAI,GAAG,KAAK;AAAA,OACd,EAAE,IAAI,EAAE,QAAQ,GAAG,KAAK;AAAA,IAC3B,CAAC;AAAA,EACH;AACA,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,GAAG,MAAM,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE;AAAA,IAC1E;AAAA,EACF;AACA,QAAM,YAAY;AAAA,IAChB;AAAA,IACA,EAAE,GAAG,KAAK,GAAG,GAAG,MAAM;AAAA,IACtB,EAAE,GAAG,OAAO,GAAG,MAAM;AAAA,IACrB,EAAE,GAAG,OAAO,GAAG,GAAG,EAAE;AAAA,IACpB;AAAA,EACF;AACA,SAAO,gBAAgB,WAAW,MAAM,IAAI,OAAO,OAAO,WAAW,GAAG;AAC1E;AAEA,SAAS,gBACP,WACA,MACA,IACA,OACA,OACA,WACA,KACS;AACT,MAAI,oBAAoB,WAAW,SAAS,MAAM,EAAG,QAAO;AAC5D,QAAM,SAAS,aAAa,YAAY,EAAE,MAAM;AAAA,IAC9C,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,OAAO;AAAA,IACP;AAAA,IACA,SAAS;AAAA,EACX,CAAC,EAAE;AACH,QAAM,SAAS,CAAC,MAAM,GAAG,QAAQ,EAAE;AACnC,SAAO,oBAAoB,QAAQ,SAAS,IAAI,oBAAoB,WAAW,SAAS,IACpF,SACA;AACN;AAEA,SAAS,YAAY,GAAU,KAAoB,QAAuB;AACxE,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,QAAQ,GAAG,EAAE,EAAE;AAAA,IACnC,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,IAAI,QAAQ,GAAG,EAAE,EAAE;AAAA,IACnC,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,OAAO;AAAA,IACnC,KAAK;AACH,aAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,OAAO;AAAA,EACrC;AACF;AAEA,SAAS,SACP,YACA,OACA,WACQ;AACR,MAAI,OAAO,WAAW,CAAC,KAAK;AAC5B,MAAI,WAAW;AACf,MAAI,UAAU;AACd,aAAW,KAAK,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,GAAG;AACxC,UAAM,SAAS,MAAM,CAAC;AACtB,UAAM,OAAO,oBAAoB,QAAQ,SAAS;AAClD,UAAM,MAAM,YAAY,MAAM;AAC9B,QAAI,OAAO,YAAa,SAAS,YAAY,MAAM,SAAU;AAC3D,aAAO;AACP,iBAAW;AACX,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,QAA0B,WAAoC;AACzF,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,eAAW,OAAO,WAAW;AAC3B,UAAI,2BAA2B,OAAO,CAAC,GAAI,OAAO,IAAI,CAAC,GAAI,GAAG,EAAG;AAAA,IACnE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,QAAkC;AACrD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,WAAO,KAAK,IAAI,OAAO,IAAI,CAAC,EAAG,IAAI,OAAO,CAAC,EAAG,CAAC,IAAI,KAAK,IAAI,OAAO,IAAI,CAAC,EAAG,IAAI,OAAO,CAAC,EAAG,CAAC;AAAA,EAC7F;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,GAAU,GAAU,GAAkB;AACxE,QAAM,OAAO,EAAE,GACb,OAAO,EAAE,IAAI,EAAE,OACf,OAAO,EAAE,GACT,OAAO,EAAE,IAAI,EAAE;AACjB,MAAI,EAAE,MAAM,EAAE,GAAG;AACf,QAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAM,QAAO;AACvC,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;AAAA,EAC3D;AACA,MAAI,EAAE,MAAM,EAAE,GAAG;AACf,QAAI,EAAE,KAAK,QAAQ,EAAE,KAAK,KAAM,QAAO;AACvC,WAAO,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI;AAAA,EAC3D;AACA,SAAO;AACT;AAYA,SAAS,iBACP,GACA,MACA,IACA,IACA,KACA,SACA,WACA,aACgB;AAEhB,MAAI,KAAK,SAAS,GAAG,KAAK,WAAW;AACnC,UAAM,MAAM,aAAa,IAAI;AAC7B,QAAI,IAAI,IAAI;AACV,YAAM,WAAW,YAAY,IAAI,OAAO,SAAS;AACjD,UAAI,SAAS,IAAI;AAEf,cAAM,OAAO;AACb,eAAO;AAAA,UACL,EAAE,KAAK,SAAS,OAAO,IAAI,KAAK,OAAO,CAAC,GAAG,IAAI,KAAK,OAAO,CAAC,GAAG,MAAM,EAAE,OAAO,IAAI,CAAC;AAAA,QACrF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,YAAY,IAAI,IAAI,GAAG;AAC1B,kBAAY,IAAI,IAAI;AACpB,cAAQ,KAAK,wBAAwB,IAAI,uDAAkD;AAAA,IAC7F;AAAA,EACF,WAAW,KAAK,SAAS,GAAG,KAAK,CAAC,WAAW;AAE3C,QAAI,CAAC,YAAY,IAAI,IAAI,GAAG;AAC1B,kBAAY,IAAI,IAAI;AACpB,cAAQ;AAAA,QACN,wBAAwB,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAGA,SAAO,UAAU,GAAG,MAAM,IAAI,IAAI,KAAK,OAAO;AAChD;AAKA,SAAS,UACP,GACA,MACA,IACA,IACA,KACA,SACgB;AAChB,QAAM,OAAO,KAAK,YAAY;AAC9B,QAAM,MAAsB,CAAC;AAC7B,QAAM,SAAS;AACf,MAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,SAAS,GAAG;AACvD,aAAS,IAAI,GAAG,IAAI,GAAG;AACrB,UAAI;AAAA,QACF,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,OAAO,IAAI,QAAQ,EAAE;AAAA,UAChE,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AAAA,EACJ,WACE,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,IAAI,KAClB,KAAK,SAAS,WAAW,KACzB,KAAK,SAAS,SAAS,KACvB,KAAK,SAAS,MAAM,GACpB;AACA,QAAI;AAAA,MACF,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,QAAQ,GAAG;AAAA,QACxD,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,QAAI;AAAA,MACF,EAAE;AAAA,QACA,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC;AAAA,QAC1F;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,KAAK,SAAS,OAAO,GAAG;AACjC,QAAI,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,QAAQ,SAAS,QAAQ,GAAG,CAAC;AACtF,QAAI,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,QAAQ,SAAS,QAAQ,GAAG,CAAC;AACtF,QAAI,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,GAAG,GAAG,QAAQ,SAAS,QAAQ,GAAG,CAAC;AAClF,QAAI;AAAA,MACF,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,QAAQ,EAAE;AAAA,QACxD,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF,WACE,KAAK,SAAS,UAAU,KACxB,KAAK,SAAS,OAAO,KACrB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,QAAQ,GACtB;AACA,QAAI,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,QAAQ,SAAS,QAAQ,GAAG,CAAC;AAC9E,QAAI;AAAA,MACF,EAAE;AAAA,QACA,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,QAC/G;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,QAAI;AAAA,MACF,EAAE;AAAA,QACA,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAAA,QAC3I;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AACL,QAAI;AAAA,MACF,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,QAAQ,GAAG;AAAA,QACxD,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;;;AC/rCE,IAAMC,iBAAgB,oBAAI,IAAI,CAAC,GAAG,sBAAsB,MAAM,CAAC;AAC/D,IAAM,kBAAkB,oBAAI,IAAI,CAAC,YAAY,cAAc,UAAU,UAAU,CAAC;AAChF,IAAM,iBAAiB,oBAAI,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,GAAG,CAAC;AAEhF,IAAMC,uBAAsB;AAAA,EAC1B,QAAS,EAAE,WAAW,iBAAiB,OAAO,SAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EACjG,SAAS,EAAE,WAAW,iBAAiB,OAAO,UAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EACjG,QAAS,EAAE,WAAW,iBAAiB,OAAO,SAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EACjG,SAAS,EAAE,WAAW,iBAAiB,OAAO,UAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EACjG,SAAS,EAAE,WAAW,iBAAiB,OAAO,QAAU,aAAa,SAAS,WAAW,QAAQ;AAAA,EAEjG,OAAS,EAAE,WAAW,YAAY,OAAO,SAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EAC3F,QAAS,EAAE,WAAW,YAAY,OAAO,UAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EAC3F,OAAS,EAAE,WAAW,YAAY,OAAO,SAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EAC3F,QAAS,EAAE,WAAW,YAAY,OAAO,UAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EAC3F,QAAS,EAAE,WAAW,YAAY,OAAO,QAAU,aAAa,QAAQ,WAAW,QAAQ;AAAA,EAE3F,OAAS,EAAE,WAAW,cAAc,OAAO,SAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,EAC5F,OAAS,EAAE,WAAW,cAAc,OAAO,UAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,EAC5F,OAAS,EAAE,WAAW,cAAc,OAAO,SAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,EAC5F,OAAS,EAAE,WAAW,cAAc,OAAO,UAAU,aAAa,QAAQ,WAAW,OAAO;AAAA,EAC5F,OAAS,EAAE,WAAW,cAAc,OAAO,QAAU,aAAa,QAAQ,WAAW,OAAO;AAC9F;AAEA,SAAS,uBAAuB,OAAO;AACrC,QAAM,OAAOA,qBAAoB,KAAK;AACtC,SAAO;AAAA,IACL,MAAM,KAAK,gBAAgB;AAAA,IAC3B,OAAO,KAAK,cAAc;AAAA,IAC1B,OAAO,KAAK;AAAA,IACZ,aAAa,KAAK;AAAA,IAClB,WAAW,KAAK;AAAA,EAClB;AACF;AAEA,SAASC,YAAW,OAAO;AACzB,MAAI,CAACF,eAAc,IAAI,KAAK,GAAG;AAC7B,UAAM,IAAI,MAAM,gCAAgC,KAAK,GAAG;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAO;AAC/B,MAAI,CAAC,gBAAgB,IAAI,KAAK,GAAG;AAC/B,UAAM,IAAI,MAAM,kCAAkC,KAAK,GAAG;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAO;AAC9B,QAAM,QAAQ,OAAO,KAAK,EAAE,YAAY;AACxC,MAAI,CAAC,eAAe,IAAI,KAAK,GAAG;AAC9B,UAAM,IAAI,MAAM,2BAA2B,KAAK,GAAG;AAAA,EACrD;AACA,SAAO;AACT;AAEF,SAASG,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,qBAAqB,IAAI;AAC7D,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAC3D,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,qBAAqB,CAAC,KAAK,IAAI,GAAG,MAAM,KAAK;AAC1D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,MAAM,IAAI;AAC/C,MAAI,UAAU,uBAAuB,WAAW,IAAI;AACpD,MAAI,UAAU,uBAAuB,YAAY,IAAI;AACrD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,WAAW,KAAK;AACrD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,OAAO,KAAK;AACjD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,SAAS,KAAK;AACnD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,cAAc,KAAK;AACxD,MAAI,UAAU,uBAAuB,UAAU,KAAK;AACpD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,uBAAuB,YAAY,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC1F,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK;AACrE,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,cAAc,KAAK;AACxD,MAAI,UAAU,uBAAuB,SAAS,IAAI;AAClD,MAAI,UAAU,uBAAuB,OAAO,IAAI;AAChD,MAAI,UAAU,uBAAuB,UAAU,IAAI;AACnD,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,GAAG,OAAO,KAAK;AACzF,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,mBAAmB;AAEjC,MAAI,SAAS,SAAS,IAAIC,QAAO;AAC7B,UAAM,SAAS,CAAC;AAChB,UAAM,WAAW,CAAC;AAClB,UAAM,YAAY,CAAC;AACnB,UAAMC,SAAQ,CAAC;AACf,UAAM,SAAS,CAAC;AAChB,QAAI,UAAU,YAAY;AAC1B,eAAW,KAAKD,OAAM,OAAO,OAAO,GAAG;AACrC,UAAI,EAAE,MAAM,SAAS;AACnB,eAAO,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,GAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,GAAI,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC,EAAG,CAAC;AACrK,mBAAW,EAAE;AAAI,oBAAY,EAAE;AAAA,MACjC,WAAW,EAAE,MAAM,WAAW;AAC5B,cAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,aAAa,WAAW,WAAW;AAC1E,iBAAS,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC,EAAG,CAAC;AAAA,MACzJ,WAAW,EAAE,MAAM,YAAY;AAC7B,cAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,aAAa,WAAW,WAAW;AAC1E,kBAAU,KAAK,EAAE,IAAI,EAAE,IAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,MAC1D,WAAW,EAAE,MAAM,QAAQ;AACzB,QAAAC,OAAM,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,EAAE,UAAU,WAAW,EAAE,WAAW,IAAI,EAAE,IAAI,QAAQ,EAAE,QAAQ,SAAS,EAAE,SAAS,WAAW,EAAE,WAAW,YAAY,EAAE,YAAY,OAAO,EAAE,OAAO,aAAa,EAAE,aAAa,WAAW,EAAE,WAAW,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC,GAAI,GAAI,EAAE,YAAY,SAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC,GAAI,GAAI,EAAE,aAAa,SAAY,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC,GAAI,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC,EAAG,CAAC;AAAA,MAChf,WAAW,EAAE,MAAM,SAAS;AAC1B,eAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,CAAC;AAAA,MAClD;AAAA,IACF;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,EAAG,GAAG,QAAQ,UAAU,WAAW,OAAAA,QAAO,OAAO;AAAA,EACnG;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASD,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,KAAK,IAAI,MAAM,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC3D,MAAI,SAAS,SAAS,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM;AACnD,WAAO,EAAE,GAAG,SAAS,QAAQ,IAAI,QAAQ,IAAI,MAAM,KAAK,KAAK,GAAG,OAAO,MAAM,KAAK,GAAG,SAAS,OAAO,QAAW,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC,EAAG;AAAA,EACzL;AACF,MAAI,SAAS,SAAS,KAAK,IAAI,MAAM,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC3D,MAAI,SAAS,SAAS,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM;AACnD,WAAO,EAAE,GAAG,WAAW,QAAQ,IAAI,QAAQ,IAAI,MAAM,KAAK,KAAK,GAAG,OAAO,MAAM,KAAK,GAAG,SAAS,OAAO,QAAW,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC,EAAG;AAAA,EAC3L;AACF,MAAI,SAAS,SAAS,KAAK,IAAI,GAAG;AAAE,WAAO;AAAA,EAAG;AAC9C,MAAI,SAAS,SAAS,KAAK,IAAI,KAAK;AAChC,WAAO,EAAE,GAAG,YAAY,QAAQ,IAAI,QAAQ,IAAI,SAAS,OAAO,OAAU;AAAA,EAC5E;AACF,MAAI,SAAS,SAAS,QAAQ,UAAU,OAAO,QAAQ,MAAM,MAAM;AAC/D,UAAM,QAAQ,QAAQ,CAAC;AACvB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM,OAAO;AAAA,MAAI;AAAA,MAAU,WAAW,OAAO;AAAA,MAC7C,IAAI,KAAK;AAAA,MAAI;AAAA,MAAQ,SAAS,KAAK;AAAA,MACnC,WAAW,MAAM;AAAA,MAAM,YAAY,MAAM;AAAA,MACzC,OAAO,MAAM;AAAA,MACb,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,MACjB,GAAI,MAAM,cAAc,SAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MACtE,GAAI,MAAM,YAAY,SAAY,EAAE,SAAS,MAAM,QAAQ,IAAI,CAAC;AAAA,MAChE,GAAI,MAAM,aAAa,SAAY,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;AAAA,MACnE,GAAI,MAAM,cAAc,SAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,IACxE;AAAA,EACF;AACF,MAAI,UAAU,SAAS,IAAI;AAAE,WAAO;AAAA,EAAM;AAC1C,MAAI,UAAU,SAAS,IAAI,KAAK;AAAE,WAAO,EAAE,IAAI,KAAK,QAAQ,KAAK;AAAA,EAAG;AACpE,MAAI,UAAU,SAAS,OAAO;AAC1B,QAAI,UAAU,MAAO,QAAO,EAAE,MAAM,MAAM,OAAO,OAAO,OAAO,SAAS,aAAa,SAAS,WAAW,OAAO;AAChH,QAAI,UAAU,KAAO,QAAO,EAAE,MAAM,OAAO,OAAO,OAAO,OAAO,SAAS,aAAa,QAAQ,WAAW,OAAO;AAChH,WAAO,uBAAuB,KAAK;AAAA,EACrC;AACF,MAAI,UAAU,SAAS,MAAME,QAAO,MAAM;AACtC,QAAI,uDAAuD,KAAK,IAAI,GAAG;AACrE,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AACA,UAAM,SAAS,CAAC;AAChB,QAAIA,QAAO;AACT,YAAM,IAAIA,OAAM,CAAC;AACjB,UAAI,EAAE,SAAS,OAAW,QAAO,YAAYT,YAAW,EAAE,IAAI;AAC9D,UAAI,EAAE,UAAU,OAAW,QAAO,UAAU,iBAAiB,EAAE,KAAK;AAAA,IACtE;AACA,eAAW,OAAO,MAAM;AACtB,aAAO,OAAO,QAAQ,IAAI,CAAC,CAAC;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,EAAE,WAAW,MAAM;AAAA,EAAG;AAC7D,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,EAAE,SAAS,MAAM;AAAA,EAAG;AAC3D,MAAI,UAAU,SAAS,OAAO,OAAO;AAAE,WAAO,EAAE,SAAS,OAAO,GAAG,MAAM;AAAA,EAAG;AAC5E,MAAI,UAAU,SAAS,OAAO;AAAE,WAAOA,YAAW,KAAK;AAAA,EAAG;AAC1D,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,iBAAiB,KAAK;AAAA,EAAG;AAChE,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAc;AAChD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAU;AAC5C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAY;AAC9C,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAY;AAC9C,MAAI,UAAU,SAAS,MAAM,OAAO;AAAE,WAAO,EAAE,UAAU,MAAM,WAAW,MAAM;AAAA,EAAG;AACnF,MAAI,UAAU,SAAS,MAAM;AAAE,WAAO,EAAE,UAAU,KAAK;AAAA,EAAG;AAC1D,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,SAAS,OAAO,MAAM;AAChC,UAAM,SAAS,CAAC;AAChB,WAAO,MAAM,GAAG,IAAI,MAAM;AAC1B,eAAW,KAAK,MAAM;AAAE,aAAO,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE;AAAA,IAAO;AACvD,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,KAAK,OAAO;AAAE,WAAO,EAAE,KAAK,MAAM;AAAA,EAAG;AAC5D,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO;AAAA,EAAO;AAC9C,MAAI,UAAU,SAAS,MAAMS,QAAO,MAAM;AACtC,QAAI,cAAc,KAAK,IAAI,GAAG;AAC5B,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AACA,UAAM,SAAS,CAAC;AAChB,QAAIA,QAAO;AACT,YAAM,IAAIA,OAAM,CAAC;AACjB,UAAI,EAAE,cAAc,OAAW,QAAO,YAAY,gBAAgB,EAAE,SAAS;AAAA,IAC/E;AACA,eAAW,OAAO,MAAM;AACtB,aAAO,OAAO,QAAQ,IAAI,CAAC,CAAC;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AACF,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,EAAE,WAAW,MAAM;AAAA,EAAG;AAC7D,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,gBAAgB,KAAK;AAAA,EAAG;AAC/D,MAAI,UAAU,SAAS,MAAM,MAAM,IAAI;AAAE,WAAO;AAAA,EAAI;AACpD,MAAI,UAAU,SAAS,MAAM,MAAM,MAAM;AACrC,WAAO,EAAE,GAAG,SAAS,MAAM,KAAK,YAAY,GAAG,SAAS,CAAC,MAAM,GAAG,IAAI,EAAE;AAAA,EAC1E;AACF,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASR,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASM,WAAU;AAC/C,WAAO,IAAIR,kBAAgB,SAAS,MAAM,MAAMQ,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBN,WAAU,OAAOM,WAAU;AAC3D,WAAO,IAAIR;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAM;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,cAAc;AACnB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,cAAc;AAAA,QACrB;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI;AAEJ,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,qBAAqB;AAC1B,UAAI,OAAO,YAAY;AACrB,aAAK,sBAAsB;AAC3B,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AACxB,cAAI,OAAO,YAAY;AACrB,iBAAK,kBAAkB;AACvB,gBAAI,OAAO,YAAY;AACrB,mBAAK,mBAAmB;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK;AAErE,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,SAAK,MAAM,UAAU,IAAI,WAAW;AACpC,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,qBAAK;AACL;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK;AACL,sBAAM,CAAC;AACP,sBAAM,MAAM,OAAO,WAAW;AAC9B,oBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,MAAM;AAAA,kBAAG;AAAA,gBACjD;AACA,uBAAO,QAAQ,YAAY;AACzB,sBAAI,KAAK,GAAG;AACZ,wBAAM,MAAM,OAAO,WAAW;AAC9B,sBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,MAAM;AAAA,oBAAG;AAAA,kBACjD;AAAA,gBACF;AACA,qBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,oBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,wBAAM;AACN;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,QAAQ,YAAY;AACtB,wBAAM;AACN,wBAAM,YAAY;AAClB,sBAAI,QAAQ,YAAY;AACtB,0BAAM,MAAM,OAAO,aAAa,CAAC;AACjC,wBAAI,IAAI,YAAY,MAAM,QAAQ;AAChC,qCAAe;AAAA,oBACjB,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,4BAAM,YAAY;AAClB,0BAAI,QAAQ,YAAY;AACtB,8BAAM,eAAe;AACrB,4BAAI,QAAQ,YAAY;AACtB,yCAAe;AACf,gCAAM,OAAO,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,wBAClC,OAAO;AACL,wCAAc;AACd,gCAAM;AAAA,wBACR;AAAA,sBACF,OAAO;AACL,sCAAc;AACd,8BAAM;AAAA,sBACR;AAAA,oBACF,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AAAA,kBACR;AACA,wBAAM,kBAAkB;AACxB,wBAAM,iBAAiB;AACvB,sBAAI,QAAQ,YAAY;AACtB,mCAAe;AACf,yBAAK,OAAO,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,kBACtC,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK;AAErE,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,SAAK,MAAM,UAAU,IAAI,WAAW;AACpC,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,gBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,mBAAK;AACL;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,qBAAK;AACL;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK;AACL,sBAAM,CAAC;AACP,sBAAM,MAAM,OAAO,WAAW;AAC9B,oBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,MAAM;AAAA,kBAAG;AAAA,gBACjD;AACA,uBAAO,QAAQ,YAAY;AACzB,sBAAI,KAAK,GAAG;AACZ,wBAAM,MAAM,OAAO,WAAW;AAC9B,sBAAI,OAAO,KAAK,GAAG,GAAG;AACpB;AAAA,kBACF,OAAO;AACL,0BAAM;AACN,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,MAAM;AAAA,oBAAG;AAAA,kBACjD;AAAA,gBACF;AACA,qBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,oBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,wBAAM;AACN;AAAA,gBACF,OAAO;AACL,wBAAM;AACN,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,QAAQ,YAAY;AACtB,wBAAM;AACN,wBAAM,YAAY;AAClB,sBAAI,QAAQ,YAAY;AACtB,0BAAM,MAAM,OAAO,aAAa,CAAC;AACjC,wBAAI,IAAI,YAAY,MAAM,QAAQ;AAChC,qCAAe;AAAA,oBACjB,OAAO;AACL,4BAAM;AACN,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,QAAQ,YAAY;AACtB,4BAAM,YAAY;AAClB,0BAAI,QAAQ,YAAY;AACtB,8BAAM,eAAe;AACrB,4BAAI,QAAQ,YAAY;AACtB,yCAAe;AACf,gCAAM,OAAO,IAAI,IAAI,IAAI,IAAI,GAAG;AAAA,wBAClC,OAAO;AACL,wCAAc;AACd,gCAAM;AAAA,wBACR;AAAA,sBACF,OAAO;AACL,sCAAc;AACd,8BAAM;AAAA,sBACR;AAAA,oBACF,OAAO;AACL,oCAAc;AACd,4BAAM;AAAA,oBACR;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,0BAAM;AAAA,kBACR;AACA,sBAAI,QAAQ,YAAY;AACtB,0BAAM;AAAA,kBACR;AACA,wBAAM,kBAAkB;AACxB,wBAAM,iBAAiB;AACvB,sBAAI,QAAQ,YAAY;AACtB,mCAAe;AACf,yBAAK,OAAO,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,kBACtC,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,SAAK,MAAM,UAAU,IAAI,WAAW;AACpC,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,eAAe;AACpB,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,MAAM,OAAO,aAAa,CAAC;AAChC,gBAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,mBAAK,YAAY;AACjB,kBAAI,OAAO,YAAY;AACrB,qBAAK,eAAe;AACpB,oBAAI,OAAO,YAAY;AACrB,iCAAe;AACf,uBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,gBACxB,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP;AACA,eAAK,oBAAoB;AACzB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,UACxB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK;AAEtD,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,sBAAsB;AAC3B,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,cAAc;AACnB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,wBAAwB;AAC7B,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,cAAc;AACnB,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,qBAAK;AACL;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,sBAAM,sBAAsB;AAC5B,oBAAI,QAAQ,YAAY;AACtB,wBAAM,kBAAkB;AACxB,wBAAM,iBAAiB;AACvB,sBAAI,QAAQ,YAAY;AACtB,mCAAe;AACf,yBAAK,OAAO,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG;AAAA,kBACtC,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,gBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mBAAK;AACL,6BAAe;AAAA,YACjB,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AACA,gBAAI,OAAO,YAAY;AACrB,kBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qBAAK;AACL,+BAAe;AAAA,cACjB,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,OAAO;AAAA,gBAAG;AAAA,cAClD;AACA,kBAAI,OAAO,YAAY;AACrB,oBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uBAAK;AACL,iCAAe;AAAA,gBACjB,OAAO;AACL,uBAAK;AACL,sBAAI,oBAAoB,GAAG;AAAE,6BAAS,OAAO;AAAA,kBAAG;AAAA,gBAClD;AACA,oBAAI,OAAO,YAAY;AACrB,sBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,yBAAK;AACL,mCAAe;AAAA,kBACjB,OAAO;AACL,yBAAK;AACL,wBAAI,oBAAoB,GAAG;AAAE,+BAAS,OAAO;AAAA,oBAAG;AAAA,kBAClD;AACA,sBAAI,OAAO,YAAY;AACrB,wBAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,2BAAK;AACL,qCAAe;AAAA,oBACjB,OAAO;AACL,2BAAK;AACL,0BAAI,oBAAoB,GAAG;AAAE,iCAAS,OAAO;AAAA,sBAAG;AAAA,oBAClD;AACA,wBAAI,OAAO,YAAY;AACrB,0BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,6BAAK;AACL,uCAAe;AAAA,sBACjB,OAAO;AACL,6BAAK;AACL,4BAAI,oBAAoB,GAAG;AAAE,mCAAS,OAAO;AAAA,wBAAG;AAAA,sBAClD;AACA,0BAAI,OAAO,YAAY;AACrB,4BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,+BAAK;AACL,yCAAe;AAAA,wBACjB,OAAO;AACL,+BAAK;AACL,8BAAI,oBAAoB,GAAG;AAAE,qCAAS,OAAO;AAAA,0BAAG;AAAA,wBAClD;AACA,4BAAI,OAAO,YAAY;AACrB,8BAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iCAAK;AACL,2CAAe;AAAA,0BACjB,OAAO;AACL,iCAAK;AACL,gCAAI,oBAAoB,GAAG;AAAE,uCAAS,OAAO;AAAA,4BAAG;AAAA,0BAClD;AACA,8BAAI,OAAO,YAAY;AACrB,gCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,mCAAK;AACL,6CAAe;AAAA,4BACjB,OAAO;AACL,mCAAK;AACL,kCAAI,oBAAoB,GAAG;AAAE,yCAAS,OAAO;AAAA,8BAAG;AAAA,4BAClD;AACA,gCAAI,OAAO,YAAY;AACrB,kCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,qCAAK;AACL,+CAAe;AAAA,8BACjB,OAAO;AACL,qCAAK;AACL,oCAAI,oBAAoB,GAAG;AAAE,2CAAS,OAAO;AAAA,gCAAG;AAAA,8BAClD;AACA,kCAAI,OAAO,YAAY;AACrB,oCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,uCAAK;AACL,iDAAe;AAAA,gCACjB,OAAO;AACL,uCAAK;AACL,sCAAI,oBAAoB,GAAG;AAAE,6CAAS,OAAO;AAAA,kCAAG;AAAA,gCAClD;AACA,oCAAI,OAAO,YAAY;AACrB,sCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,yCAAK;AACL,mDAAe;AAAA,kCACjB,OAAO;AACL,yCAAK;AACL,wCAAI,oBAAoB,GAAG;AAAE,+CAAS,MAAM;AAAA,oCAAG;AAAA,kCACjD;AACA,sCAAI,OAAO,YAAY;AACrB,wCAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,2CAAK;AACL,qDAAe;AAAA,oCACjB,OAAO;AACL,2CAAK;AACL,0CAAI,oBAAoB,GAAG;AAAE,iDAAS,OAAO;AAAA,sCAAG;AAAA,oCAClD;AAAA,kCACF;AAAA,gCACF;AAAA,8BACF;AAAA,4BACF;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,CAAC;AACN,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,IAAI,EAAE;AAChB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,oBAAoB;AACzB,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,IAAI,EAAE;AAChB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AACA,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,SAAK,MAAM,UAAU,IAAI,WAAW;AACpC,mBAAe;AACf,SAAK,QAAQ,IAAI,IAAI,EAAE;AAEvB,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,yBAAyB;AAC9B,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,wBAAwB;AAC7B,YAAI,OAAO,YAAY;AACrB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,kBAAkB;AACvB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,QAAQ,IAAI,EAAE;AAAA,YACrB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,2BAA2B;AAClC,QAAI,IAAI;AAER,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ;AAAA,MACf;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ;AAAA,QACf;AACA,aAAK;AACL,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,SAAS;AAC5C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ;AAAA,UACf;AACA,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,cAAc;AACnB,QAAI,OAAO,YAAY;AACrB,WAAK,cAAc;AACnB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,IAAI,EAAE;AAAA,MACrB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,cAAc;AACnB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL;AACA,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI,IAAI;AAER,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,mBAAmB;AACxB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK,WAAW;AAChB,cAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,iBAAK;AACL;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,WAAW;AAChB,iBAAK,mBAAmB;AACxB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,IAAI,IAAI,EAAE;AACpB,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,mBAAmB;AACxB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,SAAK,CAAC;AACN,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,wBAAwB;AAC7B,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC,IAAI,IAAI,EAAE;AAChB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,wBAAwB;AAC7B,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,IAAI,EAAE;AAChB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AACA,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,SAAK,MAAM,UAAU,IAAI,WAAW;AACpC,mBAAe;AACf,SAAK,QAAQ,IAAI,IAAI,EAAE;AAEvB,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,EAAE,MAAM,SAAS;AAC7C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,wBAAwB;AAC7B,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,0BAA0B;AACjC,QAAI,IAAI;AAER,SAAK;AACL,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5C,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,SAAS;AAChC,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,OAAO,aAAa,CAAC;AAChC,YAAI,GAAG,YAAY,MAAM,SAAS;AAChC,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,OAAO,aAAa,CAAC;AAChC,cAAI,GAAG,YAAY,MAAM,SAAS;AAChC,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,eAAe;AACpB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC;AACN,mBAAK;AACL,mBAAK,YAAY;AACjB,kBAAI,OAAO,YAAY;AACrB,sBAAM,eAAe;AACrB,oBAAI,QAAQ,YAAY;AACtB,iCAAe;AACf,uBAAK,QAAQ,IAAI,IAAI,GAAG;AAAA,gBAC1B,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AACA,kBAAI,OAAO,YAAY;AACrB,uBAAO,OAAO,YAAY;AACxB,qBAAG,KAAK,EAAE;AACV,uBAAK;AACL,uBAAK,YAAY;AACjB,sBAAI,OAAO,YAAY;AACrB,0BAAM,eAAe;AACrB,wBAAI,QAAQ,YAAY;AACtB,qCAAe;AACf,2BAAK,QAAQ,IAAI,IAAI,GAAG;AAAA,oBAC1B,OAAO;AACL,oCAAc;AACd,2BAAK;AAAA,oBACP;AAAA,kBACF,OAAO;AACL,kCAAc;AACd,yBAAK;AAAA,kBACP;AAAA,gBACF;AAAA,cACF,OAAO;AACL,qBAAK;AAAA,cACP;AACA,kBAAI,OAAO,YAAY;AACrB,qBAAK,oBAAoB;AACzB,qBAAK,iBAAiB;AACtB,oBAAI,OAAO,YAAY;AACrB,iCAAe;AACf,uBAAK,QAAQ,IAAI,IAAI,EAAE;AAAA,gBACzB,OAAO;AACL,gCAAc;AACd,uBAAK;AAAA,gBACP;AAAA,cACF,OAAO;AACL,8BAAc;AACd,qBAAK;AAAA,cACP;AAAA,YACF,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI;AAEJ,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,SAAK,MAAM,UAAU,IAAI,WAAW;AAEpC,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AC3hFO,IAAM,eAAoD;AAAA,EAC/D,aAAa,OAAqC;AAChD,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAAqC;AAC7C,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAA0B,OAAsB,SAAuC;AAC5F,WAAO,mBAAmB,IAAI,OAAO,OAAO;AAAA,EAC9C;AACF;;;ACRA,IAAM,eAAe;AAEd,SAAS,aAAa,IAAoB,OAAoC;AACnF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AAEvB,QAAM,SAAS,CAAC,GAAG,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAC9D,QAAM,SAAS,KAAK,IAAI,GAAG,GAAG,OAAO,IAAI,CAACC,OAAMA,GAAE,GAAG,CAAC;AACtD,QAAM,UAAU,KAAK,MAAM,SAAS,YAAY,IAAI;AAEpD,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,SAAS;AACf,QAAM,UAAU,WAAW;AAC3B,QAAM,YAAY,WAAW;AAE7B,QAAM,QAAQ,GAAG,SAAS;AAC1B,QAAM,SAAS,QAAQ,WAAW,gBAAgB,KAAK;AACvD,QAAM,WAAW;AACjB,QAAM,UAAU,SAAS,SAAS;AAElC,QAAM,WAA2B,CAAC;AAClC,MAAI;AACF,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAGF,QAAM,cAAgC;AAAA,IACpC,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAEA,QAAM,SAAS,CAAC,MAAsB,UAAU,KAAK,OAAO;AAG5D,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAChC,aAAS,IAAI,GAAG,KAAK,cAAc,KAAK,GAAG;AACzC,YAAM,MAAM,IAAI,eAAe;AAC/B,YAAM,IAAI,WAAW,IAAI;AACzB,UAAI,IAAI;AACN,iBAAS;AAAA,UACP,EAAE,KAAK,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,QAAQ,SAAS;AAAA,QAChF;AAAA,IACJ;AAAA,EACF;AAGA,SAAO,QAAQ,CAACA,IAAG,MAAM;AACvB,UAAM,SAAS,YAAY,IAAI,YAAY,MAAM;AACjD,UAAM,OAAO,OAAO,QAAQ,QAAQ,YAAY,GAAG;AACnD,UAAM,aAAa,aAAa,MAAM,KAAK;AAC3C,aAAS,IAAI,KAAK,MAAMA,GAAE,QAAQ,YAAY,GAAG,KAAK,KAAK,MAAMA,GAAE,MAAM,YAAY,GAAG,KAAK;AAC3F,YAAM,cAAc,IAAI;AACxB,YAAM,SAAS,KAAK,IAAIA,GAAE,OAAO,WAAW,IAAI;AAChD,YAAM,OAAO,KAAK,IAAIA,GAAE,KAAK,cAAc,eAAe,CAAC,IAAI;AAC/D,YAAM,IAAI,WAAW,SAAS;AAC9B,YAAM,KAAK,OAAO,SAAS,KAAK;AAChC,YAAM,IAAI,OAAO,CAAC;AAClB,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,QAAQ,KAAK,GAAG,MAAM,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC;AAAA,MAC5F;AAGA;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAA,GAAE;AAAA,QACF;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,OAAO;AAAA,MACT;AAEA,eAAS;AAAA,QACP,EAAE,KAAK,OAAOA,GAAE,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC,GAAG,SAAS,QAAQ,SAAS;AAAA,MACtF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,SAAS,OAAO,WAAW,eAAe,OAAO,MAAM;AAC7D,QAAM,SAAS,OAAO,OAAO,UAAU,CAAC,IAAI,OAAO,MAAM;AAEzD,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,CAAC,EAAE;AAC9B;AAQA,IAAM,iBAAiB;AAEvB,SAAS,gBACP,GACA,UACA,GACA,GACA,GACA,OACA,MACA,UACA,OACA,YACA,SACM;AACN,QAAM,KAAK,IAAI,IAAI;AACnB,QAAM,OAAO;AAGb,MAAI,YAAY,MAAM,QAAQ,EAAE,SAAS,IAAI,MAAM;AACjD,aAAS;AAAA,MACP,EAAE,KAAK,MAAM,OAAO,EAAE,GAAG,IAAI,IAAI,QAAQ,IAAI,WAAW,IAAI,GAAG,UAAU,OAAO;AAAA,QAC9E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA;AAAA,EACF;AAGA,MAAI,KAAK,SAAS;AAChB,UAAM,SAAS,QAAQ,aAAa;AACpC,UAAM,KAAK,IAAI,aAAa,SAAS;AACrC,QAAIA,KAAI;AACR,WAAOA,KAAI,kBAAkB,YAAY,MAAMA,EAAC,EAAE,QAAQ,OAAQ,CAAAA,MAAK;AACvE,UAAMC,SAAQ,YAAY,MAAMD,EAAC,EAAE,QAAQ,SAAS,aAAa,MAAMA,IAAG,MAAM,IAAI;AACpF,UAAM,KAAK,OAAO,EAAE,GAClB,KAAK,IAAI,EAAE;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,CAAC,EAAE,KAAKC,QAAO,IAAI,IAAI,KAAKD,KAAI,IAAI,GAAGA,IAAG,OAAO,EAAE,QAAQ,QAAQ,QAAQ,SAAS,CAAC,CAAC;AAAA,QACtF,EAAE,WAAW,cAAc,EAAE,IAAI,EAAE,IAAI;AAAA,MACzC;AAAA,IACF;AACA;AAAA,EACF;AAGA,MAAIA,KAAI;AACR,SAAOA,KAAI,kBAAkB,YAAY,MAAMA,EAAC,EAAE,QAAQ,IAAI,KAAM,CAAAA,MAAK;AACzE,QAAM,QAAQ,YAAY,MAAMA,EAAC,EAAE,QAAQ,IAAI,OAAO,aAAa,MAAMA,IAAG,IAAI,IAAI,IAAI;AACxF,WAAS;AAAA,IACP,EAAE,KAAK,OAAO,OAAO,EAAE,GAAG,IAAI,IAAI,QAAQ,IAAIA,KAAI,IAAI,GAAGA,IAAG,OAAO;AAAA,MACjE,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF;AAMA,SAASE,UAAS,GAA2C;AAC3D,QAAM,IAAI,EAAE,KAAK;AACjB,QAAM,KAAK,EAAE,MAAM,oCAAoC;AACvD,MAAI;AACF,WAAO;AAAA,MACL,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,MAC5B,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,MAC5B,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,IAC9B;AACF,QAAM,KAAK,EAAE,MAAM,6CAA6C;AAChE,MAAI,GAAI,QAAO,CAAC,SAAS,GAAG,CAAC,GAAI,EAAE,GAAG,SAAS,GAAG,CAAC,GAAI,EAAE,GAAG,SAAS,GAAG,CAAC,GAAI,EAAE,CAAC;AAChF,SAAO;AACT;AAEA,SAAS,MAAM,GAAmB;AAChC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAC5C,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB;AAEA,SAAS,OAAO,GAAU,GAAU,GAAkB;AACpD,QAAM,KAAKA,UAAS,CAAC,GACnB,KAAKA,UAAS,CAAC;AACjB,MAAI,CAAC,MAAM,CAAC,GAAI,QAAO;AACvB,SAAO,IAAI,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;AACzH;;;ACtNA,SAASC,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,UAAU,kBAAkB;AAC3D,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,eAAe,IAAI;AACvD,MAAI,SAAS,uBAAuB,UAAU,IAAI;AAClD,MAAI,SAAS,uBAAuB,SAAS,IAAI;AACjD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,SAAS,uBAAuB,KAAM,KAAK;AAC/C,MAAI,SAAS,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,KAAK,KAAK;AAC9C,MAAI,UAAU,qBAAqB,CAAC,GAAG,GAAG,MAAM,KAAK;AACrD,MAAI,UAAU,qBAAqB,CAAC,MAAM,IAAI,GAAG,MAAM,KAAK;AAC5D,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,MAAM,KAAK;AAChD,MAAI,UAAU,uBAAuB,QAAQ,KAAK;AAClD,MAAI,UAAU,qBAAqB,CAAC,MAAM,IAAI,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,mBAAmB;AACjC,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAE5D,MAAI,SAAS,SAAS,IAAI,OAAO;AAC7B,QAAI;AACJ,UAAM,SAAS,CAAC;AAChB,eAAW,KAAK,MAAM,OAAO,OAAO,GAAG;AACrC,UAAI,EAAE,MAAM,QAAS,SAAQ,EAAE;AAAA,eACtB,EAAE,MAAM,SAAS;AACxB,cAAM,OAAO,KAAK,IAAI,EAAE,OAAO,EAAE,GAAG;AACpC,cAAM,OAAO,KAAK,IAAI,EAAE,OAAO,EAAE,GAAG;AACpC,eAAO,KAAK,EAAE,OAAO,MAAM,KAAK,MAAM,OAAO,EAAE,MAAM,CAAC;AAAA,MACxD;AAAA,IACF;AACA,WAAO,EAAE,SAAS,OAAO,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG,GAAG,OAAO;AAAA,EAC5F;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASC,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE;AAAA,EAAG;AAC/D,MAAI,SAAS,SAAS,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC5C,MAAI,SAAS,SAAS,OAAO,KAAK,OAAO;AACrC,WAAO,EAAE,GAAG,SAAS,OAAO,KAAK,OAAO,OAAO,MAAM,OAAO,MAAM;AAAA,EACpE;AACF,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC5C,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC5C,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC5C,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,SAAS,GAAG,EAAE;AAAA,EAAG;AACnD,MAAI,UAAU,WAAW;AAAE,WAAO;AAAA,EAAM;AACxC,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,kBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,CAAC;AACN,SAAK,mBAAmB;AACxB,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,mBAAmB;AAAA,IAC1B;AACA,SAAK,WAAW;AAChB,SAAK,sBAAsB;AAC3B,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,mBAAmB;AACxB,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,mBAAmB;AAAA,QAC1B;AACA,aAAK,WAAW;AAChB,uBAAe;AACf,aAAK,OAAO,IAAI,EAAE;AAAA,MACpB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI;AAEJ,SAAK,MAAM,OAAO,aAAa,EAAE;AACjC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,aAAa,CAAC;AAChC,UAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI;AAEJ,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,MAAM,OAAO,aAAa,CAAC;AAChC,QAAI,GAAG,YAAY,MAAM,QAAQ;AAC/B,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,oBAAoB;AACzB,UAAI,OAAO,YAAY;AACrB,aAAK,iBAAiB;AACtB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExC,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,aAAa;AAClB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,aAAa;AAClB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,gBAAgB;AACrB,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,iBAAiB;AACtB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,IAAI,IAAI,EAAE;AAAA,UACxB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO,EAAE;AAAA,MAChB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AACA,aAAK,MAAM,UAAU,IAAI,WAAW;AACpC,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB;AACA,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO,EAAE;AAAA,IAChB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,sBAAsB;AAC7B,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ;AAAA,IACf,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI;AAEJ,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK,iBAAiB;AACtB,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,YAAY;AACjB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL;AACA,UAAI,MAAM,SAAS,aAAa;AAC9B,aAAK,MAAM,OAAO,WAAW;AAC7B;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,IAAI,EAAE;AAChB,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;AC/qCO,IAAM,SAAwC;AAAA,EACnD,aAAa,OAA+B;AAC1C,WAAcG,YAAM,KAAK;AAAA,EAC3B;AAAA,EAEA,UAAU,OAA+B;AACvC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAoB,OAAoC;AAC7D,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACF;;;ACwBO,SAAS,WAAW,OAAiC,UAAuB,CAAC,GAAe;AACjG,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,aAAa,cAAc;AAEjC,MAAI,MAAM,WAAW,EAAG,QAAO,EAAE,OAAO,oBAAI,IAAI,GAAG,OAAO,SAAS,GAAG,QAAQ,SAAS,EAAE;AAEzF,QAAM,OAAO,IAAI,IAA2B,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACvE,QAAM,UAAU,CAAC,MAA8B,aAAa,EAAE,SAAS,EAAE;AACzE,QAAM,UAAU,CAAC,MAA8B,aAAa,EAAE,QAAQ,EAAE;AAGxE,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,KAAK,MAAO,YAAW,KAAK,EAAE,SAAU,UAAS,IAAI,CAAC;AACjE,QAAM,QAAQ,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;AAGrD,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAMC,SAAkB,MAAM,IAAI,CAAC,MAAM;AACvC,UAAM,IAAI,EAAE,IAAI,CAAC;AACjB,WAAO,EAAE;AAAA,EACX,CAAC;AACD,WAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,KAAK;AACrC,UAAM,KAAKA,OAAM,CAAC;AAClB,UAAM,IAAI,MAAM,IAAI,EAAE;AACtB,eAAW,KAAK,KAAK,IAAI,EAAE,EAAG,UAAU;AACtC,UAAI,CAAC,MAAM,IAAI,CAAC,GAAG;AACjB,cAAM,IAAI,GAAG,IAAI,CAAC;AAClB,QAAAA,OAAM,KAAK,CAAC;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,QAAMC,YAAW,KAAK,IAAI,GAAG,MAAM,OAAO,CAAC;AAG3C,QAAM,aAAa,MAAM,KAAK,EAAE,QAAQA,YAAW,EAAE,GAAG,MAAM,CAAC;AAC/D,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,MAAM,IAAI,EAAE,EAAE;AACxB,eAAW,CAAC,IAAI,KAAK,IAAI,WAAW,CAAC,GAAI,QAAQ,CAAC,CAAC;AAAA,EACrD;AACA,QAAM,aAAuB,CAAC;AAC9B,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,KAAKA,WAAU,KAAK;AAClC,eAAW,CAAC,IAAI;AAChB,WAAO,WAAW,CAAC,IAAK;AAAA,EAC1B;AACA,QAAM,aAAa,MAAM,WAAW;AAGpC,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,eAAe,CAAC,OAAuB;AAC3C,UAAM,SAAS,SAAS,IAAI,EAAE;AAC9B,QAAI,WAAW,OAAW,QAAO;AACjC,UAAM,OAAO,KAAK,IAAI,EAAE;AACxB,QAAI,MAAM,QAAQ,IAAI;AACtB,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,YAAM,gBAAgB,KAAK,SAAS;AAAA,QAClC,CAAC,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC,KAAK,IAAI,IAAI,aAAa;AAAA,QACzD;AAAA,MACF;AACA,YAAM,KAAK,IAAI,KAAK,aAAa;AAAA,IACnC;AACA,aAAS,IAAI,IAAI,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,oBAAI,IAAoB;AACzC,QAAM,SAAS,CAAC,IAAY,OAAqB;AAC/C,UAAM,OAAO,KAAK,IAAI,EAAE;AACxB,UAAM,KAAK,aAAa,EAAE;AAC1B,UAAM,SAAS,KAAK,KAAK;AACzB,aAAS,IAAI,IAAI,SAAS,QAAQ,IAAI,IAAI,CAAC;AAC3C,QAAI,KAAK,SAAS,WAAW,EAAG;AAChC,UAAM,gBAAgB,KAAK,SAAS;AAAA,MAClC,CAAC,GAAG,GAAG,MAAM,IAAI,aAAa,CAAC,KAAK,IAAI,IAAI,aAAa;AAAA,MACzD;AAAA,IACF;AACA,QAAIC,UAAS,MAAM,KAAK,iBAAiB;AACzC,eAAW,KAAK,KAAK,UAAU;AAC7B,aAAO,GAAGA,OAAM;AAChB,MAAAA,WAAU,aAAa,CAAC,IAAI;AAAA,IAC9B;AAAA,EACF;AAGA,MAAI,SAAS;AACb,aAAW,KAAK,OAAO;AACrB,WAAO,EAAE,IAAI,MAAM;AACnB,cAAU,aAAa,EAAE,EAAE,IAAI;AAAA,EACjC;AACA,QAAM,aAAa,SAAS,aAAa;AAEzC,QAAM,QAAQ,oBAAI,IAAqB;AACvC,aAAW,KAAK,OAAO;AACrB,UAAM,IAAI,MAAM,IAAI,EAAE,EAAE;AACxB,UAAM,IAAI,SAAS,IAAI,EAAE,EAAE;AAC3B,UAAM,IAAI,WAAW,CAAC,KAAM,WAAW,CAAC,IAAK,QAAQ,CAAC,KAAK;AAC3D,UAAM,IAAI,aAAa,IAAI;AAC3B,UAAM,IAAI,aAAa,IAAI;AAC3B,UAAM,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,EACtE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO,aAAa,aAAa;AAAA,IACjC,QAAQ,aAAa,aAAa;AAAA,EACpC;AACF;;;AC9HA,IAAM,SAAS;AAUf,SAAS,WAAW,OAAe,MAAgD;AACjF,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,IAAI,CAAC,SAAS;AAAA,IACb;AAAA,IACA,OAAO,KAAK,IAAI,YAAY,KAAK,IAAI,EAAE,QAAQ,IAAI,EAAE;AAAA,EACvD,EAAE;AACN;AAEA,SAASC,UAAS,GAA2C;AAC3D,QAAM,IAAI,EAAE,KAAK;AACjB,QAAM,KAAK,EAAE,MAAM,oCAAoC;AACvD,MAAI;AACF,WAAO;AAAA,MACL,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,MAC5B,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,MAC5B,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,IAC9B;AACF,QAAM,KAAK,EAAE,MAAM,6CAA6C;AAChE,MAAI,GAAI,QAAO,CAAC,SAAS,GAAG,CAAC,GAAI,EAAE,GAAG,SAAS,GAAG,CAAC,GAAI,EAAE,GAAG,SAAS,GAAG,CAAC,GAAI,EAAE,CAAC;AAChF,SAAO;AACT;AAEA,SAASC,OAAM,GAAmB;AAChC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAC5C,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB;AAEA,SAASC,QAAO,GAAU,GAAU,GAAkB;AACpD,QAAM,KAAKF,UAAS,CAAC,GACnB,KAAKA,UAAS,CAAC;AACjB,MAAI,CAAC,MAAM,CAAC,GAAI,QAAO;AACvB,QAAM,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK;AACpC,QAAM,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK;AACpC,QAAM,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK;AACrC,SAAO,IAAIC,OAAM,CAAC,CAAC,GAAGA,OAAM,CAAC,CAAC,GAAGA,OAAM,EAAE,CAAC;AAC5C;AAEA,SAAS,YAAY,OAA6B;AAChD,SAAOD,UAAS,MAAM,QAAQ,UAAU,IAAI,MAAM,QAAQ,aAAa,MAAM,QAAQ;AACvF;AAEA,SAASG,aAAY,OAA+B;AAClD,QAAM,MACJ,kBAAkB,MAAM,QAAQ,UAAU,KAAK,kBAAkB,MAAM,QAAQ,OAAO;AACxF,SAAO,QAAQ,SAAY,MAAM,MAAM;AACzC;AAEA,SAASC,cAAa,MAAa,OAA6B;AAC9D,QAAM,SAAS;AAAA,IACb;AAAA,IACA,CAAC,MAAM,QAAQ,MAAM,MAAM,QAAQ,UAAU;AAAA,IAC7C,MAAM,QAAQ;AAAA,EAChB;AACA,MAAI,cAAc,QAAQ,IAAI,KAAK,IAAK,QAAO;AAC/C,SAAO,aAAa,MAAM,CAAC,WAAW,SAAS,GAAG,MAAM;AAC1D;AAEA,SAAS,cAAc,MAAa,OAA6B;AAC/D,QAAM,SAAS,YAAY,KAAK;AAChC,QAAM,aAAa;AAAA,IACjB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,EAChB;AACA,MAAI,OAAO,MAAM,QAAQ,MACvB,QAAQ;AACV,aAAW,KAAK,YAAY;AAC1B,QAAI,CAACJ,UAAS,CAAC,EAAG;AAClB,UAAM,OACJ,KAAK,IAAI,cAAc,GAAG,IAAI,GAAG,cAAc,GAAG,MAAM,CAAC,IAAI,cAAc,GAAG,MAAM,IAAI;AAC1F,QAAI,OAAO,OAAO;AAChB,aAAO;AACP,cAAQ;AAAA,IACV;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,GAAmB;AACnC,QAAM,MAAMA,UAAS,CAAC;AACtB,SAAO,QAAQ,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,QAAQ,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;AACrE;AAEA,SAAS,YAAY,OAA6B;AAChD,QAAM,EAAE,QAAQ,IAAI;AACpB,MAAI,SAAS,QAAQ,KAAK,EAAG,QAAOE,QAAO,QAAQ,QAAQ,OAAOC,aAAY,KAAK,IAAI,MAAM,GAAG;AAChG,SAAOD,QAAO,QAAQ,QAAQ,MAAMC,aAAY,KAAK,IAAI,OAAO,IAAI;AACtE;AAEA,SAAS,cAAc,OAA6B;AAClD,QAAM,EAAE,QAAQ,IAAI;AACpB,MAAI,CAACA,aAAY,KAAK,EAAG,QAAOD,QAAO,QAAQ,MAAM,QAAQ,YAAY,IAAI;AAE7E,QAAM,SAAS,YAAY,KAAK;AAChC,aAAW,UAAU,CAAC,QAAQ,MAAM,QAAQ,SAAS,QAAQ,QAAQ,SAAS,GAAG;AAC/E,eAAW,KAAK,CAAC,MAAM,MAAM,KAAK,IAAI,GAAG;AACvC,YAAM,OAAOA,QAAO,QAAQ,QAAQ,CAAC;AACrC,YAAM,MAAM,kBAAkB,IAAI;AAClC,UAAI,QAAQ,UAAa,MAAM,QAAQ,cAAc,MAAM,MAAM,KAAK,IAAK,QAAO;AAAA,IACpF;AAAA,EACF;AACA,SAAOA,QAAO,QAAQ,WAAW,IAAI;AACvC;AAEA,SAAS,UAAU,OAA0B,OAAiC;AAC5E,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,MAAM,CAAC,MAAuB,MAAM,SAAS,CAAC;AACpD,QAAM,QAA4B,IAAI,OAAO,IACzC,UACA,IAAI,MAAM,KAAK,IAAI,MAAM,IACvB,SACA,IAAI,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK,IACtD,WACA;AACR,MAAI,IAAI,KAAK,GAAG;AACd,UAAMG,QAAO,YAAY,KAAK;AAC9B,WAAO,EAAE,OAAO,MAAAA,OAAM,QAAQ,cAAcA,OAAM,KAAK,GAAG,MAAMD,cAAaC,OAAM,KAAK,EAAE;AAAA,EAC5F;AACA,MAAI,IAAI,OAAO,GAAG;AAChB,UAAMA,QAAO,cAAc,KAAK;AAChC,WAAO,EAAE,OAAO,MAAAA,OAAM,QAAQ,cAAcA,OAAM,KAAK,GAAG,MAAMD,cAAaC,OAAM,KAAK,EAAE;AAAA,EAC5F;AACA,MAAI,IAAI,QAAQ,KAAK,IAAI,SAAS,KAAK,IAAI,OAAO;AAChD,WAAO;AAAA,MACL;AAAA,MACA,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,MAChB,MAAMD,cAAa,QAAQ,SAAS,KAAK;AAAA,IAC3C;AACF,MAAI,IAAI,MAAM;AACZ,WAAO,EAAE,OAAO,MAAM,QAAQ,SAAS,QAAQ,QAAQ,SAAS,MAAM,QAAQ,KAAK;AACrF,MAAI,IAAI,MAAM;AACZ,WAAO,EAAE,OAAO,MAAM,QAAQ,SAAS,QAAQ,QAAQ,WAAW,MAAM,QAAQ,KAAK;AACvF,MAAI,IAAI,OAAO,KAAK,IAAI,OAAO;AAC7B,WAAO,EAAE,OAAO,MAAM,QAAQ,SAAS,QAAQ,QAAQ,WAAW,MAAM,QAAQ,KAAK;AACvF,QAAM,OAAO,QAAQ;AACrB,SAAO,EAAE,OAAO,MAAM,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,KAAK;AACnE;AAGA,SAAS,SAAS,MAAoC;AACpD,SAAO,KAAK;AACd;AAEA,SAAS,WAAW,OAAe,OAA6B;AAC9D,QAAM,IAAI,OAAO,KAAK;AACtB,MAAI,CAAC,OAAO,MAAM,CAAC,GAAG;AACpB,QAAI,MAAM,EAAG,QAAO,MAAM,QAAQ;AAClC,QAAI,KAAK,IAAI,CAAC,MAAM,EAAG,QAAO,MAAM,QAAQ;AAC5C,WAAO,MAAM,QAAQ;AAAA,EACvB;AACA,SAAO,MAAM,QAAQ;AACvB;AAEO,SAAS,WAAW,IAAkB,OAAoC;AAC/E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,MAAI,GAAG,MAAM,WAAW,GAAG;AACzB,UAAME,SAAe;AAAA,MACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG;AAAA,MAC9C,YAAY,QAAQ;AAAA,MACpB,UAAU,CAAC;AAAA,IACb;AACA,WAAO,EAAE,OAAAA,QAAO,SAAS,CAAC,EAAE;AAAA,EAC9B;AAGA,QAAM,QAAQ,oBAAI,IAAuB;AACzC,QAAM,QAAQ,oBAAI,IAA+C;AACjE,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,KAAK,UAAU,KAAK,OAAO,KAAK;AACtC,UAAM,IAAI,KAAK,IAAI,EAAE;AACrB,UAAM,OAAO,SAAS,IAAI;AAC1B,UAAM,SAAS,YAAY,KAAK,OAAO,IAAI,EAAE;AAC7C,UAAM,QAAQ,OAAO,YAAY,MAAM,SAAS,EAAE,QAAQ;AAC1D,UAAM,WAAW,KAAK,IAAI,QAAQ,KAAK;AACvC,QAAI,GAAG,UAAU,SAAS;AACxB,YAAM,QAAQ,WAAW,KAAK,OAAO,IAAI,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC;AAC1E,YAAM,IAAI,KAAK,IAAI,EAAE,OAAO,QAAQ,OAAO,GAAG,CAAC;AAAA,IACjD,WAAW,GAAG,UAAU,UAAU;AAChC,YAAM,OAAO,OACT,KAAK,IAAI,WAAW,IAAI,OAAO,YAAY,IAAI,EAAE,IACjD,KAAK,IAAI,WAAW,IAAI,OAAO,IAAI,EAAE;AACzC,YAAM,IAAI,KAAK,IAAI,EAAE,OAAO,MAAM,QAAQ,KAAK,CAAC;AAAA,IAClD,OAAO;AACL,YAAM,QAAQ,WAAW;AACzB,YAAM,SAAS,OAAO,OAAO,YAAY,KAAK,OAAO;AACrD,YAAM,IAAI,KAAK,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,QAAM,YACJ,GAAG,SAAS,SAAS,MAAM,QAC3B,GAAG,SAAS,QAAQ,MAAM,aAC1B,OAAO,GAAG,SAAS,SAAS,CAAC,MAAM;AAErC,QAAM,SAA0B,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IACnD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACxB,QAAQ,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACzB,UAAU,EAAE;AAAA,EACd,EAAE;AACF,QAAM,SAAS,WAAW,QAAQ;AAAA,IAChC,WAAW,GAAG;AAAA,IACd,UAAU,YAAY,KAAK;AAAA,IAC3B,YAAY,YAAY,KAAK;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,QAAM,YAAY,GAAG,SAAS,OAAO,IAAI,OAAO,GAAG,SAAS,OAAO,CAAC,IAAI;AACxE,QAAM,SAAS,YAAY,YAAY,WAAW,WAAW,aAAa,EAAE,QAAQ;AACpF,QAAM,SAAS,YAAY,WAAW,gBAAgB,KAAK;AAC3D,QAAM,MAAM,CAAC,OAAe;AAC1B,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE;AAC7B,WAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,EACrE;AAEA,QAAM,WAA2B,CAAC;AAClC,MAAI,WAAW;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,OAAO,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnD,QAAM,gBAAgB,IAAI,KAAa,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAGzF,QAAM,YAAY,oBAAI,IAAgE;AACtF,aAAW,QAAQ,GAAG,OAAO;AAC3B,SAAK,SAAS,QAAQ,CAAC,KAAK,QAAQ;AAClC,gBAAU,IAAI,KAAK,EAAE,UAAU,KAAK,IAAI,OAAO,KAAK,OAAO,KAAK,SAAS,OAAO,CAAC;AAAA,IACnF,CAAC;AAAA,EACH;AAGA,WAAS,aACP,QACA,QACA,KACA,MAC0B;AAC1B,WAAO,EAAE,GAAG,IAAI,OAAO,IAAI,OAAO,SAAS,IAAI,CAAC,GAAG,GAAG,IAAI,OAAO,IAAI,OAAO,SAAS,IAAI,CAAC,EAAE;AAAA,EAC9F;AAEA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,KAAK,IAAI,KAAK,EAAE;AACtB,UAAM,cAAc,MAAM,IAAI,KAAK,EAAE,EAAG;AACxC,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,KAAK,IAAI,GAAG;AAClB,YAAM,aAAa,MAAM,IAAI,GAAG,EAAG;AAGnC,YAAM,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,EAAE;AAC7D,YAAM,KAAK,EAAE,GAAG,GAAG,IAAI,GAAG,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,EAAE;AAC7D,YAAM,KAAK,GAAG,IAAI,GAAG,GACnB,KAAK,GAAG,IAAI,GAAG;AACjB,YAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAC7B,YAAM,MAAM,MAAM,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,KAAK,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE;AAGlE,YAAM,EAAE,OAAO,UAAU,KAAK,OAAO,IAAI,aAAa,IAAI,EAAE;AAE5D,YAAM,QAAQ,gBAAgB,WAAW,aAAa,IAAI,GAAG,QAAQ,GAAG,KAAK,CAAC,IAAI;AAClF,YAAM,MAAM,eAAe,WAAW,aAAa,IAAI,GAAG,QAAQ,GAAG,KAAK,EAAE,IAAI;AAEhF,YAAM,WAAW,cAAc,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,EAAE;AACtD,YAAM,YAAY,WAAW,QAAQ,UAAU,QAAQ;AACvD,YAAM,YAAY,WAAW,MAAM;AACnC,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,UAC/D;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,YAAM,QAAQ,KAAK,IAAI,GAAG;AAC1B,UAAI,MAAM,WAAW;AACnB,cAAM,MAAM,MAAM,IAAI,IAAI,KAAK,GAC7B,MAAM,MAAM,IAAI,IAAI,KAAK;AAC3B,cAAM,WAAW,MAAM,OAAO,iBAAiB;AAC/C,cAAM,IAAI,YAAY,MAAM,WAAW,QAAQ,EAAE,QAAQ;AACzD,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,EAAE,GAAG,KAAK,IAAI,GAAG,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG;AAAA,YACjD,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR;AAAA,YACA,EAAE,IAAI,EAAE;AAAA,UACV;AAAA,QACF;AACA,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA,KAAK;AAAA,YACL;AAAA,YACA,WAAW,QAAQ,UAAU,QAAQ;AAAA,YACrC,EAAE,QAAQ,SAAS;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AACrB,UAAM,KAAK,MAAM,IAAI,KAAK,EAAE;AAC5B,UAAM,OAAO,SAAS,IAAI;AAC1B,UAAM,KAAK,EAAE,IAAI,EAAE,QAAQ,GACzB,KAAK,EAAE,IAAI,EAAE,SAAS;AACxB,UAAM,SAAS,KAAK,MAAM,SAAS,MAAM,KAAK,KAAK,MAAM,SAAS,MAAM;AACxE,UAAM,KAAK,SACN,MAAM,OAAO,KAAK,eAAe,MACjC,MAAM,OAAO,SAAS,eAAe;AAE1C,QAAI,GAAG,UAAU,SAAS;AACxB,eAAS;AAAA,QACP,EAAE,KAAK,GAAG,GAAG,MAAM,GAAG,QAAQ,IAAI;AAAA,UAChC,IAAI,MAAM,OAAO,SAAS,gBAAgB;AAAA,QAC5C,CAAC;AAAA,MACH;AACA,UAAI,KAAK,EAAE;AACX,iBAAW,KAAK,OAAO,IAAI,EAAE,QAAQ,CAAC,MAAM,QAAQ;AAClD,YAAI,MAAM;AACR,mBAAS;AAAA,YACP,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;AAAA,UACrF;AACF,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK;AAAA,YACL,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,YACvB,IAAI,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO,IAAI;AAAA,YACpC;AAAA,YACA,GAAG;AAAA,YACH,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,UACrC;AAAA,QACF;AACA,cAAM,KAAK;AAAA,MACb,CAAC;AAAA,IACH,WAAW,GAAG,UAAU,UAAU;AAChC,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,QAAQ,GAAG,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC;AAAA,IAC/E,OAAO;AACL,YAAM,KACJ,GAAG,UAAU,SACR,MAAM,OAAO,KAAK,gBAAgB,EAAE,SAAS,IAC7C,MAAM,OAAO,SAAS,gBAAgB;AAC7C,eAAS,KAAK,EAAE,KAAK,GAAG,GAAG,MAAM,GAAG,QAAQ,IAAI,EAAE,GAAG,CAAC,CAAC;AAAA,IACzD;AAEA,UAAM,aAAa,SAAS,WAAW;AACvC,QAAI,GAAG,UAAU,SAAS;AACxB,UAAI,MAAM;AACR,cAAM,SAAS;AACf,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,OAAO,IAAI,IAAI,EAAE,IAAI,SAAS,OAAO,IAAI,GAAG,MAAM,GAAG,MAAM;AAAA,YACrE,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,iBAAS;AAAA,UACP,EAAE;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI,EAAE,IAAI,SAAS,OAAO,IAAI,YAAY,IAAI;AAAA,YAC9C;AAAA,YACA,GAAG,SAAS,QAAQ,UAAU,QAAQ,YAAY,GAAG;AAAA,YACrD,EAAE,QAAQ,SAAS;AAAA,UACrB;AAAA,QACF;AAAA,MACF,OAAO;AACL,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,MAAM,GAAG,MAAM;AAAA,YAC3D,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,UAAU,QAAW;AAC5B,YAAM,KAAK,WAAW,KAAK,OAAO,KAAK;AACvC,YAAM,aAAa,UAAU,IAAI,KAAK,EAAE;AACxC,YAAM,KAAK,aAAa,IAAI,WAAW,QAAQ,IAAI;AACnD,YAAM,cAAc,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,GAAG,IAAI,GAAG,QAAQ,IAAI;AAGnE,YAAM,SAAS,cAAc,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,QAAQ;AACvD,YAAM,SAAS,EAAE,IAAI;AAErB,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,QAAQ,SAAS,IAAI,GAAG,CAAC;AAC7E,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,OAAO,QAAQ,IAAI,SAAS,YAAY,IAAI,GAAG,WAAW,IAAI;AAAA,UACxE,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAGF,CAAC;AACL,aAAW,QAAQ,GAAG,MAAO,SAAQ,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK,EAAE,EAAE;AAEvE,QAAM,YAAY,KAAK,IAAI,OAAO,OAAO,SAAS,SAAS,CAAC;AAC5D,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,WAAW,QAAQ,OAAO,SAAS,OAAO;AAAA,MACxE,YAAY,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;;;AChdE,SAAS,MAAM,OAAO;AACpB,QAAM,IAAI,CAAC;AACX,aAAW,CAAC,GAAG,CAAC,KAAK,MAAO,GAAE,CAAC,IAAI;AACnC,SAAO;AACT;AAEF,SAASC,eAAa,OAAO,QAAQ;AACnC,WAAS,IAAI;AAAE,SAAK,cAAc;AAAA,EAAO;AACzC,IAAE,YAAY,OAAO;AACrB,QAAM,YAAY,IAAI,EAAE;AAC1B;AAEA,SAASC,kBAAgB,SAAS,UAAU,OAAO,UAAU;AAC3D,MAAI,OAAO,MAAM,KAAK,MAAM,OAAO;AAEnC,MAAI,OAAO,gBAAgB;AACzB,WAAO,eAAe,MAAMA,kBAAgB,SAAS;AAAA,EACvD;AACA,OAAK,WAAW;AAChB,OAAK,QAAQ;AACb,OAAK,WAAW;AAChB,OAAK,OAAO;AACZ,SAAO;AACT;AAEAD,eAAaC,mBAAiB,KAAK;AAEnC,SAASC,aAAW,KAAK,cAAc,WAAW;AAChD,cAAY,aAAa;AACzB,MAAI,IAAI,SAAS,cAAc;AAAE,WAAO;AAAA,EAAK;AAC7C,kBAAgB,IAAI;AACpB,eAAa,UAAU,OAAO,YAAY;AAC1C,SAAO,MAAM,UAAU,MAAM,GAAG,YAAY;AAC9C;AAEAD,kBAAgB,UAAU,SAAS,SAAS,SAAS;AACnD,MAAI,MAAM,YAAY,KAAK;AAC3B,MAAI,KAAK,UAAU;AACjB,QAAI,MAAM;AACV,QAAI;AACJ,SAAK,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACnC,UAAI,QAAQ,CAAC,EAAE,WAAW,KAAK,SAAS,QAAQ;AAC9C,cAAM,QAAQ,CAAC,EAAE,KAAK,MAAM,aAAa;AACzC;AAAA,MACF;AAAA,IACF;AACA,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI,WAAY,KAAK,SAAS,UAAW,OAAO,KAAK,SAAS,OAAO,WAAW,aAC5E,KAAK,SAAS,OAAO,OAAO,CAAC,IAC7B;AACJ,QAAI,MAAM,KAAK,SAAS,SAAS,MAAM,SAAS,OAAO,MAAM,SAAS;AACtE,QAAI,KAAK;AACP,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI,SAASC,aAAW,IAAI,SAAS,KAAK,SAAS,EAAE,QAAQ,GAAG;AAChE,UAAI,OAAO,IAAI,EAAE,OAAO,CAAC;AACzB,UAAI,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS;AACxD,UAAI,SAAU,OAAO,EAAE,UAAW;AAClC,aAAO,YAAY,MAAM,OACnB,SAAS,SACT,SAAS,OAAO,QAAQ,OAAO,OAC/B,SAAS,QAAQA,aAAW,IAAI,EAAE,SAAS,GAAG,GAAG,IACjDA,aAAW,IAAI,QAAQ,GAAG;AAAA,IAClC,OAAO;AACL,aAAO,WAAW;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEAD,kBAAgB,eAAe,SAAS,UAAU,OAAO;AACvD,MAAI,2BAA2B;AAAA,IAC7B,SAAS,SAAS,aAAa;AAC7B,aAAO,MAAO,cAAc,YAAY,IAAI,IAAI;AAAA,IAClD;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,UAAI,eAAe,YAAY,MAAM,IAAI,SAAS,MAAM;AACtD,eAAO,MAAM,QAAQ,IAAI,IACrB,YAAY,KAAK,CAAC,CAAC,IAAI,MAAM,YAAY,KAAK,CAAC,CAAC,IAChD,YAAY,IAAI;AAAA,MACtB,CAAC;AAED,aAAO,OAAO,YAAY,WAAW,MAAM,MAAM,aAAa,KAAK,EAAE,IAAI;AAAA,IAC3E;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IAEA,OAAO,SAAS,aAAa;AAC3B,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,IAAI,IAAI;AACf,WAAO,GAAG,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAY;AAAA,EACnD;AAEA,WAAS,cAAc,GAAG;AACxB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,MAAO,KAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,YAAY,GAAG;AACtB,WAAO,EACJ,QAAQ,OAAO,MAAM,EACrB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,MAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,OAAO,KAAK,EACpB,QAAQ,gBAAyB,SAAS,IAAI;AAAE,aAAO,SAAS,IAAI,EAAE;AAAA,IAAG,CAAC,EAC1E,QAAQ,yBAAyB,SAAS,IAAI;AAAE,aAAO,QAAS,IAAI,EAAE;AAAA,IAAG,CAAC;AAAA,EAC/E;AAEA,WAAS,oBAAoB,aAAa;AACxC,WAAO,yBAAyB,YAAY,IAAI,EAAE,WAAW;AAAA,EAC/D;AAEA,WAAS,iBAAiBE,WAAU;AAClC,QAAI,eAAeA,UAAS,IAAI,mBAAmB;AACnD,QAAI,GAAG;AAEP,iBAAa,KAAK;AAElB,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,IAAI,GAAG,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;AAC/C,YAAI,aAAa,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG;AAC3C,uBAAa,CAAC,IAAI,aAAa,CAAC;AAChC;AAAA,QACF;AAAA,MACF;AACA,mBAAa,SAAS;AAAA,IACxB;AAEA,YAAQ,aAAa,QAAQ;AAAA,MAC3B,KAAK;AACH,eAAO,aAAa,CAAC;AAAA,MAEvB,KAAK;AACH,eAAO,aAAa,CAAC,IAAI,SAAS,aAAa,CAAC;AAAA,MAElD;AACE,eAAO,aAAa,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,IACtC,UACA,aAAa,aAAa,SAAS,CAAC;AAAA,IAC5C;AAAA,EACF;AAEA,WAAS,cAAcC,QAAO;AAC5B,WAAOA,SAAQ,MAAO,cAAcA,MAAK,IAAI,MAAO;AAAA,EACtD;AAEA,SAAO,cAAc,iBAAiB,QAAQ,IAAI,UAAU,cAAc,KAAK,IAAI;AACrF;AAEA,SAASC,YAAU,OAAO,SAAS;AACjC,YAAU,YAAY,SAAY,UAAU,CAAC;AAE7C,MAAI,aAAa,CAAC;AAClB,MAAI,aAAa,QAAQ;AAEzB,MAAI,yBAAyB,EAAE,OAAO,eAAe;AACrD,MAAI,wBAAwB;AAE5B,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,SAAS;AACb,MAAI,UAAU;AACd,MAAI,UAAU;AAEd,MAAI,SAAS,uBAAuB,QAAQ,KAAK;AACjD,MAAI,SAAS,uBAAuB,QAAQ,KAAK;AACjD,MAAI,SAAS,uBAAuB,OAAO,KAAK;AAChD,MAAI,SAAS,qBAAqB,CAAC,IAAI,GAAG,MAAM,KAAK;AACrD,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,MAAM,KAAK;AAC/C,MAAI,SAAS,uBAAuB,SAAS,KAAK;AAClD,MAAI,UAAU,qBAAqB,CAAC,MAAM,IAAI,GAAG,MAAM,KAAK;AAC5D,MAAI,UAAU,qBAAqB,CAAC,KAAK,GAAI,GAAG,OAAO,KAAK;AAC5D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK;AACjE,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAM,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK;AACtF,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAK,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK;AAC3E,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AACzE,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,GAAG,GAAG,OAAO,KAAK;AAC/F,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAC/C,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK;AAC9E,MAAI,UAAU,qBAAqB,CAAC,KAAK,KAAK,MAAM,IAAI,GAAG,MAAM,KAAK;AACtE,MAAI,UAAU,uBAAuB,KAAM,KAAK;AAChD,MAAI,UAAU,qBAAqB,CAAC,GAAI,GAAG,MAAM,KAAK;AACtD,MAAI,UAAU,qBAAqB,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,OAAO,KAAK;AAC7D,MAAI,UAAU,uBAAuB,KAAK,KAAK;AAE/C,MAAI,SAAS,SAAS,IAAI,GAAG;AAAE,WAAO;AAAA,EAAG;AACzC,MAAI,SAAS,SAAS,IAAI,KAAK,OAAOC,QAAO;AACzC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,EAAE,GAAI,MAAM,CAAC,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,MACvD,WAAW,OAAO;AAAA,MAClB,OAAOA,OAAM,OAAO,OAAK,MAAM,IAAI;AAAA,IACrC;AAAA,EACF;AACF,MAAI,SAAS,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC3C,MAAI,SAAS,SAASA,QAAO;AACzB,UAAM,OAAO,CAAC;AAAG,eAAW,QAAQA,QAAO;AAAE,YAAM,IAAI,KAAK,MAAM,2BAA2B;AAAG,UAAI,EAAG,MAAK,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,IAAG;AAAE,WAAO;AAAA,EACrI;AACF,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC5C,MAAI,SAAS,WAAW;AAAE,WAAO;AAAA,EAAM;AACvC,MAAI,SAAS,SAAS,QAAQ,SAAS;AACnC,WAAO,EAAE,QAAQ,OAAO,QAAQ,GAAG,QAAQ;AAAA,EAC7C;AACF,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,SAAS,MAAM,OAAO,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC1D,MAAI,UAAU,SAAS,MAAM,OAAO,OAAO,OAAO;AAC9C,WAAO;AAAA,MACL,WAAW,QAAQ;AAAA,MACnB,OAAO,MAAM,KAAK;AAAA,MAClB;AAAA,MACA,OAAO,SAAS,CAAC;AAAA,IACnB;AAAA,EACF;AACF,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC7C,MAAI,UAAU,SAAS,MAAM;AAAE,WAAO;AAAA,EAAM;AAC5C,MAAI,UAAU,SAAS,OAAO;AAAE,WAAO,QAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,EAAG;AAClE,MAAI,UAAU,SAAS,OAAO,GAAG;AAAE,WAAO;AAAA,EAAG;AAC7C,MAAI,UAAU,SAAS,OAAO,MAAM;AAAE,WAAO,CAAC,OAAO,GAAG,IAAI;AAAA,EAAG;AAC/D,MAAI,UAAU,SAAS,GAAG,KAAK;AAAE,WAAO;AAAA,EAAK;AAC7C,MAAI,UAAU,SAAS,GAAG,GAAG;AAAE,WAAO,CAAC,GAAG,MAAM,OAAO,OAAO,CAAC;AAAA,EAAG;AAClE,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,EAAE,KAAK;AAAA,EAAG;AAC7C,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO;AAAA,EAAG;AACtC,MAAI,UAAU,SAAS,GAAG;AAAE,WAAO,WAAW,CAAC;AAAA,EAAG;AAClD,MAAI,cAAc,QAAQ,cAAc;AACxC,MAAI,eAAe;AACnB,MAAI,sBAAsB,CAAC,EAAE,MAAM,GAAG,QAAQ,EAAE,CAAC;AACjD,MAAI,iBAAiB;AACrB,MAAI,sBAAsB,QAAQ,uBAAuB,CAAC;AAC1D,MAAI,kBAAkB,QAAQ,kBAAkB;AAEhD,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,QAAI,EAAE,QAAQ,aAAa,yBAAyB;AAClD,YAAM,IAAI,MAAM,oCAAqC,QAAQ,YAAY,IAAK;AAAA,IAChF;AAEA,4BAAwB,uBAAuB,QAAQ,SAAS;AAAA,EAClE;AAEA,WAAS,OAAO;AACd,WAAO,MAAM,UAAU,cAAc,WAAW;AAAA,EAClD;AAEA,WAAS,SAAS;AAChB,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ;AACf,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,WAAW;AAClB,WAAO,oBAAoB,cAAc,WAAW;AAAA,EACtD;AAEA,WAAS,SAAS,aAAaC,WAAU;AACvC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM;AAAA,MACJ,CAAC,qBAAqB,WAAW,CAAC;AAAA,MAClC,MAAM,UAAU,cAAc,WAAW;AAAA,MACzCA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,MAAM,SAASA,WAAU;AAChC,IAAAA,YAAWA,cAAa,SACpBA,YACA,oBAAoB,cAAc,WAAW;AAEjD,UAAM,qBAAqB,SAASA,SAAQ;AAAA,EAC9C;AAEA,WAAS,uBAAuBC,OAAM,YAAY;AAChD,WAAO,EAAE,MAAM,WAAW,MAAMA,OAAM,WAAuB;AAAA,EAC/D;AAEA,WAAS,qBAAqB,OAAO,UAAU,YAAY;AACzD,WAAO,EAAE,MAAM,SAAS,OAAc,UAAoB,WAAuB;AAAA,EACnF;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB;AAC5B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AAEA,WAAS,qBAAqB,aAAa;AACzC,WAAO,EAAE,MAAM,SAAS,YAAyB;AAAA,EACnD;AAEA,WAAS,sBAAsB,KAAK;AAClC,QAAI,UAAU,oBAAoB,GAAG;AACrC,QAAI;AAEJ,QAAI,SAAS;AACX,aAAO;AAAA,IACT,OAAO;AACL,UAAI,OAAO,oBAAoB,QAAQ;AACrC,YAAI,oBAAoB,SAAS;AAAA,MACnC,OAAO;AACL,YAAI;AACJ,eAAO,CAAC,oBAAoB,EAAE,CAAC,GAAG;AAAA,QAAC;AAAA,MACrC;AAEA,gBAAU,oBAAoB,CAAC;AAC/B,gBAAU;AAAA,QACR,MAAM,QAAQ;AAAA,QACd,QAAQ,QAAQ;AAAA,MAClB;AAEA,aAAO,IAAI,KAAK;AACd,YAAI,MAAM,WAAW,CAAC,MAAM,IAAI;AAC9B,kBAAQ;AACR,kBAAQ,SAAS;AAAA,QACnB,OAAO;AACL,kBAAQ;AAAA,QACV;AAEA;AAAA,MACF;AAEA,0BAAoB,GAAG,IAAI;AAE3B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,WAAS,oBAAoB,UAAU,QAAQC,SAAQ;AACrD,QAAI,kBAAkB,sBAAsB,QAAQ;AACpD,QAAI,gBAAgB,sBAAsB,MAAM;AAEhD,QAAI,MAAM;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,gBAAgB;AAAA,QACtB,QAAQ,gBAAgB;AAAA,MAC1B;AAAA,MACA,KAAK;AAAA,QACH,QAAQ;AAAA,QACR,MAAM,cAAc;AAAA,QACpB,QAAQ,cAAc;AAAA,MACxB;AAAA,IACF;AACA,QAAIA,WAAU,cAAe,OAAO,WAAW,WAAW,YAAa;AACrE,UAAI,QAAQ,WAAW,OAAO,IAAI,KAAK;AACvC,UAAI,MAAM,WAAW,OAAO,IAAI,GAAG;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAEA,WAAS,SAASN,WAAU;AAC1B,QAAI,cAAc,gBAAgB;AAAE;AAAA,IAAQ;AAE5C,QAAI,cAAc,gBAAgB;AAChC,uBAAiB;AACjB,4BAAsB,CAAC;AAAA,IACzB;AAEA,wBAAoB,KAAKA,SAAQ;AAAA,EACnC;AAEA,WAAS,qBAAqB,SAASI,WAAU;AAC/C,WAAO,IAAIN,kBAAgB,SAAS,MAAM,MAAMM,SAAQ;AAAA,EAC1D;AAEA,WAAS,yBAAyBJ,WAAU,OAAOI,WAAU;AAC3D,WAAO,IAAIN;AAAA,MACTA,kBAAgB,aAAaE,WAAU,KAAK;AAAA,MAC5CA;AAAA,MACA;AAAA,MACAI;AAAA,IACF;AAAA,EACF;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AACxB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO,IAAI,EAAE;AAAA,QACpB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,iBAAiB;AACtB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC;AACN,WAAK,kBAAkB;AACvB,UAAI,OAAO,YAAY;AACrB,aAAK,mBAAmB;AAAA,MAC1B;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,eAAK,mBAAmB;AAAA,QAC1B;AAAA,MACF;AACA,qBAAe;AACf,WAAK,OAAO,IAAI,IAAI,IAAI,EAAE;AAAA,IAC5B,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEpC,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK;AACL,aAAK;AACL;AACA,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,iBAAK,CAAC,IAAI,EAAE;AACZ,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK;AACL,eAAK,CAAC;AACN,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AAAA,UACF;AACA,eAAK,MAAM,UAAU,IAAI,WAAW;AACpC,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK;AACL,eAAK;AACL;AACA,eAAK;AACL,cAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,iBAAK;AACL,2BAAe;AAAA,UACjB,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,MAAM;AAAA,YAAG;AAAA,UACjD;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,mBAAK,CAAC,IAAI,EAAE;AACZ,mBAAK;AAAA,YACP,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AAAA,UACP,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AACA,cAAI,OAAO,YAAY;AACrB,iBAAK;AACL,iBAAK,CAAC;AACN,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,MAAM;AAAA,cAAG;AAAA,YACjD;AACA,mBAAO,OAAO,YAAY;AACxB,iBAAG,KAAK,EAAE;AACV,mBAAK,MAAM,OAAO,WAAW;AAC7B,kBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,cACF,OAAO;AACL,qBAAK;AACL,oBAAI,oBAAoB,GAAG;AAAE,2BAAS,MAAM;AAAA,gBAAG;AAAA,cACjD;AAAA,YACF;AACA,iBAAK,MAAM,UAAU,IAAI,WAAW;AACpC,iBAAK,YAAY;AACjB,gBAAI,OAAO,YAAY;AACrB,6BAAe;AACf,mBAAK,OAAO,EAAE;AAAA,YAChB,OAAO;AACL,4BAAc;AACd,mBAAK;AAAA,YACP;AAAA,UACF,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF;AACA,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,YAAY;AACjB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,OAAO,EAAE;AAAA,UAChB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI,IAAI;AAEZ,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI;AAER,SAAK;AACL,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO;AAAA,IACd;AACA,SAAK;AACL,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,aAAK;AACL,uBAAe;AAAA,MACjB,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,MAAM;AAAA,QAAG;AAAA,MACjD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,OAAO;AAAA,MACd;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,YAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,eAAK;AACL,yBAAe;AAAA,QACjB,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,MAAM;AAAA,UAAG;AAAA,QACjD;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,OAAO;AAAA,QACd;AACA,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,OAAO,aAAa,CAAC,MAAM,QAAQ;AAC3C,WAAK;AACL,qBAAe;AAAA,IACjB,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,YAAY;AACjB,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,iBAAiB;AACtB,yBAAe;AACf,eAAK,OAAO,EAAE;AAAA,QAChB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK,WAAW;AAChB,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,OAAO;AAAA,IACd,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AACA,SAAK,MAAM,UAAU,IAAI,WAAW;AACpC,SAAK,qBAAqB;AAC1B,QAAI,OAAO,YAAY;AACrB,WAAK,iBAAiB;AACtB,qBAAe;AACf,WAAK,OAAO,IAAI,EAAE;AAAA,IACpB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,uBAAuB;AAC9B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK;AACL,SAAK,mBAAmB;AACxB,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,eAAe;AACpB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,cAAc;AACnB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,cAAc;AAAA,MACrB;AACA,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,IAAI,IAAI,IAAI,EAAE;AAAA,MAC7B,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,IAAI,IAAI,EAAE;AAAA,IAC7B,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,iBAAiB;AACxB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgB;AACvB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK;AACL,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,eAAO,OAAO,YAAY;AACxB,aAAG,KAAK,EAAE;AACV,eAAK,MAAM,OAAO,WAAW;AAC7B,cAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,UACF,OAAO;AACL,iBAAK;AACL,gBAAI,oBAAoB,GAAG;AAAE,uBAAS,OAAO;AAAA,YAAG;AAAA,UAClD;AAAA,QACF;AACA,aAAK,CAAC,IAAI,EAAE;AACZ,aAAK;AAAA,MACP,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,MAAM,UAAU,IAAI,WAAW;AAAA,MACtC,OAAO;AACL,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAExB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,WAAW;AAChB,WAAK,mBAAmB;AACxB,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,KAAK;AACzC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,qBAAqB;AAC5B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK,kBAAkB;AACvB,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,kBAAkB;AACvB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK;AACL,aAAK,WAAW;AAChB,YAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,eAAK;AACL;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,WAAW;AAChB,eAAK,kBAAkB;AACvB,cAAI,OAAO,YAAY;AACrB,2BAAe;AACf,iBAAK,QAAQ,IAAI,EAAE;AAAA,UACrB,OAAO;AACL,0BAAc;AACd,iBAAK;AAAA,UACP;AAAA,QACF,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,oBAAoB;AAC3B,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAE5B,SAAK;AACL,SAAK,aAAa;AAClB,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,WAAW;AAChB,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,WAAW;AAChB,aAAK,aAAa;AAClB,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,IAAI,EAAE;AAAA,QACrB,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,qBAAe;AACf,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK;AACL,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,eAAe;AACtB,QAAI,IAAI,IAAI,IAAI;AAEhB,SAAK,sBAAsB;AAC3B,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,gBAAgB;AACrB,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB;AACA,WAAK;AACL,UAAI,OAAO,YAAY;AACrB,aAAK;AACL,aAAK;AACL,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,MAAM,UAAU,IAAI,WAAW;AAAA,QACtC,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,yBAAe;AACf,eAAK,QAAQ,EAAE;AAAA,QACjB;AACA,aAAK;AAAA,MACP;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,wBAAwB;AAC/B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,WAAK,CAAC;AACN,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AACA,WAAK,MAAM,UAAU,IAAI,WAAW;AACpC,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,uBAAe;AACf,aAAK,QAAQ,EAAE;AAAA,MACjB,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AAAA,IACF,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB;AACzB,QAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAEhC,SAAK;AACL,SAAK;AACL,SAAK;AACL,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AACL,UAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,aAAK;AACL;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AACA,UAAI,OAAO,YAAY;AACrB,aAAK,CAAC;AACN,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AACA,YAAI,OAAO,YAAY;AACrB,iBAAO,OAAO,YAAY;AACxB,eAAG,KAAK,EAAE;AACV,iBAAK,MAAM,OAAO,WAAW;AAC7B,gBAAI,QAAQ,KAAK,EAAE,GAAG;AACpB;AAAA,YACF,OAAO;AACL,mBAAK;AACL,kBAAI,oBAAoB,GAAG;AAAE,yBAAS,OAAO;AAAA,cAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,OAAO;AACL,eAAK;AAAA,QACP;AACA,YAAI,OAAO,YAAY;AACrB,eAAK,CAAC,IAAI,EAAE;AACZ,eAAK;AAAA,QACP,OAAO;AACL,wBAAc;AACd,eAAK;AAAA,QACP;AAAA,MACF,OAAO;AACL,sBAAc;AACd,aAAK;AAAA,MACP;AACA,UAAI,OAAO,YAAY;AACrB,aAAK;AAAA,MACP;AACA,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,MAAM,UAAU,IAAI,WAAW;AAAA,IACtC,OAAO;AACL,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,qBAAe;AACf,WAAK,QAAQ,EAAE;AAAA,IACjB;AACA,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,mBAAmB;AAC1B,QAAI,IAAI,IAAI,IAAI,IAAI;AAEpB,SAAK;AACL,SAAK,WAAW;AAChB,SAAK;AACL,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,QAAI,MAAM,WAAW,WAAW,MAAM,IAAI;AACxC,WAAK;AACL;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,MAAM;AAAA,MAAG;AAAA,IACjD;AACA,QAAI,OAAO,YAAY;AACrB,WAAK,CAAC,IAAI,EAAE;AACZ,WAAK;AAAA,IACP,OAAO;AACL,oBAAc;AACd,WAAK;AAAA,IACP;AACA,QAAI,OAAO,YAAY;AACrB,WAAK;AAAA,IACP;AACA,SAAK,CAAC,IAAI,EAAE;AACZ,SAAK;AAEL,WAAO;AAAA,EACT;AAEA,WAAS,aAAa;AACpB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,WAAO,OAAO,YAAY;AACxB,SAAG,KAAK,EAAE;AACV,WAAK,MAAM,OAAO,WAAW;AAC7B,UAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,MACF,OAAO;AACL,aAAK;AACL,YAAI,oBAAoB,GAAG;AAAE,mBAAS,OAAO;AAAA,QAAG;AAAA,MAClD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,cAAc;AACrB,QAAI,IAAI;AAER,SAAK,CAAC;AACN,SAAK,MAAM,OAAO,WAAW;AAC7B,QAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,IACF,OAAO;AACL,WAAK;AACL,UAAI,oBAAoB,GAAG;AAAE,iBAAS,OAAO;AAAA,MAAG;AAAA,IAClD;AACA,QAAI,OAAO,YAAY;AACrB,aAAO,OAAO,YAAY;AACxB,WAAG,KAAK,EAAE;AACV,aAAK,MAAM,OAAO,WAAW;AAC7B,YAAI,OAAO,KAAK,EAAE,GAAG;AACnB;AAAA,QACF,OAAO;AACL,eAAK;AACL,cAAI,oBAAoB,GAAG;AAAE,qBAAS,OAAO;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK;AAAA,IACP;AAEA,WAAO;AAAA,EACT;AAEA,eAAa,sBAAsB;AAEnC,MAAI,QAAQ,aAAa;AACvB;AAAA;AAAA,MAA2B;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA;AAAA,EACF;AACA,MAAI,eAAe,cAAc,gBAAgB,MAAM,QAAQ;AAC7D,WAAO;AAAA,EACT,OAAO;AACL,QAAI,eAAe,cAAc,cAAc,MAAM,QAAQ;AAC3D,eAAS,mBAAmB,CAAC;AAAA,IAC/B;AAEA,UAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,MAAM,SAAS,MAAM,OAAO,cAAc,IAAI;AAAA,MAC/D,iBAAiB,MAAM,SACnB,oBAAoB,gBAAgB,iBAAiB,CAAC,IACtD,oBAAoB,gBAAgB,cAAc;AAAA,IACxD;AAAA,EACF;AACF;;;ACtkDO,SAAS,WAAW,OAA2B;AACpD,SAAcG,YAAM,KAAK;AAC3B;AAGO,SAAS,WAAWC,QAA8C;AACvE,QAAM,QAA2B,CAAC;AAClC,QAAM,OAAO,oBAAI,IAA6B;AAC9C,QAAMC,SAA0C,CAAC;AAEjD,EAAAD,OAAM,QAAQ,CAAC,IAAI,MAAM;AACvB,UAAM,KAAK,IAAI,CAAC;AAChB,WAAOC,OAAM,SAAS,KAAKA,OAAMA,OAAM,SAAS,CAAC,EAAG,UAAU,GAAG,OAAQ,CAAAA,OAAM,IAAI;AACnF,UAAM,SAASA,OAAM,SAAS,IAAIA,OAAMA,OAAM,SAAS,CAAC,IAAI;AAE5D,UAAM,QAAQ,CAAC,GAAG,GAAG,KAAK;AAC1B,UAAM,YAAsB,CAAC;AAC7B,QAAI;AACJ,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,SAAS,CAAC,CAAC,GAAG;AACnD,UAAI,MAAM,MAAM;AACd,cAAM,KAAK,CAAC;AACZ;AAAA,MACF;AACA,UAAI,MAAM,SAAS;AACjB,gBAAQ,OAAO,CAAC;AAChB;AAAA,MACF;AACA,gBAAU,KAAK,MAAM,SAAS,MAAM,SAAS,OAAO,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE;AAAA,IACvE;AACA,UAAM,OAAO,UAAU,SAAS,IAAI,UAAU,KAAK,QAAK,IAAI;AAE5D,UAAM,OAAwB;AAAA,MAC5B;AAAA,MACA,OAAO,GAAG;AAAA,MACV;AAAA,MACA,UAAU,CAAC;AAAA,MACX,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,MACrC,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,MACvC,GAAI,GAAG,cAAc,SAAY,EAAE,WAAW,GAAG,UAAU,IAAI,CAAC;AAAA,IAClE;AACA,UAAM,KAAK,IAAI;AACf,SAAK,IAAI,IAAI,IAAI;AACjB,QAAI,OAAQ,MAAK,IAAI,OAAO,EAAE,EAAG,SAAS,KAAK,EAAE;AACjD,IAAAA,OAAM,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,CAAC;AAAA,EACtC,CAAC;AAED,SAAO;AACT;;;ACrBA,SAAS,YAAY,MAAiB,KAAa,OAAmC;AACpF,MAAI,KAAK,QAAQ;AAEf,QAAIC,KAAI,KAAK,KAAK,SAAS;AAC3B,WAAOA,MAAK,KAAK,MAAM,KAAK,KAAKA,EAAC,EAAI,CAAAA;AACtC,QAAIA,MAAK,KAAK,KAAK,KAAKA,EAAC,MAAM,IAAK,QAAO;AAC3C,SAAK,KAAK,OAAOA,KAAI,GAAG,GAAG,GAAG;AAG9B,QAAI,KAAK,KAAK,UAAU,QAAQ,EAAG,QAAO;AAG1C,UAAMC,OAAM,KAAK,MAAM,KAAK,KAAK,SAAS,CAAC;AAC3C,UAAMC,SAAQ,KAAK,KAAKD,IAAG;AAC3B,UAAM,YAAuB;AAAA,MAC3B,QAAQ;AAAA,MACR,MAAM,KAAK,KAAK,MAAMA,IAAG;AAAA;AAAA,MACzB,MAAM,KAAK;AAAA,MACX,MAAM;AAAA,IACR;AACA,QAAI,KAAK,KAAM,MAAK,KAAK,OAAO;AAChC,SAAK,OAAO;AACZ,SAAK,OAAO,KAAK,KAAK,MAAM,GAAGA,IAAG;AAElC,WAAO,EAAE,OAAAC,QAAO,YAAY,UAAU;AAAA,EACxC;AAGA,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,KAAK,UAAU,OAAO,KAAK,KAAK,CAAC,EAAI;AAErD,QAAM,QAAQ,YAAY,KAAK,SAAS,CAAC,GAAI,KAAK,KAAK;AACvD,MAAI,CAAC,MAAO,QAAO;AAGnB,OAAK,KAAK,OAAO,GAAG,GAAG,MAAM,KAAK;AAClC,OAAK,SAAS,OAAO,IAAI,GAAG,GAAG,MAAM,UAAU;AAG/C,MAAI,KAAK,KAAK,UAAU,QAAQ,EAAG,QAAO;AAG1C,QAAM,MAAM,KAAK,MAAM,KAAK,KAAK,SAAS,CAAC;AAC3C,QAAM,QAAQ,KAAK,KAAK,GAAG;AAC3B,QAAM,gBAA+B;AAAA,IACnC,QAAQ;AAAA,IACR,MAAM,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA;AAAA,IAC7B,UAAU,KAAK,SAAS,MAAM,MAAM,CAAC;AAAA,EACvC;AACA,OAAK,OAAO,KAAK,KAAK,MAAM,GAAG,GAAG;AAClC,OAAK,WAAW,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC;AAE9C,SAAO,EAAE,OAAO,YAAY,cAAc;AAC5C;AAyBO,SAAS,eAAe,OAAkC;AAC/D,QAAMC,SAAQ,MACX,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,MAAI;AACJ,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AACJ,QAAM,gBAA0B,CAAC;AACjC,QAAM,QAAyB,CAAC;AAChC,MAAI,gBAAgB;AAEpB,aAAW,QAAQA,QAAO;AACxB,QAAI,0BAA0B,KAAK,IAAI,GAAG;AACxC;AAAA,IACF;AACA,UAAM,iBAAiB,KAAK,MAAM,gCAAgC;AAClE,QAAI,gBAAgB;AAClB,oBAAc,KAAK,eAAe,CAAC,EAAG,KAAK,CAAC;AAC5C;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,MAAM,iBAAiB;AAC/C,QAAI,YAAY;AACd,cAAQ,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACxD;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,MAAM,kDAAkD;AAClF,QAAI,cAAc;AAChB,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,MAAM,sBAAsB;AACvD,QAAI,eAAe;AACjB,iBAAW,OAAO,cAAc,CAAC,CAAC;AAClC,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM,0BAA0B;AACtD,QAAI,UAAU;AACZ,kBAAY,SAAS,CAAC,MAAM,OAAO,OAAO;AAC1C;AAAA,IACF;AAEA,QAAI,iDAAiD,KAAK,IAAI,GAAG;AAC/D,sBAAgB;AAChB;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,MAAM,sCAAsC;AACnE,QAAI,WAAW;AACb,YAAM,KAAK,EAAE,QAAQ,UAAU,CAAC,EAAG,YAAY,GAAG,MAAM,UAAU,CAAC,EAAG,KAAK,EAAE,CAAC;AAC9E;AAAA,IACF;AAEA,kBAAc,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,YAAqC;AAAA,IACzC,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IACnC,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,EACnC;AAEA,QAAM,aAAa,cAAc,KAAK,IAAI;AAG1C,QAAM,aACJ,cAAc,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,KAAK,WAAW,KAAK,CAAC,KAAK,WAAW,KAAK,CAAC,CAAC,KACrF,MAAM,SAAS,MAAM,KAAK,CAAC,cAAc,KAAK,KAAK,KAAK,CAAC,aAAa,KAAK,KAAK;AAEnF,MAAI,YAAY;AACd,WAAO,uBAAuB,YAAY,OAAO,eAAe,OAAO,SAAS;AAAA,EAClF;AAEA,SAAO,0BAA0B,YAAY,OAAO,eAAe,OAAO,SAAS;AACrF;AAKA,SAAS,0BACP,OACA,OACA,eACA,OACA,WACmB;AACnB,QAAM,aAAa,MAAM,MAAM,gBAAgB;AAC/C,QAAM,QAAQ,KAAK,IAAI,GAAG,aAAa,OAAO,WAAW,CAAC,CAAC,IAAI,CAAC;AAChE,QAAM,aAAa,MAAM,QAAQ,gBAAgB,EAAE,EAAE,QAAQ,YAAY,EAAE;AAC3E,QAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM;AAE1D,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC/B,WAAW;AAAA,MACX,OAAO,CAAC;AAAA,MACR,GAAI,gBAAgB,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAAA,MACrD,GAAI,SAAS,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,MAAI,OAAkB;AAAA,IACpB,QAAQ;AAAA,IACR,MAAM,CAAC;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,aAAW,KAAK,MAAM;AACpB,UAAM,QAAQ,YAAY,MAAM,GAAG,KAAK;AACxC,QAAI,OAAO;AACT,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,MAAM,CAAC,MAAM,KAAK;AAAA,QAClB,UAAU,CAAC,MAAM,MAAM,UAAU;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB;AACpB,MAAI,YAAY;AAChB,QAAM,QAAyB,CAAC;AAEhC,QAAM,OAAO,CAAC,MAAyB;AACrC,QAAI,EAAE,QAAQ;AACZ,YAAMC,UAAS,IAAI,WAAW;AAC9B,YAAMC,MAAK,QAAQD,OAAM;AACzB,YAAM,KAAK;AAAA,QACT,IAAAC;AAAA,QACA,OAAO,EAAE,KAAK,KAAK,KAAK;AAAA,QACxB,OAAO,CAAC,SAAS,MAAM;AAAA,QACvB,QAAAD;AAAA,QACA,QAAQ;AAAA,QACR,UAAU,CAAC;AAAA,MACb,CAAC;AACD,aAAOC;AAAA,IACT;AAEA,UAAM,SAAS,IAAI,eAAe;AAClC,UAAM,KAAK,QAAQ,MAAM;AACzB,UAAM,WAAqB,CAAC;AAC5B,eAAW,KAAK,EAAE,UAAU;AAC1B,eAAS,KAAK,KAAK,CAAC,CAAC;AAAA,IACvB;AACA,UAAM,KAAK;AAAA,MACT;AAAA,MACA,OAAO,EAAE,KAAK,KAAK,KAAK;AAAA,MACxB,OAAO,CAAC,SAAS,UAAU;AAAA,MAC3B;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACT;AAEA,OAAK,IAAI;AAET,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC/B,WAAW;AAAA,IACX;AAAA,IACA,GAAI,gBAAgB,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAAA,IACrD,GAAI,SAAS,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,EAC/C;AACF;AAKA,SAAS,uBACP,OACA,OACA,eACA,OACA,WACmB;AACnB,QAAM,QAAyB,CAAC;AAChC,QAAMF,SAAQ,MAAM,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AAEpE,QAAM,oBAAoBA,OAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC;AAE5D,MAAI,mBAAmB;AACrB,UAAM,WAAW,oBAAI,IAGnB;AAEF,eAAW,QAAQA,QAAO;AACxB,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAS;AAEd,YAAM,aAAa,WAAW,KAAK,OAAO;AAC1C,YAAM,aAAa,WAAW,KAAK,OAAO;AAC1C,YAAM,YAAY,QAAQ,QAAQ,yBAAyB,EAAE;AAE7D,YAAM,WAAW,UAAU,QAAQ,IAAI;AACvC,YAAM,WAAW,YAAY,IAAI,UAAU,MAAM,GAAG,QAAQ,EAAE,KAAK,IAAI;AACvE,YAAM,cAAc,YAAY,IAAI,UAAU,MAAM,WAAW,CAAC,EAAE,KAAK,IAAI;AAE3E,UAAI,QAAQ;AACZ,UAAI,KAAK;AACT,UAAI;AAEJ,YAAM,eAAe,SAAS,MAAM,WAAW;AAC/C,YAAM,aAAa,SAAS,MAAM,SAAS;AAC3C,UAAI,cAAc;AAChB,gBAAQ,aAAa,CAAC,EAAG,QAAQ,aAAa,KAAK,EAAE,KAAK;AAC1D,aAAK,SAAS,MAAM,GAAG,aAAa,KAAK,EAAE,KAAK;AAAA,MAClD,WAAW,YAAY;AACrB,gBAAQ,WAAW,CAAC,EAAG,QAAQ,aAAa,KAAK,EAAE,KAAK;AACxD,aAAK,SAAS,MAAM,GAAG,WAAW,KAAK,EAAE,KAAK;AAAA,MAChD,OAAO;AACL,cAAM,QAAQ,SAAS,MAAM,KAAK;AAClC,aAAK,MAAM,CAAC;AACZ,gBAAQ,MAAM,MAAM,CAAC,EAAE,KAAK,KAAK;AAAA,MACnC;AAEA,UAAI,CAAC,GAAI,MAAK,IAAI,SAAS,OAAO,CAAC;AACnC,eAAS;AAET,YAAM,WAAW,cACb,YACG,MAAM,SAAS,EACf,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,IACjB,CAAC;AAEL,YAAM,SAAS,cAAe,SAAS,WAAW,KAAK,CAAC;AAExD,eAAS,IAAI,IAAI;AAAA,QACf;AAAA,QACA,OAAO,SAAS;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,eAAW,OAAO,SAAS,OAAO,GAAG;AACnC,YAAM,KAAK;AAAA,QACT,IAAI,IAAI;AAAA,QACR,OAAO,IAAI;AAAA,QACX,OAAO,IAAI,SAAS,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,UAAU;AAAA,QAC5D,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;AAAA,QAC3C,QAAQ,IAAI;AAAA,QACZ,UAAU,IAAI;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AAEL,UAAM,WAAWA,OAAM,IAAI,CAAC,MAAM;AAChC,YAAM,SAAS,EAAE,OAAO,MAAM;AAC9B,YAAM,UAAU,EAAE,KAAK;AACvB,aAAO,EAAE,QAAQ,QAAQ;AAAA,IAC3B,CAAC;AAED,UAAMG,SAA0C,CAAC;AACjD,aAAS,QAAQ,CAAC,IAAI,QAAQ;AAC5B,aAAOA,OAAM,SAAS,KAAKA,OAAMA,OAAM,SAAS,CAAC,EAAG,UAAU,GAAG,OAAQ,CAAAA,OAAM,IAAI;AACnF,YAAM,SAASA,OAAM,SAAS,IAAIA,OAAMA,OAAM,SAAS,CAAC,IAAI;AAE5D,UAAI,UAAU,GAAG;AACjB,UAAI,SAAS;AACb,UAAI;AAEJ,YAAM,YAAY,QAAQ,MAAM,WAAW;AAC3C,UAAI,WAAW;AACb,cAAM,UAAU,UAAU,CAAC;AAC3B,YAAI,uBAAuB,KAAK,OAAO,KAAK,YAAY,KAAK,OAAO,EAAG,UAAS;AAChF,cAAM,YAAY,QAAQ,MAAM,kCAAkC;AAClE,cAAM,UAAU,QAAQ,MAAM,gCAAgC;AAC9D,YAAI,UAAW,UAAS,UAAU,CAAC,EAAG,KAAK;AAAA,iBAClC,QAAS,UAAS,QAAQ,CAAC,EAAG,KAAK;AAC5C,kBAAU,QAAQ,QAAQ,WAAW,EAAE,EAAE,KAAK;AAAA,MAChD;AAEA,YAAM,eAAe,QAAQ,MAAM,qBAAqB;AACxD,UAAI,QAAQ;AACZ,UAAI,cAAc;AAChB,gBAAQ,aAAa,CAAC;AACtB,YAAI,aAAa,CAAC,KAAK,CAAC,OAAQ,UAAS,aAAa,CAAC;AAAA,MACzD;AACA,YAAM,KAAK,UAAU,MAAM,MAAM,CAAC;AAClC,UAAI,CAAC,UAAU,SAAS,WAAW,EAAG,UAAS;AAE/C,YAAM,KAAK;AAAA,QACT;AAAA,QACA,OAAO,MAAM,QAAQ,aAAa,KAAK;AAAA,QACvC,OAAO,SAAS,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,UAAU;AAAA,QACxD,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,QAC3B;AAAA,QACA,UAAU,CAAC;AAAA,MACb,CAAC;AAED,UAAI,QAAQ;AACV,cAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE;AAClD,YAAI,OAAO;AACT,UAAC,MAAM,SAAsB,KAAK,EAAE;AACpC,UAAC,MAAc,SAAS;AAAA,QAC1B;AAAA,MACF;AAEA,MAAAA,OAAM,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,CAAC;AAAA,IACtC,CAAC;AAED,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,SAAS,WAAW,GAAG;AAC9B,QAAC,KAAa,SAAS;AACvB,YAAI,CAAC,KAAK,MAAM,SAAS,MAAM,GAAG;AAChC,UAAC,KAAa,QAAQ,CAAC,SAAS,MAAM;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,aAAa,CAAC,EAAG;AAAA,IAC9D,WAAW;AAAA,IACX;AAAA,IACA,GAAI,gBAAgB,EAAE,qBAAqB,KAAK,IAAI,CAAC;AAAA,IACrD,GAAI,SAAS,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,EAC/C;AACF;AAIA,IAAMC,YAAW;AACjB,IAAMC,kBAAiB;AACvB,IAAM,gBAAgB;AACtB,IAAM,gBAAgB;AAGtB,SAASC,YAAW,OAAe,MAAc,YAAY,OAAyC;AACpG,SAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,IAAI,CAAC,SAAS;AAAA,IACb;AAAA,IACA,OAAO,KAAK,IAAI,YAAY,KAAK,YAAY,OAAO,IAAI,IAAI,EAAE,SAAS,YAAY,KAAK,KAAK,YAAY,KAAK,EAAE;AAAA,EAClH,EAAE;AACN;AAKO,SAAS,gBAAgB,IAAuB,OAAoC;AACzF,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAC,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,MAAI,GAAG,MAAM,WAAW,GAAG;AACzB,UAAMC,SAAe;AAAA,MACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG;AAAA,MAC9C,YAAY,QAAQ;AAAA,MACpB,UAAU,CAAC;AAAA,IACb;AACA,WAAO,EAAE,OAAAA,QAAO,SAAS,CAAC,EAAE;AAAA,EAC9B;AAEA,QAAM,YACJ,GAAG,SAAS,SAAS,MAAM,QAC3B,GAAG,SAAS,QAAQ,MAAM,aAC1B,OAAO,GAAG,SAAS,SAAS,CAAC,MAAM;AAGrC,QAAM,QAAQ,oBAAI,IAA+C;AACjE,QAAM,aAAa,oBAAI,IAAqB;AAE5C,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,SAAS,QAAQ,KAAK,UAAU,KAAK,SAAS,WAAW,KAAK,KAAK,MAAM,SAAS,MAAM,CAAC;AAC/F,eAAW,IAAI,KAAK,IAAI,MAAM;AAE9B,UAAMC,SAAQH,YAAW,KAAK,OAAO,MAAM,SAAS;AACpD,UAAM,QAAQG,OAAM,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AACvD,UAAM,UAAU,YAAY,OAAO,IAAI,SAAS,YAAY,KAAK;AACjE,UAAM,IAAI,KAAK,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,EACtC;AAGA,QAAM,SAA0B,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IACnD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACxB,QAAQ,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACzB,UAAU,EAAE;AAAA,EACd,EAAE;AAEF,QAAM,SAAS,WAAW,QAAQ;AAAA,IAChC,WAAY,GAAG,SAAS,WAAW,KAAqB,GAAG,aAAa;AAAA,IACxE,UAAU,YAAY,KAAK;AAAA,IAC3B,YAAY,YAAY,KAAK;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,GAAG,SAAS,OAAO,IAAI,WAAW,gBAAgB,KAAK;AAGtE,QAAM,UAAU,GAAG,MAAM,OAAO,CAAC,MAAM,WAAW,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE;AAC5E,QAAM,YAAY,QAAQ,IAAI,CAAC,OAAO,OAAO,MAAM,IAAI,EAAE,CAAC,EAAE,OAAO,OAAO;AAC1E,QAAM,WAAW,UAAU,SAAS,IAAI,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,MAAM,EAAG,CAAC,CAAC,IAAI;AAGlF,QAAM,gBAAgB,oBAAI,IAAqE;AAC/F,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,OAAO,MAAM,IAAI,KAAK,EAAE;AAClC,UAAM,SAAS,WAAW,IAAI,KAAK,EAAE;AACrC,UAAM,KAAK,UAAU,WAAW,IAAI,WAAW,EAAE,KAAK;AACtD,kBAAc,IAAI,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AAAA,EAC5E;AAEA,QAAM,MAAM,CAAC,OAAe,cAAc,IAAI,EAAE;AAEhD,QAAM,WAA2B,CAAC;AAGlC,MAAI,SAAS,GAAG;AACd,aAAS;AAAA,MACP,EAAE;AAAA,QACA,OAAO,GAAG,SAAS,OAAO,CAAC;AAAA,QAC3B,OAAO,QAAQ;AAAA,QACf,SAAS,WAAW;AAAA,QACpB,WAAW,gBAAgB;AAAA,QAC3B,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,KAAK,IAAI,KAAK,EAAE;AACtB,UAAMA,SAAQH,YAAW,KAAK,OAAO,IAAI;AACzC,UAAM,aAAa,KAAK,SAAS;AAEjC,SAAK,SAAS,QAAQ,CAAC,KAAK,SAAS;AACnC,YAAM,KAAK,IAAI,GAAG;AAClB,UAAI;AAMJ,UAAI,eAAeG,OAAM,SAAS,GAAG;AACnC,YAAI,SAAS,GAAG;AACd,mBAAS,GAAG;AAAA,QACd,WAAW,SAAS,aAAa,GAAG;AAClC,mBAAS,GAAG,IAAI,GAAG;AAAA,QACrB,OAAO;AACL,cAAI,OAAO,GAAG;AACd,mBAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,oBAAQA,OAAM,CAAC,EAAG;AAAA,UACpB;AACA,mBAAS;AAAA,QACX;AAAA,MACF,OAAO;AACL,cAAM,EAAE,MAAM,IAAI,aAAa,IAAI,EAAE;AACrC,iBAAS,MAAM;AAAA,MACjB;AAEA,YAAM,SAAS,GAAG,IAAI,GAAG;AACzB,YAAM,OAAO,GAAG,IAAI,GAAG,QAAQ;AAC/B,YAAM,OAAO,GAAG;AAEhB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,UAC3D,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,YACE,WAAW;AAAA,UACb;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAIA,QAAM,eAAe,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;AAEpE,WAAS,IAAI,GAAG,IAAI,aAAa,SAAS,GAAG,KAAK;AAChD,UAAM,QAAQ,aAAa,CAAC;AAC5B,UAAM,SAAS,aAAa,IAAI,CAAC;AACjC,UAAM,SAAS,IAAI,KAAK;AACxB,UAAM,UAAU,IAAI,MAAM;AAE1B,UAAM,SAAS,OAAO,IAAI,OAAO;AACjC,UAAM,SAAS,OAAO,IAAI,OAAO,SAAS;AAC1C,UAAM,OAAO,QAAQ;AACrB,UAAM,OAAO,QAAQ,IAAI,QAAQ,SAAS;AAE1C,QAAI,OAAO,SAAS,GAAG;AACrB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,UAC3D,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,YACE,WAAWL;AAAA,YACX,GAAI,GAAG,sBAAsB,EAAE,aAAaC,gBAAe,IAAI,CAAC;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AACrB,UAAM,SAAS,WAAW,IAAI,KAAK,EAAE;AAErC,UAAM,OAAO,QAAQ;AACrB,UAAM,SAAS,SAAS,QAAQ,UAAU,QAAQ;AAClD,UAAM,cAAc,SAAS,MAAM;AAGnC,aAAS,KAAK,EAAE,KAAK,GAAG,MAAM,QAAQ,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;AAG7D,QAAI,KAAK,EAAE;AACX,UAAMI,SAAQH,YAAW,KAAK,OAAO,IAAI;AACzC,IAAAG,OAAM,QAAQ,CAAC,MAAM,QAAQ;AAC3B,UAAI,MAAM,GAAG;AACX,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC;AAAA,QAClF;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK;AAAA,UACL,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,UACvB,IAAI,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO,IAAI;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,UACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,QACrC;AAAA,MACF;AACA,YAAM,KAAK;AAAA,IACb,CAAC;AAGD,UAAM,cACJ,KAAK,UACJ,KAAK,UAAU,CAAC,KAAK,OAAO,WAAW,GAAG,KAAK,CAAC,KAAK,OAAO,WAAW,GAAG,KAAK,CAAC,KAAK,OAAO,WAAW,GAAG,IACvG,KAAK,SACL,SACE,SACA;AAER,QAAI,aAAa;AACf,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,UACrB,IAAI,EAAE,IAAI,CAAC;AAAA,UACX;AAAA,UACA,SAAS,QAAQ,UAAU,QAAQ;AAAA,UACnC,EAAE,QAAQ,UAAU,QAAQ,SAAS;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC;AAC1E,QAAM,UAAU,WAAW,IAAI,SAAS,EAAE,IAAI;AAC9C,MAAI,eAAe;AACnB,MAAI,cAAc;AAElB,MAAI,GAAG,SAAS,GAAG,MAAM,SAAS,GAAG;AACnC,eAAW,QAAQ,GAAG,OAAO;AAC3B,WAAK,KAAK,WAAW,cAAc,KAAK,WAAW,WAAW,SAAS;AAErE,cAAM,QAAQ,QAAQ,IAAI,QAAQ,QAAQ;AAC1C,cAAM,QAAQ,QAAQ,IAAI;AAC1B,sBAAc,KAAK,IAAI,aAAa,YAAY,KAAK,MAAM,SAAS,EAAE,QAAQ,EAAE;AAEhF,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,MAAM,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,WAAW,QAAQ,WAAW;AAAA,YACtE,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAEA,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK,IAAI,QAAQ,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,CAAC,MAAM,IAAI,QAAQ,IAAI,QAAQ,QAAQ,CAAC,CAAC,IAAI,IAAI,QAAQ,IAAI,QAAQ,SAAS,CAAC,CAAC;AAAA,YACpH,QAAQ;AAAA,YACR;AAAA,YACA,EAAE,WAAW,cAAc;AAAA,UAC7B;AAAA,QACF;AAAA,MACF,WAAW,KAAK,WAAW,YAAY,KAAK,WAAW,UAAU,KAAK,WAAW,QAAQ;AAEvF,cAAM,QAAQ,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,UAAU;AACrD,cAAM,QAAQ,WAAW,QAAQ,SAAS;AAC1C,cAAM,QAAQ,OAAO,QAAQ;AAC7B,uBAAe,KAAK,IAAI,cAAc,EAAE;AAExC,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,MAAM,IAAI,KAAK,GAAG,IAAI,KAAK,GAAG,WAAW,QAAQ,WAAW;AAAA,YACtE,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAEA,cAAM,WAAW,QAAQ;AACzB,cAAM,SAAS,QAAQ;AACvB,cAAM,UAAU,QAAQ;AACxB,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,UAAU,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC;AAAA,YACtG,QAAQ;AAAA,YACR;AAAA,YACA,EAAE,WAAW,cAAc;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UACJ,CAAC;AACH,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AACrB,YAAQ,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC/B,QAAI,KAAK,QAAQ;AACf,cAAQ,KAAK,MAAM,IAAI,EAAE,QAAQ,EAAE;AACnC,cAAQ,QAAQ,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC7C,cAAQ,QAAQ,KAAK,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,IAC/C;AAAA,EACF;AAGA,QAAM,IAAIF,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AAEvB,QAAM,OAAO;AAAA,IACX,eAAeH,SAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,IAClN,eAAeC,eAAc,kBAAkB,CAAC,mBAAmB,EAAE,oBAAoB,KAAK,oFAAoF,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,IAC/N,eAAe,aAAa,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,IACzN,eAAe,aAAa,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,EAC3N;AAEA,QAAM,SAAS,OAAO,YAAY,MAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,GAAG,UAAU,MAAM,SAAS,IAAI,SAAS,YAAY;AACjH,QAAM,SAAS,OAAO,OAAO,QAAQ,WAAW;AAEhD,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAIO,IAAM,YAA8C;AAAA,EACzD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAuB,UAC9B,gBAAgB,IAAI,KAAK;AAC7B;;;ACxxBA,SAAS,SAAS,OAAuB;AACvC,MAAIK,KAAI;AACR,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,IAAAA,MAAK,MAAM,WAAW,CAAC;AACvB,IAAAA,KAAI,KAAK,KAAKA,IAAG,QAAU;AAAA,EAC7B;AACA,UAAQA,OAAM,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC;AAC3D;AAmBO,SAAS,gBAAgB,OAAmC;AACjE,QAAMC,SAAQ,MACX,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,MAAI;AACJ,MAAI;AACJ,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AACJ,QAAM,YAAsB,CAAC;AAC7B,QAAM,cAAwB,CAAC;AAE/B,aAAW,QAAQA,QAAO;AACxB,QAAI,iBAAiB,KAAK,IAAI,EAAG;AAEjC,UAAM,aAAa,KAAK,MAAM,iBAAiB;AAC/C,QAAI,YAAY;AACd,cAAQ,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACxD;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,MAAM,0BAA0B;AACxD,QAAI,YAAY;AACd,oBAAc,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AAC9D;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,MAAM,kDAAkD;AAClF,QAAI,cAAc;AAChB,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,MAAM,sBAAsB;AACvD,QAAI,eAAe;AACjB,iBAAW,OAAO,cAAc,CAAC,CAAC;AAClC,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM,0BAA0B;AACtD,QAAI,UAAU;AACZ,kBAAY,SAAS,CAAC,MAAM,OAAO,OAAO;AAC1C;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,MAAM,gBAAgB;AAC7C,QAAI,WAAW;AACb,YAAM,QAAQ,UAAU,CAAC,EAAG,MAAM,4BAA4B,KAAK,CAAC;AACpE,iBAAW,QAAQ,OAAO;AACxB,kBAAU,KAAK,KAAK,QAAQ,gBAAgB,EAAE,CAAC;AAAA,MACjD;AACA;AAAA,IACF;AAEA,gBAAY,KAAK,IAAI;AAAA,EACvB;AAEA,QAAM,YAAqC;AAAA,IACzC,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IACnC,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,EACnC;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO,2BAA2B,WAAW,OAAO,aAAa,SAAS;AAAA,EAC5E;AAEA,SAAO,wBAAwB,YAAY,KAAK,IAAI,GAAG,OAAO,aAAa,SAAS;AACtF;AAEA,SAAS,2BACP,WACA,OACA,aACA,WACoB;AAEpB,QAAM,SAAS,CAAC,GAAG,SAAS;AAC5B,UAAQ,OAAO,SAAU,OAAO,SAAS,OAAQ,KAAK,OAAO,SAAS,GAAG;AACvE,WAAO,KAAK,OAAO,OAAO,SAAS,CAAC,CAAE;AAAA,EACxC;AAUA,MAAI,eAA2B,OAAO,IAAI,CAAC,MAAM,SAAS;AAAA,IACxD,IAAI,QAAQ,GAAG;AAAA,IACf,MAAM,SAAS,QAAQ,IAAI,EAAE;AAAA,IAC7B;AAAA,IACA,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb,EAAE;AAEF,QAAM,WAAuB,CAAC,GAAG,YAAY;AAC7C,MAAI,WAAW;AAEf,SAAO,aAAa,SAAS,GAAG;AAC9B,UAAM,YAAwB,CAAC;AAC/B,aAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;AAC/C,YAAM,OAAO,aAAa,CAAC;AAC3B,YAAM,QAAQ,aAAa,IAAI,CAAC,KAAK;AACrC,YAAM,eAAe,SAAS,GAAG,KAAK,IAAI,IAAI,MAAM,IAAI,EAAE;AAC1D,YAAM,aAAuB;AAAA,QAC3B,IAAI,QAAQ,QAAQ,IAAI,IAAI,CAAC;AAAA,QAC7B,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,UAAU,CAAC,MAAM,KAAK;AAAA,MACxB;AACA,gBAAU,KAAK,UAAU;AACzB,eAAS,KAAK,UAAU;AAAA,IAC1B;AACA,mBAAe;AACf;AAAA,EACF;AAEA,QAAM,OAAO,aAAa,CAAC;AAG3B,QAAM,aAAa,oBAAI,IAAY;AACnC,QAAM,gBAAgB,oBAAI,IAAY;AAEtC,MAAI,aAAa;AAEf,UAAM,aAAa,SAAS;AAAA,MAC1B,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,eAAe,EAAE,OAAO,eAAe,EAAE,KAAK,WAAW,WAAW;AAAA,IACrG;AACA,QAAI,YAAY;AACd,UAAI,MAA4B;AAChC,iBAAW,IAAI,IAAI,EAAE;AAErB,aAAO,OAAO,IAAI,OAAO,KAAK,IAAI;AAChC,cAAM,WAAmB,IAAI;AAC7B,cAAM,SAA+B,SAAS;AAAA,UAAK,CAAC,MAClD,EAAE,SAAS,KAAK,CAAC,MAAyB,EAAE,OAAO,QAAQ;AAAA,QAC7D;AACA,YAAI,QAAQ;AACV,qBAAW,IAAI,OAAO,EAAE;AACxB,gBAAM,UAAU,OAAO,SAAS,KAAK,CAAC,MAAyB,EAAE,OAAO,QAAQ;AAChF,cAAI,QAAS,eAAc,IAAI,QAAQ,EAAE;AACzC,gBAAM;AAAA,QACR,OAAO;AACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAsB,SAAS,IAAI,CAAC,OAAO;AAAA,IAC/C,IAAI,EAAE;AAAA,IACN,MAAM,EAAE;AAAA,IACR,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,IACjC,QAAQ,EAAE;AAAA,IACV,GAAI,EAAE,OAAO,KAAK,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC3C,GAAI,WAAW,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IAChD,GAAI,cAAc,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAAA,IAC1D,UAAU,EAAE,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EACtC,EAAE;AAEF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,aAAa,CAAC,EAAG;AAAA,IAC9D,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AACF;AAEA,SAAS,wBACP,OACA,OACA,aACA,WACoB;AACpB,QAAMA,SAAQ,MAAM,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AACpE,QAAM,QAAsB,CAAC;AAE7B,aAAW,QAAQA,QAAO;AACxB,UAAM,SAAS,WAAW,KAAK,IAAI;AACnC,UAAM,SAAS,WAAW,KAAK,IAAI;AACnC,UAAM,QAAQ,KAAK,QAAQ,yBAAyB,EAAE;AAEtD,UAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,UAAM,OAAO,YAAY,IAAI,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK,IAAI;AAC/D,UAAM,UAAU,YAAY,IAAI,MAAM,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE,OAAO,OAAO,IAAI,CAAC;AAErG,UAAM,eAAe,KAAK,MAAM,WAAW;AAC3C,QAAI,KAAK;AACT,QAAI,OAAO;AACX,QAAI;AAEJ,QAAI,cAAc;AAChB,WAAK,KAAK,MAAM,GAAG,aAAa,KAAK,EAAE,KAAK;AAC5C,YAAM,UAAU,aAAa,CAAC,EAAG,KAAK;AACtC,UAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,cAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,eAAO,MAAM,CAAC,EAAG,KAAK;AACtB,eAAO,MAAM,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AAAA,MACpD,OAAO;AACL,eAAO;AAAA,MACT;AAAA,IACF,OAAO;AACL,YAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,WAAK,MAAM,CAAC;AACZ,aAAO,MAAM,CAAC,KAAK,SAAS,EAAE;AAAA,IAChC;AAEA,QAAI,CAAC,GAAI,MAAK,KAAK,MAAM,SAAS,CAAC;AAEnC,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACvB,QAAQ,UAAU,QAAQ,WAAW;AAAA,MACrC,GAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,MACjC,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,aAAa,CAAC,EAAG;AAAA,IAC9D,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACrC;AAAA,EACF;AACF;AAIA,IAAMC,YAAW;AACjB,IAAM,iBAAiB;AAEhB,SAAS,iBAAiB,IAAwB,OAAoC;AAC3F,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAC,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,MAAI,GAAG,MAAM,WAAW,GAAG;AACzB,UAAMC,SAAe;AAAA,MACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG;AAAA,MAC9C,YAAY,QAAQ;AAAA,MACpB,UAAU,CAAC;AAAA,IACb;AACA,WAAO,EAAE,OAAAA,QAAO,SAAS,CAAC,EAAE;AAAA,EAC9B;AAEA,QAAM,YACJ,GAAG,SAAS,SAAS,MAAM,QAC3B,GAAG,SAAS,QAAQ,MAAM,aAC1B,OAAO,GAAG,SAAS,SAAS,CAAC,MAAM;AAErC,QAAM,QAAQ,oBAAI,IAA+C;AACjE,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,YAAY,YAAY,KAAK,KAAK,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC;AACpF,UAAM,YAAY,KAAK,OAAQ,YAAY,KAAK,OAAO,SAAS,KAAK,IAAI,KAAM;AAC/E,UAAM,IAAI,YACN,KAAK;AAAA,MACH,YAAY,WAAW,YAAY,CAAC,EAAE,QAAQ;AAAA,MAC9C,YAAY,YAAY,WAAW,YAAY,CAAC,EAAE,QAAQ,KAAK;AAAA,MAC/D;AAAA,IACF,IACA,KAAK;AAAA,MACH,YAAY,WAAW,SAAS,EAAE,QAAQ;AAAA,MAC1C,YAAY,YAAY,WAAW,SAAS,EAAE,QAAQ,KAAK;AAAA,MAC3D;AAAA,IACF;AACJ,UAAMJ,KAAI,KAAK,OAAQ,YAAY,KAAK,KAAO,YAAY,KAAK;AAChE,UAAM,IAAI,KAAK,IAAI,EAAE,OAAO,GAAG,QAAQA,GAAE,CAAC;AAAA,EAC5C;AAEA,QAAM,SAA0B,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IACnD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACxB,QAAQ,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACzB,UAAU,EAAE;AAAA,EACd,EAAE;AAEF,QAAM,SAAS,WAAW,QAAQ;AAAA,IAChC,WAAY,GAAG,SAAS,WAAW,KAAqB;AAAA,IACxD,UAAU,YAAY,KAAK;AAAA,IAC3B,YAAY,YAAY,KAAK;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,GAAG,SAAS,OAAO,IAAI,WAAW,gBAAgB,KAAK;AACtE,QAAM,MAAM,CAAC,OAAe;AAC1B,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE;AAC7B,WAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,EACrE;AAEA,QAAM,WAA2B,CAAC;AAGlC,MAAI,SAAS,GAAG;AACd,aAAS;AAAA,MACP,EAAE;AAAA,QACA,OAAO,GAAG,SAAS,OAAO,CAAC;AAAA,QAC3B,OAAO,QAAQ;AAAA,QACf,SAAS,WAAW;AAAA,QACpB,WAAW,gBAAgB;AAAA,QAC3B,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,KAAK,IAAI,KAAK,EAAE;AACtB,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,KAAK,IAAI,GAAG;AAClB,YAAM,YAAY,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG;AACnD,YAAM,cAAc,KAAK,WAAW,WAAW;AAE/C,YAAM,SAAS,cAAc,QAAQ,UAAU,QAAQ;AACvD,YAAM,cAAc,cAAc,MAAM;AACxC,YAAM,SAAS,cAAc,iBAAiBE;AAE9C,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,UACjG;AAAA,UACA;AAAA,UACA,EAAE,WAAW,OAAO;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AAErB,QAAI,OAAO,QAAQ;AACnB,QAAI,SAAS,QAAQ;AACrB,QAAI,cAAc;AAElB,QAAI,KAAK,QAAQ;AACf,eAAS,QAAQ;AACjB,oBAAc;AAAA,IAChB;AACA,QAAI,KAAK,SAAS;AAChB,aAAO,QAAQ;AACf,eAAS,QAAQ;AACjB,oBAAc;AAAA,IAChB,WAAW,KAAK,gBAAgB;AAC9B,eAAS,QAAQ,aAAa,QAAQ;AACtC,oBAAc;AAAA,IAChB;AAGA,aAAS,KAAK,EAAE,KAAK,GAAG,MAAM,QAAQ,aAAa,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;AAG7E,UAAM,WAAW,YAAY,KAAK,KAAK,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,MAAM,GAAG,CAAC;AACzE,UAAM,QAAQ,KAAK,OACf,YACE,EAAE,IAAI,KACN,EAAE,IAAI,KACR,EAAE,IAAI,EAAE,SAAS,KAAK,YAAY,YAAY,IAAI,aAAa;AAEnE,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,QACrB,IAAI,KAAK;AAAA,QACT,YAAY,YAAY,IAAI;AAAA,QAC5B,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,KAAK,UAAU,KAAK,UAAU,SAAS,SAAS;AAAA,MAC9E;AAAA,IACF;AAGA,QAAI,KAAK,MAAM;AACb,YAAM,WAAW,YAAY,KAAK,OAAO,SAAS,KAAK,IAAI;AAC3D,YAAM,OAAO,YAAY,EAAE,IAAI,KAAK,EAAE,IAAI;AAC1C,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ,CAAC;AAAA,MACrF;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;AAAA,UACrB,IAAI,QAAQ,YAAY,KAAK,GAAG;AAAA,UAChC,YAAY,YAAY,IAAI,YAAY;AAAA,UACxC,QAAQ;AAAA,UACR,EAAE,QAAQ,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAGA,QAAI;AACJ,QAAIG,cAAa,QAAQ;AAEzB,QAAI,KAAK,QAAQ;AACf,kBAAY;AACZ,MAAAA,cAAa,QAAQ;AAAA,IACvB,WAAW,KAAK,SAAS;AACvB,kBAAY;AACZ,MAAAA,cAAa,QAAQ;AAAA,IACvB,WAAW,KAAK,gBAAgB;AAC9B,kBAAY;AACZ,MAAAA,cAAa,QAAQ,aAAa,QAAQ;AAAA,IAC5C;AAEA,QAAI,WAAW;AACb,YAAM,KAAK,YAAY,WAAW,YAAY,CAAC,EAAE,QAAQ;AACzD,YAAM,KAAK;AACX,YAAM,KAAK,EAAE,IAAI,EAAE,QAAQ,KAAK;AAChC,YAAM,KAAK,EAAE,IAAI,KAAK;AAEtB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,GAAG,QAAQ,GAAG;AAAA,UACrD,QAAQ;AAAA,UACRA;AAAA,UACA;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA,IAAI,KAAK,KAAK,CAAC;AAAA,UACf,IAAI,KAAK,KAAK,KAAK,YAAY,KAAK,IAAI;AAAA,UACxC,YAAY;AAAA,UACZA;AAAA,UACA,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,IAAIF,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AAEvB,QAAM,OAAO;AAAA,IACX,eAAeD,SAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,IACpN,eAAe,cAAc,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,EAC1N;AAEA,QAAM,UAA+F,CAAC;AACtG,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AACrB,YAAQ,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC/B,QAAI,KAAK,KAAM,SAAQ,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,EAC5D;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,KAAK,GAAG,QAAQ,OAAO,OAAO,SAAS,MAAM,EAAE;AAAA,MAC3F,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,aAAgD;AAAA,EAC3D,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAwB,UAAuC,iBAAiB,IAAI,KAAK;AACpG;;;AC7dO,SAAS,aAAa,OAAgC;AAC3D,QAAMI,SAAQ,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAEtE,MAAI;AACJ,MAAI;AACJ,QAAM,YAA2B,CAAC;AAClC,QAAM,SAAqB,CAAC;AAC5B,QAAM,aAA6B,CAAC;AAEpC,MAAI,eAAqE;AAEzE,aAAW,QAAQA,QAAO;AACxB,QAAI,cAAc,KAAK,IAAI,EAAG;AAE9B,UAAM,aAAa,KAAK,MAAM,iBAAiB;AAC/C,QAAI,YAAY;AACd,cAAQ,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACxD;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM,eAAe;AAC3C,QAAI,UAAU;AACZ,YAAM,SAAS,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE,IAAI;AACrE;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM,sDAAsD;AAClF,QAAI,UAAU;AACZ,YAAM,KAAK,SAAS,CAAC;AACrB,YAAM,OAAO,SAAS,CAAC,MAAM,OAAO,cAAc,uBAAuB;AACzE,YAAM,UAAU,SAAS,CAAC,IAAI,SAAS,CAAC,EAAE,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,IAAI,CAAC;AAC7F,gBAAU,KAAK;AAAA,QACb;AAAA,QACA;AAAA,QACA,MAAM,QAAQ,SAAS,IAAI,UAAU,CAAC,MAAM,MAAM,IAAI;AAAA,QACtD,GAAI,GAAG,YAAY,EAAE,SAAS,KAAK,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,MAClE,CAAC;AACD;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,MAAM,kCAAkC;AAChE,QAAI,YAAY;AACd,UAAI,aAAc,QAAO,KAAK,YAAY;AAC1C,qBAAe;AAAA,QACb,IAAI,WAAW,CAAC;AAAA,QAChB,OAAO,WAAW,CAAC,KAAK,SAAS,WAAW,CAAC,CAAC;AAAA,QAC9C,MAAM,CAAC;AAAA,MACT;AACA;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,IAAI,KAAK,cAAc;AACxC,aAAO,KAAK,YAAY;AACxB,qBAAe;AACf;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM,iDAAiD;AAC7E,QAAI,YAAY,cAAc;AAC5B,mBAAa,KAAK,KAAK;AAAA,QACrB,IAAI,SAAS,CAAC;AAAA,QACd,OAAO,SAAS,CAAC,KAAK;AAAA,QACtB,GAAI,SAAS,CAAC,IAAI,EAAE,MAAM,SAAS,CAAC,EAAE,IAAI,CAAC;AAAA,MAC7C,CAAC;AACD;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,MAAM,+CAA+C;AAC7E,QAAI,YAAY;AACd,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM,WAAW,CAAC;AAAA,QAClB,IAAI,WAAW,CAAC;AAAA,QAChB,GAAI,WAAW,CAAC,IAAI,EAAE,OAAO,WAAW,CAAC,EAAE,IAAI,CAAC;AAAA,MAClD,CAAC;AACD;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,MAAM,uDAAuD;AACvF,QAAI,cAAc;AAChB,iBAAW,KAAK;AAAA,QACd,MAAM;AAAA,QACN,MAAM,aAAa,CAAC;AAAA,QACpB,IAAI,aAAa,CAAC;AAAA,QAClB,GAAI,aAAa,CAAC,IAAI,EAAE,OAAO,aAAa,CAAC,EAAE,IAAI,CAAC;AAAA,MACtD,CAAC;AACD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAc,QAAO,KAAK,YAAY;AAG1C,MAAI,UAAU,WAAW,GAAG;AAC1B,cAAU;AAAA,MACR,EAAE,IAAI,UAAU,MAAM,mBAAmB,MAAM,CAAC,MAAM,MAAM,IAAI,EAAE;AAAA,MAClE,EAAE,IAAI,aAAa,MAAM,sBAAsB,MAAM,CAAC,KAAK,MAAM,IAAI,GAAG,aAAa,KAAK;AAAA,IAC5F;AAAA,EACF;AACA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,MACL,EAAE,IAAI,MAAM,OAAO,yBAAyB,MAAM,CAAC,EAAE,IAAI,QAAQ,OAAO,QAAQ,GAAG,EAAE,IAAI,QAAQ,OAAO,SAAS,CAAC,EAAE;AAAA,MACpH,EAAE,IAAI,MAAM,OAAO,yBAAyB,MAAM,CAAC,EAAE,IAAI,QAAQ,OAAO,QAAQ,GAAG,EAAE,IAAI,QAAQ,OAAO,SAAS,GAAG,EAAE,IAAI,QAAQ,OAAO,SAAS,CAAC,EAAE;AAAA,IACvJ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC/B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,cAAc,IAAqB,OAAoC;AACrF,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAC,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,QAAM,WAA2B,CAAC;AAClC,QAAM,UAA+F,CAAC;AAEtG,QAAM,SAAS,GAAG,QAAQ,WAAW,gBAAgB,KAAK;AAC1D,MAAI,OAAO,SAAS;AAEpB,QAAM,aAAa;AACnB,QAAM,eAAe,aAAa,SAAS;AAG3C,MAAI,GAAG,OAAO;AACZ,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG;AAAA,QACH,aAAa;AAAA,QACb,SAAS,WAAW;AAAA,QACpB,WAAW,gBAAgB;AAAA,QAC3B,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,OAAO;AACb,QAAM,OAAO;AAEb,WAAS;AAAA,IACP,EAAE;AAAA,MACA,EAAE,GAAG,QAAQ,GAAG,MAAM,OAAO,cAAc,QAAQ,KAAK;AAAA,MACxD,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,IAAI,EAAE;AAAA,IACV;AAAA,EACF;AAEA,WAAS;AAAA,IACP,EAAE;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,EAAE,QAAQ,OAAO;AAAA,IACnB;AAAA,EACF;AAGA,MAAI,YAAY,SAAS;AACzB,MAAI,GAAG,KAAK;AACV,UAAM,OAAO;AACb,UAAM,OAAO;AACb,UAAM,SAAS,EAAE,GAAG,WAAW,GAAG,OAAO,IAAI,OAAO,MAAM,QAAQ,KAAK;AACvE,aAAS,KAAK,EAAE,KAAK,QAAQ,QAAQ,YAAY,QAAQ,WAAW,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACnF,aAAS;AAAA,MACP,EAAE,KAAK,WAAW,OAAO,IAAI,OAAO,GAAG,OAAO,IAAI,IAAI,WAAW,QAAQ,MAAM;AAAA,QAC7E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,aAAS;AAAA,MACP,EAAE,KAAK,eAAe,OAAO,IAAI,OAAO,GAAG,OAAO,IAAI,IAAI,YAAY,GAAG,QAAQ,WAAW;AAAA,QAC1F,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,YAAQ,KAAK,IAAI,EAAE,QAAQ,OAAO;AAClC,iBAAa,OAAO;AAAA,EACtB;AAGA,QAAM,YAAY,KAAK,IAAI,MAAM,eAAe,YAAY,SAAS,MAAM,GAAG,UAAU,MAAM;AAC9F,QAAM,WAAW,oBAAI,IAAqE;AAE1F,aAAW,MAAM,GAAG,WAAW;AAC7B,UAAM,QAAQ,EAAE,GAAG,WAAW,GAAG,OAAO,IAAI,OAAO,WAAW,QAAQ,GAAG;AACzE,aAAS,IAAI,GAAG,IAAI,KAAK;AACzB,YAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,MAAM;AAEjC,UAAM,SAAS,GAAG,cAAc,QAAQ,YAAY,QAAQ;AAC5D,aAAS,KAAK,EAAE,KAAK,OAAO,QAAQ,YAAY,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEvE,aAAS;AAAA,MACP,EAAE,KAAK,GAAG,MAAM,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,YAAY,GAAG,QAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,IACtF;AAGA,UAAM,SAAS,MAAM,QAAQ,MAAM,GAAG,KAAK;AAC3C,OAAG,KAAK,QAAQ,CAAC,GAAG,QAAQ;AAC1B,YAAM,KAAK,MAAM,IAAI,IAAI,MAAM;AAC/B,YAAM,KAAK,MAAM,IAAI;AACrB,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,GAAG,GAAG,QAAQ,SAAS,QAAQ,QAAQ,GAAG;AAAA,UACrF,IAAI;AAAA,QACN,CAAC;AAAA,MACH;AACA,eAAS;AAAA,QACP,EAAE,KAAK,GAAG,KAAK,QAAQ,GAAG,KAAK,IAAI,YAAY,GAAG,QAAQ,MAAM;AAAA,UAC9D,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,iBAAa,YAAY;AAAA,EAC3B;AAEA,UAAQ,OAAO;AAGf,QAAM,aAAa,oBAAI,IAAqE;AAC5F,QAAM,WAAW,oBAAI,IAAqE;AAE1F,aAAW,OAAO,GAAG,QAAQ;AAC3B,UAAM,OAAO;AACb,UAAM,OAAO;AACb,UAAM,SAAS,EAAE,GAAG,QAAQ,GAAG,MAAM,OAAO,cAAc,QAAQ,KAAK;AACvE,eAAW,IAAI,IAAI,IAAI,MAAM;AAC7B,YAAQ,IAAI,EAAE,IAAI,EAAE,QAAQ,OAAO;AAEnC,aAAS,KAAK,EAAE,KAAK,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAG7E,UAAM,OAAO,YAAY,IAAI,OAAO,SAAS,EAAE,QAAQ;AACvD,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,SAAS,IAAI,GAAG,OAAO,IAAI,OAAO,MAAM,QAAQ,GAAG;AAAA,QACxD,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,IAAI,OAAO,SAAS,KAAK,OAAO,GAAG,OAAO,IAAI,YAAY,GAAG,QAAQ,WAAW;AAAA,QACrF,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,UAAM,YAAY,SAAS,OAAO;AAClC,UAAM,aAAa,gBAAgB,YAAY,UAAU;AACzD,UAAM,OAAO,KAAK,IAAI,KAAK,aAAa,KAAK,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,EAAE;AAEzE,QAAI,KAAK,QAAQ,CAAC,KAAK,QAAQ;AAC7B,YAAM,KAAK,YAAY,OAAO,OAAO;AACrC,YAAM,KAAK,OAAO;AAClB,YAAM,OAAO,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,MAAM,QAAQ,GAAG;AACrD,eAAS,IAAI,IAAI,IAAI,IAAI;AACzB,eAAS,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,IAAI;AACxC,cAAQ,IAAI,EAAE,IAAI,EAAE,QAAQ,KAAK;AACjC,cAAQ,GAAG,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,KAAK;AAEhD,eAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,YAAY,QAAQ,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/E,eAAS;AAAA,QACP,EAAE,KAAK,QAAQ,IAAI,KAAK,KAAK,KAAK,OAAO,GAAG,KAAK,IAAI,WAAW,QAAQ,MAAM;AAAA,UAC5E,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA,IAAI,QAAQ;AAAA,UACZ,KAAK,OAAO;AAAA,UACZ,KAAK;AAAA,UACL,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,EAAE,QAAQ,SAAS;AAAA,QACrB;AAAA,MACF;AAAA,IACF,CAAC;AAED,YAAQ,OAAO;AAAA,EACjB;AAGA,QAAM,iBAAiB;AACvB,QAAM,mBAAmB;AAEzB,aAAW,MAAM,GAAG,YAAY;AAC9B,QAAI,GAAG,SAAS,SAAS;AACvB,YAAM,UAAU,SAAS,IAAI,GAAG,IAAI,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,IAAI,QAAQ;AAC3F,YAAM,QAAQ,WAAW,IAAI,GAAG,EAAE,KAAK,WAAW,IAAI,IAAI;AAC1D,UAAI,WAAW,OAAO;AACpB,cAAM,SAAS,QAAQ,IAAI,QAAQ,QAAQ;AAC3C,cAAM,SAAS,QAAQ,IAAI,QAAQ;AACnC,cAAM,OAAO,MAAM,IAAI;AACvB,cAAM,OAAO,MAAM;AAEnB,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,YAC3D,QAAQ;AAAA,YACR;AAAA,YACA,EAAE,WAAW,gBAAgB,MAAM,MAAM;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,GAAG,SAAS,WAAW;AAChC,YAAM,UAAU,SAAS,IAAI,GAAG,IAAI,KAAK,WAAW,IAAI,GAAG,IAAI;AAC/D,YAAM,QAAQ,SAAS,IAAI,GAAG,EAAE,KAAK,WAAW,IAAI,GAAG,EAAE;AACzD,UAAI,WAAW,OAAO;AACpB,cAAM,SAAS,QAAQ,IAAI,QAAQ,QAAQ;AAC3C,cAAM,SAAS,QAAQ,IAAI,QAAQ;AACnC,cAAM,OAAO,MAAM,IAAI,MAAM,QAAQ;AACrC,cAAM,OAAO,MAAM;AAEnB,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,YAC3D,QAAQ,aAAa,QAAQ;AAAA,YAC7B;AAAA,YACA,EAAE,WAAW,iBAAiB;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAIA,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AAEvB,QAAM,OAAO;AAAA,IACX,eAAe,cAAc,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,IACxN,eAAe,gBAAgB,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,aAAa,QAAQ,OAAO;AAAA,EACjP;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,YAAY,QAAQ,OAAO,OAAO,MAAM,EAAE;AAAA,MACxE,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,UAA0C;AAAA,EACrD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAqB,UAAuC,cAAc,IAAI,KAAK;AAC9F;;;AC9XO,SAAS,kBAAkB,OAAqC;AACrE,QAAMC,SAAQ,MAAM,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AACpE,MAAI;AACJ,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AACJ,QAAM,gBAAoD,CAAC;AAE3D,aAAW,QAAQA,QAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,mBAAmB,KAAK,OAAO,EAAG;AAEtC,UAAM,aAAa,QAAQ,MAAM,iBAAiB;AAClD,QAAI,YAAY;AACd,cAAQ,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACxD;AAAA,IACF;AAEA,UAAM,eAAe,QAAQ,MAAM,kDAAkD;AACrF,QAAI,cAAc;AAChB,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,gBAAgB,QAAQ,MAAM,sBAAsB;AAC1D,QAAI,eAAe;AACjB,iBAAW,OAAO,cAAc,CAAC,CAAC;AAClC,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,WAAW,QAAQ,MAAM,0BAA0B;AACzD,QAAI,UAAU;AACZ,kBAAY,SAAS,CAAC,MAAM,OAAO,OAAO;AAC1C;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,OAAO,MAAM;AACjC,kBAAc,KAAK,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAAA,EAC9C;AAEA,QAAM,QAA4B,CAAC;AACnC,QAAMC,SAA0C,CAAC;AAEjD,gBAAc,QAAQ,CAAC,MAAM,QAAQ;AACnC,UAAM,KAAK,MAAM,MAAM,CAAC;AACxB,WAAOA,OAAM,SAAS,KAAKA,OAAMA,OAAM,SAAS,CAAC,EAAG,UAAU,KAAK,QAAQ;AACzE,MAAAA,OAAM,IAAI;AAAA,IACZ;AACA,UAAM,SAASA,OAAM,SAAS,IAAIA,OAAMA,OAAM,SAAS,CAAC,IAAI;AAE5D,QAAI,OAAO,KAAK;AAChB,QAAI;AACJ,QAAI,OAAyB;AAC7B,QAAI;AAGJ,UAAM,YAAY,KAAK,MAAM,WAAW;AACxC,QAAI,WAAW;AACb,YAAM,UAAU,UAAU,CAAC;AAC3B,YAAM,YAAY,QAAQ,MAAM,+BAA+B;AAC/D,UAAI,WAAW;AACb,iBAAS,UAAU,CAAC,EAAG,YAAY;AAAA,MACrC;AACA,aAAO,KAAK,QAAQ,WAAW,EAAE,EAAE,KAAK;AAAA,IAC1C;AAGA,QAAI,+BAA+B,KAAK,IAAI,GAAG;AAC7C,aAAO;AACP,aAAO,KAAK,QAAQ,+BAA+B,EAAE;AAAA,IACvD,WAAW,sBAAsB,KAAK,IAAI,GAAG;AAC3C,aAAO;AACP,aAAO,KAAK,QAAQ,wBAAwB,EAAE;AAAA,IAChD,WAAW,wBAAwB,KAAK,IAAI,GAAG;AAC7C,aAAO;AACP,aAAO,KAAK,QAAQ,0BAA0B,EAAE;AAAA,IAClD,WAAW,8CAA8C,KAAK,IAAI,GAAG;AACnE,aAAO;AACP,YAAM,OAAO,KAAK,MAAM,QAAQ;AAChC,sBAAgB,OAAO,KAAK,CAAC,IAAI;AACjC,aAAO,KAAK,QAAQ,cAAc,EAAE;AAAA,IACtC,WAAW,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AACrD,aAAO;AACP,aAAO,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK;AAAA,IAChC,WAAW,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AACrD,aAAO;AACP,aAAO,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK;AAAA,IAChC,WAAW,gBAAgB,KAAK,IAAI,GAAG;AACrC,aAAO;AACP,aAAO,KAAK,QAAQ,kBAAkB,EAAE;AAAA,IAC1C,WAAW,aAAa,KAAK,IAAI,GAAG;AAClC,aAAO;AACP,aAAO,KAAK,QAAQ,eAAe,EAAE;AAAA,IACvC;AAEA,UAAM,OAAyB;AAAA,MAC7B;AAAA,MACA,OAAO,KAAK,QAAQ,kBAAkB,EAAE,EAAE,KAAK,MAAM,SAAS,aAAa,MAAM,SAAS,aAAa,WAAM;AAAA,MAC7G;AAAA,MACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3B,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,MACzC,UAAU,CAAC;AAAA,IACb;AAEA,UAAM,KAAK,IAAI;AAEf,QAAI,QAAQ;AACV,YAAM,QAAQ,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO,EAAE;AAClD,UAAI,OAAO;AACT,QAAC,MAAM,SAAsB,KAAK,EAAE;AAAA,MACtC;AAAA,IACF;AAEA,IAAAA,OAAM,KAAK,EAAE,QAAQ,KAAK,QAAQ,GAAG,CAAC;AAAA,EACxC,CAAC;AAED,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU;AAAA,MACR,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MACzB,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MACnC,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,MAC7C,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACnC;AAAA,IACA,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAIA,IAAMC,YAAW;AAEV,SAAS,mBAAmB,IAA0B,OAAoC;AAC/F,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAC,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,MAAI,GAAG,MAAM,WAAW,GAAG;AACzB,UAAMC,SAAe;AAAA,MACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG;AAAA,MAC9C,YAAY,QAAQ;AAAA,MACpB,UAAU,CAAC;AAAA,IACb;AACA,WAAO,EAAE,OAAAA,QAAO,SAAS,CAAC,EAAE;AAAA,EAC9B;AAEA,QAAM,YACJ,GAAG,SAAS,SAAS,MAAM,QAC3B,GAAG,SAAS,QAAQ,MAAM,aAC1B,OAAO,GAAG,SAAS,SAAS,CAAC,MAAM;AAErC,QAAM,QAAQ,oBAAI,IAA+C;AACjE,aAAW,QAAQ,GAAG,OAAO;AAC3B,QAAI,IAAI,YAAY,KAAK,OAAO,YAAY,YAAY,IAAI,EAAE,SAAS,YAAY,KAAK;AACxF,QAAIC,MAAK,YAAY,YAAY,SAAS,YAAY,KAAK;AAE3D,QAAI,KAAK,SAAS,cAAc,KAAK,SAAS,cAAc,KAAK,SAAS,YAAY;AACpF,UAAI,KAAK,IAAI,GAAG,YAAY,KAAK,EAAE;AACnC,MAAAA,KAAI,YAAY,KAAK;AAAA,IACvB,WAAW,KAAK,SAAS,aAAa;AACpC,UAAI,KAAK,IAAI,GAAG,YAAY,KAAK,EAAE;AACnC,MAAAA,KAAI,YAAY,KAAK;AAAA,IACvB,OAAO;AACL,UAAI,KAAK,IAAI,GAAG,YAAY,KAAK,EAAE;AACnC,MAAAA,KAAI,YAAY,KAAK;AAAA,IACvB;AAEA,QAAI,KAAK,OAAQ,MAAK,YAAY,KAAK;AAEvC,UAAM,IAAI,KAAK,IAAI,EAAE,OAAO,GAAG,QAAQA,GAAE,CAAC;AAAA,EAC5C;AAEA,QAAM,SAA0B,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IACnD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACxB,QAAQ,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACzB,UAAU,EAAE;AAAA,EACd,EAAE;AAEF,QAAM,SAAS,WAAW,QAAQ;AAAA,IAChC,WAAY,GAAG,SAAS,WAAW,KAAqB;AAAA,IACxD,UAAU,YAAY,KAAK;AAAA,IAC3B,YAAY,YAAY,KAAK;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,GAAG,QAAQ,WAAW,gBAAgB,KAAK;AAC1D,QAAM,MAAM,CAAC,OAAe;AAC1B,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE;AAC7B,WAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,EACrE;AAEA,QAAM,WAA2B,CAAC;AAGlC,MAAI,GAAG,OAAO;AACZ,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG;AAAA,QACH,OAAO,QAAQ;AAAA,QACf,SAAS,WAAW;AAAA,QACpB,WAAW,gBAAgB;AAAA,QAC3B,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,KAAK,IAAI,KAAK,EAAE;AACtB,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,KAAK,IAAI,GAAG;AAClB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,UACjG,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,WAAWH,UAAS;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AAErB,QAAI,OAAO,QAAQ;AACnB,QAAI,SAAS,QAAQ;AACrB,QAAI,KAAK;AAET,QAAI,KAAK,SAAS,YAAY;AAC5B,eAAS,QAAQ;AACjB,WAAK;AAAA,IACP,WAAW,KAAK,SAAS,YAAY;AACnC,eAAS,QAAQ,aAAa,QAAQ;AACtC,WAAK;AAAA,IACP,WAAW,KAAK,SAAS,YAAY;AACnC,eAAS,QAAQ;AACjB,WAAK;AAAA,IACP,WAAW,KAAK,SAAS,aAAa;AACpC,WAAK,EAAE,SAAS;AAChB,eAAS,QAAQ;AAAA,IACnB,WAAW,KAAK,SAAS,aAAa;AACpC,WAAK;AACL,eAAS,QAAQ,aAAa,QAAQ;AAAA,IACxC;AAEA,aAAS,KAAK,EAAE,KAAK,GAAG,MAAM,QAAQ,KAAK,EAAE,GAAG,CAAC,CAAC;AAGlD,QAAI,SAAS;AACb,QAAI,KAAK,SAAS,WAAY,UAAS;AAAA,aAC9B,KAAK,SAAS,WAAY,UAAS;AAAA,aACnC,KAAK,SAAS,WAAY,UAAS;AAE5C,UAAM,cAAc,GAAG,MAAM,GAAG,KAAK,KAAK;AAC1C,UAAM,QAAQ,KAAK,SAAS,EAAE,KAAK,EAAE,QAAQ,MAAM,IAAI,EAAE,IAAI,EAAE,QAAQ;AACvE,UAAM,QAAQ,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO;AAE1C,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA,IAAI,KAAK;AAAA,QACT,IAAI,KAAK;AAAA,QACT;AAAA,QACA,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,KAAK,SAAS,YAAY,KAAK,SAAS,cAAc,WAAW,OAAO;AAAA,MACtG;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ;AACf,UAAI,OAAO;AACX,UAAI,YAAY,QAAQ;AAExB,UAAI,KAAK,WAAW,WAAW;AAC7B,eAAO;AACP,oBAAY;AAAA,MACd,WAAW,KAAK,WAAW,WAAW;AACpC,eAAO;AACP,oBAAY;AAAA,MACd,WAAW,KAAK,WAAW,WAAW;AACpC,eAAO;AACP,oBAAY;AAAA,MACd,OAAO;AACL,eAAO;AACP,oBAAY,QAAQ;AAAA,MACtB;AAEA,YAAM,SAAS,EAAE,IAAI,EAAE,QAAQ;AAC/B,YAAM,SAAS,EAAE,IAAI,EAAE,SAAS;AAEhC,eAAS;AAAA,QACP,EAAE,OAAO,EAAE,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,QAAQ,YAAY,WAAW,GAAG;AAAA,MAC1E;AACA,eAAS;AAAA,QACP,EAAE,KAAK,MAAM,QAAQ,SAAS,GAAG,WAAW,WAAW,EAAE,QAAQ,UAAU,QAAQ,OAAO,CAAC;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AAGA,QAAM,IAAIC,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AAEvB,QAAM,OAAO;AAAA,IACX,eAAeD,SAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,EACtN;AAEA,QAAM,UAA+F,CAAC;AACtG,aAAW,QAAQ,GAAG,OAAO;AAC3B,YAAQ,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK,EAAE,EAAE;AAAA,EAC5C;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,KAAK,GAAG,QAAQ,OAAO,OAAO,SAAS,MAAM,EAAE;AAAA,MAC3F,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,eAAoD;AAAA,EAC/D,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAA0B,UAAuC,mBAAmB,IAAI,KAAK;AACxG;;;ACvVO,SAAS,cAAc,OAAiC;AAC7D,QAAMI,SAAQ,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAEtE,MAAI;AACJ,MAAI,WAAW;AACf,MAAI,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI;AAC1C,MAAI,UAAU;AACd,MAAI;AACJ,MAAI;AACJ,QAAM,YAAyB,CAAC;AAChC,QAAM,cAAwB,CAAC;AAE/B,aAAW,QAAQA,QAAO;AACxB,QAAI,eAAe,KAAK,IAAI,EAAG;AAE/B,UAAM,aAAa,KAAK,MAAM,iBAAiB;AAC/C,QAAI,YAAY;AACd,cAAQ,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACxD;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,MAAM,kDAAkD;AAClF,QAAI,cAAc;AAChB,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,gBAAgB,KAAK,MAAM,sBAAsB;AACvD,QAAI,eAAe;AACjB,iBAAW,OAAO,cAAc,CAAC,CAAC;AAClC,gBAAU;AACV;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM,0BAA0B;AACtD,QAAI,UAAU;AACZ,kBAAY,SAAS,CAAC,MAAM,OAAO,OAAO;AAC1C;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,MAAM,oBAAoB;AAChD,QAAI,UAAU;AACZ,iBAAW,KAAK,IAAI,GAAG,OAAO,SAAS,CAAC,CAAC,CAAC;AAC1C;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,MAAM,kDAAkD;AACjF,QAAI,aAAa;AACf,eAAS;AAAA,QACP,GAAG,OAAO,YAAY,CAAC,CAAC;AAAA,QACxB,GAAG,OAAO,YAAY,CAAC,CAAC;AAAA,QACxB,GAAG,OAAO,YAAY,CAAC,CAAC;AAAA,QACxB,GAAG,OAAO,YAAY,CAAC,CAAC;AAAA,MAC1B;AACA;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,MAAM,0FAA0F;AACzH,QAAI,aAAa;AACf,gBAAU,KAAK;AAAA,QACb,GAAG,OAAO,YAAY,CAAC,CAAC;AAAA,QACxB,GAAG,OAAO,YAAY,CAAC,CAAC;AAAA,QACxB,GAAI,YAAY,CAAC,IAAI,EAAE,OAAO,YAAY,CAAC,EAAE,IAAI,CAAC;AAAA,MACpD,CAAC;AACD;AAAA,IACF;AAEA,gBAAY,KAAK,IAAI;AAAA,EACvB;AAEA,QAAM,YAAqC;AAAA,IACzC,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,IACnC,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,EACnC;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO,yBAAyB,WAAW,QAAQ,UAAU,OAAO,SAAS;AAAA,EAC/E;AAEA,SAAO,sBAAsB,YAAY,KAAK,IAAI,GAAG,QAAQ,OAAO,SAAS;AAC/E;AAEA,SAAS,yBACP,QACA,QACA,UACA,OACA,WACkB;AASlB,MAAI,YAAY;AAEhB,WAAS,UAAU,KAAqD,KAAkB,OAAe,OAA6B;AACpI,UAAM,KAAK,KAAK,WAAW;AAC3B,QAAI,IAAI,UAAU,YAAY,SAAS,GAAG;AACxC,aAAO,EAAE,IAAI,OAAO,GAAG,KAAK,KAAK,UAAU,CAAC,EAAE;AAAA,IAChD;AAEA,UAAM,KAAK,IAAI,IAAI;AACnB,UAAM,KAAK,IAAI,IAAI;AACnB,UAAM,QAAQ,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG;AACjD,UAAM,QAAQ,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG;AACtD,UAAM,QAAQ,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG;AACtD,UAAM,QAAQ,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG;AAE3D,UAAM,QAAQ,CAAC,GAAc,MAC3B,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;AAE/D,UAAM,QAAQ,IAAI,OAAO,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAC/C,UAAM,QAAQ,IAAI,OAAO,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAC/C,UAAM,QAAQ,IAAI,OAAO,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAC/C,UAAM,QAAQ,IAAI,OAAO,CAAC,MAAM,MAAM,GAAG,KAAK,CAAC;AAE/C,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH,KAAK,CAAC;AAAA,MACN,UAAU;AAAA,QACR,UAAU,OAAO,OAAO,GAAG,KAAK,OAAO,QAAQ,CAAC;AAAA,QAChD,UAAU,OAAO,OAAO,GAAG,KAAK,OAAO,QAAQ,CAAC;AAAA,QAChD,UAAU,OAAO,OAAO,GAAG,KAAK,OAAO,QAAQ,CAAC;AAAA,QAChD,UAAU,OAAO,OAAO,GAAG,KAAK,OAAO,QAAQ,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO,UAAU,QAAQ,QAAQ,QAAQ,CAAC;AAChD,QAAM,YAAwB,CAAC;AAE/B,WAASC,SAAQ,MAAoB;AACnC,cAAU,KAAK;AAAA,MACb,IAAI,KAAK;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,QAAQ,KAAK;AAAA,MACb,UAAU,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,IACzC,CAAC;AACD,eAAW,KAAK,KAAK,SAAU,CAAAA,SAAQ,CAAC;AAAA,EAC1C;AAEA,EAAAA,SAAQ,IAAI;AAEZ,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,aAAa,CAAC,EAAG;AAAA,IAC9D,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT;AACF;AAEA,SAAS,sBACP,OACA,QACA,OACA,WACkB;AAClB,QAAMD,SAAQ,MAAM,MAAM,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AACpE,QAAM,QAAoB,CAAC;AAE3B,aAAW,QAAQA,QAAO;AACxB,UAAM,QAAQ,KAAK,QAAQ,yBAAyB,EAAE;AACtD,UAAM,WAAW,MAAM,QAAQ,IAAI;AACnC,UAAM,OAAO,YAAY,IAAI,MAAM,MAAM,GAAG,QAAQ,EAAE,KAAK,IAAI;AAC/D,UAAM,UAAU,YAAY,IAAI,MAAM,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE,OAAO,OAAO,IAAI,CAAC;AAErG,UAAM,eAAe,KAAK,MAAM,WAAW;AAC3C,QAAI,KAAK;AACT,QAAI,QAAQ;AACZ,QAAI,cAAc;AAChB,WAAK,KAAK,MAAM,GAAG,aAAa,KAAK,EAAE,KAAK;AAC5C,cAAQ,aAAa,CAAC,EAAG,KAAK;AAAA,IAChC,OAAO;AACL,YAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,WAAK,MAAM,CAAC;AACZ,cAAQ,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK;AAAA,IACtC;AAEA,QAAI,CAAC,GAAI,MAAK,MAAM,MAAM,SAAS,CAAC;AAEpC,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,CAAC;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,aAAa,CAAC,EAAG;AAAA,IAC9D,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAIA,IAAME,aAAW;AAEV,SAAS,eAAe,IAAsB,OAAoC;AACvF,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAC,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,MAAI,GAAG,MAAM,WAAW,GAAG;AACzB,UAAMC,SAAe;AAAA,MACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG;AAAA,MAC9C,YAAY,QAAQ;AAAA,MACpB,UAAU,CAAC;AAAA,IACb;AACA,WAAO,EAAE,OAAAA,QAAO,SAAS,CAAC,EAAE;AAAA,EAC9B;AAEA,QAAM,YACJ,GAAG,SAAS,SAAS,MAAM,QAC3B,GAAG,SAAS,QAAQ,MAAM,aAC1B,OAAO,GAAG,SAAS,SAAS,CAAC,MAAM;AAGrC,QAAM,QAAQ,oBAAI,IAA+C;AACjE,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,SAAS,KAAK,OAAO,SAAS,IAAI,KAAK,OAAO,IAAI,CAAC,OAAO,GAAG,SAAS,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,IAAI;AAC9G,UAAM,QAAQ,YAAY,KAAK,OAAO,SAAS,EAAE,SAAS,YAAY,KAAK;AAC3E,UAAM,MAAM,SAAS,YAAY,QAAQ,YAAY,CAAC,EAAE,SAAS,YAAY,KAAK,MAAM;AACxF,UAAM,IAAI,KAAK,IAAI,OAAO,KAAK,YAAY,KAAK,EAAE;AAClD,UAAMC,KAAI,SAAU,YAAY,KAAK,KAAO,YAAY,KAAK;AAC7D,UAAM,IAAI,KAAK,IAAI,EAAE,OAAO,GAAG,QAAQA,GAAE,CAAC;AAAA,EAC5C;AAEA,QAAM,SAA0B,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IACnD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACxB,QAAQ,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACzB,UAAU,EAAE;AAAA,EACd,EAAE;AAEF,QAAM,aAAa,WAAW,QAAQ;AAAA,IACpC,WAAY,GAAG,SAAS,WAAW,KAAqB;AAAA,IACxD,UAAU,YAAY,KAAK;AAAA,IAC3B,YAAY,YAAY,KAAK;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,QAAM,SAAS,GAAG,QAAQ,WAAW,gBAAgB,KAAK;AAG1D,QAAM,WAAW,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,WAAW,SAAS,EAAE,CAAC;AACpE,QAAM,QAAQ;AACd,QAAM,QAAQ,SAAS,SAAS;AAChC,QAAM,cAAc,QAAQ,WAAW;AAEvC,QAAM,MAAM,CAAC,OAAe;AAC1B,UAAM,IAAI,WAAW,MAAM,IAAI,EAAE;AACjC,WAAO,EAAE,GAAG,EAAE,IAAI,aAAa,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,EACnF;AAEA,QAAM,WAA2B,CAAC;AAGlC,MAAI,GAAG,OAAO;AACZ,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG;AAAA,SACF,cAAc,WAAW,SAAS;AAAA,QACnC,SAAS,WAAW;AAAA,QACpB,WAAW,gBAAgB;AAAA,QAC3B,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,WAAS;AAAA,IACP,EAAE,KAAK,wBAAwB,QAAQ,WAAW,GAAG,QAAQ,GAAG,WAAW,QAAQ,WAAW;AAAA,MAC5F,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,WAAS;AAAA,IACP,EAAE;AAAA,MACA,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,UAAU,QAAQ,SAAS;AAAA,MACxD,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,IAAI,EAAE;AAAA,IACV;AAAA,EACF;AAEA,QAAM,SAAS,WAAW,GAAG,OAAO;AACpC,QAAM,SAAS,WAAW,GAAG,OAAO;AAEpC,aAAW,QAAQ,GAAG,OAAO;AAC3B,QAAI,KAAK,SAAS,SAAS,GAAG;AAE5B,YAAM,OAAO,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,GAAG,OAAO,KAAK;AACzE,YAAM,OAAO,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI,IAAI,GAAG,OAAO,KAAK;AACzE,YAAM,OAAO,SAAS,KAAK,OAAO,IAAI,GAAG,OAAO,KAAK;AACrD,YAAM,OAAO,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI,GAAG,OAAO,KAAK;AACrE,YAAM,OAAO,SAAS,KAAK,OAAO,IAAI,GAAG,OAAO,KAAK;AACrD,YAAM,OAAO,SAAS,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI,GAAG,OAAO,KAAK;AAGrE,eAAS,KAAK,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ,QAAQ,GAAG,CAAC;AACpG,eAAS,KAAK,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ,QAAQ,GAAG,CAAC;AAAA,IACtG;AAGA,eAAW,MAAM,KAAK,QAAQ;AAC5B,YAAM,KAAK,SAAS,GAAG,IAAI,GAAG,OAAO,KAAK;AAC1C,YAAM,KAAK,SAAS,GAAG,IAAI,GAAG,OAAO,KAAK;AAE1C,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,KAAK,QAAQ,SAAS,QAAQ,YAAY,GAAG,CAAC;AACvF,YAAM,UAAU,GAAG,QAAQ,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC;AAC7E,eAAS;AAAA,QACP,EAAE,KAAK,SAAS,KAAK,GAAG,KAAK,GAAG,YAAY,GAAG,QAAQ,MAAM,EAAE,QAAQ,OAAO,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAIA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,KAAK,IAAI,KAAK,EAAE;AACtB,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,KAAK,IAAI,GAAG;AAClB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,UACjG,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,WAAWH,WAAS;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AACrB,UAAM,SAAS,KAAK,SAAS,WAAW;AAExC,UAAM,SAAS,SAAS,QAAQ,UAAU,QAAQ;AAClD,aAAS,KAAK,EAAE,KAAK,GAAG,QAAQ,SAAS,QAAQ,SAAS,MAAM,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAE/E,UAAM,QAAQ,KAAK,OAAO,SAAS,IAAI,EAAE,IAAI,KAAK,EAAE,IAAI,EAAE,SAAS,IAAI,YAAY;AACnF,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,OAAO,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,KAAK,GAAG,WAAW,QAAQ,MAAM;AAAA,QAC9E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,YAAM,SAAS,KAAK,OAAO,IAAI,CAAC,OAAO,GAAG,SAAS,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI;AACjF,eAAS;AAAA,QACP,EAAE,KAAK,QAAQ,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,YAAY,GAAG,QAAQ,SAAS;AAAA,UACpF,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,IAAIC,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AAEvB,QAAM,OAAO;AAAA,IACX,eAAeD,UAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,EACtN;AAEA,QAAM,SAAS,OAAO,cAAc,WAAW,KAAK;AACpD,QAAM,SAAS,OAAO,KAAK,IAAI,QAAQ,WAAW,QAAQ,WAAW,SAAS,SAAS,MAAM,CAAC;AAE9F,QAAM,UAA+F,CAAC;AACtG,aAAW,QAAQ,GAAG,OAAO;AAC3B,YAAQ,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK,EAAE,EAAE;AAAA,EAC5C;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,QAAQ,OAAO;AAAA,MACrD,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,WAA4C;AAAA,EACvD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAsB,UAAuC,eAAe,IAAI,KAAK;AAChG;;;AC5aA,SAAS,YAAY,GAAyC;AAC5D,QAAM,IAAI,EAAE;AACZ,IAAE,OAAO,EAAE;AACX,IAAE,QAAQ;AACV,SAAO;AACT;AAEA,SAAS,WAAW,GAAyC;AAC3D,QAAM,IAAI,EAAE;AACZ,IAAE,QAAQ,EAAE;AACZ,IAAE,OAAO;AACT,SAAO;AACT;AAEA,SAAS,YAAY,MAAgC,KAAsB,UAAqC;AAC9G,MAAI,CAAC,KAAM,QAAO,EAAE,KAAK,UAAU,MAAM,MAAM,OAAO,KAAK;AAE3D,MAAI,MAAM,KAAK,KAAK;AAClB,SAAK,OAAO,YAAY,KAAK,MAAM,KAAK,QAAQ;AAChD,QAAI,KAAK,KAAK,WAAW,KAAK,UAAU;AACtC,aAAO,YAAY,IAAI;AAAA,IACzB;AAAA,EACF,WAAW,MAAM,KAAK,KAAK;AACzB,SAAK,QAAQ,YAAY,KAAK,OAAO,KAAK,QAAQ;AAClD,QAAI,KAAK,MAAM,WAAW,KAAK,UAAU;AACvC,aAAO,WAAW,IAAI;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAcO,SAAS,WAAW,OAA8B;AACvD,QAAMI,SAAQ,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAEtE,MAAI;AACJ,QAAM,QAAsD,CAAC;AAC7D,QAAM,cAAwB,CAAC;AAE/B,aAAW,QAAQA,QAAO;AACxB,QAAI,YAAY,KAAK,IAAI,EAAG;AAE5B,UAAM,aAAa,KAAK,MAAM,iBAAiB;AAC/C,QAAI,YAAY;AACd,cAAQ,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACxD;AAAA,IACF;AAGA,UAAM,cAAc,KAAK,SAAS,4EAA4E;AAC9G,QAAI,aAAa;AACjB,eAAW,KAAK,aAAa;AAC3B,mBAAa;AACb,YAAM,OAAO,EAAE,CAAC;AAChB,YAAM,MAAM,UAAU,KAAK,IAAI,IAAI,OAAO,IAAI,IAAI;AAClD,YAAM,WAAW,OAAO,EAAE,CAAC,CAAC;AAC5B,YAAM,KAAK,EAAE,KAAK,SAAS,CAAC;AAAA,IAC9B;AAEA,QAAI,CAAC,WAAY,aAAY,KAAK,IAAI;AAAA,EACxC;AAEA,MAAI,MAAM,SAAS,GAAG;AACpB,QAAI,OAAiC;AACrC,eAAW,KAAK,OAAO;AACrB,aAAO,YAAY,MAAM,EAAE,KAAK,EAAE,QAAQ;AAAA,IAC5C;AAEA,UAAMC,SAAqB,CAAC;AAC5B,QAAI,UAAU;AAEd,UAAM,OAAO,CAAC,MAAiC;AAC7C,YAAM,KAAK,KAAK,SAAS;AACzB,YAAM,WAAqB,CAAC;AAC5B,UAAI,EAAE,KAAM,UAAS,KAAK,KAAK,EAAE,IAAI,CAAC;AACtC,UAAI,EAAE,MAAO,UAAS,KAAK,KAAK,EAAE,KAAK,CAAC;AAExC,MAAAA,OAAM,KAAK;AAAA,QACT;AAAA,QACA,KAAK,OAAO,EAAE,GAAG;AAAA,QACjB,UAAU,EAAE;AAAA,QACZ;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAEA,QAAI,KAAM,MAAK,IAAI;AAEnB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC/B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MACzB,OAAAA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAqB,CAAC;AAC5B,aAAW,QAAQ,aAAa;AAC9B,UAAM,WAAW,KAAK,QAAQ,IAAI;AAClC,UAAM,OAAO,YAAY,IAAI,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK,IAAI,KAAK,KAAK;AACxE,UAAM,UAAU,YAAY,IAAI,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE,OAAO,OAAO,IAAI,CAAC;AAEpG,UAAM,eAAe,KAAK,MAAM,WAAW;AAC3C,QAAI,KAAK;AACT,QAAI,MAAM;AACV,QAAI,WAAW;AAEf,QAAI,cAAc;AAChB,WAAK,KAAK,MAAM,GAAG,aAAa,KAAK,EAAE,KAAK;AAC5C,YAAM,UAAU,aAAa,CAAC,EAAG,KAAK;AACtC,YAAM,IAAI,QAAQ,MAAM,gCAAgC;AACxD,YAAM,IAAI,EAAE,CAAC,EAAG,KAAK,IAAI;AACzB,iBAAW,KAAK,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,IAAI;AAAA,IACxC,OAAO;AACL,YAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,WAAK,MAAM,CAAC;AACZ,YAAM,MAAM,CAAC,KAAK;AAClB,iBAAW,MAAM,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,IAAI;AAAA,IAC3C;AAEA,QAAI,CAAC,GAAI,MAAK,KAAK,MAAM,SAAS,CAAC;AAEnC,UAAM,KAAK;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC/B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAIA,IAAMC,aAAW;AAEV,SAAS,YAAY,IAAmB,OAAoC;AACjF,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAC,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,MAAI,GAAG,MAAM,WAAW,GAAG;AACzB,UAAMC,SAAe;AAAA,MACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG;AAAA,MAC9C,YAAY,QAAQ;AAAA,MACpB,UAAU,CAAC;AAAA,IACb;AACA,WAAO,EAAE,OAAAA,QAAO,SAAS,CAAC,EAAE;AAAA,EAC9B;AAEA,QAAM,QAAQ,oBAAI,IAA+C;AACjE,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,OAAO,YAAY,KAAK,KAAK,IAAI,EAAE;AACzC,UAAM,QAAQ,YAAY,OAAO,KAAK,QAAQ,GAAG,YAAY,CAAC,EAAE,QAAQ;AACxE,UAAM,IAAI,KAAK,IAAI,OAAO,QAAQ,IAAI,EAAE;AACxC,UAAMC,KAAI;AACV,UAAM,IAAI,KAAK,IAAI,EAAE,OAAO,GAAG,QAAQA,GAAE,CAAC;AAAA,EAC5C;AAEA,QAAM,SAA0B,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IACnD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACxB,QAAQ,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACzB,UAAU,EAAE;AAAA,EACd,EAAE;AAEF,QAAM,SAAS,WAAW,QAAQ;AAAA,IAChC,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,SAAS,GAAG,QAAQ,WAAW,gBAAgB,KAAK;AAC1D,QAAM,MAAM,CAAC,OAAe;AAC1B,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE;AAC7B,WAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,EACrE;AAEA,QAAM,WAA2B,CAAC;AAElC,MAAI,GAAG,OAAO;AACZ,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG;AAAA,QACH,OAAO,QAAQ;AAAA,QACf,SAAS,WAAW;AAAA,QACpB,WAAW,gBAAgB;AAAA,QAC3B,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,KAAK,IAAI,KAAK,EAAE;AACtB,eAAW,OAAO,KAAK,UAAU;AAC/B,YAAM,KAAK,IAAI,GAAG;AAClB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,UACjG,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,WAAWH,WAAS;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AAGrB,aAAS,KAAK,EAAE,KAAK,GAAG,QAAQ,SAAS,QAAQ,SAAS,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAGpF,UAAM,OAAO,EAAE,KAAK,EAAE,QAAQ,MAAM;AACpC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK;AAAA,QACL,IAAI,IAAI;AAAA,QACR,IAAI,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO,IAAI;AAAA,QACpC;AAAA,QACA,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAGA,UAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,UAAM,QAAQ,YAAY,UAAU,YAAY,CAAC,EAAE,QAAQ;AAC3D,UAAM,QAAQ;AACd,UAAM,QAAQ,EAAE,IAAI,EAAE,QAAQ,QAAQ;AACtC,UAAM,QAAQ,EAAE,KAAK,EAAE,SAAS,SAAS;AAEzC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,QAAQ,MAAM;AAAA,QACjE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,QAAQ,EAAE;AAAA,MAClB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA,IAAI,QAAQ,QAAQ,CAAC;AAAA,QACrB,IAAI,QAAQ,QAAQ,KAAK,YAAY,KAAK,IAAI;AAAA,QAC9C,YAAY;AAAA,QACZ;AAAA,QACA,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAIC,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AAEvB,QAAM,OAAO;AAAA,IACX,eAAeD,UAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,EACtN;AAEA,QAAM,UAA+F,CAAC;AACtG,aAAW,QAAQ,GAAG,OAAO;AAC3B,YAAQ,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK,EAAE,EAAE;AAAA,EAC5C;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,KAAK,GAAG,QAAQ,OAAO,OAAO,SAAS,MAAM,EAAE;AAAA,MAC3F,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,QAAsC;AAAA,EACjD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAmB,UAAuC,YAAY,IAAI,KAAK;AAC1F;;;ACtTA,SAAS,UAAU,MAAe,KAAsB;AACtD,MAAI,KAAK,KAAK,WAAW,GAAG;AAC1B,UAAM,UAAmB,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE;AACtD,eAAW,SAAS,CAAC;AACrB,kBAAc,SAAS,GAAG;AAC1B,WAAO;AAAA,EACT;AACA,gBAAc,MAAM,GAAG;AACvB,SAAO;AACT;AAEA,SAAS,WAAW,QAAiB,OAAqB;AACxD,QAAM,OAAO,OAAO,SAAS,KAAK;AAClC,QAAM,QAAiB;AAAA,IACrB,MAAM,CAAC,KAAK,KAAK,CAAC,CAAE;AAAA,IACpB,UAAU,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,MAAM,CAAC,IAAI,CAAC;AAAA,EACjE;AACA,QAAM,QAAQ,KAAK,KAAK,CAAC;AACzB,OAAK,OAAO,CAAC,KAAK,KAAK,CAAC,CAAE;AAC1B,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,SAAK,WAAW,KAAK,SAAS,MAAM,GAAG,CAAC;AAAA,EAC1C;AAEA,SAAO,SAAS,OAAO,QAAQ,GAAG,GAAG,KAAK;AAC1C,SAAO,KAAK,OAAO,OAAO,GAAG,KAAK;AACpC;AAEA,SAAS,cAAc,MAAe,KAAmB;AACvD,MAAI,IAAI,KAAK,KAAK,SAAS;AAE3B,MAAI,KAAK,SAAS,WAAW,GAAG;AAE9B,WAAO,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,EAAI;AACtC,QAAI,KAAK,KAAK,KAAK,KAAK,CAAC,MAAM,IAAK;AACpC,SAAK,KAAK,OAAO,IAAI,GAAG,GAAG,GAAG;AAC9B;AAAA,EACF;AAGA,SAAO,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,EAAI;AACtC;AAEA,MAAI,KAAK,SAAS,CAAC,EAAG,KAAK,WAAW,GAAG;AACvC,eAAW,MAAM,CAAC;AAClB,QAAI,MAAM,KAAK,KAAK,CAAC,GAAI;AACvB;AAAA,IACF,WAAW,QAAQ,KAAK,KAAK,CAAC,GAAI;AAChC;AAAA,IACF;AAAA,EACF;AAEA,gBAAc,KAAK,SAAS,CAAC,GAAI,GAAG;AACtC;AAaO,SAAS,aAAa,OAAgC;AAC3D,QAAMI,SAAQ,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAEtE,MAAI;AACJ,QAAM,gBAA0B,CAAC;AAEjC,aAAW,QAAQA,QAAO;AACxB,QAAI,0BAA0B,KAAK,IAAI,EAAG;AAE1C,UAAM,aAAa,KAAK,MAAM,iBAAiB;AAC/C,QAAI,YAAY;AACd,cAAQ,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACxD;AAAA,IACF;AACA,kBAAc,KAAK,IAAI;AAAA,EACzB;AAEA,QAAM,QAAQ,cAAc,KAAK,IAAI;AACrC,QAAM,WAAW,MAAM,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM;AAExD,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MAC/B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,MACzB,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,MAAI,OAAgB,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,EAAE;AAC7C,aAAW,KAAK,SAAS;AACvB,QAAI,KAAK,KAAK,WAAW,KAAK,KAAK,SAAS,WAAW,GAAG;AACxD,WAAK,KAAK,KAAK,CAAC;AAAA,IAClB,OAAO;AACL,aAAO,UAAU,MAAM,CAAC;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,QAAuB,CAAC;AAC9B,MAAI,UAAU;AAEd,QAAM,OAAO,CAAC,MAAuB;AACnC,UAAM,KAAK,QAAQ,SAAS;AAC5B,UAAM,WAAqB,CAAC;AAC5B,eAAW,KAAK,EAAE,UAAU;AAC1B,eAAS,KAAK,KAAK,CAAC,CAAC;AAAA,IACvB;AACA,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAM,EAAE;AAAA,MACR,UAAU;AAAA,IACZ,CAAC;AACD,WAAO;AAAA,EACT;AAEA,OAAK,IAAI;AAET,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC/B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAIA,IAAMC,aAAW;AAEV,SAAS,cAAc,IAAqB,OAAoC;AACrF,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAC,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAE7B,MAAI,GAAG,MAAM,WAAW,GAAG;AACzB,UAAMC,SAAe;AAAA,MACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,KAAK,QAAQ,GAAG;AAAA,MAC9C,YAAY,QAAQ;AAAA,MACpB,UAAU,CAAC;AAAA,IACb;AACA,WAAO,EAAE,OAAAA,QAAO,SAAS,CAAC,EAAE;AAAA,EAC9B;AAGA,QAAM,QAAQ,oBAAI,IAAqE;AAEvF,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,aAAa,KAAK,KAAK,IAAI,CAAC,MAAM,KAAK,IAAI,YAAY,OAAO,CAAC,GAAG,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;AAC7F,UAAM,QAAQ,WAAW,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC;AACtD,UAAM,SAAS,OAAO;AACtB,UAAM,IAAI,KAAK,IAAI,EAAE,OAAO,QAAQ,WAAW,CAAC;AAAA,EAClD;AAEA,QAAM,SAA0B,GAAG,MAAM,IAAI,CAAC,OAAO;AAAA,IACnD,IAAI,EAAE;AAAA,IACN,OAAO,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACxB,QAAQ,MAAM,IAAI,EAAE,EAAE,EAAG;AAAA,IACzB,UAAU,EAAE;AAAA,EACd,EAAE;AAGF,QAAM,YAAY,oBAAI,IAAoB;AAC1C,aAAW,QAAQ,GAAG,OAAO;AAC3B,eAAW,OAAO,KAAK,UAAU;AAC/B,gBAAU,IAAI,KAAK,KAAK,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,SAAS,WAAW,QAAQ;AAAA,IAChC,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,SAAS,GAAG,QAAQ,WAAW,gBAAgB,KAAK;AAC1D,QAAM,MAAM,CAAC,OAAe;AAC1B,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE;AAC7B,WAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,EACrE;AAEA,QAAM,WAA2B,CAAC;AAElC,MAAI,GAAG,OAAO;AACZ,aAAS;AAAA,MACP,EAAE;AAAA,QACA,GAAG;AAAA,QACH,OAAO,QAAQ;AAAA,QACf,SAAS,WAAW;AAAA,QACpB,WAAW,gBAAgB;AAAA,QAC3B,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,KAAK,IAAI,KAAK,EAAE;AACtB,UAAM,aAAa,MAAM,IAAI,KAAK,EAAE,EAAG;AACvC,UAAM,aAAa,KAAK,SAAS;AAEjC,SAAK,SAAS,QAAQ,CAAC,KAAK,SAAS;AACnC,YAAM,KAAK,IAAI,GAAG;AAClB,UAAI;AAEJ,UAAI,eAAe,WAAW,SAAS,GAAG;AACxC,YAAI,SAAS,GAAG;AACd,mBAAS,GAAG;AAAA,QACd,WAAW,SAAS,aAAa,GAAG;AAClC,mBAAS,GAAG,IAAI,GAAG;AAAA,QACrB,OAAO;AACL,cAAI,OAAO,GAAG;AACd,mBAAS,IAAI,GAAG,IAAI,MAAM,IAAK,SAAQ,WAAW,CAAC;AACnD,mBAAS;AAAA,QACX;AAAA,MACF,OAAO;AACL,cAAM,EAAE,MAAM,IAAI,aAAa,IAAI,EAAE;AACrC,iBAAS,MAAM;AAAA,MACjB;AAEA,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAAA,UACpF,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,WAAWF,WAAS;AAAA,QACxB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,aAAW,QAAQ,GAAG,OAAO;AAC3B,UAAM,IAAI,IAAI,KAAK,EAAE;AACrB,UAAM,aAAa,MAAM,IAAI,KAAK,EAAE,EAAG;AACvC,UAAM,WAAW,KAAK,KAAK,WAAW,IAAI,WAAW,KAAK,KAAK,WAAW,IAAI,WAAW;AAGzF,aAAS,KAAK,EAAE,KAAK,GAAG,QAAQ,SAAS,QAAQ,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAGzE,QAAI,KAAK,EAAE;AACX,SAAK,KAAK,QAAQ,CAAC,GAAG,QAAQ;AAC5B,YAAM,KAAK,WAAW,GAAG;AACzB,UAAI,MAAM,GAAG;AACX,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,SAAS,CAAC;AAAA,QAC3F;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA,OAAO,CAAC;AAAA,UACR,IAAI,KAAK,KAAK,CAAC;AAAA,UACf,IAAI,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO,IAAI;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,UACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,QACrC;AAAA,MACF;AACA,YAAM;AAAA,IACR,CAAC;AAGD,UAAM,OAAO,CAAC,UAAU,IAAI,KAAK,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,IAAI,EAAE,SAAS;AAClE,aAAS;AAAA,MACP,EAAE,KAAK,UAAU,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,IAAI,GAAG,YAAY,GAAG,QAAQ,WAAW;AAAA,QACpF,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,IAAIC,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AAEvB,QAAM,OAAO;AAAA,IACX,eAAeD,UAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,SAAS;AAAA,EACtN;AAEA,QAAM,UAA+F,CAAC;AACtG,aAAW,QAAQ,GAAG,OAAO;AAC3B,YAAQ,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,KAAK,EAAE,EAAE;AAAA,EAC5C;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,OAAO,KAAK,GAAG,QAAQ,OAAO,OAAO,SAAS,MAAM,EAAE;AAAA,MAC3F,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAG;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,UAA0C;AAAA,EACrD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAqB,UAAuC,cAAc,IAAI,KAAK;AAC9F;;;ACjUA,SAAS,sBAAsB,OAAqD;AAClF,QAAM,aAAuB,CAAC;AAC9B,QAAM,QAAoB,CAAC;AAC3B,QAAM,UAAU;AAEhB,aAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,UAAM,IAAI,KAAK,MAAM,OAAO;AAC5B,QAAI,KAAK,EAAE,CAAC,EAAG,SAAS,IAAI,GAAG;AAC7B,YAAM,QAAQ,EAAE,CAAC,EACd,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,UAAI,MAAM,UAAU,GAAG;AACrB,cAAM,KAAK,KAAK;AAChB;AAAA,MACF;AAAA,IACF;AACA,eAAW,KAAK,IAAI;AAAA,EACtB;AACA,SAAO,EAAE,OAAO,WAAW,KAAK,IAAI,GAAG,MAAM;AAC/C;AAEO,IAAM,OAAoC;AAAA,EAC/C,aAAa,OAA6B;AACxC,UAAM,EAAE,OAAO,MAAM,IAAI,sBAAsB,KAAK;AACpD,UAAM,MAAM,WAAW,KAAK;AAC5B,UAAM,QAAQ,WAAW,IAAI,KAAK;AAGlC,UAAM,YAAY,oBAAI,IAAoB;AAC1C,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,UAAU,IAAI,KAAK,KAAK,EAAG,WAAU,IAAI,KAAK,OAAO,KAAK,EAAE;AAAA,IACnE;AAEA,UAAM,cAAkC,CAAC;AACzC,eAAW,OAAO,OAAO;AACvB,eAAS,IAAI,GAAG,IAAI,IAAI,SAAS,GAAG,KAAK;AACvC,cAAM,SAAS,UAAU,IAAI,IAAI,CAAC,CAAE;AACpC,cAAM,OAAO,UAAU,IAAI,IAAI,IAAI,CAAC,CAAE;AACtC,YAAI,UAAU,KAAM,aAAY,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,MACrD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU,IAAI,YAAY,CAAC;AAAA,MAC3B,WAAW,IAAI;AAAA,MACf;AAAA,MACA,GAAI,YAAY,SAAS,IAAI,EAAE,aAAa,YAAY,IAAI,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,UAAU,OAA6B;AACrC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAkB,OAAoC;AAC3D,WAAO,WAAW,IAAI,KAAK;AAAA,EAC7B;AACF;;;ACpEA,IAAM,eAAe,CAAC,QAAQ,QAAQ,SAAS,OAAO,SAAS,UAAU,WAAW,OAAO;AAG3F,SAAS,UAAU,OAAmC;AACpD,QAAM,IAAI,MAAM,YAAY;AAC5B,MAAI,EAAE,SAAS,MAAM,EAAG,QAAO;AAC/B,MAAI,EAAE,SAAS,MAAM,EAAG,QAAO;AAC/B,MACE,EAAE,SAAS,MAAM,KACjB,EAAE,SAAS,MAAM,KACjB,EAAE,SAAS,WAAW,KACtB,EAAE,SAAS,OAAO,KAClB,EAAE,SAAS,aAAa,KACxB,EAAE,SAAS,QAAQ;AAEnB,WAAO;AACT,SAAO;AACT;AAEO,IAAM,OAAoC;AAAA,EAC/C,aAAa,OAA6B;AACxC,UAAM,MAAM,WAAW,KAAK;AAC5B,UAAM,QAAQ,WAAW,IAAI,KAAK;AAClC,eAAW,KAAK,OAAO;AACrB,UAAI,EAAE,MAAM,KAAK,CAACG,OAAM,aAAa,SAASA,EAAC,CAAC,EAAG;AACnD,YAAM,IAAI,UAAU,EAAE,KAAK;AAC3B,UAAI,EAAG,GAAE,MAAM,KAAK,CAAC;AAAA,IACvB;AACA,WAAO;AAAA,MACL,SAAS,IAAI;AAAA,MACb,UAAU,IAAI,YAAY,CAAC;AAAA,MAC3B,WAAW,IAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,OAA6B;AACrC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,OAAO,IAAkB,OAAoC;AAC3D,WAAO,WAAW,IAAI,KAAK;AAAA,EAC7B;AACF;;;ACpCA,IAAM,IAAI,CAAC,MAA+B,IAAI,EAAE,SAAS;AACzD,IAAM,MAAM,CAAC,MAAqB;AAChC,IAAE,SAAS,IAAI,KAAK,IAAI,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,CAAC;AAC/C;AACA,IAAM,KAAK,CAAC,MAAuB,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK;AAExD,SAASC,aAAY,GAAqB;AACxC,QAAM,IAAI,EAAE;AACZ,IAAE,OAAO,EAAE;AACX,IAAE,QAAQ;AACV,MAAI,CAAC;AACL,MAAI,CAAC;AACL,SAAO;AACT;AACA,SAASC,YAAW,GAAqB;AACvC,QAAM,IAAI,EAAE;AACZ,IAAE,QAAQ,EAAE;AACZ,IAAE,OAAO;AACT,MAAI,CAAC;AACL,MAAI,CAAC;AACL,SAAO;AACT;AAEA,SAAS,OAAO,MAAsB,KAAsB;AAC1D,MAAI,CAAC,KAAM,QAAO,EAAE,KAAK,MAAM,MAAM,OAAO,MAAM,QAAQ,EAAE;AAC5D,MAAI,MAAM,KAAK,IAAK,MAAK,OAAO,OAAO,KAAK,MAAM,GAAG;AAAA,WAC5C,MAAM,KAAK,IAAK,MAAK,QAAQ,OAAO,KAAK,OAAO,GAAG;AAAA,MACvD,QAAO;AACZ,MAAI,IAAI;AACR,QAAM,UAAU,GAAG,IAAI;AACvB,MAAI,UAAU,KAAK,MAAM,KAAK,KAAM,IAAK,QAAOD,aAAY,IAAI;AAChE,MAAI,UAAU,MAAM,MAAM,KAAK,MAAO,IAAK,QAAOC,YAAW,IAAI;AACjE,MAAI,UAAU,KAAK,MAAM,KAAK,KAAM,KAAK;AACvC,SAAK,OAAOA,YAAW,KAAK,IAAK;AACjC,WAAOD,aAAY,IAAI;AAAA,EACzB;AACA,MAAI,UAAU,MAAM,MAAM,KAAK,MAAO,KAAK;AACzC,SAAK,QAAQA,aAAY,KAAK,KAAM;AACpC,WAAOC,YAAW,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAGO,SAAS,SAAS,OAA6B;AACpD,QAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM;AACrD,MAAI,OAAuB;AAC3B,aAAW,KAAK,KAAM,QAAO,OAAO,MAAM,CAAC;AAE3C,QAAM,QAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,QAAM,OAAO,CAAC,MAAuB;AACnC,UAAM,KAAK,IAAI,GAAG;AAClB,UAAM,WAAqB,CAAC;AAC5B,UAAM,KAAK,EAAE,IAAI,OAAO,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,OAAO,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;AAC1F,QAAI,EAAE,KAAM,UAAS,KAAK,KAAK,EAAE,IAAI,CAAC;AACtC,QAAI,EAAE,MAAO,UAAS,KAAK,KAAK,EAAE,KAAK,CAAC;AACxC,WAAO;AAAA,EACT;AACA,MAAI,KAAM,MAAK,IAAI;AAEnB,SAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,WAAW,MAAM,MAAM;AAChE;AAEO,IAAM,MAAmC;AAAA,EAC9C,aAAa,OAA6B;AACxC,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EACA,UAAU,OAA6B;AACrC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAkB,OAAoC;AAC3D,WAAO,WAAW,IAAI,KAAK;AAAA,EAC7B;AACF;;;AClFA,IAAM,MAAM;AAAZ,IACE,QAAQ;AAQV,IAAM,QAAQ,CAAC,MAA8B,MAAM,QAAQ,EAAE,UAAU;AAEvE,SAASC,YAAWC,IAAmB;AACrC,QAAM,IAAIA,GAAE;AACZ,EAAAA,GAAE,QAAQ,EAAE;AACZ,IAAE,OAAOA;AACT,IAAE,QAAQA,GAAE;AACZ,EAAAA,GAAE,QAAQ;AACV,SAAO;AACT;AACA,SAASC,aAAYD,IAAmB;AACtC,QAAM,IAAIA,GAAE;AACZ,EAAAA,GAAE,OAAO,EAAE;AACX,IAAE,QAAQA;AACV,IAAE,QAAQA,GAAE;AACZ,EAAAA,GAAE,QAAQ;AACV,SAAO;AACT;AACA,SAAS,KAAKA,IAAiB;AAC7B,EAAAA,GAAE,QAAQ,CAACA,GAAE;AACb,MAAIA,GAAE,KAAM,CAAAA,GAAE,KAAK,QAAQ,CAACA,GAAE,KAAK;AACnC,MAAIA,GAAE,MAAO,CAAAA,GAAE,MAAM,QAAQ,CAACA,GAAE,MAAM;AACxC;AAEA,SAASE,QAAOF,IAAkB,KAAqB;AACrD,MAAI,CAACA,GAAG,QAAO,EAAE,KAAK,MAAM,MAAM,OAAO,MAAM,OAAO,IAAI;AAC1D,MAAI,MAAMA,GAAE,IAAK,CAAAA,GAAE,OAAOE,QAAOF,GAAE,MAAM,GAAG;AAAA,WACnC,MAAMA,GAAE,IAAK,CAAAA,GAAE,QAAQE,QAAOF,GAAE,OAAO,GAAG;AAEnD,MAAI,MAAMA,GAAE,KAAK,KAAK,CAAC,MAAMA,GAAE,IAAI,EAAG,CAAAA,KAAID,YAAWC,EAAC;AACtD,MAAI,MAAMA,GAAE,IAAI,KAAK,MAAMA,GAAE,KAAM,IAAI,EAAG,CAAAA,KAAIC,aAAYD,EAAC;AAC3D,MAAI,MAAMA,GAAE,IAAI,KAAK,MAAMA,GAAE,KAAK,EAAG,MAAKA,EAAC;AAC3C,SAAOA;AACT;AAEO,SAAS,YAAY,OAA6B;AACvD,QAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM;AACrD,MAAI,OAAsB;AAC1B,aAAW,KAAK,MAAM;AACpB,WAAOE,QAAO,MAAM,CAAC;AACrB,SAAK,QAAQ;AAAA,EACf;AAEA,QAAM,QAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,QAAM,OAAO,CAAC,MAAsB;AAClC,UAAM,KAAK,IAAI,GAAG;AAClB,UAAM,WAAqB,CAAC;AAC5B,UAAM,KAAK,EAAE,IAAI,OAAO,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,EAAE,UAAU,MAAM,QAAQ,OAAO,GAAG,SAAS,CAAC;AAC7F,QAAI,EAAE,KAAM,UAAS,KAAK,KAAK,EAAE,IAAI,CAAC;AACtC,QAAI,EAAE,MAAO,UAAS,KAAK,KAAK,EAAE,KAAK,CAAC;AACxC,WAAO;AAAA,EACT;AACA,MAAI,KAAM,MAAK,IAAI;AAEnB,SAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,WAAW,MAAM,MAAM;AAChE;AAEO,IAAM,SAAsC;AAAA,EACjD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAkB,UAAuC,WAAW,IAAI,KAAK;AACxF;;;AC3DA,SAAS,UAAU,MAAa,KAAa,OAA6B;AACxE,MAAI,KAAK,MAAM;AACb,QAAI,IAAI,KAAK,KAAK,SAAS;AAC3B,WAAO,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,EAAI;AACtC,QAAI,KAAK,KAAK,KAAK,KAAK,CAAC,MAAM,IAAK,QAAO;AAC3C,SAAK,KAAK,OAAO,IAAI,GAAG,GAAG,GAAG;AAAA,EAChC,OAAO;AACL,QAAI,IAAI,KAAK,KAAK,SAAS;AAC3B,WAAO,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,EAAI;AACtC,QAAI,KAAK,KAAK,KAAK,KAAK,CAAC,MAAM,IAAK,QAAO;AAC3C;AACA,UAAM,QAAQ,UAAU,KAAK,SAAS,CAAC,GAAI,KAAK,KAAK;AACrD,QAAI,OAAO;AACT,WAAK,KAAK,OAAO,GAAG,GAAG,MAAM,EAAE;AAC/B,WAAK,SAAS,OAAO,IAAI,GAAG,GAAG,MAAM,KAAK;AAAA,IAC5C;AAAA,EACF;AACA,MAAI,KAAK,KAAK,UAAU,QAAQ,EAAG,QAAO;AAG1C,QAAM,MAAM,KAAK,KAAK,UAAU;AAChC,QAAM,KAAK,KAAK,KAAK,GAAG;AACxB,QAAM,QAAe;AAAA,IACnB,MAAM,KAAK,KAAK,MAAM,MAAM,CAAC;AAAA,IAC7B,UAAU,KAAK,OAAO,CAAC,IAAI,KAAK,SAAS,MAAM,MAAM,CAAC;AAAA,IACtD,MAAM,KAAK;AAAA,EACb;AACA,OAAK,OAAO,KAAK,KAAK,MAAM,GAAG,GAAG;AAClC,OAAK,WAAW,KAAK,OAAO,CAAC,IAAI,KAAK,SAAS,MAAM,GAAG,MAAM,CAAC;AAC/D,SAAO,EAAE,IAAI,MAAM;AACrB;AAEO,SAAS,WAAW,OAA6B;AACtD,QAAM,aAAa,MAAM,MAAM,gBAAgB;AAC/C,QAAM,QAAQ,KAAK,IAAI,GAAG,aAAa,OAAO,WAAW,CAAC,CAAC,IAAI,CAAC;AAChE,QAAM,aAAa,MAAM,QAAQ,gBAAgB,EAAE;AACnD,QAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM;AAE1D,MAAI,OAAc,EAAE,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,MAAM,KAAK;AACvD,aAAW,KAAK,MAAM;AACpB,UAAM,QAAQ,UAAU,MAAM,GAAG,KAAK;AACtC,QAAI,MAAO,QAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM;AAAA,EACnF;AAEA,QAAM,QAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,QAAM,OAAO,CAAC,MAAqB;AACjC,UAAM,KAAK,IAAI,GAAG;AAClB,UAAM,WAAqB,CAAC;AAC5B,UAAM,KAAK,EAAE,IAAI,OAAO,EAAE,KAAK,KAAK,KAAK,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;AACxE,eAAW,KAAK,EAAE,SAAU,UAAS,KAAK,KAAK,CAAC,CAAC;AACjD,WAAO;AAAA,EACT;AACA,MAAI,KAAK,KAAK,SAAS,KAAK,KAAK,SAAS,SAAS,EAAG,MAAK,IAAI;AAE/D,SAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,WAAW,MAAM,MAAM;AAChE;AAEO,IAAM,QAAqC;AAAA,EAChD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAkB,UAAuC,WAAW,IAAI,KAAK;AACxF;;;ACrEA,IAAM,UAAU,OAAc,EAAE,OAAO,oBAAI,IAAI,GAAG,KAAK,MAAM;AAE7D,SAAS,aAAa,GAAW,GAAmB;AAClD,MAAI,IAAI;AACR,SAAO,IAAI,EAAE,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,EAAG;AACtD,SAAO;AACT;AAEA,SAASC,QAAO,MAAa,MAAoB;AAC/C,MAAI,OAAO;AACX,MAAI,OAAO;AACX,SAAO,KAAK,SAAS,GAAG;AACtB,QAAI;AACJ,eAAW,SAAS,KAAK,MAAM,KAAK,GAAG;AACrC,UAAI,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG;AACxB,kBAAU;AACV;AAAA,MACF;AAAA,IACF;AACA,QAAI,YAAY,QAAW;AACzB,YAAM,QAAQ,QAAQ;AACtB,YAAM,MAAM;AACZ,WAAK,MAAM,IAAI,MAAM,KAAK;AAC1B;AAAA,IACF;AACA,UAAM,KAAK,aAAa,SAAS,IAAI;AACrC,QAAI,OAAO,QAAQ,QAAQ;AACzB,aAAO,KAAK,MAAM,IAAI,OAAO;AAC7B,aAAO,KAAK,MAAM,EAAE;AACpB,UAAI,KAAK,WAAW,EAAG,MAAK,MAAM;AAAA,IACpC,OAAO;AAEL,YAAM,gBAAgB,KAAK,MAAM,IAAI,OAAO;AAC5C,WAAK,MAAM,OAAO,OAAO;AACzB,YAAM,MAAM,QAAQ;AACpB,WAAK,MAAM,IAAI,QAAQ,MAAM,GAAG,EAAE,GAAG,GAAG;AACxC,UAAI,MAAM,IAAI,QAAQ,MAAM,EAAE,GAAG,aAAa;AAC9C,UAAI,OAAO,KAAK,QAAQ;AACtB,YAAI,MAAM;AAAA,MACZ,OAAO;AACL,cAAM,OAAO,QAAQ;AACrB,aAAK,MAAM;AACX,YAAI,MAAM,IAAI,KAAK,MAAM,EAAE,GAAG,IAAI;AAAA,MACpC;AACA;AAAA,IACF;AAAA,EACF;AACA,OAAK,MAAM;AACb;AAEO,SAAS,WAAW,OAA6B;AAEtD,QAAM,SAAS,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AAChD,QAAM,QAAQ,OAAO,OAAO,CAAC,MAAM,cAAc,KAAK,CAAC,KAAK,MAAM,WAAW,MAAM,QAAQ;AAC3F,QAAM,OAAO,QAAQ;AACrB,aAAW,KAAK,MAAO,CAAAA,QAAO,MAAM,CAAC;AAErC,QAAM,QAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,QAAM,OAAO,CAAC,GAAU,QAAgB,cAA+B;AACrE,UAAM,KAAK,IAAI,GAAG;AAClB,UAAM,WAAqB,CAAC;AAC5B,UAAM,OAAiB,EAAE,MACrB;AAAA,MACE;AAAA,MACA,OAAO;AAAA,MACP,OAAO,CAAC,QAAQ,QAAQ;AAAA,MACxB;AAAA,MACA,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjD,IACA;AAAA,MACE;AAAA,MACA,OAAO;AAAA,MACP,OAAO,CAAC,KAAK;AAAA,MACb;AAAA,MACA,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjD;AACJ,UAAM,KAAK,IAAI;AACf,eAAW,CAAC,OAAO,KAAK,KAAK,EAAE,MAAO,UAAS,KAAK,KAAK,OAAO,SAAS,OAAO,KAAK,CAAC;AACtF,WAAO;AAAA,EACT;AACA,OAAK,MAAM,EAAE;AAEb,SAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,WAAW,MAAM,MAAM;AAChE;AAEO,IAAM,QAAqC;AAAA,EAChD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAkB,UAAuC,WAAW,IAAI,KAAK;AACxF;;;AC7FA,SAAS,YAAY,OAAwB;AAC3C,QAAM,IAAI,MAAM,YAAY;AAC5B,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO,KAAK;AACnC,MAAI,EAAE,SAAS,KAAK,EAAG,QAAO,KAAK;AACnC,SAAO,CAAC,GAAG,MAAM,IAAI;AACvB;AAEO,SAAS,aAAa,OAA6B;AAExD,QAAM,OAAO,MAAM,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM;AACpD,QAAM,SAAS,YAAY,KAAK;AAEhC,QAAM,QAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,QAAM,QAAQ,CAAC,IAAY,OAA8C;AACvE,UAAM,KAAK,IAAI,GAAG;AAClB,UAAM,WAAqB,CAAC;AAC5B,UAAM,OAAiB,EAAE,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,GAAG,MAAM,IAAI,EAAE,IAAI,EAAE,KAAK,SAAS;AACxF,UAAM,KAAK,IAAI;AACf,QAAI;AACJ,QAAI,OAAO,IAAI;AACb,cAAQ,IAAI,EAAE;AAAA,IAChB,OAAO;AACL,YAAM,MAAO,KAAK,MAAO;AACzB,YAAM,OAAO,MAAM,IAAI,GAAG;AAC1B,YAAM,QAAQ,MAAM,MAAM,GAAG,EAAE;AAC/B,eAAS,KAAK,KAAK,IAAI,MAAM,EAAE;AAC/B,cAAQ,OAAO,KAAK,OAAO,MAAM,KAAK;AAAA,IACxC;AACA,IAAC,KAA2B,QAAQ,OAAO,KAAK;AAChD,WAAO,EAAE,IAAI,MAAM;AAAA,EACrB;AACA,MAAI,IAAI,SAAS,EAAG,OAAM,GAAG,IAAI,SAAS,CAAC;AAE3C,SAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,WAAW,MAAM,MAAM;AAChE;AAEO,IAAM,UAAuC;AAAA,EAClD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAkB,UAAuC,WAAW,IAAI,KAAK;AACxF;;;AC3CO,SAAS,UAAU,OAA6B;AACrD,QAAM,QAAQ,WAAW,KAAK,KAAK;AACnC,QAAM,QAAQ,MAAM,MAAM,QAAQ,KAAK,CAAC,GAAG,IAAI,MAAM;AACrD,QAAM,SAAS,CAAC,GAAW,MAAwB,QAAQ,IAAI,IAAI,IAAI;AAEvE,QAAMC,QAAiB,CAAC;AACxB,aAAW,KAAK,MAAM;AACpB,IAAAA,MAAK,KAAK,CAAC;AACX,QAAI,IAAIA,MAAK,SAAS;AACtB,WAAO,IAAI,GAAG;AACZ,YAAM,SAAU,IAAI,KAAM;AAC1B,UAAI,OAAOA,MAAK,CAAC,GAAIA,MAAK,MAAM,CAAE,GAAG;AACnC,SAACA,MAAK,CAAC,GAAGA,MAAK,MAAM,CAAC,IAAI,CAACA,MAAK,MAAM,GAAIA,MAAK,CAAC,CAAE;AAClD,YAAI;AAAA,MACN,MAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,QAAoB,CAAC;AAC3B,QAAM,OAAO,CAAC,QAAwB;AACpC,UAAM,KAAK,IAAI,GAAG;AAClB,UAAM,WAAqB,CAAC;AAC5B,UAAM,KAAK,EAAE,IAAI,OAAO,OAAOA,MAAK,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;AACxE,UAAM,IAAI,IAAI,MAAM,GAClB,IAAI,IAAI,MAAM;AAChB,QAAI,IAAIA,MAAK,OAAQ,UAAS,KAAK,KAAK,CAAC,CAAC;AAC1C,QAAI,IAAIA,MAAK,OAAQ,UAAS,KAAK,KAAK,CAAC,CAAC;AAC1C,WAAO;AAAA,EACT;AACA,MAAIA,MAAK,SAAS,EAAG,MAAK,CAAC;AAE3B,SAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,WAAW,MAAM,MAAM;AAChE;AAEO,IAAM,OAAoC;AAAA,EAC/C,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAkB,UAAuC,WAAW,IAAI,KAAK;AACxF;;;ACtBA,SAASC,OAAM,OAAwB;AACrC,MAAI;AACJ,QAAM,SAAmB,CAAC;AAC1B,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,kBAAkB,IAAI;AAChC,QAAI,EAAE,CAAC,MAAM,cAAc;AACzB,aAAO,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;AACzB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,YAAY,EAAE,CAAC,MAAM,SAAS;AACzC,aAAO,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;AACzB;AAAA,IACF;AACA,WAAO,KAAK,GAAG,CAAC;AAAA,EAClB;AACA,SAAO,EAAE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC,GAAI,OAAO;AAC7D;AAEO,SAAS,WAAW,KAAc,OAAoC;AAC3E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,KAAK,IACT,KAAK,IACL,MAAM;AAER,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,IAAI,SAAS;AAEnB,QAAM,QAAQ,YAAY,QAAQ,IAAI,EAAE;AACxC,QAAM,SAAS,SAAS,QAAQ;AAEhC,QAAM,QAAoD,CAAC;AAC3D,MAAI,SAAS;AACb,aAAW,KAAK,IAAI,QAAQ;AAC1B,UAAM,KAAK,KAAK,IAAI,YAAY,GAAG,IAAI,EAAE,QAAQ,IAAI,EAAE;AACvD,UAAM,KAAK,EAAE,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;AACtC,cAAU,KAAK,KAAK;AAAA,EACtB;AAEA,QAAM,WAA2B,CAAC;AAClC,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,WAAS;AAAA,IACP,EAAE,KAAK,QAAQ,QAAQ,IAAI,KAAK,IAAI,OAAO,MAAM,MAAM,QAAQ,WAAW,EAAE,QAAQ,OAAO,CAAC;AAAA,EAC9F;AACA,MAAI,MAAM,SAAS,GAAG;AACpB,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,SAAS,QAAQ,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,EAAG,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,KAAK,CAAC,CAAC;AAAA,QAC5F,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,WAAWC,UAAS;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,UAAM,QAAQ,KAAK,IAAI,KAAK;AAC5B,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,GAAG,OAAO,KAAK,IAAI,QAAQ,GAAG,GAAG,QAAQ,SAAS,QAAQ,QAAQ,KAAK;AAAA,QACzF,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AACA,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,GAAG,OAAO,GAAG,OAAO,IAAI,QAAQ,GAAG,GAAG,WAAW,QAAQ,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC;AAAA,IAC1F;AACA,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,QAAQ,QAAQ,GAAG;AAAA,IACxF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK;AAAA,QACL,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC;AAAA,QACxB,IAAI,IAAI,KAAK,IAAI,OAAO,IAAI;AAAA,QAC5B;AAAA,QACA,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,KAAK,GAC1B,SAAS,IAAI,KAAK;AACpB,QAAI,IAAI,MAAM,SAAS,GAAG;AACxB,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,GAAG,OAAO,GAAG,GAAG,QAAQ,SAAS,QAAQ,SAAS,CAAC,CAAC;AACxF,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,EAAG,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC;AAAA,UAC5E,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,WAAWA,UAAS;AAAA,QACxB;AAAA,MACF;AAAA,IACF,OAAO;AAEL,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;AAAA,UAC7D,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,UAGF,CAAC;AACL,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,GAAG,GAAG,OAAO,KAAK,KAAK,IAAI,QAAQ,GAAG,EAAE;AAAA,EACjF,CAAC;AAED,QAAM,SAAS,MAAM,SAAS,IAAI,SAAS,MAAM,UAAU;AAC3D,QAAM,QAAe;AAAA,IACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,IAAI,KAAK,OAAO;AAAA,IACtD,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,MAAM,CAAC,SAAS,QAAQ,SAAS,MAAM,OAAO,SAAS,CAAC;AAAA,EAC1D;AACA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,aAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGD,OAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,WAAW,IAAI,KAAK;AAAA,EAC7B;AACF;;;ACjIA,SAASE,OAAM,OAA0B;AACvC,MAAI;AACJ,QAAM,UAAoB,CAAC;AAC3B,MAAI;AACJ,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,kBAAkB,IAAI;AAChC,QAAI,EAAE,CAAC,MAAM,SAAU;AACvB,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,UAAU;AACrB,YAAM,EAAE,MAAM,YAAY,KAAK,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE;AACpD,cAAQ,KAAK,GAAG;AAChB;AAAA,IACF;AACA,QAAI,CAAC,IAAK;AACV,QAAI,EAAE,CAAC,MAAM,OAAO;AAClB,YAAM,SAAS,kBAAkB,CAAC;AAClC,UAAI;AACF,YAAI,MAAM,KAAK;AAAA,UACb,MAAM;AAAA,UACN,MAAM,OAAO;AAAA,UACb,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,QACnD,CAAC;AACH;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,UAAU;AACrB,YAAM,QAAQ,KACX,MAAM,CAAC,EACP,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtB,YAAM,KAAK,MAAM,CAAC,KAAK;AACvB,YAAM,SAAS,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,CAAC,IAAI;AAClD,YAAM,UAAU,MAAM,CAAC,KAAK,IACzB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AACb,cAAM,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAClD,eAAO,EAAE,GAAG,KAAK,IAAI,GAAG,KAAK,GAAG;AAAA,MAClC,CAAC;AACH,UAAI,MAAM,KAAK,EAAE,MAAM,UAAU,IAAI,OAAO,QAAQ,OAAO,CAAC;AAAA,IAC9D;AAAA,EACF;AACA,SAAO,EAAE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC,GAAI,QAAQ;AAC9D;AAEA,SAAS,YAAY,KAAqB;AACxC,SAAO,kBAAkB,IAAI,KAAK,CAAC,EAAE,KAAK,GAAG;AAC/C;AAEA,SAAS,kBACP,QAC+C;AAC/C,QAAM,YAAY,OAAO,CAAC;AAC1B,MAAI,cAAc,OAAW,QAAO;AAEpC,QAAM,cAAc,UAAU,QAAQ,IAAI;AAC1C,MAAI,eAAe,GAAG;AACpB,UAAM,OAAO,UAAU,MAAM,GAAG,WAAW;AAC3C,UAAM,SAAS,UAAU,MAAM,cAAc,CAAC;AAC9C,WAAO,EAAE,MAAM,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG;AAAA,EAC/C;AAEA,MAAI,OAAO,CAAC,MAAM,MAAM;AACtB,WAAO,EAAE,MAAM,WAAW,GAAI,OAAO,CAAC,IAAI,EAAE,QAAQ,OAAO,CAAC,EAAE,IAAI,CAAC,EAAG;AAAA,EACxE;AAEA,MAAI,OAAO,CAAC,GAAG,WAAW,IAAI,GAAG;AAC/B,UAAM,SAAS,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC;AAC7C,WAAO,EAAE,MAAM,WAAW,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG;AAAA,EAC1D;AAEA,SAAO,EAAE,MAAM,UAAU;AAC3B;AAEO,SAAS,aAAa,KAAgB,OAAoC;AAC/E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ,WAAW;AACzB,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAE3D,QAAM,SAAS,IACb,MAAM,IACN,MAAM,IACN,aAAa;AACf,QAAM,sBAAsB;AAC5B,QAAM,mBAAmB;AACzB,QAAM,sBAAsB;AAE5B,QAAM,WAAW,CAAC,SAAyC;AACzD,QAAI,KAAK,SAAS,OAAO;AACvB,aAAO,EAAE,GAAG,KAAK,IAAI,KAAK,YAAY,KAAK,MAAM,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,GAAG;AAAA,IAC5E;AACA,UAAM,SAAS,YAAY,KAAK,OAAO,IAAI,EAAE,QAAQ;AACrD,UAAM,SAAS,KAAK;AAAA,MAClB;AAAA,MACA,GAAG,KAAK,OAAO,IAAI,CAACC,OAAM,YAAY,GAAGA,GAAE,CAAC,KAAKA,GAAE,CAAC,IAAI,KAAK,EAAE,KAAK;AAAA,IACtE;AACA,WAAO,EAAE,GAAG,KAAK,IAAI,KAAK,SAAS,IAAI,SAAS,EAAE,GAAG,GAAG,KAAK,KAAK,OAAO,SAAS,KAAK,EAAE;AAAA,EAC3F;AAEA,QAAM,WAA2B,CAAC;AAClC,MAAI,IAAI;AACN,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAEF,QAAM,QAAQ,oBAAI,IAAkB;AACpC,QAAM,UAA4C,CAAC;AACnD,QAAM,UAA4C,CAAC;AAEnD,MAAI,UAAU;AACd,MAAIC,aAAY,SAAS;AACzB,QAAM,YAAY,SAAS;AAE3B,aAAW,UAAU,IAAI,SAAS;AAChC,UAAM,QAAQ,OAAO,MAAM,IAAI,QAAQ;AACvC,UAAM,SAAS,KAAK,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACpD,UAAM,UAAU,KAAK,IAAI,SAAS,MAAM,GAAG,YAAY,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAE;AACrF,UAAM,WAAW,MAAM,OAAO,CAAC,GAAG,OAAO,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,MAAM,SAAS,MAAM;AACpF,UAAM,UAAU,SAAS,MAAM,WAAW;AAE1C,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,SAAS,GAAG,WAAW,OAAO,SAAS,QAAQ,QAAQ;AAAA,QAC5D,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,GAAG,aAAa,oBAAoB;AAAA,MAC5C;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,MAAM,UAAU,IAAI,YAAY,IAAI,OAAO,QAAQ,WAAW;AAAA,QAC1E,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,QAAI,KAAK,YAAY,SAAS;AAC9B,WAAO,MAAM,QAAQ,CAAC,MAAM,MAAM;AAChC,YAAM,EAAE,GAAAC,GAAE,IAAI,MAAM,CAAC;AACrB,YAAM,MAAY,EAAE,GAAG,UAAU,KAAK,GAAG,IAAI,OAAO,QAAQ,QAAQA,GAAE;AACtE,UAAI,KAAK,SAAS,OAAO;AACvB,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,QAAQ,SAAS,QAAQ,QAAQ,KAAK;AAAA,YAChD,IAAI;AAAA,YACJ,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AACA,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI,IAAIA,KAAI,IAAI,OAAO,MAAM,MAAM,QAAQ,MAAM;AAAA,YAC7E,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,cAAM,IAAI,KAAK,MAAM,GAAG;AACxB,gBAAQ,KAAK,IAAI,IAAI,EAAE,QAAQ,IAAI;AACnC,YAAI,KAAK,QAAQ;AACf,mBAAS;AAAA,YACP,EAAE;AAAA,cACA,EAAE,GAAG,IAAI,IAAI,IAAI,QAAQ,IAAI,GAAG,IAAI,IAAIA,KAAI,EAAE;AAAA,cAC9C;AAAA,cACA,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,kBAAQ,KAAK,EAAE,MAAM,KAAK,QAAQ,KAAK,OAAO,CAAC;AAAA,QACjD;AAAA,MACF,OAAO;AACL,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,QAAQ,SAAS,QAAQ,SAAS,GAAG;AAAA,YAC/C,IAAI;AAAA,YACJ,aAAa;AAAA,UACf,CAAC;AAAA,QACH;AACA,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,OAAO,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,QAAQ,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,QACtF;AACA,aAAK,OAAO,QAAQ,CAACF,IAAG,OAAO;AAC7B,mBAAS;AAAA,YACP,EAAE,KAAK,GAAGA,GAAE,CAAC,KAAKA,GAAE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM,KAAK,KAAK,IAAI,OAAO,QAAQ,IAAI;AAAA,UACtF;AAAA,QACF,CAAC;AACD,cAAM,IAAI,KAAK,IAAI,GAAG;AACtB,gBAAQ,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI;AAAA,MACnC;AACA,YAAME,KAAI;AAAA,IACZ,CAAC;AAED,IAAAD,aAAY,KAAK,IAAIA,YAAW,YAAY,OAAO;AACnD,eAAW,UAAU;AAAA,EACvB;AAGA,QAAM,kBAAkB,QACrB,IAAI,CAAC,EAAE,MAAM,OAAO,MAAM;AACzB,UAAM,MAAM,OAAO,SAAS,GAAG,IAAI,OAAO,MAAM,OAAO,QAAQ,GAAG,IAAI,CAAC,IAAI;AAC3E,UAAM,KAAK,MAAM,IAAI,GAAG;AACxB,WAAO,KAAK,EAAE,MAAM,IAAI,OAAO,IAAI;AAAA,EACrC,CAAC,EACA,OAAO,CAACE,OAAqDA,OAAM,IAAI;AAE1E,QAAM,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC;AAGvC,QAAM,iBAAiB,oBAAI,IAAoC;AAC/D,aAAWA,MAAK,iBAAiB;AAC/B,UAAM,YAAYA,GAAE,KAAK,IAAIA,GAAE,KAAK,SAASA,GAAE,GAAG;AAClD,UAAM,MAAM,YACR,GAAG,KAAK,MAAMA,GAAE,KAAK,IAAIA,GAAE,KAAK,KAAK,CAAC,IAAI,KAAK,MAAMA,GAAE,GAAG,CAAC,CAAC,KAC5D,GAAG,KAAK,MAAMA,GAAE,GAAG,IAAIA,GAAE,GAAG,KAAK,CAAC,IAAI,KAAK,MAAMA,GAAE,KAAK,CAAC,CAAC;AAC9D,QAAI,CAAC,eAAe,IAAI,GAAG,EAAG,gBAAe,IAAI,KAAK,CAAC,CAAC;AACxD,mBAAe,IAAI,GAAG,EAAG,KAAKA,EAAC;AAAA,EACjC;AAEA,aAAW,SAAS,eAAe,OAAO,GAAG;AAC3C,UAAM,IAAI,MAAM;AAChB,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,EAAE,MAAM,IAAI,OAAO,IAAI,MAAM,CAAC;AACpC,YAAM,SAAS,KAAK,IAAI,KAAK,QAAQ;AACrC,YAAM,SAAS,KAAK,IAAI,KAAK,SAAS;AACtC,YAAM,QAAQ,EAAE,GAAG,QAAQ,GAAG,OAAO;AACrC,YAAM,YAAY,UAAU,GAAG;AAC/B,YAAM,OAAO,YAAY,GAAG,IAAI,GAAG,IAAI,GAAG;AAC1C,YAAM,gBAAgB,GAAG,IAAI,KAAK,IAAI,GAAG,SAAS,GAAG,EAAE;AACvD,YAAM,OAAO,UAAU,GAAG,IAAI,KAAK,UAAU,GAAG,IAAI,KAAK,SAAS;AAClE,YAAM,MAAM,EAAE,GAAG,MAAM,GAAG,KAAK;AAE/B,YAAM,YAAY,aAAa,OAAO,CAAC,MAAM,MAAM,QAAQ,MAAM,EAAE;AACnE,YAAM,gBAAgB,qBAAqB,CAAC,OAAO,GAAG,GAAG,SAAS,IAAI;AAEtE,UAAI;AACJ,UAAI;AAEJ,UAAI,CAAC,eAAe;AAClB,iBAAS,CAAC,OAAO,GAAG;AACpB,YAAI,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,MACrE,OAAO;AACL,cAAM,eAAe,YAAY,KAAK,IAAI,KAAK,QAAQ,GAAG,IAAI,GAAG;AACjE,cAAM,gBAAgB,YAAY,GAAG,IAAI,KAAK;AAC9C,cAAM,kBAAkB,eAAe,iBAAiB;AACxD,cAAM,cAAc,KAAK;AAAA,UACvB;AAAA,UACA,KAAK,IAAI,IAAI,gBAAgB,eAAe,OAAO,IAAI,EAAE;AAAA,QAC3D;AACA,cAAM,QAAQ,kBAAkB,KAAK,IAAI,KAAK,KAAK;AACnD,iBAAS,CAAC,OAAO,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,EAAE,GAAG,GAAG;AACtE,cAAM,IAAI,KAAK;AAAA,UACb;AAAA,UACA,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI;AAAA,UAC5B,KAAK,IAAI,QAAQ,MAAM,CAAC,IAAI;AAAA,UAC5B,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;AAAA,QAC5B;AACA,cAAM,QAAQ,IAAI,IAAI,MAAM,IAAI,IAAI;AACpC,cAAM,KAAK,YAAY,QAAQ,IAAI,QAAQ;AAC3C,cAAM,KAAK,YAAY,QAAQ,IAAI,QAAQ;AAC3C,YAAI,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,MAAM,IAAI,QAAQ,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,MAC/Q;AAEA,UAAI,qBAAqB,QAAQ,SAAS,IAAI,GAAG;AAC/C,gBAAQ;AAAA,UACN,4CAA4C,MAAM;AAAA,QACpD;AAAA,MACF;AAEA,eAAS,KAAK,EAAE,KAAK,GAAG,QAAQ,SAAS,KAAK,EAAE,WAAWC,UAAS,CAAC,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,QAAe;AAAA,IACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,UAAU,aAAa,QAAQ,QAAQH,aAAY,OAAO;AAAA,IACxF,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,MAAM,CAAC,SAAS,QAAQ,SAAS,MAAM,OAAO,SAAS,CAAC;AAAA,EAC1D;AACA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,SAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGF,OAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACF;;;AC/TA,SAASM,OAAM,OAAwB;AACrC,MAAI;AACJ,MAAI;AACJ,QAAM,SAAmB,CAAC;AAC1B,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,kBAAkB,IAAI;AAChC,QAAI,EAAE,CAAC,MAAM,OAAQ;AACrB,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,OAAO,EAAE,CAAC,CAAC;AACnB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,UAAU;AACrB,aAAO,KAAK,GAAG,EAAE,MAAM,CAAC,CAAC;AACzB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC;AAAA,EACF;AACF;AAEO,SAAS,WAAW,KAAc,OAAoC;AAC3E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ,WAAW;AACzB,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAE3D,QAAM,YAAY,IAAI,SAAS,IAAI,OAAO;AAC1C,QAAM,MAAM,IACV,SAAS,IACT,SAAS,IACT,SAAS,IACT,UAAU,IACV,OAAO;AACT,QAAM,eAAe,IACnB,YAAY,IACZ,cAAc,KACd,oBAAoB;AAEtB,QAAM,cAAc,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,KAAK,YAAY,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;AACxF,QAAM,cAAc,KAAK,IAAI,WAAW,IAAI,OAAO,QAAQ,CAAC;AAC5D,QAAM,eAAe,MAAM;AAAA,IAAK,EAAE,QAAQ,YAAY;AAAA,IAAG,CAAC,GAAG,MAC3D,KAAK,IAAI,QAAQ,YAAY,CAAC,KAAK,CAAC;AAAA,EACtC;AACA,QAAM,WAAW,aAAa,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,KAAK,cAAc,KAAK;AAC3F,QAAM,SAAS,KAAK,IAAI,UAAU,WAAW;AAC7C,QAAM,QAAQ,SAAS,MAAM;AAC7B,QAAM,QAAQ,SAAS,eAAe,SAAS,YAAY,UAAU;AACrE,QAAM,WAAW,qBAAqB,SAAS,KAAK,QAAQ,QAAQ;AAEpE,QAAM,KAAK,QACT,KAAK,SAAS;AAChB,QAAM,WAA2B,CAAC;AAClC,MAAI,IAAI;AACN,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAEF,WAAS;AAAA,IACP,EAAE,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,MAAM,GAAG,QAAQ,SAAS,QAAQ,QAAQ,KAAK;AAAA,MAC1F,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AACA,WAAS;AAAA,IACP,EAAE,KAAK,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,OAAO,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;AAAA,MAC1F,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AACA,WAAS;AAAA,IACP,EAAE,KAAK,wDAA8C,KAAK,IAAI,KAAK,IAAI,OAAO,WAAW;AAAA,MACvF,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,SAAmB,CAAC;AAC1B,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAGF,CAAC;AACL,QAAM,UAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,aAAW,SAAS,cAAc;AAChC,YAAQ,KAAK,CAAC;AACd,SAAK,QAAQ;AAAA,EACf;AAEA,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,MAAM,QAAQ,CAAC,KAAK,cAAc,aAAa,CAAC,KAAK,UAAU,UAAU;AAC/E,UAAM,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,OAAO,QAAQ,QAAQ,OAAO;AAC7D,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,QAAQ,SAAS,QAAQ,SAAS,KAAK,EAAE,IAAI,GAAG,aAAa,kBAAkB,CAAC;AAAA,IAC9F;AACA,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,CAAC,IAAI,KAAK,SAAS,GAAG,QAAQ,IAAI,OAAO,QAAQ,SAAS;AAAA,QACtE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,WAAO,KAAK,KAAK,SAAS,CAAC;AAC3B,YAAQ,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI;AAAA,EACtC;AAEA,QAAM,SAAS,QAAQ,SAAS;AAChC,QAAM,YAAY;AAClB,QAAM,aAAa,QAAQ,SAAS,YAAY,IAAI,OAAO;AAC3D,QAAM,aAAa,KAAK,QAAQ;AAChC,QAAM,iBAAiB,YAAY,WAAW,IAAI,EAAE;AACpD,QAAM,kBAAkB;AAAA,IACtB,IAAI,aAAa,iBAAiB,IAAI;AAAA,IACtC,IAAI,aAAa,iBAAiB,IAAI;AAAA,IACtC,IAAI,aAAa,OAAO;AAAA,IACxB,IAAI,aAAa;AAAA,EACnB;AACA,WAAS;AAAA,IACP,EAAE,KAAK,WAAW,YAAY,YAAY,MAAM,QAAQ,WAAW,EAAE,QAAQ,SAAS,CAAC;AAAA,EACzF;AAEA,MAAI,OAAO,QAAQ,CAAC,OAAO,MAAM;AAC/B,UAAM,SAAS,YAAY,CAAC;AAC5B,UAAM,MAAM,QAAQ,CAAC,KAAK,cAAc,aAAa,CAAC,KAAK,UAAU,UAAU;AAC/E,UAAM,MAAM,EAAE,GAAG,IAAI,GAAG,QAAQ,OAAO,QAAQ,QAAQ,QAAQ;AAC/D,UAAM,KAAK,KAAK,SAAS;AACzB,YAAQ,KAAK,EAAE;AACf,aAAS,KAAK,EAAE,KAAK,KAAK,QAAQ,SAAS,QAAQ,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1E,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,IAAI,SAAS,UAAU,IAAI,OAAO,MAAM,MAAM,QAAQ,MAAM;AAAA,QACxE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,YAAQ,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI;AAAA,EACvC,CAAC;AAED,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,QAAQ,QAAQ,MAAM,GAAG,KAAK;AAChE,aAAS;AAAA,MACP,EAAE;AAAA,QACA,cAAc,OAAO,CAAC,GAAI,QAAQ,QAAQ,QAAQ,eAAe;AAAA,QACjE,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,WAAWC,UAAS;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAe;AAAA,IACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,QAAQ,SAAS,GAAG,QAAQ,KAAK,QAAQ,OAAO;AAAA,IAC9E,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,MAAM,CAAC,SAAS,QAAQ,WAAW,MAAM,OAAO,SAAS,CAAC;AAAA,EAC5D;AAGA,QAAM,cAAc,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,OAAO,QAAQ,OAAO,CAAC;AACnE,SAAO,EAAE,OAAO,SAAwC,YAAY;AACtE;AAEA,SAAS,qBAAqB,WAAmB,QAAgB,UAA0B;AACzF,SAAO,YAAY,KAAK,IAAI,IAAI,SAAS,YAAY,CAAC;AACxD;AAEA,SAAS,cACP,GACA,IACA,IACA,OACQ;AACR,QAAM,KAAK,IAAI,CAAC;AAChB,MAAI,SAAS,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,IAAI;AAC7E,WAAO,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,IAAI,IAAI,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;AAAA,EAC5H;AACA,SAAO,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;AAC9C;AAEO,IAAM,OACX;AAAA,EACE,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGD,OAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,WAAW,IAAI,KAAK;AAAA,EAC7B;AACF;;;AC3LK,SAAS,WACdE,MACA,OACAC,QACA,SACa;AACb,QAAM,EAAE,QAAQ,WAAW,WAAW,IAAI;AAC1C,QAAM,cAAc,QAAQ,eAAe;AAC3C,QAAM,MAAM,QAAQ,OAAO;AAC3B,QAAM,aAAa,gBAAgB;AACnC,QAAM,UAAU,MAAM;AAEtB,QAAM,WAA2B,CAAC;AAClC,QAAM,QAAgB,CAAC;AAEvB,EAAAA,OAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,UAAM,QAAQ,aAAa,YAAY,cAAc;AACrD,UAAM,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO;AAC9C,UAAM,IAAI,OAAO,KAAK,aAAa,IAAI,IAAI;AAC3C,UAAM,OAAa,EAAE,GAAG,GAAG,OAAO,WAAW,QAAQ,WAAW;AAChE,UAAM,KAAK,IAAI;AACf,aAAS;AAAA,MACPD,KAAI,KAAK,MAAM,KAAK,QAAQ,QAAQ,SAAS,KAAK,UAAU,QAAQ,QAAQ,KAAK;AAAA,QAC/E,IAAI;AAAA,QACJ,GAAI,KAAK,gBAAgB,SAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,MAC5E,CAAC;AAAA,IACH;AACA,QAAI,KAAK,UAAU,QAAW;AAC5B,eAAS;AAAA,QACPA,KAAI;AAAA,UACF,KAAK;AAAA,UACL,IAAI,YAAY;AAAA,UAChB,IAAI,aAAa,IAAI;AAAA,UACrB,MAAM,WAAW;AAAA,UACjB,QAAQ;AAAA,UACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,UAAU,QAAW;AAE5B,YAAM,KAAK,aAAa,IAAI,YAAY,IAAI,IAAI;AAChD,YAAM,KAAK,aAAa,IAAI,IAAI,IAAI,aAAa,IAAI;AACrD,eAAS;AAAA,QACPA,KAAI,KAAK,KAAK,OAAO,IAAI,IAAI,MAAM,WAAW,eAAe,QAAQ,WAAW;AAAA,UAC9E,QAAQ,aAAa,WAAW;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,IAAIC,OAAM;AAChB,QAAM,aAAa,MAAM,IAAI,IAAI,KAAK,aAAa,YAAY,eAAe,IAAI,KAAK;AACvF,QAAM,SAAe;AAAA,IACnB,GAAG,OAAO;AAAA,IACV,GAAG,OAAO;AAAA,IACV,OAAO,aAAa,aAAa;AAAA,IACjC,QAAQ,aAAa,aAAa;AAAA,EACpC;AAEA,SAAO,EAAE,UAAU,OAAO,OAAO;AACnC;;;AC/EO,IAAM,YAAY;AAElB,IAAM,YAAY;AAElB,SAAS,eACd,OACA,UACkB;AAClB,SAAO,UAAU,gBAAgB,UAAU,aAAa,QAAQ;AAClE;AAQO,SAAS,UAAU,OAAe,OAAO,GAAW;AACzD,QAAM,IAAI;AACV,QAAM,KAAK;AACX,QAAM,QAAQ,IAAI,IAAI,CAAC;AACvB,QAAM,WAAW,IAAI,IAAI,CAAC;AAC1B,QAAM,WAAW,IAAI,CAAC;AACtB,SACE,eAAe,SAAS,kBAAkB,IAAI,CAAC,mBAAmB,EAAE,WAAW,QAAQ,WAAW,KAAK,kCACrF,CAAC,IAAI,KAAK,OAAO,EAAE,aAAa,KAAK,4BACxC,SAAS,kBAAkB,IAAI,CAAC,mBAAmB,EAAE,WAAW,QAAQ,WAAW,KAAK,6BAC1F,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,EAAE,aAAa,KAAK;AAE9D;AAQO,SAAS,aACd,GACA,OACA,MACA,MACA,OACAC,SAAQ,GACsC;AAC9C,QAAM,UAAU,cAAc,GAAG,OAAO,MAAM,MAAM,OAAO,UAAUA,MAAK;AAC1E,SAAO,EAAE,UAAU,QAAQ,UAAU,QAAQ,QAAQ,UAAU;AACjE;AAEO,SAAS,cACd,GACA,OACA,MACA,MACA,OACA,MACAA,SAAQ,GACyC;AACjD,QAAM,OAAO,MAAM,WAAW;AAC9B,QAAM,UAAU,OAAO;AACvB,QAAM,WAAW;AACjB,QAAM,WAAW;AACjB,QAAM,KAAK,KAAK,IAAI,KAAK,QAAQ;AACjC,QAAM,KAAK,KAAK,IAAI,KAAK,SAAS;AAElC,MAAI,SAAS,YAAY,SAAS,OAAO;AACvC,UAAMC,KAAI,SAAS,WAAW,IAAI;AAClC,UAAM,QAAQ;AACd,UAAM,QAAQ,SAAS,WAAW,KAAK,IAAI,KAAK,SAAS,IAAI,KAAK,IAAI;AACtE,UAAM,QAAQ,QAAQA,MAAK,WAAWD,SAAQ;AAC9C,UAAM,SAAS,QAAQC,MAAK,YAAYA,KAAI,IAAI,OAAO;AACvD,WAAO;AAAA,MACL,UAAU;AAAA,QACR,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK;AAAA,UAChF,WAAW;AAAA,QACb,CAAC;AAAA,QACD,EAAE,KAAK,MAAM,OAAO,QAAQ,MAAM,OAAO,EAAE,QAAQ,UAAU,QAAQ,OAAO,CAAC;AAAA,MAC/E;AAAA,MACA,WAAWA,KAAI,IAAI,SAAS,IAAI,SAAS,OAAO;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,IAAI,SAAS,UAAU,IAAI;AACjC,QAAM,QAAQ,KAAKD,SAAQ;AAC3B,QAAM,QAAQ,SAAS,UAAU,KAAK,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI;AACpE,QAAM,QAAQ,QAAQ,IAAI;AAC1B,QAAM,SAAS,QAAQ,IAAI;AAC3B,QAAM,SAAqB,IAAI,IAAI,UAAU;AAC7C,SAAO;AAAA,IACL,UAAU;AAAA,MACR,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK;AAAA,QAChF,WAAW;AAAA,MACb,CAAC;AAAA,MACD,EAAE,KAAK,MAAM,QAAQ,QAAQ,GAAG,MAAM,OAAO,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAAA,IACzE;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,SAAS,mBACd,UACA,SACA,OACA,MAC6D;AAC7D,QAAM,SAAS,MAAM,QAAQ;AAC7B,QAAM,gBAAgBE,mBAAkB,QAAQ;AAChD,QAAM,KAAK,SAAS,cAAc;AAClC,QAAM,KAAK,SAAS,cAAc;AAClC,QAAM,kBAAkBC,mBAAkB,UAAU,IAAI,EAAE;AAC1D,QAAM,iBAAiBC,kBAAiB,SAAS,IAAI,EAAE;AACvD,SAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAG;AAAA,QACH,OAAO,IAAI,cAAc,QAAQ,SAAS,CAAC;AAAA,QAC3C,QAAQ,IAAI,cAAc,SAAS,SAAS,CAAC;AAAA,MAC/C;AAAA,MACA,YAAY,MAAM,QAAQ;AAAA,MAC1B,UAAU;AAAA,MACV,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAEO,SAASF,mBAAkB,UAAyC;AACzE,QAAM,SAAS,SAAS,IAAIG,iBAAgB,EAAE,OAAO,CAAC,MAAiB,MAAM,MAAS;AACtF,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAClE,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/C,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/C,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;AACzD,QAAM,OAAO,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;AAC1D,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AACrE;AAEA,SAASA,kBAAiB,SAAyC;AACjE,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,QACL,GAAG,QAAQ,OAAO,IAAI,QAAQ;AAAA,QAC9B,GAAG,QAAQ,OAAO,IAAI,QAAQ;AAAA,QAC9B,OAAO,QAAQ,SAAS;AAAA,QACxB,QAAQ,QAAQ,SAAS;AAAA,MAC3B;AAAA,IACF,KAAK;AACH,aAAOC,eAAc,QAAQ,GAAG,QAAQ,WAAW;AAAA,IACrD,KAAK;AACH,aAAOC,eAAc,OAAO;AAAA,IAC9B,KAAK;AACH,aAAOL,mBAAkB,QAAQ,QAAQ;AAAA,EAC7C;AACF;AAEA,SAASK,eAAc,MAAqD;AAC1E,QAAM,WAAW,YAAY,KAAK,SAAS,KAAK,QAAQ;AACxD,QAAM,IACJ,KAAK,WAAW,WACZ,KAAK,SAAS,IAAI,SAAS,QAAQ,IACnC,KAAK,WAAW,QACd,KAAK,SAAS,IAAI,SAAS,QAC3B,KAAK,SAAS;AACtB,SAAO;AAAA,IACL;AAAA,IACA,GAAG,KAAK,SAAS,IAAI,KAAK;AAAA,IAC1B,OAAO,SAAS;AAAA,IAChB,QAAQ,KAAK,WAAW;AAAA,EAC1B;AACF;AAEA,SAASD,eAAc,GAAW,aAA2B;AAC3D,QAAM,OAAO,CAAC,GAAG,EAAE,SAAS,kBAAkB,CAAC,EAAE,IAAI,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC,CAAC;AAChF,MAAI,KAAK,SAAS,EAAG,QAAO,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,QAAQ,EAAE;AAC9D,QAAM,KAAK,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;AAC5C,QAAM,KAAK,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;AAC5C,QAAM,MAAM,cAAc;AAC1B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI;AAC/B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI;AAC/B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI;AAC/B,QAAM,OAAO,KAAK,IAAI,GAAG,EAAE,IAAI;AAC/B,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK;AACrE;AAEA,SAASH,mBACP,UACA,IACA,IACgB;AAChB,SAAO,SAAS,IAAI,CAAC,YAAYK,kBAAiB,SAAS,IAAI,EAAE,CAAC;AACpE;AAEA,SAASA,kBAAiB,SAAuB,IAAY,IAA0B;AACrF,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,QAAQC,eAAc,QAAQ,QAAQ,IAAI,EAAE,EAAE;AAAA,IACrE,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ,EAAE,GAAG,IAAI,QAAQ,OAAO,IAAI,EAAE,GAAG,GAAG,IAAI,QAAQ,OAAO,IAAI,EAAE,EAAE;AAAA,MACzE;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,GAAGC,gBAAe,QAAQ,GAAG,IAAI,EAAE,EAAE;AAAA,IAC5D,KAAK;AACH,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU,EAAE,GAAG,IAAI,QAAQ,SAAS,IAAI,EAAE,GAAG,GAAG,IAAI,QAAQ,SAAS,IAAI,EAAE,EAAE;AAAA,MAC/E;AAAA,IACF,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,UAAUP,mBAAkB,QAAQ,UAAU,IAAI,EAAE,EAAE;AAAA,IAC7E,KAAK;AACH,aAAO,EAAE,GAAG,SAAS,GAAG,IAAI,QAAQ,IAAI,EAAE,GAAG,GAAG,IAAI,QAAQ,IAAI,EAAE,EAAE;AAAA,EACxE;AACF;AAEA,SAASC,kBACP,SACA,IACA,IACkC;AAClC,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM;AAAA,MAC7C;AAAA,MACA,EAAE,QAAQK,eAAc,OAAO,QAAQ,IAAI,EAAE,EAAE;AAAA,IACjD,CAAC;AAAA,EACH;AACF;AAEA,SAASA,eAAc,MAAY,IAAY,IAAkB;AAC/D,SAAO,EAAE,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,GAAG,IAAI,KAAK,IAAI,EAAE,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAC5F;AAEA,SAASC,gBAAe,GAAW,IAAY,IAAoB;AACjE,MAAI,IAAI;AACR,SAAO,EAAE,QAAQ,oBAAoB,CAAC,UAAU;AAC9C,UAAM,QAAQ,MAAM,MAAM,IAAI,KAAK;AACnC,WAAO,OAAO,IAAI,OAAO,KAAK,IAAI,KAAK,CAAC;AAAA,EAC1C,CAAC;AACH;;;AC9NA,SAASC,OAAM,OAAyB;AACtC,MAAI;AACJ,MAAIC,SAAkB,CAAC;AACvB,MAAI;AACJ,MAAI,OAAyB;AAE7B,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,UAAI,EAAE,SAAS,EAAG,CAAAA,SAAQ,EAAE,MAAM,CAAC;AACnC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,WAAW,EAAE,CAAC,MAAM,SAAS;AACxC,MAAAA,SAAQ,EAAE,MAAM,CAAC;AACjB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,YAAY;AACvB,YAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC,EAAG,YAAW;AACnC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,QAAQ;AACnB,aAAO,eAAe,EAAE,CAAC,GAAG,IAAI;AAChC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,OAAAA;AAAA,IACA,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAAS,YAAY,KAAe,OAAoC;AAC7E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ;AACd,QAAM,SAAS,IAAI,MAAM;AACzB,QAAM,QAAQ,KAAK,IAAI,QAAQ,IAAI,YAAY,MAAM;AACrD,QAAM,QAAQ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,IAAI,CAAC,MAAM,YAAY,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;AACnF,QAAM,OAAyB,IAAI,SAAS,aAAa,aAAa;AACtE,QAAM,aAAa,SAAS;AAE5B,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,OAAO,OAAO;AACpB,QAAM,UAAU;AAChB,QAAM,SAAS,aACX,EAAE,GAAG,SAAS,SAAS,GAAG,SAAS,SAAS,KAAK,IACjD,EAAE,GAAG,QAAQ,GAAG,SAAS,SAAS,QAAQ;AAE9C,QAAM,aAA0B,MAAM;AAAA,IAAK,EAAE,QAAQ,MAAM;AAAA,IAAG,CAAC,GAAG,MAChE,IAAI,SAAS,EAAE,OAAO,IAAI,MAAM,CAAC,EAAG,IAAI,EAAE,MAAM,QAAQ,WAAW;AAAA,EACrE;AACA,QAAM,QAAQ,WAAW,GAAG,OAAO,YAAY;AAAA,IAC7C;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AAED,QAAM,WAA2B,CAAC,GAAG,MAAM,QAAQ;AACnD,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AACd,UAAM,OAAO,OAAO,IAAI,QAAQ;AAChC,UAAM,WAAW,OAAO;AACxB,UAAM,YAAY,OAAO,IAAI,QAAQ;AAGrC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,QAC7D,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,WAAW,UAAU;AAAA,MACzB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,WAAW,WAAW,UAAU,GAAG,OAAO,IAAI,GAAG,MAAM,QAAQ,SAAS;AAAA,QAC7E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,YAAY,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,QAC3E,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,WAAW,UAAU;AAAA,MACzB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,WAAW,YAAY,UAAU,GAAG,OAAO,IAAI,GAAG,MAAM,QAAQ,SAAS;AAAA,QAC9E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,UAAM,OAAO,OAAO,IAAI,QAAQ;AAChC,UAAM,UAAU,OAAO;AACvB,UAAM,aAAa,OAAO,IAAI,QAAQ;AAGtC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,OAAO,CAAC;AAAA,QACvE,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,WAAW,UAAU;AAAA,MACzB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,WAAW,MAAM,UAAU,UAAU,IAAI,GAAG,MAAM,QAAQ,SAAS;AAAA,QACxE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,aAAa,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC;AAAA,QAC7E,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,WAAW,UAAU;AAAA,MACzB;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,WAAW,MAAM,aAAa,UAAU,IAAI,MAAM,MAAM,QAAQ,SAAS;AAAA,QAC9E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,SAAS,GAAG;AACd,UAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,UAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,UAAM,OAAO,WAAW;AACxB,UAAM,QAAQ,aACV,aAAa,GAAG,OAAO,WAAW,SAAS,QAAQ,WAAW,CAAC,IAC/D,cAAc,GAAG,OAAO,WAAW,SAAS,QAAQ,WAAW,SAAS,CAAC;AAC7E,UAAM,OAAO,aACT,aAAa,GAAG,OAAO,UAAU,QAAQ,QAAQ,SAAS,OAAO,IAAI,CAAC,IACtE,cAAc,GAAG,OAAO,UAAU,QAAQ,QAAQ,SAAS,SAAS,OAAO,IAAI,CAAC;AACpF,aAAS,KAAK,GAAG,MAAM,UAAU,GAAG,KAAK,QAAQ;AAAA,EACnD;AAEA,QAAM,UAGF,CAAC;AACL,QAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,KAAK;AAAA,EACpC,CAAC;AAED,QAAM,YAAY,mBAAmB,UAAU,SAAS,OAAO;AAAA,IAC7D,UAAU,QAAQ,SAAS,MAAM,OAAO,SAAS;AAAA,EACnD,CAAC;AACD,SAAO,EAAE,OAAO,UAAU,OAAO,SAAS,UAAU,QAA8B;AACpF;AAEO,IAAM,QAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGD,OAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;AC9LA,IAAM,QAAQ,oBAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC;AAErC,SAASE,OAAM,OAA0B;AACvC,MAAI;AACJ,MAAIC,SAA2B,CAAC;AAChC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,OAAyB;AAE7B,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,UAAU;AACrB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,YAAY;AACvB,YAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC,EAAG,YAAW;AACnC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,WAAW,EAAE,CAAC,MAAM,SAAS;AACxC,MAAAA,SAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,MAAO,MAAM,IAAI,CAAC,IAAI,OAAO,CAAE;AACvD;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,YAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC,EAAG,SAAQ;AAChC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,QAAQ;AACnB,YAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC,EAAG,QAAO;AAC/B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,QAAQ;AACnB,aAAO,eAAe,EAAE,CAAC,GAAG,IAAI;AAChC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,MAAM,YAAYA,OAAM;AAE9B,QAAM,SAA4B,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,MAAMA,OAAM,CAAC,KAAK,IAAI;AAExF,QAAM,cAAc,OAAO,UAAU,CAAC,MAAM,MAAM,IAAI;AACtD,MAAI,aAAa;AACjB,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,IAAK,KAAI,OAAO,CAAC,MAAM,KAAM,cAAa;AAC7E,QAAMC,KAAI,UAAU,eAAe,IAAI,cAAc;AACrD,QAAM,IAAI,SAAS,cAAc,IAAI,aAAa;AAElD,SAAO;AAAA,IACL,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAOA;AAAA,IACP,MAAM;AAAA,IACN;AAAA,EACF;AACF;AAEO,SAAS,aAAa,KAAgB,OAAoC;AAC/E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ;AACd,QAAM,QAAQ,IAAI;AAClB,QAAM,SAAS,IAAI,MAAM,IAAI,CAAC,MAAO,IAAI,YAAY,GAAG,IAAI,EAAE,QAAQ,CAAE;AACxE,QAAM,QAAQ,KAAK,IAAI,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;AACvD,QAAM,OAAyB,IAAI,SAAS,aAAa,aAAa;AACtE,QAAM,aAAa,SAAS;AAE5B,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,OAAO;AACb,QAAM,SAAS,aACX,EAAE,GAAG,QAAQ,GAAG,SAAS,SAAS,KAAK,IACvC,EAAE,GAAG,SAAS,MAAM,GAAG,SAAS,OAAO;AAE3C,QAAM,aAA0B,IAAI,MAAM;AAAA,IAAI,CAAC,GAAG,MAChD,MAAM,OAAO,EAAE,OAAO,GAAG,OAAO,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,QAAQ,YAAY,OAAO,OAAO,CAAC,EAAE;AAAA,EAC7F;AACA,QAAM,QAAQ,WAAW,GAAG,OAAO,YAAY;AAAA,IAC7C;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AAED,QAAM,WAA2B,CAAC,GAAG,MAAM,QAAQ;AACnD,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,MAAM,IAAI,QAAQ,CAAC;AAC1C,QAAM,YAAY,MAAM,MAAM,IAAI,SAAS,CAAC;AAC5C,QAAM,UAA4C,CAAC;AACnD,QAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,KAAK;AAAA,EACpC,CAAC;AACD,MAAI,UAAW,SAAQ,QAAQ,EAAE,QAAQ,UAAU;AACnD,MAAI,SAAU,SAAQ,OAAO,EAAE,QAAQ,SAAS;AAIhD,MAAI,YAAY,WAAW;AACzB,UAAM,YAAY,IAAI,SAAS,QAAQ,IAAI,QAAQ;AACnD,UAAM,mBAAmB,WACrB,oBAAoB,WAAW,UAAU,IACzC,MAAM,MAAM,OAAyC,CAAC,KAAK,MAAM,MAAM;AACrE,UAAI,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,KAAK;AAC9B,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AACT,UAAM,UAAU,WAAW,eAAe,IAAI,IAAI,QAAQ,CAAC;AAC3D,UAAM,QAAQ,WAAW,gBAAgB,IAAI,IAAI,SAAS,CAAC;AAC3D,UAAM,kBAAkB,gBAAgB;AAAA,MACtC,SAAS;AAAA,MACT,YAAY;AAAA,QACV;AAAA,UACE;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,OAAO;AAAA,UACP,OAAO,OAAO,KAAK;AAAA,UACnB,SAAS;AAAA,UACT,UAAU,aAAa,MAAM;AAAA,UAC7B,WAAW,aAAa,MAAM;AAAA,UAC9B,WAAW;AAAA,UACX,OAAO;AAAA,YACL,OAAO,QAAQ;AAAA,YACf,cAAc,OAAO;AAAA,YACrB,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,oBAAoB,gBAAgB,SAAS;AAAA,MAAI,CAAC,YACtD,QAAQ,SAAS,UAAU,QAAQ,WAAW,WAAW,yBAAyB,IAC9E,EAAE,GAAG,SAAS,WAAW,WAAW,aAAa,IAAI,IACrD;AAAA,IACN;AACA,UAAM,YAAY,kBAAkB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AACnE,UAAM,aAAa,kBAAkB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AACpE,aAAS,KAAK,GAAG,WAAW,GAAG,UAAU;AAAA,EAC3C;AAGA,MAAI,aAAa,UAAU;AACzB,UAAM,QAAQ,IAAI,SAAS,QAAQ,IAAI,QAAQ;AAC/C,UAAM,QAAQ,aACV,aAAa,GAAG,OAAO,WAAW,SAAS,QAAQ,WAAW,CAAC,IAC/D,cAAc,GAAG,OAAO,WAAW,SAAS,QAAQ,WAAW,SAAS,CAAC;AAC7E,UAAM,OAAO,aACT,aAAa,GAAG,OAAO,UAAU,QAAQ,QAAQ,SAAS,OAAO,IAAI,CAAC,IACtE,cAAc,GAAG,OAAO,UAAU,QAAQ,QAAQ,SAAS,SAAS,OAAO,IAAI,CAAC;AACpF,aAAS,KAAK,GAAG,MAAM,UAAU,GAAG,KAAK,QAAQ;AAAA,EACnD;AAEA,QAAM,YAAY,mBAAmB,UAAU,SAAS,OAAO;AAAA,IAC7D,UAAU,QAAQ,SAAS,MAAM,OAAO,SAAS;AAAA,EACnD,CAAC;AACD,SAAO,EAAE,OAAO,UAAU,OAAO,SAAS,UAAU,QAA8B;AACpF;AAEA,SAAS,oBAAoB,MAAY,YAAuD;AAC9F,MAAI,YAAY;AACd,WAAO;AAAA,MACL,YAAY;AAAA,QACV,QAAQ;AAAA,UACN,GAAG,KAAK,IAAI,KAAK,QAAQ;AAAA,UACzB,GAAG,KAAK;AAAA,UACR,OAAO,KAAK,QAAQ;AAAA,UACpB,QAAQ,KAAK;AAAA,QACf;AAAA,MACF;AAAA,MACA,aAAa,EAAE,QAAQ,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,QAAQ,GAAG,QAAQ,KAAK,OAAO,EAAE;AAAA,IAC9F;AAAA,EACF;AACA,SAAO;AAAA,IACL,YAAY;AAAA,MACV,QAAQ;AAAA,QACN,GAAG,KAAK;AAAA,QACR,GAAG,KAAK,IAAI,KAAK,SAAS;AAAA,QAC1B,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK,SAAS;AAAA,MACxB;AAAA,IACF;AAAA,IACA,aAAa,EAAE,QAAQ,EAAE,GAAG,KAAK,GAAG,GAAG,KAAK,GAAG,OAAO,KAAK,OAAO,QAAQ,KAAK,SAAS,EAAE,EAAE;AAAA,EAC9F;AACF;AAEO,IAAM,SAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGF,OAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACF;;;AC/NA,SAASG,OAAM,OAAyB;AACtC,MAAI;AACJ,MAAIC,SAAkB,CAAC;AACvB,MAAI,OAAyB;AAC7B,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,UAAI,EAAE,SAAS,EAAG,CAAAA,SAAQ,EAAE,MAAM,CAAC;AACnC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,WAAW,EAAE,CAAC,MAAM,SAAS;AACxC,MAAAA,SAAQ,EAAE,MAAM,CAAC;AACjB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,QAAQ;AACnB,aAAO,eAAe,EAAE,CAAC,GAAG,IAAI;AAChC;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC,GAAI,OAAAA,QAAO,KAAK;AAClE;AAEO,SAAS,YAAY,KAAe,OAAoC;AAC7E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ;AACd,QAAM,IAAI,IAAI,MAAM;AACpB,QAAM,QAAQ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,IAAI,CAAC,MAAM,YAAY,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;AACnF,QAAM,OAAyB,IAAI,SAAS,aAAa,aAAa;AACtE,QAAM,aAAa,SAAS;AAE5B,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,OAAO,OAAO;AACpB,QAAM,UAAU;AAChB,QAAM,SAAS,aACX,EAAE,GAAG,SAAS,SAAS,GAAG,SAAS,SAAS,KAAK,IACjD,EAAE,GAAG,QAAQ,GAAG,SAAS,SAAS,QAAQ;AAE9C,QAAM,aAA0B,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE;AACnE,QAAM,QAAQ,WAAW,GAAG,OAAO,YAAY;AAAA,IAC7C;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AAED,QAAM,WAA2B,CAAC,GAAG,MAAM,QAAQ;AACnD,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY;AACd,UAAM,OAAO,OAAO,IAAI,QAAQ;AAChC,UAAM,WAAW,OAAO;AACxB,UAAM,YAAY,OAAO,IAAI,IAAI;AAGjC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,QAC7D,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,aAAa,WAAW,WAAW,UAAU;AAAA,MACjD;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,cAAc,WAAW,UAAU,GAAG,OAAO,IAAI,GAAG,MAAM,QAAQ,SAAS;AAAA,QAChF,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,SAAS,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,YAAY,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC;AAAA,QAC3E,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,aAAa,WAAW,WAAW,UAAU;AAAA,MACjD;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,cAAc,YAAY,UAAU,GAAG,OAAO,IAAI,GAAG,MAAM,QAAQ,SAAS;AAAA,QACjF,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,UAAM,OAAO,OAAO,IAAI,QAAQ;AAChC,UAAM,UAAU,OAAO;AACvB,UAAM,aAAa,OAAO,IAAI,IAAI;AAGlC,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,OAAO,CAAC;AAAA,QACvE,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,aAAa,WAAW,WAAW,UAAU;AAAA,MACjD;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,cAAc,MAAM,UAAU,UAAU,IAAI,GAAG,MAAM,QAAQ,SAAS;AAAA,QAC3E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,aAAa,OAAO,CAAC;AAAA,QAC7E,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,aAAa,WAAW,WAAW,UAAU;AAAA,MACjD;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE,KAAK,cAAc,MAAM,aAAa,UAAU,IAAI,MAAM,MAAM,QAAQ,SAAS;AAAA,QACjF,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,IAAI,GAAG;AACT,UAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,UAAM,WAAW,MAAM,MAAM,IAAI,CAAC;AAClC,UAAM,OAAO,MAAM;AACnB,UAAM,QAAQ,aACV,aAAa,GAAG,OAAO,WAAW,SAAS,QAAQ,WAAW,CAAC,IAC/D,cAAc,GAAG,OAAO,WAAW,SAAS,QAAQ,WAAW,SAAS,CAAC;AAC7E,UAAM,OAAO,aACT,aAAa,GAAG,OAAO,UAAU,QAAQ,QAAQ,SAAS,OAAO,IAAI,CAAC,IACtE,cAAc,GAAG,OAAO,UAAU,QAAQ,QAAQ,SAAS,SAAS,OAAO,IAAI,CAAC;AACpF,aAAS,KAAK,GAAG,MAAM,UAAU,GAAG,KAAK,QAAQ;AAAA,EACnD;AAEA,QAAM,UAGF,CAAC;AACL,QAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,KAAK;AAAA,EACpC,CAAC;AAED,QAAM,YAAY,mBAAmB,UAAU,SAAS,OAAO;AAAA,IAC7D,UAAU,QAAQ,SAAS,MAAM,OAAO,SAAS;AAAA,EACnD,CAAC;AACD,SAAO,EAAE,OAAO,UAAU,OAAO,SAAS,UAAU,QAA8B;AACpF;AAEO,IAAM,QAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGD,OAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;ACxLA,SAASE,OAAM,OAA0B;AACvC,MAAI;AACJ,QAAM,QAAkB,CAAC;AACzB,MAAI,OAAyB;AAE7B,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,UAAU;AACrB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,QAAQ;AACnB,aAAO,eAAe,EAAE,CAAC,GAAG,IAAI;AAChC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,QAAQ;AAEnB,YAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,YAAM,IAAI,KAAK,MAAM,gCAAgC;AACrD,UAAI,EAAG,OAAM,KAAK,EAAE,OAAO,EAAE,CAAC,EAAG,KAAK,GAAG,UAAU,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC;AAAA,eACxD,KAAM,OAAM,KAAK,EAAE,OAAO,MAAM,UAAU,EAAE,CAAC;AAAA,IACxD;AAAA,EACF;AACA,SAAO,EAAE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC,GAAI,OAAO,KAAK;AAClE;AAGA,SAASC,UAAS,GAA4C;AAC5D,QAAM,IAAI,EAAE,KAAK;AACjB,QAAM,KAAK,EAAE,MAAM,oCAAoC;AACvD,MAAI;AACF,WAAO;AAAA,MACL,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,MAC5B,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,MAC5B,SAAS,GAAG,CAAC,IAAK,GAAG,CAAC,GAAI,EAAE;AAAA,IAC9B;AACF,QAAM,KAAK,EAAE,MAAM,6CAA6C;AAChE,MAAI,GAAI,QAAO,CAAC,SAAS,GAAG,CAAC,GAAI,EAAE,GAAG,SAAS,GAAG,CAAC,GAAI,EAAE,GAAG,SAAS,GAAG,CAAC,GAAI,EAAE,CAAC;AAChF,SAAO;AACT;AAEA,SAASC,OAAM,GAAmB;AAChC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAC5C,SAAS,EAAE,EACX,SAAS,GAAG,GAAG;AACpB;AAGA,SAASC,QAAO,GAAU,GAAU,GAAkB;AACpD,QAAM,KAAKF,UAAS,CAAC,GACnB,KAAKA,UAAS,CAAC;AACjB,MAAI,CAAC,MAAM,CAAC,GAAI,QAAO;AACvB,QAAM,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK;AACpC,QAAM,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK;AACpC,QAAM,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,CAAC,KAAK;AACrC,SAAO,IAAIC,OAAM,CAAC,CAAC,GAAGA,OAAM,CAAC,CAAC,GAAGA,OAAM,EAAE,CAAC;AAC5C;AAEO,SAAS,aAAa,KAAgB,OAAoC;AAC/E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ;AACd,QAAM,OAAyB,IAAI,SAAS,aAAa,aAAa;AAGtE,QAAM,QAAQ,IAAI,MACf,IAAI,CAAC,IAAI,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAC7B,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAEtD,QAAM,aAAa,MAAM,IAAI,CAAC,OAAO,GAAG,QAAQ;AAChD,QAAM,MAAM,WAAW,SAAS,KAAK,IAAI,GAAG,UAAU,IAAI;AAC1D,QAAM,MAAM,WAAW,SAAS,KAAK,IAAI,GAAG,UAAU,IAAI;AAC1D,QAAM,OAAO,MAAM;AAEnB,QAAM,SAAS,KAAK,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,YAAY,GAAG,OAAO,IAAI,EAAE,KAAK,CAAC;AACnF,QAAM,QAAQ,KAAK,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,YAAY,OAAO,GAAG,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC;AAC7F,QAAM,OAAO;AACb,QAAM,QAAQ,SAAS,QAAQ,OAAO;AAEtC,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,SAAS,EAAE,GAAG,QAAQ,GAAG,SAAS,OAAO;AAG/C,QAAM,aAA0B,MAAM,IAAI,CAAC,OAAO;AAChD,UAAM,OAAO,SAAS,IAAI,KAAK,GAAG,WAAW,OAAO;AACpD,UAAM,IAAI,QAAQ,IAAI,QAAQ;AAC9B,WAAO,EAAE,MAAMC,QAAO,QAAQ,SAAS,QAAQ,SAAS,CAAC,EAAE;AAAA,EAC7D,CAAC;AAED,QAAM,QAAQ,WAAW,GAAG,OAAO,YAAY;AAAA,IAC7C;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AAED,QAAM,WAA2B,CAAC,GAAG,MAAM,QAAQ;AACnD,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,CAAC,IAAI,MAAM;AACvB,UAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,UAAM,KAAK,KAAK,IAAI,KAAK,SAAS,IAAI,OAAO;AAC7C,aAAS,KAAK,EAAE,KAAK,GAAG,OAAO,KAAK,IAAI,MAAM,IAAI,MAAM,QAAQ,MAAM,EAAE,QAAQ,OAAO,CAAC,CAAC;AACzF,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,GAAG,QAAQ,GAAG,KAAK,IAAI,KAAK,QAAQ,MAAM,IAAI,MAAM,QAAQ,MAAM;AAAA,QAC9E,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,UAGF,CAAC;AACL,QAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,KAAK;AAAA,EACpC,CAAC;AAED,QAAM,YAAY,mBAAmB,UAAU,SAAS,KAAK;AAC7D,SAAO,EAAE,OAAO,UAAU,OAAO,SAAS,UAAU,QAA8B;AACpF;AAEO,IAAM,SAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGH,OAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACF;;;ACpJA,SAASI,OAAM,OAAyB;AACtC,MAAI;AACJ,MAAIC,SAAkB,CAAC;AACvB,MAAI;AACJ,MAAI,OAAyB;AAE7B,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,UAAI,EAAE,SAAS,EAAG,CAAAA,SAAQ,EAAE,MAAM,CAAC;AACnC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,WAAW,EAAE,CAAC,MAAM,SAAS;AACxC,MAAAA,SAAQ,EAAE,MAAM,CAAC;AACjB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,YAAY;AACvB,YAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC,EAAG,YAAW;AACnC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,QAAQ;AACnB,aAAO,eAAe,EAAE,CAAC,GAAG,IAAI;AAChC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,OAAAA;AAAA,IACA,GAAI,aAAa,SAAY,EAAE,SAAS,IAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAAS,YAAY,KAAe,OAAoC;AAC7E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ;AACd,QAAM,SAAS,IAAI,MAAM;AACzB,QAAM,QAAQ,KAAK,IAAI,QAAQ,IAAI,YAAY,QAAQ,CAAC;AACxD,QAAM,QAAQ,QAAQ;AACtB,QAAM,QAAQ,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,IAAI,CAAC,MAAM,YAAY,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;AACnF,QAAM,OAAyB,IAAI,SAAS,eAAe,eAAe;AAC1E,QAAM,aAAa,SAAS;AAE5B,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,OAAO,OAAO;AACpB,QAAM,UAAU;AAChB,QAAM,SAAS,aACX,EAAE,GAAG,QAAQ,GAAG,SAAS,SAAS,KAAK,IACvC,EAAE,GAAG,SAAS,SAAS,GAAG,SAAS,SAAS,KAAK;AAIrD,QAAM,UAA6B;AAAA,IACjC,GAAG,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,MAAM,IAAI;AAAA,IAC3C,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,QAAQ;AAAA,EAC5B;AACA,QAAM,aAA0B,QAAQ;AAAA,IAAI,CAAC,MAC3C,MAAM,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,WAAW;AAAA,EACzD;AACA,QAAM,QAAQ,WAAW,GAAG,OAAO,YAAY;AAAA,IAC7C;AAAA,IACA,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AAED,QAAM,WAA2B,CAAC,GAAG,MAAM,QAAQ;AACnD,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,IAAI,MAAM,MAAM,KAAK,IAAK,MAAM,MAAM,CAAC;AAChE,QAAM,UAAU,UAAU,QAAQ,IAAI,QAAQ,QAAQ,IAAI,OAAO,IAAI,QAAQ;AAC7E,WAAS;AAAA,IACP,EAAE,KAAK,cAAc,SAAS,OAAO,IAAI,GAAG,MAAM,QAAQ,SAAS;AAAA,MACjE,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACA,WAAS;AAAA,IACP,EAAE;AAAA,MACA,KAAK,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC;AAAA,MAChF,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,WAAWC,UAAS;AAAA,IACxB;AAAA,EACF;AAGA,MAAI,SAAS,GAAG;AACd,QAAI,YAAY;AACd,YAAM,MAAM,cAAc,GAAG,OAAO,SAAU,OAAO,QAAQ,WAAW,UAAU,CAAC;AACnF,eAAS,KAAK,GAAG,IAAI,QAAQ;AAAA,IAC/B,OAAO;AACL,YAAM,QAAQ,QAAS,IAAI,QAAS,SAAS;AAC7C,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC;AAAA,UAC/E,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,WAAWA,UAAS;AAAA,QACxB;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,OAAO,OAAO,IAAI,UAAU,GAAG,QAAQ,GAAG,MAAM,QAAQ,WAAW;AAAA,UACxE,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAGF,CAAC;AACL,QAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,KAAK;AAAA,EACpC,CAAC;AAED,QAAM,YAAY,mBAAmB,UAAU,SAAS,OAAO;AAAA,IAC7D,SAAS,QAAQ,SAAS,MAAM,OAAO,SAAS;AAAA,EAClD,CAAC;AACD,SAAO,EAAE,OAAO,UAAU,OAAO,SAAS,UAAU,QAA8B;AACpF;AAEO,IAAM,QAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGF,OAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;ACvJA,SAAS,aAAa,MAA2B;AAC/C,SAAO,KACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS;AACb,UAAM,IAAI,KAAK,MAAM,gCAAgC;AACrD,QAAI,EAAG,QAAO,EAAE,KAAK,EAAE,CAAC,EAAG,KAAK,GAAG,OAAO,EAAE,CAAC,EAAG,KAAK,EAAE;AACvD,WAAO,EAAE,KAAK,MAAM,OAAO,GAAG;AAAA,EAChC,CAAC;AACL;AAEA,SAAS,kBAAkB,MAAwB;AACjD,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,WAAW;AAEf,aAAW,MAAM,MAAM;AACrB,QAAI,UAAU;AACZ,iBAAW;AACX,iBAAW;AACX;AAAA,IACF;AACA,QAAI,YAAY,OAAO,MAAM;AAC3B,iBAAW;AACX;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,CAAC,YAAY,OAAO,KAAK;AAC3B,YAAM,QAAQ,QAAQ,KAAK;AAC3B,UAAI,MAAO,QAAO,KAAK,KAAK;AAC5B,gBAAU;AACV;AAAA,IACF;AACA,eAAW;AAAA,EACb;AAEA,MAAI,SAAU,OAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAClE,QAAM,OAAO,QAAQ,KAAK;AAC1B,MAAI,KAAM,QAAO,KAAK,IAAI;AAC1B,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAsD;AAClF,MAAI,WAAW;AACf,MAAI,WAAW;AAEf,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,UAAU;AACZ,iBAAW;AACX;AAAA,IACF;AACA,QAAI,YAAY,OAAO,MAAM;AAC3B,iBAAW;AACX;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,CAAC,YAAY,OAAO,KAAK;AAC3B,aAAO,EAAE,IAAI,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,KAAK,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,IAC1E;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,MAA+B;AACpD,QAAM,CAAC,QAAQ,EAAE,IAAI,kBAAkB,IAAI;AAC3C,SAAO,QAAQ,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI;AAC/C;AAEA,SAAS,aAAa,KAKP;AACb,QAAM,SAAS,IAAI,UAAU,CAAC;AAC9B,QAAM,eAAe,CAAC,GAAI,IAAI,gBAAgB,CAAC,CAAE;AACjD,aAAW,SAAS,QAAQ;AAC1B,QAAI,OAAO,MAAM,UAAU,YAAY,CAAC,aAAa,SAAS,MAAM,KAAK;AACvE,mBAAa,KAAK,MAAM,KAAK;AAAA,EACjC;AAEA,QAAM,SAAS,OAAO;AAAA,IACpB,CAAC,IAAI,MAAO,OAAO,EAAE,UAAU,WAAW,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,IAClE;AAAA,EACF;AACA,QAAM,qBAAqB,KAAK,IAAI,IAAI,WAAW,GAAG,SAAS,GAAG,CAAC;AACnE,MAAI,aAAa,WAAW,GAAG;AAC7B,aAAS,IAAI,GAAG,IAAI,oBAAoB,IAAK,cAAa,KAAK,OAAO,CAAC,CAAC;AAAA,EAC1E,OAAO;AACL,WAAO,aAAa,SAAS,mBAAoB,cAAa,KAAK,OAAO,aAAa,MAAM,CAAC;AAAA,EAChG;AAEA,SAAO;AAAA,IACL,GAAI,IAAI,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,IACtD,SAAS,aAAa;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASG,QAAM,OAA2B;AACxC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,SAAsB,CAAC;AAE7B,aAAW,QAAQ,MAAM,KAAK,GAAG;AAC/B,UAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,WAAW;AACtB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,WAAW;AACtB,YAAM,OAAO,KAAK,MAAM,CAAC,EAAE,KAAK;AAChC,UAAI,CAAC,KAAM;AACX,UAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,sBAAc,OAAO,IAAI;AACzB,+BAAuB;AAAA,MACzB,OAAO;AACL,+BAAuB,kBAAkB,IAAI;AAAA,MAC/C;AACA;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,UAAU;AACrB,YAAM,SAAS,qBAAqB,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC;AACxD,UAAI;AACF,eAAO,KAAK,EAAE,OAAO,cAAc,OAAO,EAAE,GAAG,SAAS,aAAa,OAAO,OAAO,EAAE,CAAC;AAAA,IAC1F;AAAA,EACF;AAEA,SAAO,aAAa,EAAE,OAAO,SAAS,aAAa,cAAc,sBAAsB,OAAO,CAAC;AACjG;AAEA,SAAS,UAAU,IAA6B;AAC9C,SAAO,OAAO,OAAO,WAAW,KAAK,EAAE,KAAK,KAAK,EAAE;AACrD;AAEO,SAAS,cAAc,KAAiB,OAAoC;AACjF,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ;AACd,QAAM,OAAO,KAAK;AAAA,IAChB;AAAA,IACA,GAAG,IAAI,aAAa,IAAI,CAAC,UAAU,YAAY,OAAO,IAAI,EAAE,QAAQ,EAAE;AAAA,EACxE;AACA,QAAM,SAAS;AACf,QAAM,WAAW;AACjB,QAAM,WAAW;AAEjB,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,SAAS,EAAE,GAAG,QAAQ,GAAG,SAAS,OAAO;AAE/C,QAAM,WAA2B,CAAC;AAClC,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,WAAW,oBAAI,IAGnB;AACF,QAAM,UAGF,CAAC;AACL,WAAS,IAAI,GAAG,IAAI,IAAI,SAAS,KAAK;AACpC,UAAM,OAAO,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,IAAI,IAAI,OAAO,OAAO,MAAM,QAAQ,MAAM;AAChF,UAAM,QAAQ,IAAI,aAAa,CAAC,KAAK,OAAO,CAAC;AAC7C,aAAS,IAAI,UAAU,CAAC,GAAG,EAAE,KAAK,GAAG,QAAQ,KAAK,CAAC;AACnD,QAAI,CAAC,SAAS,IAAI,UAAU,KAAK,CAAC,EAAG,UAAS,IAAI,UAAU,KAAK,GAAG,EAAE,KAAK,GAAG,QAAQ,KAAK,CAAC;AAC5F,YAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,KAAK;AAClC,aAAS,KAAK,EAAE,KAAK,MAAM,QAAQ,SAAS,QAAQ,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3E,aAAS;AAAA,MACP,EAAE;AAAA,QACA;AAAA,QACA,KAAK,IAAI,KAAK,QAAQ;AAAA,QACtB,KAAK,IAAI,KAAK,SAAS,IAAI,OAAO;AAAA,QAClC;AAAA,QACA,QAAQ;AAAA,QACR,EAAE,QAAQ,UAAU,QAAQ,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,IAAI,OAAO;AACtC,MAAIC,YAAW;AAEf,aAAW,SAAS,IAAI,QAAQ;AAC9B,UAAM,UAAU,SAAS,IAAI,UAAU,MAAM,KAAK,CAAC;AACnD,QAAI,CAAC,WAAW,MAAM,QAAQ,WAAW,EAAG;AAC5C,UAAM,EAAE,QAAQ,MAAM,IAAI,IAAI;AAC9B,UAAM,KAAK,KAAK,IAAI,KAAK,SAAS;AAClC,QAAI,IAAI;AACR,QAAI,QAAQ,KAAK,IAAI,KAAK;AAC1B,UAAM,QAAQ,QAAQ,CAAC,GAAG,MAAM;AAC9B,YAAM,QAAQ,EAAE,QAAQ,GAAG,EAAE,GAAG,MAAM,EAAE,KAAK,KAAK,EAAE;AACpD,YAAM,IAAI,YAAY,OAAO,IAAI,EAAE,QAAQ;AAC3C,YAAM,MAAM,EAAE,GAAG,GAAG,KAAK,SAAS,GAAG,OAAO,GAAG,QAAQ,OAAO;AAE9D,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,QAAQ,SAAS,KAAK;AAAA,UACpF,WAAWC;AAAA,QACb,CAAC;AAAA,MACH;AACA,eAAS,KAAK,EAAE,KAAK,KAAK,QAAQ,SAAS,QAAQ,QAAQ,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1E,eAAS;AAAA,QACP,EAAE,KAAK,OAAO,IAAI,IAAI,GAAG,KAAK,OAAO,MAAM,MAAM,QAAQ,MAAM;AAAA,UAC7D,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,cAAQ,IAAI,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,IAAI;AACxC,cAAQ,IAAI;AACZ,UAAI,QAAQ;AACZ,MAAAD,YAAW,KAAK,IAAIA,WAAU,KAAK;AAAA,IACrC,CAAC;AAAA,EACH;AAEA,QAAM,QAAQA,YAAW;AACzB,QAAM,SAAS,OAAO,IAAI,IAAI,UAAU,QAAQ;AAChD,QAAM,QAAe;AAAA,IACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO;AAAA,IACrC,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,MAAM,CAAC,SAAS,QAAQ,SAAS,MAAM,OAAO,SAAS,CAAC;AAAA,EAC1D;AACA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,UAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGD,QAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU,CAAC;AAAA,MACX,GAAG,aAAa,KAAK,MAAM,KAAK,CAAwB;AAAA,IAC1D;AAAA,EACF;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,cAAc,IAAI,KAAK;AAAA,EAChC;AACF;;;ACpRA,SAASG,QAAM,OAA0B;AACvC,MAAI;AACJ,QAAM,OAAmB,CAAC;AAC1B,MAAI,YAAY;AAEhB,QAAM,aAAiC,CAAC;AAExC,aAAW,QAAQ,MAAM,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG;AAC/D,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,UAAM,IAAI,QAAQ,MAAM,KAAK;AAC7B,QAAI,EAAE,CAAC,MAAM,UAAU;AACrB,YAAM,MAAM,EAAE,CAAC,GAAG,MAAM,gBAAgB;AACxC,UAAI,KAAK;AACP,cAAM,IAAI,OAAO,IAAI,CAAC,CAAC,GACrB,IAAI,OAAO,IAAI,CAAC,CAAC;AACnB,iBAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,KAAK,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;AAAA,MAC3E;AACA;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC9B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,WAAW;AACtB,kBAAY;AACZ;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,OAAO;AAClB,WAAK,KAAK,EAAE,MAAM,CAAC,CAAC;AACpB;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,aAAa;AAExB,iBAAW,OAAO,EAAE,MAAM,CAAC,GAAG;AAC5B,cAAM,IAAI,IAAI,MAAM,eAAe;AACnC,YAAI,EAAG,YAAW,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAAA,MACrD;AACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC;AAAA,IACA;AAAA,IACA,GAAI,WAAW,SAAS,IAAI,EAAE,WAAW,IAAI,CAAC;AAAA,EAChD;AACF;AAEO,SAAS,aAAa,KAAgB,OAAoC;AAC/E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ;AAEd,QAAM,QAAQ,IAAI,KAAK;AACvB,QAAM,QAAQ,IAAI,KAAK,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG,CAAC;AAChE,QAAM,OAAO,IAAI,KAAK,IAAI,CAAC,MAAM,MAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AACpF,QAAM,QAAQ,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,EAAE,IAAI,CAAC,MAAM,YAAY,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC;AAErF,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,UAAU,IAAI,YAAY,WAAW,gBAAgB,IAAI;AAC/D,QAAM,UAAU,IAAI,YAAY,KAAK;AACrC,QAAM,SAAS,EAAE,GAAG,SAAS,SAAS,GAAG,SAAS,SAAS,QAAQ;AAEnE,QAAM,WAA2B,CAAC;AAClC,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAGF,CAAC;AACL,OAAK,QAAQ,CAAC,KAAK,MAAM;AACvB,UAAM,YAAY,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,IAAI,IAAI,MAAM;AACzD,UAAM,aAA0B,IAAI,IAAI,CAAC,GAAG,MAAM;AAChD,YAAM,YAAY,IAAI,YAAY,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,OAAO,KAAK,OAAO,CAAC,KAAK;AAC9E,aAAO,YACH,EAAE,OAAO,GAAG,MAAM,QAAQ,SAAS,aAAa,MAAM,QAAQ,QAAQ,QAAQ,IAC9E,EAAE,OAAO,EAAE;AAAA,IACjB,CAAC;AACD,UAAM,QAAQ,WAAW,GAAG,OAAO,YAAY;AAAA,MAC7C,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,YAAY;AAAA,IACd,CAAC;AACD,aAAS,KAAK,GAAG,MAAM,QAAQ;AAC/B,UAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC/B,cAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,KAAK;AAAA,IACzC,CAAC;AACD,QAAI,IAAI,WAAW;AACjB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,OAAO,CAAC;AAAA,UACR,OAAO,IAAI;AAAA,UACX,UAAU,IAAI,QAAQ,IAAI,OAAO;AAAA,UACjC,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,MAAM;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,IAAI,WAAW;AACjB,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,YAAM,KAAK,OAAO,IAAI,IAAI,QAAQ,QAAQ;AAC1C,eAAS;AAAA,QACP,EAAE,KAAK,OAAO,CAAC,GAAG,IAAI,OAAO,IAAI,GAAG,WAAW,eAAe,QAAQ,WAAW;AAAA,UAC/E,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,IAAI,QAAQ,QAAQ;AACzC,QAAM,SAAS,OAAO,IAAI,QAAQ,QAAQ;AAC1C,QAAM,QAAe;AAAA,IACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO;AAAA,IACrC,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF;AACA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,SAET;AAAA,EACF,aAAa,OAAe;AAC1B,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGA,QAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACF;;;ACxKA,IAAMC,WAAU,OAAc,EAAE,OAAO,oBAAI,IAAI,GAAG,KAAK,MAAM;AAE7D,SAASC,QAAO,MAAa,MAAoB;AAC/C,MAAI,OAAO;AACX,aAAW,MAAM,MAAM;AACrB,QAAI,QAAQ,KAAK,MAAM,IAAI,EAAE;AAC7B,QAAI,UAAU,QAAW;AACvB,cAAQD,SAAQ;AAChB,WAAK,MAAM,IAAI,IAAI,KAAK;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AACA,OAAK,MAAM;AACb;AAEO,SAAS,UAAU,OAA6B;AAErD,QAAM,SAAS,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AAChD,QAAM,QAAQ,OAAO,OAAO,CAAC,MAAM,MAAM,UAAU,MAAM,YAAY,iBAAiB,KAAK,CAAC,CAAC;AAC7F,QAAM,OAAOA,SAAQ;AACrB,aAAW,KAAK,MAAO,CAAAC,QAAO,MAAM,CAAC;AAErC,QAAM,QAAoB,CAAC;AAC3B,MAAI,IAAI;AACR,QAAM,OAAO,CAAC,GAAU,QAAgB,cAA+B;AACrE,UAAM,KAAK,IAAI,GAAG;AAClB,UAAM,WAAqB,CAAC;AAG5B,UAAM,OAAiB,EAAE,MACrB;AAAA,MACE;AAAA,MACA,OAAO;AAAA,MACP,OAAO,CAAC,QAAQ,QAAQ;AAAA,MACxB;AAAA,MACA,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjD,IACA;AAAA,MACE;AAAA,MACA,OAAO;AAAA,MACP,OAAO,CAAC,KAAK;AAAA,MACb;AAAA,MACA,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjD;AACJ,UAAM,KAAK,IAAI;AAEf,eAAW,CAAC,IAAI,KAAK,KAAK,EAAE,MAAO,UAAS,KAAK,KAAK,OAAO,SAAS,IAAI,EAAE,CAAC;AAC7E,WAAO;AAAA,EACT;AACA,OAAK,MAAM,EAAE;AAEb,SAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,WAAW,MAAM,MAAM;AAChE;AAEO,IAAM,OAAoC;AAAA,EAC/C,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ,CAAC,IAAkB,UAAuC,WAAW,IAAI,KAAK;AACxF;;;AC1CA,IAAMC,aAAW;AACjB,IAAM,kBAAkB;AAIxB,SAAS,cAAc,OAAe,IAAY,OAAO,GAAW;AAClE,QAAM,IAAI;AACV,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AACvB,SAAO,eAAe,EAAE,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,KAAK;AAC3M;AAqBA,IAAM,UAAU;AAEhB,SAASC,QAAM,OAA6C;AAC1D,MAAI;AACJ,MAAI,WAAW;AACf,QAAM,QAAkB,CAAC;AACzB,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,YAAY,oBAAI,IAA2B;AACjD,QAAMC,SAAiB,CAAC;AACxB,QAAM,SAAS,CAAC,OAAqB;AACnC,QAAI,CAAC,OAAO,IAAI,EAAE,GAAG;AACnB,aAAO,IAAI,IAAI,EAAE;AACjB,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,aAAW,OAAO,MAAM,MAAM,OAAO,GAAG;AACtC,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,CAAC,KAAM;AACX,UAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,eAAe,EAAE,CAAC,MAAM,UAAW;AAChD,QAAI,EAAE,CAAC,MAAM,YAAY;AACvB,iBAAW;AACX;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,cAAc;AACzB,iBAAW;AACX;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,QAAQ;AACnB,YAAM,QAAQ,KACX,MAAM,CAAC,EACP,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtB,YAAM,KAAK,MAAM,CAAC,KAAK;AACvB,UAAI,IAAI;AACN,eAAO,EAAE;AACT,YAAI,MAAM,WAAW,GAAG;AACtB,iBAAO,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;AAAA,QAC/B,WAAW,MAAM,UAAU,GAAG;AAC5B,iBAAO,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE;AAC7B,cAAI,MAAM,CAAC,MAAM,UAAU;AACzB,sBAAU,IAAI,IAAI,QAAQ;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,UAAM,IAAI,KAAK,MAAM,OAAO;AAC5B,QAAI,GAAG;AACL,YAAM,OAAO,EAAE,CAAC,GACd,KAAK,EAAE,CAAC;AACV,YAAM,WAAW,EAAE,CAAC,GAAG,KAAK;AAC5B,UAAI;AACJ,UAAI;AACJ,UAAI,aAAa,SAAU,QAAO;AAAA,eACzB,aAAa,SAAU,QAAO;AAAA,UAClC,SAAQ;AACb,aAAO,IAAI;AACX,aAAO,EAAE;AACT,MAAAA,OAAM,KAAK,EAAE,MAAM,IAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAI,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG,CAAC;AAAA,IACjF;AAAA,EACF;AAEA,QAAM,QAAiB,MAAM,IAAI,CAAC,QAAQ;AAAA,IACxC;AAAA,IACA,OAAO,OAAO,IAAI,EAAE;AAAA,IACpB,GAAI,UAAU,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,IAAI,EAAE,EAAE,IAAI,CAAC;AAAA,EACzD,EAAE;AACF,SAAO,EAAE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC,GAAI,UAAU,OAAO,OAAAA,OAAM;AAC7E;AAEO,SAAS,YAAY,KAAe,OAAoC;AAC7E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ,WAAW;AACzB,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,QAAQ;AAEd,QAAM,SAAS,CAAC,MAAqB,KAAK,IAAI,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE,QAAQ,EAAE;AACvF,QAAM,SAAsB,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,OAAO,CAAC,GAAG,QAAQ,MAAM,EAAE;AAChG,QAAM,SAAsB,IAAI,MAAM,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE;AAC7E,QAAM,mBAAmB,IAAI,MAAM;AAAA,IAAK,CAAC,GAAG,MAC1C,IAAI,MAAM,KAAK,CAAC,OAAO,MAAM,MAAM,KAAK,EAAE,SAAS,MAAM,MAAM,EAAE,OAAO,MAAM,IAAI;AAAA,EACpF;AACA,QAAM,WAAW,mBAAmB,KAAK,IAAI,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,KAAK;AAC/E,QAAM,SAAS,cAAc,QAAQ,QAAQ;AAAA,IAC3C,WAAW;AAAA,IACX;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,MAAM,CAAC,OAAqB;AAChC,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE;AAC7B,WAAO,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO;AAAA,EACrE;AAGA,QAAM,WAAW,CAAC,WAChB,OAAO,IAAI,CAAC,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG;AACpF,QAAM,sBAAsB,CAAC,QAAuB,OAAO,QAAgC;AACzF,QAAI,OAAO,WAAW,EAAG,QAAO,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE;AAC7E,QAAI,QAAQ;AACZ,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAS,KAAK,MAAM,OAAO,CAAC,EAAG,IAAI,OAAO,IAAI,CAAC,EAAG,GAAG,OAAO,CAAC,EAAG,IAAI,OAAO,IAAI,CAAC,EAAG,CAAC;AAAA,IACtF;AACA,QAAI,UAAU,EAAG,QAAO,EAAE,IAAI,OAAO,CAAC,GAAI,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE;AACjE,QAAI,SAAS;AACb,UAAM,SAAS,QAAQ;AACvB,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,YAAM,OAAO,OAAO,IAAI,CAAC;AACzB,YAAM,KAAK,OAAO,CAAC;AACnB,YAAM,UAAU,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC;AACvD,UAAI,SAAS,WAAW,UAAU,UAAU,GAAG;AAC7C,cAAM,KAAK,SAAS,UAAU;AAC9B,cAAM,MAAM,GAAG,IAAI,KAAK,KAAK;AAC7B,cAAM,MAAM,GAAG,IAAI,KAAK,KAAK;AAC7B,eAAO;AAAA,UACL,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,GAAG,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,EAAE;AAAA,UACvE,QAAQ,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG;AAAA;AAAA,QAC1B;AAAA,MACF;AACA,gBAAU;AAAA,IACZ;AACA,UAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,WAAO,EAAE,IAAI,MAAM,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE;AAAA,EAC5C;AAEA,QAAM,aAAa,CAAC,SAAwB;AAC1C,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,IACX;AAAA,EACF;AACA,QAAM,aAAa,CAAC,MAAY,OAAmB;AACjD,QAAI,KAAK,IAAI,KAAK,UAAU,GAAG,EAAG,QAAO;AACzC,QAAI,GAAG,IAAI,GAAG,UAAU,KAAK,EAAG,QAAO;AACvC,UAAM,KAAK,GAAG,IAAI,GAAG,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ;AACxD,UAAM,KAAK,GAAG,IAAI,GAAG,SAAS,KAAK,KAAK,IAAI,KAAK,SAAS;AAC1D,QAAI,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,EAAG,QAAO,MAAM,IAAI,QAAQ;AAC3D,WAAO,MAAM,IAAI,SAAS;AAAA,EAC5B;AACA,QAAM,aAAa,CAAC,MAAY,OAAmB,WAAW,IAAI,IAAI;AACtE,QAAMC,aAAY,CAAC,GAAS,MAAY,SAAqB;AAC3D,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,GAAG,EAAE,EAAE;AAAA,MAC3B,KAAK;AACH,eAAO,EAAE,GAAG,MAAM,GAAG,EAAE,IAAI,EAAE,OAAO;AAAA,MACtC,KAAK;AACH,eAAO,EAAE,GAAG,EAAE,GAAG,GAAG,KAAK;AAAA,MAC3B,KAAK;AACH,eAAO,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,KAAK;AAAA,IACvC;AAAA,EACF;AAEA,QAAMC,gBAAe;AACrB,QAAMC,eAAc;AACpB,QAAM,sBAAsB;AAC5B,QAAM,gBAAgB;AACtB,QAAM,YAAY;AAElB,QAAMC,gBAAe,CAAC,QAAkB,IAAY,OAAyB;AAC3E,UAAM,IAAI,OAAO;AACjB,QAAI,MAAM,EAAG,QAAO,CAAC;AACrB,QAAI,MAAM,GAAI,QAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,KAAK,MAAM,CAAC;AAClE,QAAI,MAAM,EAAG,QAAO,CAAC,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,CAAE,CAAC,CAAC;AAC3D,SAAK,IAAI,KAAKF,gBAAe,KAAK,IAAI;AACpC,YAAM,QAAQ,KAAK,OAAO,IAAI;AAC9B,aAAO,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,KAAK,QAAQ,IAAI,EAAE;AAAA,IAChE;AACA,UAAM,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC;AAC3D,aAAS,OAAO,GAAG,OAAO,GAAG,QAAQ;AACnC,UAAI,UAAU;AACd,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,OAAO,IAAI,IAAI,CAAC,IAAKA;AAC3B,YAAI,IAAI,CAAC,IAAK,MAAM;AAClB,cAAI,CAAC,IAAI;AACT,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,eAAS,IAAI,IAAI,GAAG,KAAK,GAAG,KAAK;AAC/B,cAAM,OAAO,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAKA;AAC9C,YAAI,IAAI,CAAC,IAAK,MAAM;AAClB,cAAI,CAAC,IAAI;AACT,oBAAU;AAAA,QACZ;AAAA,MACF;AACA,UAAI,IAAI,CAAC,IAAK,IAAI;AAChB,YAAI,CAAC,IAAI;AACT,kBAAU;AAAA,MACZ;AACA,UAAI,CAAC,QAAS;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,CAClB,MACA,MACA,UACoB;AACpB,UAAM,SAAS,oBAAI,IAAgB;AACnC,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,UAAM,SAAS,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS;AACvF,UAAM,aAAa,SAAS,SAAS,SAAS;AAC9C,UAAM,OAAO,aAAa,KAAK,IAAI,KAAK;AACxC,UAAM,MAAM,aAAa,KAAK,QAAQ,KAAK;AAC3C,UAAM,KAAK,OAAO,KAAK,IAAIC,cAAa,MAAM,CAAC;AAC/C,UAAM,KAAK,OAAO,MAAM,KAAK,IAAIA,cAAa,MAAM,CAAC;AACrD,UAAM,YAAYC;AAAA,MAChB,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AACA,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,aAAO,IAAI,OAAO,CAAC,EAAG,WAAWH,WAAU,MAAM,MAAM,UAAU,CAAC,CAAE,CAAC;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,CAAC,QAA6B;AACnD,UAAM,SAAe,CAAC;AACtB,eAAW,MAAM,KAAK;AACpB,YAAM,OAAO,OAAO,OAAO,SAAS,CAAC;AACrC,UAAI,CAAC,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,IAAI,MAAM;AAC7E,eAAO,KAAK,EAAE;AAAA,MAChB;AAAA,IACF;AACA,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,KAAK;AACvC,YAAM,IAAI,OAAO,IAAI,CAAC,GACpB,IAAI,OAAO,CAAC,GACZ,IAAI,OAAO,IAAI,CAAC;AAClB,YAAM,aAAa,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI;AACvE,YAAM,aAAa,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,CAAC,IAAI;AACvE,UAAI,cAAc,WAAY,QAAO,OAAO,GAAG,CAAC;AAAA,UAC3C;AAAA,IACP;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,CAAC,GAAG,OAAO,MAAM,OAAO,CAAC;AAC3C,QAAM,YAAY,oBAAI,IAAoB;AAC1C,MAAI,kBAAkB;AACtB,aAAW,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,QAAQ,GAAG;AACxC,UAAM,QAAQ,OAAO,UAAU,IAAI,CAAC;AACpC,QAAI,CAAC,SAAS,MAAM,WAAW,EAAG;AAClC,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE,IAAI;AACjC,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE,EAAE;AAC/B,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;AAC7D,UAAM,QAAQ,KAAK,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;AAC7D,UAAM,YAAY,UAAU,OAAO,CAAC,OAAO;AACzC,YAAM,KAAK,GAAG,IAAI,GAAG,SAAS;AAC9B,aAAO,MAAM,SAAS,MAAM;AAAA,IAC9B,CAAC;AACD,UAAM,QAAQ,KAAK,IAAI,GAAG,UAAU,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,KAAK,CAAC;AAChE,cAAU,IAAI,GAAG,QAAQ,sBAAsB,kBAAkB,aAAa;AAC9E;AAAA,EACF;AAGA,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,WAAS,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;AACzC,aAAS,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;AAC7C,YAAM,KAAK,IAAI,MAAM,CAAC,GACpB,KAAK,IAAI,MAAM,CAAC;AAClB,UAAI,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM;AAC1C,sBAAc,IAAI,GAAG,CAAC;AACtB,sBAAc,IAAI,GAAG,CAAC;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,oBAAI,IAAyD;AAChF,QAAM,iBAAiB,oBAAI,IAAkB;AAC7C,QAAM,eAAe,oBAAI,IAAkB;AAC3C,QAAM,WAAW,CAAC,IAAY,SAAuB,GAAG,EAAE,KAAK,IAAI;AACnE,QAAM,YAAY,CAChB,MACA,MACA,OACA,WACA,aACW;AACX,UAAM,OAAO,UAAU,IAAI,SAAS;AACpC,QAAI,SAAS,WAAc,SAAS,SAAS,SAAS,UAAW,QAAO;AACxE,UAAM,aAAa,cAAc,IAAI,SAAS;AAC9C,QAAI,SAAS,SAAS,SAAS,UAAU;AACvC,YAAM,MAAM,MAAM,IAAI,MAAM,QAAQ;AACpC,UAAI,CAAC,WAAY,QAAO;AACxB,YAAM,KAAK,MAAM,IAAI,MAAM,SAAS,KAAK,KAAK,IAAI,KAAK,SAAS;AAEhE,YAAM,OAAO,WAAY,MAAM,IAAI,IAAI,KAAM,MAAM,IAAI,KAAK;AAC5D,aAAO,MAAM,OAAO;AAAA,IACtB,OAAO;AACL,YAAM,MAAM,MAAM,IAAI,MAAM,SAAS;AACrC,UAAI,CAAC,WAAY,QAAO;AACxB,YAAM,KAAK,MAAM,IAAI,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ;AAC9D,YAAM,OAAO,WAAY,MAAM,IAAI,KAAK,IAAK,MAAM,IAAI,IAAI;AAC3D,aAAO,MAAM,OAAO;AAAA,IACtB;AAAA,EACF;AACA,aAAW,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,QAAQ,GAAG;AACxC,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;AACnD,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI;AAC/C,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,OAAO,UAAU,IAAI,CAAC;AAC5B,UAAM,KACJ,SAAS,SAAa,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAU,WAAW,GAAG,CAAC;AACtF,UAAM,KACJ,SAAS,SAAa,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAU,WAAW,GAAG,CAAC;AACtF,mBAAe,IAAI,GAAG,EAAE;AACxB,iBAAa,IAAI,GAAG,EAAE;AACtB,UAAM,KAAK,SAAS,EAAE,MAAM,EAAE;AAC9B,UAAM,KAAK,SAAS,EAAE,IAAI,EAAE;AAC5B,QAAI,CAAC,WAAW,IAAI,EAAE,EAAG,YAAW,IAAI,IAAI,CAAC,CAAC;AAC9C,QAAI,CAAC,WAAW,IAAI,EAAE,EAAG,YAAW,IAAI,IAAI,CAAC,CAAC;AAC9C,eAAW,IAAI,EAAE,EAAG,KAAK,EAAE,WAAW,GAAG,OAAO,UAAU,IAAI,GAAG,GAAG,GAAG,IAAI,EAAE,CAAC;AAC9E,eAAW,IAAI,EAAE,EAAG,KAAK,EAAE,WAAW,GAAG,OAAO,UAAU,IAAI,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC;AAAA,EACjF;AAEA,QAAM,YAAY,oBAAI,IAA6B;AACnD,QAAM,UAAU,oBAAI,IAA6B;AACjD,aAAW,CAAC,KAAK,KAAK,KAAK,YAAY;AACrC,UAAM,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI;AACjC,UAAM,QAAQ,YAAY,IAAI,EAAE,GAAG,MAAM,KAAK;AAC9C,cAAU,IAAI,KAAK,KAAK;AACxB,YAAQ,IAAI,KAAK,KAAK;AAAA,EACxB;AAEA,QAAM,WAA2B,CAAC;AAClC,QAAM,gBAAgC,CAAC;AACvC,MAAI,YAAY,OAAO,QAAQ;AAC/B,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,QAAQ,GAAG;AACxC,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;AACnD,UAAM,IAAI,OAAO,MAAM,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI;AAC/C,QAAI,CAAC,KAAK,CAAC,EAAG;AACd,UAAM,QAAQ,OAAO,UAAU,IAAI,CAAC;AACpC,UAAM,KAAK,eAAe,IAAI,CAAC,KAAK,WAAW,GAAG,CAAC;AACnD,UAAM,KAAK,aAAa,IAAI,CAAC,KAAK,WAAW,GAAG,CAAC;AACjD,UAAM,SACJ,UAAU,IAAI,SAAS,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,KAC1C,YAAY,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;AACtD,UAAM,OACJ,QAAQ,IAAI,SAAS,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,KACtC,YAAY,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;AACtD,UAAM,WAAW,SAAS,MAAM,SAAS;AACzC,UAAM,SACJ,YAAY,UAAU,IAAI,CAAC,KACtB,MAAM;AACL,YAAM,QAAQ,UAAU,IAAI,CAAC;AAC7B,aAAO,eAAe;AAAA,QACpB;AAAA,QACA,EAAE,GAAG,OAAO,GAAG,OAAO,EAAE;AAAA,QACxB,EAAE,GAAG,OAAO,GAAG,KAAK,EAAE;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IACH,GAAG,IACH,YACG,MAAM;AACL,YAAMI,aAAY,CAAC,GAAG,OAAO,MAAM,OAAO,CAAC,EACxC,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,EAAE,EACjD,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,GAAG,OAAO,QAAQ,GAAG,OAAO,EAAE;AAClF,aAAO,iBAAiB,MAAM;AAAA,QAC5B,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,WAAAA;AAAA,QACA,SAAS;AAAA,QACT,SAAS,WAAW,EAAE;AAAA,QACtB,OAAO,WAAW,EAAE;AAAA,MACtB,CAAC,EAAE;AAAA,IACL,GAAG,KACF,MAAM;AACL,UAAI,UAAU,MAAM;AAClB,eAAO,CAAC,QAAQ,IAAI;AAAA,MACtB;AACA,YAAM,EAAE,OAAO,IAAI,IAAI,aAAa,GAAG,CAAC;AACxC,aAAO,CAAC,OAAO,GAAG;AAAA,IACpB,GAAG;AACX,UAAM,YAAY,CAAC,GAAG,OAAO,MAAM,OAAO,CAAC,EACxC,OAAO,CAAC,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAAE,EAAE,EACjD,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,GAAG,OAAO,QAAQ,GAAG,OAAO,EAAE;AAClF,QAAI,qBAAqB,QAAQ,SAAS,IAAI,GAAG;AAC/C,cAAQ;AAAA,QACN,oCAAoC,EAAE,IAAI,QAAQ,EAAE,EAAE;AAAA,MACxD;AAAA,IACF;AACA,gBAAY,KAAK,IAAI,WAAW,GAAG,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;AAC3D,UAAM,WAAW,EAAE,SAAS;AAC5B,UAAM,YAAY,WAAW,QAAQ,UAAU,QAAQ;AACvD,UAAM,YAAY,WAAW,MAAM;AACnC,UAAM,WAAyC;AAAA,MAC7C,GAAI,IAAI,WAAW,EAAE,WAAW,WAAW,kBAAkBP,WAAS,IAAI,CAAC;AAAA,MAC3E,GAAI,EAAE,SAAS,WAAW,EAAE,MAAM,MAAM,IAAI,CAAC;AAAA,IAC/C;AACA,aAAS,KAAK,EAAE,KAAK,SAAS,MAAM,GAAG,WAAW,WAAW,QAAQ,CAAC;AACtE,QAAI,EAAE,OAAO;AACX,YAAM,aAAa,cAAc,IAAI,CAAC;AACtC,YAAM,OAAO,aAAa,OAAO;AACjC,YAAM,EAAE,IAAI,OAAO,IAAI,oBAAoB,QAAQ,IAAI;AACvD,YAAM,eAAe,aAAa,KAAK;AACvC,YAAM,KAAK,GAAG,IAAI,OAAO,IAAI;AAC7B,YAAM,KAAK,GAAG,IAAI,OAAO,IAAI;AAC7B,YAAM,WAAW,MAAM,OAAO,iBAAiB;AAC/C,YAAM,IAAI,YAAY,EAAE,OAAO,QAAQ,EAAE,QAAQ;AACjD,kBAAY,KAAK,IAAI,WAAW,KAAK,IAAI,CAAC;AAC1C,oBAAc;AAAA,QACZ,EAAE;AAAA,UACA,EAAE,GAAG,KAAK,IAAI,GAAG,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG;AAAA,UACjD,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,oBAAc;AAAA,QACZ,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,GAAG,UAAU,WAAW,QAAQ,UAAU,QAAQ,WAAW;AAAA,UACpF,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,WAAS,KAAK,GAAG,aAAa;AAG9B,QAAM,UAA4C,CAAC;AACnD,aAAW,KAAK,IAAI,OAAO;AACzB,UAAM,IAAI,IAAI,EAAE,EAAE;AAClB,UAAM,WAAW,EAAE,SAAS;AAC5B,UAAM,OAAO,WAAW,QAAQ,UAAU,QAAQ;AAClD,UAAM,SAAS,WAAW,QAAQ,UAAU,QAAQ;AACpD,UAAM,KAAK,WAAW,IAAK,MAAM,OAAO,SAAS,eAAe;AAChE,UAAM,KAAK,MAAM,OAAO,SAAS,gBAAgB;AACjD,UAAM,YAAY,WAAW,aAAa,MAAM,KAAK,IAAI,QAAQ;AACjE,aAAS,KAAK,EAAE,KAAK,GAAG,MAAM,QAAQ,IAAI,EAAE,GAAG,CAAC,CAAC;AACjD,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO,MAAM,MAAM,WAAW;AAAA,QACpF,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,YAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,EAC9B;AAEA,QAAM,aAAa,IAAI,QAAQ,YAAY,IAAI,OAAO,WAAW,aAAa,EAAE,QAAQ;AACxF,QAAM,YAAY,KAAK;AAAA,IACrB,OAAO,QAAQ;AAAA,IACf,YAAY;AAAA,IACZ,IAAI,QAAQ,SAAS,aAAa,SAAS;AAAA,EAC7C;AACA,QAAM,QAAe;AAAA,IACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,WAAW,QAAQ,OAAO,SAAS,SAAS,OAAO;AAAA,IACjF,YAAY,QAAQ;AAAA,IACpB;AAAA,IACA,GAAI,IAAI,WACJ;AAAA,MACE,MAAM;AAAA,QACJ,cAAc,QAAQ,WAAWA,YAAU,MAAM,OAAO,aAAa,CAAC;AAAA,QACtE,cAAc,QAAQ,SAAS,iBAAiB,MAAM,OAAO,aAAa,CAAC;AAAA,MAC7E;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,QAAiC;AAAA,EAC5C,aAAa,OAAyB;AACpC,WAAO,EAAE,SAAS,OAAO,UAAU,CAAC,GAAG,GAAGC,QAAM,KAAK,EAAE;AAAA,EACzD;AAAA,EACA,UAAU,OAAyB;AACjC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAc,OAAoC;AACvD,WAAO,YAAY,IAAI,KAAK;AAAA,EAC9B;AACF;;;AC7hBA,SAAS,KAAK,QAAkB,GAAmB;AACjD,MAAI,IAAI;AAGR,WAAS,QAAQ,GAAG,QAAQ,OAAO,UAAU,OAAO,CAAC,MAAM,GAAG,QAAS,KAAI,OAAO,CAAC;AACnF,SAAO;AACT;AAEO,SAAS,eAAe,OAA6B;AAC1D,QAAM,WAAW,MACd,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,MAAI,QAAQ;AACZ,MAAI,SAAmB,CAAC;AACxB,MAAI;AACJ,QAAM,SAA6B,CAAC;AAEpC,aAAW,QAAQ,UAAU;AAC3B,UAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,QAAI,EAAE,CAAC,MAAM,eAAe,EAAE,CAAC,MAAM,OAAO;AAC1C,YAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC,KAAK,IAAI,EAAG,SAAQ,KAAK,MAAM,CAAC;AACrD;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,cAAQ,KAAK,MAAM,CAAC,EAAE,KAAK;AAC3B;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,UAAU;AACrB,YAAM,OAAO,EAAE,MAAM,CAAC,EAAE,IAAI,MAAM,EAAE,OAAO,OAAO,QAAQ;AAC1D,eAAS;AACT,cAAQ,KAAK,IAAI,OAAO,KAAK,MAAM;AACnC;AAAA,IACF;AACA,QAAI,EAAE,CAAC,MAAM,SAAS;AACpB,YAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,YAAM,IAAI,OAAO,EAAE,CAAC,CAAC;AACrB,UAAI,OAAO,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC,GAAG;AAC5C,eAAO,KAAK,CAAC,GAAG,CAAC,CAAC;AAClB,gBAAQ,KAAK,IAAI,OAAO,IAAI,GAAG,IAAI,CAAC;AAAA,MACtC;AACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,MAAgB,MAAM;AAAA,IAAK,EAAE,QAAQ,MAAM;AAAA,IAAG,CAAC,GAAG,MACtD,OAAO,CAAC,MAAM,SAAY,OAAO,CAAC,IAAK;AAAA,EACzC;AACA,aAAW,CAAC,GAAG,CAAC,KAAK,QAAQ;AAC3B,UAAM,KAAK,KAAK,KAAK,CAAC;AACtB,UAAM,KAAK,KAAK,KAAK,CAAC;AACtB,QAAI,OAAO,GAAI,KAAI,EAAE,IAAI;AAAA,EAC3B;AAEA,QAAM,QAAkB,CAAC;AACzB,WAAS,IAAI,GAAG,IAAI,OAAO,IAAK,KAAI,IAAI,CAAC,MAAM,EAAG,OAAM,KAAK,CAAC;AAI9D,QAAM,QAAoB,CAAC;AAC3B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,WAAqB,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,OAAO,IAAK,KAAI,MAAM,KAAK,IAAI,CAAC,MAAM,EAAG,UAAS,KAAK,IAAI,CAAC,EAAE;AAClF,UAAM,SAAS,IAAI,CAAC,MAAM;AAC1B,UAAM,KAAK;AAAA,MACT,IAAI,IAAI,CAAC;AAAA,MACT,OAAO,OAAO,CAAC;AAAA,MACf,OAAO,SAAS,CAAC,UAAU,QAAQ,IAAI,CAAC,QAAQ;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC,EAAG;AAAA,IACtD,WAAW;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,IAAkB,OAAoC;AACpF,SAAO,WAAW,IAAI,KAAK;AAC7B;AAEO,IAAM,YAAyC;AAAA,EACpD,cAAc;AAAA,EACd,WAAW,CAAC,UAAU,KAAK,MAAM,KAAK;AAAA,EACtC,QAAQ;AACV;;;AClGO,SAAS,aAAa,OAAkB,QAA0B;AACvE,aAAW,KAAK,MAAM,MAAO,KAAI,UAAU,EAAE,UAAW,QAAO;AAC/D,SAAO,MAAM,MAAM,MAAM,MAAM,SAAS,CAAC;AAC3C;AAaO,SAAS,YACdO,MACA,OACA,OACA,QACc;AACd,QAAM,UAAU,MAAM;AACtB,QAAM,MAAM,IACV,OAAO,IACP,SAAS;AACX,QAAM,OAAO,MAAM,MAAM,SAAS;AAClC,QAAM,QAAQ;AACd,QAAM,SAAS,MAAM,OAAO;AAC5B,QAAM,WAA2B,CAAC;AAElC,WAAS;AAAA,IACPA,KAAI,KAAK,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,GAAG,OAAO,OAAO,GAAG,QAAQ,YAAY,QAAQ,QAAQ,KAAK;AAAA,MAC7F,IAAI;AAAA,IACN,CAAC;AAAA,EACH;AACA,QAAM,QAAQ,MAAM,OAAO,SAAS,MAAM,IAAI,MAAM;AACpD,WAAS;AAAA,IACPA,KAAI;AAAA,MACF;AAAA,MACA,OAAO,IAAI;AAAA,MACX,OAAO,IAAI,MAAM;AAAA,MACjB,MAAM,WAAW;AAAA,MACjB,QAAQ;AAAA,MACR,EAAE,QAAQ,OAAO;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC5B,UAAM,IAAI,OAAO,IAAI,OAAO,IAAI,KAAK;AACrC,aAAS;AAAA,MACPA,KAAI;AAAA,QACF,EAAE,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,SAAS,GAAG,OAAO,QAAQ,QAAQ,SAAS,EAAE;AAAA,QAC1E,EAAE;AAAA,QACF,EAAE;AAAA,QACF;AAAA,QACA,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACPA,KAAI;AAAA,QACF,EAAE;AAAA,QACF,OAAO,IAAI,MAAM,SAAS;AAAA,QAC1B;AAAA,QACA,MAAM,WAAW;AAAA,QACjB,QAAQ;AAAA,MACV;AAAA,IACF;AACA,aAAS;AAAA,MACPA,KAAI;AAAA,QACF,UAAK,EAAE,SAAS;AAAA,QAChB,OAAO,IAAI,QAAQ;AAAA,QACnB;AAAA,QACA,MAAM,WAAW;AAAA,QACjB,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO,QAAQ,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,EAAE,UAAU,QAAQ,EAAE,GAAG,OAAO,GAAG,GAAG,OAAO,GAAG,OAAO,OAAO,EAAE;AACzE;;;ACMA,SAASC,QAAM,OAA4B;AACzC,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,QAAM,QAAoB,CAAC;AAC3B,QAAM,SAAsB,CAAC;AAC7B,QAAM,QAAoB,CAAC;AAC3B,QAAMC,SAAoB,CAAC;AAC3B,MAAI;AAEJ,QAAMC,SAAQ,MAAM,MAAM,OAAO;AAEjC,WAAS,WAAWA,QAAO;AACzB,UAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,CAAC,QAAQ,KAAK,WAAW,IAAI,EAAG;AAGpC,UAAM,cAAc,KAAK,MAAM,6CAA6C;AAC5E,QAAI,eAAe,CAAC,SAAS,CAAC,KAAK,WAAW,YAAY,KAAK,SAAS,YAAY;AAClF,YAAM,OAAO,YAAY,CAAC,EAAG,KAAK;AAClC,UAAI,CAAC,mGAAmG,KAAK,IAAI,GAAG;AAClH,gBAAQ,KAAK,QAAQ,gBAAgB,EAAE;AACvC;AAAA,MACF;AAAA,IACF;AACA,QAAI,cAAc,KAAK,IAAI,EAAG;AAG9B,UAAM,aAAa,KAAK,MAAM,8BAA8B;AAC5D,QAAI,YAAY;AACd,cAAQ,WAAW,CAAC,EAAG,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACxD;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,MAAM,sBAAsB;AACtD,QAAI,cAAc;AAChB,gBAAU,aAAa,CAAC,EAAG,YAAY;AACvC;AAAA,IACF;AAGA,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,YAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,aAAO,EAAE,CAAC;AACV;AAAA,IACF;AACA,QAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,YAAM,IAAI,KAAK,MAAM,KAAK;AAC1B,YAAM,OAAiB;AAAA,QACrB,MAAM,EAAE,CAAC,KAAK;AAAA,QACd,WAAW,OAAO,EAAE,CAAC,CAAC;AAAA,QACtB,OAAO,EAAE,CAAC,KAAK;AAAA,QACf,GAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,IAAI,CAAC;AAAA,MAC/C;AACA,YAAM,KAAK,IAAI;AACf;AAAA,IACF;AAGA,UAAM,aAAa,KAAK,MAAM,yCAAyC;AACvE,QAAI,YAAY;AACd,YAAM,QAAQ,WAAW,CAAC,EAAG,YAAY;AACzC,YAAM,OAAO,WAAW,CAAC,EAAG,KAAK;AAEjC,UAAI,KAAK;AACT,UAAI,QAAQ;AACZ,UAAI;AAEJ,UAAI,UAAU,WAAW,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,SAAS,GAAG,GAAG;AAClE,cAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACjD,aAAK,MAAM,CAAC;AACZ,gBAAQ,MAAM,CAAC,KAAK;AAAA,MACtB,OAAO;AACL,cAAM,SAAS,KAAK,SAAS,4BAA4B;AACzD,cAAM,SAAmB,CAAC;AAC1B,mBAAW,KAAK,QAAQ;AACtB,iBAAO,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,CAAE;AAAA,QACnC;AACA,YAAI,OAAO,UAAU,GAAG;AACtB,cAAI,OAAO,CAAC,EAAG,SAAS,GAAG,KAAK,YAAY,KAAK,OAAO,CAAC,CAAE,GAAG;AAC5D,mBAAO,OAAO,CAAC;AACf,oBAAQ,OAAO,CAAC;AAChB,iBAAK,OAAO,OAAO,SAAS,CAAC;AAAA,UAC/B,OAAO;AACL,iBAAK,OAAO,CAAC;AACb,oBAAQ,OAAO,CAAC;AAAA,UAClB;AAAA,QACF,WAAW,OAAO,WAAW,GAAG;AAC9B,kBAAQ,OAAO,CAAC;AAChB,eAAK,OAAO,OAAO,SAAS,CAAC;AAAA,QAC/B;AAAA,MACF;AAEA,UAAI,CAAC,GAAI,MAAK,KAAK,OAAO,SAAS,CAAC;AACpC,UAAI,CAAC,MAAO,SAAQ;AAEpB,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,MACzB,CAAC;AACD,iBAAW;AACX;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,IAAI,GAAG;AACxB,iBAAW;AACX;AAAA,IACF;AAGA,UAAM,cAAc,KAAK;AAAA,MACvB;AAAA,IACF;AACA,QAAI,aAAa;AACf,YAAM,OAAO,YAAY,CAAC,EAAG,YAAY;AACzC,YAAM,OAAO,YAAY,CAAC,EAAG,KAAK;AAElC,UAAI,KAAK;AACT,UAAI,QAAQ;AACZ,UAAI;AACJ,UAAI;AAEJ,UAAI,SAAS,UAAU,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,SAAS,GAAG,GAAG;AAChE,cAAM,QAAQ,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACjD,aAAK,MAAM,CAAC;AACZ,gBAAQ,MAAM,CAAC,KAAK;AACpB,YAAI,MAAM,CAAC,EAAG,OAAM,MAAM,CAAC;AAAA,MAC7B,OAAO;AACL,cAAM,MAAM,KAAK,MAAM,WAAW;AAClC,YAAI,KAAK;AACP,eAAK,IAAI,CAAC;AACV,cAAI,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,KAAK;AAE3C,gBAAM,WAAW,UAAU,MAAM,WAAW;AAC5C,cAAI,UAAU;AACZ,kBAAM,SAAS,CAAC,EAAG,KAAK;AACxB,wBAAY,UAAU,QAAQ,WAAW,EAAE,EAAE,KAAK;AAAA,UACpD;AAEA,gBAAM,SAAS,UAAU,MAAM,qBAAqB;AACpD,cAAI,QAAQ;AACV,oBAAQ,OAAO,CAAC,KAAK,OAAO,CAAC;AAAA,UAC/B,WAAW,WAAW;AACpB,oBAAQ;AAAA,UACV,OAAO;AACL,oBAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,GAAI,MAAK,KAAK,MAAM,SAAS,CAAC;AACnC,UAAI,CAAC,MAAO,SAAQ;AAEpB,UAAI,QAAQ,sBAAsB,KAAK,GAAG,KAAK,IAAI,SAAS,GAAG,IAAI;AACjE,aAAK;AAAA,MACP;AAEA,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,MAAM,SAAS,SAAS,SAAY;AAAA,QACpC,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,QACrB,GAAI,KAAK,EAAE,GAAG,IAAI,CAAC;AAAA,QACnB,GAAI,WAAW,EAAE,OAAO,SAAS,IAAI,CAAC;AAAA,MACxC,CAAC;AACD;AAAA,IACF;AAGA,UAAM,YAAY,KAAK,MAAM,gDAAgD;AAC7E,QAAI,WAAW;AACb,YAAM,UAAU,UAAU,CAAC;AAC3B,YAAM,KAAK,UAAU,CAAC;AACtB,UAAI,OAAO,UAAU,CAAC,EAAG,KAAK;AAE9B,YAAM,WAAW,OAAO,SAAS,OAAO;AACxC,YAAM,gBAAgB,OAAO;AAG7B,UAAI;AACJ,YAAM,aAAa,KAAK,MAAM,qBAAqB;AACnD,UAAI,YAAY;AACd,oBAAY,WAAW,CAAC,KAAK,WAAW,CAAC;AACzC,eAAO,KAAK,QAAQ,WAAW,CAAC,GAAG,EAAE,EAAE,KAAK;AAAA,MAC9C;AAGA,UAAI;AACJ,YAAM,YAAY,KAAK,MAAM,uBAAuB;AACpD,UAAI,WAAW;AACb,eAAO,OAAO,UAAU,CAAC,CAAC;AAC1B,eAAO,KAAK,QAAQ,UAAU,CAAC,GAAG,EAAE,EAAE,KAAK;AAAA,MAC7C;AAGA,UAAI;AACJ,YAAM,cAAc,KAAK,MAAM,2CAA2C;AAC1E,UAAI,aAAa;AACf,qBAAa,YAAY,CAAC,EAAG,YAAY;AACzC,eAAO,KAAK,QAAQ,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK;AAAA,MAC/C;AAEA,YAAM,YAAY,KAAK,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAEzE,YAAM,YAAY,QAAQ,MAAM,GAAG;AACnC,YAAM,SAAS,UAAU,CAAC;AAC1B,YAAM,WAAW,UAAU,CAAC;AAE5B,iBAAW,UAAU,WAAW;AAC9B,cAAM,UAAU,OAAO,MAAM,GAAG;AAChC,cAAM,OAAO,QAAQ,CAAC;AACtB,cAAM,SAAS,QAAQ,CAAC;AAExB,QAAAD,OAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,UAC/B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,UAC3B,GAAI,YAAY,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,UACxC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,UACnC,GAAI,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;AAAA,UACrC,GAAI,gBAAgB,EAAE,eAAe,KAAK,IAAI,CAAC;AAAA,UAC/C,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IAC/B,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7B,OAAO,EAAE,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC,GAAI,MAAM;AAAA,IACxD;AAAA,IACA;AAAA,IACA,OAAAA;AAAA,EACF;AACF;AAIA,IAAME,aAAW;AACjB,IAAMC,kBAAiB;AAEvB,SAAS,WAAW,GAAS,GAAS,MAAM,GAAY;AACtD,SAAO,EACL,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,OACtB,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,OACtB,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,OACvB,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS;AAE3B;AAEO,SAAS,eAAe,KAAkB,OAAoC;AACnF,QAAM,EAAE,SAAS,YAAY,SAAS,OAAAH,OAAM,IAAI;AAChD,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,QAAQ,WAAW;AACzB,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAE3D,QAAM,YAAY,CAAC,MACjB,KAAK;AAAA,IACH;AAAA,IACA,KAAK,IAAI,YAAY,EAAE,OAAO,IAAI,EAAE,OAAO,YAAY,EAAE,OAAO,IAAI,KAAK,EAAE,KAAK,IAAI;AAAA,EACtF;AACF,QAAM,QAAQ,IAAI,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,KAAK;AAE5D,QAAM,WAA2B,CAAC;AAClC,QAAM,MAAM,oBAAI,IAAkB;AAClC,QAAM,WAAW,oBAAI,IAAkB;AAGvC,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,SAAS,WAAW;AAAA,QACpB,WAAW,gBAAgB;AAAA,QAC3B,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe,oBAAI,IAAoB;AAC7C,MAAI,MAAM,QAAQ,CAAC,MAAM;AACvB,QAAI,EAAE,MAAO,cAAa,IAAI,EAAE,IAAI,EAAE,KAAK;AAAA,EAC7C,CAAC;AAED,MAAI,sBAAsB;AAC1B,MAAI,sBAAsB;AAC1B,MAAI,sBAAsB;AAC1B,MAAI,sBAAsB;AAC1B,MAAI,gBAAgB;AACpB,MAAI,iBAAiB;AAErB,aAAW,KAAK,IAAI,OAAO;AACzB,UAAM,YACJ,EAAE,UACD,EAAE,SAAS,SACR,IAAI,MAAM,OACR,GAAG,EAAE,IAAI,IAAI,IAAI,MAAM,IAAI,KAC3B,OAAO,EAAE,IAAI,IACf;AACN,QAAI,CAAC,UAAW;AAEhB,UAAM,KAAK,YAAY,WAAW,QAAQ,CAAC,EAAE,QAAQ;AACrD,UAAM,KAAK;AAEX,UAAM,QAAQ,aAAa,IAAI,EAAE,IAAI;AACrC,UAAM,MAAM,aAAa,IAAI,EAAE,EAAE;AAEjC,QAAI,SAAS,OAAO,UAAU,KAAK;AACjC,4BAAsB,KAAK,IAAI,qBAAqB,EAAE;AAAA,IACxD,WAAW,SAAS,OAAO,UAAU,KAAK;AACxC,4BAAsB;AACtB,4BAAsB,KAAK,IAAI,qBAAqB,EAAE;AACtD,4BAAsB,KAAK,IAAI,qBAAqB,EAAE;AAAA,IACxD,WAAW,CAAC,SAAS,CAAC,KAAK;AACzB,sBAAgB,KAAK,IAAI,eAAe,EAAE;AAC1C,uBAAiB,KAAK,IAAI,gBAAgB,EAAE;AAC5C,4BAAsB,KAAK,IAAI,qBAAqB,EAAE;AAAA,IACxD,OAAO;AACL,4BAAsB,KAAK,IAAI,qBAAqB,EAAE;AAAA,IACxD;AAAA,EACF;AAIA,MAAI,IAAI,YAAY,cAAc;AAEhC,UAAM,UAAU,CAAC,MAAgB,EAAE,SAAS,WAAW,EAAE,GAAG,YAAY,EAAE,WAAW,OAAO;AAC5F,UAAM,SAAS,CAAC,MACd,CAAC,QAAQ,CAAC,MACT,EAAE,SAAS,UACV,EAAE,SAAS,SACX,EAAE,GAAG,YAAY,EAAE,WAAW,MAAM,KACpC,EAAE,SAAS;AACf,UAAM,YAAY,CAAC,MAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;AAE3D,UAAM,SAAS,IAAI,MAAM,OAAO,OAAO;AACvC,UAAM,SAAS,IAAI,MAAM,OAAO,MAAM;AACtC,UAAM,UAAU,IAAI,MAAM,OAAO,SAAS;AAE1C,UAAM,QAAQ,CAAC,QAAQ,QAAQ,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAClE,UAAM,SAAS,SAAS,SAAS;AACjC,UAAM,UAAU,KAAK,IAAI,KAAK,gBAAgB,GAAG;AACjD,UAAM,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;AAC1D,UAAM,aAAa,KAAK,IAAI,KAAK,sBAAsB,EAAE;AACzD,UAAM,gBAAgB,WAAW;AAEjC,UAAM,QAAQ,CAAC,WAAW,SAAS;AACjC,YAAM,KAAK,SAAS,QAAQ,QAAQ;AACpC,YAAM,QAAQ,UAAU,SAAS;AACjC,YAAM,SAAS,UAAU,gBAAgB,SAAS;AAElD,gBAAU,QAAQ,CAAC,GAAG,MAAM;AAC1B,cAAM,IAAI,UAAU,CAAC;AACrB,cAAM,KAAK,SAAS,IAAI,cAAc,aAAa,KAAK;AACxD,YAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,GAAG,QAAQ,MAAM,CAAC;AAAA,MACzD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,WAAW,IAAI,YAAY,eAAe,IAAI,YAAY,QAAQ;AAEhE,UAAM,MAAM,IAAI,MAAM,CAAC;AACvB,UAAM,SAAS,IAAI,MAAM,MAAM,CAAC;AAChC,UAAM,OAAO,UAAU,GAAG;AAC1B,UAAM,YAAY,KAAK,IAAI,GAAG,OAAO,IAAI,SAAS,GAAG,GAAG;AAExD,UAAM,SAAS,KAAK,IAAI,KAAK,OAAO,IAAI,YAAY,IAAI,iBAAiB,EAAE;AAC3E,UAAM,UAAU,SAAS,SAAS,YAAY,IAAI;AAClD,UAAM,UAAU,SAAS,SAAS,SAAS,QAAQ,IAAI;AAEvD,QAAI,IAAI,IAAI,IAAI,EAAE,GAAG,UAAU,OAAO,GAAG,GAAG,UAAU,QAAQ,GAAG,OAAO,MAAM,QAAQ,MAAM,CAAC;AAE7F,WAAO,QAAQ,CAAC,OAAO,QAAQ;AAC7B,YAAM,QAAS,MAAM,OAAO,SAAU,IAAI,KAAK,KAAK,KAAK,KAAK;AAC9D,YAAM,KAAK,UAAU,SAAS,KAAK,IAAI,KAAK;AAC5C,YAAM,KAAK,UAAU,SAAS,KAAK,IAAI,KAAK;AAC5C,YAAM,KAAK,UAAU,KAAK;AAC1B,UAAI,IAAI,MAAM,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,GAAG,KAAK,QAAQ,GAAG,OAAO,IAAI,QAAQ,MAAM,CAAC;AAAA,IACnF,CAAC;AAAA,EACH,WAAW,IAAI,YAAY,QAAQ;AAEjC,UAAM,QAAQ,IAAI,MAAM;AACxB,UAAM,WAAW,KAAK,IAAI,GAAG,IAAI,MAAM,IAAI,SAAS,GAAG,GAAG;AAC1D,UAAM,SAAS,KAAK,IAAI,KAAK,QAAQ,EAAE;AACvC,UAAM,UAAU,SAAS,SAAS,WAAW,IAAI;AACjD,UAAM,UAAU,SAAS,SAAS,SAAS,QAAQ,IAAI;AAEvD,QAAI,MAAM,QAAQ,CAAC,GAAG,QAAQ;AAC5B,YAAM,QAAS,MAAM,QAAS,IAAI,KAAK,KAAK,KAAK,KAAK;AACtD,YAAM,KAAK,UAAU,SAAS,KAAK,IAAI,KAAK;AAC5C,YAAM,KAAK,UAAU,SAAS,KAAK,IAAI,KAAK;AAC5C,YAAM,KAAK,UAAU,CAAC;AACtB,UAAI,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,KAAK,GAAG,GAAG,KAAK,QAAQ,GAAG,OAAO,IAAI,QAAQ,MAAM,CAAC;AAAA,IAC/E,CAAC;AAAA,EACH,WAAW,IAAI,OAAO,SAAS,GAAG;AAEhC,QAAI,KAAK;AACT,UAAM,KAAK,SAAS,SAAS;AAC7B,QAAII,aAAY;AAChB,UAAM,UAAU,IACd,OAAO,IACP,SAAS,KAAK,IAAI,IAAI,sBAAsB,IAAI,KAAK,EAAE,GACvD,SAAS,sBAAsB,KAAK,IACpC,YAAY,KAAK,IAAI,IAAI,sBAAsB,EAAE;AAEnD,eAAW,KAAK,IAAI,QAAQ;AAC1B,YAAM,OAAO,IAAI,MAAM,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;AACrD,YAAM,SAAS,KAAK,IAAI,KAAK,GAAI,KAAK,SAAS,IAAI,KAAK,IAAI,SAAS,IAAI,CAAC,GAAG,CAAE;AAC/E,YAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AACpC,YAAM,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,SAAS,IAAI,CAAC;AACtD,YAAM,SAAS,OAAO,UAAU,OAAO,KAAK;AAC5C,YAAM,SAAS,OAAO,SAAS,OAAO,KAAK;AAC3C,YAAM,KAAK,KAAK,IAAI,SAAS,OAAO,GAAG,GAAG;AAC1C,YAAM,KAAK,UAAU,OAAO,SAAS;AAErC,eAAS,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,IAAI,QAAQ,GAAG,CAAC;AAC1D,WAAK,QAAQ,CAAC,GAAG,MAAM;AACrB,cAAM,MAAM,IAAI;AAChB,cAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,YAAI,IAAI,EAAE,IAAI;AAAA,UACZ,GAAG,KAAK,OAAO,OAAO,SAAS;AAAA,UAC/B,GAAG,KAAK,UAAU,OAAO,OAAO,QAAQ;AAAA,UACxC,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AACD,MAAAA,aAAY,KAAK,IAAIA,YAAW,KAAK,EAAE;AACvC,YAAM,KAAK;AAAA,IACb;AAEA,QAAI,KAAK;AACT,UAAM,KAAKA,aAAY;AACvB,eAAW,KAAK,IAAI,MAAM,OAAO,CAACC,OAAM,CAACA,GAAE,KAAK,GAAG;AACjD,YAAM,IAAI,UAAU,CAAC;AACrB,UAAI,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,OAAO,GAAG,QAAQ,MAAM,CAAC;AACvD,YAAM,IAAI;AAAA,IACZ;AAAA,EACF,OAAO;AAEL,UAAM,QAAQ,KAAK,IAAI,KAAK,GAAG,IAAI,MAAM,IAAI,SAAS,CAAC;AACvD,UAAM,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,KAAK,IAAI,MAAM,MAAM,CAAC,CAAC;AAC/D,UAAM,SAAS,KAAK,IAAI,KAAK,sBAAsB,EAAE;AACrD,UAAM,SAAS,sBAAsB,KAAK;AAE1C,QAAI,MAAM,QAAQ,CAAC,GAAG,MAAM;AAC1B,YAAM,MAAM,IAAI;AAChB,YAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,UAAI,IAAI,EAAE,IAAI;AAAA,QACZ,GAAG,SAAS,OAAO,QAAQ;AAAA,QAC3B,GAAG,SAAS,SAAS,OAAO,QAAQ,UAAU;AAAA,QAC9C,OAAO;AAAA,QACP,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAGA,QAAM,mBAA2B,CAAC;AAElC,aAAW,KAAK,IAAI,QAAQ;AAC1B,UAAM,KAAK,SAAS,IAAI,EAAE,EAAE;AAC5B,UAAM,WAAW,EAAE,SAAS,YAAY,QAAQ,EAAE,IAAI;AAEtD,aAAS;AAAA,MACP,EAAE,KAAK,IAAI,QAAQ,SAAS,WAAW,QAAQ,UAAU,QAAQ,QAAQ,KAAK;AAAA,QAC5E,IAAI;AAAA,MACN,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,EAAE,OAAO,GAAG,EAAE,KAAK,KAAK,EAAE,IAAI,MAAM,EAAE;AACtD,aAAS;AAAA,MACP,EAAE,KAAK,SAAS,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,IAClF;AAEA,qBAAiB,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,QAAQ,GAAG,CAAC;AAAA,EACzE;AAGA,QAAM,QAAQ,IAAI,IAAkB,CAAC,GAAG,KAAK,GAAG,QAAQ,CAAC;AACzD,QAAM,eAAuB,CAAC;AAC9B,QAAM,YAAoB,CAAC,GAAG,IAAI,OAAO,GAAG,GAAG,gBAAgB;AAE/D,MAAI,MAAM,QAAQ,CAAC,GAAG,YAAY;AAChC,UAAM,IAAI,MAAM,IAAI,EAAE,IAAI;AAC1B,UAAM,IAAI,MAAM,IAAI,EAAE,EAAE;AACxB,QAAI,CAAC,KAAK,CAAC,EAAG;AAEd,UAAM,OACJ,EAAE,SAAS,UAAa,IAAI,MAAM,MAAM,SAAS,IAC7C,aAAa,IAAI,OAAO,EAAE,IAAI,IAC9B;AAEN,UAAM,QAAQ,MAAM,SAAS,QAAQ;AACrC,UAAM,cAAc;AAEpB,UAAM,MAAM,EAAE,IAAI,EAAE,QAAQ;AAC5B,UAAM,MAAM,EAAE,IAAI,EAAE,SAAS;AAC7B,UAAM,MAAM,EAAE,IAAI,EAAE,QAAQ;AAC5B,UAAM,MAAM,EAAE,IAAI,EAAE,SAAS;AAE7B,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,MAAM;AAEjB,QAAI;AACJ,QAAI;AAEJ,UAAM,gBAAgB,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI;AAC/D,UAAM,gBAAgB,KAAK,OAAO,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI;AAChE,UAAM,gBAAgB,KAAK,MAAM,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,IAAI;AAChE,UAAM,gBAAgB,KAAK,OAAO,KAAK,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,IAAI;AAEjE,QAAI,eAAe;AACjB,cAAQ,EAAE,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO;AACpC,YAAM,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE;AAAA,IACzB,WAAW,eAAe;AACxB,cAAQ,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE;AACzB,YAAM,EAAE,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO;AAAA,IACpC,WAAW,eAAe;AACxB,cAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;AACnC,YAAM,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;AAAA,IACzB,WAAW,eAAe;AACxB,cAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,IAAI;AACzB,YAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;AAAA,IACnC,OAAO;AACL,cAAQ,YAAY,GAAG,KAAK,GAAG;AAC/B,YAAM,YAAY,GAAG,KAAK,GAAG;AAAA,IAC/B;AAEA,QAAI;AACJ,QAAI;AAEJ,QAAI,EAAE,eAAe,cAAc;AACjC,UAAI,iBAAiB,eAAe;AAClC,YAAI,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG;AACjC,kBAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACvE,qBAAW,EAAE,GAAG,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,KAAK,EAAE;AAAA,QACpD,OAAO;AACL,gBAAM,mBAAmB,OAAQ,UAAU,IAAK;AAChD,gBAAM,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAC3C,kBAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACnI,qBAAW,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,GAAG,GAAG,OAAO,EAAE;AAAA,QACrD;AAAA,MACF,WAAW,iBAAiB,eAAe;AACzC,YAAI,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG;AACjC,kBAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACvE,qBAAW,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,GAAG,GAAG,MAAM,IAAI,EAAE;AAAA,QACxD,OAAO;AACL,gBAAM,mBAAmB,OAAQ,UAAU,IAAK;AAChD,gBAAM,OAAO,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AAC3C,kBAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACnI,qBAAW,EAAE,GAAG,MAAM,IAAI,MAAM,IAAI,IAAI,KAAK,EAAE;AAAA,QACjD;AAAA,MACF,OAAO;AACL,gBAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACvE,mBAAW,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE;AAAA,MACtE;AAAA,IACF,WAAW,EAAE,eAAe,UAAU;AACpC,UAAI,KAAK,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,GAAG;AAC/B,cAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,cAAM,MAAM,IAAI,IAAI,KAAK;AACzB,gBAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,MACjI,OAAO;AACL,cAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,cAAM,MAAM,IAAI,IAAI,KAAK;AACzB,gBAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AAAA,MACjI;AACA,iBAAW,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,EAAE;AAAA,IACtE,OAAO;AAEL,cAAQ,KAAK,IAAI,MAAM,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;AACvE,UAAI,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG;AAEjC,mBAAW,EAAE,GAAG,MAAM,GAAG,IAAI,MAAM,IAAI,IAAI,KAAK,EAAE;AAAA,MACpD,WAAW,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,GAAG;AAExC,mBAAW,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,GAAG,GAAG,MAAM,IAAI,EAAE;AAAA,MACxD,OAAO;AAEL,cAAM,IAAI,UAAU,MAAM,IAAI,MAAO;AACrC,cAAM,KAAK,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AACzC,cAAM,KAAK,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AACzC,cAAM,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK;AAClC,cAAM,KAAK,CAAC,KAAK;AACjB,cAAM,KAAK,KAAK;AAChB,mBAAW,EAAE,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,GAAG;AAAA,MAChD;AAAA,IACF;AAEA,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,OAAO,aAAa;AAAA,QAChC,GAAI,MAAM,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,QACxC,GAAI,EAAE,WAAW,EAAE,WAAWH,WAAS,IAAI,CAAC;AAAA,QAC5C,GAAI,EAAE,gBAAgB,EAAE,aAAaC,iBAAgB,WAAWD,WAAS,IAAI,CAAC;AAAA,MAChF,CAAC;AAAA,IACH;AAGA,QAAI,EAAE,UAAU;AACd,YAAM,UAAU,MAAM,KAAK,EAAE,IAAI,IAAI,KAAK,MAAM,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI;AAC7E,YAAM,UAAU,MAAM,KAAK,EAAE,IAAI,IAAI,KAAK,MAAM,KAAK,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK;AAC/E,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,UAAU,MAAM,IAAI,SAAS,MAAM,IAAI,SAAS,QAAQ,GAAG,QAAQ,WAAW;AAAA,UACrF,QAAQ,UAAU,IAAI,QAAQ,UAAU,IAAI,UAAU;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF;AACA,QAAI,EAAE,QAAQ;AACZ,YAAM,UAAU,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI;AACzE,YAAM,UAAU,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,IAAI,KAAK,EAAE,IAAI,EAAE,SAAS,IAAI,KAAK;AAC3E,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,QAAQ,IAAI,IAAI,SAAS,IAAI,IAAI,SAAS,QAAQ,GAAG,QAAQ,WAAW;AAAA,UAC/E,QAAQ,UAAU,IAAI,QAAQ,UAAU,IAAI,UAAU;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,YACJ,EAAE,UACD,EAAE,SAAS,SACR,IAAI,MAAM,OACR,GAAG,EAAE,IAAI,IAAI,IAAI,MAAM,IAAI,KAC3B,OAAO,EAAE,IAAI,IACf;AACN,QAAI,WAAW;AACb,YAAM,UAAU,YAAY,WAAW,QAAQ,CAAC;AAChD,YAAM,KAAK,QAAQ,QAAQ;AAC3B,YAAM,KAAK;AAEX,UAAI,QAAQ,SAAS,IAAI,KAAK;AAC9B,UAAI,QAAQ,SAAS,IAAI,KAAK;AAG9B,YAAM,eAAe,CAAC,GAAG,WAAW,GAAG,YAAY;AACnD,UAAI,eAAe,aAAa;AAAA,QAAK,CAAC,QACpC,WAAW,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,IAAI,QAAQ,GAAG,GAAG,KAAK,CAAC;AAAA,MAClE;AAEA,UAAI,cAAc;AAEhB,cAAM,UAAU,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAClD,YAAI,QAAQ;AAEZ,mBAAW,KAAK,SAAS;AACvB,gBAAM,KAAK,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AACzC,gBAAM,KAAK,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK;AACzC,gBAAM,QAAQ,KAAK,KAAK;AACxB,gBAAM,QAAQ,KAAK,KAAK;AAExB,cAAI,CAAC,aAAa,KAAK,CAAC,QAAQ,WAAW,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,IAAI,QAAQ,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG;AAClG,oBAAQ;AACR,oBAAQ;AACR,oBAAQ;AACR;AAAA,UACF;AAAA,QACF;AAGA,YAAI,CAAC,OAAO;AACV,mBAAS,OAAO,GAAG,QAAQ,GAAG,QAAQ;AACpC,kBAAM,WAAW,OAAO,MAAM,IAAI,IAAI,MAAM,KAAK,KAAK,OAAO,CAAC,KAAK,KAAK;AACxE,kBAAM,QAAQ,QAAQ;AACtB,gBAAI,CAAC,aAAa,KAAK,CAAC,QAAQ,WAAW,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,IAAI,QAAQ,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG;AAClG,sBAAQ;AACR,sBAAQ;AACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAkB,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,IAAI,QAAQ,GAAG;AACpE,mBAAa,KAAK,SAAS;AAE3B,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,GAAG,OAAO,IAAI,EAAE,GAAG,QAAQ,GAAG;AAAA,UAC3D,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA,IAAI,QAAQ,KAAK,CAAC;AAAA,UAClB,IAAI,QAAQ,KAAK,KAAK,QAAQ,KAAK,IAAI;AAAA,UACvC,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,YACE,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,UAA4C,CAAC;AAEnD,aAAW,KAAK,IAAI,OAAO;AACzB,UAAM,IAAI,IAAI,IAAI,EAAE,EAAE;AAEtB,aAAS,KAAK,EAAE,KAAK,GAAG,QAAQ,SAAS,QAAQ,SAAS,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAGzE,QAAI,EAAE,MAAM;AACV,YAAM,WAAW,EAAE,KAAK,YAAY;AACpC,YAAM,KAAK,YAAY,UAAU,QAAQ,CAAC,EAAE,QAAQ;AACpD,YAAM,KAAK;AACX,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,KAAK,GAAG,OAAO,IAAI,QAAQ,GAAG;AAAA,UACrD,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,UAAU,EAAE,IAAI,IAAI,KAAK,GAAG,EAAE,KAAK,QAAQ,KAAK,MAAM,QAAQ,GAAG,QAAQ,SAAS;AAAA,UACvF,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,QAAQ,EAAE,MAAM,EAAE,IAAI,KAAK,EAAE,IAAI,EAAE,SAAS,IAAI,OAAO;AAC7D,aAAS;AAAA,MACP,EAAE,KAAK,EAAE,OAAO,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,KAAK,GAAG,MAAM,QAAQ,MAAM;AAAA,QACtE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,QAAI,EAAE,KAAK;AACT,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,QAAQ,GAAG,QAAQ,WAAW;AAAA,UACjF,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAGA,YAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;AAC5B,YAAQ,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;AACtC,QAAI,EAAE,KAAM,SAAQ,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;AACvD,QAAI,EAAE,MAAO,SAAQ,GAAG,EAAE,KAAK,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;AAAA,EAC3D;AAGA,aAAW,KAAK,IAAI,QAAQ;AAC1B,UAAM,KAAK,SAAS,IAAI,EAAE,EAAE;AAC5B,YAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG;AAC7B,YAAQ,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG;AACvC,YAAQ,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,GAAG;AAAA,EAC3C;AAGA,QAAM,WAAW,CAAC,GAAG,IAAI,OAAO,GAAG,GAAG,SAAS,OAAO,GAAG,GAAG,YAAY;AACxE,QAAM,aAAa,KAAK,IAAI,QAAQ,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC;AACzE,QAAM,gBAAgB,KAAK,IAAI,SAAS,QAAQ,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC;AAEtF,MAAI,eAAe;AACnB,MAAI,IAAI,MAAM,MAAM,SAAS,GAAG;AAC9B,UAAM,SAAS,YAAY,GAAG,OAAO,IAAI,OAAO,EAAE,GAAG,aAAa,IAAI,GAAG,SAAS,OAAO,CAAC;AAC1F,aAAS,KAAK,GAAG,OAAO,QAAQ;AAChC,mBAAe,OAAO,OAAO,IAAI,OAAO,OAAO;AAAA,EACjD;AAEA,QAAM,IAAIF,QAAO,aAAa;AAC9B,QAAM,KAAK,IAAI,IAAI,GAAG;AACtB,QAAM,QAAQ,IAAI,IAAI,IAAI;AAC1B,QAAM,QAAQ,IAAI,IAAI,CAAC;AAEvB,QAAM,OAAO;AAAA,IACX,eAAeE,UAAQ,kBAAkB,CAAC,mBAAmB,EAAE,WAAW,KAAK,WAAW,KAAK,sEAAsE,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,IAClN,eAAeC,eAAc,kBAAkB,CAAC,mBAAmB,EAAE,oBAAoB,KAAK,oFAAoF,CAAC,IAAI,KAAK,OAAO,EAAE,WAAW,QAAQ,OAAO;AAAA,EACjO;AAEA,QAAM,QAAe;AAAA,IACnB;AAAA,MACE,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO,eAAe,MAAM,GAAG,QAAQ,OAAO,gBAAgB,MAAM,EAAE;AAAA,MACpG,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,IACF;AAAA,IACA,IAAI,WAAW,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,QAAuC;AACzD;AAEO,IAAM,WAAuC;AAAA,EAClD,aAAa,OAAe;AAC1B,WAAOJ,QAAM,KAAK;AAAA,EACpB;AAAA,EACA,UAAU,OAAe;AACvB,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,OAAoC;AAC7C,WAAO,eAAe,IAAI,KAAK;AAAA,EACjC;AACF;;;ACp2BA,IAAM,iBAA0C,CAAC,QAAQ,SAAS,QAAQ,MAAM;AAmBhF,IAAM,cAAoC;AAAA,EACxC;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;AAIA,IAAM,eAAsC,CAAC,YAAY,WAAW,SAAS,MAAM;AAI5E,IAAM,gBAAwC,CAAC,OAAO,OAAO,SAAS,SAAS;AAE/E,SAAS,OAAO,OAAwC;AAC7D,QAAM,IAAI,MAAM,YAAY;AAC5B,SAAO,cAAc,SAAS,CAAC,IAAI,IAAI;AACzC;AAIO,IAAM,cAAoC,CAAC,YAAY,QAAQ;AAE/D,SAAS,OAAO,OAAsC;AAC3D,QAAM,IAAI,MAAM,YAAY;AAC5B,SAAO,YAAY,SAAS,CAAC,IAAI,IAAI;AACvC;AAOO,SAAS,aACd,GACA,MACA,MAC8B;AAC9B,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,KAAK,GAAG,KAAK,EAAE;AAAA,IAC1B,KAAK;AACH,aAAO,EAAE,KAAK,GAAG,KAAK,EAAE;AAAA,IAC1B,KAAK,SAAS;AACZ,YAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,YAAM,MAAM,IAAI;AAChB,YAAM,MAAM,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI;AAC7C,aAAO,EAAE,KAAK,IAAI;AAAA,IACpB;AAAA,IACA,KAAK,WAAW;AACd,YAAM,MAAM,KAAK,MAAM,IAAI,IAAI;AAC/B,YAAM,MAAM,IAAI;AAChB,YAAM,MAAM,MAAM,MAAM,IAAI,MAAM,OAAO,IAAI;AAC7C,aAAO,EAAE,KAAK,IAAI;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,SAAS,OAAyC;AACzD,QAAM,IAAI,MAAM,YAAY;AAC5B,SAAO,eAAe,SAAS,CAAC,IAAI,IAAI;AAC1C;AACA,SAAS,QAAQ,OAAsC;AACrD,QAAM,IAAI,MAAM,YAAY;AAC5B,SAAO,YAAY,SAAS,CAAC,IAAI,IAAI;AACvC;AACA,SAAS,OAAO,OAAuC;AACrD,QAAM,IAAI,MAAM,YAAY;AAG5B,MAAI,MAAM,UAAU,MAAM,SAAS,MAAM,SAAS,MAAM,SAAU,QAAO;AACzE,SAAO,aAAa,SAAS,CAAe,IAAK,IAAmB;AACtE;AAwCA,SAAS,YAAY,MAAsB;AACzC,QAAM,OAAO,KAAK,MAAM,SAAS,IAAI,CAAC,KAAK;AAC3C,SAAO,KAAK,QAAQ,OAAO,IAAI,EAAE;AACnC;AAGA,SAAS,YAAY,OAAyB;AAE5C,QAAM,OAAO,MAAM,QAAQ,sCAAsC,EAAE;AACnE,QAAMO,SAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,MAAgB,CAAC;AAEvB,WAAS,IAAI,GAAG,IAAIA,OAAM,QAAQ,KAAK;AACrC,QAAI,OAAOA,OAAM,CAAC;AAClB,QAAI,KAAK,KAAK,EAAE,WAAW,EAAG;AAG9B,YACG,KAAK,QAAQ,EAAE,SAAS,IAAI,KAAK,sBAAsB,KAAK,IAAI,MACjE,IAAI,IAAIA,OAAM,QACd;AACA,UAAI,KAAK,QAAQ,EAAE,SAAS,IAAI,GAAG;AACjC,eAAO,KAAK,QAAQ,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,IAAI,OAAOA,OAAM,IAAI,CAAC,EAAG,KAAK;AAAA,MAC3E,OAAO;AACL,eAAO,OAAO,OAAOA,OAAM,IAAI,CAAC,EAAG,KAAK;AAAA,MAC1C;AACA;AAAA,IACF;AAGA,WAAO,IAAI,IAAIA,OAAM,UAAU,YAAY,KAAKA,OAAM,IAAI,CAAC,CAAE,GAAG;AAC9D,YAAM,YAAYA,OAAM,IAAI,CAAC,EAAG,QAAQ,aAAa,EAAE;AACvD,aAAO,OAAO,OAAO;AACrB;AAAA,IACF;AAGA,QAAI,cAAc,KAAK,IAAI,GAAG;AAC5B,aAAO,IAAI,IAAIA,OAAM,QAAQ;AAC3B;AACA,eAAO,OAAO,OAAOA,OAAM,CAAC;AAC5B,YAAIA,OAAM,CAAC,EAAG,SAAS,GAAG,EAAG;AAAA,MAC/B;AACA,aAAO,KAAK,QAAQ,gBAAgB,EAAE;AAAA,IACxC;AAEA,QAAI,KAAK,IAAI;AAAA,EACf;AAEA,SAAO;AACT;AAMA,SAAS,gBAAgB,OAAwC;AAC/D,QAAM,IAAI,MAAM,MAAM,sCAAsC;AAC5D,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,QAAM,OAAgC,CAAC;AACvC,aAAW,SAAS,EAAE,CAAC,KAAK,IAAI,MAAM,OAAO,GAAG;AAC9C,UAAM,MAAM,KAAK,QAAQ,GAAG;AAC5B,QAAI,QAAQ,GAAI;AAChB,UAAM,MAAM,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK;AACpC,UAAM,QAAQ,KACX,MAAM,MAAM,CAAC,EACb,KAAK,EACL,QAAQ,gBAAgB,EAAE;AAC7B,QAAI,IAAK,MAAK,GAAG,IAAI;AAAA,EACvB;AACA,SAAO;AACT;AAEO,SAAS,UAAU,OAAwB;AAChD,MAAI;AACJ,MAAI,QAAmB;AACvB,MAAI,SAAqB;AACzB,MAAI;AACJ,MAAI;AACJ,MAAI,OAAoB;AACxB,MAAI;AACJ,MAAI,OAAkB;AAGtB,QAAM,MAAgF,CAAC;AAEvF,aAAW,QAAQ,YAAY,KAAK,GAAG;AACrC,UAAM,UAAU,KAAK,KAAK;AAC1B,UAAM,QAAQ,QAAQ,YAAY;AAClC,QAAI,UAAU,OAAQ;AACtB,QAAI,MAAM,WAAW,QAAQ,KAAK,CAAC,QAAQ,SAAS,IAAI,KAAK,IAAI,WAAW,GAAG;AAC7E,cAAQ,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC9B;AAAA,IACF;AACA,QAAI,MAAM,WAAW,QAAQ,KAAK,CAAC,QAAQ,SAAS,IAAI,KAAK,IAAI,WAAW,GAAG;AAC7E,cAAQ,QAAQ,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK;AAC5C;AAAA,IACF;AACA,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,eAAS,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK;AAC5C;AAAA,IACF;AACA,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,eAAS,SAAS,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK;AAC9C;AAAA,IACF;AACA,QAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,YAAM,MAAM,SAAS,QAAQ,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE;AAChD,UAAI,OAAO,SAAS,GAAG,KAAK,OAAO,EAAG,SAAQ;AAC9C;AAAA,IACF;AACA,QAAI,MAAM,WAAW,OAAO,GAAG;AAC7B,aAAO,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK;AAC1C;AAAA,IACF;AACA,QAAI,MAAM,WAAW,OAAO,GAAG;AAC7B,YAAM,MAAM,SAAS,QAAQ,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE;AAChD,UAAI,OAAO,SAAS,GAAG,KAAK,OAAO,EAAG,QAAO;AAC7C;AAAA,IACF;AACA,QAAI,MAAM,WAAW,OAAO,GAAG;AAC7B,aAAO,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,KAAK;AAC1C;AAAA,IACF;AAGA,UAAM,SAAS,YAAY,IAAI;AAC/B,QAAI,OAAO;AACX,UAAMC,QAAO,SAAS,KAAK,IAAI;AAC/B,QAAIA,MAAM,QAAO,KAAK,QAAQ,UAAU,EAAE;AAC1C,WAAO,KAAK,QAAQ,YAAY,EAAE;AAClC,QAAI;AACJ,UAAM,IAAI,KAAK,MAAM,eAAe;AACpC,QAAI,GAAG;AACL,YAAM,IAAI,SAAS,EAAE,CAAC,KAAK,EAAE;AAC7B,UAAI,GAAG;AACL,qBAAa;AACb,eAAO,KAAK,MAAM,GAAG,EAAE,SAAS,CAAC,EAAE,QAAQ;AAAA,MAC7C;AAAA,IACF;AACA,QAAI,KAAK,EAAE,QAAQ,MAAM,MAAAA,OAAM,GAAI,aAAa,EAAE,QAAQ,WAAW,IAAI,CAAC,EAAG,CAAC;AAAA,EAChF;AAEA,QAAM,QAAQ,WAAW,GAAG;AAE5B,SAAO;AAAA,IACL,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC;AAAA,IACA;AAAA,IACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,IACzC,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,IACvC,GAAI,SAAS,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA,IACjC,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,IACrC,GAAI,SAAS,aAAa,EAAE,KAAK,IAAI,CAAC;AAAA,IACtC;AAAA,IACA,SAAS;AAAA,IACT,UAAU,gBAAgB,KAAK;AAAA,EACjC;AACF;AAOA,SAAS,WACP,KACY;AACZ,QAAMC,SAAkB,CAAC;AACzB,QAAM,OAAiB,CAAC;AACxB,QAAM,QAAoB,CAAC;AAE3B,aAAW,KAAK,KAAK;AACnB,WAAOA,OAAM,SAAS,KAAK,EAAE,SAASA,OAAMA,OAAM,SAAS,CAAC,EAAI,CAAAA,OAAM,IAAI;AAC1E,QAAIA,OAAM,WAAW,KAAK,EAAE,SAASA,OAAMA,OAAM,SAAS,CAAC,GAAI;AAC7D,MAAAA,OAAM,KAAK,EAAE,MAAM;AAAA,IACrB;AACA,UAAM,QAAQA,OAAM,SAAS;AAG7B,QAAI,KAAK,WAAW,OAAO;AACzB,WAAK,KAAK,CAAC;AAAA,IACb,OAAO;AACL,WAAK,SAAS,QAAQ;AACtB,WAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM;AAAA,IACtC;AAEA,UAAM,KAAK;AAAA,MACT,MAAM,EAAE;AAAA,MACR;AAAA,MACA,IAAI,QAAQ,KAAK,KAAK,GAAG,CAAC;AAAA,MAC1B,aAAa,KAAK,IAAI,CAAC,QAAQ,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,MAChD,MAAM,EAAE;AAAA,MACR,GAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,IACzC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAIA,SAAS,WAAW,KAA4B;AAE9C,QAAM,MAAa,CAAC;AAEpB,MAAI,IAAI,WAAW,WAAW;AAC5B,QAAI,MAAkB;AACtB,eAAW,MAAM,IAAI,OAAO;AAC1B,UAAI,GAAG,UAAU,KAAK,QAAQ,MAAM;AAClC,cAAM,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,UAAU,IAAI,UAAU,QAAQ,OAAO,GAAG,KAAK;AAClF,YAAI,KAAK,GAAG;AAAA,MACd,OAAO;AACL,YAAI,MAAM,KAAK,GAAG,EAAE;AAAA,MACtB;AAAA,IACF;AAAA,EACF,WAAW,IAAI,WAAW,SAAS;AAEjC,UAAM,UAAU,oBAAI,IAAsB;AAC1C,eAAW,MAAM,IAAI,OAAO;AAC1B,YAAM,MAAM,QAAQ,IAAI,GAAG,KAAK,KAAK,CAAC;AACtC,UAAI,KAAK,GAAG,EAAE;AACd,cAAQ,IAAI,GAAG,OAAO,GAAG;AAAA,IAC3B;AACA,eAAW,SAAS,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,GAAG;AAC7D,UAAI,KAAK;AAAA,QACP,OAAO,QAAQ,IAAI,KAAK;AAAA,QACxB,QAAQ,IAAI,UAAU;AAAA,QACtB,OAAO,SAAS,QAAQ,CAAC;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,EACF,OAAO;AACL,UAAM,QAAQ,IAAI,SAAS,IAAI,SAAS,IAAI,IAAI,QAAQ;AACxD,QAAI,SAAS;AACb,eAAW,MAAM,IAAI,OAAO;AAC1B,YAAM,WAAW,IAAI,WAAW,IAAI,OAAO,GAAG,OAAO,QAAQ,UAAU;AACvE,UAAI,UAAU;AACZ,YAAI,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,UAAU,IAAI,UAAU,QAAQ,OAAO,GAAG,KAAK,CAAC;AACtF,iBAAS;AAAA,MACX,OAAO;AACL,YAAI,IAAI,SAAS,CAAC,EAAG,MAAM,KAAK,GAAG,EAAE;AACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,IAAI,IAAI,CAAC,GAAG,OAAO,EAAE,OAAO,IAAI,GAAG,OAAO,EAAE,OAAO,QAAQ,EAAE,QAAQ,OAAO,EAAE,MAAM,EAAE;AAC/F;AAIA,SAAS,YAAY,OAAe,SAA+B;AACjE,SAAO,UAAU,IAAI,QAAQ,UAAU,UAAU,IAAI,QAAQ,YAAY,QAAQ;AACnF;AACA,SAAS,aAAa,OAAe,MAAsB;AACzD,SAAO,UAAU,IACb,KAAK,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,IACzB,UAAU,IACR,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC,IAC3B,KAAK,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC;AACjC;AAMA,SAAS,cACP,IACA,IACA,KACA,IACA,KAAa,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC,GAC/B;AACR,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO,KAAK,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,IAC1F,KAAK;AACH,aAAO,KAAK,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,IAC1F,KAAK;AACH,aAAO,KAAK,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,IAC1F,KAAK;AACH,aAAO,KAAK,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,EAC5F;AACF;AAWO,SAAS,iBAAiB,MAA6B;AAC5D,MAAI,KAAK,eAAe,QAAW;AACjC,WAAO,KAAK,WAAW,UAAU,KAAK,eAAe,UAAU;AAAA,EACjE;AACA,SAAO,KAAK,MAAM;AACpB;AAEO,SAAS,iBACd,SACA,MACA,WACA,mBAAmB,KACJ;AACf,QAAM,SAAS,QAAQ,QAAQ,IAAI;AACnC,MAAI,WAAW,IAAI;AACjB,UAAM,WAAW,QAAQ,MAAM,GAAG,MAAM,EAAE,KAAK;AAC/C,UAAM,cAAc,QAAQ,MAAM,SAAS,CAAC,EAAE,KAAK;AAEnD,UAAM,YAAY,SAAS,QAAQ,gBAAgB,IAAI,EAAE,QAAQ,QAAQ,IAAI;AAC7E,UAAM,UAAU,YAAY,QAAQ,gBAAgB,IAAI,EAAE,QAAQ,QAAQ,IAAI;AAE9E,UAAM,aAAa,UAChB,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,UAAM,gBAAgB,QACnB,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,QAAI,YAAY;AAChB,eAAW,KAAK,YAAY;AAC1B,kBAAY,KAAK,IAAI,WAAW,YAAY,GAAG,IAAI,EAAE,QAAQ,IAAI;AAAA,IACnE;AACA,QAAI,UAAU;AACd,eAAW,KAAK,eAAe;AAC7B,gBAAU,KAAK,IAAI,SAAS,YAAY,GAAG,SAAS,EAAE,KAAK;AAAA,IAC7D;AAEA,UAAM,aAAa,WAAW,CAAC;AAC/B,UAAM,WAAW,cAAc,SAAS,IAAI,cAAc,KAAK,GAAG,IAAI;AAEtE,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,MACV,YAAY,WAAW,SAAS,IAAI,aAAa;AAAA,MACjD,eAAe,cAAc,SAAS,IAAI,gBAAgB;AAAA,MAC1D,OAAO,CAAC,GAAG,YAAY,GAAG,aAAa;AAAA,MACvC,cAAc,KAAK,IAAI,WAAW,OAAO;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,aAAa,QAAQ,QAAQ,gBAAgB,IAAI,EAAE,QAAQ,QAAQ,IAAI;AAC7E,QAAM,WAAW,WACd,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,QAAMF,SAAkB,CAAC;AACzB,aAAW,KAAK,UAAU;AACxB,QAAI,YAAY,GAAG,IAAI,EAAE,QAAQ,kBAAkB;AACjD,YAAM,UAAUG,UAAS,GAAG,MAAM,kBAAkB,CAAC;AACrD,MAAAH,OAAM,KAAK,GAAG,QAAQ,KAAK;AAAA,IAC7B,OAAO;AACL,MAAAA,OAAM,KAAK,CAAC;AAAA,IACd;AAAA,EACF;AAEA,QAAM,aAAaA,OAAM,SAAS,IAAIA,SAAQ,CAAC,OAAO;AACtD,QAAM,eAAe,WAAW,OAAO,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,YAAY,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC;AAE3F,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,EACF;AACF;AAEO,SAAS,eACd,GACA,UACA,GACA,GACA,GACAI,IACA,MACA,WACA,WACA,YACA,QAA4B,SAC5B,cAAc,GACd,cAAc,OACE;AAChB,QAAM,WAA2B,CAAC;AAElC,MAAI,SAAS,eAAe,QAAW;AACrC,UAAM,aAAa,SAAS;AAC5B,UAAM,WAAW,SAAS,iBAAiB,CAAC;AAC5C,UAAM,UAAU,OAAO;AACvB,UAAM,QAAQ,YAAY;AAC1B,UAAM,SAAS,WAAW,SAAS,UAAU,SAAS,SAAS;AAC/D,UAAMC,UAAS,KAAKD,KAAI,UAAU,IAAI,OAAO;AAE7C,UAAM,SAAS,UAAU,WAAW,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,WAAW;AACxE,UAAM,OAAO;AAEb,QAAI,OAAOC;AACX,aAAS,KAAK,GAAG,KAAK,WAAW,QAAQ,MAAM;AAC7C,eAAS;AAAA,QACP,EAAE,KAAK,WAAW,EAAE,GAAI,QAAQ,IAAI,IAAI,GAAG,MAAM,WAAW;AAAA,UAC1D,QAAQ;AAAA,UACR,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,cAAQ;AAAA,IACV;AAEA,aAAS,KAAK,GAAG,KAAK,SAAS,QAAQ,MAAM;AAC3C,eAAS;AAAA,QACP,EAAE,KAAK,SAAS,EAAE,GAAI,MAAM,IAAI,IAAI,GAAG,WAAW,YAAY,EAAE,QAAQ,MAAM,CAAC;AAAA,MACjF;AACA,cAAQ;AAAA,IACV;AAEA,WAAO;AAAA,EACT;AAEA,QAAML,SAAQ,SAAS;AACvB,QAAM,QAAQA,OAAM;AACpB,QAAM,QAAQ,OAAO;AAErB,MAAI,UAAU,GAAG;AACf,UAAM,QAAQ,IAAI,IAAII,KAAI,IAAI,OAAO,IAAI;AACzC,UAAME,SAAQ,UAAU,WAAW,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,WAAW;AACvE,aAAS;AAAA,MACP,EAAE,KAAKN,OAAM,CAAC,GAAIM,QAAO,OAAO,MAAM,WAAW;AAAA,QAC/C,GAAI,cAAc,EAAE,QAAQ,OAAO,IAAI,CAAC;AAAA,QACxC,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAKF,MAAK,QAAQ,KAAK,SAAS,IAAI,OAAO;AAC1D,QAAM,QAAQ,UAAU,WAAW,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,WAAW;AAEvE,WAAS,KAAK,GAAG,KAAK,OAAO,MAAM;AACjC,UAAM,QAAQ,IAAI,SAAS,KAAK,KAAK;AACrC,aAAS;AAAA,MACP,EAAE,KAAKJ,OAAM,EAAE,GAAI,OAAO,OAAO,MAAM,WAAW;AAAA,QAChD,GAAI,cAAc,EAAE,QAAQ,OAAO,IAAI,CAAC;AAAA,QACxC,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,OAAmB,MAAc,WAAmB,UAAmB;AAClG,QAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,CAAC;AACtC,QAAM,UAAU,IAAI,OAAO,GAAG;AAC9B,QAAM,WAAW,MAAM,IAAI,UAAQ,iBAAiB,KAAK,MAAM,MAAM,WAAW,QAAQ,CAAC;AACzF,QAAM,eAAe,KAAK,IAAI,OAAO,IAAI,GAAG,SAAS,IAAI,UAAQ,KAAK,IAAI,KAAK,cAAc,GAAG,IAAI,GAAG,CAAC;AACxG,QAAM,eAAe,MAAM,IAAI,CAAC,OAAO,UAAU,UAAU,IAAI,IAC3D,OAAO,QAAQ,WAAW,QAAQ,QAAQ,IAAI,SAAS,KAAK;AAChE,QAAM,YAAY,SAAS,IAAI,CAAC,MAAM,UAAyB;AAC7D,UAAM,YAAY,KAAK,IAAI,OAAO,GAAG,eAAe,aAAa,KAAK,IAAK,IAAI,OAAO;AACtF,UAAM,OAAO,CAACA,QAAiB,SAAiBA,OAAM,QAAQ,UAAQ;AACpE,YAAM,QAAQ,KAAK,IAAI,WAAW,GAAG,KAAK,MAAM,KAAK,EAAE,IAAI,UAAQ,YAAY,MAAM,IAAI,EAAE,KAAK,CAAC;AACjG,aAAOG,UAAS,MAAM,MAAM,OAAO,KAAK,IAAI,KAAK,QAAQ,CAAC,CAAC,EAAE;AAAA,IAC/D,CAAC;AACD,UAAM,aAAa,KAAK,aAAa,KAAK,KAAK,YAAY,IAAI,IAAI;AACnE,UAAM,gBAAgB,KAAK,gBAAgB,KAAK,KAAK,eAAe,SAAS,IAAI;AACjF,UAAMH,SAAQ,aAAa,CAAC,GAAG,YAAY,GAAI,iBAAiB,CAAC,CAAE,IAAI,KAAK,KAAK,OAAO,IAAI;AAC5F,UAAM,eAAe,aACjB,KAAK;AAAA,MAAI;AAAA,MAAG,GAAG,WAAW,IAAI,UAAQ,YAAY,MAAM,IAAI,EAAE,QAAQ,IAAI;AAAA,MAC1E,IAAI,iBAAiB,CAAC,GAAG,IAAI,UAAQ,YAAY,MAAM,SAAS,EAAE,KAAK;AAAA,IAAC,IACxE,KAAK,IAAI,GAAG,GAAGA,OAAM,IAAI,UAAQ,YAAY,MAAM,IAAI,EAAE,KAAK,CAAC;AACnE,WAAO,EAAE,GAAG,MAAM,YAAY,eAAe,OAAAA,QAAO,aAAa;AAAA,EACnE,CAAC;AACD,QAAM,WAAW,KAAK,IAAI,GAAG,GAAG,UAAU,IAAI,gBAAgB,CAAC;AAC/D,QAAM,QAAQ,WAAW,IAAI,IAAI,WAAW,OAAO,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG;AACrF,QAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,cAAc,GAAG,UAAU,IAAI,CAAC,MAAM,WACpE,KAAK,eAAe,MAAM,IAAI,UAAU,KAAK,aAAa,KAAK,CAAE,CAAC,CAAC;AACtE,SAAO,EAAE,WAAW,OAAO,MAAM;AACnC;AAEO,SAASO,YAAW,KAAc,OAAoC;AAC3E,QAAM,EAAE,SAAS,YAAY,QAAQ,IAAI;AACzC,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,SAAS,QAAQ;AACvB,QAAM,OAAO,WAAW;AACxB,QAAM,YAAY,WAAW;AAC7B,QAAM,WAAW,IAAI,OAAO,GAAG;AAC/B,QAAM,SAAS,IAAI,QAAQ,WAAW,gBAAgB,KAAK;AAC3D,QAAM,MAAM,SAAS;AACrB,QAAM,IAAI,KAAK,IAAI,IAAI,MAAM,QAAQ,CAAC;AAEtC,QAAM,WAA2B,CAAC;AAClC,QAAM,UAGF,CAAC;AACL,MAAI,eAAe;AACnB,MAAI;AAEJ,MAAI,IAAI,UAAU,WAAW,IAAI,UAAU,OAAO;AAChD,UAAM,MAAM,IAAI,OAAO,GAAG;AAC1B,UAAM,MAAM,IAAI,OAAO,GAAG;AAC1B,UAAM,OAAO,IAAI,UAAU,QAAQ,KAAK,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC,IAAI;AACnE,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,UAAM,cAAc,UAAU,IAAI,CAAC,SAAS;AAC1C,YAAM,YAAY,iBAAiB,IAAI;AACvC,aAAO,YAAY,IAAI,IAAI,aAAa,OAAO,QAAQ,IAAI,GAAG,IAAI,IAAI,OAAO,GAAG;AAAA,IAClF,CAAC;AAGD,QAAIC,YAAW;AACf,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI,SAAS,GAAG,QAAQ;AAC9B,YAAM,KAAK,UAAU,CAAC,EAAG;AACzB,MAAAA,YAAW,KAAK,IAAIA,WAAU,IAAI,OAAO,MAAM,KAAK,GAAG;AAAA,IACzD,CAAC;AACD,mBAAeA;AAEf,QAAI,OAAO;AACX,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI;AACV,YAAM,QAAQ,YAAY,CAAC;AAC3B,YAAM,IAAI,SAAS,GAAG,QAAQ;AAC9B,YAAM,IAAI,IAAI,eAAe,CAAC;AAC9B,YAAM,OAAO,UAAU,CAAC;AAExB,YAAM,WAA2B;AAAA,QAC/B,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQ,MAAM,GAAG,QAAQ,SAAS,QAAQ,QAAQ,GAAG;AAAA,UAC5E,IAAI,IAAI,UAAU,UAAU,IAAI;AAAA,QAClC,CAAC;AAAA,MACH;AACA,UAAI,IAAI,UAAU,OAAO;AACvB,cAAM,IAAI,YAAY,GAAG,OAAO,OAAO;AACvC,iBAAS,KAAK,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,MAAM,QAAQ,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAAA,MAChF;AACA,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,OAAO;AAAA,QACT;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,GAAG,QAAQ,MAAM,EAAE;AAC7D,cAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,aAAS,IAAI,OAAO,MAAM,MAAM;AAAA,EAClC,WAAW,IAAI,UAAU,QAAQ;AAE/B,UAAM,MAAM,IAAI,OAAO,GAAG;AAC1B,UAAM,OAAO,IAAI,OAAO,GAAG;AAC3B,UAAM,OAAO,IAAI,OAAO,GAAG;AAC3B,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,QAAI,WAAW;AACf,QAAI,WAAW;AACf,cAAU,QAAQ,CAAC,SAAS;AAC1B,iBAAW,KAAK,IAAI,UAAU,KAAK,YAAY;AAC/C,YAAM,KAAK,iBAAiB,IAAI;AAChC,iBAAW,KAAK,IAAI,UAAU,EAAE;AAAA,IAClC,CAAC;AACD,UAAM,QAAQ,WAAW,IAAI,IAAI,YAAY,OAAO,QAAQ,IAAI,GAAG,IAAI,IAAI,OAAO,GAAG;AACrF,UAAM,QAAQ,IAAI,WAAW,IAAI,GAAG;AACpC,UAAM,UAAU,QAAQ;AAGxB,UAAM,WAAW,IAAI,MAAc,IAAI,MAAM,MAAM,EAAE,KAAK,EAAE;AAC5D,UAAM,aAAa,oBAAI,IAAsB;AAC7C,UAAM,WAAqB,CAAC;AAC5B,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,eAAS,SAAS,GAAG;AACrB,YAAM,SAAS,GAAG,UAAU,IAAI,KAAK,SAAS,GAAG,QAAQ,CAAC;AAC1D,eAAS,CAAC,IAAI;AACd,YAAM,MAAM,WAAW,IAAI,MAAM,KAAK,CAAC;AACvC,UAAI,KAAK,CAAC;AACV,iBAAW,IAAI,QAAQ,GAAG;AAC1B,eAAS,GAAG,KAAK,IAAI;AAAA,IACvB,CAAC;AAGD,UAAM,MAAM,IAAI,MAAc,IAAI,MAAM,MAAM,EAAE,KAAK,CAAC;AACtD,QAAI,UAAU;AACd,UAAM,SAAS,CAAC,MAAoB;AAClC,YAAM,OAAO,WAAW,IAAI,CAAC,KAAK,CAAC;AACnC,UAAI,KAAK,WAAW,GAAG;AACrB,YAAI,CAAC,IAAI;AACT,mBAAW;AACX;AAAA,MACF;AACA,WAAK,QAAQ,MAAM;AACnB,UAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAE,IAAK,IAAI,KAAK,KAAK,SAAS,CAAC,CAAE,KAAM;AAAA,IAC7D;AACA,KAAC,WAAW,IAAI,EAAE,KAAK,CAAC,GAAG,QAAQ,MAAM;AAEzC,UAAM,MAAM,CAAC,MAAc,IAAI,SAAS,IAAI,CAAC,IAAK,OAAO;AACzD,UAAM,MAAM,CAAC,MAAc,IAAI,MAAM,IAAI,MAAM,CAAC,EAAG,SAAS,QAAQ,KAAK;AAEzE,QAAIC,YAAW;AACf,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI,IAAI,CAAC;AACf,YAAM,IAAI,IAAI,CAAC;AACf,YAAM,KAAK,IAAI,IAAI,QAAQ,CAAC;AAC5B,qBAAe,KAAK,IAAI,cAAc,IAAI,KAAK;AAC/C,MAAAA,YAAW,KAAK,IAAIA,WAAU,GAAG,KAAK;AAEtC,YAAM,WAA2B,CAAC;AAElC,UAAI,SAAS,CAAC,KAAM,GAAG;AACrB,cAAM,KAAK,SAAS,CAAC;AACrB,cAAM,KAAK,IAAI,IAAI,EAAE,IAAI,QAAQ,CAAC;AAClC,cAAM,KAAK,IAAI,IAAI,EAAE,IAAI,KAAK;AAC9B,cAAM,OAAO,KAAK,KAAK,KAAK,CAAC;AAC7B,cAAM,IAAI,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,CAAC;AACpE,iBAAS,KAAK,EAAE,KAAK,GAAG,QAAQ,QAAQ,GAAG,CAAC;AAAA,MAC9C;AACA,YAAM,SAAS,GAAG,UAAU,IAAI,QAAQ,UAAU,QAAQ;AAC1D,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,GAAG,OAAO,OAAO,QAAQ,MAAM;AAAA,UACpC,QAAQ;AAAA,UACR;AAAA,UACA,GAAG,UAAU,IAAI,IAAI;AAAA,UACrB,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,UAAU,CAAC;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,IACnE,CAAC;AAED,aAAS,IAAI,MAAMA,aAAY,QAAQ,QAAQ,QAAQ,MAAM;AAAA,EAC/D,WAAW,IAAI,UAAU,WAAW;AAElC,UAAM,OAAO,IAAI,OAAO,CAAG;AAC3B,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,QAAI,WAAW;AACf,QAAI,WAAW;AACf,cAAU,QAAQ,CAAC,SAAS;AAC1B,iBAAW,KAAK,IAAI,UAAU,KAAK,YAAY;AAC/C,YAAM,KAAK,iBAAiB,IAAI;AAChC,iBAAW,KAAK,IAAI,UAAU,EAAE;AAAA,IAClC,CAAC;AACD,UAAM,OAAO,WAAW,IAAI,IAAI,YAAY,OAAO,OAAO,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG;AACtF,UAAM,QAAQ,IAAI,OAAO,GAAG;AAC5B,UAAM,OAAO,IAAI,WAAW,IAAI,OAAO,IAAI,KAAK;AAChD,UAAM,QAAQ,IAAI,OAAO,KAAK;AAC9B,UAAM,IAAI;AACV,UAAM,KAAK,IAAI,IAAI,OAAO,CAAC;AAC3B,UAAM,KAAK,IAAI,IAAI,IAAI;AAEvB,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI,IAAI,SAAS,IAAI,KAAK;AAChC,YAAM,OAAO,MAAM,SAAS,aAAa,IAAI,MAAM,IAAI,QAAQ,UAAU,QAAQ;AACjF,YAAM,IAAI;AACV,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAM,SAAS,IAAI,IAAI,OAAO,CAAC;AAC/B,YAAM,IACJ,MAAM,IACF,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,MAAM,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAC3E,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,MAAM,MAAM,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE;AACvG,YAAM,WAAW,aAAa,MAAM,KAAK;AACzC,YAAM,gBAAgB,aAAa,YAAY,6BAA6B,QAAQ;AACpF,YAAM,WAA2B;AAAA,QAC/B,EAAE,KAAK,GAAG,MAAM,GAAG,EAAE,KAAK,CAAC;AAAA,QAC3B,GAAG;AAAA,UACD;AAAA,UACA,UAAU,CAAC;AAAA,UACX,IAAI,IAAI,IAAI,CAAC;AAAA,UACb;AAAA,UACA,IAAI,OAAO,CAAC;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,EAAE;AAC/D,qBAAe,KAAK,IAAI,cAAc,IAAI,IAAI;AAAA,IAChD,CAAC;AAED,aAAS,IAAI,MAAM,OAAO,MAAM;AAAA,EAClC,WAAW,IAAI,UAAU,WAAW;AAClC,UAAM,OAAO,IAAI,QAAQ;AACzB,UAAM,OAAO,IAAI,OAAO,CAAG;AAC3B,UAAM,WAAW,IAAI,OAAO,GAAG;AAC/B,UAAM,KAAK,KAAK,IAAI,GAAG,IAAI,OAAO,IAAI,CAAC;AACvC,UAAM,KAAK,KAAK,IAAI,KAAK,IAAI,OAAO,IAAI,CAAC;AACzC,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,QAAI,WAAW;AACf,QAAI,WAAW;AACf,cAAU,QAAQ,CAAC,SAAS;AAC1B,iBAAW,KAAK,IAAI,UAAU,KAAK,YAAY;AAC/C,YAAM,KAAK,iBAAiB,IAAI;AAChC,iBAAW,KAAK,IAAI,UAAU,EAAE;AAAA,IAClC,CAAC;AACD,UAAM,OAAO,WAAW,IAAI,IAAI,YAAY,OAAO,OAAO,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG;AACtF,UAAM,OAAO,IAAI,WAAW,IAAI,IAAI;AAEpC,QAAI,SAAS,OAAO;AAClB,YAAM,QAAQ,IAAI,OAAO,QAAQ;AACjC,YAAM,IAAI;AACV,YAAM,KAAK,IAAI,IAAI,OAAO,CAAC;AAE3B,UAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,cAAM,IAAI,IAAI,SAAS,IAAI,KAAK;AAChC,cAAM,WAA2B,CAAC;AAClC,YAAI,IAAI,GAAG;AACT,gBAAM,MAAM,IAAI,CAAC;AACjB,gBAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,mBAAS,KAAK,EAAE,KAAK,KAAK,GAAG,IAAI,EAAE,MAAM,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,QAAQ,WAAW,CAAC,CAAC;AACrF,mBAAS;AAAA,YACP,EAAE,KAAK,cAAc,KAAK,IAAI,SAAS,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,cACpE,MAAM,QAAQ;AAAA,YAChB,CAAC;AAAA,UACH;AAAA,QACF;AACA,iBAAS;AAAA,UACP,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,GAAG,QAAQ,SAAS,QAAQ,SAAS,KAAK;AAAA,YACjF,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AACA,iBAAS;AAAA,UACP,GAAG;AAAA,YACD;AAAA,YACA,UAAU,CAAC;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,iBAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,gBAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,EAAE;AAC/D,uBAAe,KAAK,IAAI,cAAc,IAAI,IAAI;AAAA,MAChD,CAAC;AAED,eAAS,IAAI,MAAM,OAAO,MAAM;AAAA,IAClC,OAAO;AAEL,YAAM,OAAO,IAAI,QAAQ,KAAK,KAAK,KAAK,KAAK,CAAC,CAAC;AAC/C,YAAM,OAAO,IAAI,QAAQ;AACzB,YAAM,QAAQ,IAAI,WAAW,IAAI;AAEjC,YAAM,aAAa,SAAS,aAAa,SAAS,cAAc,IAAI,IAAI;AACxE,YAAM,gBAAgB,SAAS,aAAa,SAAS,cAAc,IAAI;AACvE,YAAM,WAAW,aAAa,IAAI,QAAQ,OAAO,GAAG,IAAI;AACxD,YAAM,aAAa,MAAM;AAEzB,YAAM,QAAQ,CAAC,QAAgB,IAAI,SAAS,OAAO,OAAO,SAAS;AACnE,YAAM,QAAQ,CAAC,QAAgB,IAAI,aAAa,OAAO,OAAO,SAAS;AAEvE,UAAI,SAAS;AAEb,UAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,cAAM,EAAE,KAAK,IAAI,IAAI,aAAa,GAAG,MAAM,IAAI;AAC/C,iBAAS,KAAK,IAAI,QAAQ,GAAG;AAC7B,cAAM,IAAI,MAAM,GAAG;AACnB,cAAM,IAAI,MAAM,GAAG;AACnB,cAAM,KAAK,IAAI,IAAI,OAAO,CAAC;AAC3B,cAAM,KAAK,IAAI,IAAI,OAAO,CAAC;AAC3B,cAAM,WAA2B,CAAC;AAElC,YAAI,IAAI,GAAG;AACT,gBAAM,OAAO,aAAa,IAAI,GAAG,MAAM,IAAI;AAC3C,gBAAM,QAAQ,MAAM,KAAK,GAAG;AAC5B,gBAAM,QAAQ,MAAM,KAAK,GAAG;AAC5B,gBAAM,SAAS,IAAI,QAAQ,OAAO,CAAC;AACnC,gBAAM,SAAS,IAAI,QAAQ,OAAO,CAAC;AAEnC,gBAAM,SAAS,SAAS,UAAU,KAAK,QAAQ,MAAM,KAAK,QAAQ;AAElE,cAAI,CAAC,QAAQ;AACX,gBAAI,SAAS,OAAO;AAClB,oBAAM,KAAK;AACX,uBAAS;AAAA,gBACP,EAAE;AAAA,kBACA,KAAK,EAAE,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,kBACpD,QAAQ;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AACA,uBAAS;AAAA,gBACP,EAAE,KAAK,cAAc,IAAI,IAAI,QAAQ,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,kBAClE,MAAM,QAAQ;AAAA,gBAChB,CAAC;AAAA,cACH;AAAA,YACF,WAAW,SAAS,SAAS;AAC3B,kBAAI,MAAM,MAAM,GAAG;AACjB,yBAAS;AAAA,kBACP,EAAE;AAAA,oBACA,KAAK,IAAI,QAAQ,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE;AAAA,oBACnD,QAAQ;AAAA,oBACR;AAAA,kBACF;AAAA,gBACF;AACA,yBAAS;AAAA,kBACP,EAAE,KAAK,cAAc,GAAG,IAAI,SAAS,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,oBAClE,MAAM,QAAQ;AAAA,kBAChB,CAAC;AAAA,gBACH;AAAA,cACF,OAAO;AACL,sBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,yBAAS;AAAA,kBACP,EAAE,KAAK,KAAK,KAAK,IAAI,EAAE,MAAM,IAAI,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,QAAQ,WAAW,CAAC;AAAA,gBAC3E;AACA,yBAAS;AAAA,kBACP,EAAE,KAAK,cAAc,MAAM,IAAI,QAAQ,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,oBACpE,MAAM,QAAQ;AAAA,kBAChB,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF,OAAO;AACL,kBAAI,MAAM,MAAM,GAAG;AACjB,sBAAM,KAAK;AACX,yBAAS;AAAA,kBACP,EAAE;AAAA,oBACA,KAAK,EAAE,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,oBACpD,QAAQ;AAAA,oBACR;AAAA,kBACF;AAAA,gBACF;AACA,yBAAS;AAAA,kBACP,EAAE,KAAK,cAAc,IAAI,IAAI,QAAQ,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,oBAClE,MAAM,QAAQ;AAAA,kBAChB,CAAC;AAAA,gBACH;AAAA,cACF,OAAO;AACL,sBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,yBAAS;AAAA,kBACP,EAAE,KAAK,KAAK,EAAE,IAAI,KAAK,MAAM,EAAE,IAAI,IAAI,OAAO,EAAE,CAAC,IAAI,QAAQ,WAAW,CAAC;AAAA,gBAC3E;AACA,yBAAS;AAAA,kBACP,EAAE,KAAK,cAAc,IAAI,MAAM,MAAM,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,oBAClE,MAAM,QAAQ;AAAA,kBAChB,CAAC;AAAA,gBACH;AAAA,cACF;AAAA,YACF;AAAA,UACF,WAAW,SAAS,SAAS;AAC3B,gBAAI,SAAS,UAAU;AACrB,uBAAS;AAAA,gBACP,EAAE;AAAA,kBACA,KAAK,MAAM,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;AAAA,kBAC3D,QAAQ;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AACA,uBAAS;AAAA,gBACP,EAAE,KAAK,cAAc,QAAQ,GAAG,QAAQ,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,kBACrE,MAAM,QAAQ;AAAA,gBAChB,CAAC;AAAA,cACH;AAAA,YACF,WAAW,KAAK,MAAM,MAAM,GAAG;AAC7B,oBAAM,KAAK,IAAI,QAAQ,IAAI;AAC3B,uBAAS;AAAA,gBACP,EAAE;AAAA,kBACA,KAAK,EAAE,IAAI,MAAM,MAAM,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,MAAM,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE;AAAA,kBACnG,QAAQ;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AACA,uBAAS;AAAA,gBACP,EAAE,KAAK,cAAc,IAAI,IAAI,QAAQ,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,kBAClE,MAAM,QAAQ;AAAA,gBAChB,CAAC;AAAA,cACH;AACA,6BAAe,KAAK,IAAI,cAAc,IAAI,KAAK,QAAQ,MAAM,CAAC;AAAA,YAChE,OAAO;AACL,oBAAM,KAAK;AACX,uBAAS;AAAA,gBACP,EAAE;AAAA,kBACA,KAAK,EAAE,IAAI,MAAM,MAAM,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,MAAM,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE;AAAA,kBACnG,QAAQ;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AACA,uBAAS;AAAA,gBACP,EAAE,KAAK,cAAc,IAAI,IAAI,SAAS,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,kBACnE,MAAM,QAAQ;AAAA,gBAChB,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF,OAAO;AACL,gBAAI,SAAS,UAAU;AACrB,uBAAS;AAAA,gBACP,EAAE,KAAK,KAAK,IAAI,QAAQ,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,QAAQ,WAAW,CAAC;AAAA,cACpF;AACA,uBAAS;AAAA,gBACP,EAAE,KAAK,cAAc,GAAG,IAAI,SAAS,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,kBAClE,MAAM,QAAQ;AAAA,gBAChB,CAAC;AAAA,cACH;AAAA,YACF,WAAW,KAAK,MAAM,MAAM,GAAG;AAC7B,oBAAM,KAAK,IAAI,QAAQ,IAAI;AAC3B,uBAAS;AAAA,gBACP,EAAE;AAAA,kBACA,KAAK,MAAM,IAAI,EAAE,MAAM,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,kBACnG,QAAQ;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AACA,uBAAS;AAAA,gBACP,EAAE,KAAK,cAAc,IAAI,IAAI,MAAM,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,kBAChE,MAAM,QAAQ;AAAA,gBAChB,CAAC;AAAA,cACH;AAAA,YACF,OAAO;AACL,oBAAM,KAAK;AACX,uBAAS;AAAA,gBACP,EAAE;AAAA,kBACA,KAAK,MAAM,IAAI,EAAE,MAAM,MAAM,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC;AAAA,kBACnG,QAAQ;AAAA,kBACR;AAAA,gBACF;AAAA,cACF;AACA,uBAAS;AAAA,gBACP,EAAE,KAAK,cAAc,IAAI,IAAI,QAAQ,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG;AAAA,kBAClE,MAAM,QAAQ;AAAA,gBAChB,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,iBAAS;AAAA,UACP,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,GAAG,QAAQ,SAAS,QAAQ,SAAS,KAAK;AAAA,YACjF,IAAI;AAAA,UACN,CAAC;AAAA,QACH;AACA,iBAAS;AAAA,UACP,GAAG;AAAA,YACD;AAAA,YACA,UAAU,CAAC;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,iBAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,gBAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,EAAE;AAC/D,uBAAe,KAAK,IAAI,cAAc,IAAI,IAAI;AAAA,MAChD,CAAC;AAED,YAAM,cAAc,gBAAgB,QAAQ;AAC5C,eAAS,IAAI,cAAc,SAAS,MAAM,OAAO,YAAY,WAAW,cAAc,MAAM;AAAA,IAC9F;AAAA,EACF,WAAW,IAAI,UAAU,YAAY;AACnC,UAAM,OAAO,KAAK,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC;AACxC,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,QAAI,WAAW;AACf,QAAI,WAAW;AACf,cAAU,QAAQ,CAAC,SAAS;AAC1B,iBAAW,KAAK,IAAI,UAAU,KAAK,YAAY;AAC/C,YAAM,KAAK,iBAAiB,IAAI;AAChC,iBAAW,KAAK,IAAI,UAAU,EAAE;AAAA,IAClC,CAAC;AACD,UAAM,QAAQ,OAAO;AACrB,UAAM,SAAS,WAAW,IAAI,IAAI,WAAW,QAAQ,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG;AACjF,UAAM,QAAQ,IAAI,WAAW,OAAO,GAAG;AACvC,UAAM,QAAQ,IAAI,MAAM,MAAM;AAE9B,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,KAAK,IAAI,SAAS,QAAQ,IAAI,IAAI,KAAK;AAC7C,YAAM,WAA2B,CAAC;AAClC,UAAI,IAAI,GAAG;AACT,cAAM,KAAK,IAAI,SAAS,QAAQ,KAAK,IAAI,KAAK,KAAK;AACnD,iBAAS,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,KAAK,MAAM,EAAE,IAAI,KAAK,IAAI,QAAQ,QAAQ,CAAC,CAAC;AAAA,MAC9E;AACA,eAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,QAAQ,SAAS,QAAQ,YAAY,CAAC,CAAC;AACzF,YAAM,QAAQ,IAAI,MAAM;AACxB,YAAM,KAAK,QACP,IAAI,QAAQ,OAAO,KAAK,WAAW,KAAK,WAAW,KAAK,QAAQ,EAAE,IAClE,IAAI,QAAQ,OAAO,OAAO,CAAC;AAC/B,YAAM,OAAO,UAAU,CAAC;AAExB,UAAI,KAAK,eAAe,QAAW;AACjC,YAAI,OAAO;AACX,mBAAW,MAAM,KAAK,YAAY;AAChC,mBAAS;AAAA,YACP,EAAE,KAAK,IAAI,IAAI,MAAM,MAAM,QAAQ,MAAM,EAAE,QAAQ,QAAQ,QAAQ,SAAS,CAAC;AAAA,UAC/E;AACA,iBAAO,IAAI,OAAO,KAAK;AAAA,QACzB;AACA,YAAI,KAAK,eAAe;AACtB,qBAAW,MAAM,KAAK,eAAe;AACnC,qBAAS;AAAA,cACP,EAAE,KAAK,IAAI,IAAI,MAAM,WAAW,QAAQ,WAAW;AAAA,gBACjD,QAAQ;AAAA,cACV,CAAC;AAAA,YACH;AACA,mBAAO,IAAI,OAAO,YAAY,IAAI;AAAA,UACpC;AAAA,QACF;AAAA,MACF,WAAW,KAAK,MAAM,SAAS,GAAG;AAChC,aAAK,MAAM,QAAQ,CAAC,GAAG,OAAO;AAC5B,mBAAS;AAAA,YACP,EAAE,KAAK,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK,GAAG,MAAM,QAAQ,MAAM,EAAE,QAAQ,SAAS,CAAC;AAAA,UAC9E;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,MAAM,CAAC,KAAK,GAAG,MAAM,IAAI,IAAI,MAAM,QAAQ,MAAM,EAAE,QAAQ,SAAS,CAAC;AAAA,QACnF;AAAA,MACF;AAEA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI;AAAA,QACf,QAAQ;AAAA,UACN,GAAG,IAAI,KAAK,QAAQ,CAAC;AAAA,UACrB,GAAG;AAAA,UACH,OAAO;AAAA,UACP,QAAQ,IAAI,SAAS,IAAI,OAAO,CAAC;AAAA,QACnC;AAAA,MACF;AACA,qBAAe,KAAK,IAAI,cAAc,KAAK,QAAQ,CAAC;AAAA,IACtD,CAAC;AAED,aAAS,IAAI,QAAQ,OAAO,OAAO,SAAS,MAAM;AAAA,EACpD,WAAW,IAAI,UAAU,WAAW;AAClC,UAAM,EAAE,WAAW,OAAO,MAAM,IAAI,oBAAoB,IAAI,OAAO,MAAM,WAAW,KAAK;AACzF,UAAM,OAAO,IAAI,OAAO,GAAG;AAC3B,UAAM,QAAQ,IAAI,QAAQ,IAAI;AAC9B,UAAM,WAAW,IAAI,SAAS,QAAQ,CAAC;AACvC,UAAM,UAAU,CAAC,SAAiB,SAAS,QAAQ,SAAS;AAE5D,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI,MAAM,KAAK,QAAQ;AAC7B,YAAM,OAAO,IAAI,CAAC;AAClB,YAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,YAAM,OAAO,QAAQ,MAAM,IAAI,IAAI,IAAI,CAAC;AACxC,YAAM,OAAO,QAAQ,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;AAC9C,YAAM,KAAK,IAAI,WAAW,OAAO,CAAC;AAClC,YAAM,KAAK,IAAI,WAAW,OAAO,CAAC;AAClC,YAAM,KAAK,IAAI,WAAW,OAAO,CAAC;AAClC,YAAM,KAAK,IAAI,WAAW,OAAO,CAAC;AAClC,YAAM,OAAO,MAAM,SAAS,aAAa,IAAI,MAAM,IAAI,QAAQ,UAAU,QAAQ;AACjF,YAAM,IAAI,KAAK,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI;AACzE,YAAM,WAAW,aAAa,MAAM,KAAK;AACzC,YAAM,gBAAgB,aAAa,YAAY,6BAA6B,QAAQ;AACpF,YAAM,WAA2B;AAAA,QAC/B,EAAE,KAAK,GAAG,MAAM,GAAG,EAAE,KAAK,CAAC;AAAA,QAC3B,GAAG;AAAA,UACD;AAAA,UACA,UAAU,CAAC;AAAA,UACX;AAAA,UACA;AAAA,UACA,IAAI,KAAK,EAAE;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,MAAM,OAAO,IAAI,KAAK,EAAE,GAAG,QAAQ,MAAM,EAAE;AAClF,qBAAe,KAAK,IAAI,cAAc,WAAW,QAAQ,CAAC;AAAA,IAC5D,CAAC;AAED,aAAS,IAAI,MAAM,KAAK,QAAQ,QAAQ,OAAO,MAAM;AAAA,EACvD,WAAW,IAAI,UAAU,WAAW;AAKlC,UAAM,OAAc,CAAC;AACrB,eAAW,MAAM,IAAI,OAAO;AAC1B,UAAI,GAAG,UAAU,KAAK,KAAK,WAAW,EAAG,MAAK,KAAK,EAAE,QAAQ,IAAI,OAAO,CAAC,EAAE,CAAC;AAAA,UACvE,MAAK,KAAK,SAAS,CAAC,EAAG,MAAM,KAAK,EAAE;AAAA,IAC3C;AACA,UAAM,YAAY,oBAAI,IAA2B;AACjD,QAAI,MAAM,QAAQ,CAAC,OAAO;AACxB,gBAAU,IAAI,GAAG,IAAI,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAAA,IACjE,CAAC;AAED,QAAI,iBAAiB;AACrB,QAAI,eAAe;AACnB,SAAK,QAAQ,CAAC,MAAM;AAClB,YAAM,QAAQ,UAAU,IAAI,EAAE,OAAO,EAAE;AACvC,YAAM,SAAS,iBAAiB,KAAK;AACrC,uBAAiB,KAAK,IAAI,gBAAgB,MAAM;AAChD,QAAE,MAAM,QAAQ,CAAC,OAAO;AACtB,cAAM,QAAQ,UAAU,IAAI,GAAG,EAAE;AACjC,cAAM,SAAS,iBAAiB,KAAK;AACrC,uBAAe,KAAK,IAAI,cAAc,MAAM;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,UAAM,UACJ,iBAAiB,IAAI,IAAI,kBAAkB,OAAO,OAAO,OAAO,CAAG,IAAI,IAAI,OAAO,GAAG;AACvF,UAAM,QACJ,eAAe,IAAI,IAAI,gBAAgB,OAAO,QAAQ,OAAO,GAAG,IAAI,IAAI,OAAO,CAAG;AACpF,UAAM,MAAM,IAAI,OAAO,GAAG;AAC1B,UAAM,SAAS,IAAI,OAAO,GAAG;AAC7B,UAAM,OAAO,IAAI,OAAO,GAAG;AAE3B,QAAI,IAAI;AACR,QAAI,WAAW;AACf,UAAM,OAAiB,CAAC;AACxB,UAAM,OAAiB,CAAC;AACxB,SAAK,QAAQ,CAAC,MAAM;AAClB,UAAI,IAAI,UAAU,IAAI,EAAE,OAAO,EAAE,EAAG;AACpC,QAAE,MAAM,QAAQ,CAAC,OAAO;AACtB,YAAI,KAAK,IAAI,GAAG,UAAU,IAAI,GAAG,EAAE,EAAG,YAAY;AAAA,MACpD,CAAC;AACD,YAAM,KAAK,IAAI,IAAI,IAAI,IAAI;AAC3B,WAAK,KAAK,IAAI,CAAC,CAAC;AAChB,WAAK,KAAK,EAAE;AACZ,WAAK,KAAK;AACV,iBAAW,KAAK,IAAI,UAAU,EAAE,MAAM,MAAM;AAAA,IAC9C,CAAC;AACD,mBAAe,IAAI,IAAI,MAAM;AAE7B,SAAK,QAAQ,CAAC,GAAG,OAAO;AACtB,YAAM,MAAM,KAAK,EAAE;AACnB,YAAM,KAAK,KAAK,EAAE;AAClB,YAAM,QAAQ,UAAU,IAAI,EAAE,OAAO,EAAE;AACvC,YAAM,YAA4B;AAAA,QAChC,EAAE;AAAA,UACA,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,IAAI,QAAQ,QAAQ;AAAA,UAC7C,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,QACA,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa,QAAQ,SAAS,KAAK;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,WAAW,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CAAC;AACrD,cAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,IAAI,QAAQ,QAAQ,EAAE;AAEhF,QAAE,MAAM,QAAQ,CAAC,IAAI,OAAO;AAC1B,cAAM,MAAM,IAAI,MAAM,UAAU,MAAM,MAAM,QAAQ,IAAI;AACxD,cAAM,QAAQ,UAAU,IAAI,GAAG,EAAE;AACjC,cAAM,MAAsB;AAAA,UAC1B,EAAE,KAAK,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,IAAI,QAAQ,MAAM,GAAG,QAAQ,SAAS,QAAQ,QAAQ,GAAG;AAAA,YACvF,IAAI;AAAA,UACN,CAAC;AAAA,UACD,GAAG;AAAA,YACD;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,iBAAS,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AACzC,gBAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,GAAG,KAAK,OAAO,IAAI,QAAQ,MAAM,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH,CAAC;AAED,aAAS,IAAI,MAAM,UAAU,MAAM,YAAY,QAAQ,OAAO,MAAM;AAAA,EACtE,WAAW,IAAI,UAAU,SAAS;AAChC,UAAM,MAAM,IAAI,OAAO,GAAG;AAC1B,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,QAAI,WAAW;AACf,QAAI,WAAW;AACf,cAAU,QAAQ,CAAC,SAAS;AAC1B,iBAAW,KAAK,IAAI,UAAU,KAAK,YAAY;AAC/C,YAAM,KAAK,iBAAiB,IAAI;AAChC,iBAAW,KAAK,IAAI,UAAU,EAAE;AAAA,IAClC,CAAC;AACD,UAAM,QAAQ,WAAW,IAAI,IAAI,YAAY,OAAO,QAAQ,IAAI,GAAG,IAAI,IAAI,OAAO,GAAG;AACrF,UAAM,QAAQ,IAAI,WAAW,IAAI,GAAG;AACpC,UAAM,QAAQ,QAAQ,IAAI,OAAO,GAAG;AACpC,UAAM,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,IAAI;AACpF,UAAM,MAAM,IAAI,SAAS,IAAI,QAAQ,CAAC;AACtC,UAAM,MAAM,IAAI,MAAM,IAAI,QAAQ,CAAC;AACnC,UAAM,OAAQ,IAAI,KAAK,KAAM,KAAK,IAAI,GAAG,CAAC;AAC1C,UAAM,SAAS,IAAI,IAAI,KAAK,IAAI,OAAO,MAAM,QAAQ,IAAI,OAAO,CAAC,IAAI;AAErE,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI;AAC7B,YAAM,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC;AACrC,YAAM,MAAM,IAAI,MAAM,IAAI,KAAK,IAAI,CAAC,CAAC;AACrC,YAAM,IAAI,IAAI,MAAM,QAAQ,CAAC;AAC7B,YAAM,IAAI,IAAI,MAAM,QAAQ,CAAC;AAC7B,YAAM,WAA2B,CAAC;AAElC,UAAI,IAAI,GAAG;AACT,cAAM,KAAK,IAAI;AACf,cAAM,KAAK,IAAI,OAAO;AACtB,YAAI,KAAK,IAAI;AACX,gBAAM,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC;AACrC,gBAAM,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC;AACrC,gBAAM,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC;AACrC,gBAAM,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,EAAE,CAAC;AACrC,mBAAS,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,QAAQ,SAAS,CAAC,CAAC;AACvF,gBAAM,KAAK,KAAK;AAChB,gBAAM,KAAK,MAAM,IAAI,KAAK,IAAI,EAAE;AAChC,gBAAM,KAAK,MAAM,IAAI,KAAK,IAAI,EAAE;AAChC,gBAAM,KAAK,KAAK,IACd,KAAK,KAAK;AACZ,gBAAM,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK;AAClC,gBAAM,KAAK,KAAK,KACd,KAAK,KAAK;AACZ,gBAAM,KAAK,KAAK,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC;AACtC,gBAAM,KAAK,KAAK,KAAK,IACnB,KAAK,KAAK,KAAK;AACjB,gBAAM,MAAM,KAAK,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,KAAK,KAAK,GAAG,CAAC;AACzI,mBAAS,KAAK,EAAE,KAAK,KAAK,QAAQ,SAAS,GAAG,EAAE,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAAA,QAC1E;AAAA,MACF;AAEA,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,OAAO,QAAQ,MAAM,GAAG,QAAQ,SAAS,QAAQ,SAAS,KAAK;AAAA,UACnF,IAAI;AAAA,QACN,CAAC;AAAA,MACH;AACA,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,UAAU,CAAC;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,OAAO,QAAQ,MAAM,EAAE;AACjE,qBAAe,KAAK,IAAI,cAAc,IAAI,KAAK;AAAA,IACjD,CAAC;AAED,aAAS,IAAI,MAAM,IAAI,IAAI,QAAQ,MAAM;AAAA,EAC3C,WAAW,IAAI,UAAU,UAAU;AACjC,UAAM,OAAO,CAAC,QAAQ,SAAS,QAAQ,WAAW,QAAQ,SAAS,QAAQ,OAAO;AAClF,UAAM,OAAO;AACb,UAAM,OAAO,KAAK,KAAK,IAAI,IAAI;AAC/B,UAAM,MAAM,IAAI,OAAO,GAAG;AAC1B,UAAM,MAAM,IAAI,OAAO,GAAG;AAC1B,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,QAAI,WAAW;AACf,QAAI,WAAW;AACf,cAAU,QAAQ,CAAC,SAAS;AAC1B,iBAAW,KAAK,IAAI,UAAU,KAAK,YAAY;AAC/C,YAAM,KAAK,iBAAiB,IAAI;AAChC,iBAAW,KAAK,IAAI,UAAU,EAAE;AAAA,IAClC,CAAC;AACD,UAAM,QAAQ,IAAI,WAAW,IAAI,GAAG;AACpC,UAAM,QAAQ,WAAW,IAAI,IAAI,YAAY,OAAO,OAAO,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG;AAEvF,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI,KAAK,MAAM,IAAI,IAAI;AAC7B,YAAM,IAAI,IAAI;AACd,YAAM,IAAI,IAAI,SAAS,KAAK,QAAQ,IAAI;AACxC,YAAM,IAAI,IAAI,MAAM,KAAK,QAAQ,IAAI;AACrC,YAAM,OAAO,KAAK,IAAI,KAAK,MAAM;AACjC,YAAM,WAAW,aAAa,MAAM,KAAK;AACzC,YAAM,gBAAgB,aAAa,YAAY,6BAA6B,QAAQ;AACpF,YAAM,WAA2B;AAAA,QAC/B,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,OAAO,QAAQ,MAAM,GAAG,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,QACtE,GAAG;AAAA,UACD;AAAA,UACA,UAAU,CAAC;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,OAAO,QAAQ,MAAM,EAAE;AACjE,qBAAe,KAAK,IAAI,cAAc,IAAI,KAAK;AAAA,IACjD,CAAC;AAED,aAAS,IAAI,MAAM,QAAQ,QAAQ,OAAO,MAAM,MAAM;AAAA,EACxD,WAAW,IAAI,UAAU,UAAU;AACjC,UAAM,EAAE,WAAW,OAAO,MAAM,IAAI,oBAAoB,IAAI,OAAO,MAAM,WAAW,IAAI;AACxF,UAAM,OAAO,IAAI,OAAO,GAAG;AAC3B,UAAM,QAAQ,IAAI,QAAQ,IAAI;AAC9B,UAAM,WAAW,IAAI,SAAS,QAAQ,CAAC;AACvC,UAAM,UAAU,CAAC,SAAiB,SAAS,QAAQ,SAAS;AAE5D,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI,MAAM,KAAK,QAAQ;AAC7B,YAAM,OAAO,IAAI,CAAC;AAClB,YAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,YAAM,OAAO,QAAQ,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC;AAC9C,YAAM,OAAO,QAAQ,MAAM,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC;AAClD,YAAM,KAAK,IAAI,WAAW,OAAO,CAAC;AAClC,YAAM,KAAK,IAAI,WAAW,OAAO,CAAC;AAClC,YAAM,KAAK,IAAI,WAAW,OAAO,CAAC;AAClC,YAAM,KAAK,IAAI,WAAW,OAAO,CAAC;AAClC,YAAM,OAAO,MAAM,SAAS,aAAa,IAAI,MAAM,IAAI,QAAQ,UAAU,QAAQ;AACjF,YAAM,IAAI,KAAK,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,EAAE,IAAI,IAAI;AACzE,YAAM,WAAW,aAAa,MAAM,KAAK;AACzC,YAAM,gBAAgB,aAAa,YAAY,6BAA6B,QAAQ;AACpF,YAAM,WAA2B;AAAA,QAC/B,EAAE,KAAK,GAAG,MAAM,GAAG,EAAE,KAAK,CAAC;AAAA,QAC3B,GAAG;AAAA,UACD;AAAA,UACA,UAAU,CAAC;AAAA,UACX;AAAA,UACA;AAAA,UACA,IAAI,KAAK,EAAE;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,GAAG,MAAM,OAAO,IAAI,KAAK,EAAE,GAAG,QAAQ,MAAM,EAAE;AAClF,qBAAe,KAAK,IAAI,cAAc,WAAW,QAAQ,CAAC;AAAA,IAC5D,CAAC;AAED,aAAS,IAAI,MAAM,KAAK,QAAQ,QAAQ,OAAO,MAAM;AAAA,EACvD,WAAW,IAAI,UAAU,UAAU;AACjC,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,QAAI,WAAW;AACf,QAAI,WAAW;AACf,cAAU,QAAQ,CAAC,SAAS;AAC1B,iBAAW,KAAK,IAAI,UAAU,KAAK,YAAY;AAC/C,YAAM,KAAK,iBAAiB,IAAI;AAChC,iBAAW,KAAK,IAAI,UAAU,EAAE;AAAA,IAClC,CAAC;AACD,UAAM,OAAO,WAAW,IAAI,IAAI,YAAY,OAAO,OAAO,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG;AACtF,UAAM,OAAO,IAAI,OAAO,GAAG;AAC3B,UAAM,SAAS,IAAI,OAAO,GAAG;AAC7B,UAAM,OAAO,IAAI,WAAW,IAAI,IAAI,OAAO,GAAG,CAAC;AAC/C,UAAM,UAAU;AAChB,UAAM,MAAM,CAAC,MAAc,IAAI,WAAW,IAAI,IAAI,KAAK,MAAM;AAC7D,UAAM,MAAM,CAAC,MAAc,IAAI,SAAS,KAAK,OAAO,KAAK;AAEzD,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,IAAI,IAAI,CAAC;AACf,YAAM,IAAI,IAAI,CAAC;AACf,YAAM,WAA2B,CAAC;AAClC,UAAI,IAAI,GAAG;AACT,cAAM,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;AAChC,cAAM,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,OAAO,CAAC;AACpC,cAAM,KAAK,IAAI,IAAI,OAAO,CAAC;AAC3B,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE;AAAA,YACpF,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,GAAG,QAAQ,SAAS,QAAQ,SAAS,KAAK;AAAA,UACjF,IAAI;AAAA,QACN,CAAC;AAAA,MACH;AACA,eAAS;AAAA,QACP,GAAG;AAAA,UACD;AAAA,UACA,UAAU,CAAC;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,MAAM,QAAQ,KAAK,EAAE;AAC/D,qBAAe,KAAK,IAAI,cAAc,IAAI,IAAI;AAAA,IAChD,CAAC;AAED,aAAS,IAAI,OAAO,IAAI,KAAK,SAAS,OAAO,MAAM;AAAA,EACrD,WAAW,IAAI,UAAU,QAAQ;AAC/B,UAAM,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AACA,UAAM,YAAY,IAAI,MAAM,IAAI,CAAC,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS,CAAC;AAClF,QAAI,WAAW;AACf,cAAU,QAAQ,CAAC,OAAO;AACxB,iBAAW,KAAK,IAAI,UAAU,GAAG,YAAY;AAAA,IAC/C,CAAC;AACD,UAAM,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK,WAAW,IAAI,IAAI,CAAC;AACvD,UAAM,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;AAClC,UAAM,QAAQ,MAAM,IAAI,KAAK,KAAK,CAAC,KAAK,KAAK;AAC7C,UAAM,MAAM,IAAI,SAAS,IAAI,CAAC;AAC9B,UAAM,MAAM,IAAI,MAAM,IAAI,CAAC;AAC3B,UAAM,SAAS,IAAI,IAAI,IAAI,IAAI;AAE/B,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,MAAM,QAAS,IAAI,IAAI,KAAK,KAAM;AACxC,YAAM,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,GAAG,CAAC;AACtC,YAAM,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,GAAG,CAAC;AACtC,YAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,SAAS,KAAK,IAAI,GAAG,CAAC;AAC3D,YAAM,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,SAAS,KAAK,IAAI,GAAG,CAAC;AAC3D,YAAM,OAAO,KAAK,IAAI,KAAK,MAAM;AACjC,YAAM,OAAO,UAAU,CAAC;AACxB,YAAM,WAA2B;AAAA,QAC/B,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,MAAM,MAAM,GAAG,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/D;AAEA,UAAI,KAAK,eAAe,QAAW;AACjC,cAAM,UAAU,OAAO;AACvB,cAAM,QAAQ,YAAY;AAC1B,cAAM,aAAa,KAAK,WAAW,UAAU,KAAK,eAAe,UAAU;AAC3E,YAAI,OAAO,IAAI,KAAK,OAAO,QAAS,aAAa,KAAK,UAAW,CAAC;AAClE,mBAAW,MAAM,KAAK,YAAY;AAChC,mBAAS;AAAA,YACP,EAAE,KAAK,IAAI,IAAI,MAAM,MAAM,QAAQ,MAAM;AAAA,cACvC,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AACA,iBAAO,IAAI,OAAO,OAAO;AAAA,QAC3B;AACA,YAAI,KAAK,eAAe;AACtB,qBAAW,MAAM,KAAK,eAAe;AACnC,qBAAS;AAAA,cACP,EAAE,KAAK,IAAI,IAAI,MAAM,WAAW,QAAQ,WAAW;AAAA,gBACjD,QAAQ;AAAA,cACV,CAAC;AAAA,YACH;AACA,mBAAO,IAAI,OAAO,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF,WAAW,KAAK,MAAM,SAAS,GAAG;AAChC,cAAM,QAAQ,OAAO;AACrB,cAAM,SAAS,IAAI,KAAK,OAAO,QAAS,KAAK,MAAM,SAAS,KAAK,QAAS,CAAC;AAC3E,aAAK,MAAM,QAAQ,CAAC,GAAG,OAAO;AAC5B,mBAAS;AAAA,YACP,EAAE,KAAK,GAAG,IAAI,IAAI,SAAS,KAAK,KAAK,GAAG,MAAM,QAAQ,MAAM;AAAA,cAC1D,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AACL,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,MAAM,CAAC,KAAK,GAAG,MAAM,IAAI,IAAI,KAAK,OAAO,IAAI,GAAG,MAAM,QAAQ,MAAM;AAAA,YAC9E,QAAQ;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAEA,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI;AAAA,QACf,QAAQ,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,GAAG,OAAO,IAAI,IAAI,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,EAAE;AAAA,MAClF;AACA,qBAAe,KAAK,IAAI,cAAc,KAAK,CAAC;AAAA,IAC9C,CAAC;AAED,aAAS,IAAI,MAAM,KAAK,IAAI,KAAK,MAAM;AAAA,EACzC,OAAO;AACL,QAAI,OAAO;AAEX,QAAI,MAAM,QAAQ,CAAC,IAAI,MAAM;AAC3B,YAAM,OAAO,iBAAiB,GAAG,MAAM,MAAM,SAAS;AACtD,YAAM,YAAY,iBAAiB,IAAI;AACvC,YAAM,OAAO,YAAY,IAAI,IAAI,aAAa,OAAO,QAAQ,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG;AACzF,YAAM,OAAO;AACb,YAAM,KAAK,YAAY,IAAI,OAAO,OAAO,OAAO,OAAO,OAAO;AAC9D,YAAM,IAAI,SAAS,GAAG,QAAQ;AAC9B,YAAM,WAA2B,CAAC;AAClC,UAAI;AAEJ,UAAI,IAAI,UAAU,YAAY;AAC5B,cAAM,QAAQ,GAAG,GAAG,WAAW;AAC/B,cAAM,cAAc,YAAY,IAAI,IAAI,OAAO,OAAO,IAAI,IAAI,IAAI,KAAK,OAAO,IAAI;AAClF,iBAAS;AAAA,UACP,EAAE,KAAK,OAAO,GAAG,aAAa,MAAM,QAAQ,SAAS,EAAE,QAAQ,QAAQ,QAAQ,QAAQ,CAAC;AAAA,QAC1F;AACA,gBAAQ,IAAI,YAAY,OAAO,IAAI,EAAE,QAAQ;AAAA,MAC/C,OAAO;AACL,cAAM,IAAI,aAAa,GAAG,OAAO,IAAI;AACrC,cAAM,IAAI,YAAY,GAAG,OAAO,OAAO;AACvC,iBAAS,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;AAC5D,gBAAQ,IAAI,IAAI,IAAI;AAAA,MACtB;AAEA,UAAI,KAAK,eAAe,QAAW;AACjC,cAAM,UAAU,OAAO;AACvB,cAAM,QAAQ,YAAY;AAC1B,YAAI,WAAW,IAAI,OAAO,OAAO,IAAI;AAErC,iBAAS,KAAK,GAAG,KAAK,KAAK,WAAW,QAAQ,MAAM;AAClD,mBAAS;AAAA,YACP,EAAE,KAAK,KAAK,WAAW,EAAE,GAAI,OAAO,UAAU,MAAM,QAAQ,MAAM;AAAA,cAChE,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV,CAAC;AAAA,UACH;AACA,sBAAY;AAAA,QACd;AAEA,YAAI,KAAK,eAAe;AACtB,mBAAS,KAAK,GAAG,KAAK,KAAK,cAAc,QAAQ,MAAM;AACrD,qBAAS;AAAA,cACP,EAAE,KAAK,KAAK,cAAc,EAAE,GAAI,OAAO,UAAU,WAAW,QAAQ,WAAW;AAAA,gBAC7E,QAAQ;AAAA,cACV,CAAC;AAAA,YACH;AACA,wBAAY;AAAA,UACd;AAAA,QACF;AAAA,MACF,WAAW,KAAK,MAAM,SAAS,GAAG;AAChC,cAAM,QAAQ,OAAO;AACrB,aAAK,MAAM,QAAQ,CAAC,MAAM,OAAO;AAC/B,gBAAM,KAAK,IAAI,OAAO,OAAO,OAAO,KAAK,KAAK;AAC9C,mBAAS,KAAK,EAAE,KAAK,MAAM,OAAO,IAAI,MAAM,QAAQ,MAAM,EAAE,QAAQ,QAAQ,CAAC,CAAC;AAAA,QAChF,CAAC;AAAA,MACH,OAAO;AACL,cAAM,eAAe,IAAI,OAAO,OAAO,IAAI,OAAO,IAAI;AACtD,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,MAAM,CAAC,KAAK,GAAG,MAAM,OAAO,cAAc,MAAM,QAAQ,MAAM;AAAA,YACxE,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,KAAK,KAAK;AAChB,qBAAe,KAAK,IAAI,cAAc,QAAQ,EAAE;AAChD,eAAS,KAAK,EAAE,MAAM,UAAU,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AAC9C,cAAQ,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,MAAM,OAAO,IAAI,QAAQ,IAAI,EAAE,GAAG,QAAQ,KAAK,EAAE;AACpF,cAAQ;AAAA,IACV,CAAC;AAED,aAAS,IAAI,OAAO,MAAM;AAAA,EAC5B;AAEA,MAAI,IAAI,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,IAAI,SAAS,WAAW,aAAa;AAAA,QACrC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,eAAe,MAAM;AACvC,QAAM,QAAe;AAAA,IACnB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO;AAAA,IACrC,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF;AAIA,QAAM,OAAO,EAAE,OAAO,QAAuC;AAC7D,SAAO,IAAI,WAAW,SAAS,OAAO,EAAE,GAAG,MAAM,QAAQ,EAAE,OAAO,WAAW,GAAG,EAAE,EAAE;AACtF;AAEO,IAAM,OAA+B;AAAA,EAC1C,aAAa,OAAwB;AACnC,WAAO,UAAU,KAAK;AAAA,EACxB;AAAA,EACA,UAAU,OAAwB;AAChC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,OAAO,IAAa,OAAoC;AACtD,WAAOF,YAAW,IAAI,KAAK;AAAA,EAC7B;AACF;;;ACjzDO,SAAS,cAAc,OAAiC;AAC7D,QAAM,EAAE,UAAU,KAAK,IAAI,mBAAmB,KAAK;AACnD,QAAMG,SAAQ,KAAK,MAAM,OAAO;AAEhC,MAAI,SAAS;AACb,MAAI,QAAQ,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AAClE,QAAM,aAAiC,CAAC;AACxC,MAAI,kBAAoE;AAExE,WAAS,WAAWA,QAAO;AACzB,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,CAAC,WAAW,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,GAAG,GAAG;AACnE;AAAA,IACF;AAEA,QAAI,eAAe,KAAK,OAAO,GAAG;AAChC;AAAA,IACF;AAGA,UAAM,aAAa,QAAQ,MAAM,kDAAkD;AACnF,QAAI,YAAY;AACd,eAAS,WAAW,CAAC,KAAK,WAAW,CAAC,KAAK,WAAW,CAAC,KAAK,IAAI,KAAK;AACrE;AAAA,IACF;AAGA,UAAM,cAAc,QAAQ,MAAM,mDAAmD;AACrF,QAAI,aAAa;AACf,gBAAU,YAAY,CAAC,KAAK,YAAY,CAAC,KAAK,YAAY,CAAC,KAAK,IAAI,KAAK;AACzE;AAAA,IACF;AAGA,UAAM,WAAW,QAAQ,MAAM,qDAAqD;AACpF,QAAI,UAAU;AACZ,YAAM,QAAQ,SAAS,CAAC,KAAK,SAAS,CAAC,KAAK,SAAS,CAAC,KAAK,IAAI,KAAK;AACpE,wBAAkB,EAAE,MAAM,QAAQ,CAAC,EAAE;AACrC,iBAAW,KAAK,eAAe;AAC/B;AAAA,IACF;AAGA,QAAI,iBAAiB;AACnB,YAAM,YAAY,QACf,QAAQ,SAAS,EAAE,EACnB,QAAQ,eAAe,IAAI,EAC3B,QAAQ,eAAe,IAAI,EAC3B,KAAK;AACR,UAAI,WAAW;AACb,wBAAgB,OAAO,KAAK,EAAE,OAAO,UAAU,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAG,UAAU,MAAM;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACF;;;AClDO,SAAS,eAAe,KAAuB,OAAoC;AACxF,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,WAA2B,CAAC;AAElC,QAAM,aAAa,IAAI;AACvB,QAAM,UAAU,WAAW;AAC3B,QAAM,UAAU,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;AACvD,QAAM,UAAU,WAAW,OAAO,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC;AACvD,QAAM,WAAW,KAAK,IAAI,QAAQ,QAAQ,QAAQ,QAAQ,CAAC;AAE3D,QAAM,WAAW;AACjB,QAAM,UAAU;AAChB,QAAM,SAAS,IAAI,SAAS,QAAQ,KAAK;AACzC,QAAM,cAAc;AACpB,QAAM,YAAY,UAAU,WAAW,WAAW;AAClD,QAAM,aAAa;AACnB,QAAM,aAAa;AACnB,QAAM,aAAa,YAAY;AAC/B,QAAM,SAAS,SAAS;AACxB,QAAM,UAAU,aAAa,aAAa;AAC1C,QAAM,UAAU,SAAS;AAGzB,MAAI,IAAI,SAAS,OAAO;AACtB,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,IAAI,SAAS,KAAK,GAAG,SAAS,IAAI,WAAW,eAAe,QAAQ,MAAM;AAAA,QACtF,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,WAAS,KAAK,EAAE,KAAK,KAAK,WAAW,IAAI,MAAM,MAAM,SAAS,IAAI,MAAM,IAAI,QAAQ,SAAS,CAAC,CAAC;AAG/F,WAAS;AAAA,IACP,EAAE;AAAA,MACA,KAAK,YAAY,EAAE,IAAI,SAAS,CAAC,MAAM,YAAY,CAAC,IAAI,MAAM,MAAM,YAAY,EAAE,IAAI,SAAS,CAAC;AAAA,MAChG,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,MAAM,QAAQ,QAAQ;AAAA,IAC1B;AAAA,EACF;AAGA,WAAS;AAAA,IACP,EAAE;AAAA,MACA,EAAE,GAAG,YAAY,GAAG,SAAS,aAAa,GAAG,OAAO,YAAY,QAAQ,WAAW;AAAA,MACnF,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA,EAAE,IAAI,EAAE;AAAA,IACV;AAAA,EACF;AAGA,QAAM,iBAAiB,YAAY,IAAI,QAAQ,WAAW,YAAY;AACtE,WAAS;AAAA,IACP,EAAE;AAAA,MACA,IAAI;AAAA,MACJ,aAAa,aAAa;AAAA,MAC1B,SAAS,WAAW,eAAe;AAAA,MACnC,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,IACrC;AAAA,EACF;AAGA,WAAS,UAAU,GAAG,UAAU,UAAU,WAAW;AACnD,UAAM,eAAe,cAAc,MAAM,UAAU;AAGnD,QAAI,UAAU,QAAQ,QAAQ;AAC5B,YAAM,MAAM,QAAQ,OAAO;AAC3B,YAAM,YAAY,eAAe;AACjC,YAAM,YAAY,SAAS;AAG3B,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,SAAS,IAAI,SAAS,MAAM,YAAY,IAAI,MAAM,IAAI,QAAQ,QAAQ,CAAC;AAAA,MACrF;AAGA,YAAM,WAAW,KAAK,IAAI,IAAI,YAAY,IAAI,MAAM,WAAW,aAAa,EAAE,QAAQ,EAAE;AACxF,YAAM,UAAU;AAChB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,YAAY,WAAW,GAAG,GAAG,YAAY,SAAS,OAAO,UAAU,QAAQ,QAAQ;AAAA,UACxF,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,UACA,YAAY,UAAU,IAAI,WAAW,gBAAgB;AAAA,UACrD,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,QACrC;AAAA,MACF;AAGA,YAAM,YAAY,IAAI,OAAO;AAC7B,eAAS,OAAO,GAAG,OAAO,WAAW,QAAQ;AAC3C,cAAM,KAAK,OAAO,MAAM,YAAY;AACpC,cAAM,SAAS,aAAa,eAAe,aAAa;AACxD,cAAM,SAAS,aAAa,SAAS,aAAa;AAClD,cAAM,UAAU;AAChB,cAAM,aAAa,SAAS;AAG5B,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,UAAU,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,QAAQ,QAAQ,GAAG;AAAA,QAC/E;AAEA,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,IAAI,OAAO,IAAI,EAAG;AAAA,YAClB,aAAa;AAAA,YACb,SAAS;AAAA,YACT,WAAW,gBAAgB;AAAA,YAC3B,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,UAAU,QAAQ,QAAQ;AAC5B,YAAM,MAAM,QAAQ,OAAO;AAC3B,YAAM,YAAY,eAAe;AACjC,YAAM,YAAY,SAAS;AAG3B,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,SAAS,IAAI,SAAS,MAAM,YAAY,IAAI,MAAM,IAAI,QAAQ,QAAQ,CAAC;AAAA,MACrF;AAGA,YAAM,WAAW,KAAK,IAAI,IAAI,YAAY,IAAI,MAAM,WAAW,aAAa,EAAE,QAAQ,EAAE;AACxF,YAAM,UAAU;AAChB,eAAS;AAAA,QACP,EAAE;AAAA,UACA,EAAE,GAAG,YAAY,WAAW,GAAG,GAAG,WAAW,OAAO,UAAU,QAAQ,QAAQ;AAAA,UAC9E,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,IAAI,EAAE;AAAA,QACV;AAAA,MACF;AACA,eAAS;AAAA,QACP,EAAE;AAAA,UACA,IAAI;AAAA,UACJ;AAAA,UACA,YAAY,UAAU,IAAI,WAAW,gBAAgB;AAAA,UACrD,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,QACrC;AAAA,MACF;AAGA,YAAM,YAAY,IAAI,OAAO;AAC7B,eAAS,OAAO,GAAG,OAAO,WAAW,QAAQ;AAC3C,cAAM,KAAK,OAAO,MAAM,YAAY;AACpC,cAAM,SAAS,aAAa,eAAe,aAAa;AACxD,cAAM,SAAS,aAAa,SAAS,aAAa;AAClD,cAAM,UAAU;AAChB,cAAM,aAAa,SAAS;AAG5B,iBAAS;AAAA,UACP,EAAE,KAAK,KAAK,UAAU,IAAI,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,QAAQ,QAAQ,GAAG;AAAA,QAC/E;AAEA,iBAAS;AAAA,UACP,EAAE;AAAA,YACA,IAAI,OAAO,IAAI,EAAG;AAAA,YAClB,aAAa;AAAA,YACb,SAAS;AAAA,YACT,WAAW,gBAAgB;AAAA,YAC3B,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAkB;AAAA,IACtB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,SAAS,QAAQ,QAAQ;AAAA,IACvD,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,UAAU,IAAI,UAAU,KAAK;AACzD,QAAM,UAA8B,CAAC;AAErC,SAAO,EAAE,OAAO,QAAQ;AAC1B;;;ACrNO,IAAM,WAA4C;AAAA,EACvD,cAAc;AAAA,EACd,UAAU,OAAiC;AACzC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,QAAQ;AACV;;;ACRO,SAAS,aAAa,OAAgC;AAC3D,QAAM,EAAE,UAAU,KAAK,IAAI,mBAAmB,KAAK;AACnD,QAAMC,SAAQ,KAAK,MAAM,OAAO;AAEhC,MAAI,YAAkC;AACtC,MAAI,QAAQ,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AAClE,QAAM,QAAuB,CAAC;AAE9B,aAAW,WAAWA,QAAO;AAC3B,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,CAAC,WAAW,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,GAAG,GAAG;AACnE;AAAA,IACF;AAEA,QAAI,aAAa,KAAK,OAAO,GAAG;AAC9B,kBAAY;AACZ;AAAA,IACF;AACA,QAAI,cAAc,KAAK,OAAO,GAAG;AAC/B,kBAAY;AACZ;AAAA,IACF;AAGA,UAAM,aAAa,QAAQ,MAAM,kDAAkD;AACnF,QAAI,YAAY;AACd,eAAS,WAAW,CAAC,KAAK,WAAW,CAAC,KAAK,WAAW,CAAC,KAAK,IAAI,KAAK;AACrE;AAAA,IACF;AAGA,QAAI,cAAc,QAAQ,QAAQ,aAAa,EAAE,EAAE,QAAQ,SAAS,EAAE;AACtE,UAAM,UAAU,6BAA6B,KAAK,WAAW;AAC7D,kBAAc,YAAY,QAAQ,+BAA+B,EAAE,EAAE,KAAK;AAG1E,UAAM,WAAW,YAAY,YAAY,GAAG;AAC5C,QAAI,QAAQ;AACZ,QAAI;AAEJ,QAAI,WAAW,KAAK,CAAC,YAAY,WAAW,MAAM,GAAG;AACnD,cAAQ,YAAY,MAAM,GAAG,QAAQ,EAAE,KAAK;AAC5C,cAAQ,YAAY,MAAM,WAAW,CAAC,EAAE,KAAK;AAAA,IAC/C;AAEA,YAAQ,MAAM,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAC/C,QAAI,OAAO;AACT,cAAQ,MAAM,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAAA,IACjD;AAEA,QAAI,OAAO;AACT,YAAM,KAAK;AAAA,QACT;AAAA,QACA,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,CAAC;AAAA,QACvC,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAG,UAAU,MAAM;AAAA,IAC/B;AAAA,IACA;AAAA,EACF;AACF;;;ACxDO,SAAS,cAAc,KAAsB,OAAoC;AACtF,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,WAA2B,CAAC;AAElC,QAAM,QAAQ,IAAI;AAClB,QAAM,IAAI,KAAK,IAAI,MAAM,QAAQ,CAAC;AAClC,QAAM,WAAW,IAAI,cAAc;AAEnC,QAAM,UAAU;AAChB,QAAM,SAAS,IAAI,SAAS,QAAQ,KAAK;AACzC,QAAM,QAAQ;AACd,QAAM,UAAU;AAChB,QAAM,aAAa,IAAI,SAAS,IAAI,KAAK;AAEzC,QAAM,OAAO;AACb,QAAM,OAAO;AACb,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU,SAAS,aAAa;AAGtC,MAAI,IAAI,SAAS,OAAO;AACtB,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,IAAI,SAAS,KAAK,GAAG,SAAS,IAAI,WAAW,eAAe,QAAQ,MAAM;AAAA,QACtF,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,OAAO,SAAS,KAAK,QAAQ;AAEnC,QAAI;AACJ,QAAI;AAEJ,QAAI,CAAC,UAAU;AAEb,gBAAU,IAAI;AACd,iBAAW,IAAI,KAAK;AAAA,IACtB,OAAO;AAEL,iBAAW,IAAI,KAAK;AACpB,iBAAW,IAAI,IAAI,KAAK;AAAA,IAC1B;AAEA,UAAM,OAAO,QAAQ,OAAO,QAAQ;AACpC,UAAM,OAAO,QAAQ,OAAO,QAAQ;AAEpC,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK,UAAU,OAAO;AAC5B,UAAM,KAAK;AACX,UAAM,KAAK,OAAO;AAElB,UAAM,UAAU,KAAK;AACrB,UAAM,OAAO,UAAU,QAAQ,UAAU,QAAQ;AACjD,UAAM,SAAS,UAAU,QAAQ,UAAU,QAAQ;AACnD,UAAM,WAAW,UAAW,MAAM,KAAK,SAAS,MAAM,IAAI,YAAY,YAAa,QAAQ;AAG3F,UAAM,QAAQ,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;AACrE,aAAS,KAAK,EAAE,KAAK,OAAO,QAAQ,KAAK,EAAE,KAAK,CAAC,CAAC;AAGlD,aAAS;AAAA,MACP,EAAE;AAAA,QACA,KAAK;AAAA,QACL;AAAA,QACA,OAAO,QAAQ,IAAI,WAAW,eAAe;AAAA,QAC7C,WAAW;AAAA,QACX;AAAA,QACA,EAAE,QAAQ,UAAU,SAAS,UAAU,QAAQ,SAAS;AAAA,MAC1D;AAAA,IACF;AAGA,QAAI,KAAK,UAAU,QAAW;AAC5B,YAAM,SAAS,KAAK,IAAI,IAAI,EAAE,IAAI;AAClC,YAAM,UAAU,OAAO,KAAK,KAAK;AAEjC,eAAS;AAAA,QACP,EAAE;AAAA,UACA,KAAK,KAAK,IAAI,IAAI,EAAE,IAAI,CAAC,IAAI,OAAO,QAAQ,CAAC,MAAM,SAAS,CAAC,IAAI,OAAO,QAAQ,CAAC;AAAA,UACjF,QAAQ;AAAA,UACR;AAAA,UACA,EAAE,MAAM,MAAM;AAAA,QAChB;AAAA,MACF;AAEA,eAAS;AAAA,QACP,EAAE;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,QAAQ,IAAI,WAAW,gBAAgB;AAAA,UAC9C,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,EAAE,QAAQ,OAAO;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAkB;AAAA,IACtB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,SAAS,QAAQ,QAAQ;AAAA,IACvD,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,UAAU,IAAI,UAAU,KAAK;AACzD,QAAM,UAA8B,CAAC;AAErC,SAAO,EAAE,OAAO,QAAQ;AAC1B;;;AC1HO,IAAM,UAA0C;AAAA,EACrD,cAAc;AAAA,EACd,UAAU,OAAgC;AACxC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,QAAQ;AACV;;;ACRO,SAAS,UAAU,OAA6B;AACrD,QAAM,EAAE,UAAU,KAAK,IAAI,mBAAmB,KAAK;AACnD,QAAMC,SAAQ,KAAK,MAAM,OAAO;AAEhC,MAAI,QAAQ,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AAClE,MAAI;AACJ,QAAM,QAAoB,CAAC;AAE3B,aAAW,WAAWA,QAAO;AAC3B,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI,CAAC,WAAW,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,GAAG,GAAG;AACnE;AAAA,IACF;AAEA,QAAI,sBAAsB,KAAK,OAAO,GAAG;AACvC;AAAA,IACF;AAGA,UAAM,aAAa,QAAQ,MAAM,kDAAkD;AACnF,QAAI,YAAY;AACd,eAAS,WAAW,CAAC,KAAK,WAAW,CAAC,KAAK,WAAW,CAAC,KAAK,IAAI,KAAK;AACrE;AAAA,IACF;AAGA,UAAM,WAAW,QAAQ,MAAM,gDAAgD;AAC/E,QAAI,UAAU;AACZ,aAAO,SAAS,CAAC,KAAK,SAAS,CAAC,KAAK,SAAS,CAAC,KAAK,IAAI,KAAK;AAC7D;AAAA,IACF;AAGA,QAAI,WAAW,QAAQ,QAAQ,aAAa,EAAE,EAAE,QAAQ,SAAS,EAAE;AACnE,UAAM,UAAU,6BAA6B,KAAK,QAAQ;AAC1D,eAAW,SAAS,QAAQ,+BAA+B,EAAE,EAAE,KAAK;AAGpE,QAAI,QAAQ;AACZ,QAAI;AAEJ,UAAM,WAAW,SAAS,QAAQ,GAAG;AACrC,QAAI,WAAW,KAAK,CAAC,SAAS,WAAW,MAAM,GAAG;AAChD,cAAQ,SAAS,MAAM,GAAG,QAAQ,EAAE,KAAK;AACzC,aAAO,SAAS,MAAM,WAAW,CAAC,EAAE,KAAK;AAAA,IAC3C;AAEA,YAAQ,MAAM,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAC/C,QAAI,MAAM;AACR,aAAO,KAAK,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AAAA,IAC/C;AAEA,QAAI,OAAO;AACT,YAAM,KAAK;AAAA,QACT;AAAA,QACA,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,QACvB,GAAI,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,EAAE,GAAG,UAAU,MAAM;AAAA,IAC/B,GAAI,MAAM,EAAE,IAAI,IAAI,CAAC;AAAA,IACrB;AAAA,EACF;AACF;;;AC1DO,SAAS,WAAW,KAAmB,OAAoC;AAChF,QAAM,IAAI,IAAI,KAAK;AACnB,QAAM,EAAE,SAAS,WAAW,IAAI;AAChC,QAAM,WAA2B,CAAC;AAElC,QAAM,QAAQ,IAAI;AAClB,QAAM,IAAI,KAAK,IAAI,MAAM,QAAQ,CAAC;AAElC,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,SAAS,IAAI,SAAS,QAAQ,KAAK;AACzC,QAAM,KAAK,UAAU;AACrB,QAAM,KAAK,SAAS;AACpB,QAAM,SAAS;AAGf,MAAI,IAAI,SAAS,OAAO;AACtB,aAAS;AAAA,MACP,EAAE,KAAK,OAAO,IAAI,SAAS,KAAK,GAAG,IAAI,IAAI,WAAW,eAAe,QAAQ,MAAM;AAAA,QACjF,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,IAAI,KAAK;AACX,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,QAAQ,CAAC,KAAK,KAAK,IAAK,IAAI,KAAK,KAAK,IAAK;AACjD,YAAM,KAAK,KAAK,SAAS,KAAK,IAAI,KAAK;AACvC,YAAM,KAAK,KAAK,SAAS,KAAK,IAAI,KAAK;AACvC,eAAS,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,QAAQ,QAAQ,GAAG,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,IACzF;AAAA,EACF;AAGA,MAAI,IAAI,GAAG;AACT,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,WAAW,IAAI,KAAK;AAC1B,YAAM,KAAK,CAAC,KAAK,KAAK,IAAK,IAAI,KAAK,KAAK,IAAK;AAC9C,YAAM,KAAK,CAAC,KAAK,KAAK,IAAK,IAAI,KAAK,KAAK,UAAW;AAGpD,YAAM,WAAW,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM;AACpE,YAAM,OAAO,SAAS;AAEtB,YAAM,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,IAAI;AAC5C,YAAM,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,IAAI;AAC5C,YAAM,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,IAAI;AAC5C,YAAM,MAAM,KAAK,SAAS,KAAK,IAAI,KAAK,IAAI;AAC5C,YAAM,MAAM,KAAK,OAAO,KAAK,IAAI,QAAQ;AACzC,YAAM,MAAM,KAAK,OAAO,KAAK,IAAI,QAAQ;AAGzC,eAAS,KAAK,EAAE,KAAK,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,QAAQ,SAAS,GAAG,CAAC;AAG3F,YAAM,WAAW,MAAM;AACvB,YAAM,WAAW,MAAM;AACvB,YAAM,MAAM,KAAK,MAAM,UAAU,QAAQ,KAAK;AAC9C,YAAM,KAAK,WAAW;AACtB,YAAM,KAAK,WAAW;AACtB,YAAM,WAAW,MAAM,OAAO,aAAa;AAC3C,YAAM,SAAS,WAAW;AAE1B,YAAM,MAAM,MAAM,KAAK,WAAW,KAAK;AACvC,YAAM,MAAM,MAAM,KAAK,WAAW,KAAK;AACvC,YAAM,MAAM,MAAM,KAAK,WAAW,KAAK;AACvC,YAAM,MAAM,MAAM,KAAK,WAAW,KAAK;AAEvC,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,MAAM,QAAQ,SAAS,GAAG;AAAA,UAC9E,MAAM,QAAQ;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,IAAI,KAAK;AACX,UAAM,OAAO;AACb,UAAM,OAAO;AACb,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,KAAK,OAAO,GAAG,GAAG,KAAK,OAAO,GAAG,OAAO,MAAM,QAAQ,KAAK;AAAA,QAChE,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,EAAE,IAAI,GAAG;AAAA,MACX;AAAA,IACF;AACA,aAAS;AAAA,MACP,EAAE;AAAA,QACA,IAAI;AAAA,QACJ;AAAA,QACA,KAAK,WAAW,gBAAgB;AAAA,QAChC,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,EAAE,QAAQ,QAAQ,QAAQ,SAAS;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ;AACd,QAAM,QAAQ;AAEd,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,QAAQ,CAAC,KAAK,KAAK,IAAK,IAAI,KAAK,KAAK,IAAK;AACjD,UAAM,KAAK,KAAK,SAAS,KAAK,IAAI,KAAK;AACvC,UAAM,KAAK,KAAK,SAAS,KAAK,IAAI,KAAK;AAEvC,UAAM,UAAU,KAAK;AACrB,UAAM,OAAO,UAAU,QAAQ,UAAU,QAAQ;AACjD,UAAM,SAAS,UAAU,QAAQ,UAAU,QAAQ;AACnD,UAAM,WAAW,UAAW,MAAM,KAAK,SAAS,MAAM,IAAI,YAAY,YAAa,QAAQ;AAC3F,UAAM,WAAW,UACb,MAAM,KAAK,SAAS,MAAM,IACxB,YACA,2BACF,QAAQ;AAEZ,aAAS;AAAA,MACP,EAAE;AAAA,QACA,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAG,KAAK,QAAQ,GAAG,OAAO,OAAO,QAAQ,MAAM;AAAA,QACpE;AAAA,QACA;AAAA,QACA,UAAU,IAAI;AAAA,QACd,EAAE,IAAI,EAAE;AAAA,MACV;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,KAAK,IAAI;AACjC,UAAM,SAAS,UAAU,KAAK,IAAI,KAAK,WAAW,gBAAgB;AAElE,aAAS;AAAA,MACP,EAAE,KAAK,KAAK,OAAO,IAAI,QAAQ,WAAW,eAAe,UAAU;AAAA,QACjE,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,QAAI,WAAW,KAAK,MAAM;AACxB,eAAS;AAAA,QACP,EAAE,KAAK,KAAK,MAAM,IAAI,KAAK,IAAI,WAAW,gBAAgB,GAAG,UAAU;AAAA,UACrE,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAkB;AAAA,IACtB,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,SAAS,QAAQ,QAAQ;AAAA,IACvD,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF;AAEA,QAAM,QAAQ,cAAc,UAAU,IAAI,UAAU,KAAK;AACzD,QAAM,UAA8B,CAAC;AAErC,SAAO,EAAE,OAAO,QAAQ;AAC1B;;;ACxKO,IAAM,OAAoC;AAAA,EAC/C,cAAc;AAAA,EACd,UAAU,OAA6B;AACrC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EACA,QAAQ;AACV;;;ACXO,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACK3B,IAAM,2BAA2B;AAAA,EACtC,OAAO;AAAA,EACP,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,YAAY;AACd;AAEO,IAAM,sBAAsB,CAAC,WAAW,WAAW,WAAW,WAAW,SAAS;AAClF,IAAM,oBAAoB;AAAA,EAC/B,CAAC,GAAG,IAAI,GAAG;AAAA,EACX,CAAC,IAAI,IAAI,GAAG;AAAA,EACZ,CAAC,IAAI,IAAI,GAAG;AACd;AAQO,SAAS,uBAAuB,WAA+C;AACpF,SAAO,yBAAyB,SAAS;AAC3C;AAEO,SAAS,kBAAkB,WAA+C;AAC/E,SAAO,GAAG,UAAU,uBAAuB,SAAS,CAAC,CAAC;AACxD;AAQO,SAAS,sBAAsB,WAGpC;AACA,SAAO,EAAE,MAAM,GAAG,IAAI,CAAC,qBAAqB,SAAS,EAAE;AACzD;AAMO,SAAS,qBAAqB,YAAuD;AAC1F,SAAO,CAAC,GAAG,YAAY,CAAC;AAC1B;AAMO,SAAS,uBAAuB,aAAwD;AAC7F,SAAO,CAAC,aAAa,OAAO,UAAU,cAAc,CAAC,CAAC,GAAG,WAAW;AACtE;AAMO,SAAS,0BAA6D;AAC3E,SAAO,CAAC,GAAG,KAAK,CAAC;AACnB;AASO,SAAS,yBAAqD;AACnE,SAAO;AACT;AASO,SAAS,qBAAqB,WAAyD;AAC5F,SAAO,kBAAkB,SAAS;AACpC;AAUO,SAAS,oBACd,WAC+B;AAC/B,MAAI,cAAc,WAAY,QAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,EAAE,CAAC;AAC7D,MAAI,cAAc,SAAS;AACzB,WAAO;AAAA,MACL,EAAE,QAAQ,KAAK,SAAS,MAAM,OAAO,EAAE;AAAA,MACvC,EAAE,QAAQ,KAAK,SAAS,MAAM,OAAO,IAAI;AAAA,MACzC,EAAE,QAAQ,KAAK,SAAS,MAAM,OAAO,IAAI;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AAAA,IACL,EAAE,QAAQ,KAAK,SAAS,KAAK,OAAO,EAAE;AAAA,IACtC,EAAE,QAAQ,KAAK,SAAS,KAAK,OAAO,KAAK;AAAA,IACzC,EAAE,QAAQ,KAAK,SAAS,KAAK,OAAO,IAAI;AAAA,IACxC,EAAE,QAAQ,KAAK,SAAS,KAAK,OAAO,KAAK;AAAA,EAC3C;AACF;AAEO,SAAS,mBACd,WACA,OACQ;AACR,SAAO,CAAC,QAAQ,yBAAyB,SAAS;AACpD;AAwBO,SAAS,iBAAiB,MAAsB;AACrD,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,IAAI,SAAS,EAAG,QAAO;AAC3B,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,cAAU,KAAK,MAAM,IAAI,CAAC,EAAG,IAAI,IAAI,IAAI,CAAC,EAAG,GAAG,IAAI,CAAC,EAAG,IAAI,IAAI,IAAI,CAAC,EAAG,CAAC;AAAA,EAC3E;AACA,SAAO,KAAK,IAAI,GAAG,OAAO,UAAU,MAAM,CAAC,CAAC;AAC9C;AAEO,SAAS,WAAW,MAAuB;AAChD,QAAM,OAAO,CAAC,GAAG,KAAK,SAAS,iCAAiC,CAAC,EAAE,IAAI,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC;AAC1F,QAAM,MAAe,CAAC;AACtB,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK,QAAQ,KAAK,GAAG;AAC3C,UAAM,IAAI,KAAK,CAAC;AAChB,UAAM,IAAI,KAAK,IAAI,CAAC;AACpB,QAAI,OAAO,SAAS,CAAC,KAAK,OAAO,SAAS,CAAC,EAAG,KAAI,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,EACjE;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,WAA2B;AAC9D,SAAO,UACJ,KAAK,EACL,MAAM,QAAQ,EACd,IAAI,MAAM,EACV,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAChC,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC;AAClC;AAEO,SAAS,UAAU,OAAuB;AAC/C,SAAO,OAAO,SAAS,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ,GAAI,IAAI,GAAI,IAAI;AAC5E;;;ACrJO,SAAS,UAAU,OAAc,UAA4B,CAAC,GAAW;AAC9E,QAAM,EAAE,SAAS,YAAY,UAAU,KAAK,IAAI;AAChD,QAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,QAAQ,KAAK,IAAI,QAAQ,MAAM;AACvE,QAAM,gBAAgB,kBAAkB,QAAQ,CAAC,CAAC;AAClD,QAAM,YAAY,QAAQ,UAAU,cAAc,gBAAgB,QAAQ;AAE1E,QAAMC,SAAkB;AAAA,IACtB,oDAAoD,EAAE,YAAY,QAAQ,KAAK,aAAa,QAAQ,MAAM;AAAA,EAC5G;AAEA,MAAK,QAAQ,KAAK,SAAS,KAAM,WAAW;AAC1C,IAAAA,OAAM,KAAK,UAAU;AACrB,QAAI,UAAW,CAAAA,OAAM,KAAK,cAAc,UAAU,kBAAkB,CAAC,UAAU;AAC/E,eAAW,OAAO,QAAQ,CAAC,EAAG,CAAAA,OAAM,KAAK,OAAO,GAAG,EAAE;AACrD,IAAAA,OAAM,KAAK,WAAW;AAAA,EACxB;AAEA,MAAI,cAAc,QAAQ,eAAe,eAAe;AAEtD,IAAAA,OAAM;AAAA,MACJ,cAAc,QAAQ,CAAC,QAAQ,QAAQ,CAAC,YAAY,QAAQ,KAAK,aAAa,QAAQ,MAAM,WAAW,UAAU;AAAA,IACnH;AAAA,EACF;AAEA,aAAW,MAAM,UAAU;AACzB,IAAAA,OAAM,KAAK,cAAc,IAAI,GAAG,aAAa,CAAC;AAAA,EAChD;AAEA,EAAAA,OAAM,KAAK,QAAQ;AACnB,SAAOA,OAAM,KAAK,IAAI;AACxB;AAEA,SAAS,gBAAgB,UAA4C;AACnE,SAAO,SAAS,KAAK,aAAW,QAAQ,SAAS,UAC7C,gBAAgB,QAAQ,QAAQ,IAChC,QAAQ,SAAS,UAAU,QAAQ,WAAW,SAAS,eAAe,CAAC;AAC7E;AAIA,SAAS,cACP,IACA,OACA,eACQ;AACR,QAAM,MAAM,KAAK,OAAO,KAAK;AAE7B,UAAQ,GAAG,MAAM;AAAA,IACf,KAAK,QAAQ;AACX,YAAM,KAAK,GAAG,MAAM,OAAO,QAAQ,GAAG,EAAE,MAAM;AAC9C,YAAM,cAAc,GAAG,eAAe,OAAO,kBAAkB,GAAG,WAAW,MAAM;AACnF,YAAM,UAAU,GAAG,WAAW,OAAO,aAAa,GAAG,OAAO,MAAM;AAClE,aAAO,GAAG,GAAG,YAAY,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,OAAO,KAAK,aAAa,GAAG,OAAO,MAAM,WAAW,QAAQ,GAAG,IAAI,CAAC,IAAI,WAAW,YAAY,GAAG,MAAM,mBAAmB,GAAG,WAAW,IAAI,EAAE,GAAG,OAAO;AAAA,IACjO;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,UAAU,GAAG,WAAW,OAAO,aAAa,GAAG,OAAO,MAAM;AAClE,aAAO,GAAG,GAAG,eAAe,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,MAAM,WAAW,QAAQ,GAAG,IAAI,CAAC,aAAa,GAAG,MAAM,mBAAmB,GAAG,WAAW,IAAI,OAAO;AAAA,IAC3K;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,SAAS,GAAG,UAAU,OAAO,iBAAiB,GAAG,MAAM,MAAM;AACnE,YAAM,SAAS,GAAG,cAAc,OAAO,iBAAiB,GAAG,UAAU,MAAM;AAC3E,YAAM,UAAU,GAAG,WAAW,OAAO,aAAa,GAAG,OAAO,MAAM;AAClE,aAAO,GAAG,GAAG,YAAY,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,gBAAgB,GAAG,QAAQ,kBAAkB,WAAW,GAAG,UAAU,CAAC,WAAW,QAAQ,GAAG,IAAI,CAAC,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,IAAI,UAAU,GAAG,OAAO,CAAC;AAAA,IACpN;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,aAAa,GAAG,aAAa,SAAS,iBAAiB,GAAG,CAAC,IAAI;AACrE,YAAM,YAAY,cAAc,OAAO,GAAG,UAAU,IAAI,UAAU,KAAK,GAAG;AAC1E,YAAM,OAAO,aAAa,OAAO,sBAAsB,WAAW,SAAS,CAAC,MAAM;AAClF,YAAM,OAAO,GAAG,aAAa,OAAO,qBAAqB,WAAW,GAAG,SAAS,CAAC,OAAO;AACxF,YAAM,SACJ,GAAG,eAAe,OAAO,uBAAuB,WAAW,GAAG,WAAW,CAAC,OAAO;AACnF,YAAM,OAAO,UAAU,QAAQ,GAAG,IAAI,CAAC;AACvC,YAAM,UAAU,GAAG,WAAW,OAAO,aAAa,GAAG,OAAO,MAAM;AAClE,YAAM,SACJ,GAAG,aAAa,SAAS,QAAQ,eAAe,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG;AAC3E,YAAM,QAAQ,GAAG,GAAG,YAAY,WAAW,GAAG,CAAC,CAAC,aAAa,WAAW,MAAM,CAAC,mBAAmB,GAAG,WAAW,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO;AACzJ,UAAI,GAAG,aAAa,WAAW,GAAG,iBAAiB;AACjD,cAAM,SAAS,sBAAsB,GAAG,eAAe;AACvD,cAAM,UAAU,oDAAoD,OAAO,IAAI,SAAS,OAAO,EAAE,UAAU,kBAAkB,OAAO,CAAC;AACrI,eAAO,GAAG,KAAK;AAAA,EAAM,GAAG,KAAK,OAAO;AAAA,EAAK,GAAG;AAAA,MAC9C;AACA,UAAI,GAAG,aAAa,QAAQ;AAC1B,cAAM,SAAS,qBAAqB,cAAc,iBAAiB,GAAG,CAAC,CAAC;AACxE,cAAM,UAAU,sDAAsD,OAAO,KAAK,GAAG,CAAC,UAAU,kBAAkB,MAAM,CAAC;AACzH,eAAO,GAAG,KAAK;AAAA,EAAM,GAAG,KAAK,OAAO;AAAA,EAAK,GAAG;AAAA,MAC9C;AACA,UAAI,GAAG,aAAa,SAAS;AAC3B,cAAM,SAAS,uBAAuB,GAAG,WAAW,EAAE,IAAI,SAAS;AACnE,cAAM,UAAU,iDAAiD,OAAO,KAAK,GAAG,CAAC,UAAU,kBAAkB,OAAO,CAAC;AACrH,eAAO,GAAG,KAAK;AAAA,EAAM,GAAG,KAAK,OAAO;AAAA,EAAK,GAAG;AAAA,MAC9C;AACA,UAAI,GAAG,aAAa,QAAQ;AAC1B,cAAM,UAAU,mDAAmD,wBAAwB,EAAE,KAAK,GAAG,CAAC,UAAU,kBAAkB,MAAM,CAAC;AACzI,eAAO,GAAG,KAAK;AAAA,EAAM,GAAG,KAAK,OAAO;AAAA,EAAK,GAAG;AAAA,MAC9C;AACA,UAAI,GAAG,aAAa,cAAc;AAChC,cAAM,UAAU,2CAA2C,uBAAuB,EAAE,KAAK,GAAG,CAAC,UAAU,kBAAkB,YAAY,CAAC;AACtI,eAAO,GAAG,KAAK;AAAA,EAAM,GAAG,KAAK,OAAO;AAAA,EAAK,GAAG;AAAA,MAC9C;AACA,UAAI,GAAG,aAAa,QAAQ;AAC1B,cAAM,WAAW,mBAAmB,IAAI,GAAG;AAC3C,eAAO,GAAG,QAAQ;AAAA,EAAK,KAAK;AAAA,MAC9B;AACA,UAAI,GAAG,aAAa,YAAY;AAC9B,cAAM,OAAO,oBAAoB,UAAU,EAAE,CAAC;AAC9C,cAAM,aAAa;AAAA,UACjB,GAAG;AAAA,UACH,yBAAyB,IAAI,KAAK,QAAQ,aAAa;AAAA,QACzD;AACA,cAAM,SAAS,mBAAmB,YAAY,GAAG,QAAQ,MAAM,YAAY,GAAG;AAC9E,eAAO,GAAG,KAAK;AAAA,EAAQ,MAAM;AAAA,MAC/B;AACA,UAAI,GAAG,aAAa,SAAS;AAC3B,cAAM,QAAQ,oBAAoB,OAAO;AACzC,cAAM,aAAa;AAAA,UACjB,GAAG;AAAA,UACH,yBAAyB,IAAI,MAAM,CAAC,EAAG,QAAQ,aAAa;AAAA,QAC9D;AACA,cAAM,UAAU,MACb,IAAI,CAAC,SAAS,mBAAmB,YAAY,GAAG,QAAQ,MAAM,SAAS,GAAG,CAAC,EAC3E,KAAK,IAAI;AACZ,eAAO,GAAG,KAAK;AAAA,EAAQ,OAAO;AAAA,MAChC;AACA,UAAI,GAAG,aAAa,UAAU;AAC5B,cAAM,QAAQ,oBAAoB,QAAQ;AAC1C,cAAM,aAAa;AAAA,UACjB,GAAG;AAAA,UACH,yBAAyB,IAAI,MAAM,CAAC,EAAG,QAAQ,aAAa;AAAA,QAC9D;AACA,cAAM,UAAU,MACb,IAAI,CAAC,SAAS,mBAAmB,YAAY,GAAG,QAAQ,MAAM,UAAU,GAAG,CAAC,EAC5E,KAAK,IAAI;AACZ,eAAO,GAAG,KAAK;AAAA,EAAQ,OAAO;AAAA,MAChC;AACA,aAAO,GAAG,KAAK;AAAA,IACjB;AAAA,IAEA,KAAK,QAAQ;AACX,aAAO,WAAW,IAAI,KAAK;AAAA,IAC7B;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,KAAK,GAAG,MAAM,OAAO,QAAQ,WAAW,GAAG,EAAE,CAAC,MAAM;AAC1D,YAAM,YAAY,GAAG,aAAa,OAAO,eAAe,WAAW,GAAG,SAAS,CAAC,MAAM;AACtF,YAAM,UAAU,GAAG,WAAW,OAAO,aAAa,GAAG,OAAO,MAAM;AAClE,UAAI,GAAG,SAAS,WAAW,GAAG;AAC5B,eAAO,GAAG,GAAG,KAAK,EAAE,GAAG,SAAS,GAAG,OAAO;AAAA,MAC5C;AACA,YAAM,QAAQ,GAAG,SAAS,IAAI,CAAC,MAAM,cAAc,GAAG,QAAQ,GAAG,aAAa,CAAC,EAAE,KAAK,IAAI;AAC1F,aAAO,GAAG,GAAG,KAAK,EAAE,GAAG,SAAS,GAAG,OAAO;AAAA,EAAM,KAAK;AAAA,EAAK,GAAG;AAAA,IAC/D;AAAA,EACF;AACF;AASA,IAAI,kBAAkB;AAGtB,SAAS,WAAW,IAAe,OAAuB;AACxD,QAAM,MAAM,KAAK,OAAO,KAAK;AAC7B,QAAM,EAAE,MAAM,GAAG,GAAG,KAAK,IAAI;AAC7B,QAAM,EAAE,SAAS,YAAY,UAAU,IAAI;AAE3C,QAAM,MAAM,QAAQ;AACpB,QAAM,MAAM,QAAQ;AACpB,QAAM,MAAM,QAAQ;AACpB,QAAM,MAAM,QAAQ;AAGpB,QAAM,QAAQ,KAAK,IAAI,OAAO,KAAK,OAAO,GAAG;AAC7C,QAAM,UAAU,UAAU,MAAM,KAAK;AACrC,QAAM,UAAU,UAAU,MAAM,KAAK;AACrC,QAAM,OAAO,UAAU,KAAK,OAAO,MAAM,SAAS,CAAC;AACnD,QAAM,OAAO,UAAU,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnD,QAAM,YACJ,cAAc,gBAAgB,GAAG,QAAQ,iBAAiB,WAAW,GAAG,KAAK,CAAC,MAAM;AACtF,QAAM,cAAc,GAAG,WAAW,OAAO,aAAa,GAAG,OAAO,MAAM;AAGtE,QAAM,OACJ,cAAc,UAAU,iBAAiB,KAAK,MAAM,MAAM,iBAAiB,EAAE,IAAI,KAAK;AAGxF,QAAM,KAAK,MAAM,MAAM;AACvB,QAAM,KAAK,MAAM,MAAM;AACvB,QAAM,iBAAiB,mBAAmB,YAAY,IAAI,EAAE;AAE5D,QAAM,SAAS,GAAG,GAAG,IAAI,GAAG,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,CAAC;AAChE,QAAM,QAAQ,iBACV,GAAG,GAAG,mBAAmB,cAAc,KAAK,IAAI,SAChD,GAAG,GAAG,KAAK,IAAI;AAEnB,SAAO;AAAA,IACL,GAAG,GAAG,WAAW,IAAI,QAAQ,IAAI,YAAY,OAAO,aAAa,OAAO,cAAc,MAAM,IAAI,SAAS,GAAG,WAAW;AAAA,IACvH;AAAA,IACA,GAAG,GAAG;AAAA,EACR,EAAE,KAAK,IAAI;AACb;AAWA,SAAS,mBAAmB,GAAmB,IAAY,IAA2B;AACpF,MAAI,EAAE,WAAW,KAAK,CAAC,EAAE,SAAS,CAAC,EAAE,MAAO,QAAO;AAEnD,QAAM,MAAM,EAAE,SAAS;AACvB,QAAM,KAAK,EAAE,QAAQ,KAAK;AAC1B,QAAM,KAAK,EAAE,QAAQ,KAAK;AAC1B,QAAM,MAAM,UAAU,EAAE;AACxB,QAAM,MAAM,UAAU,EAAE;AAExB,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,aAAa,GAAG,IAAI,GAAG,GAAG;AACrC,MAAI,EAAE,SAAS,EAAE,MAAO,OAAM,KAAK,SAAS,EAAE,IAAI,EAAE,GAAG;AACvD,MAAI,EAAE,WAAW,EAAG,OAAM,KAAK,UAAU,GAAG,GAAG;AAC/C,QAAM,KAAK,aAAa,UAAU,CAAC,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,GAAG;AAE3D,SAAO,MAAM,KAAK,GAAG;AACvB;AAUA,SAAS,iBAAiB,MAAc,QAAwB;AAC9D,QAAM,OAAO;AACb,QAAM,MAAM,oBAAI,IAAY;AAC5B,MAAI;AAEJ,UAAQ,IAAI,KAAK,KAAK,IAAI,OAAO,MAAM;AACrC,QAAI,IAAI,EAAE,CAAC,CAAE;AAAA,EACf;AACA,MAAI,IAAI,SAAS,EAAG,QAAO;AAE3B,MAAI,SAAS;AACb,aAAW,MAAM,KAAK;AACpB,UAAM,QAAQ,GAAG,MAAM,IAAI,EAAE;AAE7B,aAAS,OAAO,MAAM,OAAO,EAAE,GAAG,EAAE,KAAK,OAAO,KAAK,GAAG;AAExD,aAAS,OAAO,MAAM,QAAQ,EAAE,GAAG,EAAE,KAAK,QAAQ,KAAK,GAAG;AAE1D,aAAS,OAAO,MAAM,UAAU,EAAE,GAAG,EAAE,KAAK,UAAU,KAAK,GAAG;AAC9D,aAAS,OAAO,MAAM,UAAU,EAAE,GAAG,EAAE,KAAK,UAAU,KAAK,GAAG;AAAA,EAChE;AACA,SAAO;AACT;AAIA,SAAS,mBACP,MACA,MACA,MACA,WACA,KACQ;AACR,QAAM,cAAc,KAAK,WAAW,OAAO,aAAa,KAAK,OAAO,MAAM;AAC1E,QAAM,eAAe,mBAAmB,WAAW,KAAK,KAAK;AAC7D,QAAM,QAAQ,iBAAiB,IAAI,OAAO,GAAG,UAAU,YAAY,CAAC;AACpE,SAAO,GAAG,GAAG,cAAc,KAAK,MAAM,WAAW,WAAW,IAAI,CAAC,IAAI,WAAW;AAAA,EAAM,GAAG,yBAAyB,kBAAkB,SAAS,CAAC,YAAY,KAAK,kDAAkD,WAAW,IAAI,CAAC;AAAA,EAAQ,GAAG;AAC9O;AAOA,IAAM,uBAAuB;AAC7B,IAAM,4BAA4B;AAElC,SAAS,2BAA2B,MAAc,WAA2B;AAC3E,MAAI,aAAa,EAAG,QAAO;AAC3B,QAAM,MAAM,WAAW,IAAI;AAC3B,MAAI,IAAI,SAAS,EAAG,QAAO;AAE3B,QAAM,MAAM,IAAI,IAAI,SAAS,CAAC;AAC9B,WAAS,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,IAAI,IAAI,IAAI,CAAC;AACnB,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;AACjD,UAAM,QAAQ,KAAK,MAAM,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;AACjD,QAAI,SAAS,aAAa,SAAS,WAAW;AAC5C,YAAM,KAAK,EAAE,IAAI,EAAE;AACnB,YAAM,KAAK,EAAE,IAAI,EAAE;AACnB,YAAM,KAAK,EAAE,IAAI,IAAI;AACrB,YAAM,KAAK,EAAE,IAAI,IAAI;AACrB,YAAM,KAAK,KAAK,KAAK,KAAK;AAC1B,YAAM,KAAK,KAAK,KAAK,KAAK,KAAK;AAC/B,YAAM,KAAK,KAAK,KAAK,KAAK,KAAK,YAAY;AAC3C,YAAM,eAAe,KAAK,KAAK,IAAI,KAAK;AACxC,UAAI,KAAK,KAAK,gBAAgB,GAAG;AAC/B,cAAM,QAAQ;AAAA,WACX,CAAC,KAAK,KAAK,KAAK,YAAY,MAAM,IAAI;AAAA,WACtC,CAAC,KAAK,KAAK,KAAK,YAAY,MAAM,IAAI;AAAA,QACzC,EAAE,OAAO,CAACC,OAAMA,MAAK,KAAKA,MAAK,CAAC;AAChC,cAAM,IAAI,MAAM,KAAK,CAAC,MAAM,UAAU,QAAQ,IAAI,EAAE,CAAC;AACrD,YAAI,KAAK,MAAM;AACb,iBAAO,CAAC,GAAG,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,EAAE,IAAI,KAAK,EAAE,CAAC,EACjE,IAAI,CAAC,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,IAAI,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,EAAE,EAC7E,KAAK,GAAG;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc;AAClB,QAAM,iBAA2B,CAAC;AAClC,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,IAAI,IAAI,IAAI,CAAC;AACnB,UAAM,IAAI,IAAI,CAAC;AACf,UAAM,gBAAgB,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACrD,mBAAe,KAAK,aAAa;AACjC,mBAAe;AAAA,EACjB;AACA,MAAI,gBAAgB,EAAG,QAAO;AAE9B,QAAM,eACJ,cAAc,4BACV,KAAK,IAAI,2BAA2B,cAAc,SAAS,IAC3D,cAAc;AACpB,MAAI,SAAS;AACb,QAAM,YAAY,CAAC,IAAI,CAAC,CAAE;AAC1B,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,gBAAgB,eAAe,IAAI,CAAC;AAC1C,QAAI,kBAAkB,EAAG;AACzB,UAAM,IAAI,IAAI,IAAI,CAAC;AACnB,UAAM,IAAI,IAAI,CAAC;AACf,QAAI,SAAS,iBAAiB,cAAc;AAC1C,YAAM,KAAK,eAAe,UAAU;AACpC,gBAAU,KAAK;AAAA,QACb,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAAA,QACvB,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK;AAAA,MACzB,CAAC;AACD;AAAA,IACF;AACA,cAAU,KAAK,CAAC;AAChB,cAAU;AAAA,EACZ;AACA,SAAO,UACJ,IAAI,CAAC,IAAI,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,IAAI,UAAU,GAAG,CAAC,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC,EAAE,EAC7E,KAAK,GAAG;AACb;AAEA,SAAS,yBACP,IACA,WACA,eACQ;AACR,MAAI,GAAG,aAAa,KAAM,QAAO;AACjC,QAAM,SAAS,cAAc,IAAI,GAAG,SAAS,KAAK;AAAA,IAChD,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACA,QAAM,mBACJ,OAAO,gBAAgB,gBAAgB,OAAO,OAAO,GAAG,cAAc,OAAO;AAC/E,SAAO,mBAAmB;AAC5B;AAEA,SAAS,kBAAkB,MAAqD;AAC9E,QAAM,UAAU,oBAAI,IAA2B;AAC/C,aAAW,OAAO,MAAM;AACtB,eAAW,SAAS,IAAI,SAAS,kBAAkB,GAAG;AACpD,YAAM,SAAS,MAAM,CAAC;AACtB,YAAM,KAAK,UAAU,QAAQ,IAAI;AACjC,YAAM,OAAO,WAAW,QAAQ,MAAM;AACtC,UAAI,MAAM,QAAQ,QAAQ,KAAM;AAChC,YAAM,cACJ,UAAU,QAAQ,aAAa,MAAM,mBAAmB,mBAAmB;AAC7E,cAAQ,IAAI,IAAI,EAAE,MAAM,YAAY,CAAC;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,MAAc,MAAkC;AACjE,SACE,KAAK,MAAM,IAAI,OAAO,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAC1D,KAAK,MAAM,IAAI,OAAO,MAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC;AAE9D;AAEA,SAAS,WAAW,MAAc,MAAkC;AAClE,QAAM,QAAQ,UAAU,MAAM,IAAI;AAClC,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,IAAI,OAAO,WAAW,KAAK;AACjC,SAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAClC;AAEA,SAAS,mBAAmB,IAA6C,KAAqB;AAC5F,QAAM,KAAK,eAAe,GAAG,GAAG,GAAG,MAAM;AACzC,QAAM,EAAE,OAAO,IAAI,IAAI,cAAc,GAAG,CAAC;AACzC,QAAM,OAAO,WAAW,GAAG,MAAM;AACjC,SAAO;AAAA,IACL,GAAG,GAAG;AAAA,IACN,GAAG,GAAG,yBAAyB,EAAE,wCAAwC,MAAM,CAAC,SAAS,MAAM,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC;AAAA,IAC5H,GAAG,GAAG,qCAAqC,IAAI;AAAA,IAC/C,GAAG,GAAG,sCAAsC,IAAI;AAAA,IAChD,GAAG,GAAG,iDAAiD,qBAAqB,CAAC,EAC1E,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAClB,KAAK,GAAG,CAAC,UAAU,kBAAkB,MAAM,CAAC;AAAA,IAC/C,GAAG,GAAG;AAAA,IACN,GAAG,GAAG;AAAA,IACN,GAAG,GAAG,iDAAiD,qBAAqB,CAAC,EAC1E,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAClB,KAAK,GAAG,CAAC,UAAU,kBAAkB,MAAM,CAAC;AAAA,IAC/C,GAAG,GAAG;AAAA,IACN,GAAG,GAAG,sCAAsC,IAAI;AAAA,IAChD,GAAG,GAAG,iDAAiD,qBAAqB,CAAC,EAC1E,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,EAClB,KAAK,GAAG,CAAC,UAAU,kBAAkB,MAAM,CAAC;AAAA,IAC/C,GAAG,GAAG;AAAA,IACN,GAAG,GAAG,uCAAuC,IAAI;AAAA,IACjD,GAAG,GAAG;AAAA,IACN,GAAG,GAAG;AAAA,EACR,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,eAAe,MAAc,QAAwB;AAC5D,SAAO,eAAe,WAAW,GAAG,IAAI,IAAI,MAAM,EAAE,CAAC;AACvD;AAEA,SAAS,cAAc,MAGrB;AACA,QAAM,MAAM,WAAW,IAAI;AAC3B,QAAM,QAAQ,IAAI,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE;AACrC,QAAM,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE;AAChD,MAAI,MAAM,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI,GAAG;AAC1C,WAAO,EAAE,OAAO,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,EAAE,EAAE;AAAA,EAClD;AACA,SAAO,EAAE,OAAO,IAAI;AACtB;AAEA,SAAS,WAAW,OAAuB;AACzC,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,YAAQ,MAAM,WAAW,CAAC;AAC1B,WAAO,KAAK,KAAK,MAAM,QAAU;AAAA,EACnC;AACA,UAAQ,SAAS,GAAG,SAAS,EAAE;AACjC;AAEA,SAAS,QAAQ,MAAyC;AACxD,SAAO,QAAQ,QAAQ,KAAK,KAAK,MAAM,KAAK,OAAO;AACrD;AAEA,SAAS,UAAU,MAAsB;AACvC,SAAO,KAAK,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM;AAC/E;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACzB;AA0CO,IAAM,cAAgC;AAAA,EAC3C,MAAM;AAAA,EACN,QAAQ;AACV;;;AC9hBO,SAAS,mBAAmB,MAAuB;AACxD,SAAQ,iBAAuC,SAAS,IAAI;AAC9D;AAIA,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,eAAe,oBAAI,IAAI;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,eAAe,oBAAI,IAAI,CAAC,QAAQ,eAAe,WAAW,eAAe,CAAC;AAEhF,IAAM,aAAa,oBAAI,IAAI,CAAC,eAAe,aAAa,iBAAiB,cAAc,CAAC;AAExF,IAAM,aAAa,oBAAI,IAAI,CAAC,cAAc,iBAAiB,aAAa,CAAC;AAIzE,IAAM,YAAY;AAClB,IAAM,OAAO;AACb,IAAM,gBAAgB;AAEtB,SAAS,cAAc,GAA0C;AAC/D,SAAO,MAAM,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,KAAK,SAAgC;AAC5C,SAAO,IAAI,0BAA0B,OAAO;AAC9C;AAIA,SAAS,gBACP,KAC+D;AAC/D,MAAI,CAAC,cAAc,GAAG,EAAG,QAAO,KAAK,kCAAkC;AAEvE,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,aAAa,IAAI,GAAG,EAAG,QAAO,KAAK,4BAA4B,GAAG,GAAG;AAAA,EAC5E;AAEA,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAM,MAAM,IAAI,GAAG;AACnB,QAAI,OAAO,QAAQ,YAAY,CAAC,UAAU,KAAK,GAAG,GAAG;AACnD,aAAO;AAAA,QACL,WAAW,GAAG,4DAA4D,KAAK,UAAU,GAAG,CAAC;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,GAA4D;AACxE;AAEA,SAAS,mBACP,KACkE;AAClE,MAAI,CAAC,cAAc,GAAG,EAAG,QAAO,KAAK,qCAAqC;AAE1E,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,gBAAgB,IAAI,GAAG,EAAG,QAAO,KAAK,+BAA+B,GAAG,GAAG;AAAA,EAClF;AAEA,QAAM,eAAe,CAAC,cAAc,YAAY;AAChD,aAAW,OAAO,cAAc;AAC9B,QAAI,OAAO,KAAK;AACd,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,OAAO,QAAQ,SAAU,QAAO,KAAK,cAAc,GAAG,mBAAmB;AAC7E,UAAI,cAAc,KAAK,GAAG;AACxB,eAAO,KAAK,cAAc,GAAG,qCAAqC;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,iBAAiB,CAAC,gBAAgB,iBAAiB,iBAAiB,YAAY;AACtF,aAAW,OAAO,gBAAgB;AAChC,QAAI,OAAO,KAAK;AACd,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,OAAO,QAAQ,YAAY,OAAO,GAAG;AACvC,eAAO,KAAK,cAAc,GAAG,mCAAmC,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MACvF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,GAA+D;AAC3E;AAEA,SAAS,gBACP,KAC+D;AAC/D,MAAI,CAAC,cAAc,GAAG,EAAG,QAAO,KAAK,kCAAkC;AAEvE,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,aAAa,IAAI,GAAG,EAAG,QAAO,KAAK,4BAA4B,GAAG,GAAG;AAAA,EAC5E;AAEA,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,UAAM,MAAM,IAAI,GAAG;AACnB,QAAI,OAAO,QAAQ,YAAY,MAAM,GAAG;AACtC,aAAO,KAAK,WAAW,GAAG,uCAAuC,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,IACxF;AAAA,EACF;AAEA,SAAO,GAAG,GAA4D;AACxE;AAEA,SAAS,cAAc,KAA2E;AAChG,MAAI,CAAC,cAAc,GAAG,EAAG,QAAO,KAAK,gCAAgC;AAErE,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,WAAW,IAAI,GAAG,EAAG,QAAO,KAAK,0BAA0B,GAAG,GAAG;AAAA,EACxE;AAEA,QAAM,oBAAoB,CAAC,eAAe,aAAa,eAAe;AACtE,aAAW,OAAO,mBAAmB;AACnC,QAAI,OAAO,KAAK;AACd,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,OAAO,QAAQ,YAAY,MAAM,GAAG;AACtC,eAAO,KAAK,SAAS,GAAG,uCAAuC,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,KAAK;AACzB,UAAM,MAAM,IAAI,cAAc;AAC9B,QAAI,OAAO,QAAQ,YAAY,MAAM,KAAK,MAAM,GAAG;AACjD,aAAO;AAAA,QACL,4DAA4D,KAAK,UAAU,GAAG,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,GAA0D;AACtE;AAEA,SAAS,cAAc,KAA2E;AAChG,MAAI,CAAC,cAAc,GAAG,EAAG,QAAO,KAAK,gCAAgC;AAErE,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,WAAW,IAAI,GAAG,EAAG,QAAO,KAAK,0BAA0B,GAAG,GAAG;AAAA,EACxE;AAEA,MAAI,gBAAgB,KAAK;AACvB,UAAM,MAAM,IAAI,YAAY;AAC5B,QAAI,QAAQ,UAAU,QAAQ,YAAY,QAAQ,SAAS;AACzD,aAAO;AAAA,QACL,8DAA8D,KAAK,UAAU,GAAG,CAAC;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,mBAAmB,KAAK;AAC1B,UAAM,MAAM,IAAI,eAAe;AAC/B,QAAI,QAAQ,YAAY,QAAQ,eAAe,QAAQ,SAAS;AAC9D,aAAO;AAAA,QACL,sEAAsE,KAAK,UAAU,GAAG,CAAC;AAAA,MAC3F;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB,KAAK;AACxB,UAAM,MAAM,IAAI,aAAa;AAC7B,QAAI,QAAQ,UAAU,QAAQ,SAAS,QAAQ,QAAQ;AACrD,aAAO,KAAK,2DAA2D,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,IAC9F;AAAA,EACF;AAEA,SAAO,GAAG,GAA0D;AACtE;AAUO,SAAS,mBAAmB,MAAmC;AACpE,MAAI,CAAC,cAAc,IAAI,GAAG;AACxB,WAAO;AAAA,MACL,mDAAmD,SAAS,OAAO,SAAS,MAAM,QAAQ,IAAI,IAAI,UAAU,OAAO,IAAI;AAAA,IACzH;AAAA,EACF;AAGA,aAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,QAAI,CAAC,eAAe,IAAI,GAAG,EAAG,QAAO,KAAK,2BAA2B,GAAG,GAAG;AAAA,EAC7E;AAEA,QAAM,SAAkC,CAAC;AAGzC,MAAI,UAAU,MAAM;AAClB,UAAM,IAAI,KAAK,MAAM;AACrB,QAAI,OAAO,MAAM,SAAU,QAAO,KAAK,gCAAgC,KAAK,UAAU,CAAC,CAAC,EAAE;AAC1F,QAAI,EAAE,SAAS,KAAK,EAAE,SAAS;AAC7B,aAAO,KAAK,mDAA8C,EAAE,MAAM,EAAE;AACtE,QAAI,CAAC,KAAK,KAAK,CAAC,EAAG,QAAO,KAAK,uCAAuC,KAAK,UAAU,CAAC,CAAC,EAAE;AACzF,WAAO,MAAM,IAAI;AAAA,EACnB;AAGA,MAAI,UAAU,MAAM;AAClB,UAAM,IAAI,KAAK,MAAM;AACrB,QAAI,OAAO,MAAM,SAAU,QAAO,KAAK,gCAAgC,KAAK,UAAU,CAAC,CAAC,EAAE;AAC1F,QAAI,CAAC,mBAAmB,CAAC;AACvB,aAAO,KAAK,2CAA2C,CAAC,qBAAqB;AAC/E,WAAO,MAAM,IAAI;AAAA,EACnB;AAGA,MAAI,aAAa,MAAM;AACrB,UAAM,IAAI,gBAAgB,KAAK,SAAS,CAAC;AACzC,QAAI,CAAC,EAAE,GAAI,QAAO;AAClB,WAAO,SAAS,IAAI,EAAE;AAAA,EACxB;AAGA,MAAI,gBAAgB,MAAM;AACxB,UAAM,IAAI,mBAAmB,KAAK,YAAY,CAAC;AAC/C,QAAI,CAAC,EAAE,GAAI,QAAO;AAClB,WAAO,YAAY,IAAI,EAAE;AAAA,EAC3B;AAGA,MAAI,aAAa,MAAM;AACrB,UAAM,IAAI,gBAAgB,KAAK,SAAS,CAAC;AACzC,QAAI,CAAC,EAAE,GAAI,QAAO;AAClB,WAAO,SAAS,IAAI,EAAE;AAAA,EACxB;AAGA,MAAI,WAAW,MAAM;AACnB,UAAM,IAAI,cAAc,KAAK,OAAO,CAAC;AACrC,QAAI,CAAC,EAAE,GAAI,QAAO;AAClB,WAAO,OAAO,IAAI,EAAE;AAAA,EACtB;AAGA,MAAI,WAAW,MAAM;AACnB,UAAM,IAAI,cAAc,KAAK,OAAO,CAAC;AACrC,QAAI,CAAC,EAAE,GAAI,QAAO;AAClB,WAAO,OAAO,IAAI,EAAE;AAAA,EACtB;AAEA,SAAO,GAAG,MAAoB;AAChC;;;AC5MA,gBAAgB,aAAa,SAAS;AACtC,gBAAgB,YAAY,QAAQ;AACpC,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,OAAO,GAAG;AAC1B,gBAAgB,WAAW,OAAO;AAClC,gBAAgB,YAAY,QAAQ;AACpC,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,WAAW,OAAO;AAClC,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,YAAY,QAAQ;AACpC,gBAAgB,SAAS,YAAY;AACrC,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,MAAM,EAAE;AACxB,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,eAAe,WAAW;AAC1C,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,WAAW,OAAO;AAClC,gBAAgB,YAAY,QAAQ;AACpC,gBAAgB,MAAM,EAAE;AACxB,gBAAgB,gBAAgB,YAAY;AAC5C,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,QAAQ,IAAI;AAC5B,gBAAgB,QAAQ,IAAI;AAC5B,gBAAgB,OAAO,GAAG;AAC1B,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,aAAa,SAAS;AACtC,gBAAgB,UAAU,SAAS;AACnC,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,WAAW,OAAO;AAClC,gBAAgB,QAAQ,IAAI;AAC5B,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,cAAc,UAAU;AACxC,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,QAAQ,IAAI;AAC5B,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,WAAW,OAAO;AAClC,gBAAgB,UAAU,MAAM;AAChC,gBAAgB,QAAQ,IAAI;AAC5B,gBAAgB,aAAa,KAAK;AAClC,gBAAgB,aAAa,SAAS;AACtC,gBAAgB,YAAY,QAAQ;AACpC,gBAAgB,QAAQ,IAAI;AAC5B,gBAAgB,YAAY,QAAQ;AACpC,gBAAgB,WAAW,OAAO;AAClC,gBAAgB,QAAQ,IAAI;AAC5B,gBAAgB,cAAc,UAAU;AACxC,gBAAgB,WAAW,OAAO;AAClC,gBAAgB,gBAAgB,YAAY;AAC5C,gBAAgB,YAAY,QAAQ;AACpC,gBAAgB,SAAS,KAAK;AAC9B,gBAAgB,WAAW,OAAO;AAClC,gBAAgB,aAAa,OAAO;AACpC,iBAAiB,WAAW;AAC5B,eAAe,YAAY,cAAc;AACzC,eAAe,cAAc,gBAAgB;AAC7C,eAAe,UAAU,YAAY;AACrC,eAAe,YAAY,cAAc;AAgBlC,SAAS,YACd,OACA,YACA,iBACA,OACsB;AACtB,QAAM,WAAW,qBAAqB,OAAO,YAAY,iBAAiB,KAAK;AAC/E,SAAO,SAAS,KAAK,GAAG,SAAS,MAAM,MAAM,IAAI;AACnD;AAEA,SAAS,qBACP,OACA,YACA,iBACA,OAC4F;AAC5F,QAAM,UAAU,cAAc,KAAK;AACnC,QAAM,EAAE,UAAU,QAAQ,MAAM,OAAO,IAAI,mBAAmB,OAAO;AACrE,QAAM,EAAE,QAAQ,YAAY,IAAI,OAAO,OAAO;AAE9C,QAAMC,UAAS,UAAU,WAAW;AACpC,MAAI,CAACA,SAAQ;AACX,WAAO,IAAI,mBAAmB,0CAA0C,WAAW,EAAE;AAAA,EACvF;AAEA,MAAI;AACF,QAAI;AACJ,QAAI,WAAW,QAAQ;AACrB,WAAKA,QAAO,UAAU,OAAO;AAAA,IAC/B,OAAO;AACL,UAAI;AACF,aAAKA,QAAO,aAAa,OAAO;AAAA,MAClC,SAAS,UAAU;AAEjB,YAAI,OAAO,KAAK,MAAM,EAAE,SAAS,GAAG;AAClC,eAAKA,QAAO,aAAa,MAAM;AAAA,QACjC,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,EAAE,GAAG,QAAQ,GAAI,GAAG,YAAY,CAAC,EAAG;AAC3D,SAAK,EAAE,GAAG,IAAI,UAAU,eAAe;AAGvC,UAAM,YAAY,OAAO,eAAe,UAAU,WAAW,eAAe,QAAQ;AACpF,UAAM,OAAO,aAAa,cAAc,CAAC,GAAG,eAAe,mBAAmB,SAAS,CAAC;AACxF,UAAM,qBAAqBA,QAAO,uBAC9B,aAAaA,QAAO,sBAAsB,IAAI,IAC9C;AACJ,UAAM,aAAa,GAAG,gBAClB,aAAa,GAAG,eAAe,kBAAkB,IACjD;AAEJ,UAAM,gBAA2C,UAAU,SAAY,EAAE,MAAM,IAAI;AACnF,UAAM,SAASA,QAAO,OAAO,IAAI,YAAY,aAAa;AAC1D,WAAO,GAAG,EAAE,QAAQ,QAAQ,OAAO,WAAW,CAAC;AAAA,EACjD,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO,IAAI,eAAe,SAAS,KAAK;AAAA,EAC1C;AACF;AASO,SAAS,WACd,OACA,YACA,eAAe,OACf,iBACA,OACgB;AAChB,QAAM,gBAAgB,YAAY,OAAO,YAAY,iBAAiB,KAAK;AAC3E,MAAI,CAAC,cAAc,GAAI,QAAO;AAE9B,QAAM,WAAW,YAAoB,YAAY;AACjD,MAAI,CAAC,UAAU;AACb,WAAO,IAAI,oBAAoB,2BAA2B,YAAY,EAAE;AAAA,EAC1E;AAEA,MAAI;AACF,WAAO,GAAG,SAAS,OAAO,cAAc,MAAM,KAAK,CAAC;AAAA,EACtD,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO,IAAI,gBAAgB,SAAS,KAAK;AAAA,EAC3C;AACF;;;AC7OA,oBAAwB;AACxB,2BAAqB;AAQd,SAAS,QAAQ,KAAgD;AACtE,QAAM,IAAI,qBAAqB,KAAK,GAAG;AACvC,QAAMC,KAAI,sBAAsB,KAAK,GAAG;AACxC,MAAI,KAAKA,GAAG,QAAO,EAAE,OAAO,OAAO,EAAE,CAAC,CAAC,GAAG,QAAQ,OAAOA,GAAE,CAAC,CAAC,EAAE;AAE/D,QAAM,KAAK,wBAAwB,KAAK,GAAG;AAC3C,MAAI,IAAI;AACN,UAAM,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,QAAQ,EAAE,IAAI,MAAM;AACrD,QAAI,MAAM,WAAW,EAAG,QAAO,EAAE,OAAO,MAAM,CAAC,GAAG,QAAQ,MAAM,CAAC,EAAE;AAAA,EACrE;AAEA,SAAO,EAAE,OAAO,KAAK,QAAQ,IAAI;AACnC;AASO,SAAS,SAAS,KAAaC,QAAmB,CAAC,GAAoB;AAC5E,QAAM,QAAQA,MAAK,SAAS;AAC5B,QAAM,EAAE,OAAO,OAAO,IAAI,QAAQ,GAAG;AACrC,QAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,KAAK;AACvC,QAAM,QAAQ,KAAK,IAAI,GAAG,SAAS,KAAK;AAExC,SAAO,IAAI,QAAgB,CAAC,gBAAgB,WAAW;AACrD,QAAI;AACF,YAAM,MAAM,IAAI,cAAAC,QAAY;AAAA,QAC1B,MAAM,CAAC,OAAO,KAAK;AAAA,QACnB,QAAQ;AAAA;AAAA,QAER,UAAU;AAAA,MACZ,CAAC;AAED,YAAM,SAAmB,CAAC;AAC1B,UAAI,GAAG,QAAQ,CAAC,MAAc,OAAO,KAAK,CAAC,CAAC;AAC5C,UAAI,GAAG,OAAO,MAAM,eAAe,OAAO,OAAO,MAAM,CAAC,CAAC;AACzD,UAAI,GAAG,SAAS,MAAM;AAEtB,+BAAAC,SAAS,KAAK,KAAK,GAAG,GAAG;AAAA,QACvB,OAAO;AAAA,QACP,QAAQ;AAAA;AAAA,QAER,UAAU;AAAA;AAAA,QAEV,QAAQ;AAAA,MACV,CAAC;AAED,UAAI,IAAI;AAAA,IACV,SAAS,OAAO;AACd,aAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,IAClE;AAAA,EACF,CAAC;AACH;;;ACpEA,IAAAC,oBAAwB;;;ACJxB,qBAAgE;AAChE,uBAAwC;AAkBxC,IAAM,eAAe;AACrB,IAAMC,QAAO;AAGb,SAAS,uBAAuB,UAA0B;AACxD,aAAO,2BAAS,UAAU,YAAY;AACxC;AAUO,SAAS,cAAc,UAAyC;AAErE,MAAI;AACJ,MAAI;AACF,cAAM,6BAAa,UAAU,MAAM;AAAA,EACrC,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,2BAA2B,QAAQ,MAAM,OAAO,KAAK,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,+BAA+B,QAAQ,MAAM,OAAO,KAAK,CAAC;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAY,mBAAmB,MAAM;AAC3C,MAAI,CAAC,UAAU,IAAI;AACjB,WAAO;AAAA,MACL;AAAA,MACA,eAAe,QAAQ,wBAAwB,UAAU,MAAM,OAAO;AAAA,MACtE,UAAU;AAAA,IACZ;AAAA,EACF;AAGA,QAAM,QAAQ,UAAU;AACxB,QAAM,WAAa,OAAmC,MAAM,KAA4B;AACxF,QAAM,OAAO,eAAe,QAAQ;AACpC,QAAM,WAAW,aAAa,OAAO,IAAI;AAEzC,SAAO,GAAG,QAAQ;AACpB;AAeO,SAAS,eAAe,KAAmC;AAChE,QAAM,SAAS,oBAAI,IAA2B;AAC9C,QAAM,WAAqB,CAAC;AAG5B,MAAI,KAAC,2BAAW,GAAG,GAAG;AACpB,WAAO,EAAE,QAAQ,SAAS;AAAA,EAC5B;AAGA,MAAI;AACJ,MAAI;AACF,kBAAU,4BAAY,GAAG;AAAA,EAC3B,SAAS,OAAO;AAGd,UAAM,OAAQ,OAAiC;AAC/C,QAAI,SAAS,UAAU;AACrB,eAAS,KAAK,iCAAiC,GAAG,MAAM,OAAO,KAAK,CAAC,EAAE;AAAA,IACzE;AACA,WAAO,EAAE,QAAQ,SAAS;AAAA,EAC5B;AAEA,QAAM,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY,CAAC;AAEjE,aAAW,YAAY,YAAY;AACjC,UAAM,eAAW,uBAAK,KAAK,QAAQ;AAGnC,UAAM,SAAS,cAAc,QAAQ;AACrC,QAAI,CAAC,OAAO,IAAI;AACd,eAAS,KAAK,OAAO,MAAM,OAAO;AAClC;AAAA,IACF;AAEA,UAAM,WAAW,OAAO;AAOxB,UAAM,OAAe,oBAAoB,QAAQ,KAAK,uBAAuB,QAAQ;AAGrF,QAAI,CAACA,MAAK,KAAK,IAAI,GAAG;AACpB,eAAS;AAAA,QACP,eAAe,QAAQ,oBAAoB,IAAI;AAAA,MACjD;AACA;AAAA,IACF;AAGA,QAAI,mBAAmB,IAAI,GAAG;AAC5B,eAAS,KAAK,UAAU,IAAI,sCAAsC;AAClE;AAAA,IACF;AAGA,QAAI,OAAO,IAAI,IAAI,GAAG;AACpB,eAAS;AAAA,QACP,yBAAyB,IAAI,OAAO,QAAQ;AAAA,MAC9C;AAAA,IACF;AAEA,WAAO,IAAI,MAAM,QAAQ;AAAA,EAC3B;AAEA,SAAO,EAAE,QAAQ,SAAS;AAC5B;AAKA,SAAS,oBAAoB,UAAiC;AAC5D,MAAI;AACF,UAAM,UAAM,6BAAa,UAAU,MAAM;AACzC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,OAAO,OAAO,MAAM,MAAM,WAAY,OAAO,MAAM,IAAe;AAAA,EAC3E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAUO,SAAS,oBAAoB,UAAsC;AACxE,QAAM,aAAa;AACnB,MAAI,cAAU,0BAAQ,QAAQ;AAE9B,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,UAAM,gBAAY,uBAAK,SAAS,WAAW,QAAQ;AACnD,QAAI;AACF,cAAI,2BAAW,SAAS,SAAK,yBAAS,SAAS,EAAE,YAAY,GAAG;AAC9D,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,aAAS,8BAAQ,uBAAK,SAAS,IAAI,CAAC;AAC1C,QAAI,WAAW,QAAS;AACxB,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;;;ADvKO,SAAS,gBACd,MACA,UAC2B;AAE3B,MAAI,KAAK,WAAW;AAClB,UAAM,SAAS,kBAAc,2BAAQ,KAAK,SAAS,CAAC;AACpD,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,IAAI,MAAM,iBAAiB,OAAO,MAAM,OAAO,EAAE;AAAA,IACzD;AACA,WAAO,OAAO;AAAA,EAChB;AAGA,QAAMC,YAAW,oBAAI,IAA2B;AAGhD,QAAM,UAAU,oBAAoB,QAAQ;AAC5C,MAAI,SAAS;AACX,UAAM,EAAE,QAAQ,SAAS,IAAI,eAAe,OAAO;AACnD,eAAW,CAAC,MAAM,KAAK,KAAK,OAAQ,CAAAA,UAAS,IAAI,MAAM,KAAK;AAC5D,eAAW,KAAK,SAAU,SAAQ,MAAM,YAAY,CAAC,EAAE;AAAA,EACzD;AAGA,MAAI,KAAK,WAAW;AAClB,UAAM,EAAE,QAAQ,SAAS,IAAI,mBAAe,2BAAQ,KAAK,SAAS,CAAC;AACnE,eAAW,CAAC,MAAM,KAAK,KAAK,OAAQ,CAAAA,UAAS,IAAI,MAAM,KAAK;AAC5D,eAAW,KAAK,SAAU,SAAQ,MAAM,YAAY,CAAC,EAAE;AAAA,EACzD;AAGA,MAAI,KAAK,OAAO;AACd,QAAIA,UAAS,IAAI,KAAK,KAAK,GAAG;AAC5B,aAAOA,UAAS,IAAI,KAAK,KAAK;AAAA,IAChC;AAEA,WAAO,eAAe,KAAK,KAAK;AAAA,EAClC;AAGA,SAAO;AACT;;;AEvEA,IAAAC,kBAA6B;AAC7B,IAAAC,oBAAwB;;;ACTxB,IAAAC,kBAAgE;AAChE,IAAAC,oBAA8B;;;ACS9B,IAAMC,kBAAiB,oBAAI,IAAI,CAAC,UAAU,SAAS,WAAW,SAAS,UAAU,QAAQ,KAAK,CAAC;AAE/F,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,kBAAkB,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAKD,IAAMC,aAAY;AAGlB,IAAMC,WAAU;AAEhB,IAAM,eAAe,oBAAI,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAIzC,SAASC,eAAc,GAA0C;AAC/D,SAAO,MAAM,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAASC,MAAK,SAAgC;AAC5C,SAAO,IAAI,yBAAyB,OAAO;AAC7C;AAIA,SAAS,iBAAiB,UAAkB,KAAgC;AAC1E,QAAM,MAAM,UAAU,QAAQ;AAE9B,MAAI,CAACD,eAAc,GAAG,GAAG;AACvB,WAAOC,MAAK,GAAG,GAAG,yBAAyB;AAAA,EAC7C;AAEA,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,eAAe,IAAI,GAAG,GAAG;AAC5B,aAAOA,MAAK,kBAAkB,GAAG,MAAM,GAAG,GAAG;AAAA,IAC/C;AAAA,EACF;AAGA,MAAI,EAAE,UAAU,MAAM;AACpB,WAAOA,MAAK,GAAG,GAAG,mCAAmC;AAAA,EACvD;AACA,QAAM,OAAO,IAAI,MAAM;AACvB,MAAI,OAAO,SAAS,YAAY,KAAK,WAAW,GAAG;AACjD,WAAOA,MAAK,GAAG,GAAG,yCAAyC,KAAK,UAAU,IAAI,CAAC,EAAE;AAAA,EACnF;AAGA,aAAW,OAAO,CAAC,SAAS,QAAQ,GAAY;AAC9C,QAAI,OAAO,KAAK;AACd,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,OAAO,QAAQ,YAAY,OAAO,GAAG;AACvC,eAAOA,MAAK,GAAG,GAAG,IAAI,GAAG,mCAAmC,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,UAAU,CAAC,QAAQ,KAAK,GAAY;AAC7C,QAAI,UAAU,KAAK;AACjB,YAAM,MAAM,IAAI,MAAM;AACtB,UAAI,OAAO,QAAQ,UAAU;AAC3B,eAAOA,MAAK,GAAG,GAAG,IAAI,MAAM,0BAA0B,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY,KAAK;AACnB,UAAM,MAAM,IAAI,QAAQ;AACxB,QAAI,CAAC,aAAa,IAAI,GAAa,GAAG;AACpC,aAAOA,MAAK,GAAG,GAAG,sCAAsC,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF;AAGA,aAAWC,SAAQ,CAAC,SAAS,OAAO,GAAY;AAC9C,QAAIA,SAAQ,KAAK;AACf,YAAM,MAAM,IAAIA,KAAI;AACpB,UAAI,OAAO,QAAQ,WAAW;AAC5B,eAAOD,MAAK,GAAG,GAAG,IAAIC,KAAI,2BAA2B,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,GAA0B;AACtC;AAIA,SAAS,kBAAkB,WAAmB,KAAiC;AAC7E,QAAM,MAAM,YAAY,SAAS;AAEjC,MAAI,CAACF,eAAc,GAAG,GAAG;AACvB,WAAOC,MAAK,GAAG,GAAG,yBAAyB;AAAA,EAC7C;AAEA,aAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAClC,QAAI,CAAC,gBAAgB,IAAI,GAAG,GAAG;AAC7B,aAAOA,MAAK,kBAAkB,GAAG,MAAM,GAAG,GAAG;AAAA,IAC/C;AAAA,EACF;AAGA,MAAI,EAAE,YAAY,MAAM;AACtB,WAAOA,MAAK,GAAG,GAAG,qCAAqC;AAAA,EACzD;AACA,QAAM,SAAS,IAAI,QAAQ;AAC3B,MAAI,OAAO,WAAW,YAAY,OAAO,WAAW,GAAG;AACrD,WAAOA,MAAK,GAAG,GAAG,2CAA2C,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EACvF;AAGA,MAAI,YAAY,KAAK;AACnB,UAAM,MAAM,IAAI,QAAQ;AACxB,QAAI,CAAC,aAAa,IAAI,GAAa,GAAG;AACpC,aAAOA,MAAK,GAAG,GAAG,sCAAsC,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF;AAGA,aAAWC,SAAQ,CAAC,SAAS,OAAO,GAAY;AAC9C,QAAIA,SAAQ,KAAK;AACf,YAAM,MAAM,IAAIA,KAAI;AACpB,UAAI,OAAO,QAAQ,WAAW;AAC5B,eAAOD,MAAK,GAAG,GAAG,IAAIC,KAAI,2BAA2B,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAGA,aAAW,OAAO,CAAC,SAAS,QAAQ,GAAY;AAC9C,QAAI,OAAO,KAAK;AACd,YAAM,MAAM,IAAI,GAAG;AACnB,UAAI,OAAO,QAAQ,YAAY,OAAO,GAAG;AACvC,eAAOD,MAAK,GAAG,GAAG,IAAI,GAAG,mCAAmC,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,UAAU,CAAC,QAAQ,KAAK,GAAY;AAC7C,QAAI,UAAU,KAAK;AACjB,YAAM,MAAM,IAAI,MAAM;AACtB,UAAI,OAAO,QAAQ,UAAU;AAC3B,eAAOA,MAAK,GAAG,GAAG,IAAI,MAAM,0BAA0B,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,GAA2B;AACvC;AAmBO,SAAS,iBAAiB,MAAoC;AACnE,MAAI,CAACD,eAAc,IAAI,GAAG;AACxB,WAAOC;AAAA,MACL,oDAAoD,SAAS,OAAO,SAAS,MAAM,QAAQ,IAAI,IAAI,UAAU,OAAO,IAAI;AAAA,IAC1H;AAAA,EACF;AAGA,aAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,QAAI,CAACJ,gBAAe,IAAI,GAAG,GAAG;AAC5B,aAAOI,MAAK,2BAA2B,GAAG,GAAG;AAAA,IAC/C;AAAA,EACF;AAGA,MAAI,EAAE,YAAY,OAAO;AACvB,WAAOA,MAAK,iCAAiC;AAAA,EAC/C;AACA,QAAM,SAAS,KAAK,QAAQ;AAC5B,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAOA,MAAK,kCAAkC,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EACxE;AACA,MAAI,CAACH,WAAU,KAAK,MAAM,GAAG;AAC3B,WAAOG;AAAA,MACL,qGAAqG,KAAK,UAAU,MAAM,CAAC;AAAA,IAC7H;AAAA,EACF;AAGA,MAAI,EAAE,WAAW,OAAO;AACtB,WAAOA,MAAK,gCAAgC;AAAA,EAC9C;AACA,QAAM,WAAW,KAAK,OAAO;AAC7B,MAAI,CAACD,eAAc,QAAQ,GAAG;AAC5B,WAAOC,MAAK,gCAAgC;AAAA,EAC9C;AACA,QAAM,YAAY,OAAO,KAAK,QAAQ;AACtC,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAOA,MAAK,8CAA8C;AAAA,EAC5D;AAEA,QAAM,QAAkC,CAAC;AACzC,aAAW,QAAQ,WAAW;AAC5B,QAAI,CAACF,SAAQ,KAAK,IAAI,GAAG;AACvB,aAAOE;AAAA,QACL,aAAa,KAAK,UAAU,IAAI,CAAC;AAAA,MACnC;AAAA,IACF;AACA,UAAM,IAAI,iBAAiB,MAAM,SAAS,IAAI,CAAC;AAC/C,QAAI,CAAC,EAAE,GAAI,QAAO;AAClB,UAAM,IAAI,IAAI,EAAE;AAAA,EAClB;AAGA,MAAI;AACJ,MAAI,aAAa,MAAM;AACrB,UAAM,aAAa,KAAK,SAAS;AACjC,QAAI,CAACD,eAAc,UAAU,GAAG;AAC9B,aAAOC,MAAK,kCAAkC;AAAA,IAChD;AACA,cAAU,CAAC;AACX,eAAW,aAAa,OAAO,KAAK,UAAU,GAAG;AAC/C,UAAI,CAACF,SAAQ,KAAK,SAAS,GAAG;AAC5B,eAAOE,MAAK,cAAc,KAAK,UAAU,SAAS,CAAC,kCAAkC;AAAA,MACvF;AACA,YAAM,IAAI,kBAAkB,WAAW,WAAW,SAAS,CAAC;AAC5D,UAAI,CAAC,EAAE,GAAI,QAAO;AAClB,cAAQ,SAAS,IAAI,EAAE;AAAA,IACzB;AAAA,EACF;AAGA,aAAW,OAAO,CAAC,SAAS,QAAQ,GAAY;AAC9C,QAAI,OAAO,MAAM;AACf,YAAM,MAAM,KAAK,GAAG;AACpB,UAAI,OAAO,QAAQ,YAAY,OAAO,GAAG;AACvC,eAAOA,MAAK,IAAI,GAAG,oCAAoC,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACA,aAAW,UAAU,CAAC,QAAQ,KAAK,GAAY;AAC7C,QAAI,UAAU,MAAM;AAClB,YAAM,MAAM,KAAK,MAAM;AACvB,UAAI,OAAO,QAAQ,UAAU;AAC3B,eAAOA,MAAK,IAAI,MAAM,2BAA2B,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAsB;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC3C,GAAI,WAAW,OAAO,EAAE,OAAO,KAAK,OAAO,EAAY,IAAI,CAAC;AAAA,IAC5D,GAAI,YAAY,OAAO,EAAE,QAAQ,KAAK,QAAQ,EAAY,IAAI,CAAC;AAAA,IAC/D,GAAI,UAAU,OAAO,EAAE,MAAM,KAAK,MAAM,EAAY,IAAI,CAAC;AAAA,IACzD,GAAI,SAAS,OAAO,EAAE,KAAK,KAAK,KAAK,EAAY,IAAI,CAAC;AAAA,EACxD;AAEA,SAAO,GAAG,MAAM;AAClB;;;AD7RA,IAAM,cAAc;AAkBb,SAAS,kBAAkB,KAAkC;AAClE,QAAM,MAAgC,oBAAI,IAAI;AAC9C,QAAM,WAAqB,CAAC;AAG5B,MAAI,KAAC,4BAAW,GAAG,GAAG;AACpB,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAGA,MAAI;AACJ,MAAI;AACF,kBAAU,6BAAY,GAAG;AAAA,EAC3B,SAAS,OAAO;AAGd,UAAM,OAAQ,OAAiC;AAC/C,QAAI,SAAS,UAAU;AACrB,eAAS,KAAK,gCAAgC,GAAG,MAAM,OAAO,KAAK,CAAC,EAAE;AAAA,IACxE;AACA,WAAO,EAAE,KAAK,SAAS;AAAA,EACzB;AAEA,QAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW,CAAC;AAE/D,aAAW,YAAY,WAAW;AAChC,UAAM,eAAW,wBAAK,KAAK,QAAQ;AAGnC,QAAI;AACJ,QAAI;AACF,gBAAM,8BAAa,UAAU,MAAM;AAAA,IACrC,SAAS,OAAO;AACd,eAAS,KAAK,+BAA+B,QAAQ,MAAM,OAAO,KAAK,CAAC,EAAE;AAC1E;AAAA,IACF;AAGA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG;AAAA,IACzB,SAAS,OAAO;AACd,eAAS,KAAK,mCAAmC,QAAQ,MAAM,OAAO,KAAK,CAAC,EAAE;AAC9E;AAAA,IACF;AAGA,UAAM,SAAS,iBAAiB,MAAM;AACtC,QAAI,CAAC,OAAO,IAAI;AACd,eAAS,KAAK,mBAAmB,QAAQ,wBAAwB,OAAO,MAAM,OAAO,EAAE;AACvF;AAAA,IACF;AAEA,UAAM,OAAO,OAAO;AAGpB,QAAI,IAAI,IAAI,KAAK,MAAM,GAAG;AACxB,eAAS;AAAA,QACP,+BAA+B,KAAK,MAAM,OAAO,QAAQ;AAAA,MAC3D;AAAA,IACF;AAEA,QAAI,IAAI,KAAK,QAAQ,IAAI;AAAA,EAC3B;AAEA,SAAO,EAAE,KAAK,SAAS;AACzB;AAUO,SAAS,mBAAmB,UAAsC;AACvE,QAAM,aAAa;AACnB,MAAI,cAAU,2BAAQ,QAAQ;AAE9B,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,UAAM,gBAAY,wBAAK,SAAS,WAAW,OAAO;AAClD,QAAI;AACF,cAAI,4BAAW,SAAS,SAAK,0BAAS,SAAS,EAAE,YAAY,GAAG;AAC9D,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,aAAS,+BAAQ,wBAAK,SAAS,IAAI,CAAC;AAC1C,QAAI,WAAW,QAAS;AACxB,cAAU;AAAA,EACZ;AAEA,SAAO;AACT;;;ADrFO,SAAS,gBAAgB,MAAgB,UAA+B;AAC7E,QAAM,SAAsB,oBAAI,IAAI;AAGpC,QAAM,UAAU,mBAAmB,QAAQ;AAC3C,MAAI,SAAS;AACX,UAAM,EAAE,KAAK,SAAS,IAAI,kBAAkB,OAAO;AACnD,eAAW,CAAC,QAAQ,IAAI,KAAK,IAAK,QAAO,IAAI,QAAQ,IAAI;AACzD,eAAW,KAAK,SAAU,SAAQ,MAAM,YAAY,CAAC,EAAE;AAAA,EACzD;AAGA,MAAI,KAAK,UAAU;AACjB,UAAM,EAAE,KAAK,SAAS,IAAI,sBAAkB,2BAAQ,KAAK,QAAQ,CAAC;AAClE,eAAW,CAAC,QAAQ,IAAI,KAAK,IAAK,QAAO,IAAI,QAAQ,IAAI;AACzD,eAAW,KAAK,SAAU,SAAQ,MAAM,YAAY,CAAC,EAAE;AAAA,EACzD;AAGA,MAAI,KAAK,UAAU;AACjB,UAAM,eAAW,2BAAQ,KAAK,QAAQ;AAEtC,QAAI;AACJ,QAAI;AACF,gBAAM,8BAAa,UAAU,MAAM;AAAA,IACrC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,6BAA6B,QAAQ,MAAO,MAAgB,OAAO,EAAE;AAAA,IACvF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,GAAG;AAAA,IACzB,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,iCAAiC,QAAQ,MAAO,MAAgB,OAAO,EAAE;AAAA,IAC3F;AAEA,UAAM,SAAS,iBAAiB,MAAM;AACtC,QAAI,CAAC,OAAO,IAAI;AACd,YAAM,IAAI,MAAM,iBAAiB,QAAQ,wBAAwB,OAAO,MAAM,OAAO,EAAE;AAAA,IACzF;AAEA,WAAO,IAAI,OAAO,MAAM,QAAQ,OAAO,KAAK;AAAA,EAC9C;AAEA,SAAO;AACT;;;AhKvGA;AAyCA,SAAS,UAAU,MAAsB;AACvC,QAAM,cAAwB,CAAC;AAC/B,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,QAAQ;AACZ,MAAI,OAAO;AAEX,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,YAAQ,GAAG;AAAA,MACT,KAAK;AAAA,MACL,KAAK;AACH,cAAM,KAAK,EAAE,CAAC;AACd;AAAA,MACF,KAAK;AACH,gBAAQ,KAAK,EAAE,CAAC;AAChB;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,EAAE,CAAC;AACpB;AAAA,MACF,KAAK;AACH,oBAAY,KAAK,EAAE,CAAC;AACpB;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,EAAE,CAAC;AACnB;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,EAAE,CAAC;AACnB;AAAA,MACF,KAAK;AACH,gBAAQ,OAAO,KAAK,EAAE,CAAC,CAAC,KAAK;AAC7B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,eAAO;AACP;AAAA,MACF;AACE,oBAAY,KAAK,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,YAAY,MAAM,GAAG,aAAa,KAAK,OAAO,WAAW,WAAW,UAAU,UAAU,OAAO,KAAK;AACxH;AAEA,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDd,IAAM,eAAe,oBAAI,IAAI,CAAC,WAAW,MAAM,CAAC;AAGhD,SAAS,YACP,QACA,YACA,OACQ;AACR,QAAM,SAAS,WAAW,QAAQ,YAAY,QAAW,QAAW,KAAK;AACzE,MAAI,CAAC,OAAO,IAAI;AACd,UAAM,IAAI,MAAM,GAAG,OAAO,MAAM,IAAI,KAAK,OAAO,MAAM,OAAO,EAAE;AAAA,EACjE;AACA,SAAO,OAAO;AAChB;AAGA,eAAe,WACb,WACA,SACA,YACA,OACA,OACe;AACf,QAAM,aAAS,8BAAa,WAAW,MAAM;AAC7C,QAAM,MAAM,YAAY,QAAQ,YAAY,KAAK;AAKjD,qCAAU,+BAAQ,2BAAQ,OAAO,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AAExD,UAAI,2BAAQ,OAAO,EAAE,YAAY,MAAM,QAAQ;AAC7C,uCAAc,SAAS,KAAK,MAAM;AAClC;AAAA,EACF;AAEA,QAAM,MAAM,MAAM,SAAS,KAAK,EAAE,MAAM,CAAC;AACzC,qCAAc,SAAS,GAAG;AAC5B;AAGA,eAAe,UACb,QACA,QACA,YACA,OACA,OACiD;AACjD,iCAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAErC,QAAM,cAAU,6BAAY,MAAM,EAAE,OAAO,CAACE,OAAM;AAChD,UAAM,WAAO,wBAAK,QAAQA,EAAC;AAC3B,eAAO,0BAAS,IAAI,EAAE,OAAO,KAAK,aAAa,QAAI,2BAAQA,EAAC,EAAE,YAAY,CAAC;AAAA,EAC7E,CAAC;AAED,MAAI,WAAW;AACf,QAAM,SAAmB,CAAC;AAE1B,aAAW,QAAQ,SAAS;AAC1B,UAAM,gBAAY,wBAAK,QAAQ,IAAI;AACnC,UAAM,WAAO,4BAAS,UAAM,2BAAQ,IAAI,CAAC;AACzC,UAAM,cAAU,wBAAK,QAAQ,GAAG,IAAI,MAAM;AAC1C,QAAI;AACF,YAAM,WAAW,WAAW,SAAS,YAAY,OAAO,KAAK;AAC7D,cAAQ,IAAI,YAAO,IAAI,WAAM,IAAI,MAAM;AACvC;AAAA,IACF,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,cAAQ,MAAM,YAAO,IAAI,KAAK,OAAO,EAAE;AACvC,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,OAAO;AAC5B;AAIA,eAAe,OAAwB;AACrC,QAAM,OAAO,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;AAE5C,MAAI,KAAK,QAAQ,CAAC,KAAK,SAAS;AAC9B,YAAQ,IAAI,KAAK;AACjB,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAEA,MAAI,KAAK,YAAY,UAAU;AAC7B,UAAM,QAAQ,KAAK,YAAY,CAAC;AAChC,QAAI,CAAC,SAAS,CAAC,KAAK,KAAK;AACvB,cAAQ,MAAM,kDAAkD;AAChE,cAAQ,MAAM,KAAK;AACnB,aAAO;AAAA,IACT;AACA,UAAM,gBAAY,2BAAQ,KAAK;AAC/B,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,mBAAa,gBAAgB,UAAM,2BAAQ,SAAS,CAAC;AAAA,IACvD,SAAS,GAAG;AACV,cAAQ,MAAM,UAAW,EAAY,OAAO,EAAE;AAC9C,aAAO;AAAA,IACT;AACA,QAAI;AACF,cAAQ,gBAAgB,UAAM,2BAAQ,SAAS,CAAC;AAAA,IAClD,SAAS,GAAG;AACV,cAAQ,MAAM,UAAW,EAAY,OAAO,EAAE;AAC9C,aAAO;AAAA,IACT;AACA,UAAM,WAAW,eAAW,2BAAQ,KAAK,GAAG,GAAG,YAAY,OAAO,KAAK,KAAK;AAC5E,YAAQ,IAAI,UAAK,KAAK,WAAM,KAAK,GAAG,EAAE;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,YAAY,cAAc;AACjC,UAAM,SAAS,KAAK,YAAY,CAAC;AACjC,QAAI,CAAC,UAAU,CAAC,KAAK,KAAK;AACxB,cAAQ,MAAM,uDAAuD;AACrE,cAAQ,MAAM,KAAK;AACnB,aAAO;AAAA,IACT;AACA,UAAM,qBAAiB,2BAAQ,MAAM;AACrC,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,mBAAa,gBAAgB,MAAM,cAAc;AAAA,IACnD,SAAS,GAAG;AACV,cAAQ,MAAM,UAAW,EAAY,OAAO,EAAE;AAC9C,aAAO;AAAA,IACT;AACA,QAAI;AACF,cAAQ,gBAAgB,MAAM,cAAc;AAAA,IAC9C,SAAS,GAAG;AACV,cAAQ,MAAM,UAAW,EAAY,OAAO,EAAE;AAC9C,aAAO;AAAA,IACT;AACA,UAAM,EAAE,UAAU,OAAO,IAAI,MAAM;AAAA,MACjC;AAAA,UACA,2BAAQ,KAAK,GAAG;AAAA,MAChB;AAAA,MACA;AAAA,MACA,KAAK;AAAA,IACP;AACA,YAAQ,IAAI;AAAA,EAAK,QAAQ,cAAc,OAAO,MAAM,UAAU;AAC9D,WAAO,OAAO,SAAS,IAAI,IAAI;AAAA,EACjC;AAEA,UAAQ,MAAM,2BAA2B,KAAK,OAAO;AAAA,CAAM;AAC3D,UAAQ,MAAM,KAAK;AACnB,SAAO;AACT;AAEA,SAAS,oBAA6B;AACpC,MAAI,OAAO,YAAY,eAAe,OAAO,WAAW,eAAe,QAAQ,SAAS,QAAQ;AAC9F,WAAO;AAAA,EACT;AACA,MAAI,OAAO,eAAe,eAAe,QAAQ,KAAK,CAAC,GAAG;AACxD,QAAI;AACF,iBAAO,2BAAQ,QAAQ,KAAK,CAAC,CAAC,UAAM,2BAAQ,UAAU;AAAA,IACxD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI;AACF,QAAI,OAAO,gBAAgB,eAAe,YAAY,OAAO,QAAQ,KAAK,CAAC,GAAG;AAC5E,iBAAO,2BAAQ,QAAQ,KAAK,CAAC,CAAC,UAAM,+BAAQ,+BAAc,YAAY,GAAG,CAAC;AAAA,IAC5E;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,IAAI,kBAAkB,GAAG;AACvB,OAAK,EACF,KAAK,CAAC,SAAS,QAAQ,KAAK,IAAI,CAAC,EACjC,MAAM,CAAC,UAAU;AAChB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAQ,MAAM,UAAU,OAAO,EAAE;AACjC,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL;",
  "names": ["import_node_fs", "import_node_path", "module", "registry", "baseNodes", "registry", "points", "path", "edges", "cp1p", "cp2p", "cp1n", "cp2n", "slugify", "lines", "overlays", "opts", "wrapText", "lines", "f", "wrapText", "lines", "h", "opts", "startY", "wrapText", "lines", "toRect", "list", "loop", "allRects", "obstacles", "edges", "BLACK", "stack", "queue", "f", "h", "chosenGutter", "startPt", "endPt", "fillet", "minX", "maxX", "obs", "loop", "expected", "found", "lines", "text", "offset", "location", "h", "n", "leftOrd", "p", "sections", "lines", "wrapText", "wrapText", "wrapText", "slugify", "overlays", "reset", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "text", "offset", "location", "peg$parse", "dx", "dy", "len", "links", "h", "links", "ARROW_ID", "cells", "x", "ARROW_ID", "cells", "links", "elements", "module", "h", "lines", "cells", "slugify", "reset", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "block", "text", "location", "offset", "peg$parse", "cells", "module", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "h", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "range", "location", "text", "offset", "peg$parse", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "sections", "location", "text", "offset", "peg$parse", "sections", "flat", "f", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "sections", "lines", "location", "text", "offset", "peg$parse", "h", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "text", "location", "offset", "peg$parse", "ARROW_ID", "edges", "s", "f", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "text", "location", "offset", "peg$parse", "assignLayers", "edges", "list", "stack", "tree", "minimizeCrossings", "find", "toRect", "h", "edges", "wallPoint", "b", "labelAnchor", "a", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "ARROW_ID", "s", "h", "edges", "p", "f", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "h", "edges", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "h", "maxRight", "maxBottom", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "edges", "lines", "block", "location", "text", "offset", "peg$parse", "ARROW_ID", "lines", "f", "wrapText", "h", "edges", "p", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "totalH", "h", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "links", "lines", "location", "text", "offset", "peg$parse", "f", "h", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "lines", "stack", "peg$parse", "list", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "ARROW_ID", "NODE_W", "h", "edges", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "list", "lines", "location", "text", "offset", "peg$parse", "queue", "rectsOverlap", "ARROW_END_ID", "ARROW_START_ID", "rectCenter", "edgeDash", "edgeStrokeWidth", "s", "cells", "toRect", "scene", "bendX", "blockingObstacles", "candidates", "bendY", "candidate", "ANIMATION_SET", "CONNECTOR_TOKEN_MAP", "assertAnim", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "edges", "block", "location", "text", "offset", "peg$parse", "f", "label", "parseHex", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "queue", "maxDepth", "cursor", "parseHex", "toHex", "mixHex", "isDarkTheme", "readableText", "fill", "scene", "peg$subclass", "peg$SyntaxError", "peg$padEnd", "expected", "found", "peg$parse", "lines", "location", "text", "offset", "peg$parse", "lines", "stack", "i", "mid", "upKey", "lines", "pageId", "id", "stack", "ARROW_ID", "ARROW_START_ID", "stripCells", "edges", "scene", "cells", "h", "lines", "ARROW_ID", "edges", "scene", "badgeColor", "lines", "edges", "lines", "stack", "ARROW_ID", "edges", "scene", "h", "lines", "collect", "ARROW_ID", "edges", "scene", "h", "lines", "nodes", "ARROW_ID", "edges", "scene", "h", "lines", "ARROW_ID", "edges", "scene", "k", "rotateRight", "rotateLeft", "rotateLeft", "h", "rotateRight", "insert", "insert", "heap", "parse", "ARROW_ID", "parse", "f", "maxBottom", "h", "p", "ARROW_ID", "parse", "ARROW_ID", "pen", "cells", "stack", "s", "boundsForElements", "translateElements", "translateAnchors", "boundsForElement", "boundsForPath", "boundsForText", "translateElement", "translateRect", "translatePathD", "parse", "cells", "parse", "cells", "f", "parse", "cells", "parse", "parseHex", "toHex", "mixHex", "parse", "cells", "ARROW_ID", "parse", "maxRight", "ARROW_ID", "parse", "newNode", "insert", "ARROW_ID", "parse", "edges", "wallPoint", "MIN_PORT_GAP", "WALL_MARGIN", "cascadePorts", "obstacles", "pen", "parse", "edges", "lines", "ARROW_ID", "ARROW_START_ID", "maxBottom", "n", "lines", "join", "stack", "wrapText", "h", "startY", "textX", "layoutList", "maxRight", "maxDepth", "lines", "lines", "lines", "lines", "t", "module", "h", "opts", "PDFDocument", "SVGtoPDF", "import_node_path", "SLUG", "registry", "import_node_fs", "import_node_path", "import_node_fs", "import_node_path", "TOP_LEVEL_KEYS", "PREFIX_RE", "NAME_RE", "isPlainObject", "fail", "flip", "f"]
}
