{"version":3,"file":"pi-tui-DruSeKmd.mjs","names":["functionKey","spawn","join","homedir","dirname","basename"],"sources":["../src/compat/vendor/pi-tui-utils.ts","../src/compat/vendor/pi-tui-fuzzy.ts","../src/compat/vendor/pi-tui-keys.ts","../src/compat/vendor/pi-tui-terminal-colors.ts","../src/compat/vendor/pi-tui-keybindings.ts","../src/compat/vendor/pi-tui-latex.ts","../src/compat/vendor/pi-tui-terminal-image.ts","../src/compat/vendor/pi-tui-autocomplete.ts","../src/compat/pi-tui.ts"],"sourcesContent":["// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\n// Vendored from Pi (https://github.com/badlogic/pi-mono), packages/tui/src/utils.ts.\n// Copyright (c) 2025 Mario Zechner. MIT License — see PI-LICENSE in this directory.\n// Kept byte-identical below this header so Pi extensions observe identical\n// terminal-width semantics (ANSI/OSC/APC stripping, grapheme widths, wrapping).\nimport { eastAsianWidth } from \"get-east-asian-width\";\n\n// segmenters (shared instance)\nconst graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\nconst wordSegmenter = new Intl.Segmenter(undefined, { granularity: \"word\" });\n\n/**\n * Get the shared grapheme segmenter instance.\n */\nexport function getGraphemeSegmenter(): Intl.Segmenter {\n\treturn graphemeSegmenter;\n}\n\n/**\n * Get the shared word segmenter instance.\n */\nexport function getWordSegmenter(): Intl.Segmenter {\n\treturn wordSegmenter;\n}\n\n/**\n * Check if a grapheme cluster (after segmentation) could possibly be an RGI emoji.\n * This is a fast heuristic to avoid the expensive rgiEmojiRegex test.\n * The tested Unicode blocks are deliberately broad to account for future\n * Unicode additions.\n */\nfunction couldBeEmoji(segment: string): boolean {\n\tconst cp = segment.codePointAt(0)!;\n\treturn (\n\t\t(cp >= 0x1f000 && cp <= 0x1fbff) || // Emoji and Pictograph\n\t\t(cp >= 0x2300 && cp <= 0x23ff) || // Misc technical\n\t\t(cp >= 0x2600 && cp <= 0x27bf) || // Misc symbols, dingbats\n\t\t(cp >= 0x2b50 && cp <= 0x2b55) || // Specific stars/circles\n\t\tsegment.includes(\"\\uFE0F\") || // Contains VS16 (emoji presentation selector)\n\t\tsegment.length > 2 // Multi-codepoint sequences (ZWJ, skin tones, etc.)\n\t);\n}\n\n// Regexes for character classification (same as string-width library)\nconst zeroWidthRegex = /^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Mark}|\\p{Surrogate})+$/v;\nconst leadingNonPrintingRegex = /^[\\p{Default_Ignorable_Code_Point}\\p{Control}\\p{Format}\\p{Mark}\\p{Surrogate}]+/v;\nconst nonPrintingCharRegex = /^(?:\\p{Default_Ignorable_Code_Point}|\\p{Control}|\\p{Format}|\\p{Mark}|\\p{Surrogate})$/v;\nconst markCharRegex = /^\\p{Mark}$/v;\n// Marks that terminals allocate cells for when attached to a base character.\n// This includes Unicode spacing marks and non-spacing exceptions in legacy wcwidth tables.\nconst terminalSpacingMarkRegex =\n\t/^(?:[\\p{Spacing_Mark}--[\\u1734\\u302E\\u302F]]|[\\u065F\\u0F7F\\u102B\\u102C\\u1031\\u1033-\\u1035\\u1038\\u103A-\\u103E])+$/v;\nconst rgiEmojiRegex = /^\\p{RGI_Emoji}$/v;\n\n// Cache for non-ASCII strings\nconst WIDTH_CACHE_SIZE = 512;\nconst widthCache = new Map<string, number>();\n\nexport const cjkBreakRegex =\n\t/[\\p{Script_Extensions=Han}\\p{Script_Extensions=Hiragana}\\p{Script_Extensions=Katakana}\\p{Script_Extensions=Hangul}\\p{Script_Extensions=Bopomofo}]/u;\n\nfunction isPrintableAscii(str: string): boolean {\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst code = str.charCodeAt(i);\n\t\tif (code < 0x20 || code > 0x7e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n\nfunction truncateFragmentToWidth(text: string, maxWidth: number): { text: string; width: number } {\n\tif (maxWidth <= 0 || text.length === 0) {\n\t\treturn { text: \"\", width: 0 };\n\t}\n\n\tif (isPrintableAscii(text)) {\n\t\tconst clipped = text.slice(0, maxWidth);\n\t\treturn { text: clipped, width: clipped.length };\n\t}\n\n\tconst hasAnsi = text.includes(\"\\x1b\");\n\tconst hasTabs = text.includes(\"\\t\");\n\tif (!hasAnsi && !hasTabs) {\n\t\tlet result = \"\";\n\t\tlet width = 0;\n\t\tfor (const { segment } of graphemeSegmenter.segment(text)) {\n\t\t\tconst w = graphemeWidth(segment);\n\t\t\tif (width + w > maxWidth) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tresult += segment;\n\t\t\twidth += w;\n\t\t}\n\t\treturn { text: result, width };\n\t}\n\n\tlet result = \"\";\n\tlet width = 0;\n\tlet i = 0;\n\tlet pendingAnsi = \"\";\n\n\twhile (i < text.length) {\n\t\tconst ansi = extractAnsiCode(text, i);\n\t\tif (ansi) {\n\t\t\tpendingAnsi += ansi.code;\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (text[i] === \"\\t\") {\n\t\t\tif (width + 3 > maxWidth) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (pendingAnsi) {\n\t\t\t\tresult += pendingAnsi;\n\t\t\t\tpendingAnsi = \"\";\n\t\t\t}\n\t\t\tresult += \"\\t\";\n\t\t\twidth += 3;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet end = i;\n\t\twhile (end < text.length && text[end] !== \"\\t\") {\n\t\t\tconst nextAnsi = extractAnsiCode(text, end);\n\t\t\tif (nextAnsi) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tend++;\n\t\t}\n\n\t\tfor (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {\n\t\t\tconst w = graphemeWidth(segment);\n\t\t\tif (width + w > maxWidth) {\n\t\t\t\treturn { text: result, width };\n\t\t\t}\n\t\t\tif (pendingAnsi) {\n\t\t\t\tresult += pendingAnsi;\n\t\t\t\tpendingAnsi = \"\";\n\t\t\t}\n\t\t\tresult += segment;\n\t\t\twidth += w;\n\t\t}\n\t\ti = end;\n\t}\n\n\treturn { text: result, width };\n}\n\nfunction finalizeTruncatedResult(\n\tprefix: string,\n\tprefixWidth: number,\n\tellipsis: string,\n\tellipsisWidth: number,\n\tmaxWidth: number,\n\tpad: boolean,\n): string {\n\tconst reset = \"\\x1b[0m\";\n\tconst hyperlinkClose = getActiveOsc8Close(prefix);\n\tconst visibleWidth = prefixWidth + ellipsisWidth;\n\tlet result: string;\n\n\tif (ellipsis.length > 0) {\n\t\tresult = `${prefix}${hyperlinkClose}${reset}${ellipsis}${reset}`;\n\t} else {\n\t\tresult = `${prefix}${hyperlinkClose}${reset}`;\n\t}\n\n\treturn pad ? result + \" \".repeat(Math.max(0, maxWidth - visibleWidth)) : result;\n}\n\n/**\n * Calculate the terminal width of a single grapheme cluster.\n * Based on code from the string-width library, but includes a possible-emoji\n * check to avoid running the RGI_Emoji regex unnecessarily.\n */\nfunction graphemeWidth(segment: string): number {\n\tif (segment === \"\\t\") {\n\t\treturn 3;\n\t}\n\n\t// Some marks occupy cells even without a base character.\n\tif (terminalSpacingMarkRegex.test(segment)) {\n\t\treturn [...segment].length;\n\t}\n\n\t// Zero-width clusters\n\tif (zeroWidthRegex.test(segment)) {\n\t\treturn 0;\n\t}\n\n\t// Emoji check with pre-filter\n\tif (couldBeEmoji(segment) && rgiEmojiRegex.test(segment)) {\n\t\treturn 2;\n\t}\n\n\t// Get base visible codepoint\n\tconst base = segment.replace(leadingNonPrintingRegex, \"\");\n\tconst cp = base.codePointAt(0);\n\tif (cp === undefined) {\n\t\treturn 0;\n\t}\n\n\t// Regional indicator symbols (U+1F1E6..U+1F1FF) are often rendered as\n\t// full-width emoji in terminals, even when isolated during streaming.\n\t// Keep width conservative (2) to avoid terminal auto-wrap drift artifacts.\n\tif (cp >= 0x1f1e6 && cp <= 0x1f1ff) {\n\t\treturn 2;\n\t}\n\n\tlet width = eastAsianWidth(cp);\n\n\t// Intl.Segmenter can group multiple terminal-spacing code points into one\n\t// grapheme. Count trailing visible code points that terminals may allocate\n\t// cells for: Indic consonants after marks, halfwidth/fullwidth forms, and\n\t// Thai/Lao AM vowels.\n\tlet followsMark = false;\n\tconst chars = [...base];\n\tfor (const char of chars.slice(1)) {\n\t\tif (terminalSpacingMarkRegex.test(char)) {\n\t\t\twidth += 1;\n\t\t\tfollowsMark = false;\n\t\t} else if (markCharRegex.test(char)) {\n\t\t\tfollowsMark = true;\n\t\t} else if (!nonPrintingCharRegex.test(char)) {\n\t\t\tconst c = char.codePointAt(0)!;\n\t\t\tif (followsMark || (c >= 0xff00 && c <= 0xffef)) {\n\t\t\t\t// halfwidth + fullwidth forms\n\t\t\t\twidth += eastAsianWidth(c);\n\t\t\t} else if (c === 0x0e33 || c === 0x0eb3) {\n\t\t\t\twidth += 1;\n\t\t\t}\n\t\t\tfollowsMark = false;\n\t\t}\n\t}\n\n\treturn width;\n}\n\n/**\n * Calculate the visible width of a string in terminal columns.\n */\nexport function visibleWidth(str: string): number {\n\tif (str.length === 0) {\n\t\treturn 0;\n\t}\n\n\t// Fast path: pure ASCII printable\n\tif (isPrintableAscii(str)) {\n\t\treturn str.length;\n\t}\n\n\t// Check cache\n\tconst cached = widthCache.get(str);\n\tif (cached !== undefined) {\n\t\treturn cached;\n\t}\n\n\t// Normalize: tabs to 3 spaces, strip ANSI escape codes\n\tlet clean = str;\n\tif (str.includes(\"\\t\")) {\n\t\tclean = clean.replace(/\\t/g, \"   \");\n\t}\n\tif (clean.includes(\"\\x1b\")) {\n\t\t// Strip supported ANSI/OSC/APC escape sequences in one pass.\n\t\t// This covers CSI styling/cursor codes, OSC hyperlinks and prompt markers,\n\t\t// and APC sequences like CURSOR_MARKER.\n\t\tlet stripped = \"\";\n\t\tlet i = 0;\n\t\twhile (i < clean.length) {\n\t\t\tconst ansi = extractAnsiCode(clean, i);\n\t\t\tif (ansi) {\n\t\t\t\ti += ansi.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tstripped += clean[i];\n\t\t\ti++;\n\t\t}\n\t\tclean = stripped;\n\t}\n\n\t// Calculate width\n\tlet width = 0;\n\tfor (const { segment } of graphemeSegmenter.segment(clean)) {\n\t\twidth += graphemeWidth(segment);\n\t}\n\n\t// Cache result\n\tif (widthCache.size >= WIDTH_CACHE_SIZE) {\n\t\tconst firstKey = widthCache.keys().next().value;\n\t\tif (firstKey !== undefined) {\n\t\t\twidthCache.delete(firstKey);\n\t\t}\n\t}\n\twidthCache.set(str, width);\n\n\treturn width;\n}\n\n/** Remove ANSI, OSC, and APC control sequences while preserving visible text. */\nexport function stripTerminalSequences(str: string): string {\n\tif (!str.includes(\"\\x1b\")) return str;\n\tlet result = \"\";\n\tlet i = 0;\n\twhile (i < str.length) {\n\t\tconst ansi = extractAnsiCode(str, i);\n\t\tif (ansi) {\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += str[i];\n\t\ti++;\n\t}\n\treturn result;\n}\n\ninterface GraphemeCellRange {\n\tstart: number;\n\tend: number;\n}\n\n/** Return the terminal-cell range occupied by the grapheme at a visible column. */\nexport function getGraphemeCellRange(line: string, column: number): GraphemeCellRange | undefined {\n\tlet currentCol = 0;\n\tlet i = 0;\n\twhile (i < line.length) {\n\t\tconst ansi = extractAnsiCode(line, i);\n\t\tif (ansi) {\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\t\tlet textEnd = i;\n\t\twhile (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\t\tfor (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n\t\t\tconst width = graphemeWidth(segment);\n\t\t\tif (width > 0 && column >= currentCol && column < currentCol + width) {\n\t\t\t\treturn { start: currentCol, end: currentCol + width };\n\t\t\t}\n\t\t\tcurrentCol += width;\n\t\t}\n\t\ti = textEnd;\n\t}\n\treturn undefined;\n}\n\n/** Return the OSC 8 hyperlink covering a visible terminal column. */\nexport function getOsc8LinkAtColumn(line: string, column: number): string | undefined {\n\tlet activeUrl: string | undefined;\n\tlet currentCol = 0;\n\tlet i = 0;\n\twhile (i < line.length) {\n\t\tconst ansi = extractAnsiCode(line, i);\n\t\tif (ansi) {\n\t\t\tconst hyperlink = /^\\x1b\\]8;[^;]*;([^\\x07\\x1b]*)(?:\\x07|\\x1b\\\\)$/.exec(ansi.code);\n\t\t\tif (hyperlink) activeUrl = hyperlink[1] || undefined;\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\t\tlet textEnd = i;\n\t\twhile (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\t\tfor (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n\t\t\tconst width = segment === \"\\t\" ? 3 : graphemeWidth(segment);\n\t\t\tif (column >= currentCol && column < currentCol + width) return activeUrl;\n\t\t\tcurrentCol += width;\n\t\t}\n\t\ti = textEnd;\n\t}\n\treturn undefined;\n}\n\n/**\n * Normalize text for terminal output without changing logical editor content.\n * Some terminals render precomposed Thai/Lao AM vowels inconsistently during\n * differential repaint. Their compatibility decompositions have the same cell\n * width but avoid stale-cell artifacts in terminal renderers. Visible tabs are\n * expanded to the fixed width used by layout so terminal tab stops cannot wrap\n * a logical line, while tabs inside terminal string sequences stay untouched.\n */\nconst THAI_LAO_AM_REGEX = /[\\u0e33\\u0eb3]/;\nconst THAI_LAO_AM_GLOBAL_REGEX = /[\\u0e33\\u0eb3]/g;\n\nexport function normalizeTerminalOutput(str: string): string {\n\tlet normalized = str;\n\tif (THAI_LAO_AM_REGEX.test(normalized)) {\n\t\tnormalized = normalized.replace(THAI_LAO_AM_GLOBAL_REGEX, (char) =>\n\t\t\tchar === \"\\u0e33\" ? \"\\u0e4d\\u0e32\" : \"\\u0ecd\\u0eb2\",\n\t\t);\n\t}\n\tif (!normalized.includes(\"\\t\")) return normalized;\n\n\tlet result = \"\";\n\tlet i = 0;\n\twhile (i < normalized.length) {\n\t\tconst ansi = extractAnsiCode(normalized, i);\n\t\tif (ansi) {\n\t\t\tresult += ansi.code;\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\t\tresult += normalized[i] === \"\\t\" ? \"   \" : normalized[i];\n\t\ti++;\n\t}\n\treturn result;\n}\n\n/**\n * Extract ANSI escape sequences from a string at the given position.\n */\nexport function extractAnsiCode(str: string, pos: number): { code: string; length: number } | null {\n\tif (pos >= str.length || str[pos] !== \"\\x1b\") return null;\n\n\tconst next = str[pos + 1];\n\n\t// CSI sequence: ESC [ ... m/G/K/H/J\n\tif (next === \"[\") {\n\t\tlet j = pos + 2;\n\t\twhile (j < str.length && !/[mGKHJ]/.test(str[j]!)) j++;\n\t\tif (j < str.length) return { code: str.substring(pos, j + 1), length: j + 1 - pos };\n\t\treturn null;\n\t}\n\n\t// OSC sequence: ESC ] ... BEL or ESC ] ... ST (ESC \\)\n\t// Used for hyperlinks (OSC 8), window titles, etc.\n\tif (next === \"]\") {\n\t\tlet j = pos + 2;\n\t\twhile (j < str.length) {\n\t\t\tif (str[j] === \"\\x07\") return { code: str.substring(pos, j + 1), length: j + 1 - pos };\n\t\t\tif (str[j] === \"\\x1b\" && str[j + 1] === \"\\\\\") return { code: str.substring(pos, j + 2), length: j + 2 - pos };\n\t\t\tj++;\n\t\t}\n\t\treturn null;\n\t}\n\n\t// APC sequence: ESC _ ... BEL or ESC _ ... ST (ESC \\)\n\t// Used for cursor marker and application-specific commands\n\tif (next === \"_\") {\n\t\tlet j = pos + 2;\n\t\twhile (j < str.length) {\n\t\t\tif (str[j] === \"\\x07\") return { code: str.substring(pos, j + 1), length: j + 1 - pos };\n\t\t\tif (str[j] === \"\\x1b\" && str[j + 1] === \"\\\\\") return { code: str.substring(pos, j + 2), length: j + 2 - pos };\n\t\t\tj++;\n\t\t}\n\t\treturn null;\n\t}\n\n\treturn null;\n}\n\ntype Osc8Terminator = \"\\x07\" | \"\\x1b\\\\\";\n\ninterface ActiveHyperlink {\n\tparams: string;\n\turl: string;\n\tterminator: Osc8Terminator;\n}\n\nfunction parseOsc8Hyperlink(ansiCode: string): ActiveHyperlink | null | undefined {\n\tif (!ansiCode.startsWith(\"\\x1b]8;\")) {\n\t\treturn undefined;\n\t}\n\n\tconst terminator: Osc8Terminator = ansiCode.endsWith(\"\\x07\") ? \"\\x07\" : \"\\x1b\\\\\";\n\tconst body = ansiCode.slice(4, terminator === \"\\x07\" ? -1 : -2);\n\tconst separatorIndex = body.indexOf(\";\");\n\tif (separatorIndex === -1) {\n\t\treturn undefined;\n\t}\n\n\tconst params = body.slice(0, separatorIndex);\n\tconst url = body.slice(separatorIndex + 1);\n\tif (!url) {\n\t\treturn null;\n\t}\n\treturn { params, url, terminator };\n}\n\nfunction formatOsc8Hyperlink(hyperlink: ActiveHyperlink): string {\n\treturn `\\x1b]8;${hyperlink.params};${hyperlink.url}${hyperlink.terminator}`;\n}\n\nfunction formatOsc8Close(terminator: Osc8Terminator): string {\n\treturn `\\x1b]8;;${terminator}`;\n}\n\nfunction getActiveOsc8Close(prefix: string): string {\n\tif (!prefix.includes(\"\\x1b]8;\")) {\n\t\treturn \"\";\n\t}\n\n\tlet activeHyperlink: ActiveHyperlink | null = null;\n\tlet i = 0;\n\twhile (i < prefix.length) {\n\t\tconst ansi = extractAnsiCode(prefix, i);\n\t\tif (ansi) {\n\t\t\tconst hyperlink = parseOsc8Hyperlink(ansi.code);\n\t\t\tif (hyperlink !== undefined) {\n\t\t\t\tactiveHyperlink = hyperlink;\n\t\t\t}\n\t\t\ti += ansi.length;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\treturn activeHyperlink ? formatOsc8Close(activeHyperlink.terminator) : \"\";\n}\n\n/**\n * Track active ANSI SGR codes to preserve styling across line breaks.\n */\nclass AnsiCodeTracker {\n\t// Track individual attributes separately so we can reset them specifically\n\tprivate bold = false;\n\tprivate dim = false;\n\tprivate italic = false;\n\tprivate underline = false;\n\tprivate blink = false;\n\tprivate inverse = false;\n\tprivate hidden = false;\n\tprivate strikethrough = false;\n\tprivate fgColor: string | null = null; // Stores the full code like \"31\" or \"38;5;240\"\n\tprivate bgColor: string | null = null; // Stores the full code like \"41\" or \"48;5;240\"\n\tprivate activeHyperlink: ActiveHyperlink | null = null;\n\n\tprocess(ansiCode: string): void {\n\t\t// OSC 8 hyperlink: \\x1b]8;;<url>\\x1b\\\\ (open) or \\x1b]8;;\\x1b\\\\ (close).\n\t\t// Preserve the original terminator because some terminals only make BEL-terminated\n\t\t// links clickable. OAuth login URLs use BEL, so reopening wrapped lines with ST\n\t\t// made only the first physical line clickable in those terminals.\n\t\tconst hyperlink = parseOsc8Hyperlink(ansiCode);\n\t\tif (hyperlink !== undefined) {\n\t\t\tthis.activeHyperlink = hyperlink;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!ansiCode.endsWith(\"m\")) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Extract the parameters between \\x1b[ and m\n\t\tconst match = ansiCode.match(/\\x1b\\[([\\d;]*)m/);\n\t\tif (!match) return;\n\n\t\tconst params = match[1];\n\t\tif (params === \"\" || params === \"0\") {\n\t\t\t// Full reset\n\t\t\tthis.reset();\n\t\t\treturn;\n\t\t}\n\n\t\t// Parse parameters (can be semicolon-separated)\n\t\tconst parts = params.split(\";\");\n\t\tlet i = 0;\n\t\twhile (i < parts.length) {\n\t\t\tconst code = Number.parseInt(parts[i], 10);\n\n\t\t\t// Handle 256-color and RGB codes which consume multiple parameters\n\t\t\tif (code === 38 || code === 48) {\n\t\t\t\t// 38;5;N (256 color fg) or 38;2;R;G;B (RGB fg)\n\t\t\t\t// 48;5;N (256 color bg) or 48;2;R;G;B (RGB bg)\n\t\t\t\tif (parts[i + 1] === \"5\" && parts[i + 2] !== undefined) {\n\t\t\t\t\t// 256 color: 38;5;N or 48;5;N\n\t\t\t\t\tconst colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]}`;\n\t\t\t\t\tif (code === 38) {\n\t\t\t\t\t\tthis.fgColor = colorCode;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.bgColor = colorCode;\n\t\t\t\t\t}\n\t\t\t\t\ti += 3;\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (parts[i + 1] === \"2\" && parts[i + 4] !== undefined) {\n\t\t\t\t\t// RGB color: 38;2;R;G;B or 48;2;R;G;B\n\t\t\t\t\tconst colorCode = `${parts[i]};${parts[i + 1]};${parts[i + 2]};${parts[i + 3]};${parts[i + 4]}`;\n\t\t\t\t\tif (code === 38) {\n\t\t\t\t\t\tthis.fgColor = colorCode;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.bgColor = colorCode;\n\t\t\t\t\t}\n\t\t\t\t\ti += 5;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Standard SGR codes\n\t\t\tswitch (code) {\n\t\t\t\tcase 0:\n\t\t\t\t\tthis.reset();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 1:\n\t\t\t\t\tthis.bold = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tthis.dim = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tthis.italic = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tthis.underline = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5:\n\t\t\t\t\tthis.blink = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 7:\n\t\t\t\t\tthis.inverse = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 8:\n\t\t\t\t\tthis.hidden = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 9:\n\t\t\t\t\tthis.strikethrough = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 21:\n\t\t\t\t\tthis.bold = false;\n\t\t\t\t\tbreak; // Some terminals\n\t\t\t\tcase 22:\n\t\t\t\t\tthis.bold = false;\n\t\t\t\t\tthis.dim = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 23:\n\t\t\t\t\tthis.italic = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 24:\n\t\t\t\t\tthis.underline = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 25:\n\t\t\t\t\tthis.blink = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 27:\n\t\t\t\t\tthis.inverse = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 28:\n\t\t\t\t\tthis.hidden = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 29:\n\t\t\t\t\tthis.strikethrough = false;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 39:\n\t\t\t\t\tthis.fgColor = null;\n\t\t\t\t\tbreak; // Default fg\n\t\t\t\tcase 49:\n\t\t\t\t\tthis.bgColor = null;\n\t\t\t\t\tbreak; // Default bg\n\t\t\t\tdefault:\n\t\t\t\t\t// Standard foreground colors 30-37, 90-97\n\t\t\t\t\tif ((code >= 30 && code <= 37) || (code >= 90 && code <= 97)) {\n\t\t\t\t\t\tthis.fgColor = String(code);\n\t\t\t\t\t}\n\t\t\t\t\t// Standard background colors 40-47, 100-107\n\t\t\t\t\telse if ((code >= 40 && code <= 47) || (code >= 100 && code <= 107)) {\n\t\t\t\t\t\tthis.bgColor = String(code);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\ti++;\n\t\t}\n\t}\n\n\tprivate reset(): void {\n\t\tthis.bold = false;\n\t\tthis.dim = false;\n\t\tthis.italic = false;\n\t\tthis.underline = false;\n\t\tthis.blink = false;\n\t\tthis.inverse = false;\n\t\tthis.hidden = false;\n\t\tthis.strikethrough = false;\n\t\tthis.fgColor = null;\n\t\tthis.bgColor = null;\n\t\t// SGR reset does not affect OSC 8 hyperlink state\n\t}\n\n\t/** Clear all state for reuse. */\n\tclear(): void {\n\t\tthis.reset();\n\t\tthis.activeHyperlink = null;\n\t}\n\n\tgetActiveCodes(): string {\n\t\tconst codes: string[] = [];\n\t\tif (this.bold) codes.push(\"1\");\n\t\tif (this.dim) codes.push(\"2\");\n\t\tif (this.italic) codes.push(\"3\");\n\t\tif (this.underline) codes.push(\"4\");\n\t\tif (this.blink) codes.push(\"5\");\n\t\tif (this.inverse) codes.push(\"7\");\n\t\tif (this.hidden) codes.push(\"8\");\n\t\tif (this.strikethrough) codes.push(\"9\");\n\t\tif (this.fgColor) codes.push(this.fgColor);\n\t\tif (this.bgColor) codes.push(this.bgColor);\n\n\t\tlet result = codes.length > 0 ? `\\x1b[${codes.join(\";\")}m` : \"\";\n\t\tif (this.activeHyperlink) {\n\t\t\tresult += formatOsc8Hyperlink(this.activeHyperlink);\n\t\t}\n\t\treturn result;\n\t}\n\n\thasActiveCodes(): boolean {\n\t\treturn (\n\t\t\tthis.bold ||\n\t\t\tthis.dim ||\n\t\t\tthis.italic ||\n\t\t\tthis.underline ||\n\t\t\tthis.blink ||\n\t\t\tthis.inverse ||\n\t\t\tthis.hidden ||\n\t\t\tthis.strikethrough ||\n\t\t\tthis.fgColor !== null ||\n\t\t\tthis.bgColor !== null ||\n\t\t\tthis.activeHyperlink !== null\n\t\t);\n\t}\n\n\t/**\n\t * Get reset codes for attributes that need to be turned off at line end.\n\t * Underline must be closed to prevent bleeding into padding.\n\t * Active OSC 8 hyperlinks must be closed and re-opened on the next line.\n\t * Returns empty string if no attributes need closing.\n\t */\n\tgetLineEndReset(): string {\n\t\tlet result = \"\";\n\t\tif (this.underline) {\n\t\t\tresult += \"\\x1b[24m\"; // Underline off only\n\t\t}\n\t\tif (this.activeHyperlink) {\n\t\t\tresult += formatOsc8Close(this.activeHyperlink.terminator); // Re-opened at line start via getActiveCodes()\n\t\t}\n\t\treturn result;\n\t}\n}\n\nfunction updateTrackerFromText(text: string, tracker: AnsiCodeTracker): void {\n\tlet i = 0;\n\twhile (i < text.length) {\n\t\tconst ansiResult = extractAnsiCode(text, i);\n\t\tif (ansiResult) {\n\t\t\ttracker.process(ansiResult.code);\n\t\t\ti += ansiResult.length;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n}\n\n/**\n * Split text into words while keeping ANSI codes attached.\n */\nfunction splitIntoTokensWithAnsi(text: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = \"\";\n\tlet pendingAnsi = \"\"; // ANSI codes waiting to be attached to next visible content\n\tlet currentKind: \"space\" | \"word\" | null = null;\n\tlet i = 0;\n\n\tconst flushCurrent = (): void => {\n\t\tif (!current) {\n\t\t\treturn;\n\t\t}\n\t\ttokens.push(current);\n\t\tcurrent = \"\";\n\t\tcurrentKind = null;\n\t};\n\n\twhile (i < text.length) {\n\t\tconst ansiResult = extractAnsiCode(text, i);\n\t\tif (ansiResult) {\n\t\t\t// Hold ANSI codes separately - they'll be attached to the next visible char\n\t\t\tpendingAnsi += ansiResult.code;\n\t\t\ti += ansiResult.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet end = i;\n\t\twhile (end < text.length && !extractAnsiCode(text, end)) {\n\t\t\tend++;\n\t\t}\n\n\t\tfor (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {\n\t\t\tconst segmentIsSpace = segment === \" \";\n\t\t\tif (!segmentIsSpace && cjkBreakRegex.test(segment)) {\n\t\t\t\tflushCurrent();\n\t\t\t\tconst token = pendingAnsi + segment;\n\t\t\t\tpendingAnsi = \"\";\n\t\t\t\ttokens.push(token);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst segmentKind = segmentIsSpace ? \"space\" : \"word\";\n\t\t\tif (current && currentKind !== segmentKind) {\n\t\t\t\tflushCurrent();\n\t\t\t}\n\n\t\t\t// Attach any pending ANSI codes to this visible character\n\t\t\tif (pendingAnsi) {\n\t\t\t\tcurrent += pendingAnsi;\n\t\t\t\tpendingAnsi = \"\";\n\t\t\t}\n\n\t\t\tcurrentKind = segmentKind;\n\t\t\tcurrent += segment;\n\t\t}\n\n\t\ti = end;\n\t}\n\n\t// Handle any remaining pending ANSI codes (attach to last token)\n\tif (pendingAnsi) {\n\t\tif (current) {\n\t\t\tcurrent += pendingAnsi;\n\t\t} else if (tokens.length > 0) {\n\t\t\ttokens[tokens.length - 1] += pendingAnsi;\n\t\t} else {\n\t\t\tcurrent = pendingAnsi;\n\t\t}\n\t}\n\n\tif (current) {\n\t\ttokens.push(current);\n\t}\n\n\treturn tokens;\n}\n\n/**\n * Wrap text with ANSI codes preserved.\n *\n * ONLY does word wrapping - NO padding, NO background colors.\n * Returns lines where each line is <= width visible chars.\n * Active ANSI codes are preserved across line breaks.\n *\n * @param text - Text to wrap (may contain ANSI codes and newlines)\n * @param width - Maximum visible width per line\n * @returns Array of wrapped lines (NOT padded to width)\n */\nexport function wrapTextWithAnsi(text: string, width: number): string[] {\n\tif (!text) {\n\t\treturn [\"\"];\n\t}\n\n\t// Handle newlines by processing each line separately\n\t// Track ANSI state across lines so styles carry over after literal newlines\n\tconst inputLines = text.split(/\\r\\n|\\r|\\n/);\n\tconst result: string[] = [];\n\tconst tracker = new AnsiCodeTracker();\n\n\tfor (const inputLine of inputLines) {\n\t\t// Prepend active ANSI codes from previous lines (except for first line)\n\t\tconst prefix = result.length > 0 ? tracker.getActiveCodes() : \"\";\n\t\tconst wrappedLines = wrapSingleLine(prefix + inputLine, width);\n\t\tfor (const wrappedLine of wrappedLines) {\n\t\t\tresult.push(wrappedLine);\n\t\t}\n\t\t// Update tracker with codes from this line for next iteration\n\t\tupdateTrackerFromText(inputLine, tracker);\n\t}\n\n\treturn result.length > 0 ? result : [\"\"];\n}\n\nfunction wrapSingleLine(line: string, width: number): string[] {\n\tif (!line) {\n\t\treturn [\"\"];\n\t}\n\n\tconst visibleLength = visibleWidth(line);\n\tif (visibleLength <= width) {\n\t\treturn [line];\n\t}\n\n\tconst wrapped: string[] = [];\n\tconst tracker = new AnsiCodeTracker();\n\tconst tokens = splitIntoTokensWithAnsi(line);\n\n\tlet currentLine = \"\";\n\tlet currentVisibleLength = 0;\n\n\tfor (const token of tokens) {\n\t\tconst tokenVisibleLength = visibleWidth(token);\n\t\tconst isWhitespace = token.trim() === \"\";\n\n\t\t// Token itself is too long - break it character by character\n\t\tif (tokenVisibleLength > width && !isWhitespace) {\n\t\t\tif (currentLine) {\n\t\t\t\t// Add specific reset for underline only (preserves background)\n\t\t\t\tconst lineEndReset = tracker.getLineEndReset();\n\t\t\t\tif (lineEndReset) {\n\t\t\t\t\tcurrentLine += lineEndReset;\n\t\t\t\t}\n\t\t\t\twrapped.push(currentLine);\n\t\t\t\tcurrentLine = \"\";\n\t\t\t\tcurrentVisibleLength = 0;\n\t\t\t}\n\n\t\t\t// Break long token - breakLongWord handles its own resets\n\t\t\tconst broken = breakLongWord(token, width, tracker);\n\t\t\tfor (let i = 0; i < broken.length - 1; i++) {\n\t\t\t\twrapped.push(broken[i]!);\n\t\t\t}\n\t\t\tcurrentLine = broken[broken.length - 1];\n\t\t\tcurrentVisibleLength = visibleWidth(currentLine);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check if adding this token would exceed width\n\t\tconst totalNeeded = currentVisibleLength + tokenVisibleLength;\n\n\t\tif (totalNeeded > width && currentVisibleLength > 0) {\n\t\t\t// Trim trailing whitespace, then add underline reset (not full reset, to preserve background)\n\t\t\tlet lineToWrap = currentLine.trimEnd();\n\t\t\tconst lineEndReset = tracker.getLineEndReset();\n\t\t\tif (lineEndReset) {\n\t\t\t\tlineToWrap += lineEndReset;\n\t\t\t}\n\t\t\twrapped.push(lineToWrap);\n\t\t\tif (isWhitespace) {\n\t\t\t\t// Don't start new line with whitespace\n\t\t\t\tcurrentLine = tracker.getActiveCodes();\n\t\t\t\tcurrentVisibleLength = 0;\n\t\t\t} else {\n\t\t\t\tcurrentLine = tracker.getActiveCodes() + token;\n\t\t\t\tcurrentVisibleLength = tokenVisibleLength;\n\t\t\t}\n\t\t} else {\n\t\t\t// Add to current line\n\t\t\tcurrentLine += token;\n\t\t\tcurrentVisibleLength += tokenVisibleLength;\n\t\t}\n\n\t\tupdateTrackerFromText(token, tracker);\n\t}\n\n\tif (currentLine) {\n\t\t// No reset at end of final line - let caller handle it\n\t\twrapped.push(currentLine);\n\t}\n\n\t// Trailing whitespace can cause lines to exceed the requested width\n\treturn wrapped.length > 0 ? wrapped.map((line) => line.trimEnd()) : [\"\"];\n}\n\nexport const PUNCTUATION_REGEX = /[(){}[\\]<>.,;:'\"!?+\\-=*/\\\\|&%^$#@~`]/;\n\n/**\n * Check if a character is whitespace.\n */\nexport function isWhitespaceChar(char: string): boolean {\n\treturn /\\s/.test(char);\n}\n\n/**\n * Check if a character is punctuation.\n */\nexport function isPunctuationChar(char: string): boolean {\n\treturn PUNCTUATION_REGEX.test(char);\n}\n\nfunction breakLongWord(word: string, width: number, tracker: AnsiCodeTracker): string[] {\n\tconst lines: string[] = [];\n\tlet currentLine = tracker.getActiveCodes();\n\tlet currentWidth = 0;\n\n\t// First, separate ANSI codes from visible content\n\t// We need to handle ANSI codes specially since they're not graphemes\n\tlet i = 0;\n\tconst segments: Array<{ type: \"ansi\" | \"grapheme\"; value: string }> = [];\n\n\twhile (i < word.length) {\n\t\tconst ansiResult = extractAnsiCode(word, i);\n\t\tif (ansiResult) {\n\t\t\tsegments.push({ type: \"ansi\", value: ansiResult.code });\n\t\t\ti += ansiResult.length;\n\t\t} else {\n\t\t\t// Find the next ANSI code or end of string\n\t\t\tlet end = i;\n\t\t\twhile (end < word.length) {\n\t\t\t\tconst nextAnsi = extractAnsiCode(word, end);\n\t\t\t\tif (nextAnsi) break;\n\t\t\t\tend++;\n\t\t\t}\n\t\t\t// Segment this non-ANSI portion into graphemes\n\t\t\tconst textPortion = word.slice(i, end);\n\t\t\tfor (const seg of graphemeSegmenter.segment(textPortion)) {\n\t\t\t\tsegments.push({ type: \"grapheme\", value: seg.segment });\n\t\t\t}\n\t\t\ti = end;\n\t\t}\n\t}\n\n\t// Now process segments\n\tfor (const seg of segments) {\n\t\tif (seg.type === \"ansi\") {\n\t\t\tcurrentLine += seg.value;\n\t\t\ttracker.process(seg.value);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst grapheme = seg.value;\n\t\t// Skip empty graphemes to avoid issues with string-width calculation\n\t\tif (!grapheme) continue;\n\n\t\tconst graphemeWidth = visibleWidth(grapheme);\n\n\t\tif (currentWidth + graphemeWidth > width) {\n\t\t\t// Add specific reset for underline only (preserves background)\n\t\t\tconst lineEndReset = tracker.getLineEndReset();\n\t\t\tif (lineEndReset) {\n\t\t\t\tcurrentLine += lineEndReset;\n\t\t\t}\n\t\t\tlines.push(currentLine);\n\t\t\tcurrentLine = tracker.getActiveCodes();\n\t\t\tcurrentWidth = 0;\n\t\t}\n\n\t\tcurrentLine += grapheme;\n\t\tcurrentWidth += graphemeWidth;\n\t}\n\n\tif (currentLine) {\n\t\t// No reset at end of final segment - caller handles continuation\n\t\tlines.push(currentLine);\n\t}\n\n\treturn lines.length > 0 ? lines : [\"\"];\n}\n\n/**\n * Apply background color to a line, padding to full width.\n *\n * @param line - Line of text (may contain ANSI codes)\n * @param width - Total width to pad to\n * @param bgFn - Background color function\n * @returns Line with background applied and padded to width\n */\nexport function applyBackgroundToLine(line: string, width: number, bgFn: (text: string) => string): string {\n\t// Calculate padding needed\n\tconst visibleLen = visibleWidth(line);\n\tconst paddingNeeded = Math.max(0, width - visibleLen);\n\tconst padding = \" \".repeat(paddingNeeded);\n\n\t// Apply background to content + padding\n\tconst withPadding = line + padding;\n\treturn bgFn(withPadding);\n}\n\n/**\n * Truncate text to fit within a maximum visible width, adding ellipsis if needed.\n * Optionally pad with spaces to reach exactly maxWidth.\n * Properly handles ANSI escape codes (they don't count toward width).\n *\n * @param text - Text to truncate (may contain ANSI codes)\n * @param maxWidth - Maximum visible width\n * @param ellipsis - Ellipsis string to append when truncating (default: \"...\")\n * @param pad - If true, pad result with spaces to exactly maxWidth (default: false)\n * @returns Truncated text, optionally padded to exactly maxWidth\n */\nexport function truncateToWidth(\n\ttext: string,\n\tmaxWidth: number,\n\tellipsis: string = \"...\",\n\tpad: boolean = false,\n): string {\n\tif (maxWidth <= 0) {\n\t\treturn \"\";\n\t}\n\n\tif (text.length === 0) {\n\t\treturn pad ? \" \".repeat(maxWidth) : \"\";\n\t}\n\n\tconst ellipsisWidth = visibleWidth(ellipsis);\n\tif (ellipsisWidth >= maxWidth) {\n\t\tconst textWidth = visibleWidth(text);\n\t\tif (textWidth <= maxWidth) {\n\t\t\treturn pad ? text + \" \".repeat(maxWidth - textWidth) : text;\n\t\t}\n\n\t\tconst clippedEllipsis = truncateFragmentToWidth(ellipsis, maxWidth);\n\t\tif (clippedEllipsis.width === 0) {\n\t\t\treturn pad ? \" \".repeat(maxWidth) : \"\";\n\t\t}\n\t\treturn finalizeTruncatedResult(\"\", 0, clippedEllipsis.text, clippedEllipsis.width, maxWidth, pad);\n\t}\n\n\tif (isPrintableAscii(text)) {\n\t\tif (text.length <= maxWidth) {\n\t\t\treturn pad ? text + \" \".repeat(maxWidth - text.length) : text;\n\t\t}\n\t\tconst targetWidth = maxWidth - ellipsisWidth;\n\t\treturn finalizeTruncatedResult(text.slice(0, targetWidth), targetWidth, ellipsis, ellipsisWidth, maxWidth, pad);\n\t}\n\n\tconst targetWidth = maxWidth - ellipsisWidth;\n\tlet result = \"\";\n\tlet pendingAnsi = \"\";\n\tlet visibleSoFar = 0;\n\tlet keptWidth = 0;\n\tlet keepContiguousPrefix = true;\n\tlet overflowed = false;\n\tlet exhaustedInput = false;\n\tconst hasAnsi = text.includes(\"\\x1b\");\n\tconst hasTabs = text.includes(\"\\t\");\n\n\tif (!hasAnsi && !hasTabs) {\n\t\tfor (const { segment } of graphemeSegmenter.segment(text)) {\n\t\t\tconst width = graphemeWidth(segment);\n\t\t\tif (keepContiguousPrefix && keptWidth + width <= targetWidth) {\n\t\t\t\tresult += segment;\n\t\t\t\tkeptWidth += width;\n\t\t\t} else {\n\t\t\t\tkeepContiguousPrefix = false;\n\t\t\t}\n\t\t\tvisibleSoFar += width;\n\t\t\tif (visibleSoFar > maxWidth) {\n\t\t\t\toverflowed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\texhaustedInput = !overflowed;\n\t} else {\n\t\tlet i = 0;\n\t\twhile (i < text.length) {\n\t\t\tconst ansi = extractAnsiCode(text, i);\n\t\t\tif (ansi) {\n\t\t\t\tpendingAnsi += ansi.code;\n\t\t\t\ti += ansi.length;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (text[i] === \"\\t\") {\n\t\t\t\tif (keepContiguousPrefix && keptWidth + 3 <= targetWidth) {\n\t\t\t\t\tif (pendingAnsi) {\n\t\t\t\t\t\tresult += pendingAnsi;\n\t\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t\t}\n\t\t\t\t\tresult += \"\\t\";\n\t\t\t\t\tkeptWidth += 3;\n\t\t\t\t} else {\n\t\t\t\t\tkeepContiguousPrefix = false;\n\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t}\n\t\t\t\tvisibleSoFar += 3;\n\t\t\t\tif (visibleSoFar > maxWidth) {\n\t\t\t\t\toverflowed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet end = i;\n\t\t\twhile (end < text.length && text[end] !== \"\\t\") {\n\t\t\t\tconst nextAnsi = extractAnsiCode(text, end);\n\t\t\t\tif (nextAnsi) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tend++;\n\t\t\t}\n\n\t\t\tfor (const { segment } of graphemeSegmenter.segment(text.slice(i, end))) {\n\t\t\t\tconst width = graphemeWidth(segment);\n\t\t\t\tif (keepContiguousPrefix && keptWidth + width <= targetWidth) {\n\t\t\t\t\tif (pendingAnsi) {\n\t\t\t\t\t\tresult += pendingAnsi;\n\t\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t\t}\n\t\t\t\t\tresult += segment;\n\t\t\t\t\tkeptWidth += width;\n\t\t\t\t} else {\n\t\t\t\t\tkeepContiguousPrefix = false;\n\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t}\n\n\t\t\t\tvisibleSoFar += width;\n\t\t\t\tif (visibleSoFar > maxWidth) {\n\t\t\t\t\toverflowed = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (overflowed) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ti = end;\n\t\t}\n\t\texhaustedInput = i >= text.length;\n\t}\n\n\tif (!overflowed && exhaustedInput) {\n\t\treturn pad ? text + \" \".repeat(Math.max(0, maxWidth - visibleSoFar)) : text;\n\t}\n\n\treturn finalizeTruncatedResult(result, keptWidth, ellipsis, ellipsisWidth, maxWidth, pad);\n}\n\n/**\n * Extract a range of visible columns from a line. Handles ANSI codes and wide chars.\n * @param strict - If true, exclude wide chars at boundary that would extend past the range\n */\nexport function sliceByColumn(line: string, startCol: number, length: number, strict = false): string {\n\treturn sliceWithWidth(line, startCol, length, strict).text;\n}\n\n/** Like sliceByColumn but also returns the actual visible width of the result. */\nexport function sliceWithWidth(\n\tline: string,\n\tstartCol: number,\n\tlength: number,\n\tstrict = false,\n): { text: string; width: number } {\n\tif (length <= 0) return { text: \"\", width: 0 };\n\tconst endCol = startCol + length;\n\tlet result = \"\",\n\t\tresultWidth = 0,\n\t\tcurrentCol = 0,\n\t\ti = 0,\n\t\tpendingAnsi = \"\";\n\n\twhile (i < line.length) {\n\t\tconst ansi = extractAnsiCode(line, i);\n\t\tif (ansi) {\n\t\t\tif (currentCol >= startCol && currentCol < endCol) result += ansi.code;\n\t\t\telse if (currentCol < startCol) pendingAnsi += ansi.code;\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet textEnd = i;\n\t\twhile (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\n\t\tfor (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n\t\t\tconst w = graphemeWidth(segment);\n\t\t\tconst inRange = currentCol >= startCol && currentCol < endCol;\n\t\t\tconst fits = !strict || currentCol + w <= endCol;\n\t\t\tif (inRange && fits) {\n\t\t\t\tif (pendingAnsi) {\n\t\t\t\t\tresult += pendingAnsi;\n\t\t\t\t\tpendingAnsi = \"\";\n\t\t\t\t}\n\t\t\t\tresult += segment;\n\t\t\t\tresultWidth += w;\n\t\t\t}\n\t\t\tcurrentCol += w;\n\t\t\tif (currentCol >= endCol) break;\n\t\t}\n\t\ti = textEnd;\n\t\tif (currentCol >= endCol) break;\n\t}\n\treturn { text: result, width: resultWidth };\n}\n\n// Pooled tracker instance for extractSegments (avoids allocation per call)\nconst pooledStyleTracker = new AnsiCodeTracker();\n\n/**\n * Extract \"before\" and \"after\" segments from a line in a single pass.\n * Used for overlay compositing where we need content before and after the overlay region.\n * Preserves styling from before the overlay that should affect content after it.\n */\nexport function extractSegments(\n\tline: string,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterLen: number,\n\tstrictAfter = false,\n): { before: string; beforeWidth: number; after: string; afterWidth: number } {\n\tlet before = \"\",\n\t\tbeforeWidth = 0,\n\t\tafter = \"\",\n\t\tafterWidth = 0;\n\tlet currentCol = 0,\n\t\ti = 0;\n\tlet pendingAnsiBefore = \"\";\n\tlet afterStarted = false;\n\tconst afterEnd = afterStart + afterLen;\n\n\t// Track styling state so \"after\" inherits styling from before the overlay\n\tpooledStyleTracker.clear();\n\n\twhile (i < line.length) {\n\t\tconst ansi = extractAnsiCode(line, i);\n\t\tif (ansi) {\n\t\t\t// Track all SGR codes to know styling state at afterStart\n\t\t\tpooledStyleTracker.process(ansi.code);\n\t\t\t// Include ANSI codes in their respective segments\n\t\t\tif (currentCol < beforeEnd) {\n\t\t\t\tpendingAnsiBefore += ansi.code;\n\t\t\t} else if (currentCol >= afterStart && currentCol < afterEnd && afterStarted) {\n\t\t\t\t// Only include after we've started \"after\" (styling already prepended)\n\t\t\t\tafter += ansi.code;\n\t\t\t}\n\t\t\ti += ansi.length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet textEnd = i;\n\t\twhile (textEnd < line.length && !extractAnsiCode(line, textEnd)) textEnd++;\n\n\t\tfor (const { segment } of graphemeSegmenter.segment(line.slice(i, textEnd))) {\n\t\t\tconst w = graphemeWidth(segment);\n\n\t\t\tif (currentCol < beforeEnd && currentCol + w <= beforeEnd) {\n\t\t\t\tif (pendingAnsiBefore) {\n\t\t\t\t\tbefore += pendingAnsiBefore;\n\t\t\t\t\tpendingAnsiBefore = \"\";\n\t\t\t\t}\n\t\t\t\tbefore += segment;\n\t\t\t\tbeforeWidth += w;\n\t\t\t} else if (currentCol >= afterStart && currentCol < afterEnd) {\n\t\t\t\tconst fits = !strictAfter || currentCol + w <= afterEnd;\n\t\t\t\tif (fits) {\n\t\t\t\t\t// On first \"after\" grapheme, prepend inherited styling from before overlay\n\t\t\t\t\tif (!afterStarted) {\n\t\t\t\t\t\tafter += pooledStyleTracker.getActiveCodes();\n\t\t\t\t\t\tafterStarted = true;\n\t\t\t\t\t}\n\t\t\t\t\tafter += segment;\n\t\t\t\t\tafterWidth += w;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcurrentCol += w;\n\t\t\t// Early exit: done with \"before\" only, or done with both segments\n\t\t\tif (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd) break;\n\t\t}\n\t\ti = textEnd;\n\t\tif (afterLen <= 0 ? currentCol >= beforeEnd : currentCol >= afterEnd) break;\n\t}\n\n\treturn { before, beforeWidth, after, afterWidth };\n}\n","// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\n/**\n * Fuzzy matching utilities.\n * Matches if all query characters appear in order (not necessarily consecutive).\n * Lower score = better match.\n */\n\nexport interface FuzzyMatch {\n\tmatches: boolean;\n\tscore: number;\n}\n\nexport function fuzzyMatch(query: string, text: string): FuzzyMatch {\n\tconst queryLower = query.toLowerCase();\n\tconst textLower = text.toLowerCase();\n\n\tconst matchQuery = (normalizedQuery: string): FuzzyMatch => {\n\t\tif (normalizedQuery.length === 0) {\n\t\t\treturn { matches: true, score: 0 };\n\t\t}\n\n\t\tif (normalizedQuery.length > textLower.length) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\n\t\tlet queryIndex = 0;\n\t\tlet score = 0;\n\t\tlet lastMatchIndex = -1;\n\t\tlet consecutiveMatches = 0;\n\n\t\tfor (let i = 0; i < textLower.length && queryIndex < normalizedQuery.length; i++) {\n\t\t\tif (textLower[i] === normalizedQuery[queryIndex]) {\n\t\t\t\tconst isWordBoundary = i === 0 || /[\\s\\-_./:]/.test(textLower[i - 1]!);\n\n\t\t\t\t// Reward consecutive matches\n\t\t\t\tif (lastMatchIndex === i - 1) {\n\t\t\t\t\tconsecutiveMatches++;\n\t\t\t\t\tscore -= consecutiveMatches * 5;\n\t\t\t\t} else {\n\t\t\t\t\tconsecutiveMatches = 0;\n\t\t\t\t\t// Penalize gaps\n\t\t\t\t\tif (lastMatchIndex >= 0) {\n\t\t\t\t\t\tscore += (i - lastMatchIndex - 1) * 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Reward word boundary matches\n\t\t\t\tif (isWordBoundary) {\n\t\t\t\t\tscore -= 10;\n\t\t\t\t}\n\n\t\t\t\t// Slight penalty for later matches\n\t\t\t\tscore += i * 0.1;\n\n\t\t\t\tlastMatchIndex = i;\n\t\t\t\tqueryIndex++;\n\t\t\t}\n\t\t}\n\n\t\tif (queryIndex < normalizedQuery.length) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\n\t\tif (normalizedQuery === textLower) {\n\t\t\tscore -= 100;\n\t\t}\n\n\t\treturn { matches: true, score };\n\t};\n\n\tconst primaryMatch = matchQuery(queryLower);\n\tif (primaryMatch.matches) {\n\t\treturn primaryMatch;\n\t}\n\n\tconst alphaNumericMatch = queryLower.match(/^(?<letters>[a-z]+)(?<digits>[0-9]+)$/);\n\tconst numericAlphaMatch = queryLower.match(/^(?<digits>[0-9]+)(?<letters>[a-z]+)$/);\n\tconst swappedQuery = alphaNumericMatch\n\t\t? `${alphaNumericMatch.groups?.digits ?? \"\"}${alphaNumericMatch.groups?.letters ?? \"\"}`\n\t\t: numericAlphaMatch\n\t\t\t? `${numericAlphaMatch.groups?.letters ?? \"\"}${numericAlphaMatch.groups?.digits ?? \"\"}`\n\t\t\t: \"\";\n\n\tif (!swappedQuery) {\n\t\treturn primaryMatch;\n\t}\n\n\tconst swappedMatch = matchQuery(swappedQuery);\n\tif (!swappedMatch.matches) {\n\t\treturn primaryMatch;\n\t}\n\n\treturn { matches: true, score: swappedMatch.score + 5 };\n}\n\n/**\n * Filter and sort items by fuzzy match quality (best matches first).\n * Supports whitespace- and slash-separated tokens: all tokens must match.\n */\nexport function fuzzyFilter<T>(items: T[], query: string, getText: (item: T) => string): T[] {\n\tif (!query.trim()) {\n\t\treturn items;\n\t}\n\n\tconst tokens = query\n\t\t.trim()\n\t\t.split(/[\\s/]+/)\n\t\t.filter((t) => t.length > 0);\n\n\tif (tokens.length === 0) {\n\t\treturn items;\n\t}\n\n\tconst results: { item: T; totalScore: number }[] = [];\n\n\tfor (const item of items) {\n\t\tconst text = getText(item);\n\t\tlet totalScore = 0;\n\t\tlet allMatch = true;\n\n\t\tfor (const token of tokens) {\n\t\t\tconst match = fuzzyMatch(token, text);\n\t\t\tif (match.matches) {\n\t\t\t\ttotalScore += match.score;\n\t\t\t} else {\n\t\t\t\tallMatch = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (allMatch) {\n\t\t\tresults.push({ item, totalScore });\n\t\t}\n\t}\n\n\tresults.sort((a, b) => a.totalScore - b.totalScore);\n\treturn results.map((r) => r.item);\n}\n","// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\n/**\n * Keyboard input handling for terminal applications.\n *\n * Supports both legacy terminal sequences and Kitty keyboard protocol.\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/\n * Reference: https://github.com/sst/opentui/blob/7da92b4088aebfe27b9f691c04163a48821e49fd/packages/core/src/lib/parse.keypress.ts\n *\n * Symbol keys are also supported, however some ctrl+symbol combos\n * overlap with ASCII codes, e.g. ctrl+[ = ESC.\n * See: https://sw.kovidgoyal.net/kitty/keyboard-protocol/#legacy-ctrl-mapping-of-ascii-keys\n * Those can still be * used for ctrl+shift combos\n *\n * API:\n * - matchesKey(data, keyId) - Check if input matches a key identifier\n * - parseKey(data) - Parse input and return the key identifier\n * - Key - Helper object for creating typed key identifiers\n * - setKittyProtocolActive(active) - Set global Kitty protocol state\n * - isKittyProtocolActive() - Query global Kitty protocol state\n */\n\n// =============================================================================\n// Global Kitty Protocol State\n// =============================================================================\n\nlet _kittyProtocolActive = false;\n\n/**\n * Set the global Kitty keyboard protocol state.\n * Called by ProcessTerminal after detecting protocol support.\n */\nexport function setKittyProtocolActive(active: boolean): void {\n\t_kittyProtocolActive = active;\n}\n\n/**\n * Query whether Kitty keyboard protocol is currently active.\n */\nexport function isKittyProtocolActive(): boolean {\n\treturn _kittyProtocolActive;\n}\n\n// =============================================================================\n// Type-Safe Key Identifiers\n// =============================================================================\n\ntype Letter =\n\t| \"a\"\n\t| \"b\"\n\t| \"c\"\n\t| \"d\"\n\t| \"e\"\n\t| \"f\"\n\t| \"g\"\n\t| \"h\"\n\t| \"i\"\n\t| \"j\"\n\t| \"k\"\n\t| \"l\"\n\t| \"m\"\n\t| \"n\"\n\t| \"o\"\n\t| \"p\"\n\t| \"q\"\n\t| \"r\"\n\t| \"s\"\n\t| \"t\"\n\t| \"u\"\n\t| \"v\"\n\t| \"w\"\n\t| \"x\"\n\t| \"y\"\n\t| \"z\";\n\ntype Digit = \"0\" | \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\" | \"7\" | \"8\" | \"9\";\n\ntype SymbolKey =\n\t| \"`\"\n\t| \"-\"\n\t| \"=\"\n\t| \"[\"\n\t| \"]\"\n\t| \"\\\\\"\n\t| \";\"\n\t| \"'\"\n\t| \",\"\n\t| \".\"\n\t| \"/\"\n\t| \"!\"\n\t| \"@\"\n\t| \"#\"\n\t| \"$\"\n\t| \"%\"\n\t| \"^\"\n\t| \"&\"\n\t| \"*\"\n\t| \"(\"\n\t| \")\"\n\t| \"_\"\n\t| \"+\"\n\t| \"|\"\n\t| \"~\"\n\t| \"{\"\n\t| \"}\"\n\t| \":\"\n\t| \"<\"\n\t| \">\"\n\t| \"?\";\n\ntype SpecialKey =\n\t| \"escape\"\n\t| \"esc\"\n\t| \"enter\"\n\t| \"return\"\n\t| \"tab\"\n\t| \"space\"\n\t| \"backspace\"\n\t| \"delete\"\n\t| \"insert\"\n\t| \"clear\"\n\t| \"home\"\n\t| \"end\"\n\t| \"pageUp\"\n\t| \"pageDown\"\n\t| \"up\"\n\t| \"down\"\n\t| \"left\"\n\t| \"right\"\n\t| \"f1\"\n\t| \"f2\"\n\t| \"f3\"\n\t| \"f4\"\n\t| \"f5\"\n\t| \"f6\"\n\t| \"f7\"\n\t| \"f8\"\n\t| \"f9\"\n\t| \"f10\"\n\t| \"f11\"\n\t| \"f12\";\n\ntype BaseKey = Letter | Digit | SymbolKey | SpecialKey;\ntype ModifierName = \"ctrl\" | \"shift\" | \"alt\" | \"super\";\n\ntype ModifiedKeyId<Key extends string, RemainingModifiers extends ModifierName = ModifierName> = {\n\t[M in RemainingModifiers]: `${M}+${Key}` | `${M}+${ModifiedKeyId<Key, Exclude<RemainingModifiers, M>>}`;\n}[RemainingModifiers];\n\n/**\n * Union type of all valid key identifiers.\n * Provides autocomplete and catches typos at compile time.\n */\nexport type KeyId = BaseKey | ModifiedKeyId<BaseKey>;\n\n/**\n * Helper object for creating typed key identifiers with autocomplete.\n *\n * Usage:\n * - Key.escape, Key.enter, Key.tab, etc. for special keys\n * - Key.backtick, Key.comma, Key.period, etc. for symbol keys\n * - Key.ctrl(\"c\"), Key.alt(\"x\"), Key.super(\"k\") for single modifiers\n * - Key.ctrlShift(\"p\"), Key.ctrlAlt(\"x\"), Key.ctrlSuper(\"k\") for combined modifiers\n */\nexport const Key = {\n\t// Special keys\n\tescape: \"escape\" as const,\n\tesc: \"esc\" as const,\n\tenter: \"enter\" as const,\n\treturn: \"return\" as const,\n\ttab: \"tab\" as const,\n\tspace: \"space\" as const,\n\tbackspace: \"backspace\" as const,\n\tdelete: \"delete\" as const,\n\tinsert: \"insert\" as const,\n\tclear: \"clear\" as const,\n\thome: \"home\" as const,\n\tend: \"end\" as const,\n\tpageUp: \"pageUp\" as const,\n\tpageDown: \"pageDown\" as const,\n\tup: \"up\" as const,\n\tdown: \"down\" as const,\n\tleft: \"left\" as const,\n\tright: \"right\" as const,\n\tf1: \"f1\" as const,\n\tf2: \"f2\" as const,\n\tf3: \"f3\" as const,\n\tf4: \"f4\" as const,\n\tf5: \"f5\" as const,\n\tf6: \"f6\" as const,\n\tf7: \"f7\" as const,\n\tf8: \"f8\" as const,\n\tf9: \"f9\" as const,\n\tf10: \"f10\" as const,\n\tf11: \"f11\" as const,\n\tf12: \"f12\" as const,\n\n\t// Symbol keys\n\tbacktick: \"`\" as const,\n\thyphen: \"-\" as const,\n\tequals: \"=\" as const,\n\tleftbracket: \"[\" as const,\n\trightbracket: \"]\" as const,\n\tbackslash: \"\\\\\" as const,\n\tsemicolon: \";\" as const,\n\tquote: \"'\" as const,\n\tcomma: \",\" as const,\n\tperiod: \".\" as const,\n\tslash: \"/\" as const,\n\texclamation: \"!\" as const,\n\tat: \"@\" as const,\n\thash: \"#\" as const,\n\tdollar: \"$\" as const,\n\tpercent: \"%\" as const,\n\tcaret: \"^\" as const,\n\tampersand: \"&\" as const,\n\tasterisk: \"*\" as const,\n\tleftparen: \"(\" as const,\n\trightparen: \")\" as const,\n\tunderscore: \"_\" as const,\n\tplus: \"+\" as const,\n\tpipe: \"|\" as const,\n\ttilde: \"~\" as const,\n\tleftbrace: \"{\" as const,\n\trightbrace: \"}\" as const,\n\tcolon: \":\" as const,\n\tlessthan: \"<\" as const,\n\tgreaterthan: \">\" as const,\n\tquestion: \"?\" as const,\n\n\t// Single modifiers\n\tctrl: <K extends BaseKey>(key: K): `ctrl+${K}` => `ctrl+${key}`,\n\tshift: <K extends BaseKey>(key: K): `shift+${K}` => `shift+${key}`,\n\talt: <K extends BaseKey>(key: K): `alt+${K}` => `alt+${key}`,\n\tsuper: <K extends BaseKey>(key: K): `super+${K}` => `super+${key}`,\n\n\t// Combined modifiers\n\tctrlShift: <K extends BaseKey>(key: K): `ctrl+shift+${K}` => `ctrl+shift+${key}`,\n\tshiftCtrl: <K extends BaseKey>(key: K): `shift+ctrl+${K}` => `shift+ctrl+${key}`,\n\tctrlAlt: <K extends BaseKey>(key: K): `ctrl+alt+${K}` => `ctrl+alt+${key}`,\n\taltCtrl: <K extends BaseKey>(key: K): `alt+ctrl+${K}` => `alt+ctrl+${key}`,\n\tshiftAlt: <K extends BaseKey>(key: K): `shift+alt+${K}` => `shift+alt+${key}`,\n\taltShift: <K extends BaseKey>(key: K): `alt+shift+${K}` => `alt+shift+${key}`,\n\tctrlSuper: <K extends BaseKey>(key: K): `ctrl+super+${K}` => `ctrl+super+${key}`,\n\tsuperCtrl: <K extends BaseKey>(key: K): `super+ctrl+${K}` => `super+ctrl+${key}`,\n\tshiftSuper: <K extends BaseKey>(key: K): `shift+super+${K}` => `shift+super+${key}`,\n\tsuperShift: <K extends BaseKey>(key: K): `super+shift+${K}` => `super+shift+${key}`,\n\taltSuper: <K extends BaseKey>(key: K): `alt+super+${K}` => `alt+super+${key}`,\n\tsuperAlt: <K extends BaseKey>(key: K): `super+alt+${K}` => `super+alt+${key}`,\n\n\t// Triple modifiers\n\tctrlShiftAlt: <K extends BaseKey>(key: K): `ctrl+shift+alt+${K}` => `ctrl+shift+alt+${key}`,\n\tctrlShiftSuper: <K extends BaseKey>(key: K): `ctrl+shift+super+${K}` => `ctrl+shift+super+${key}`,\n} as const;\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst SYMBOL_KEYS = new Set([\n\t\"`\",\n\t\"-\",\n\t\"=\",\n\t\"[\",\n\t\"]\",\n\t\"\\\\\",\n\t\";\",\n\t\"'\",\n\t\",\",\n\t\".\",\n\t\"/\",\n\t\"!\",\n\t\"@\",\n\t\"#\",\n\t\"$\",\n\t\"%\",\n\t\"^\",\n\t\"&\",\n\t\"*\",\n\t\"(\",\n\t\")\",\n\t\"_\",\n\t\"+\",\n\t\"|\",\n\t\"~\",\n\t\"{\",\n\t\"}\",\n\t\":\",\n\t\"<\",\n\t\">\",\n\t\"?\",\n]);\n\nconst MODIFIERS = {\n\tshift: 1,\n\talt: 2,\n\tctrl: 4,\n\tsuper: 8,\n} as const;\n\nconst LOCK_MASK = 64 + 128; // Caps Lock + Num Lock\n\nconst CODEPOINTS = {\n\tescape: 27,\n\ttab: 9,\n\tenter: 13,\n\tspace: 32,\n\tbackspace: 127,\n\tkpEnter: 57414, // Numpad Enter (Kitty protocol)\n} as const;\n\nconst ARROW_CODEPOINTS = {\n\tup: -1,\n\tdown: -2,\n\tright: -3,\n\tleft: -4,\n} as const;\n\nconst FUNCTIONAL_CODEPOINTS = {\n\tdelete: -10,\n\tinsert: -11,\n\tpageUp: -12,\n\tpageDown: -13,\n\thome: -14,\n\tend: -15,\n} as const;\n\nconst KITTY_FUNCTIONAL_KEY_EQUIVALENTS = new Map<number, number>([\n\t[57399, 48], // KP_0 -> 0\n\t[57400, 49], // KP_1 -> 1\n\t[57401, 50], // KP_2 -> 2\n\t[57402, 51], // KP_3 -> 3\n\t[57403, 52], // KP_4 -> 4\n\t[57404, 53], // KP_5 -> 5\n\t[57405, 54], // KP_6 -> 6\n\t[57406, 55], // KP_7 -> 7\n\t[57407, 56], // KP_8 -> 8\n\t[57408, 57], // KP_9 -> 9\n\t[57409, 46], // KP_DECIMAL -> .\n\t[57410, 47], // KP_DIVIDE -> /\n\t[57411, 42], // KP_MULTIPLY -> *\n\t[57412, 45], // KP_SUBTRACT -> -\n\t[57413, 43], // KP_ADD -> +\n\t[57415, 61], // KP_EQUAL -> =\n\t[57416, 44], // KP_SEPARATOR -> ,\n\t[57417, ARROW_CODEPOINTS.left],\n\t[57418, ARROW_CODEPOINTS.right],\n\t[57419, ARROW_CODEPOINTS.up],\n\t[57420, ARROW_CODEPOINTS.down],\n\t[57421, FUNCTIONAL_CODEPOINTS.pageUp],\n\t[57422, FUNCTIONAL_CODEPOINTS.pageDown],\n\t[57423, FUNCTIONAL_CODEPOINTS.home],\n\t[57424, FUNCTIONAL_CODEPOINTS.end],\n\t[57425, FUNCTIONAL_CODEPOINTS.insert],\n\t[57426, FUNCTIONAL_CODEPOINTS.delete],\n]);\n\nfunction normalizeKittyFunctionalCodepoint(codepoint: number): number {\n\treturn KITTY_FUNCTIONAL_KEY_EQUIVALENTS.get(codepoint) ?? codepoint;\n}\n\nfunction normalizeShiftedLetterIdentityCodepoint(codepoint: number, modifier: number): number {\n\tconst effectiveModifier = modifier & ~LOCK_MASK;\n\tif ((effectiveModifier & MODIFIERS.shift) !== 0 && codepoint >= 65 && codepoint <= 90) {\n\t\treturn codepoint + 32;\n\t}\n\treturn codepoint;\n}\n\nconst LEGACY_KEY_SEQUENCES = {\n\tup: [\"\\x1b[A\", \"\\x1bOA\"],\n\tdown: [\"\\x1b[B\", \"\\x1bOB\"],\n\tright: [\"\\x1b[C\", \"\\x1bOC\"],\n\tleft: [\"\\x1b[D\", \"\\x1bOD\"],\n\thome: [\"\\x1b[H\", \"\\x1bOH\", \"\\x1b[1~\", \"\\x1b[7~\"],\n\tend: [\"\\x1b[F\", \"\\x1bOF\", \"\\x1b[4~\", \"\\x1b[8~\"],\n\tinsert: [\"\\x1b[2~\"],\n\tdelete: [\"\\x1b[3~\"],\n\tpageUp: [\"\\x1b[5~\", \"\\x1b[[5~\"],\n\tpageDown: [\"\\x1b[6~\", \"\\x1b[[6~\"],\n\tclear: [\"\\x1b[E\", \"\\x1bOE\"],\n\tf1: [\"\\x1bOP\", \"\\x1b[11~\", \"\\x1b[[A\"],\n\tf2: [\"\\x1bOQ\", \"\\x1b[12~\", \"\\x1b[[B\"],\n\tf3: [\"\\x1bOR\", \"\\x1b[13~\", \"\\x1b[[C\"],\n\tf4: [\"\\x1bOS\", \"\\x1b[14~\", \"\\x1b[[D\"],\n\tf5: [\"\\x1b[15~\", \"\\x1b[[E\"],\n\tf6: [\"\\x1b[17~\"],\n\tf7: [\"\\x1b[18~\"],\n\tf8: [\"\\x1b[19~\"],\n\tf9: [\"\\x1b[20~\"],\n\tf10: [\"\\x1b[21~\"],\n\tf11: [\"\\x1b[23~\"],\n\tf12: [\"\\x1b[24~\"],\n} as const;\n\nconst LEGACY_SHIFT_SEQUENCES = {\n\tup: [\"\\x1b[a\"],\n\tdown: [\"\\x1b[b\"],\n\tright: [\"\\x1b[c\"],\n\tleft: [\"\\x1b[d\"],\n\tclear: [\"\\x1b[e\"],\n\tinsert: [\"\\x1b[2$\"],\n\tdelete: [\"\\x1b[3$\"],\n\tpageUp: [\"\\x1b[5$\"],\n\tpageDown: [\"\\x1b[6$\"],\n\thome: [\"\\x1b[7$\"],\n\tend: [\"\\x1b[8$\"],\n} as const;\n\nconst LEGACY_CTRL_SEQUENCES = {\n\tup: [\"\\x1bOa\"],\n\tdown: [\"\\x1bOb\"],\n\tright: [\"\\x1bOc\"],\n\tleft: [\"\\x1bOd\"],\n\tclear: [\"\\x1bOe\"],\n\tinsert: [\"\\x1b[2^\"],\n\tdelete: [\"\\x1b[3^\"],\n\tpageUp: [\"\\x1b[5^\"],\n\tpageDown: [\"\\x1b[6^\"],\n\thome: [\"\\x1b[7^\"],\n\tend: [\"\\x1b[8^\"],\n} as const;\n\nconst LEGACY_SEQUENCE_KEY_IDS: Record<string, KeyId> = {\n\t\"\\x1bOA\": \"up\",\n\t\"\\x1bOB\": \"down\",\n\t\"\\x1bOC\": \"right\",\n\t\"\\x1bOD\": \"left\",\n\t\"\\x1bOH\": \"home\",\n\t\"\\x1bOF\": \"end\",\n\t\"\\x1b[E\": \"clear\",\n\t\"\\x1bOE\": \"clear\",\n\t\"\\x1bOe\": \"ctrl+clear\",\n\t\"\\x1b[e\": \"shift+clear\",\n\t\"\\x1b[2~\": \"insert\",\n\t\"\\x1b[2$\": \"shift+insert\",\n\t\"\\x1b[2^\": \"ctrl+insert\",\n\t\"\\x1b[3$\": \"shift+delete\",\n\t\"\\x1b[3^\": \"ctrl+delete\",\n\t\"\\x1b[[5~\": \"pageUp\",\n\t\"\\x1b[[6~\": \"pageDown\",\n\t\"\\x1b[a\": \"shift+up\",\n\t\"\\x1b[b\": \"shift+down\",\n\t\"\\x1b[c\": \"shift+right\",\n\t\"\\x1b[d\": \"shift+left\",\n\t\"\\x1bOa\": \"ctrl+up\",\n\t\"\\x1bOb\": \"ctrl+down\",\n\t\"\\x1bOc\": \"ctrl+right\",\n\t\"\\x1bOd\": \"ctrl+left\",\n\t\"\\x1b[5$\": \"shift+pageUp\",\n\t\"\\x1b[6$\": \"shift+pageDown\",\n\t\"\\x1b[7$\": \"shift+home\",\n\t\"\\x1b[8$\": \"shift+end\",\n\t\"\\x1b[5^\": \"ctrl+pageUp\",\n\t\"\\x1b[6^\": \"ctrl+pageDown\",\n\t\"\\x1b[7^\": \"ctrl+home\",\n\t\"\\x1b[8^\": \"ctrl+end\",\n\t\"\\x1bOP\": \"f1\",\n\t\"\\x1bOQ\": \"f2\",\n\t\"\\x1bOR\": \"f3\",\n\t\"\\x1bOS\": \"f4\",\n\t\"\\x1b[11~\": \"f1\",\n\t\"\\x1b[12~\": \"f2\",\n\t\"\\x1b[13~\": \"f3\",\n\t\"\\x1b[14~\": \"f4\",\n\t\"\\x1b[[A\": \"f1\",\n\t\"\\x1b[[B\": \"f2\",\n\t\"\\x1b[[C\": \"f3\",\n\t\"\\x1b[[D\": \"f4\",\n\t\"\\x1b[[E\": \"f5\",\n\t\"\\x1b[15~\": \"f5\",\n\t\"\\x1b[17~\": \"f6\",\n\t\"\\x1b[18~\": \"f7\",\n\t\"\\x1b[19~\": \"f8\",\n\t\"\\x1b[20~\": \"f9\",\n\t\"\\x1b[21~\": \"f10\",\n\t\"\\x1b[23~\": \"f11\",\n\t\"\\x1b[24~\": \"f12\",\n\t\"\\x1bb\": \"alt+left\",\n\t\"\\x1bf\": \"alt+right\",\n\t\"\\x1bp\": \"alt+up\",\n\t\"\\x1bn\": \"alt+down\",\n} as const;\n\ntype LegacyModifierKey = keyof typeof LEGACY_SHIFT_SEQUENCES;\n\nconst matchesLegacySequence = (data: string, sequences: readonly string[]): boolean => sequences.includes(data);\n\nconst matchesLegacyModifierSequence = (data: string, key: LegacyModifierKey, modifier: number): boolean => {\n\tif (modifier === MODIFIERS.shift) {\n\t\treturn matchesLegacySequence(data, LEGACY_SHIFT_SEQUENCES[key]);\n\t}\n\tif (modifier === MODIFIERS.ctrl) {\n\t\treturn matchesLegacySequence(data, LEGACY_CTRL_SEQUENCES[key]);\n\t}\n\treturn false;\n};\n\n// =============================================================================\n// Kitty Protocol Parsing\n// =============================================================================\n\n/**\n * Event types from Kitty keyboard protocol (flag 2)\n * 1 = key press, 2 = key repeat, 3 = key release\n */\nexport type KeyEventType = \"press\" | \"repeat\" | \"release\";\n\ninterface ParsedKittySequence {\n\tcodepoint: number;\n\tshiftedKey?: number; // Shifted version of the key (when shift is pressed)\n\tbaseLayoutKey?: number; // Key in standard PC-101 layout (for non-Latin layouts)\n\tmodifier: number;\n\teventType: KeyEventType;\n}\n\ninterface ParsedModifyOtherKeysSequence {\n\tcodepoint: number;\n\tmodifier: number;\n}\n\n// Store the last parsed event type for isKeyRelease() to query\nlet _lastEventType: KeyEventType = \"press\";\n\n/**\n * Check if the last parsed key event was a key release.\n * Only meaningful when Kitty keyboard protocol with flag 2 is active.\n */\nexport function isKeyRelease(data: string): boolean {\n\t// Don't treat bracketed paste content as key release, even if it contains\n\t// patterns like \":3F\" (e.g., bluetooth MAC addresses like \"90:62:3F:A5\").\n\t// Terminal.ts re-wraps paste content with bracketed paste markers before\n\t// passing to TUI, so pasted data will always contain \\x1b[200~.\n\tif (data.includes(\"\\x1b[200~\")) {\n\t\treturn false;\n\t}\n\n\t// Quick check: release events with flag 2 contain \":3\"\n\t// Format: \\x1b[<codepoint>;<modifier>:3u\n\tif (\n\t\tdata.includes(\":3u\") ||\n\t\tdata.includes(\":3~\") ||\n\t\tdata.includes(\":3A\") ||\n\t\tdata.includes(\":3B\") ||\n\t\tdata.includes(\":3C\") ||\n\t\tdata.includes(\":3D\") ||\n\t\tdata.includes(\":3H\") ||\n\t\tdata.includes(\":3F\")\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\n/**\n * Check if the last parsed key event was a key repeat.\n * Only meaningful when Kitty keyboard protocol with flag 2 is active.\n */\nexport function isKeyRepeat(data: string): boolean {\n\t// Don't treat bracketed paste content as key repeat, even if it contains\n\t// patterns like \":2F\". See isKeyRelease() for details.\n\tif (data.includes(\"\\x1b[200~\")) {\n\t\treturn false;\n\t}\n\n\tif (\n\t\tdata.includes(\":2u\") ||\n\t\tdata.includes(\":2~\") ||\n\t\tdata.includes(\":2A\") ||\n\t\tdata.includes(\":2B\") ||\n\t\tdata.includes(\":2C\") ||\n\t\tdata.includes(\":2D\") ||\n\t\tdata.includes(\":2H\") ||\n\t\tdata.includes(\":2F\")\n\t) {\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction parseEventType(eventTypeStr: string | undefined): KeyEventType {\n\tif (!eventTypeStr) return \"press\";\n\tconst eventType = parseInt(eventTypeStr, 10);\n\tif (eventType === 2) return \"repeat\";\n\tif (eventType === 3) return \"release\";\n\treturn \"press\";\n}\n\nfunction parseKittySequence(data: string): ParsedKittySequence | null {\n\t// CSI u format with alternate keys (flag 4):\n\t// \\x1b[<codepoint>u\n\t// \\x1b[<codepoint>;<mod>u\n\t// \\x1b[<codepoint>;<mod>:<event>u\n\t// \\x1b[<codepoint>:<shifted>;<mod>u\n\t// \\x1b[<codepoint>:<shifted>:<base>;<mod>u\n\t// \\x1b[<codepoint>::<base>;<mod>u (no shifted key, only base)\n\t//\n\t// With flag 2, event type is appended after modifier colon: 1=press, 2=repeat, 3=release\n\t// With flag 4, alternate keys are appended after codepoint with colons\n\tconst csiUMatch = data.match(/^\\x1b\\[(\\d+)(?::(\\d*))?(?::(\\d+))?(?:;(\\d+))?(?::(\\d+))?u$/);\n\tif (csiUMatch) {\n\t\tconst codepoint = parseInt(csiUMatch[1]!, 10);\n\t\tconst shiftedKey = csiUMatch[2] && csiUMatch[2].length > 0 ? parseInt(csiUMatch[2], 10) : undefined;\n\t\tconst baseLayoutKey = csiUMatch[3] ? parseInt(csiUMatch[3], 10) : undefined;\n\t\tconst modValue = csiUMatch[4] ? parseInt(csiUMatch[4], 10) : 1;\n\t\tconst eventType = parseEventType(csiUMatch[5]);\n\t\t_lastEventType = eventType;\n\t\treturn { codepoint, shiftedKey, baseLayoutKey, modifier: modValue - 1, eventType };\n\t}\n\n\t// Arrow keys with modifier: \\x1b[1;<mod>A/B/C/D or \\x1b[1;<mod>:<event>A/B/C/D\n\tconst arrowMatch = data.match(/^\\x1b\\[1;(\\d+)(?::(\\d+))?([ABCD])$/);\n\tif (arrowMatch) {\n\t\tconst modValue = parseInt(arrowMatch[1]!, 10);\n\t\tconst eventType = parseEventType(arrowMatch[2]);\n\t\tconst arrowCodes: Record<string, number> = { A: -1, B: -2, C: -3, D: -4 };\n\t\t_lastEventType = eventType;\n\t\treturn { codepoint: arrowCodes[arrowMatch[3]!]!, modifier: modValue - 1, eventType };\n\t}\n\n\t// Functional keys: \\x1b[<num>~ or \\x1b[<num>;<mod>~ or \\x1b[<num>;<mod>:<event>~\n\tconst funcMatch = data.match(/^\\x1b\\[(\\d+)(?:;(\\d+))?(?::(\\d+))?~$/);\n\tif (funcMatch) {\n\t\tconst keyNum = parseInt(funcMatch[1]!, 10);\n\t\tconst modValue = funcMatch[2] ? parseInt(funcMatch[2], 10) : 1;\n\t\tconst eventType = parseEventType(funcMatch[3]);\n\t\tconst funcCodes: Record<number, number> = {\n\t\t\t2: FUNCTIONAL_CODEPOINTS.insert,\n\t\t\t3: FUNCTIONAL_CODEPOINTS.delete,\n\t\t\t5: FUNCTIONAL_CODEPOINTS.pageUp,\n\t\t\t6: FUNCTIONAL_CODEPOINTS.pageDown,\n\t\t\t7: FUNCTIONAL_CODEPOINTS.home,\n\t\t\t8: FUNCTIONAL_CODEPOINTS.end,\n\t\t};\n\t\tconst codepoint = funcCodes[keyNum];\n\t\tif (codepoint !== undefined) {\n\t\t\t_lastEventType = eventType;\n\t\t\treturn { codepoint, modifier: modValue - 1, eventType };\n\t\t}\n\t}\n\n\t// Home/End with modifier: \\x1b[1;<mod>H/F or \\x1b[1;<mod>:<event>H/F\n\tconst homeEndMatch = data.match(/^\\x1b\\[1;(\\d+)(?::(\\d+))?([HF])$/);\n\tif (homeEndMatch) {\n\t\tconst modValue = parseInt(homeEndMatch[1]!, 10);\n\t\tconst eventType = parseEventType(homeEndMatch[2]);\n\t\tconst codepoint = homeEndMatch[3] === \"H\" ? FUNCTIONAL_CODEPOINTS.home : FUNCTIONAL_CODEPOINTS.end;\n\t\t_lastEventType = eventType;\n\t\treturn { codepoint, modifier: modValue - 1, eventType };\n\t}\n\n\treturn null;\n}\n\nfunction matchesKittySequence(data: string, expectedCodepoint: number, expectedModifier: number): boolean {\n\tconst parsed = parseKittySequence(data);\n\tif (!parsed) return false;\n\tconst actualMod = parsed.modifier & ~LOCK_MASK;\n\tconst expectedMod = expectedModifier & ~LOCK_MASK;\n\n\t// Check if modifiers match\n\tif (actualMod !== expectedMod) return false;\n\n\tconst normalizedCodepoint = normalizeShiftedLetterIdentityCodepoint(\n\t\tnormalizeKittyFunctionalCodepoint(parsed.codepoint),\n\t\tparsed.modifier,\n\t);\n\tconst normalizedExpectedCodepoint = normalizeShiftedLetterIdentityCodepoint(\n\t\tnormalizeKittyFunctionalCodepoint(expectedCodepoint),\n\t\texpectedModifier,\n\t);\n\n\t// Primary match: codepoint matches directly after normalizing functional keys\n\tif (normalizedCodepoint === normalizedExpectedCodepoint) return true;\n\n\t// Alternate match: use base layout key for non-Latin keyboard layouts.\n\t// This allows Ctrl+С (Cyrillic) to match Ctrl+c (Latin) when terminal reports\n\t// the base layout key (the key in standard PC-101 layout).\n\t//\n\t// Only fall back to base layout key when the codepoint is NOT already a\n\t// recognized Latin letter (a-z) or symbol (e.g., /, -, [, ;, etc.).\n\t// When the codepoint is a recognized key, it is authoritative regardless\n\t// of physical key position. This prevents remapped layouts (Dvorak, Colemak,\n\t// xremap, etc.) from causing false matches: both letters and symbols move\n\t// to different physical positions, so Ctrl+K could falsely match Ctrl+V\n\t// (letter remapping) and Ctrl+/ could falsely match Ctrl+[ (symbol remapping)\n\t// if the base layout key were always considered.\n\tif (parsed.baseLayoutKey !== undefined && parsed.baseLayoutKey === expectedCodepoint) {\n\t\tconst cp = normalizedCodepoint;\n\t\tconst isLatinLetter = cp >= 97 && cp <= 122; // a-z\n\t\tconst isKnownSymbol = SYMBOL_KEYS.has(String.fromCharCode(cp));\n\t\tif (!isLatinLetter && !isKnownSymbol) return true;\n\t}\n\n\treturn false;\n}\n\nfunction parseModifyOtherKeysSequence(data: string): ParsedModifyOtherKeysSequence | null {\n\tconst match = data.match(/^\\x1b\\[27;(\\d+);(\\d+)~$/);\n\tif (!match) return null;\n\tconst modValue = parseInt(match[1]!, 10);\n\tconst codepoint = parseInt(match[2]!, 10);\n\treturn { codepoint, modifier: modValue - 1 };\n}\n\n/**\n * Match xterm modifyOtherKeys format: CSI 27 ; modifiers ; keycode ~\n * This is used by terminals when Kitty protocol is not enabled.\n * Modifier values are 1-indexed: 2=shift, 3=alt, 5=ctrl, etc.\n */\nfunction matchesModifyOtherKeys(data: string, expectedKeycode: number, expectedModifier: number): boolean {\n\tconst parsed = parseModifyOtherKeysSequence(data);\n\tif (!parsed) return false;\n\treturn parsed.codepoint === expectedKeycode && parsed.modifier === expectedModifier;\n}\n\nfunction isWindowsTerminalSession(): boolean {\n\treturn (\n\t\tBoolean(process.env.WT_SESSION) && !process.env.SSH_CONNECTION && !process.env.SSH_CLIENT && !process.env.SSH_TTY\n\t);\n}\n\n/**\n * Raw 0x08 (BS) is ambiguous in legacy terminals.\n *\n * - Windows Terminal uses it for Ctrl+Backspace.\n * - Some legacy terminals and tmux setups send it for plain Backspace.\n *\n * Prefer explicit Kitty / CSI-u / modifyOtherKeys sequences whenever they are\n * available. Fall back to a Windows Terminal heuristic only for raw BS bytes.\n */\nfunction matchesRawBackspace(data: string, expectedModifier: number): boolean {\n\tif (data === \"\\x7f\") return expectedModifier === 0;\n\tif (data !== \"\\x08\") return false;\n\treturn isWindowsTerminalSession() ? expectedModifier === MODIFIERS.ctrl : expectedModifier === 0;\n}\n\n// =============================================================================\n// Generic Key Matching\n// =============================================================================\n\n/**\n * Get the control character for a key.\n * Uses the universal formula: code & 0x1f (mask to lower 5 bits)\n *\n * Works for:\n * - Letters a-z → 1-26\n * - Symbols [\\]_ → 27, 28, 29, 31\n * - Also maps - to same as _ (same physical key on US keyboards)\n */\nfunction rawCtrlChar(key: string): string | null {\n\tconst char = key.toLowerCase();\n\tconst code = char.charCodeAt(0);\n\tif ((code >= 97 && code <= 122) || char === \"[\" || char === \"\\\\\" || char === \"]\" || char === \"_\") {\n\t\treturn String.fromCharCode(code & 0x1f);\n\t}\n\t// Handle - as _ (same physical key on US keyboards)\n\tif (char === \"-\") {\n\t\treturn String.fromCharCode(31); // Same as Ctrl+_\n\t}\n\treturn null;\n}\n\nfunction isDigitKey(key: string): boolean {\n\treturn key >= \"0\" && key <= \"9\";\n}\n\nfunction matchesPrintableModifyOtherKeys(data: string, expectedKeycode: number, expectedModifier: number): boolean {\n\tif (expectedModifier === 0) return false;\n\tconst parsed = parseModifyOtherKeysSequence(data);\n\tif (!parsed || parsed.modifier !== expectedModifier) return false;\n\treturn (\n\t\tnormalizeShiftedLetterIdentityCodepoint(parsed.codepoint, parsed.modifier) ===\n\t\tnormalizeShiftedLetterIdentityCodepoint(expectedKeycode, expectedModifier)\n\t);\n}\n\nfunction formatKeyNameWithModifiers(keyName: string, modifier: number): string | undefined {\n\tconst mods: string[] = [];\n\tconst effectiveMod = modifier & ~LOCK_MASK;\n\tconst supportedModifierMask = MODIFIERS.shift | MODIFIERS.ctrl | MODIFIERS.alt | MODIFIERS.super;\n\tif ((effectiveMod & ~supportedModifierMask) !== 0) return undefined;\n\tif (effectiveMod & MODIFIERS.shift) mods.push(\"shift\");\n\tif (effectiveMod & MODIFIERS.ctrl) mods.push(\"ctrl\");\n\tif (effectiveMod & MODIFIERS.alt) mods.push(\"alt\");\n\tif (effectiveMod & MODIFIERS.super) mods.push(\"super\");\n\treturn mods.length > 0 ? `${mods.join(\"+\")}+${keyName}` : keyName;\n}\n\nfunction parseKeyId(\n\tkeyId: string,\n): { key: string; ctrl: boolean; shift: boolean; alt: boolean; super: boolean } | null {\n\tconst parts = keyId.toLowerCase().split(\"+\");\n\tconst key = parts[parts.length - 1];\n\tif (!key) return null;\n\treturn {\n\t\tkey,\n\t\tctrl: parts.includes(\"ctrl\"),\n\t\tshift: parts.includes(\"shift\"),\n\t\talt: parts.includes(\"alt\"),\n\t\tsuper: parts.includes(\"super\"),\n\t};\n}\n\n/**\n * Match input data against a key identifier string.\n *\n * Supported key identifiers:\n * - Single keys: \"escape\", \"tab\", \"enter\", \"backspace\", \"delete\", \"home\", \"end\", \"space\"\n * - Arrow keys: \"up\", \"down\", \"left\", \"right\"\n * - Ctrl combinations: \"ctrl+c\", \"ctrl+z\", etc.\n * - Shift combinations: \"shift+tab\", \"shift+enter\"\n * - Alt combinations: \"alt+enter\", \"alt+backspace\"\n * - Super combinations: \"super+k\", \"super+enter\"\n * - Combined modifiers: \"shift+ctrl+p\", \"ctrl+alt+x\", \"ctrl+super+k\"\n *\n * Use the Key helper for autocomplete: Key.ctrl(\"c\"), Key.escape, Key.ctrlShift(\"p\"), Key.super(\"k\")\n *\n * @param data - Raw input data from terminal\n * @param keyId - Key identifier (e.g., \"ctrl+c\", \"escape\", Key.ctrl(\"c\"))\n */\nexport function matchesKey(data: string, keyId: KeyId): boolean {\n\tconst parsed = parseKeyId(keyId);\n\tif (!parsed) return false;\n\n\tconst { key, ctrl, shift, alt, super: superModifier } = parsed;\n\tlet modifier = 0;\n\tif (shift) modifier |= MODIFIERS.shift;\n\tif (alt) modifier |= MODIFIERS.alt;\n\tif (ctrl) modifier |= MODIFIERS.ctrl;\n\tif (superModifier) modifier |= MODIFIERS.super;\n\n\tswitch (key) {\n\t\tcase \"escape\":\n\t\tcase \"esc\":\n\t\t\tif (modifier !== 0) return false;\n\t\t\treturn (\n\t\t\t\tdata === \"\\x1b\" ||\n\t\t\t\tmatchesKittySequence(data, CODEPOINTS.escape, 0) ||\n\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.escape, 0)\n\t\t\t);\n\n\t\tcase \"space\":\n\t\t\tif (!_kittyProtocolActive) {\n\t\t\t\tif (modifier === MODIFIERS.ctrl && data === \"\\x00\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (modifier === MODIFIERS.alt && data === \"\\x1b \") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tdata === \" \" ||\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.space, 0) ||\n\t\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.space, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn (\n\t\t\t\tmatchesKittySequence(data, CODEPOINTS.space, modifier) ||\n\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.space, modifier)\n\t\t\t);\n\n\t\tcase \"tab\":\n\t\t\tif (modifier === MODIFIERS.shift) {\n\t\t\t\treturn (\n\t\t\t\t\tdata === \"\\x1b[Z\" ||\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.tab, MODIFIERS.shift) ||\n\t\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.tab, MODIFIERS.shift)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn data === \"\\t\" || matchesKittySequence(data, CODEPOINTS.tab, 0);\n\t\t\t}\n\t\t\treturn (\n\t\t\t\tmatchesKittySequence(data, CODEPOINTS.tab, modifier) ||\n\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.tab, modifier)\n\t\t\t);\n\n\t\tcase \"enter\":\n\t\tcase \"return\":\n\t\t\tif (modifier === MODIFIERS.shift) {\n\t\t\t\t// CSI u sequences (standard Kitty protocol)\n\t\t\t\tif (\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.shift) ||\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.kpEnter, MODIFIERS.shift)\n\t\t\t\t) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// xterm modifyOtherKeys format (fallback when Kitty protocol not enabled)\n\t\t\t\tif (matchesModifyOtherKeys(data, CODEPOINTS.enter, MODIFIERS.shift)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// When Kitty protocol is active, legacy sequences are custom terminal mappings\n\t\t\t\t// \\x1b\\r = Kitty's \"map shift+enter send_text all \\e\\r\"\n\t\t\t\t// \\n = Ghostty's \"keybind = shift+enter=text:\\n\"\n\t\t\t\tif (_kittyProtocolActive) {\n\t\t\t\t\treturn data === \"\\x1b\\r\" || data === \"\\n\";\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (modifier === MODIFIERS.alt) {\n\t\t\t\t// CSI u sequences (standard Kitty protocol)\n\t\t\t\tif (\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.enter, MODIFIERS.alt) ||\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.kpEnter, MODIFIERS.alt)\n\t\t\t\t) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// xterm modifyOtherKeys format (fallback when Kitty protocol not enabled)\n\t\t\t\tif (matchesModifyOtherKeys(data, CODEPOINTS.enter, MODIFIERS.alt)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t// \\x1b\\r is alt+enter only in legacy mode (no Kitty protocol)\n\t\t\t\t// When Kitty protocol is active, alt+enter comes as CSI u sequence\n\t\t\t\tif (!_kittyProtocolActive) {\n\t\t\t\t\treturn data === \"\\x1b\\r\";\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tdata === \"\\r\" ||\n\t\t\t\t\t(!_kittyProtocolActive && data === \"\\n\") ||\n\t\t\t\t\tdata === \"\\x1bOM\" || // SS3 M (numpad enter in some terminals)\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.enter, 0) ||\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.kpEnter, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn (\n\t\t\t\tmatchesKittySequence(data, CODEPOINTS.enter, modifier) ||\n\t\t\t\tmatchesKittySequence(data, CODEPOINTS.kpEnter, modifier) ||\n\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.enter, modifier)\n\t\t\t);\n\n\t\tcase \"backspace\":\n\t\t\tif (modifier === MODIFIERS.alt) {\n\t\t\t\tif (data === \"\\x1b\\x7f\" || data === \"\\x1b\\b\") {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn (\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.backspace, MODIFIERS.alt) ||\n\t\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.backspace, MODIFIERS.alt)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modifier === MODIFIERS.ctrl) {\n\t\t\t\t// Legacy raw 0x08 is ambiguous: it can be Ctrl+Backspace on Windows\n\t\t\t\t// Terminal or plain Backspace on other terminals, while also\n\t\t\t\t// overlapping with Ctrl+H.\n\t\t\t\tif (matchesRawBackspace(data, MODIFIERS.ctrl)) return true;\n\t\t\t\treturn (\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.backspace, MODIFIERS.ctrl) ||\n\t\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.backspace, MODIFIERS.ctrl)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesRawBackspace(data, 0) ||\n\t\t\t\t\tmatchesKittySequence(data, CODEPOINTS.backspace, 0) ||\n\t\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.backspace, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn (\n\t\t\t\tmatchesKittySequence(data, CODEPOINTS.backspace, modifier) ||\n\t\t\t\tmatchesModifyOtherKeys(data, CODEPOINTS.backspace, modifier)\n\t\t\t);\n\n\t\tcase \"insert\":\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.insert) ||\n\t\t\t\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.insert, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"insert\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.insert, modifier);\n\n\t\tcase \"delete\":\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.delete) ||\n\t\t\t\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.delete, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"delete\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.delete, modifier);\n\n\t\tcase \"clear\":\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn matchesLegacySequence(data, LEGACY_KEY_SEQUENCES.clear);\n\t\t\t}\n\t\t\treturn matchesLegacyModifierSequence(data, \"clear\", modifier);\n\n\t\tcase \"home\":\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.home) ||\n\t\t\t\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.home, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"home\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.home, modifier);\n\n\t\tcase \"end\":\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.end) ||\n\t\t\t\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.end, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"end\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.end, modifier);\n\n\t\tcase \"pageup\":\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.pageUp) ||\n\t\t\t\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.pageUp, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"pageUp\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.pageUp, modifier);\n\n\t\tcase \"pagedown\":\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.pageDown) ||\n\t\t\t\t\tmatchesKittySequence(data, FUNCTIONAL_CODEPOINTS.pageDown, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"pageDown\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, FUNCTIONAL_CODEPOINTS.pageDown, modifier);\n\n\t\tcase \"up\":\n\t\t\tif (modifier === MODIFIERS.alt) {\n\t\t\t\treturn data === \"\\x1bp\" || matchesKittySequence(data, ARROW_CODEPOINTS.up, MODIFIERS.alt);\n\t\t\t}\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.up) ||\n\t\t\t\t\tmatchesKittySequence(data, ARROW_CODEPOINTS.up, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"up\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, ARROW_CODEPOINTS.up, modifier);\n\n\t\tcase \"down\":\n\t\t\tif (modifier === MODIFIERS.alt) {\n\t\t\t\treturn data === \"\\x1bn\" || matchesKittySequence(data, ARROW_CODEPOINTS.down, MODIFIERS.alt);\n\t\t\t}\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.down) ||\n\t\t\t\t\tmatchesKittySequence(data, ARROW_CODEPOINTS.down, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"down\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, ARROW_CODEPOINTS.down, modifier);\n\n\t\tcase \"left\":\n\t\t\tif (modifier === MODIFIERS.alt) {\n\t\t\t\treturn (\n\t\t\t\t\tdata === \"\\x1b[1;3D\" ||\n\t\t\t\t\t(!_kittyProtocolActive && data === \"\\x1bB\") ||\n\t\t\t\t\tdata === \"\\x1bb\" ||\n\t\t\t\t\tmatchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.alt)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modifier === MODIFIERS.ctrl) {\n\t\t\t\treturn (\n\t\t\t\t\tdata === \"\\x1b[1;5D\" ||\n\t\t\t\t\tmatchesLegacyModifierSequence(data, \"left\", MODIFIERS.ctrl) ||\n\t\t\t\t\tmatchesKittySequence(data, ARROW_CODEPOINTS.left, MODIFIERS.ctrl)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.left) ||\n\t\t\t\t\tmatchesKittySequence(data, ARROW_CODEPOINTS.left, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"left\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, ARROW_CODEPOINTS.left, modifier);\n\n\t\tcase \"right\":\n\t\t\tif (modifier === MODIFIERS.alt) {\n\t\t\t\treturn (\n\t\t\t\t\tdata === \"\\x1b[1;3C\" ||\n\t\t\t\t\t(!_kittyProtocolActive && data === \"\\x1bF\") ||\n\t\t\t\t\tdata === \"\\x1bf\" ||\n\t\t\t\t\tmatchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.alt)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modifier === MODIFIERS.ctrl) {\n\t\t\t\treturn (\n\t\t\t\t\tdata === \"\\x1b[1;5C\" ||\n\t\t\t\t\tmatchesLegacyModifierSequence(data, \"right\", MODIFIERS.ctrl) ||\n\t\t\t\t\tmatchesKittySequence(data, ARROW_CODEPOINTS.right, MODIFIERS.ctrl)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (modifier === 0) {\n\t\t\t\treturn (\n\t\t\t\t\tmatchesLegacySequence(data, LEGACY_KEY_SEQUENCES.right) ||\n\t\t\t\t\tmatchesKittySequence(data, ARROW_CODEPOINTS.right, 0)\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (matchesLegacyModifierSequence(data, \"right\", modifier)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn matchesKittySequence(data, ARROW_CODEPOINTS.right, modifier);\n\n\t\tcase \"f1\":\n\t\tcase \"f2\":\n\t\tcase \"f3\":\n\t\tcase \"f4\":\n\t\tcase \"f5\":\n\t\tcase \"f6\":\n\t\tcase \"f7\":\n\t\tcase \"f8\":\n\t\tcase \"f9\":\n\t\tcase \"f10\":\n\t\tcase \"f11\":\n\t\tcase \"f12\": {\n\t\t\tif (modifier !== 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst functionKey = key as keyof typeof LEGACY_KEY_SEQUENCES;\n\t\t\treturn matchesLegacySequence(data, LEGACY_KEY_SEQUENCES[functionKey]);\n\t\t}\n\t}\n\n\t// Handle single letter/digit keys and symbols\n\tif (key.length === 1 && ((key >= \"a\" && key <= \"z\") || isDigitKey(key) || SYMBOL_KEYS.has(key))) {\n\t\tconst codepoint = key.charCodeAt(0);\n\t\tconst rawCtrl = rawCtrlChar(key);\n\t\tconst isLetter = key >= \"a\" && key <= \"z\";\n\t\tconst isDigit = isDigitKey(key);\n\n\t\tif (modifier === MODIFIERS.ctrl + MODIFIERS.alt && !_kittyProtocolActive && rawCtrl) {\n\t\t\t// Legacy: ctrl+alt+key is ESC followed by the control character.\n\t\t\t// If that legacy form does not match, continue so CSI-u and\n\t\t\t// modifyOtherKeys sequences from tmux can still be recognized.\n\t\t\tif (data === `\\x1b${rawCtrl}`) return true;\n\t\t}\n\n\t\tif (modifier === MODIFIERS.alt && !_kittyProtocolActive && (isLetter || isDigit || SYMBOL_KEYS.has(key))) {\n\t\t\t// Legacy: alt+printable key is ESC followed by the key\n\t\t\tif (data === `\\x1b${key}`) return true;\n\t\t}\n\n\t\tif (modifier === MODIFIERS.ctrl) {\n\t\t\t// Legacy: ctrl+key sends the control character\n\t\t\tif (rawCtrl && data === rawCtrl) return true;\n\t\t\treturn (\n\t\t\t\tmatchesKittySequence(data, codepoint, MODIFIERS.ctrl) ||\n\t\t\t\tmatchesPrintableModifyOtherKeys(data, codepoint, MODIFIERS.ctrl)\n\t\t\t);\n\t\t}\n\n\t\tif (modifier === MODIFIERS.shift + MODIFIERS.ctrl) {\n\t\t\treturn (\n\t\t\t\tmatchesKittySequence(data, codepoint, MODIFIERS.shift + MODIFIERS.ctrl) ||\n\t\t\t\tmatchesPrintableModifyOtherKeys(data, codepoint, MODIFIERS.shift + MODIFIERS.ctrl)\n\t\t\t);\n\t\t}\n\n\t\tif (modifier === MODIFIERS.shift) {\n\t\t\t// Legacy: shift+letter produces uppercase\n\t\t\tif (isLetter && data === key.toUpperCase()) return true;\n\t\t\treturn (\n\t\t\t\tmatchesKittySequence(data, codepoint, MODIFIERS.shift) ||\n\t\t\t\tmatchesPrintableModifyOtherKeys(data, codepoint, MODIFIERS.shift)\n\t\t\t);\n\t\t}\n\n\t\tif (modifier !== 0) {\n\t\t\treturn (\n\t\t\t\tmatchesKittySequence(data, codepoint, modifier) ||\n\t\t\t\tmatchesPrintableModifyOtherKeys(data, codepoint, modifier)\n\t\t\t);\n\t\t}\n\n\t\t// Check both raw char and Kitty sequence (needed for release events)\n\t\treturn data === key || matchesKittySequence(data, codepoint, 0);\n\t}\n\n\treturn false;\n}\n\n/**\n * Parse input data and return the key identifier if recognized.\n *\n * @param data - Raw input data from terminal\n * @returns Key identifier string (e.g., \"ctrl+c\") or undefined\n */\nfunction formatParsedKey(codepoint: number, modifier: number, baseLayoutKey?: number): string | undefined {\n\tconst normalizedCodepoint = normalizeKittyFunctionalCodepoint(codepoint);\n\tconst identityCodepoint = normalizeShiftedLetterIdentityCodepoint(normalizedCodepoint, modifier);\n\n\t// Use base layout key only when codepoint is not a recognized Latin\n\t// letter (a-z), digit (0-9), or symbol (/, -, [, ;, etc.). For those,\n\t// the codepoint is authoritative regardless of physical key position.\n\t// This prevents remapped layouts (Dvorak, Colemak, xremap, etc.) from\n\t// reporting the wrong key name based on the QWERTY physical position.\n\tconst isLatinLetter = identityCodepoint >= 97 && identityCodepoint <= 122; // a-z\n\tconst isDigit = identityCodepoint >= 48 && identityCodepoint <= 57; // 0-9\n\tconst isKnownSymbol = SYMBOL_KEYS.has(String.fromCharCode(identityCodepoint));\n\tconst effectiveCodepoint =\n\t\tisLatinLetter || isDigit || isKnownSymbol ? identityCodepoint : (baseLayoutKey ?? identityCodepoint);\n\n\tlet keyName: string | undefined;\n\tif (effectiveCodepoint === CODEPOINTS.escape) keyName = \"escape\";\n\telse if (effectiveCodepoint === CODEPOINTS.tab) keyName = \"tab\";\n\telse if (effectiveCodepoint === CODEPOINTS.enter || effectiveCodepoint === CODEPOINTS.kpEnter) keyName = \"enter\";\n\telse if (effectiveCodepoint === CODEPOINTS.space) keyName = \"space\";\n\telse if (effectiveCodepoint === CODEPOINTS.backspace) keyName = \"backspace\";\n\telse if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.delete) keyName = \"delete\";\n\telse if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.insert) keyName = \"insert\";\n\telse if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.home) keyName = \"home\";\n\telse if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.end) keyName = \"end\";\n\telse if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.pageUp) keyName = \"pageUp\";\n\telse if (effectiveCodepoint === FUNCTIONAL_CODEPOINTS.pageDown) keyName = \"pageDown\";\n\telse if (effectiveCodepoint === ARROW_CODEPOINTS.up) keyName = \"up\";\n\telse if (effectiveCodepoint === ARROW_CODEPOINTS.down) keyName = \"down\";\n\telse if (effectiveCodepoint === ARROW_CODEPOINTS.left) keyName = \"left\";\n\telse if (effectiveCodepoint === ARROW_CODEPOINTS.right) keyName = \"right\";\n\telse if (effectiveCodepoint >= 48 && effectiveCodepoint <= 57) keyName = String.fromCharCode(effectiveCodepoint);\n\telse if (effectiveCodepoint >= 97 && effectiveCodepoint <= 122) keyName = String.fromCharCode(effectiveCodepoint);\n\telse if (SYMBOL_KEYS.has(String.fromCharCode(effectiveCodepoint))) keyName = String.fromCharCode(effectiveCodepoint);\n\n\tif (!keyName) return undefined;\n\treturn formatKeyNameWithModifiers(keyName, modifier);\n}\n\nexport function parseKey(data: string): string | undefined {\n\tconst kitty = parseKittySequence(data);\n\tif (kitty) {\n\t\treturn formatParsedKey(kitty.codepoint, kitty.modifier, kitty.baseLayoutKey);\n\t}\n\n\tconst modifyOtherKeys = parseModifyOtherKeysSequence(data);\n\tif (modifyOtherKeys) {\n\t\treturn formatParsedKey(modifyOtherKeys.codepoint, modifyOtherKeys.modifier);\n\t}\n\n\t// Mode-aware legacy sequences\n\t// When Kitty protocol is active, ambiguous sequences are interpreted as custom terminal mappings:\n\t// - \\x1b\\r = shift+enter (Kitty mapping), not alt+enter\n\t// - \\n = shift+enter (Ghostty mapping)\n\tif (_kittyProtocolActive) {\n\t\tif (data === \"\\x1b\\r\" || data === \"\\n\") return \"shift+enter\";\n\t}\n\n\tconst legacySequenceKeyId = LEGACY_SEQUENCE_KEY_IDS[data];\n\tif (legacySequenceKeyId) return legacySequenceKeyId;\n\n\t// Legacy sequences (used when Kitty protocol is not active, or for unambiguous sequences)\n\tif (data === \"\\x1b\") return \"escape\";\n\tif (data === \"\\x1c\") return \"ctrl+\\\\\";\n\tif (data === \"\\x1d\") return \"ctrl+]\";\n\tif (data === \"\\x1f\") return \"ctrl+-\";\n\tif (data === \"\\x1b\\x1b\") return \"ctrl+alt+[\";\n\tif (data === \"\\x1b\\x1c\") return \"ctrl+alt+\\\\\";\n\tif (data === \"\\x1b\\x1d\") return \"ctrl+alt+]\";\n\tif (data === \"\\x1b\\x1f\") return \"ctrl+alt+-\";\n\tif (data === \"\\t\") return \"tab\";\n\tif (data === \"\\r\" || (!_kittyProtocolActive && data === \"\\n\") || data === \"\\x1bOM\") return \"enter\";\n\tif (data === \"\\x00\") return \"ctrl+space\";\n\tif (data === \" \") return \"space\";\n\tif (data === \"\\x7f\") return \"backspace\";\n\tif (data === \"\\x08\") return isWindowsTerminalSession() ? \"ctrl+backspace\" : \"backspace\";\n\tif (data === \"\\x1b[Z\") return \"shift+tab\";\n\tif (!_kittyProtocolActive && data === \"\\x1b\\r\") return \"alt+enter\";\n\tif (!_kittyProtocolActive && data === \"\\x1b \") return \"alt+space\";\n\tif (data === \"\\x1b\\x7f\" || data === \"\\x1b\\b\") return \"alt+backspace\";\n\tif (!_kittyProtocolActive && data === \"\\x1bB\") return \"alt+left\";\n\tif (!_kittyProtocolActive && data === \"\\x1bF\") return \"alt+right\";\n\tif (!_kittyProtocolActive && data.length === 2 && data[0] === \"\\x1b\") {\n\t\tconst code = data.charCodeAt(1);\n\t\tif (code >= 1 && code <= 26) {\n\t\t\treturn `ctrl+alt+${String.fromCharCode(code + 96)}`;\n\t\t}\n\t\t// Legacy alt+letter/digit/symbol (ESC followed by the key)\n\t\tconst key = String.fromCharCode(code);\n\t\tif ((code >= 97 && code <= 122) || (code >= 48 && code <= 57) || SYMBOL_KEYS.has(key)) {\n\t\t\treturn `alt+${key}`;\n\t\t}\n\t}\n\tif (data === \"\\x1b[A\") return \"up\";\n\tif (data === \"\\x1b[B\") return \"down\";\n\tif (data === \"\\x1b[C\") return \"right\";\n\tif (data === \"\\x1b[D\") return \"left\";\n\tif (data === \"\\x1b[H\" || data === \"\\x1bOH\") return \"home\";\n\tif (data === \"\\x1b[F\" || data === \"\\x1bOF\") return \"end\";\n\tif (data === \"\\x1b[3~\") return \"delete\";\n\tif (data === \"\\x1b[5~\") return \"pageUp\";\n\tif (data === \"\\x1b[6~\") return \"pageDown\";\n\n\t// Raw Ctrl+letter\n\tif (data.length === 1) {\n\t\tconst code = data.charCodeAt(0);\n\t\tif (code >= 1 && code <= 26) {\n\t\t\treturn `ctrl+${String.fromCharCode(code + 96)}`;\n\t\t}\n\t\tif (code >= 32 && code <= 126) {\n\t\t\treturn data;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n// =============================================================================\n// Kitty CSI-u Printable Decoding\n// =============================================================================\n\nconst KITTY_CSI_U_REGEX = /^\\x1b\\[(\\d+)(?::(\\d*))?(?::(\\d+))?(?:;(\\d+))?(?::(\\d+))?u$/;\nconst KITTY_PRINTABLE_ALLOWED_MODIFIERS = MODIFIERS.shift | LOCK_MASK;\n\n/**\n * Decode a Kitty CSI-u sequence into a printable character, if applicable.\n *\n * When Kitty keyboard protocol flag 1 (disambiguate) is active, terminals send\n * CSI-u sequences for all keys, including plain printable characters. This\n * function extracts the printable character from such sequences.\n *\n * Only accepts plain or Shift-modified keys. Rejects Ctrl, Alt, and unsupported\n * modifier combinations (those are handled by keybinding matching instead).\n * Prefers the shifted keycode when Shift is held and a shifted key is reported.\n *\n * @param data - Raw input data from terminal\n * @returns The printable character, or undefined if not a printable CSI-u sequence\n */\nexport function decodeKittyPrintable(data: string): string | undefined {\n\tconst match = data.match(KITTY_CSI_U_REGEX);\n\tif (!match) return undefined;\n\n\t// CSI-u groups: <codepoint>[:<shifted>[:<base>]];<mod>[:<event>]u\n\tconst codepoint = Number.parseInt(match[1] ?? \"\", 10);\n\tif (!Number.isFinite(codepoint)) return undefined;\n\n\tconst shiftedKey = match[2] && match[2].length > 0 ? Number.parseInt(match[2], 10) : undefined;\n\tconst modValue = match[4] ? Number.parseInt(match[4], 10) : 1;\n\t// Modifiers are 1-indexed in CSI-u; normalize to our bitmask.\n\tconst modifier = Number.isFinite(modValue) ? modValue - 1 : 0;\n\n\t// Only accept printable CSI-u input for plain or Shift-modified text keys.\n\t// Reject unsupported modifier bits (e.g. Super/Meta) to avoid inserting\n\t// characters from modifier-only terminal events.\n\tif ((modifier & ~KITTY_PRINTABLE_ALLOWED_MODIFIERS) !== 0) return undefined;\n\tif (modifier & (MODIFIERS.alt | MODIFIERS.ctrl)) return undefined;\n\n\t// Prefer the shifted keycode when Shift is held.\n\tlet effectiveCodepoint = codepoint;\n\tif (modifier & MODIFIERS.shift && typeof shiftedKey === \"number\") {\n\t\teffectiveCodepoint = shiftedKey;\n\t}\n\teffectiveCodepoint = normalizeKittyFunctionalCodepoint(effectiveCodepoint);\n\t// Drop control characters or invalid codepoints.\n\tif (!Number.isFinite(effectiveCodepoint) || effectiveCodepoint < 32) return undefined;\n\n\ttry {\n\t\treturn String.fromCodePoint(effectiveCodepoint);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction decodeModifyOtherKeysPrintable(data: string): string | undefined {\n\tconst parsed = parseModifyOtherKeysSequence(data);\n\tif (!parsed) return undefined;\n\tconst modifier = parsed.modifier & ~LOCK_MASK;\n\tif ((modifier & ~MODIFIERS.shift) !== 0) return undefined;\n\tif (!Number.isFinite(parsed.codepoint) || parsed.codepoint < 32) return undefined;\n\n\ttry {\n\t\treturn String.fromCodePoint(parsed.codepoint);\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nexport function decodePrintableKey(data: string): string | undefined {\n\treturn decodeKittyPrintable(data) ?? decodeModifyOtherKeysPrintable(data);\n}\n","// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\nexport interface RgbColor {\n\tr: number;\n\tg: number;\n\tb: number;\n}\n\nexport type TerminalColorScheme = \"dark\" | \"light\";\n\nfunction hexToRgb(hex: string): RgbColor {\n\tconst normalized = hex.startsWith(\"#\") ? hex.slice(1) : hex;\n\tconst r = parseInt(normalized.slice(0, 2), 16);\n\tconst g = parseInt(normalized.slice(2, 4), 16);\n\tconst b = parseInt(normalized.slice(4, 6), 16);\n\treturn { r, g, b };\n}\n\nfunction parseOscHexChannel(channel: string): number | undefined {\n\tif (!/^[0-9a-f]+$/i.test(channel)) {\n\t\treturn undefined;\n\t}\n\tconst max = 16 ** channel.length - 1;\n\tif (max <= 0) {\n\t\treturn undefined;\n\t}\n\treturn Math.round((parseInt(channel, 16) / max) * 255);\n}\n\nconst OSC11_BACKGROUND_COLOR_RESPONSE_PATTERN = /^\\x1b\\]11;([^\\x07\\x1b]*)(?:\\x07|\\x1b\\\\)$/i;\nconst COLOR_SCHEME_REPORT_PATTERN = /^(?:\\x1b\\[\\?997;(1|2)n)+$/;\n\nexport function isOsc11BackgroundColorResponse(data: string): boolean {\n\treturn OSC11_BACKGROUND_COLOR_RESPONSE_PATTERN.test(data);\n}\n\nexport function parseOsc11BackgroundColor(data: string): RgbColor | undefined {\n\tconst match = data.match(OSC11_BACKGROUND_COLOR_RESPONSE_PATTERN);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\n\tconst value = match[1].trim();\n\tif (value.startsWith(\"#\")) {\n\t\tconst hex = value.slice(1);\n\t\tif (/^[0-9a-f]{6}$/i.test(hex)) {\n\t\t\treturn hexToRgb(value);\n\t\t}\n\t\tif (/^[0-9a-f]{12}$/i.test(hex)) {\n\t\t\tconst r = parseOscHexChannel(hex.slice(0, 4));\n\t\t\tconst g = parseOscHexChannel(hex.slice(4, 8));\n\t\t\tconst b = parseOscHexChannel(hex.slice(8, 12));\n\t\t\treturn r !== undefined && g !== undefined && b !== undefined ? { r, g, b } : undefined;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tconst rgbValue = value.replace(/^rgba?:/i, \"\");\n\tconst [red, green, blue] = rgbValue.split(\"/\");\n\tif (red === undefined || green === undefined || blue === undefined) {\n\t\treturn undefined;\n\t}\n\tconst r = parseOscHexChannel(red);\n\tconst g = parseOscHexChannel(green);\n\tconst b = parseOscHexChannel(blue);\n\treturn r !== undefined && g !== undefined && b !== undefined ? { r, g, b } : undefined;\n}\n\nexport function parseTerminalColorSchemeReport(data: string): TerminalColorScheme | undefined {\n\tconst match = data.match(COLOR_SCHEME_REPORT_PATTERN);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\treturn match[1] === \"2\" ? \"light\" : \"dark\";\n}\n","// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\nimport { type KeyId, matchesKey } from \"./pi-tui-keys.ts\";\n\n/**\n * Global keybinding registry.\n * Downstream packages can add keybindings via declaration merging.\n */\nexport interface Keybindings {\n\t// Editor navigation and editing\n\t\"tui.editor.cursorUp\": true;\n\t\"tui.editor.cursorDown\": true;\n\t\"tui.editor.historyPrevious\": true;\n\t\"tui.editor.historyNext\": true;\n\t\"tui.editor.cursorLeft\": true;\n\t\"tui.editor.cursorRight\": true;\n\t\"tui.editor.cursorWordLeft\": true;\n\t\"tui.editor.cursorWordRight\": true;\n\t\"tui.editor.cursorLineStart\": true;\n\t\"tui.editor.cursorLineEnd\": true;\n\t\"tui.editor.jumpForward\": true;\n\t\"tui.editor.jumpBackward\": true;\n\t\"tui.editor.pageUp\": true;\n\t\"tui.editor.pageDown\": true;\n\t\"tui.editor.deleteCharBackward\": true;\n\t\"tui.editor.deleteCharForward\": true;\n\t\"tui.editor.deleteWordBackward\": true;\n\t\"tui.editor.deleteWordForward\": true;\n\t\"tui.editor.deleteToLineStart\": true;\n\t\"tui.editor.deleteToLineEnd\": true;\n\t\"tui.editor.yank\": true;\n\t\"tui.editor.yankPop\": true;\n\t\"tui.editor.undo\": true;\n\t// Generic input actions\n\t\"tui.input.newLine\": true;\n\t\"tui.input.submit\": true;\n\t\"tui.input.tab\": true;\n\t\"tui.input.copy\": true;\n\t// Generic selection actions\n\t\"tui.select.up\": true;\n\t\"tui.select.down\": true;\n\t\"tui.select.pageUp\": true;\n\t\"tui.select.pageDown\": true;\n\t\"tui.select.confirm\": true;\n\t\"tui.select.cancel\": true;\n\t// Alternate-screen viewport navigation\n\t\"tui.altScreen.pageUp\": true;\n\t\"tui.altScreen.pageDown\": true;\n\t\"tui.altScreen.halfPageUp\": true;\n\t\"tui.altScreen.halfPageDown\": true;\n\t\"tui.altScreen.lineUp\": true;\n\t\"tui.altScreen.lineDown\": true;\n\t\"tui.altScreen.previousPrompt\": true;\n\t\"tui.altScreen.nextPrompt\": true;\n\t\"tui.altScreen.search\": true;\n\t\"tui.altScreen.searchNext\": true;\n\t\"tui.altScreen.searchPrevious\": true;\n\t\"tui.altScreen.searchClose\": true;\n\t\"tui.altScreen.top\": true;\n\t\"tui.altScreen.bottom\": true;\n}\n\nexport type Keybinding = keyof Keybindings;\n\nexport interface KeybindingDefinition {\n\tdefaultKeys: KeyId | KeyId[];\n\tdescription?: string;\n}\n\nexport type KeybindingDefinitions = Record<string, KeybindingDefinition>;\nexport type KeybindingsConfig = Record<string, KeyId | KeyId[] | undefined>;\n\nexport const TUI_KEYBINDINGS = {\n\t\"tui.editor.cursorUp\": { defaultKeys: \"up\", description: \"Move cursor up\" },\n\t\"tui.editor.cursorDown\": { defaultKeys: \"down\", description: \"Move cursor down\" },\n\t\"tui.editor.historyPrevious\": {\n\t\tdefaultKeys: [],\n\t\tdescription: \"Select previous prompt history entry\",\n\t},\n\t\"tui.editor.historyNext\": {\n\t\tdefaultKeys: [],\n\t\tdescription: \"Select next prompt history entry\",\n\t},\n\t\"tui.editor.cursorLeft\": {\n\t\tdefaultKeys: [\"left\", \"ctrl+b\"],\n\t\tdescription: \"Move cursor left\",\n\t},\n\t\"tui.editor.cursorRight\": {\n\t\tdefaultKeys: [\"right\", \"ctrl+f\"],\n\t\tdescription: \"Move cursor right\",\n\t},\n\t\"tui.editor.cursorWordLeft\": {\n\t\tdefaultKeys: [\"alt+left\", \"ctrl+left\", \"alt+b\"],\n\t\tdescription: \"Move cursor word left\",\n\t},\n\t\"tui.editor.cursorWordRight\": {\n\t\tdefaultKeys: [\"alt+right\", \"ctrl+right\", \"alt+f\"],\n\t\tdescription: \"Move cursor word right\",\n\t},\n\t\"tui.editor.cursorLineStart\": {\n\t\tdefaultKeys: [\"home\", \"ctrl+home\", \"ctrl+a\"],\n\t\tdescription: \"Move to line start\",\n\t},\n\t\"tui.editor.cursorLineEnd\": {\n\t\tdefaultKeys: [\"end\", \"ctrl+end\", \"ctrl+e\"],\n\t\tdescription: \"Move to line end\",\n\t},\n\t\"tui.editor.jumpForward\": {\n\t\tdefaultKeys: \"ctrl+]\",\n\t\tdescription: \"Jump forward to character\",\n\t},\n\t\"tui.editor.jumpBackward\": {\n\t\tdefaultKeys: \"ctrl+alt+]\",\n\t\tdescription: \"Jump backward to character\",\n\t},\n\t\"tui.editor.pageUp\": { defaultKeys: [\"pageUp\", \"ctrl+pageUp\"], description: \"Page up\" },\n\t\"tui.editor.pageDown\": { defaultKeys: [\"pageDown\", \"ctrl+pageDown\"], description: \"Page down\" },\n\t\"tui.editor.deleteCharBackward\": {\n\t\tdefaultKeys: \"backspace\",\n\t\tdescription: \"Delete character backward\",\n\t},\n\t\"tui.editor.deleteCharForward\": {\n\t\tdefaultKeys: [\"delete\", \"ctrl+d\"],\n\t\tdescription: \"Delete character forward\",\n\t},\n\t\"tui.editor.deleteWordBackward\": {\n\t\tdefaultKeys: [\"ctrl+w\", \"alt+backspace\"],\n\t\tdescription: \"Delete word backward\",\n\t},\n\t\"tui.editor.deleteWordForward\": {\n\t\tdefaultKeys: [\"alt+d\", \"alt+delete\"],\n\t\tdescription: \"Delete word forward\",\n\t},\n\t\"tui.editor.deleteToLineStart\": {\n\t\tdefaultKeys: \"ctrl+u\",\n\t\tdescription: \"Delete to line start\",\n\t},\n\t\"tui.editor.deleteToLineEnd\": {\n\t\tdefaultKeys: \"ctrl+k\",\n\t\tdescription: \"Delete to line end\",\n\t},\n\t\"tui.editor.yank\": { defaultKeys: \"ctrl+y\", description: \"Yank\" },\n\t\"tui.editor.yankPop\": { defaultKeys: \"alt+y\", description: \"Yank pop\" },\n\t\"tui.editor.undo\": { defaultKeys: \"ctrl+-\", description: \"Undo\" },\n\t\"tui.input.newLine\": { defaultKeys: [\"shift+enter\", \"ctrl+j\"], description: \"Insert newline\" },\n\t\"tui.input.submit\": { defaultKeys: \"enter\", description: \"Submit input\" },\n\t\"tui.input.tab\": { defaultKeys: \"tab\", description: \"Tab / autocomplete\" },\n\t\"tui.input.copy\": { defaultKeys: \"ctrl+c\", description: \"Copy selection\" },\n\t\"tui.select.up\": { defaultKeys: \"up\", description: \"Move selection up\" },\n\t\"tui.select.down\": { defaultKeys: \"down\", description: \"Move selection down\" },\n\t\"tui.select.pageUp\": { defaultKeys: \"pageUp\", description: \"Selection page up\" },\n\t\"tui.select.pageDown\": {\n\t\tdefaultKeys: \"pageDown\",\n\t\tdescription: \"Selection page down\",\n\t},\n\t\"tui.select.confirm\": { defaultKeys: \"enter\", description: \"Confirm selection\" },\n\t\"tui.select.cancel\": {\n\t\tdefaultKeys: [\"escape\", \"ctrl+c\"],\n\t\tdescription: \"Cancel selection\",\n\t},\n\t// These intentionally shadow the unmodified editor bindings in fullscreen mode.\n\t\"tui.altScreen.pageUp\": {\n\t\tdefaultKeys: \"pageUp\",\n\t\tdescription: \"Scroll viewport up one page\",\n\t},\n\t\"tui.altScreen.pageDown\": {\n\t\tdefaultKeys: \"pageDown\",\n\t\tdescription: \"Scroll viewport down one page\",\n\t},\n\t\"tui.altScreen.halfPageUp\": {\n\t\tdefaultKeys: [],\n\t\tdescription: \"Scroll viewport up half a page\",\n\t},\n\t\"tui.altScreen.halfPageDown\": {\n\t\tdefaultKeys: [],\n\t\tdescription: \"Scroll viewport down half a page\",\n\t},\n\t\"tui.altScreen.lineUp\": {\n\t\tdefaultKeys: [],\n\t\tdescription: \"Scroll viewport up one line\",\n\t},\n\t\"tui.altScreen.lineDown\": {\n\t\tdefaultKeys: [],\n\t\tdescription: \"Scroll viewport down one line\",\n\t},\n\t\"tui.altScreen.previousPrompt\": {\n\t\tdefaultKeys: \"ctrl+shift+up\",\n\t\tdescription: \"Jump to previous semantic prompt\",\n\t},\n\t\"tui.altScreen.nextPrompt\": {\n\t\tdefaultKeys: \"ctrl+shift+down\",\n\t\tdescription: \"Jump to next semantic prompt\",\n\t},\n\t\"tui.altScreen.search\": {\n\t\tdefaultKeys: \"ctrl+shift+f\",\n\t\tdescription: \"Search the primary scroll view\",\n\t},\n\t\"tui.altScreen.searchNext\": {\n\t\tdefaultKeys: [\"enter\", \"ctrl+g\"],\n\t\tdescription: \"Select the next search match\",\n\t},\n\t\"tui.altScreen.searchPrevious\": {\n\t\tdefaultKeys: [\"shift+enter\", \"ctrl+shift+g\"],\n\t\tdescription: \"Select the previous search match\",\n\t},\n\t\"tui.altScreen.searchClose\": {\n\t\tdefaultKeys: \"escape\",\n\t\tdescription: \"Close transcript search\",\n\t},\n\t\"tui.altScreen.top\": { defaultKeys: \"home\", description: \"Scroll viewport to top\" },\n\t\"tui.altScreen.bottom\": { defaultKeys: \"end\", description: \"Scroll viewport to bottom\" },\n} as const satisfies KeybindingDefinitions;\n\nexport interface KeybindingConflict {\n\tkey: KeyId;\n\tkeybindings: string[];\n}\n\nfunction normalizeKeys(keys: KeyId | KeyId[] | undefined): KeyId[] {\n\tif (keys === undefined) return [];\n\tconst keyList = Array.isArray(keys) ? keys : [keys];\n\tconst seen = new Set<KeyId>();\n\tconst result: KeyId[] = [];\n\tfor (const key of keyList) {\n\t\tif (!seen.has(key)) {\n\t\t\tseen.add(key);\n\t\t\tresult.push(key);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class KeybindingsManager {\n\tprivate definitions: KeybindingDefinitions;\n\tprivate userBindings: KeybindingsConfig;\n\tprivate keysById = new Map<Keybinding, KeyId[]>();\n\tprivate conflicts: KeybindingConflict[] = [];\n\n\tconstructor(definitions: KeybindingDefinitions, userBindings: KeybindingsConfig = {}) {\n\t\tthis.definitions = definitions;\n\t\tthis.userBindings = userBindings;\n\t\tthis.rebuild();\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.keysById.clear();\n\t\tthis.conflicts = [];\n\n\t\tconst userClaims = new Map<KeyId, Set<Keybinding>>();\n\t\tfor (const [keybinding, keys] of Object.entries(this.userBindings)) {\n\t\t\tif (!(keybinding in this.definitions)) continue;\n\t\t\tfor (const key of normalizeKeys(keys)) {\n\t\t\t\tconst claimants = userClaims.get(key) ?? new Set<Keybinding>();\n\t\t\t\tclaimants.add(keybinding as Keybinding);\n\t\t\t\tuserClaims.set(key, claimants);\n\t\t\t}\n\t\t}\n\n\t\tfor (const [key, keybindings] of userClaims) {\n\t\t\tif (keybindings.size > 1) {\n\t\t\t\tthis.conflicts.push({ key, keybindings: [...keybindings] });\n\t\t\t}\n\t\t}\n\n\t\tfor (const [id, definition] of Object.entries(this.definitions)) {\n\t\t\tconst userKeys = this.userBindings[id];\n\t\t\tconst keys = userKeys === undefined ? normalizeKeys(definition.defaultKeys) : normalizeKeys(userKeys);\n\t\t\tthis.keysById.set(id as Keybinding, keys);\n\t\t}\n\t}\n\n\tmatches(data: string, keybinding: Keybinding): boolean {\n\t\tconst keys = this.keysById.get(keybinding) ?? [];\n\t\tfor (const key of keys) {\n\t\t\tif (matchesKey(data, key)) return true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tgetKeys(keybinding: Keybinding): KeyId[] {\n\t\treturn [...(this.keysById.get(keybinding) ?? [])];\n\t}\n\n\tgetDefinition(keybinding: Keybinding): KeybindingDefinition {\n\t\treturn this.definitions[keybinding];\n\t}\n\n\tgetConflicts(): KeybindingConflict[] {\n\t\treturn this.conflicts.map((conflict) => ({ ...conflict, keybindings: [...conflict.keybindings] }));\n\t}\n\n\tsetUserBindings(userBindings: KeybindingsConfig): void {\n\t\tthis.userBindings = userBindings;\n\t\tthis.rebuild();\n\t}\n\n\tgetUserBindings(): KeybindingsConfig {\n\t\treturn { ...this.userBindings };\n\t}\n\n\tgetResolvedBindings(): KeybindingsConfig {\n\t\tconst resolved: KeybindingsConfig = {};\n\t\tfor (const id of Object.keys(this.definitions)) {\n\t\t\tconst keys = this.keysById.get(id as Keybinding) ?? [];\n\t\t\tresolved[id] = keys.length === 1 ? keys[0]! : [...keys];\n\t\t}\n\t\treturn resolved;\n\t}\n}\n\nlet globalKeybindings: KeybindingsManager | null = null;\n\nexport function setKeybindings(keybindings: KeybindingsManager): void {\n\tglobalKeybindings = keybindings;\n}\n\nexport function getKeybindings(): KeybindingsManager {\n\tif (!globalKeybindings) {\n\t\tglobalKeybindings = new KeybindingsManager(TUI_KEYBINDINGS);\n\t}\n\treturn globalKeybindings;\n}\n","// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\nimport { visibleWidth } from \"./pi-tui-utils.ts\";\n\nconst SYMBOLS: Readonly<Record<string, string>> = {\n\talpha: \"α\",\n\tbeta: \"β\",\n\tgamma: \"γ\",\n\tdelta: \"δ\",\n\tepsilon: \"ϵ\",\n\tvarepsilon: \"ε\",\n\tzeta: \"ζ\",\n\teta: \"η\",\n\ttheta: \"θ\",\n\tvartheta: \"ϑ\",\n\tiota: \"ι\",\n\tkappa: \"κ\",\n\tvarkappa: \"ϰ\",\n\tlambda: \"λ\",\n\tmu: \"μ\",\n\tnu: \"ν\",\n\txi: \"ξ\",\n\tpi: \"π\",\n\tvarpi: \"ϖ\",\n\trho: \"ρ\",\n\tvarrho: \"ϱ\",\n\tsigma: \"σ\",\n\tvarsigma: \"ς\",\n\ttau: \"τ\",\n\tupsilon: \"υ\",\n\tphi: \"ϕ\",\n\tvarphi: \"φ\",\n\tchi: \"χ\",\n\tpsi: \"ψ\",\n\tomega: \"ω\",\n\tGamma: \"Γ\",\n\tDelta: \"Δ\",\n\tTheta: \"Θ\",\n\tLambda: \"Λ\",\n\tXi: \"Ξ\",\n\tPi: \"Π\",\n\tSigma: \"Σ\",\n\tUpsilon: \"Υ\",\n\tPhi: \"Φ\",\n\tPsi: \"Ψ\",\n\tOmega: \"Ω\",\n\tpm: \"±\",\n\tmp: \"∓\",\n\ttimes: \"×\",\n\tdiv: \"÷\",\n\tcdot: \"·\",\n\tast: \"∗\",\n\tstar: \"⋆\",\n\tcirc: \"∘\",\n\tbullet: \"•\",\n\toplus: \"⊕\",\n\tominus: \"⊖\",\n\totimes: \"⊗\",\n\toslash: \"⊘\",\n\todot: \"⊙\",\n\tbigcirc: \"○\",\n\tdagger: \"†\",\n\tddagger: \"‡\",\n\tamalg: \"⨿\",\n\tuplus: \"⊎\",\n\tsqcap: \"⊓\",\n\tsqcup: \"⊔\",\n\ttriangleleft: \"◁\",\n\ttriangleright: \"▷\",\n\twr: \"≀\",\n\tcap: \"∩\",\n\tcup: \"∪\",\n\tbigcap: \"⋂\",\n\tbigcup: \"⋃\",\n\tbigwedge: \"⋀\",\n\tbigvee: \"⋁\",\n\tbigsqcup: \"⨆\",\n\tbiguplus: \"⨄\",\n\tbigoplus: \"⨁\",\n\tbigotimes: \"⨂\",\n\tbigodot: \"⨀\",\n\tsetminus: \"∖\",\n\tin: \"∈\",\n\tnotin: \"∉\",\n\tni: \"∋\",\n\tsubset: \"⊂\",\n\tsupset: \"⊃\",\n\tsubseteq: \"⊆\",\n\tsupseteq: \"⊇\",\n\tsqsubset: \"⊏\",\n\tsqsupset: \"⊐\",\n\tsqsubseteq: \"⊑\",\n\tsqsupseteq: \"⊒\",\n\tprec: \"≺\",\n\tpreceq: \"≼\",\n\tsucc: \"≻\",\n\tsucceq: \"≽\",\n\tll: \"≪\",\n\tgg: \"≫\",\n\tle: \"≤\",\n\tleq: \"≤\",\n\tleqslant: \"≤\",\n\tge: \"≥\",\n\tgeq: \"≥\",\n\tgeqslant: \"≥\",\n\tne: \"≠\",\n\tneq: \"≠\",\n\tequiv: \"≡\",\n\tapprox: \"≈\",\n\tsim: \"∼\",\n\tsimeq: \"≃\",\n\tcong: \"≅\",\n\tasymp: \"≍\",\n\tdoteq: \"≐\",\n\tpropto: \"∝\",\n\tparallel: \"∥\",\n\tperp: \"⊥\",\n\tmid: \"∣\",\n\tvdash: \"⊢\",\n\tdashv: \"⊣\",\n\tmodels: \"⊨\",\n\tVdash: \"⊩\",\n\tVvdash: \"⊪\",\n\tnvdash: \"⊬\",\n\tnvDash: \"⊭\",\n\tforall: \"∀\",\n\texists: \"∃\",\n\tnexists: \"∄\",\n\tneg: \"¬\",\n\tland: \"∧\",\n\twedge: \"∧\",\n\tlor: \"∨\",\n\tvee: \"∨\",\n\tto: \"→\",\n\trightarrow: \"→\",\n\tlongrightarrow: \"→\",\n\tleftarrow: \"←\",\n\tlongleftarrow: \"←\",\n\tgets: \"←\",\n\tleftrightarrow: \"↔\",\n\tlongleftrightarrow: \"↔\",\n\thookleftarrow: \"↩\",\n\thookrightarrow: \"↪\",\n\ttwoheadleftarrow: \"↞\",\n\ttwoheadrightarrow: \"↠\",\n\tleftharpoonup: \"↼\",\n\tleftharpoondown: \"↽\",\n\trightharpoonup: \"⇀\",\n\trightharpoondown: \"⇁\",\n\trightleftharpoons: \"⇌\",\n\tleftrightharpoons: \"⇋\",\n\tnearrow: \"↗\",\n\tsearrow: \"↘\",\n\tswarrow: \"↙\",\n\tnwarrow: \"↖\",\n\trightsquigarrow: \"⇝\",\n\tleadsto: \"⇝\",\n\tRightarrow: \"⇒\",\n\tLongrightarrow: \"⇒\",\n\tLeftarrow: \"⇐\",\n\tLongleftarrow: \"⇐\",\n\tLeftrightarrow: \"⇔\",\n\tLongleftrightarrow: \"⇔\",\n\timplies: \"⇒\",\n\tiff: \"⇔\",\n\tmapsto: \"↦\",\n\tlongmapsto: \"↦\",\n\tuparrow: \"↑\",\n\tdownarrow: \"↓\",\n\tpartial: \"∂\",\n\tnabla: \"∇\",\n\tint: \"∫\",\n\tiint: \"∬\",\n\tiiint: \"∭\",\n\toint: \"∮\",\n\tsum: \"∑\",\n\tprod: \"∏\",\n\tcoprod: \"∐\",\n\tinfty: \"∞\",\n\temptyset: \"∅\",\n\tvarnothing: \"∅\",\n\tangle: \"∠\",\n\ttherefore: \"∴\",\n\tbecause: \"∵\",\n\taleph: \"ℵ\",\n\tbeth: \"ℶ\",\n\tgimel: \"ℷ\",\n\tdaleth: \"ℸ\",\n\ttop: \"⊤\",\n\tbot: \"⊥\",\n\ttriangle: \"△\",\n\tsquare: \"□\",\n\tlozenge: \"◊\",\n\tcheckmark: \"✓\",\n\tcomplement: \"∁\",\n\twp: \"℘\",\n\tprime: \"′\",\n\tldots: \"…\",\n\tdots: \"…\",\n\tcdots: \"⋯\",\n\tvdots: \"⋮\",\n\tddots: \"⋱\",\n\tell: \"ℓ\",\n\thbar: \"ℏ\",\n\tIm: \"ℑ\",\n\tRe: \"ℜ\",\n\tlangle: \"⟨\",\n\trangle: \"⟩\",\n\tvert: \"|\",\n\tlvert: \"|\",\n\trvert: \"|\",\n\tVert: \"‖\",\n\tlVert: \"‖\",\n\trVert: \"‖\",\n\tlbrace: \"{\",\n\trbrace: \"}\",\n\tbackslash: \"\\\\\",\n\tlfloor: \"⌊\",\n\trfloor: \"⌋\",\n\tlceil: \"⌈\",\n\trceil: \"⌉\",\n\tcolon: \":\",\n};\n\nconst NAMED_OPERATORS = new Set([\n\t\"arccos\",\n\t\"arcsin\",\n\t\"arctan\",\n\t\"arg\",\n\t\"cos\",\n\t\"cosh\",\n\t\"cot\",\n\t\"coth\",\n\t\"csc\",\n\t\"deg\",\n\t\"det\",\n\t\"dim\",\n\t\"exp\",\n\t\"gcd\",\n\t\"hom\",\n\t\"inf\",\n\t\"ker\",\n\t\"lg\",\n\t\"lim\",\n\t\"liminf\",\n\t\"limsup\",\n\t\"ln\",\n\t\"log\",\n\t\"max\",\n\t\"min\",\n\t\"Pr\",\n\t\"sec\",\n\t\"sin\",\n\t\"sinh\",\n\t\"sup\",\n\t\"tan\",\n\t\"tanh\",\n]);\n\nconst LIMIT_OPERATORS = new Set([\n\t\"argmax\",\n\t\"argmin\",\n\t\"inf\",\n\t\"injlim\",\n\t\"lim\",\n\t\"liminf\",\n\t\"limsup\",\n\t\"max\",\n\t\"min\",\n\t\"projlim\",\n\t\"sup\",\n]);\n\nconst DISPLAY_LIMIT_SYMBOLS = new Set([\n\t\"bigcap\",\n\t\"bigcup\",\n\t\"bigodot\",\n\t\"bigoplus\",\n\t\"bigotimes\",\n\t\"bigsqcup\",\n\t\"biguplus\",\n\t\"bigvee\",\n\t\"bigwedge\",\n\t\"coprod\",\n\t\"int\",\n\t\"iint\",\n\t\"iiint\",\n\t\"oint\",\n\t\"prod\",\n\t\"sum\",\n]);\n\nconst RELATION_COMMANDS = new Set([\n\t\"Leftarrow\",\n\t\"Leftrightarrow\",\n\t\"Longleftarrow\",\n\t\"Longleftrightarrow\",\n\t\"Longrightarrow\",\n\t\"Rightarrow\",\n\t\"Vdash\",\n\t\"Vvdash\",\n\t\"approx\",\n\t\"asymp\",\n\t\"cong\",\n\t\"dashv\",\n\t\"doteq\",\n\t\"downarrow\",\n\t\"equiv\",\n\t\"ge\",\n\t\"geq\",\n\t\"geqslant\",\n\t\"gets\",\n\t\"gg\",\n\t\"hookleftarrow\",\n\t\"hookrightarrow\",\n\t\"iff\",\n\t\"implies\",\n\t\"in\",\n\t\"leadsto\",\n\t\"le\",\n\t\"leftarrow\",\n\t\"leftharpoondown\",\n\t\"leftharpoonup\",\n\t\"leftrightarrow\",\n\t\"leftrightharpoons\",\n\t\"leq\",\n\t\"leqslant\",\n\t\"ll\",\n\t\"longleftarrow\",\n\t\"longleftrightarrow\",\n\t\"longmapsto\",\n\t\"longrightarrow\",\n\t\"mapsto\",\n\t\"mid\",\n\t\"models\",\n\t\"ne\",\n\t\"nearrow\",\n\t\"neq\",\n\t\"ni\",\n\t\"notin\",\n\t\"nvdash\",\n\t\"nvDash\",\n\t\"nwarrow\",\n\t\"parallel\",\n\t\"perp\",\n\t\"prec\",\n\t\"preceq\",\n\t\"propto\",\n\t\"rightharpoondown\",\n\t\"rightharpoonup\",\n\t\"rightleftharpoons\",\n\t\"rightarrow\",\n\t\"rightsquigarrow\",\n\t\"searrow\",\n\t\"sim\",\n\t\"simeq\",\n\t\"sqsubset\",\n\t\"sqsubseteq\",\n\t\"sqsupset\",\n\t\"sqsupseteq\",\n\t\"subset\",\n\t\"subseteq\",\n\t\"succ\",\n\t\"succeq\",\n\t\"supset\",\n\t\"supseteq\",\n\t\"swarrow\",\n\t\"to\",\n\t\"triangleleft\",\n\t\"triangleright\",\n\t\"twoheadleftarrow\",\n\t\"twoheadrightarrow\",\n\t\"uparrow\",\n\t\"vdash\",\n]);\n\nconst NEGATED_SYMBOLS: Readonly<Record<string, string>> = {\n\t\"<\": \"≮\",\n\t\">\": \"≯\",\n\t\"=\": \"≠\",\n\t\"∈\": \"∉\",\n\t\"∋\": \"∌\",\n\t\"∣\": \"∤\",\n\t\"∥\": \"∦\",\n\t\"∼\": \"≁\",\n\t\"≃\": \"≄\",\n\t\"≅\": \"≇\",\n\t\"≈\": \"≉\",\n\t\"≡\": \"≢\",\n\t\"≤\": \"≰\",\n\t\"≥\": \"≱\",\n\t\"≺\": \"⊀\",\n\t\"≻\": \"⊁\",\n\t\"⊂\": \"⊄\",\n\t\"⊃\": \"⊅\",\n\t\"⊆\": \"⊈\",\n\t\"⊇\": \"⊉\",\n\t\"⊢\": \"⊬\",\n\t\"⊨\": \"⊭\",\n\t\"↔\": \"↮\",\n\t\"←\": \"↚\",\n\t\"→\": \"↛\",\n\t\"⇒\": \"⇏\",\n\t\"⇐\": \"⇍\",\n\t\"⇔\": \"⇎\",\n\t\"≼\": \"⋠\",\n\t\"≽\": \"⋡\",\n};\n\nconst BLACKBOARD: Readonly<Record<string, string>> = {\n\tC: \"ℂ\",\n\tH: \"ℍ\",\n\tN: \"ℕ\",\n\tP: \"ℙ\",\n\tQ: \"ℚ\",\n\tR: \"ℝ\",\n\tZ: \"ℤ\",\n};\n\nconst SUPERSCRIPTS: Readonly<Record<string, string>> = {\n\t\"0\": \"⁰\",\n\t\"1\": \"¹\",\n\t\"2\": \"²\",\n\t\"3\": \"³\",\n\t\"4\": \"⁴\",\n\t\"5\": \"⁵\",\n\t\"6\": \"⁶\",\n\t\"7\": \"⁷\",\n\t\"8\": \"⁸\",\n\t\"9\": \"⁹\",\n\t\"+\": \"⁺\",\n\t\"-\": \"⁻\",\n\t\"=\": \"⁼\",\n\t\"(\": \"⁽\",\n\t\")\": \"⁾\",\n\ta: \"ᵃ\",\n\tb: \"ᵇ\",\n\tc: \"ᶜ\",\n\td: \"ᵈ\",\n\te: \"ᵉ\",\n\tf: \"ᶠ\",\n\tg: \"ᵍ\",\n\th: \"ʰ\",\n\ti: \"ⁱ\",\n\tj: \"ʲ\",\n\tk: \"ᵏ\",\n\tl: \"ˡ\",\n\tm: \"ᵐ\",\n\tn: \"ⁿ\",\n\to: \"ᵒ\",\n\tp: \"ᵖ\",\n\tr: \"ʳ\",\n\ts: \"ˢ\",\n\tt: \"ᵗ\",\n\tu: \"ᵘ\",\n\tv: \"ᵛ\",\n\tw: \"ʷ\",\n\tx: \"ˣ\",\n\ty: \"ʸ\",\n\tz: \"ᶻ\",\n};\n\nconst SUBSCRIPTS: Readonly<Record<string, string>> = {\n\t\"0\": \"₀\",\n\t\"1\": \"₁\",\n\t\"2\": \"₂\",\n\t\"3\": \"₃\",\n\t\"4\": \"₄\",\n\t\"5\": \"₅\",\n\t\"6\": \"₆\",\n\t\"7\": \"₇\",\n\t\"8\": \"₈\",\n\t\"9\": \"₉\",\n\t\"+\": \"₊\",\n\t\"-\": \"₋\",\n\t\"=\": \"₌\",\n\t\"(\": \"₍\",\n\t\")\": \"₎\",\n\ta: \"ₐ\",\n\te: \"ₑ\",\n\th: \"ₕ\",\n\ti: \"ᵢ\",\n\tj: \"ⱼ\",\n\tk: \"ₖ\",\n\tl: \"ₗ\",\n\tm: \"ₘ\",\n\tn: \"ₙ\",\n\to: \"ₒ\",\n\tp: \"ₚ\",\n\tr: \"ᵣ\",\n\ts: \"ₛ\",\n\tt: \"ₜ\",\n\tu: \"ᵤ\",\n\tv: \"ᵥ\",\n\tx: \"ₓ\",\n};\n\nconst SPACING_COMMANDS = new Set([\n\t\",\",\n\t\":\",\n\t\";\",\n\t\" \",\n\t\">\",\n\t\"enspace\",\n\t\"enskip\",\n\t\"medspace\",\n\t\"quad\",\n\t\"qquad\",\n\t\"thickspace\",\n\t\"thinspace\",\n]);\nconst NEGATIVE_SPACING_COMMANDS = new Set([\"!\", \"negmedspace\", \"negthickspace\", \"negthinspace\"]);\nconst NEGATIVE_SPACE = \"\\u0000\";\nconst IGNORED_COMMANDS = new Set([\n\t\"displaystyle\",\n\t\"limits\",\n\t\"nolimits\",\n\t\"scriptstyle\",\n\t\"scriptscriptstyle\",\n\t\"textstyle\",\n]);\nconst SIZE_COMMANDS = new Set([\n\t\"big\",\n\t\"Big\",\n\t\"bigg\",\n\t\"Bigg\",\n\t\"bigl\",\n\t\"Bigl\",\n\t\"biggl\",\n\t\"Biggl\",\n\t\"bigr\",\n\t\"Bigr\",\n\t\"biggr\",\n\t\"Biggr\",\n]);\nconst PLAIN_WRAPPERS = new Set([\n\t\"emph\",\n\t\"mathcal\",\n\t\"mathbf\",\n\t\"mathfrak\",\n\t\"mathit\",\n\t\"mathrm\",\n\t\"mathnormal\",\n\t\"mathscr\",\n\t\"mathsf\",\n\t\"mathtt\",\n\t\"mathup\",\n\t\"mbox\",\n\t\"overbrace\",\n\t\"pmb\",\n\t\"smash\",\n\t\"substack\",\n\t\"text\",\n\t\"textbf\",\n\t\"textit\",\n\t\"textmd\",\n\t\"textnormal\",\n\t\"textrm\",\n\t\"textsc\",\n\t\"textsf\",\n\t\"textsl\",\n\t\"texttt\",\n\t\"textup\",\n\t\"underbrace\",\n\t\"bm\",\n\t\"boldsymbol\",\n]);\nconst ACCENTS: Readonly<Record<string, string>> = {\n\tacute: \"\\u0301\",\n\tbar: \"\\u0305\",\n\tbreve: \"\\u0306\",\n\tcheck: \"\\u030c\",\n\tddot: \"\\u0308\",\n\tdot: \"\\u0307\",\n\tgrave: \"\\u0300\",\n\that: \"\\u0302\",\n\tmathring: \"\\u030a\",\n\toverleftarrow: \"\\u20d6\",\n\toverleftrightarrow: \"\\u20e1\",\n\toverline: \"\\u0305\",\n\toverrightarrow: \"\\u20d7\",\n\ttilde: \"\\u0303\",\n\tunderline: \"\\u0332\",\n\tvec: \"\\u20d7\",\n\twidehat: \"\\u0302\",\n\twidetilde: \"\\u0303\",\n};\n\nfunction replaceCharacters(value: string, replacements: Readonly<Record<string, string>>): string | undefined {\n\tlet result = \"\";\n\tfor (const character of value) {\n\t\tconst replacement = replacements[character];\n\t\tif (replacement === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tresult += replacement;\n\t}\n\treturn result;\n}\n\nfunction formatScript(value: string, kind: \"sub\" | \"sup\"): string {\n\tvalue = value.trim();\n\tconst replacements = kind === \"sub\" ? SUBSCRIPTS : SUPERSCRIPTS;\n\tconst unicode = replaceCharacters(value.replace(/\\s*([=+-])\\s*/g, \"$1\"), replacements);\n\tif (unicode !== undefined) {\n\t\treturn unicode;\n\t}\n\n\tconst prefix = kind === \"sub\" ? \"_\" : \"^\";\n\tif (Array.from(value).length === 1 || (kind === \"sub\" && /^[A-Za-z]+$/.test(value))) {\n\t\treturn `${prefix}${value}`;\n\t}\n\treturn `${prefix}(${value})`;\n}\n\nfunction formatFraction(numerator: string, denominator: string): string {\n\tnumerator = numerator.trim();\n\tdenominator = denominator.trim();\n\tconst simpleNumerator = /^[\\p{L}\\p{N}.]+$/u.test(numerator);\n\tconst simpleDenominator = /^[\\p{N}.]+$/u.test(denominator) || Array.from(denominator).length === 1;\n\treturn `${simpleNumerator ? numerator : `(${numerator})`}/${simpleDenominator ? denominator : `(${denominator})`}`;\n}\n\nfunction formatRoot(value: string, symbol = \"√\"): string {\n\tvalue = value.trim();\n\treturn /^[\\p{L}\\p{N}.]+$/u.test(value) ? `${symbol}${value}` : `${symbol}(${value})`;\n}\n\nconst NAMED_OPERATOR_START = \"\\u{f0004}\";\nconst NAMED_OPERATOR_END = \"\\u{f0005}\";\nconst NAMED_OPERATOR_LEFT_SPACING_PATTERN = /(?<=[\\p{L}\\p{N})\\]}\\u{f0001}])\\u{f0004}/gu;\nconst NAMED_OPERATOR_RIGHT_SPACING_PATTERN = /\\u{f0005}(?=[\\p{L}\\p{N}√\\u{f0000}])/gu;\n\nfunction normalizeOutput(value: string): string {\n\treturn value\n\t\t.replace(NAMED_OPERATOR_LEFT_SPACING_PATTERN, \" \")\n\t\t.replaceAll(NAMED_OPERATOR_START, \"\")\n\t\t.replace(NAMED_OPERATOR_RIGHT_SPACING_PATTERN, \" \")\n\t\t.replaceAll(NAMED_OPERATOR_END, \"\")\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.replace(/[ \\t]+/g, \" \").trim())\n\t\t.filter((line, index, lines) => line.length > 0 || (index > 0 && index < lines.length - 1))\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\ninterface FractionNode {\n\ttype: \"fraction\";\n\tnumerator: string;\n\tdenominator: string;\n}\n\ninterface OperatorNode {\n\ttype: \"operator\";\n\toperator: string;\n\tlower?: string;\n\tupper?: string;\n}\n\ninterface MatrixNode {\n\ttype: \"matrix\";\n\tlines: string[];\n\tbaseline: number;\n}\n\ntype LayoutNode = FractionNode | OperatorNode | MatrixNode;\n\ninterface Layout {\n\tlines: string[];\n\twidth: number;\n\tbaseline: number;\n}\n\nconst LAYOUT_MARKER_START = \"\\u{f0000}\";\nconst LAYOUT_MARKER_END = \"\\u{f0001}\";\nconst LAYOUT_MARKER_PATTERN = /\\u{f0000}(\\d+)\\u{f0001}/gu;\nconst TRAILING_LAYOUT_MARKER_PATTERN = /\\u{f0000}(\\d+)\\u{f0001}$/u;\nconst PROTECTED_SPACE = \"\\u{f0002}\";\n\nfunction padLayoutLine(line: string, width: number, centered = false): string {\n\tconst padding = Math.max(0, width - visibleWidth(line));\n\tconst left = centered ? Math.floor(padding / 2) : 0;\n\treturn `${\" \".repeat(left)}${line}${\" \".repeat(padding - left)}`;\n}\n\nfunction joinLayouts(layouts: readonly Layout[]): Layout {\n\tif (layouts.length === 0) {\n\t\treturn { lines: [\"\"], width: 0, baseline: 0 };\n\t}\n\tconst baseline = Math.max(...layouts.map((layout) => layout.baseline));\n\tconst below = Math.max(...layouts.map((layout) => layout.lines.length - layout.baseline - 1));\n\tconst lines: string[] = [];\n\tfor (let row = 0; row <= baseline + below; row++) {\n\t\tlet line = \"\";\n\t\tfor (const layout of layouts) {\n\t\t\tconst sourceRow = row - baseline + layout.baseline;\n\t\t\tline +=\n\t\t\t\tsourceRow >= 0 && sourceRow < layout.lines.length\n\t\t\t\t\t? padLayoutLine(layout.lines[sourceRow] ?? \"\", layout.width)\n\t\t\t\t\t: \" \".repeat(layout.width);\n\t\t}\n\t\tlines.push(line.trimEnd());\n\t}\n\treturn {\n\t\tlines,\n\t\twidth: layouts.reduce((width, layout) => width + layout.width, 0),\n\t\tbaseline,\n\t};\n}\n\nfunction renderLayout(source: string, nodes: readonly LayoutNode[]): Layout {\n\tconst renderedLines: string[] = [];\n\tlet firstBaseline = 0;\n\tfor (const sourceLine of source.split(\"\\n\")) {\n\t\tconst layouts: Layout[] = [];\n\t\tlet position = 0;\n\t\tlet previousNode: LayoutNode | undefined;\n\t\tfor (const match of sourceLine.matchAll(LAYOUT_MARKER_PATTERN)) {\n\t\t\tconst index = match.index;\n\t\t\tconst node = nodes[Number(match[1])];\n\t\t\tif (!node) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (index > position) {\n\t\t\t\tconst sliced = sourceLine.slice(position, index);\n\t\t\t\tconst trimmed = (previousNode ? sliced.trimStart() : sliced).trimEnd();\n\t\t\t\tconst preserveLeadingSpace = previousNode?.type === \"matrix\" && /^\\s/.test(sliced);\n\t\t\t\tconst preserveTrailingSpace = node.type === \"matrix\" && /\\s$/.test(sliced);\n\t\t\t\tconst text = trimmed\n\t\t\t\t\t? `${preserveLeadingSpace ? \" \" : \"\"}${trimmed}${preserveTrailingSpace ? \" \" : \"\"}`\n\t\t\t\t\t: preserveLeadingSpace || preserveTrailingSpace\n\t\t\t\t\t\t? \" \"\n\t\t\t\t\t\t: \"\";\n\t\t\t\tlayouts.push({ lines: [text], width: visibleWidth(text), baseline: 0 });\n\t\t\t}\n\t\t\tif (node.type === \"fraction\") {\n\t\t\t\tconst numerator = renderLayout(node.numerator, nodes);\n\t\t\t\tconst denominator = renderLayout(node.denominator, nodes);\n\t\t\t\tconst contentWidth = Math.max(numerator.width, denominator.width, 1);\n\t\t\t\tconst width = contentWidth + 2;\n\t\t\t\tlayouts.push({\n\t\t\t\t\tlines: [\n\t\t\t\t\t\t...numerator.lines.map((line) => padLayoutLine(line, width, true)),\n\t\t\t\t\t\t` ${\"─\".repeat(contentWidth)} `,\n\t\t\t\t\t\t...denominator.lines.map((line) => padLayoutLine(line, width, true)),\n\t\t\t\t\t],\n\t\t\t\t\twidth,\n\t\t\t\t\tbaseline: numerator.lines.length,\n\t\t\t\t});\n\t\t\t} else if (node.type === \"operator\") {\n\t\t\t\tconst contentWidth = Math.max(\n\t\t\t\t\tvisibleWidth(node.operator),\n\t\t\t\t\tnode.lower === undefined ? 0 : visibleWidth(node.lower),\n\t\t\t\t\tnode.upper === undefined ? 0 : visibleWidth(node.upper),\n\t\t\t\t);\n\t\t\t\tconst lines: string[] = [];\n\t\t\t\tif (node.upper !== undefined) {\n\t\t\t\t\tlines.push(`${padLayoutLine(node.upper, contentWidth, true)} `);\n\t\t\t\t}\n\t\t\t\tlines.push(`${padLayoutLine(node.operator, contentWidth, true)} `);\n\t\t\t\tif (node.lower !== undefined) {\n\t\t\t\t\tlines.push(`${padLayoutLine(node.lower, contentWidth, true)} `);\n\t\t\t\t}\n\t\t\t\tlayouts.push({\n\t\t\t\t\tlines,\n\t\t\t\t\twidth: contentWidth + 1,\n\t\t\t\t\tbaseline: node.upper === undefined ? 0 : 1,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst width = Math.max(0, ...node.lines.map((line) => visibleWidth(line)));\n\t\t\t\tlayouts.push({\n\t\t\t\t\tlines: node.lines.map((line) => padLayoutLine(line, width)),\n\t\t\t\t\twidth,\n\t\t\t\t\tbaseline: node.baseline,\n\t\t\t\t});\n\t\t\t}\n\t\t\tposition = index + match[0].length;\n\t\t\tpreviousNode = node;\n\t\t}\n\t\tif (position < sourceLine.length) {\n\t\t\tconst sliced = sourceLine.slice(position);\n\t\t\tconst trimmed = previousNode ? sliced.trimStart() : sliced;\n\t\t\tconst text = previousNode?.type === \"matrix\" && /^\\s/.test(sliced) ? ` ${trimmed}` : trimmed;\n\t\t\tlayouts.push({ lines: [text], width: visibleWidth(text), baseline: 0 });\n\t\t}\n\t\tconst lineLayout = joinLayouts(layouts);\n\t\tif (renderedLines.length === 0) {\n\t\t\tfirstBaseline = lineLayout.baseline;\n\t\t}\n\t\trenderedLines.push(...lineLayout.lines);\n\t}\n\treturn {\n\t\tlines: renderedLines,\n\t\twidth: Math.max(0, ...renderedLines.map((line) => visibleWidth(line))),\n\t\tbaseline: firstBaseline,\n\t};\n}\n\nclass LatexParser {\n\tprivate readonly source: string;\n\tprivate readonly layoutNodes: LayoutNode[];\n\tprivate readonly display: boolean;\n\tprivate position = 0;\n\tprivate supported = true;\n\tprivate stackFractions = true;\n\n\tconstructor(source: string, layoutNodes: LayoutNode[], display: boolean) {\n\t\tthis.source = source;\n\t\tthis.layoutNodes = layoutNodes;\n\t\tthis.display = display;\n\t}\n\n\trender(): string | undefined {\n\t\tconst rendered = this.parseSequence();\n\t\tif (!this.supported || this.position !== this.source.length) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn normalizeOutput(rendered);\n\t}\n\n\tprivate parseSequence(endCharacter?: string): string {\n\t\tlet result = \"\";\n\t\twhile (this.position < this.source.length) {\n\t\t\tconst character = this.source[this.position];\n\t\t\tif (endCharacter && character === endCharacter) {\n\t\t\t\tthis.position++;\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tif (character === \"}\") {\n\t\t\t\tthis.supported = false;\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tif (character === \"{\") {\n\t\t\t\tthis.position++;\n\t\t\t\tresult += this.parseSequence(\"}\");\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (character === \"\\\\\") {\n\t\t\t\tconst command = this.parseCommand();\n\t\t\t\tif (command === NEGATIVE_SPACE) {\n\t\t\t\t\tresult = result.trimEnd();\n\t\t\t\t\tif (result.endsWith(NAMED_OPERATOR_END)) {\n\t\t\t\t\t\tresult = result.slice(0, -NAMED_OPERATOR_END.length);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresult += command;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (character === \"^\" || character === \"_\") {\n\t\t\t\tthis.position++;\n\t\t\t\tresult = result.trimEnd();\n\t\t\t\tconst script = formatScript(this.parseRequiredArgument(false), character === \"_\" ? \"sub\" : \"sup\");\n\t\t\t\tif (result.endsWith(NAMED_OPERATOR_END)) {\n\t\t\t\t\tresult = `${result.slice(0, -NAMED_OPERATOR_END.length)}${script}${NAMED_OPERATOR_END}`;\n\t\t\t\t} else {\n\t\t\t\t\tresult += script;\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (/\\s/.test(character)) {\n\t\t\t\tresult += this.parseWhitespace();\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (character === \"=\" || character === \"<\" || character === \">\") {\n\t\t\t\tresult = `${result.trimEnd()} ${character} `;\n\t\t\t\tthis.position++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (character === \"&\") {\n\t\t\t\tthis.position++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (character === \"~\") {\n\t\t\t\tthis.position++;\n\t\t\t\tresult += \" \";\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (character === \".\") {\n\t\t\t\tconst marker = TRAILING_LAYOUT_MARKER_PATTERN.exec(result);\n\t\t\t\tconst node = marker ? this.layoutNodes[Number(marker[1])] : undefined;\n\t\t\t\tif (node?.type === \"matrix\") {\n\t\t\t\t\tconst lastLine = node.lines.length - 1;\n\t\t\t\t\tnode.lines[lastLine] = `${node.lines[lastLine] ?? \"\"}${character}`;\n\t\t\t\t\tthis.position++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult += character;\n\t\t\tthis.position++;\n\t\t}\n\n\t\tif (endCharacter) {\n\t\t\tthis.supported = false;\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate parseWhitespace(): string {\n\t\twhile (this.position < this.source.length && /\\s/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\treturn \" \";\n\t}\n\n\tprivate parseCommand(): string {\n\t\tthis.position++;\n\t\tif (this.position >= this.source.length) {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\n\t\tlet command = \"\";\n\t\tconst first = this.source[this.position] ?? \"\";\n\t\tif (first === \"\\n\" || first === \"\\r\") {\n\t\t\tthis.position++;\n\t\t\tif (first === \"\\r\" && this.source[this.position] === \"\\n\") {\n\t\t\t\tthis.position++;\n\t\t\t}\n\t\t\treturn \" \";\n\t\t}\n\t\tif (/[A-Za-z]/.test(first)) {\n\t\t\tconst start = this.position;\n\t\t\twhile (this.position < this.source.length && /[A-Za-z]/.test(this.source[this.position] ?? \"\")) {\n\t\t\t\tthis.position++;\n\t\t\t}\n\t\t\tcommand = this.source.slice(start, this.position);\n\t\t} else {\n\t\t\tcommand = first;\n\t\t\tthis.position++;\n\t\t}\n\n\t\tif (command === \"\\\\\") {\n\t\t\treturn \"\\n\";\n\t\t}\n\t\tif (SPACING_COMMANDS.has(command)) {\n\t\t\treturn \" \";\n\t\t}\n\t\tif (NEGATIVE_SPACING_COMMANDS.has(command)) {\n\t\t\treturn NEGATIVE_SPACE;\n\t\t}\n\t\tif (IGNORED_COMMANDS.has(command)) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (\n\t\t\tcommand === \"{\" ||\n\t\t\tcommand === \"}\" ||\n\t\t\tcommand === \"$\" ||\n\t\t\tcommand === \"%\" ||\n\t\t\tcommand === \"#\" ||\n\t\t\tcommand === \"_\" ||\n\t\t\tcommand === \"&\"\n\t\t) {\n\t\t\treturn command;\n\t\t}\n\t\tif (command === \"|\") {\n\t\t\treturn \"‖\";\n\t\t}\n\t\tif (command === \"not\") {\n\t\t\tconst value = this.parseRequiredArgument(false).trim();\n\t\t\tconst negated = NEGATED_SYMBOLS[value];\n\t\t\tif (negated !== undefined) {\n\t\t\t\treturn ` ${negated} `;\n\t\t\t}\n\t\t\tconst characters = Array.from(value);\n\t\t\tif (characters.length === 0) {\n\t\t\t\tthis.supported = false;\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\treturn ` ${characters[0]}\\u0338${characters.slice(1).join(\"\")} `;\n\t\t}\n\t\tif (LIMIT_OPERATORS.has(command)) {\n\t\t\treturn this.parseOperator(command, \"bracket\", true, true);\n\t\t}\n\n\t\tconst symbol = SYMBOLS[command];\n\t\tif (symbol !== undefined) {\n\t\t\tif (DISPLAY_LIMIT_SYMBOLS.has(command)) {\n\t\t\t\treturn this.parseOperator(symbol, \"script\", true);\n\t\t\t}\n\t\t\treturn command === \"cdot\" || command === \"times\" || RELATION_COMMANDS.has(command) ? ` ${symbol} ` : symbol;\n\t\t}\n\t\tif (NAMED_OPERATORS.has(command)) {\n\t\t\treturn `${NAMED_OPERATOR_START}${command}${NAMED_OPERATOR_END}`;\n\t\t}\n\t\tif (SIZE_COMMANDS.has(command)) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif (command === \"left\" || command === \"middle\" || command === \"right\") {\n\t\t\tif (this.source[this.position] === \".\") {\n\t\t\t\tthis.position++;\n\t\t\t}\n\t\t\treturn \"\";\n\t\t}\n\t\tif (command === \"frac\" || command === \"dfrac\" || command === \"tfrac\") {\n\t\t\tconst shouldStack = this.display && this.stackFractions && command !== \"tfrac\";\n\t\t\tconst numerator = this.parseRequiredArgument(!shouldStack);\n\t\t\tconst denominator = this.parseRequiredArgument(!shouldStack);\n\t\t\tif (shouldStack) {\n\t\t\t\tconst index =\n\t\t\t\t\tthis.layoutNodes.push({\n\t\t\t\t\t\ttype: \"fraction\",\n\t\t\t\t\t\tnumerator: normalizeOutput(numerator),\n\t\t\t\t\t\tdenominator: normalizeOutput(denominator),\n\t\t\t\t\t}) - 1;\n\t\t\t\treturn `${LAYOUT_MARKER_START}${index}${LAYOUT_MARKER_END}`;\n\t\t\t}\n\t\t\treturn formatFraction(numerator, denominator);\n\t\t}\n\t\tif (command === \"sqrt\") {\n\t\t\tconst degree = this.parseOptionalArgument()?.trim();\n\t\t\tconst value = this.parseRequiredArgument();\n\t\t\tif (degree === undefined || degree === \"2\") {\n\t\t\t\treturn formatRoot(value);\n\t\t\t}\n\t\t\tif (degree === \"3\") {\n\t\t\t\treturn formatRoot(value, \"∛\");\n\t\t\t}\n\t\t\tif (degree === \"4\") {\n\t\t\t\treturn formatRoot(value, \"∜\");\n\t\t\t}\n\t\t\treturn `${formatScript(degree, \"sup\")}${formatRoot(value)}`;\n\t\t}\n\t\tif (command === \"boxed\" || command === \"fbox\") {\n\t\t\treturn `[${this.parseRequiredArgument().trim()}]`;\n\t\t}\n\t\tif (command === \"binom\" || command === \"dbinom\" || command === \"tbinom\") {\n\t\t\treturn `(${this.parseRequiredArgument()} choose ${this.parseRequiredArgument()})`;\n\t\t}\n\t\tconst accent = ACCENTS[command];\n\t\tif (accent !== undefined) {\n\t\t\tconst value = this.parseRequiredArgument();\n\t\t\treturn Array.from(value).length === 1 ? `${value}${accent}` : `${command}(${value})`;\n\t\t}\n\t\tif (command === \"mathbb\") {\n\t\t\tconst value = this.parseRequiredArgument();\n\t\t\treturn Array.from(value, (character) => BLACKBOARD[character] ?? character).join(\"\");\n\t\t}\n\t\tif (command === \"operatorname\") {\n\t\t\tconst starred = this.source[this.position] === \"*\";\n\t\t\tif (starred) {\n\t\t\t\tthis.position++;\n\t\t\t}\n\t\t\tconst operator = normalizeOutput(this.parseRequiredArgument()).trim();\n\t\t\treturn this.parseOperator(operator, \"bracket\", starred, true);\n\t\t}\n\t\tif (command === \"mod\" || command === \"bmod\") {\n\t\t\treturn \" mod \";\n\t\t}\n\t\tif (command === \"pmod\" || command === \"pod\") {\n\t\t\tconst value = this.parseRequiredArgument().trim();\n\t\t\treturn command === \"pmod\" ? ` (mod ${value})` : ` (${value})`;\n\t\t}\n\t\tif (command === \"overset\" || command === \"stackrel\") {\n\t\t\tconst upper = this.parseRequiredArgument();\n\t\t\tconst value = this.parseRequiredArgument().trim();\n\t\t\treturn `${value}${formatScript(upper, \"sup\")}`;\n\t\t}\n\t\tif (command === \"underset\") {\n\t\t\tconst lower = this.parseRequiredArgument();\n\t\t\tconst value = this.parseRequiredArgument().trim();\n\t\t\treturn `${value}${formatScript(lower, \"sub\")}`;\n\t\t}\n\t\tif (PLAIN_WRAPPERS.has(command)) {\n\t\t\tconst value = this.parseRequiredArgument();\n\t\t\treturn command.startsWith(\"text\") || command === \"mbox\" ? value : value.trim();\n\t\t}\n\t\tif (command === \"begin\") {\n\t\t\treturn this.parseEnvironment();\n\t\t}\n\t\tif (command === \"end\") {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\n\t\tthis.supported = false;\n\t\treturn `\\\\${command}`;\n\t}\n\n\tprivate parseOperator(\n\t\toperator: string,\n\t\tinlineLowerStyle: \"bracket\" | \"script\",\n\t\tdisplayLimits: boolean,\n\t\tspaced = false,\n\t): string {\n\t\tlet useDisplayLimits = displayLimits;\n\t\tlet modifierPosition = this.position;\n\t\twhile (modifierPosition < this.source.length && /[ \\t]/.test(this.source[modifierPosition] ?? \"\")) {\n\t\t\tmodifierPosition++;\n\t\t}\n\t\tconst modifier = /^\\\\(limits|nolimits)(?![A-Za-z])/.exec(this.source.slice(modifierPosition));\n\t\tif (modifier) {\n\t\t\tuseDisplayLimits = modifier[1] === \"limits\";\n\t\t\tthis.position = modifierPosition + modifier[0].length;\n\t\t}\n\n\t\tlet lower: string | undefined;\n\t\tlet upper: string | undefined;\n\t\twhile (true) {\n\t\t\tlet scriptPosition = this.position;\n\t\t\twhile (scriptPosition < this.source.length && /[ \\t]/.test(this.source[scriptPosition] ?? \"\")) {\n\t\t\t\tscriptPosition++;\n\t\t\t}\n\t\t\tconst kind = this.source[scriptPosition];\n\t\t\tif (kind !== \"_\" && kind !== \"^\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.position = scriptPosition + 1;\n\t\t\tconst value = normalizeOutput(this.parseRequiredArgument(false)).replaceAll(\" \", \"\");\n\t\t\tif (kind === \"_\") {\n\t\t\t\tif (lower !== undefined) {\n\t\t\t\t\tthis.supported = false;\n\t\t\t\t}\n\t\t\t\tlower = value;\n\t\t\t} else {\n\t\t\t\tif (upper !== undefined) {\n\t\t\t\t\tthis.supported = false;\n\t\t\t\t}\n\t\t\t\tupper = value;\n\t\t\t}\n\t\t}\n\n\t\tif (this.display && useDisplayLimits && (lower !== undefined || upper !== undefined)) {\n\t\t\tconst index = this.layoutNodes.push({ type: \"operator\", operator, lower, upper }) - 1;\n\t\t\treturn `${LAYOUT_MARKER_START}${index}${LAYOUT_MARKER_END}`;\n\t\t}\n\n\t\tlet rendered = operator;\n\t\tif (lower !== undefined) {\n\t\t\trendered += inlineLowerStyle === \"bracket\" ? `[${lower}]` : formatScript(lower, \"sub\");\n\t\t}\n\t\tif (upper !== undefined) {\n\t\t\trendered += formatScript(upper, \"sup\");\n\t\t}\n\t\treturn spaced ? ` ${rendered} ` : rendered;\n\t}\n\n\tprivate parseRequiredArgument(stackFractions = true): string {\n\t\tconst previousStackFractions = this.stackFractions;\n\t\tthis.stackFractions = previousStackFractions && stackFractions;\n\t\tconst value = this.parseRequiredArgumentValue();\n\t\tthis.stackFractions = previousStackFractions;\n\t\treturn value;\n\t}\n\n\tprivate parseRequiredArgumentValue(): string {\n\t\twhile (this.position < this.source.length && /\\s/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\tif (this.position >= this.source.length) {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\t\tif (this.source[this.position] === \"{\") {\n\t\t\tthis.position++;\n\t\t\treturn this.parseSequence(\"}\");\n\t\t}\n\t\tif (this.source[this.position] === \"\\\\\") {\n\t\t\treturn this.parseCommand();\n\t\t}\n\t\tconst value = this.source[this.position] ?? \"\";\n\t\tthis.position++;\n\t\treturn value;\n\t}\n\n\tprivate parseOptionalArgument(): string | undefined {\n\t\twhile (this.position < this.source.length && /[ \\t]/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\tif (this.source[this.position] !== \"[\") {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst end = this.source.indexOf(\"]\", this.position + 1);\n\t\tif (end < 0) {\n\t\t\tthis.supported = false;\n\t\t\treturn undefined;\n\t\t}\n\t\tconst value = this.source.slice(this.position + 1, end);\n\t\tthis.position = end + 1;\n\t\treturn this.renderNested(value);\n\t}\n\n\tprivate readRawGroup(): string | undefined {\n\t\twhile (this.position < this.source.length && /[ \\t]/.test(this.source[this.position] ?? \"\")) {\n\t\t\tthis.position++;\n\t\t}\n\t\tif (this.source[this.position] !== \"{\") {\n\t\t\tthis.supported = false;\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst start = ++this.position;\n\t\tlet depth = 1;\n\t\twhile (this.position < this.source.length) {\n\t\t\tconst character = this.source[this.position];\n\t\t\tif (character === \"\\\\\") {\n\t\t\t\tthis.position += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (character === \"{\") depth++;\n\t\t\tif (character === \"}\") depth--;\n\t\t\tif (depth === 0) {\n\t\t\t\tconst value = this.source.slice(start, this.position);\n\t\t\t\tthis.position++;\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tthis.position++;\n\t\t}\n\t\tthis.supported = false;\n\t\treturn undefined;\n\t}\n\n\tprivate splitEnvironmentRows(body: string): string[] {\n\t\treturn body.split(/\\\\\\\\(?:\\[[^\\]\\n]*\\])?/);\n\t}\n\n\tprivate parseEnvironment(): string {\n\t\tconst environment = this.readRawGroup();\n\t\tif (!environment) {\n\t\t\treturn \"\";\n\t\t}\n\t\tconst endMarker = `\\\\end{${environment}}`;\n\t\tconst end = this.source.indexOf(endMarker, this.position);\n\t\tif (end < 0) {\n\t\t\tthis.supported = false;\n\t\t\treturn \"\";\n\t\t}\n\t\tconst body = this.source.slice(this.position, end);\n\t\tthis.position = end + endMarker.length;\n\n\t\tif (environment === \"equation\" || environment === \"equation*\" || environment === \"displaymath\") {\n\t\t\treturn this.renderNested(body).trim();\n\t\t}\n\n\t\tif (\n\t\t\tenvironment === \"aligned\" ||\n\t\t\tenvironment === \"align\" ||\n\t\t\tenvironment === \"align*\" ||\n\t\t\tenvironment === \"alignedat\" ||\n\t\t\tenvironment === \"alignat\" ||\n\t\t\tenvironment === \"alignat*\" ||\n\t\t\tenvironment === \"gather\" ||\n\t\t\tenvironment === \"gathered\" ||\n\t\t\tenvironment === \"multline\" ||\n\t\t\tenvironment === \"multline*\" ||\n\t\t\tenvironment === \"split\"\n\t\t) {\n\t\t\tconst alignedAt = [\"alignedat\", \"alignat\", \"alignat*\"].includes(environment);\n\t\t\tconst alignedBody = alignedAt ? body.replace(/^\\s*\\{[^}]*\\}/, \"\") : body;\n\t\t\treturn this.splitEnvironmentRows(alignedBody)\n\t\t\t\t.map((row) => {\n\t\t\t\t\tconst cells = row.split(\"&\");\n\t\t\t\t\tconst source = alignedAt\n\t\t\t\t\t\t? Array.from({ length: Math.ceil(cells.length / 2) }, (_, index) =>\n\t\t\t\t\t\t\t\tcells.slice(index * 2, index * 2 + 2).join(\"\"),\n\t\t\t\t\t\t\t).join(\" \")\n\t\t\t\t\t\t: cells.join(\"\");\n\t\t\t\t\treturn this.renderNested(source).trim();\n\t\t\t\t})\n\t\t\t\t.filter(Boolean)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tif (environment === \"cases\" || environment === \"cases*\") {\n\t\t\tconst rows = this.splitEnvironmentRows(body)\n\t\t\t\t.map((row) => row.split(\"&\").map((cell) => this.renderNested(cell, false).trim()))\n\t\t\t\t.filter((row) => row.some(Boolean));\n\t\t\treturn rows\n\t\t\t\t.map((row, index) => {\n\t\t\t\t\tconst value = (row[0] ?? \"\").replace(/,\\s*$/, \"\");\n\t\t\t\t\tconst condition = row[1] ?? \"\";\n\t\t\t\t\tconst delimiter = index === 0 ? \"⎧\" : index === rows.length - 1 ? \"⎩\" : \"⎨\";\n\t\t\t\t\tconst conditionPrefix = /^(?:if|when|for|otherwise)\\b/i.test(condition) ? \" \" : \" if \";\n\t\t\t\t\treturn `${delimiter} ${value}${condition ? `${conditionPrefix}${condition}` : \"\"}`;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tif (\n\t\t\t[\"array\", \"matrix\", \"smallmatrix\", \"pmatrix\", \"bmatrix\", \"Bmatrix\", \"vmatrix\", \"Vmatrix\"].includes(environment)\n\t\t) {\n\t\t\tconst matrixBody = environment === \"array\" ? body.replace(/^\\s*\\{[^}]*\\}/, \"\") : body;\n\t\t\treturn this.renderMatrix(environment, matrixBody);\n\t\t}\n\n\t\tthis.supported = false;\n\t\treturn body;\n\t}\n\n\tprivate renderMatrix(environment: string, body: string): string {\n\t\tconst matrix = this.splitEnvironmentRows(body)\n\t\t\t.map((row) => row.split(\"&\").map((cell) => this.renderNested(cell, false).trim()))\n\t\t\t.filter((row) => row.some(Boolean));\n\t\tconst columnCount = Math.max(0, ...matrix.map((row) => row.length));\n\t\tconst columnWidths = Array.from({ length: columnCount }, (_, column) =>\n\t\t\tMath.max(0, ...matrix.map((row) => visibleWidth(row[column] ?? \"\"))),\n\t\t);\n\t\tconst rows = matrix.map((row) =>\n\t\t\tArray.from({ length: columnCount }, (_, column) => {\n\t\t\t\tconst cell = row[column] ?? \"\";\n\t\t\t\treturn `${cell}${PROTECTED_SPACE.repeat(Math.max(0, (columnWidths[column] ?? 0) - visibleWidth(cell)))}`;\n\t\t\t}).join(\" │ \"),\n\t\t);\n\n\t\tlet lines: string[];\n\t\tif (environment === \"array\" || environment === \"matrix\" || environment === \"smallmatrix\") {\n\t\t\tlines = rows;\n\t\t} else {\n\t\t\tconst delimiters: Readonly<Record<string, readonly [string, string, string, string, string, string]>> = {\n\t\t\t\tpmatrix: [\"⎛\", \"⎞\", \"⎜\", \"⎟\", \"⎝\", \"⎠\"],\n\t\t\t\tbmatrix: [\"⎡\", \"⎤\", \"⎢\", \"⎥\", \"⎣\", \"⎦\"],\n\t\t\t\tBmatrix: [\"⎧\", \"⎫\", \"⎨\", \"⎬\", \"⎩\", \"⎭\"],\n\t\t\t\tvmatrix: [\"│\", \"│\", \"│\", \"│\", \"│\", \"│\"],\n\t\t\t\tVmatrix: [\"║\", \"║\", \"║\", \"║\", \"║\", \"║\"],\n\t\t\t};\n\t\t\tconst delimiter = delimiters[environment];\n\t\t\tif (!delimiter) {\n\t\t\t\tthis.supported = false;\n\t\t\t\treturn rows.join(\"\\n\");\n\t\t\t}\n\t\t\tlines = rows.map((row, index) => {\n\t\t\t\tconst left = index === 0 ? delimiter[0] : index === rows.length - 1 ? delimiter[4] : delimiter[2];\n\t\t\t\tconst right = index === 0 ? delimiter[1] : index === rows.length - 1 ? delimiter[5] : delimiter[3];\n\t\t\t\treturn `${left} ${row} ${right}`;\n\t\t\t});\n\t\t}\n\n\t\tif (lines.length <= 1) {\n\t\t\treturn lines[0] ?? \"\";\n\t\t}\n\t\tconst index = this.layoutNodes.push({ type: \"matrix\", lines, baseline: 0 }) - 1;\n\t\treturn `${LAYOUT_MARKER_START}${index}${LAYOUT_MARKER_END}`;\n\t}\n\n\tprivate renderNested(source: string, stackFractions = true): string {\n\t\tconst rendered = new LatexParser(source, this.layoutNodes, this.display && stackFractions).render();\n\t\tif (rendered === undefined) {\n\t\t\tthis.supported = false;\n\t\t\treturn source;\n\t\t}\n\t\treturn rendered;\n\t}\n}\n\nexport interface RenderLatexOptions {\n\t/** Stack fractions and operator limits vertically for display math (default: false). */\n\tdisplay?: boolean;\n}\n\n/**\n * Render a basic LaTeX math expression as terminal-friendly Unicode text.\n * Returns undefined when the expression contains unsupported or malformed syntax.\n */\nexport function renderLatex(source: string, options: RenderLatexOptions = {}): string | undefined {\n\tconst layoutNodes: LayoutNode[] = [];\n\tconst rendered = new LatexParser(source, layoutNodes, options.display === true).render();\n\tif (rendered === undefined) {\n\t\treturn undefined;\n\t}\n\tif (layoutNodes.length === 0) {\n\t\treturn rendered.replaceAll(PROTECTED_SPACE, \" \");\n\t}\n\tconst lines = renderLayout(rendered, layoutNodes).lines;\n\tconst indentation = Math.min(\n\t\t...lines.filter((line) => line.trim()).map((line) => line.length - line.trimStart().length),\n\t);\n\treturn lines\n\t\t.map((line) => line.slice(indentation).trimEnd())\n\t\t.join(\"\\n\")\n\t\t.trimEnd()\n\t\t.replaceAll(PROTECTED_SPACE, \" \");\n}\n","// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\nimport { execSync } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\nexport type ImageProtocol = \"kitty\" | \"iterm2\" | null;\n\nexport interface TerminalCapabilities {\n\timages: ImageProtocol;\n\ttrueColor: boolean;\n\thyperlinks: boolean;\n}\n\nexport interface CellDimensions {\n\twidthPx: number;\n\theightPx: number;\n}\n\nexport interface ImageDimensions {\n\twidthPx: number;\n\theightPx: number;\n}\n\nexport interface ImageRenderOptions {\n\tmaxWidthCells?: number;\n\tmaxHeightCells?: number;\n\tpreserveAspectRatio?: boolean;\n\t/** Kitty image ID. If provided, reuses/replaces existing image with this ID. */\n\timageId?: number;\n\t/** Whether Kitty should apply its default cursor movement after placement. */\n\tmoveCursor?: boolean;\n}\n\nlet cachedCapabilities: TerminalCapabilities | null = null;\n\n// Default cell dimensions - updated by TUI when terminal responds to query\nlet cellDimensions: CellDimensions = { widthPx: 9, heightPx: 18 };\n\nexport function getCellDimensions(): CellDimensions {\n\treturn cellDimensions;\n}\n\nexport function setCellDimensions(dims: CellDimensions): void {\n\tcellDimensions = dims;\n}\n\n/**\n * Checks whether the attached tmux client forwards OSC 8 hyperlinks to the\n * outer terminal. tmux only re-emits them when its `client_termfeatures` lists\n * `hyperlinks`, and strips them otherwise. On any error fallbacks `false`.\n */\nfunction probeTmuxHyperlinks(): boolean {\n\ttry {\n\t\tconst termfeatures = execSync(\"tmux display-message -p '#{client_termfeatures}'\", {\n\t\t\tencoding: \"utf8\",\n\t\t\ttimeout: 250,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t});\n\t\treturn termfeatures\n\t\t\t.split(\",\")\n\t\t\t.map((feature) => feature.trim())\n\t\t\t.includes(\"hyperlinks\");\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function detectCapabilities(tmuxForwardsHyperlink: () => boolean = probeTmuxHyperlinks): TerminalCapabilities {\n\tconst termProgram = process.env.TERM_PROGRAM?.toLowerCase() || \"\";\n\tconst terminalEmulator = process.env.TERMINAL_EMULATOR?.toLowerCase() || \"\";\n\tconst term = process.env.TERM?.toLowerCase() || \"\";\n\tconst colorTerm = process.env.COLORTERM?.toLowerCase() || \"\";\n\tconst hasTrueColorHint = colorTerm === \"truecolor\" || colorTerm === \"24bit\";\n\tconst isWindowsConsole = process.platform === \"win32\";\n\n\t// Emit OSC 8 hyperlinks only when tmux confirms it forwards.\n\t// Image protocols are unreliable under tmux, so leave `images: null`.\n\tif (process.env.TMUX || term.startsWith(\"tmux\")) {\n\t\treturn { images: null, trueColor: hasTrueColorHint, hyperlinks: tmuxForwardsHyperlink() };\n\t}\n\n\t// screen does not forward OSC 8 hyperlinks, so keep them off there.\n\tif (term.startsWith(\"screen\")) {\n\t\treturn { images: null, trueColor: hasTrueColorHint, hyperlinks: false };\n\t}\n\n\tif (process.env.KITTY_WINDOW_ID || termProgram === \"kitty\") {\n\t\treturn { images: \"kitty\", trueColor: true, hyperlinks: true };\n\t}\n\n\tif (termProgram === \"ghostty\" || term.includes(\"ghostty\") || process.env.GHOSTTY_RESOURCES_DIR) {\n\t\treturn { images: \"kitty\", trueColor: true, hyperlinks: true };\n\t}\n\n\tif (process.env.WEZTERM_PANE || termProgram === \"wezterm\") {\n\t\treturn { images: \"kitty\", trueColor: true, hyperlinks: true };\n\t}\n\n\t// Warp supports the Kitty graphics protocol and OSC 8 hyperlinks.\n\tif (termProgram === \"warpterminal\" || process.env.WARP_SESSION_ID || process.env.WARP_TERMINAL_SESSION_UUID) {\n\t\treturn { images: \"kitty\", trueColor: true, hyperlinks: true };\n\t}\n\n\tif (process.env.ITERM_SESSION_ID || termProgram === \"iterm.app\") {\n\t\treturn { images: \"iterm2\", trueColor: true, hyperlinks: true };\n\t}\n\n\tif (process.env.WT_SESSION) {\n\t\treturn { images: null, trueColor: true, hyperlinks: true };\n\t}\n\n\tif (termProgram === \"vscode\") {\n\t\treturn { images: null, trueColor: true, hyperlinks: true };\n\t}\n\n\tif (termProgram === \"alacritty\") {\n\t\treturn { images: null, trueColor: true, hyperlinks: true };\n\t}\n\n\tif (terminalEmulator === \"jetbrains-jediterm\") {\n\t\treturn { images: null, trueColor: true, hyperlinks: false };\n\t}\n\n\t// Windows Terminal does not always set WT_SESSION, for example when it hosts\n\t// a cmd.exe launched directly from Win+R. Modern Windows consoles support\n\t// truecolor; keep hyperlinks off unless we positively detected support above.\n\tif (isWindowsConsole) {\n\t\treturn { images: null, trueColor: true, hyperlinks: false };\n\t}\n\n\t// Unknown terminal: be conservative. OSC 8 is rendered invisibly as \"just\n\t// text\" on terminals that swallow it, which means the URL disappears from\n\t// the rendered output. Default to the legacy `text (url)` behavior unless we\n\t// have positively identified a hyperlink-capable terminal above.\n\treturn { images: null, trueColor: hasTrueColorHint, hyperlinks: false };\n}\n\nexport function getCapabilities(): TerminalCapabilities {\n\tif (!cachedCapabilities) {\n\t\tcachedCapabilities = detectCapabilities();\n\t}\n\treturn cachedCapabilities;\n}\n\nexport function resetCapabilitiesCache(): void {\n\tcachedCapabilities = null;\n}\n\n/** Override the cached capabilities. Useful in tests to exercise both code paths. */\nexport function setCapabilities(caps: TerminalCapabilities): void {\n\tcachedCapabilities = caps;\n}\n\nconst KITTY_PREFIX = \"\\x1b_G\";\nconst ITERM2_PREFIX = \"\\x1b]1337;File=\";\n\nexport function isImageLine(line: string): boolean {\n\t// Fast path: sequence at line start (single-row images)\n\tif (line.startsWith(KITTY_PREFIX) || line.startsWith(ITERM2_PREFIX)) {\n\t\treturn true;\n\t}\n\t// Slow path: sequence elsewhere (multi-row images have cursor-up prefix)\n\treturn line.includes(KITTY_PREFIX) || line.includes(ITERM2_PREFIX);\n}\n\n/**\n * Generate a random image ID for Kitty graphics protocol.\n * Uses random IDs to avoid collisions between different module instances\n * (e.g., main app vs extensions).\n */\nexport function allocateImageId(): number {\n\t// Use random ID in range [1, 0xffffffff] to avoid collisions\n\treturn Math.floor(Math.random() * 0xfffffffe) + 1;\n}\n\nexport function encodeKitty(\n\tbase64Data: string,\n\toptions: {\n\t\tcolumns?: number;\n\t\trows?: number;\n\t\timageId?: number;\n\t\t/** Whether Kitty should apply its default cursor movement after placement. Default: true. */\n\t\tmoveCursor?: boolean;\n\t} = {},\n): string {\n\tconst CHUNK_SIZE = 4096;\n\n\tconst params: string[] = [\"a=T\", \"f=100\", \"q=2\"];\n\n\tif (options.moveCursor === false) params.push(\"C=1\");\n\tif (options.columns) params.push(`c=${options.columns}`);\n\tif (options.rows) params.push(`r=${options.rows}`);\n\tif (options.imageId) params.push(`i=${options.imageId}`);\n\n\tif (base64Data.length <= CHUNK_SIZE) {\n\t\treturn `\\x1b_G${params.join(\",\")};${base64Data}\\x1b\\\\`;\n\t}\n\n\tconst chunks: string[] = [];\n\tlet offset = 0;\n\tlet isFirst = true;\n\n\twhile (offset < base64Data.length) {\n\t\tconst chunk = base64Data.slice(offset, offset + CHUNK_SIZE);\n\t\tconst isLast = offset + CHUNK_SIZE >= base64Data.length;\n\n\t\tif (isFirst) {\n\t\t\tchunks.push(`\\x1b_G${params.join(\",\")},m=1;${chunk}\\x1b\\\\`);\n\t\t\tisFirst = false;\n\t\t} else if (isLast) {\n\t\t\tchunks.push(`\\x1b_Gm=0;${chunk}\\x1b\\\\`);\n\t\t} else {\n\t\t\tchunks.push(`\\x1b_Gm=1;${chunk}\\x1b\\\\`);\n\t\t}\n\n\t\toffset += CHUNK_SIZE;\n\t}\n\n\treturn chunks.join(\"\");\n}\n\n/**\n * Delete a Kitty graphics image by ID.\n * Uses uppercase 'I' to also free the image data.\n */\nexport function deleteKittyImage(imageId: number): string {\n\treturn `\\x1b_Ga=d,d=I,i=${imageId},q=2\\x1b\\\\`;\n}\n\n/**\n * Delete all visible Kitty graphics images.\n * Uses uppercase 'A' to also free the image data.\n */\nexport function deleteAllKittyImages(): string {\n\treturn \"\\x1b_Ga=d,d=A,q=2\\x1b\\\\\";\n}\n\n/** Delete all visible Kitty placements while retaining their uploaded image data. */\nexport function deleteAllKittyPlacements(): string {\n\treturn \"\\x1b_Ga=d,d=a,q=2\\x1b\\\\\";\n}\n\nexport function encodeITerm2(\n\tbase64Data: string,\n\toptions: {\n\t\twidth?: number | string;\n\t\theight?: number | string;\n\t\tname?: string;\n\t\tpreserveAspectRatio?: boolean;\n\t\tinline?: boolean;\n\t} = {},\n): string {\n\tconst params: string[] = [\n\t\t`inline=${options.inline !== false ? 1 : 0}`,\n\t\t`size=${Buffer.byteLength(base64Data, \"base64\")}`,\n\t];\n\n\tif (options.width !== undefined) params.push(`width=${options.width}`);\n\tif (options.height !== undefined) params.push(`height=${options.height}`);\n\tif (options.name) {\n\t\tconst nameBase64 = Buffer.from(options.name).toString(\"base64\");\n\t\tparams.push(`name=${nameBase64}`);\n\t}\n\tif (options.preserveAspectRatio === false) {\n\t\tparams.push(\"preserveAspectRatio=0\");\n\t}\n\n\treturn `\\x1b]1337;File=${params.join(\";\")}:${base64Data}\\x07`;\n}\n\nexport interface ImageCellSize {\n\tcolumns: number;\n\trows: number;\n}\n\nexport interface KittyImageMetadata extends ImageCellSize {\n\timageId: number;\n\twidthPx: number;\n\theightPx: number;\n}\n\ninterface RegisteredKittyImageMetadata extends KittyImageMetadata {\n\ttransmissionGeneration: number;\n}\n\nexport interface KittyImagePlacement {\n\timageId: number;\n\ttransmissionGeneration: number;\n\ttransmissionBytes: number;\n\testimatedDecodedBytes: number;\n\tsequence: string;\n\treplacementLine: string;\n}\n\nconst kittyImageMetadata = new Map<number, RegisteredKittyImageMetadata>();\nlet kittyTransmissionGeneration = 0;\n\nexport function registerKittyImageMetadata(metadata: KittyImageMetadata): void {\n\tkittyTransmissionGeneration += 1;\n\tkittyImageMetadata.delete(metadata.imageId);\n\tkittyImageMetadata.set(metadata.imageId, { ...metadata, transmissionGeneration: kittyTransmissionGeneration });\n\tif (kittyImageMetadata.size > 1000) {\n\t\tconst oldestImageId = kittyImageMetadata.keys().next().value;\n\t\tif (oldestImageId !== undefined) kittyImageMetadata.delete(oldestImageId);\n\t}\n}\n\nfunction getRegisteredKittyImageMetadata(line: string): RegisteredKittyImageMetadata | undefined {\n\tconst controls = /\\x1b_G([^;]*);/.exec(line)?.[1];\n\tif (!controls) return undefined;\n\tconst imageId = /(?:^|,)i=(\\d+)(?:,|$)/.exec(controls)?.[1];\n\treturn imageId === undefined ? undefined : kittyImageMetadata.get(Number.parseInt(imageId, 10));\n}\n\nexport function getKittyImageMetadata(line: string): KittyImageMetadata | undefined {\n\tconst metadata = getRegisteredKittyImageMetadata(line);\n\tif (!metadata) return undefined;\n\treturn {\n\t\timageId: metadata.imageId,\n\t\tcolumns: metadata.columns,\n\t\trows: metadata.rows,\n\t\twidthPx: metadata.widthPx,\n\t\theightPx: metadata.heightPx,\n\t};\n}\n\nconst KITTY_PLACEMENT_CONTROL_KEYS = new Set([\n\t\"i\",\n\t\"p\",\n\t\"x\",\n\t\"y\",\n\t\"w\",\n\t\"h\",\n\t\"X\",\n\t\"Y\",\n\t\"c\",\n\t\"r\",\n\t\"C\",\n\t\"U\",\n\t\"z\",\n\t\"P\",\n\t\"Q\",\n\t\"H\",\n\t\"V\",\n]);\n\n/** Build a placement-only command for an image line emitted by {@link renderImage}. */\nexport function getKittyImagePlacement(line: string): KittyImagePlacement | undefined {\n\tconst match = /\\x1b_G([^;]*);/.exec(line);\n\tconst metadata = getRegisteredKittyImageMetadata(line);\n\tif (!match || !metadata) return undefined;\n\n\tlet commandStart = match.index;\n\tlet commandControls = match[1];\n\tlet transmissionEnd: number;\n\twhile (true) {\n\t\tconst terminator = line.indexOf(\"\\x1b\\\\\", commandStart + KITTY_PREFIX.length);\n\t\tif (terminator === -1) return undefined;\n\t\ttransmissionEnd = terminator + 2;\n\t\tif (!/(?:^|,)m=1(?:,|$)/.test(commandControls)) break;\n\t\tcommandStart = transmissionEnd;\n\t\tif (!line.startsWith(KITTY_PREFIX, commandStart)) return undefined;\n\t\tconst controlsEnd = line.indexOf(\";\", commandStart + KITTY_PREFIX.length);\n\t\tif (controlsEnd === -1) return undefined;\n\t\tcommandControls = line.slice(commandStart + KITTY_PREFIX.length, controlsEnd);\n\t}\n\n\tconst controls = match[1]\n\t\t.split(\",\")\n\t\t.filter((control) => KITTY_PLACEMENT_CONTROL_KEYS.has(control.split(\"=\", 1)[0] ?? \"\"));\n\tconst sequence = `\\x1b_Ga=p,q=2,${controls.join(\",\")}\\x1b\\\\`;\n\treturn {\n\t\timageId: metadata.imageId,\n\t\ttransmissionGeneration: metadata.transmissionGeneration,\n\t\ttransmissionBytes: transmissionEnd - match.index,\n\t\testimatedDecodedBytes: metadata.widthPx * metadata.heightPx * 4,\n\t\tsequence,\n\t\treplacementLine: `${line.slice(0, match.index)}${sequence}${line.slice(transmissionEnd)}`,\n\t};\n}\n\nexport function cropKittyImageLine(line: string, hiddenRows: number, visibleRows: number): string {\n\tconst metadata = getKittyImageMetadata(line);\n\tconst match = /\\x1b_G([^;]*);/.exec(line);\n\tif (!metadata || !match || hiddenRows < 0 || hiddenRows >= metadata.rows || visibleRows <= 0) return line;\n\tconst croppedRows = Math.min(visibleRows, metadata.rows - hiddenRows);\n\tif (hiddenRows === 0 && croppedRows === metadata.rows) return line;\n\tconst sourceY = Math.floor((metadata.heightPx * hiddenRows) / metadata.rows);\n\tconst sourceEnd = Math.ceil((metadata.heightPx * (hiddenRows + croppedRows)) / metadata.rows);\n\tconst sourceHeight = Math.max(1, Math.min(metadata.heightPx, sourceEnd) - sourceY);\n\tconst controls = match[1].split(\",\").filter((control) => !/^[yhr]=/.test(control));\n\tcontrols.push(`y=${sourceY}`, `h=${sourceHeight}`, `r=${croppedRows}`);\n\treturn `${line.slice(0, match.index)}\\x1b_G${controls.join(\",\")};${line.slice(match.index + match[0].length)}`;\n}\n\nexport function calculateImageCellSize(\n\timageDimensions: ImageDimensions,\n\tmaxWidthCells: number,\n\tmaxHeightCells?: number,\n\tcellDimensions: CellDimensions = { widthPx: 9, heightPx: 18 },\n): ImageCellSize {\n\tconst maxWidth = Math.max(1, Math.floor(maxWidthCells));\n\tconst maxHeight = maxHeightCells === undefined ? undefined : Math.max(1, Math.floor(maxHeightCells));\n\tconst imageWidth = Math.max(1, imageDimensions.widthPx);\n\tconst imageHeight = Math.max(1, imageDimensions.heightPx);\n\n\tconst widthScale = (maxWidth * cellDimensions.widthPx) / imageWidth;\n\tconst heightScale = maxHeight === undefined ? widthScale : (maxHeight * cellDimensions.heightPx) / imageHeight;\n\tconst scale = Math.min(widthScale, heightScale);\n\n\tconst scaledWidthPx = imageWidth * scale;\n\tconst scaledHeightPx = imageHeight * scale;\n\tconst columns = Math.ceil(scaledWidthPx / cellDimensions.widthPx);\n\tconst rows = Math.ceil(scaledHeightPx / cellDimensions.heightPx);\n\n\treturn {\n\t\tcolumns: Math.max(1, Math.min(maxWidth, columns)),\n\t\trows: Math.max(1, maxHeight === undefined ? rows : Math.min(maxHeight, rows)),\n\t};\n}\n\nexport function calculateImageRows(\n\timageDimensions: ImageDimensions,\n\ttargetWidthCells: number,\n\tcellDimensions: CellDimensions = { widthPx: 9, heightPx: 18 },\n): number {\n\treturn calculateImageCellSize(imageDimensions, targetWidthCells, undefined, cellDimensions).rows;\n}\n\nexport function getPngDimensions(base64Data: string): ImageDimensions | null {\n\ttry {\n\t\tconst buffer = Buffer.from(base64Data, \"base64\");\n\n\t\tif (buffer.length < 24) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (buffer[0] !== 0x89 || buffer[1] !== 0x50 || buffer[2] !== 0x4e || buffer[3] !== 0x47) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst width = buffer.readUInt32BE(16);\n\t\tconst height = buffer.readUInt32BE(20);\n\n\t\treturn { widthPx: width, heightPx: height };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function getJpegDimensions(base64Data: string): ImageDimensions | null {\n\ttry {\n\t\tconst buffer = Buffer.from(base64Data, \"base64\");\n\n\t\tif (buffer.length < 2) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (buffer[0] !== 0xff || buffer[1] !== 0xd8) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet offset = 2;\n\t\twhile (offset < buffer.length - 9) {\n\t\t\tif (buffer[offset] !== 0xff) {\n\t\t\t\toffset++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst marker = buffer[offset + 1];\n\n\t\t\tif (marker >= 0xc0 && marker <= 0xc2) {\n\t\t\t\tconst height = buffer.readUInt16BE(offset + 5);\n\t\t\t\tconst width = buffer.readUInt16BE(offset + 7);\n\t\t\t\treturn { widthPx: width, heightPx: height };\n\t\t\t}\n\n\t\t\tif (offset + 3 >= buffer.length) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst length = buffer.readUInt16BE(offset + 2);\n\t\t\tif (length < 2) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\toffset += 2 + length;\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function getGifDimensions(base64Data: string): ImageDimensions | null {\n\ttry {\n\t\tconst buffer = Buffer.from(base64Data, \"base64\");\n\n\t\tif (buffer.length < 10) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst sig = buffer.slice(0, 6).toString(\"ascii\");\n\t\tif (sig !== \"GIF87a\" && sig !== \"GIF89a\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst width = buffer.readUInt16LE(6);\n\t\tconst height = buffer.readUInt16LE(8);\n\n\t\treturn { widthPx: width, heightPx: height };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function getWebpDimensions(base64Data: string): ImageDimensions | null {\n\ttry {\n\t\tconst buffer = Buffer.from(base64Data, \"base64\");\n\n\t\tif (buffer.length < 30) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst riff = buffer.slice(0, 4).toString(\"ascii\");\n\t\tconst webp = buffer.slice(8, 12).toString(\"ascii\");\n\t\tif (riff !== \"RIFF\" || webp !== \"WEBP\") {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst chunk = buffer.slice(12, 16).toString(\"ascii\");\n\t\tif (chunk === \"VP8 \") {\n\t\t\tif (buffer.length < 30) return null;\n\t\t\tconst width = buffer.readUInt16LE(26) & 0x3fff;\n\t\t\tconst height = buffer.readUInt16LE(28) & 0x3fff;\n\t\t\treturn { widthPx: width, heightPx: height };\n\t\t} else if (chunk === \"VP8L\") {\n\t\t\tif (buffer.length < 25) return null;\n\t\t\tconst bits = buffer.readUInt32LE(21);\n\t\t\tconst width = (bits & 0x3fff) + 1;\n\t\t\tconst height = ((bits >> 14) & 0x3fff) + 1;\n\t\t\treturn { widthPx: width, heightPx: height };\n\t\t} else if (chunk === \"VP8X\") {\n\t\t\tif (buffer.length < 30) return null;\n\t\t\tconst width = (buffer[24] | (buffer[25] << 8) | (buffer[26] << 16)) + 1;\n\t\t\tconst height = (buffer[27] | (buffer[28] << 8) | (buffer[29] << 16)) + 1;\n\t\t\treturn { widthPx: width, heightPx: height };\n\t\t}\n\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport function getImageDimensions(base64Data: string, mimeType: string): ImageDimensions | null {\n\tif (mimeType === \"image/png\") {\n\t\treturn getPngDimensions(base64Data);\n\t}\n\tif (mimeType === \"image/jpeg\") {\n\t\treturn getJpegDimensions(base64Data);\n\t}\n\tif (mimeType === \"image/gif\") {\n\t\treturn getGifDimensions(base64Data);\n\t}\n\tif (mimeType === \"image/webp\") {\n\t\treturn getWebpDimensions(base64Data);\n\t}\n\treturn null;\n}\n\nexport function renderImage(\n\tbase64Data: string,\n\timageDimensions: ImageDimensions,\n\toptions: ImageRenderOptions = {},\n): { sequence: string; columns: number; rows: number; imageId?: number } | null {\n\tconst caps = getCapabilities();\n\n\tif (!caps.images) {\n\t\treturn null;\n\t}\n\n\tconst maxWidth = options.maxWidthCells ?? 80;\n\tconst size = calculateImageCellSize(imageDimensions, maxWidth, options.maxHeightCells, getCellDimensions());\n\n\tif (caps.images === \"kitty\") {\n\t\tif (options.imageId !== undefined) {\n\t\t\tregisterKittyImageMetadata({\n\t\t\t\timageId: options.imageId,\n\t\t\t\tcolumns: size.columns,\n\t\t\t\trows: size.rows,\n\t\t\t\twidthPx: imageDimensions.widthPx,\n\t\t\t\theightPx: imageDimensions.heightPx,\n\t\t\t});\n\t\t}\n\t\tconst sequence = encodeKitty(base64Data, {\n\t\t\tcolumns: size.columns,\n\t\t\trows: size.rows,\n\t\t\timageId: options.imageId,\n\t\t\tmoveCursor: options.moveCursor,\n\t\t});\n\t\treturn { sequence, columns: size.columns, rows: size.rows, imageId: options.imageId };\n\t}\n\n\tif (caps.images === \"iterm2\") {\n\t\tconst sequence = encodeITerm2(base64Data, {\n\t\t\twidth: size.columns,\n\t\t\theight: \"auto\",\n\t\t\tpreserveAspectRatio: options.preserveAspectRatio ?? true,\n\t\t});\n\t\treturn { sequence, columns: size.columns, rows: size.rows };\n\t}\n\n\treturn null;\n}\n\n/**\n * Wrap text in an OSC 8 hyperlink sequence.\n * The text is rendered as a clickable hyperlink in terminals that support OSC 8\n * (Ghostty, Kitty, WezTerm, iTerm2, VSCode, and others).\n * In terminals that do not support OSC 8, the escape sequences are ignored\n * and only the plain text is displayed.\n *\n * @param text - The visible text to display\n * @param url - The URL to link to\n */\nexport function hyperlink(text: string, url: string): string {\n\treturn `\\x1b]8;;${url}\\x1b\\\\${text}\\x1b]8;;\\x1b\\\\`;\n}\n\n/** Shorten home-prefixed absolute paths to ~/... for compact display. */\nfunction shortenImagePath(filename: string): string {\n\tconst home = homedir();\n\tif (home && (filename === home || filename.startsWith(`${home}/`) || filename.startsWith(`${home}\\\\`))) {\n\t\treturn `~${filename.slice(home.length)}`;\n\t}\n\treturn filename;\n}\n\n/**\n * Text fallback when the terminal cannot render inline images.\n * Absolute paths are shown shortened (~/...) and, when OSC 8 hyperlinks are\n * available, linked to file:// so the full path remains openable.\n */\nexport function imageFallback(mimeType: string, dimensions?: ImageDimensions, filename?: string): string {\n\tconst parts: string[] = [];\n\tif (filename) {\n\t\tconst display = shortenImagePath(filename);\n\t\tif (getCapabilities().hyperlinks && isAbsolute(filename)) {\n\t\t\tparts.push(hyperlink(display, pathToFileURL(filename).href));\n\t\t} else {\n\t\t\tparts.push(display);\n\t\t}\n\t}\n\tparts.push(`[${mimeType}]`);\n\tif (dimensions) parts.push(`${dimensions.widthPx}x${dimensions.heightPx}`);\n\treturn `[Image: ${parts.join(\" \")}]`;\n}\n","// @ts-nocheck — vendored Pi source; checked upstream under Pi's own tsconfig.\nimport { spawn } from \"child_process\";\nimport { readdirSync, statSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { basename, dirname, join } from \"path\";\nimport { fuzzyFilter } from \"./pi-tui-fuzzy.ts\";\n\nconst PATH_DELIMITERS = new Set([\" \", \"\\t\", '\"', \"'\", \"=\"]);\n\nfunction toDisplayPath(value: string): string {\n\treturn value.replace(/\\\\/g, \"/\");\n}\n\nfunction escapeRegex(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction buildFdPathQuery(query: string): string {\n\tconst normalized = toDisplayPath(query);\n\tif (!normalized.includes(\"/\")) {\n\t\treturn normalized;\n\t}\n\n\tconst hasTrailingSeparator = normalized.endsWith(\"/\");\n\tconst trimmed = normalized.replace(/^\\/+|\\/+$/g, \"\");\n\tif (!trimmed) {\n\t\treturn normalized;\n\t}\n\n\tconst separatorPattern = \"[\\\\\\\\/]\";\n\tconst segments = trimmed\n\t\t.split(\"/\")\n\t\t.filter(Boolean)\n\t\t.map((segment) => escapeRegex(segment));\n\tif (segments.length === 0) {\n\t\treturn normalized;\n\t}\n\n\tlet pattern = segments.join(separatorPattern);\n\tif (hasTrailingSeparator) {\n\t\tpattern += separatorPattern;\n\t}\n\treturn pattern;\n}\n\nfunction findLastDelimiter(text: string): number {\n\tfor (let i = text.length - 1; i >= 0; i -= 1) {\n\t\tif (PATH_DELIMITERS.has(text[i] ?? \"\")) {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction findUnclosedQuoteStart(text: string): number | null {\n\tlet inQuotes = false;\n\tlet quoteStart = -1;\n\n\tfor (let i = 0; i < text.length; i += 1) {\n\t\tif (text[i] === '\"') {\n\t\t\tinQuotes = !inQuotes;\n\t\t\tif (inQuotes) {\n\t\t\t\tquoteStart = i;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn inQuotes ? quoteStart : null;\n}\n\nfunction isTokenStart(text: string, index: number): boolean {\n\treturn index === 0 || PATH_DELIMITERS.has(text[index - 1] ?? \"\");\n}\n\nfunction extractQuotedPrefix(text: string): string | null {\n\tconst quoteStart = findUnclosedQuoteStart(text);\n\tif (quoteStart === null) {\n\t\treturn null;\n\t}\n\n\tif (quoteStart > 0 && text[quoteStart - 1] === \"@\") {\n\t\tif (!isTokenStart(text, quoteStart - 1)) {\n\t\t\treturn null;\n\t\t}\n\t\treturn text.slice(quoteStart - 1);\n\t}\n\n\tif (!isTokenStart(text, quoteStart)) {\n\t\treturn null;\n\t}\n\n\treturn text.slice(quoteStart);\n}\n\nfunction parsePathPrefix(prefix: string): { rawPrefix: string; isAtPrefix: boolean; isQuotedPrefix: boolean } {\n\tif (prefix.startsWith('@\"')) {\n\t\treturn { rawPrefix: prefix.slice(2), isAtPrefix: true, isQuotedPrefix: true };\n\t}\n\tif (prefix.startsWith('\"')) {\n\t\treturn { rawPrefix: prefix.slice(1), isAtPrefix: false, isQuotedPrefix: true };\n\t}\n\tif (prefix.startsWith(\"@\")) {\n\t\treturn { rawPrefix: prefix.slice(1), isAtPrefix: true, isQuotedPrefix: false };\n\t}\n\treturn { rawPrefix: prefix, isAtPrefix: false, isQuotedPrefix: false };\n}\n\nfunction buildCompletionValue(\n\tpath: string,\n\toptions: { isDirectory: boolean; isAtPrefix: boolean; isQuotedPrefix: boolean },\n): string {\n\tconst needsQuotes = options.isQuotedPrefix || path.includes(\" \");\n\tconst prefix = options.isAtPrefix ? \"@\" : \"\";\n\n\tif (!needsQuotes) {\n\t\treturn `${prefix}${path}`;\n\t}\n\n\tconst openQuote = `${prefix}\"`;\n\tconst closeQuote = '\"';\n\treturn `${openQuote}${path}${closeQuote}`;\n}\n\n// Use fd to walk directory tree (fast, respects .gitignore)\nasync function walkDirectoryWithFd(\n\tbaseDir: string,\n\tfdPath: string,\n\tquery: string,\n\tmaxResults: number,\n\tsignal: AbortSignal,\n): Promise<Array<{ path: string; isDirectory: boolean }>> {\n\tconst args = [\n\t\t\"--base-directory\",\n\t\tbaseDir,\n\t\t\"--max-results\",\n\t\tString(maxResults),\n\t\t\"--type\",\n\t\t\"f\",\n\t\t\"--type\",\n\t\t\"d\",\n\t\t\"--follow\",\n\t\t\"--hidden\",\n\t\t\"--exclude\",\n\t\t\".git\",\n\t\t\"--exclude\",\n\t\t\".git/*\",\n\t\t\"--exclude\",\n\t\t\".git/**\",\n\t];\n\n\tif (toDisplayPath(query).includes(\"/\")) {\n\t\targs.push(\"--full-path\");\n\t}\n\n\tif (query) {\n\t\targs.push(buildFdPathQuery(query));\n\t}\n\n\treturn await new Promise((resolve) => {\n\t\tif (signal.aborted) {\n\t\t\tresolve([]);\n\t\t\treturn;\n\t\t}\n\n\t\tconst child = spawn(fdPath, args, {\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t});\n\t\tlet stdout = \"\";\n\t\tlet resolved = false;\n\n\t\tconst finish = (results: Array<{ path: string; isDirectory: boolean }>) => {\n\t\t\tif (resolved) return;\n\t\t\tresolved = true;\n\t\t\tsignal.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(results);\n\t\t};\n\n\t\tconst onAbort = () => {\n\t\t\tif (child.exitCode === null) {\n\t\t\t\tchild.kill(\"SIGKILL\");\n\t\t\t}\n\t\t};\n\n\t\tsignal.addEventListener(\"abort\", onAbort, { once: true });\n\t\tchild.stdout.setEncoding(\"utf-8\");\n\t\tchild.stdout.on(\"data\", (chunk: string) => {\n\t\t\tstdout += chunk;\n\t\t});\n\t\tchild.on(\"error\", () => {\n\t\t\tfinish([]);\n\t\t});\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (signal.aborted || code !== 0 || !stdout) {\n\t\t\t\tfinish([]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst lines = stdout.trim().split(\"\\n\").filter(Boolean);\n\t\t\tconst results: Array<{ path: string; isDirectory: boolean }> = [];\n\n\t\t\tfor (const line of lines) {\n\t\t\t\tconst displayLine = toDisplayPath(line);\n\t\t\t\tconst hasTrailingSeparator = displayLine.endsWith(\"/\");\n\t\t\t\tconst normalizedPath = hasTrailingSeparator ? displayLine.slice(0, -1) : displayLine;\n\t\t\t\tif (normalizedPath === \".git\" || normalizedPath.startsWith(\".git/\") || normalizedPath.includes(\"/.git/\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tresults.push({\n\t\t\t\t\tpath: displayLine,\n\t\t\t\t\tisDirectory: hasTrailingSeparator,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfinish(results);\n\t\t});\n\t});\n}\n\nexport interface AutocompleteItem {\n\tvalue: string;\n\tlabel: string;\n\tdescription?: string;\n}\n\ntype Awaitable<T> = T | Promise<T>;\n\nexport interface SlashCommand {\n\tname: string;\n\tdescription?: string;\n\targumentHint?: string;\n\t// Function to get argument completions for this command\n\t// Returns null if no argument completion is available\n\tgetArgumentCompletions?(argumentPrefix: string): Awaitable<AutocompleteItem[] | null>;\n}\n\nexport interface AutocompleteSuggestions {\n\titems: AutocompleteItem[];\n\tprefix: string; // What we're matching against (e.g., \"/\" or \"src/\")\n}\n\nexport interface AutocompleteProvider {\n\t/** Characters that should naturally trigger this provider at token boundaries. */\n\ttriggerCharacters?: string[];\n\n\t// Get autocomplete suggestions for current text/cursor position\n\t// Returns null if no suggestions available\n\tgetSuggestions(\n\t\tlines: string[],\n\t\tcursorLine: number,\n\t\tcursorCol: number,\n\t\toptions: { signal: AbortSignal; force?: boolean },\n\t): Promise<AutocompleteSuggestions | null>;\n\n\t// Apply the selected item\n\t// Returns the new text and cursor position\n\tapplyCompletion(\n\t\tlines: string[],\n\t\tcursorLine: number,\n\t\tcursorCol: number,\n\t\titem: AutocompleteItem,\n\t\tprefix: string,\n\t): {\n\t\tlines: string[];\n\t\tcursorLine: number;\n\t\tcursorCol: number;\n\t};\n\n\t// Check if file completion should trigger for explicit Tab completion\n\tshouldTriggerFileCompletion?(lines: string[], cursorLine: number, cursorCol: number): boolean;\n}\n\n// Combined provider that handles both slash commands and file paths\nexport class CombinedAutocompleteProvider implements AutocompleteProvider {\n\tprivate commands: (SlashCommand | AutocompleteItem)[];\n\tprivate basePath: string;\n\tprivate fdPath: string | null;\n\n\tconstructor(commands: (SlashCommand | AutocompleteItem)[] = [], basePath: string, fdPath: string | null = null) {\n\t\tthis.commands = commands;\n\t\tthis.basePath = basePath;\n\t\tthis.fdPath = fdPath;\n\t}\n\n\tasync getSuggestions(\n\t\tlines: string[],\n\t\tcursorLine: number,\n\t\tcursorCol: number,\n\t\toptions: { signal: AbortSignal; force?: boolean },\n\t): Promise<AutocompleteSuggestions | null> {\n\t\tconst currentLine = lines[cursorLine] || \"\";\n\t\tconst textBeforeCursor = currentLine.slice(0, cursorCol);\n\n\t\tconst atPrefix = this.extractAtPrefix(textBeforeCursor);\n\t\tif (atPrefix) {\n\t\t\tconst { rawPrefix, isQuotedPrefix } = parsePathPrefix(atPrefix);\n\t\t\tconst suggestions = await this.getFuzzyFileSuggestions(rawPrefix, {\n\t\t\t\tisQuotedPrefix,\n\t\t\t\tsignal: options.signal,\n\t\t\t});\n\t\t\tif (suggestions.length === 0) return null;\n\n\t\t\treturn {\n\t\t\t\titems: suggestions,\n\t\t\t\tprefix: atPrefix,\n\t\t\t};\n\t\t}\n\n\t\tif (!options.force && textBeforeCursor.startsWith(\"/\")) {\n\t\t\tconst spaceIndex = textBeforeCursor.indexOf(\" \");\n\n\t\t\tif (spaceIndex === -1) {\n\t\t\t\tconst prefix = textBeforeCursor.slice(1);\n\t\t\t\tconst commandItems = this.commands.map((cmd) => {\n\t\t\t\t\tconst name = \"name\" in cmd ? cmd.name : cmd.value;\n\t\t\t\t\tconst hint = \"argumentHint\" in cmd && cmd.argumentHint ? cmd.argumentHint : undefined;\n\t\t\t\t\tconst desc = cmd.description ?? \"\";\n\t\t\t\t\tconst fullDesc = hint ? (desc ? `${hint} — ${desc}` : hint) : desc;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tlabel: name,\n\t\t\t\t\t\tdescription: fullDesc || undefined,\n\t\t\t\t\t};\n\t\t\t\t});\n\n\t\t\t\tconst filtered = fuzzyFilter(commandItems, prefix, (item) => item.name).map((item) => ({\n\t\t\t\t\tvalue: item.name,\n\t\t\t\t\tlabel: item.label,\n\t\t\t\t\t...(item.description && { description: item.description }),\n\t\t\t\t}));\n\n\t\t\t\tif (filtered.length === 0) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\titems: filtered,\n\t\t\t\t\tprefix: textBeforeCursor,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst commandName = textBeforeCursor.slice(1, spaceIndex);\n\t\t\tconst argumentText = textBeforeCursor.slice(spaceIndex + 1);\n\n\t\t\tconst command = this.commands.find((cmd) => {\n\t\t\t\tconst name = \"name\" in cmd ? cmd.name : cmd.value;\n\t\t\t\treturn name === commandName;\n\t\t\t});\n\t\t\tif (!command || !(\"getArgumentCompletions\" in command) || !command.getArgumentCompletions) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst argumentSuggestions = await command.getArgumentCompletions(argumentText);\n\t\t\tif (!Array.isArray(argumentSuggestions) || argumentSuggestions.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\titems: argumentSuggestions,\n\t\t\t\tprefix: argumentText,\n\t\t\t};\n\t\t}\n\n\t\tconst pathMatch = this.extractPathPrefix(textBeforeCursor, options.force ?? false);\n\t\tif (pathMatch === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst suggestions = this.getFileSuggestions(pathMatch);\n\t\tif (suggestions.length === 0) return null;\n\n\t\treturn {\n\t\t\titems: suggestions,\n\t\t\tprefix: pathMatch,\n\t\t};\n\t}\n\n\tapplyCompletion(\n\t\tlines: string[],\n\t\tcursorLine: number,\n\t\tcursorCol: number,\n\t\titem: AutocompleteItem,\n\t\tprefix: string,\n\t): { lines: string[]; cursorLine: number; cursorCol: number } {\n\t\tconst currentLine = lines[cursorLine] || \"\";\n\t\tconst beforePrefix = currentLine.slice(0, cursorCol - prefix.length);\n\t\tconst afterCursor = currentLine.slice(cursorCol);\n\t\tconst isQuotedPrefix = prefix.startsWith('\"') || prefix.startsWith('@\"');\n\t\tconst hasLeadingQuoteAfterCursor = afterCursor.startsWith('\"');\n\t\tconst hasTrailingQuoteInItem = item.value.endsWith('\"');\n\t\tconst adjustedAfterCursor =\n\t\t\tisQuotedPrefix && hasTrailingQuoteInItem && hasLeadingQuoteAfterCursor ? afterCursor.slice(1) : afterCursor;\n\n\t\t// Check if we're completing a slash command (prefix starts with \"/\" but NOT a file path)\n\t\t// Slash commands are at the start of the line and don't contain path separators after the first /\n\t\tconst isSlashCommand = prefix.startsWith(\"/\") && beforePrefix.trim() === \"\" && !prefix.slice(1).includes(\"/\");\n\t\tif (isSlashCommand) {\n\t\t\t// This is a command name completion\n\t\t\tconst newLine = `${beforePrefix}/${item.value} ${adjustedAfterCursor}`;\n\t\t\tconst newLines = [...lines];\n\t\t\tnewLines[cursorLine] = newLine;\n\n\t\t\treturn {\n\t\t\t\tlines: newLines,\n\t\t\t\tcursorLine,\n\t\t\t\tcursorCol: beforePrefix.length + item.value.length + 2, // +2 for \"/\" and space\n\t\t\t};\n\t\t}\n\n\t\t// Check if we're completing a file attachment (prefix starts with \"@\")\n\t\tif (prefix.startsWith(\"@\")) {\n\t\t\t// This is a file attachment completion\n\t\t\t// Don't add space after directories so user can continue autocompleting\n\t\t\tconst isDirectory = item.label.endsWith(\"/\");\n\t\t\tconst suffix = isDirectory ? \"\" : \" \";\n\t\t\tconst newLine = `${beforePrefix + item.value}${suffix}${adjustedAfterCursor}`;\n\t\t\tconst newLines = [...lines];\n\t\t\tnewLines[cursorLine] = newLine;\n\n\t\t\tconst hasTrailingQuote = item.value.endsWith('\"');\n\t\t\tconst cursorOffset = isDirectory && hasTrailingQuote ? item.value.length - 1 : item.value.length;\n\n\t\t\treturn {\n\t\t\t\tlines: newLines,\n\t\t\t\tcursorLine,\n\t\t\t\tcursorCol: beforePrefix.length + cursorOffset + suffix.length,\n\t\t\t};\n\t\t}\n\n\t\t// Check if we're in a slash command context (beforePrefix contains \"/command \")\n\t\tconst textBeforeCursor = currentLine.slice(0, cursorCol);\n\t\tif (textBeforeCursor.includes(\"/\") && textBeforeCursor.includes(\" \")) {\n\t\t\t// This is likely a command argument completion\n\t\t\tconst newLine = beforePrefix + item.value + adjustedAfterCursor;\n\t\t\tconst newLines = [...lines];\n\t\t\tnewLines[cursorLine] = newLine;\n\n\t\t\tconst isDirectory = item.label.endsWith(\"/\");\n\t\t\tconst hasTrailingQuote = item.value.endsWith('\"');\n\t\t\tconst cursorOffset = isDirectory && hasTrailingQuote ? item.value.length - 1 : item.value.length;\n\n\t\t\treturn {\n\t\t\t\tlines: newLines,\n\t\t\t\tcursorLine,\n\t\t\t\tcursorCol: beforePrefix.length + cursorOffset,\n\t\t\t};\n\t\t}\n\n\t\t// For file paths, complete the path\n\t\tconst newLine = beforePrefix + item.value + adjustedAfterCursor;\n\t\tconst newLines = [...lines];\n\t\tnewLines[cursorLine] = newLine;\n\n\t\tconst isDirectory = item.label.endsWith(\"/\");\n\t\tconst hasTrailingQuote = item.value.endsWith('\"');\n\t\tconst cursorOffset = isDirectory && hasTrailingQuote ? item.value.length - 1 : item.value.length;\n\n\t\treturn {\n\t\t\tlines: newLines,\n\t\t\tcursorLine,\n\t\t\tcursorCol: beforePrefix.length + cursorOffset,\n\t\t};\n\t}\n\n\t// Extract @ prefix for fuzzy file suggestions\n\tprivate extractAtPrefix(text: string): string | null {\n\t\tconst quotedPrefix = extractQuotedPrefix(text);\n\t\tif (quotedPrefix?.startsWith('@\"')) {\n\t\t\treturn quotedPrefix;\n\t\t}\n\n\t\tconst lastDelimiterIndex = findLastDelimiter(text);\n\t\tconst tokenStart = lastDelimiterIndex === -1 ? 0 : lastDelimiterIndex + 1;\n\n\t\tif (text[tokenStart] === \"@\") {\n\t\t\treturn text.slice(tokenStart);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// Extract a path-like prefix from the text before cursor\n\tprivate extractPathPrefix(text: string, forceExtract: boolean = false): string | null {\n\t\tconst quotedPrefix = extractQuotedPrefix(text);\n\t\tif (quotedPrefix) {\n\t\t\treturn quotedPrefix;\n\t\t}\n\n\t\tconst lastDelimiterIndex = findLastDelimiter(text);\n\t\tconst pathPrefix = lastDelimiterIndex === -1 ? text : text.slice(lastDelimiterIndex + 1);\n\n\t\t// For forced extraction (Tab key), always return something\n\t\tif (forceExtract) {\n\t\t\treturn pathPrefix;\n\t\t}\n\n\t\t// For natural triggers, return if it looks like a path, ends with /, starts with ~/, .\n\t\t// Only return empty string if the text looks like it's starting a path context\n\t\tif (pathPrefix.includes(\"/\") || pathPrefix.startsWith(\".\") || pathPrefix.startsWith(\"~/\")) {\n\t\t\treturn pathPrefix;\n\t\t}\n\n\t\t// Return empty string only after a space (not for completely empty text)\n\t\t// Empty text should not trigger file suggestions - that's for forced Tab completion\n\t\tif (pathPrefix === \"\" && text.endsWith(\" \")) {\n\t\t\treturn pathPrefix;\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// Expand home directory (~/) to actual home path\n\tprivate expandHomePath(path: string): string {\n\t\tif (path.startsWith(\"~/\")) {\n\t\t\tconst expandedPath = join(homedir(), path.slice(2));\n\t\t\t// Preserve trailing slash if original path had one\n\t\t\treturn path.endsWith(\"/\") && !expandedPath.endsWith(\"/\") ? `${expandedPath}/` : expandedPath;\n\t\t} else if (path === \"~\") {\n\t\t\treturn homedir();\n\t\t}\n\t\treturn path;\n\t}\n\n\tprivate resolveScopedFuzzyQuery(rawQuery: string): { baseDir: string; query: string; displayBase: string } | null {\n\t\tconst normalizedQuery = toDisplayPath(rawQuery);\n\t\tconst slashIndex = normalizedQuery.lastIndexOf(\"/\");\n\t\tif (slashIndex === -1) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst displayBase = normalizedQuery.slice(0, slashIndex + 1);\n\t\tconst query = normalizedQuery.slice(slashIndex + 1);\n\n\t\tlet baseDir: string;\n\t\tif (displayBase.startsWith(\"~/\")) {\n\t\t\tbaseDir = this.expandHomePath(displayBase);\n\t\t} else if (displayBase.startsWith(\"/\")) {\n\t\t\tbaseDir = displayBase;\n\t\t} else {\n\t\t\tbaseDir = join(this.basePath, displayBase);\n\t\t}\n\n\t\ttry {\n\t\t\tif (!statSync(baseDir).isDirectory()) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn { baseDir, query, displayBase };\n\t}\n\n\tprivate scopedPathForDisplay(displayBase: string, relativePath: string): string {\n\t\tconst normalizedRelativePath = toDisplayPath(relativePath);\n\t\tif (displayBase === \"/\") {\n\t\t\treturn `/${normalizedRelativePath}`;\n\t\t}\n\t\treturn `${toDisplayPath(displayBase)}${normalizedRelativePath}`;\n\t}\n\n\t// Get file/directory suggestions for a given path prefix\n\tprivate getFileSuggestions(prefix: string): AutocompleteItem[] {\n\t\ttry {\n\t\t\tlet searchDir: string;\n\t\t\tlet searchPrefix: string;\n\t\t\tconst { rawPrefix, isAtPrefix, isQuotedPrefix } = parsePathPrefix(prefix);\n\t\t\tlet expandedPrefix = rawPrefix;\n\n\t\t\t// Handle home directory expansion\n\t\t\tif (expandedPrefix.startsWith(\"~\")) {\n\t\t\t\texpandedPrefix = this.expandHomePath(expandedPrefix);\n\t\t\t}\n\n\t\t\tconst isRootPrefix =\n\t\t\t\trawPrefix === \"\" ||\n\t\t\t\trawPrefix === \"./\" ||\n\t\t\t\trawPrefix === \"../\" ||\n\t\t\t\trawPrefix === \"~\" ||\n\t\t\t\trawPrefix === \"~/\" ||\n\t\t\t\trawPrefix === \"/\" ||\n\t\t\t\t(isAtPrefix && rawPrefix === \"\");\n\n\t\t\tif (isRootPrefix) {\n\t\t\t\t// Complete from specified position\n\t\t\t\tif (rawPrefix.startsWith(\"~\") || expandedPrefix.startsWith(\"/\")) {\n\t\t\t\t\tsearchDir = expandedPrefix;\n\t\t\t\t} else {\n\t\t\t\t\tsearchDir = join(this.basePath, expandedPrefix);\n\t\t\t\t}\n\t\t\t\tsearchPrefix = \"\";\n\t\t\t} else if (rawPrefix.endsWith(\"/\")) {\n\t\t\t\t// If prefix ends with /, show contents of that directory\n\t\t\t\tif (rawPrefix.startsWith(\"~\") || expandedPrefix.startsWith(\"/\")) {\n\t\t\t\t\tsearchDir = expandedPrefix;\n\t\t\t\t} else {\n\t\t\t\t\tsearchDir = join(this.basePath, expandedPrefix);\n\t\t\t\t}\n\t\t\t\tsearchPrefix = \"\";\n\t\t\t} else {\n\t\t\t\t// Split into directory and file prefix\n\t\t\t\tconst dir = dirname(expandedPrefix);\n\t\t\t\tconst file = basename(expandedPrefix);\n\t\t\t\tif (rawPrefix.startsWith(\"~\") || expandedPrefix.startsWith(\"/\")) {\n\t\t\t\t\tsearchDir = dir;\n\t\t\t\t} else {\n\t\t\t\t\tsearchDir = join(this.basePath, dir);\n\t\t\t\t}\n\t\t\t\tsearchPrefix = file;\n\t\t\t}\n\n\t\t\tconst entries = readdirSync(searchDir, { withFileTypes: true });\n\t\t\tconst suggestions: AutocompleteItem[] = [];\n\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (!entry.name.toLowerCase().startsWith(searchPrefix.toLowerCase())) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Check if entry is a directory (or a symlink pointing to a directory)\n\t\t\t\tlet isDirectory = entry.isDirectory();\n\t\t\t\tif (!isDirectory && entry.isSymbolicLink()) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst fullPath = join(searchDir, entry.name);\n\t\t\t\t\t\tisDirectory = statSync(fullPath).isDirectory();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// Broken symlink or permission error - treat as file\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet relativePath: string;\n\t\t\t\tconst name = entry.name;\n\t\t\t\tconst displayPrefix = rawPrefix;\n\n\t\t\t\tif (displayPrefix.endsWith(\"/\")) {\n\t\t\t\t\t// If prefix ends with /, append entry to the prefix\n\t\t\t\t\trelativePath = displayPrefix + name;\n\t\t\t\t} else if (displayPrefix.includes(\"/\") || displayPrefix.includes(\"\\\\\")) {\n\t\t\t\t\t// Preserve ~/ format for home directory paths\n\t\t\t\t\tif (displayPrefix.startsWith(\"~/\")) {\n\t\t\t\t\t\tconst homeRelativeDir = displayPrefix.slice(2); // Remove ~/\n\t\t\t\t\t\tconst dir = dirname(homeRelativeDir);\n\t\t\t\t\t\trelativePath = `~/${dir === \".\" ? name : join(dir, name)}`;\n\t\t\t\t\t} else if (displayPrefix.startsWith(\"/\")) {\n\t\t\t\t\t\t// Absolute path - construct properly\n\t\t\t\t\t\tconst dir = dirname(displayPrefix);\n\t\t\t\t\t\tif (dir === \"/\") {\n\t\t\t\t\t\t\trelativePath = `/${name}`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trelativePath = `${dir}/${name}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelativePath = join(dirname(displayPrefix), name);\n\t\t\t\t\t\t// path.join normalizes away ./ prefix, preserve it\n\t\t\t\t\t\tif (displayPrefix.startsWith(\"./\") && !relativePath.startsWith(\"./\")) {\n\t\t\t\t\t\t\trelativePath = `./${relativePath}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// For standalone entries, preserve ~/ if original prefix was ~/\n\t\t\t\t\tif (displayPrefix.startsWith(\"~\")) {\n\t\t\t\t\t\trelativePath = `~/${name}`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\trelativePath = name;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\trelativePath = toDisplayPath(relativePath);\n\t\t\t\tconst pathValue = isDirectory ? `${relativePath}/` : relativePath;\n\t\t\t\tconst value = buildCompletionValue(pathValue, {\n\t\t\t\t\tisDirectory,\n\t\t\t\t\tisAtPrefix,\n\t\t\t\t\tisQuotedPrefix,\n\t\t\t\t});\n\n\t\t\t\tsuggestions.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tlabel: name + (isDirectory ? \"/\" : \"\"),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Sort directories first, then alphabetically\n\t\t\tsuggestions.sort((a, b) => {\n\t\t\t\tconst aIsDir = a.value.endsWith(\"/\");\n\t\t\t\tconst bIsDir = b.value.endsWith(\"/\");\n\t\t\t\tif (aIsDir && !bIsDir) return -1;\n\t\t\t\tif (!aIsDir && bIsDir) return 1;\n\t\t\t\treturn a.label.localeCompare(b.label);\n\t\t\t});\n\n\t\t\treturn suggestions;\n\t\t} catch (_e) {\n\t\t\t// Directory doesn't exist or not accessible\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t// Score an entry against the query (higher = better match)\n\t// isDirectory adds bonus to prioritize folders\n\tprivate scoreEntry(filePath: string, query: string, isDirectory: boolean): number {\n\t\tconst fileName = basename(filePath);\n\t\tconst lowerFileName = fileName.toLowerCase();\n\t\tconst lowerQuery = query.toLowerCase();\n\n\t\tlet score = 0;\n\n\t\t// Exact filename match (highest)\n\t\tif (lowerFileName === lowerQuery) score = 100;\n\t\t// Filename starts with query\n\t\telse if (lowerFileName.startsWith(lowerQuery)) score = 80;\n\t\t// Substring match in filename\n\t\telse if (lowerFileName.includes(lowerQuery)) score = 50;\n\t\t// Substring match in full path\n\t\telse if (filePath.toLowerCase().includes(lowerQuery)) score = 30;\n\n\t\t// Directories get a bonus to appear first\n\t\tif (isDirectory && score > 0) score += 10;\n\n\t\treturn score;\n\t}\n\n\t// Fuzzy file search using fd (fast, respects .gitignore)\n\tprivate async getFuzzyFileSuggestions(\n\t\tquery: string,\n\t\toptions: { isQuotedPrefix: boolean; signal: AbortSignal },\n\t): Promise<AutocompleteItem[]> {\n\t\tif (!this.fdPath || options.signal.aborted) {\n\t\t\treturn [];\n\t\t}\n\n\t\ttry {\n\t\t\tconst scopedQuery = this.resolveScopedFuzzyQuery(query);\n\t\t\tconst fdBaseDir = scopedQuery?.baseDir ?? this.basePath;\n\t\t\tconst fdQuery = scopedQuery?.query ?? query;\n\t\t\tconst entries = await walkDirectoryWithFd(fdBaseDir, this.fdPath, fdQuery, 100, options.signal);\n\t\t\tif (options.signal.aborted) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst scoredEntries = entries\n\t\t\t\t.map((entry) => ({\n\t\t\t\t\t...entry,\n\t\t\t\t\tscore: fdQuery ? this.scoreEntry(entry.path, fdQuery, entry.isDirectory) : 1,\n\t\t\t\t}))\n\t\t\t\t.filter((entry) => entry.score > 0);\n\n\t\t\tscoredEntries.sort((a, b) => b.score - a.score);\n\t\t\tconst topEntries = scoredEntries.slice(0, 20);\n\n\t\t\tconst suggestions: AutocompleteItem[] = [];\n\t\t\tfor (const { path: entryPath, isDirectory } of topEntries) {\n\t\t\t\tconst pathWithoutSlash = isDirectory ? entryPath.slice(0, -1) : entryPath;\n\t\t\t\tconst displayPath = scopedQuery\n\t\t\t\t\t? this.scopedPathForDisplay(scopedQuery.displayBase, pathWithoutSlash)\n\t\t\t\t\t: pathWithoutSlash;\n\t\t\t\tconst entryName = basename(pathWithoutSlash);\n\t\t\t\tconst completionPath = isDirectory ? `${displayPath}/` : displayPath;\n\t\t\t\tconst value = buildCompletionValue(completionPath, {\n\t\t\t\t\tisDirectory,\n\t\t\t\t\tisAtPrefix: true,\n\t\t\t\t\tisQuotedPrefix: options.isQuotedPrefix,\n\t\t\t\t});\n\n\t\t\t\tsuggestions.push({\n\t\t\t\t\tvalue,\n\t\t\t\t\tlabel: entryName + (isDirectory ? \"/\" : \"\"),\n\t\t\t\t\tdescription: displayPath,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn suggestions;\n\t\t} catch {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t// Check if we should trigger file completion (called on Tab key)\n\tshouldTriggerFileCompletion(lines: string[], cursorLine: number, cursorCol: number): boolean {\n\t\tconst currentLine = lines[cursorLine] || \"\";\n\t\tconst textBeforeCursor = currentLine.slice(0, cursorCol);\n\n\t\t// Don't trigger if we're typing a slash command at the start of the line\n\t\tif (textBeforeCursor.trim().startsWith(\"/\") && !textBeforeCursor.trim().includes(\" \")) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n}\n","// Headless @earendil-works/pi-tui compatibility surface.\n//\n// Pure text/measurement/key logic is vendored byte-identical from Pi (see\n// ./vendor/PI-LICENSE), so extensions observe identical widths, wrapping,\n// key names, fuzzy ranking, and keybinding tables. Interactive component\n// classes are headless: identical constructor/method signatures, plain-text\n// render output, no terminal I/O. Pi itself defines headless behavior for\n// json/print modes (noOpUIContext) and rpc `ui.custom` (undefined); these\n// classes exist so extensions can load and construct UI trees without a TTY.\n\nexport {\n  applyBackgroundToLine,\n  cjkBreakRegex,\n  extractAnsiCode,\n  getGraphemeCellRange,\n  getGraphemeSegmenter,\n  getOsc8LinkAtColumn,\n  getWordSegmenter,\n  isPunctuationChar,\n  isWhitespaceChar,\n  normalizeTerminalOutput,\n  PUNCTUATION_REGEX,\n  sliceByColumn,\n  sliceWithWidth,\n  stripTerminalSequences,\n  truncateToWidth,\n  visibleWidth,\n  wrapTextWithAnsi,\n} from './vendor/pi-tui-utils.js'\nexport { fuzzyFilter, fuzzyMatch, type FuzzyMatch } from './vendor/pi-tui-fuzzy.js'\nexport {\n  decodeKittyPrintable,\n  isKeyRelease,\n  isKeyRepeat,\n  isKittyProtocolActive,\n  Key,\n  type KeyEventType,\n  type KeyId,\n  matchesKey,\n  parseKey,\n  setKittyProtocolActive,\n} from './vendor/pi-tui-keys.js'\nexport {\n  parseOsc11BackgroundColor,\n  parseTerminalColorSchemeReport,\n  type RgbColor,\n  type TerminalColorScheme,\n} from './vendor/pi-tui-terminal-colors.js'\nexport {\n  getKeybindings,\n  type Keybinding,\n  type KeybindingConflict,\n  type KeybindingDefinition,\n  type KeybindingDefinitions,\n  type Keybindings,\n  type KeybindingsConfig,\n  KeybindingsManager,\n  setKeybindings,\n  TUI_KEYBINDINGS,\n} from './vendor/pi-tui-keybindings.js'\nexport { renderLatex, type RenderLatexOptions } from './vendor/pi-tui-latex.js'\nexport {\n  allocateImageId,\n  calculateImageRows,\n  type CellDimensions,\n  deleteAllKittyImages,\n  deleteKittyImage,\n  detectCapabilities,\n  encodeITerm2,\n  encodeKitty,\n  getCapabilities,\n  getCellDimensions,\n  getGifDimensions,\n  getImageDimensions,\n  getJpegDimensions,\n  getPngDimensions,\n  getWebpDimensions,\n  hyperlink,\n  type ImageDimensions,\n  imageFallback,\n  type ImageProtocol,\n  resetCapabilitiesCache,\n  setCapabilities,\n  setCellDimensions,\n  type TerminalCapabilities,\n} from './vendor/pi-tui-terminal-image.js'\nexport {\n  type AutocompleteItem,\n  type AutocompleteProvider,\n  type AutocompleteSuggestions,\n  CombinedAutocompleteProvider,\n  type SlashCommand,\n} from './vendor/pi-tui-autocomplete.js'\nexport { Marked, type Token, type Tokens } from 'marked'\n\nimport { truncateToWidth, visibleWidth, wrapTextWithAnsi } from './vendor/pi-tui-utils.js'\nimport type { AutocompleteProvider } from './vendor/pi-tui-autocomplete.js'\n\n// Pi's cursor-position marker: an APC sequence stripped by visibleWidth.\nexport const CURSOR_MARKER = '\\x1b_pi:c\\x07'\n\nexport interface Component {\n  render(width: number): string[]\n  invalidate(): void\n  handleInput?(data: string): void\n  wantsKeyRelease?: boolean\n}\n\nexport interface Focusable {\n  focused: boolean\n}\n\nexport function isFocusable(value: unknown): value is Focusable {\n  return typeof value === 'object' && value !== null && 'focused' in value\n}\n\nfunction blankLines(count: number): string[] {\n  return Array.from({ length: Math.max(0, count) }, () => '')\n}\n\nexport class Container implements Component {\n  children: Component[] = []\n  addChild(child: Component): void {\n    this.children.push(child)\n  }\n  removeChild(child: Component): void {\n    this.children = this.children.filter(candidate => candidate !== child)\n  }\n  clear(): void {\n    this.children = []\n  }\n  invalidate(): void {\n    for (const child of this.children) child.invalidate()\n  }\n  render(width: number): string[] {\n    return this.children.flatMap(child => child.render(width))\n  }\n}\n\nexport class Text implements Component {\n  private customBgFn: ((text: string) => string) | undefined\n  constructor(\n    public text: string = '',\n    public paddingX: number = 1,\n    public paddingY: number = 1,\n    customBgFn?: (text: string) => string,\n  ) {\n    this.customBgFn = customBgFn\n  }\n  setText(text: string): void {\n    this.text = text\n  }\n  setCustomBgFn(customBgFn?: (text: string) => string): void {\n    this.customBgFn = customBgFn\n  }\n  invalidate(): void {}\n  render(width: number): string[] {\n    const pad = ' '.repeat(Math.max(0, this.paddingX))\n    const inner = Math.max(1, width - this.paddingX * 2)\n    const lines = this.text.split('\\n').flatMap(line => wrapTextWithAnsi(line, inner))\n    const rendered = lines.map(line => {\n      const value = `${pad}${line}${pad}`\n      return this.customBgFn === undefined ? value : this.customBgFn(value)\n    })\n    return [...blankLines(this.paddingY), ...rendered, ...blankLines(this.paddingY)]\n  }\n}\n\nexport class TruncatedText implements Component {\n  constructor(\n    public text: string,\n    public paddingX: number = 0,\n    public paddingY: number = 0,\n  ) {}\n  invalidate(): void {}\n  render(width: number): string[] {\n    const pad = ' '.repeat(Math.max(0, this.paddingX))\n    const inner = Math.max(1, width - this.paddingX * 2)\n    const lines = this.text.split('\\n').map(line => `${pad}${truncateToWidth(line, inner)}${pad}`)\n    return [...blankLines(this.paddingY), ...lines, ...blankLines(this.paddingY)]\n  }\n}\n\nexport class Spacer implements Component {\n  constructor(private lines: number = 1) {}\n  setLines(lines: number): void {\n    this.lines = lines\n  }\n  invalidate(): void {}\n  render(_width: number): string[] {\n    return blankLines(this.lines)\n  }\n}\n\nexport class Box implements Component {\n  private children: Component[] = []\n  private bgFn: ((text: string) => string) | undefined\n  constructor(\n    public paddingX: number = 1,\n    public paddingY: number = 1,\n    bgFn?: (text: string) => string,\n  ) {\n    this.bgFn = bgFn\n  }\n  addChild(component: Component): void {\n    this.children.push(component)\n  }\n  removeChild(component: Component): void {\n    this.children = this.children.filter(candidate => candidate !== component)\n  }\n  clear(): void {\n    this.children = []\n  }\n  setBgFn(bgFn?: (text: string) => string): void {\n    this.bgFn = bgFn\n  }\n  invalidate(): void {\n    for (const child of this.children) child.invalidate()\n  }\n  render(width: number): string[] {\n    const pad = ' '.repeat(Math.max(0, this.paddingX))\n    const inner = Math.max(1, width - this.paddingX * 2)\n    const lines = this.children.flatMap(child => child.render(inner))\n    const rendered = [...blankLines(this.paddingY), ...lines.map(line => `${pad}${line}${pad}`), ...blankLines(this.paddingY)]\n    return this.bgFn === undefined ? rendered : rendered.map(line => this.bgFn!(line))\n  }\n}\n\nexport interface MarkdownTheme {\n  [key: string]: unknown\n}\nexport interface MarkdownOptions {\n  [key: string]: unknown\n}\nexport type DefaultTextStyle = (text: string) => string\n\nexport class Markdown implements Component {\n  constructor(\n    public text: string = '',\n    public paddingX: number = 1,\n    public paddingY: number = 1,\n    private theme?: MarkdownTheme,\n    private options?: MarkdownOptions,\n  ) {}\n  setText(text: string): void {\n    this.text = text\n  }\n  invalidate(): void {}\n  render(width: number): string[] {\n    const pad = ' '.repeat(Math.max(0, this.paddingX))\n    const inner = Math.max(1, width - this.paddingX * 2)\n    const lines = this.text.split('\\n').flatMap(line => wrapTextWithAnsi(line, inner))\n    return [...blankLines(this.paddingY), ...lines.map(line => `${pad}${line}${pad}`), ...blankLines(this.paddingY)]\n  }\n}\n\nexport interface SelectItem {\n  value: string\n  label: string\n  description?: string\n}\nexport interface SelectListTheme {\n  selectedPrefix?: unknown\n  selectedText?: unknown\n  description?: unknown\n  scrollInfo?: unknown\n  noMatch?: unknown\n  [key: string]: unknown\n}\nexport interface SelectListLayoutOptions {\n  minPrimaryColumnWidth?: number\n  maxPrimaryColumnWidth?: number\n  truncatePrimary?: unknown\n}\nexport interface SelectListTruncatePrimaryContext {\n  [key: string]: unknown\n}\n\nexport class SelectList implements Component {\n  onSelect?: (item: SelectItem) => void\n  onCancel?: () => void\n  onSelectionChange?: (item: SelectItem) => void\n  private filtered: SelectItem[]\n  private selectedIndex = 0\n  constructor(\n    private items: SelectItem[],\n    private maxVisible: number,\n    private theme: SelectListTheme,\n    private layout: SelectListLayoutOptions = {},\n  ) {\n    this.filtered = [...items]\n  }\n  setFilter(filter: string): void {\n    const query = filter.toLowerCase()\n    this.filtered = this.items.filter(item =>\n      item.label.toLowerCase().includes(query) || item.value.toLowerCase().includes(query))\n    this.selectedIndex = 0\n  }\n  setSelectedIndex(index: number): void {\n    this.selectedIndex = Math.max(0, Math.min(index, this.filtered.length - 1))\n  }\n  getSelectedItem(): SelectItem | null {\n    return this.filtered[this.selectedIndex] ?? null\n  }\n  invalidate(): void {}\n  handleInput(_keyData: string): void {}\n  render(width: number): string[] {\n    return this.filtered.slice(0, this.maxVisible)\n      .map((item, index) => truncateToWidth(`${index === this.selectedIndex ? '→ ' : '  '}${item.label}`, Math.max(1, width)))\n  }\n}\n\nexport interface SettingItem {\n  id: string\n  label: string\n  description?: string\n  currentValue: string\n  values?: string[]\n  submenu?: (currentValue: string, done: (selectedValue?: string) => void) => Component\n}\nexport interface SettingsListTheme {\n  label?: unknown\n  value?: unknown\n  description?: unknown\n  cursor?: unknown\n  hint?: unknown\n  [key: string]: unknown\n}\nexport interface SettingsListOptions {\n  enableSearch?: boolean\n}\n\nexport class SettingsList implements Component {\n  constructor(\n    private items: SettingItem[],\n    private maxVisible: number,\n    private theme: SettingsListTheme,\n    private onChange: (id: string, newValue: string) => void,\n    private onCancel: () => void,\n    private options: SettingsListOptions = {},\n  ) {}\n  updateValue(id: string, newValue: string): void {\n    const item = this.items.find(candidate => candidate.id === id)\n    if (item !== undefined) item.currentValue = newValue\n  }\n  invalidate(): void {}\n  handleInput(_data: string): void {}\n  render(width: number): string[] {\n    return this.items.slice(0, this.maxVisible)\n      .map(item => truncateToWidth(`${item.label}: ${item.currentValue}`, Math.max(1, width)))\n  }\n}\n\nexport class Input implements Component, Focusable {\n  focused = false\n  onSubmit?: (value: string) => void\n  onEscape?: () => void\n  private value = ''\n  getValue(): string {\n    return this.value\n  }\n  setValue(value: string): void {\n    this.value = value\n  }\n  handleInput(data: string): void {\n    if (data === '\\r' || data === '\\n') {\n      this.onSubmit?.(this.value)\n      return\n    }\n    if (data === '\\x1b') {\n      this.onEscape?.()\n      return\n    }\n    if (data >= ' ') this.value += data\n  }\n  invalidate(): void {}\n  render(width: number): string[] {\n    return [truncateToWidth(this.value, Math.max(1, width))]\n  }\n}\n\nexport interface EditorTheme {\n  borderColor?: (s: string) => string\n  selectList?: SelectListTheme\n  [key: string]: unknown\n}\nexport interface EditorOptions {\n  paddingX?: number\n  autocompleteMaxVisible?: number\n}\n\nexport interface EditorComponent {\n  getText(): string\n  setText(text: string): void\n  handleInput(data: string): void\n  onSubmit?: (text: string) => void\n  onChange?: (text: string) => void\n  addToHistory?(text: string): void\n  insertTextAtCursor?(text: string): void\n  getExpandedText?(): string\n  setAutocompleteProvider?(provider: AutocompleteProvider): void\n}\n\nexport class Editor implements Component, Focusable, EditorComponent {\n  focused = false\n  borderColor: (str: string) => string = str => str\n  onSubmit?: (text: string) => void\n  onChange?: (text: string) => void\n  disableSubmit = false\n  private text = ''\n  private history: string[] = []\n  private autocompleteProvider?: AutocompleteProvider\n  constructor(\n    private tui?: unknown,\n    private theme: EditorTheme = {},\n    private options: EditorOptions = {},\n  ) {}\n  getText(): string {\n    return this.text\n  }\n  setText(text: string): void {\n    this.text = text\n    this.onChange?.(text)\n  }\n  getExpandedText(): string {\n    return this.text\n  }\n  insertTextAtCursor(text: string): void {\n    this.setText(this.text + text)\n  }\n  addToHistory(text: string): void {\n    this.history.push(text)\n  }\n  setAutocompleteProvider(provider: AutocompleteProvider): void {\n    this.autocompleteProvider = provider\n  }\n  getPaddingX(): number {\n    return this.options.paddingX ?? 0\n  }\n  setPaddingX(padding: number): void {\n    this.options.paddingX = padding\n  }\n  getAutocompleteMaxVisible(): number {\n    return this.options.autocompleteMaxVisible ?? 5\n  }\n  setAutocompleteMaxVisible(maxVisible: number): void {\n    this.options.autocompleteMaxVisible = maxVisible\n  }\n  handleInput(data: string): void {\n    if (data === '\\r' || data === '\\n') {\n      if (!this.disableSubmit) this.onSubmit?.(this.text)\n      return\n    }\n    if (data >= ' ') this.setText(this.text + data)\n  }\n  invalidate(): void {}\n  render(width: number): string[] {\n    return this.text.split('\\n').flatMap(line => wrapTextWithAnsi(line, Math.max(1, width)))\n  }\n}\n\nexport interface StackEntryOptions {\n  [key: string]: unknown\n}\nexport type StackChild = Component | { component: Component; options?: StackEntryOptions }\nexport interface StackEntry {\n  component: Component\n  options?: StackEntryOptions\n}\nexport interface StackOptions {\n  [key: string]: unknown\n}\n\nclass Stack extends Container {\n  constructor(children: StackChild[] = [], protected options: StackOptions = {}) {\n    super()\n    for (const child of children) {\n      this.addChild('component' in child ? child.component : child)\n    }\n  }\n}\n\nexport class VStack extends Stack {}\n\nexport class HStack extends Stack {\n  override render(width: number): string[] {\n    const columns = this.children.map(child => child.render(width))\n    const height = Math.max(0, ...columns.map(column => column.length))\n    const lines: string[] = []\n    for (let row = 0; row < height; row += 1) {\n      lines.push(columns.map(column => column[row] ?? '').join(' '))\n    }\n    return lines\n  }\n}\n\nexport interface LoaderIndicatorOptions {\n  frames?: string[]\n  intervalMs?: number\n}\n\nexport class Loader extends Text {\n  constructor(message = '', indicator?: LoaderIndicatorOptions) {\n    super(message, 0, 0)\n    void indicator\n  }\n  start(): void {}\n  stop(): void {}\n  setMessage(message: string): void {\n    this.setText(message)\n  }\n  setIndicator(_indicator?: LoaderIndicatorOptions): void {}\n}\n\nexport class CancellableLoader extends Loader {\n  onCancel?: () => void\n  handleInput(data: string): void {\n    if (data === '\\x1b' || data === '\\x03') this.onCancel?.()\n  }\n  dispose(): void {}\n}\n\nexport interface ImageOptions {\n  [key: string]: unknown\n}\nexport interface ImageTheme {\n  [key: string]: unknown\n}\n\nexport class Image implements Component {\n  constructor(\n    private base64Data: string = '',\n    private mimeType: string = 'image/png',\n    private options: ImageOptions = {},\n  ) {}\n  getImageId(): number | undefined {\n    return undefined\n  }\n  invalidate(): void {}\n  render(width: number): string[] {\n    return [truncateToWidth(`[image ${this.mimeType}]`, Math.max(1, width))]\n  }\n}\n\nexport interface ScrollViewScrollbar {\n  [key: string]: unknown\n}\nexport interface ScrollViewOptions {\n  [key: string]: unknown\n}\nexport interface ScrollViewScrollToOptions {\n  [key: string]: unknown\n}\n\nexport class ScrollView extends Container {\n  private scrollTop = 0\n  constructor(component: Component, private options: ScrollViewOptions = {}) {\n    super()\n    this.addChild(component)\n  }\n  setScrollbar(_scrollbar: ScrollViewScrollbar): void {}\n  getContentWidth(width: number): number {\n    return Math.max(1, width - 1)\n  }\n  setScrollbarActive(_active: boolean): void {}\n  scrollTo(scrollTop: number, _options: ScrollViewScrollToOptions = {}): void {\n    this.scrollTop = Math.max(0, scrollTop)\n  }\n  scrollBy(lines: number): number {\n    this.scrollTop = Math.max(0, this.scrollTop + lines)\n    return this.scrollTop\n  }\n  scrollToStart(): void {\n    this.scrollTop = 0\n  }\n  scrollToEnd(): void {}\n  updateLayout(_contentHeight: number, _viewportHeight: number, _requestRender: () => void): void {}\n}\n\nexport interface OverlayMargin {\n  top?: number\n  right?: number\n  bottom?: number\n  left?: number\n}\nexport type SizeValue = number | `${number}%`\nexport interface OverlayAnchor {\n  [key: string]: unknown\n}\nexport interface OverlayOptions {\n  width?: SizeValue\n  maxHeight?: SizeValue\n  anchor?: OverlayAnchor\n  margin?: OverlayMargin\n  [key: string]: unknown\n}\nexport interface OverlayUnfocusOptions {\n  [key: string]: unknown\n}\nexport interface OverlayHandle {\n  close(): void\n  [key: string]: unknown\n}\nexport type TuiMode = 'regular' | 'fullscreen'\nexport interface TuiStopOptions {\n  preserveScreen?: boolean\n}\nexport type TuiInputListenerResult = { consume?: boolean; data?: string } | undefined\nexport type TuiInputListener = (data: string) => TuiInputListenerResult\n\nexport interface TUI extends Component {\n  addChild(child: Component): void\n  removeChild(child: Component): void\n  clear(): void\n  setFocus(component: Component | null): void\n  showOverlay(component: Component, options?: OverlayOptions): OverlayHandle\n  hideOverlay(): void\n  hasOverlay(): boolean\n  requestRender(): void\n  [key: string]: unknown\n}\nexport interface ViewportTUI extends TUI {\n  [key: string]: unknown\n}\nexport function isViewportTUI(value: unknown): value is ViewportTUI {\n  return false\n}\n"],"mappings":";;;;;;;;;;;;AAQA,MAAM,oBAAoB,IAAI,KAAK,UAAU,KAAA,GAAW,EAAE,aAAa,WAAW,CAAC;AACnF,MAAM,gBAAgB,IAAI,KAAK,UAAU,KAAA,GAAW,EAAE,aAAa,OAAO,CAAC;;;;AAK3E,SAAgB,uBAAuC;CACtD,OAAO;AACR;;;;AAKA,SAAgB,mBAAmC;CAClD,OAAO;AACR;;;;;;;AAQA,SAAS,aAAa,SAA0B;CAC/C,MAAM,KAAK,QAAQ,YAAY,CAAC;CAChC,OACE,MAAM,UAAW,MAAM,UACvB,MAAM,QAAU,MAAM,QACtB,MAAM,QAAU,MAAM,SACtB,MAAM,SAAU,MAAM,SACvB,QAAQ,SAAS,GAAQ,KACzB,QAAQ,SAAS;AAEnB;AAGA,MAAM,iBAAiB;AACvB,MAAM,0BAA0B;AAChC,MAAM,uBAAuB;AAC7B,MAAM,gBAAgB;AAGtB,MAAM,2BACL;AACD,MAAM,gBAAgB;AAGtB,MAAM,mBAAmB;AACzB,MAAM,6BAAa,IAAI,IAAoB;AAE3C,MAAa,gBACZ;AAED,SAAS,iBAAiB,KAAsB;CAC/C,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;EACpC,MAAM,OAAO,IAAI,WAAW,CAAC;EAC7B,IAAI,OAAO,MAAQ,OAAO,KACzB,OAAO;CAET;CACA,OAAO;AACR;AAEA,SAAS,wBAAwB,MAAc,UAAmD;CACjG,IAAI,YAAY,KAAK,KAAK,WAAW,GACpC,OAAO;EAAE,MAAM;EAAI,OAAO;CAAE;CAG7B,IAAI,iBAAiB,IAAI,GAAG;EAC3B,MAAM,UAAU,KAAK,MAAM,GAAG,QAAQ;EACtC,OAAO;GAAE,MAAM;GAAS,OAAO,QAAQ;EAAO;CAC/C;CAEA,MAAM,UAAU,KAAK,SAAS,MAAM;CACpC,MAAM,UAAU,KAAK,SAAS,GAAI;CAClC,IAAI,CAAC,WAAW,CAAC,SAAS;EACzB,IAAI,SAAS;EACb,IAAI,QAAQ;EACZ,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,IAAI,GAAG;GAC1D,MAAM,IAAI,cAAc,OAAO;GAC/B,IAAI,QAAQ,IAAI,UACf;GAED,UAAU;GACV,SAAS;EACV;EACA,OAAO;GAAE,MAAM;GAAQ;EAAM;CAC9B;CAEA,IAAI,SAAS;CACb,IAAI,QAAQ;CACZ,IAAI,IAAI;CACR,IAAI,cAAc;CAElB,OAAO,IAAI,KAAK,QAAQ;EACvB,MAAM,OAAO,gBAAgB,MAAM,CAAC;EACpC,IAAI,MAAM;GACT,eAAe,KAAK;GACpB,KAAK,KAAK;GACV;EACD;EAEA,IAAI,KAAK,OAAO,KAAM;GACrB,IAAI,QAAQ,IAAI,UACf;GAED,IAAI,aAAa;IAChB,UAAU;IACV,cAAc;GACf;GACA,UAAU;GACV,SAAS;GACT;GACA;EACD;EAEA,IAAI,MAAM;EACV,OAAO,MAAM,KAAK,UAAU,KAAK,SAAS,KAAM;GAE/C,IADiB,gBAAgB,MAAM,GAC5B,GACV;GAED;EACD;EAEA,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,KAAK,MAAM,GAAG,GAAG,CAAC,GAAG;GACxE,MAAM,IAAI,cAAc,OAAO;GAC/B,IAAI,QAAQ,IAAI,UACf,OAAO;IAAE,MAAM;IAAQ;GAAM;GAE9B,IAAI,aAAa;IAChB,UAAU;IACV,cAAc;GACf;GACA,UAAU;GACV,SAAS;EACV;EACA,IAAI;CACL;CAEA,OAAO;EAAE,MAAM;EAAQ;CAAM;AAC9B;AAEA,SAAS,wBACR,QACA,aACA,UACA,eACA,UACA,KACS;CACT,MAAM,QAAQ;CACd,MAAM,iBAAiB,mBAAmB,MAAM;CAChD,MAAM,eAAe,cAAc;CACnC,IAAI;CAEJ,IAAI,SAAS,SAAS,GACrB,SAAS,GAAG,SAAS,iBAAiB,QAAQ,WAAW;MAEzD,SAAS,GAAG,SAAS,iBAAiB;CAGvC,OAAO,MAAM,SAAS,IAAI,OAAO,KAAK,IAAI,GAAG,WAAW,YAAY,CAAC,IAAI;AAC1E;;;;;;AAOA,SAAS,cAAc,SAAyB;CAC/C,IAAI,YAAY,KACf,OAAO;CAIR,IAAI,yBAAyB,KAAK,OAAO,GACxC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;CAIrB,IAAI,eAAe,KAAK,OAAO,GAC9B,OAAO;CAIR,IAAI,aAAa,OAAO,KAAK,cAAc,KAAK,OAAO,GACtD,OAAO;CAIR,MAAM,OAAO,QAAQ,QAAQ,yBAAyB,EAAE;CACxD,MAAM,KAAK,KAAK,YAAY,CAAC;CAC7B,IAAI,OAAO,KAAA,GACV,OAAO;CAMR,IAAI,MAAM,UAAW,MAAM,QAC1B,OAAO;CAGR,IAAI,QAAQ,eAAe,EAAE;CAM7B,IAAI,cAAc;CAClB,MAAM,QAAQ,CAAC,GAAG,IAAI;CACtB,KAAK,MAAM,QAAQ,MAAM,MAAM,CAAC,GAC/B,IAAI,yBAAyB,KAAK,IAAI,GAAG;EACxC,SAAS;EACT,cAAc;CACf,OAAO,IAAI,cAAc,KAAK,IAAI,GACjC,cAAc;MACR,IAAI,CAAC,qBAAqB,KAAK,IAAI,GAAG;EAC5C,MAAM,IAAI,KAAK,YAAY,CAAC;EAC5B,IAAI,eAAgB,KAAK,SAAU,KAAK,OAEvC,SAAS,eAAe,CAAC;OACnB,IAAI,MAAM,QAAU,MAAM,MAChC,SAAS;EAEV,cAAc;CACf;CAGD,OAAO;AACR;;;;AAKA,SAAgB,aAAa,KAAqB;CACjD,IAAI,IAAI,WAAW,GAClB,OAAO;CAIR,IAAI,iBAAiB,GAAG,GACvB,OAAO,IAAI;CAIZ,MAAM,SAAS,WAAW,IAAI,GAAG;CACjC,IAAI,WAAW,KAAA,GACd,OAAO;CAIR,IAAI,QAAQ;CACZ,IAAI,IAAI,SAAS,GAAI,GACpB,QAAQ,MAAM,QAAQ,OAAO,KAAK;CAEnC,IAAI,MAAM,SAAS,MAAM,GAAG;EAI3B,IAAI,WAAW;EACf,IAAI,IAAI;EACR,OAAO,IAAI,MAAM,QAAQ;GACxB,MAAM,OAAO,gBAAgB,OAAO,CAAC;GACrC,IAAI,MAAM;IACT,KAAK,KAAK;IACV;GACD;GACA,YAAY,MAAM;GAClB;EACD;EACA,QAAQ;CACT;CAGA,IAAI,QAAQ;CACZ,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,KAAK,GACxD,SAAS,cAAc,OAAO;CAI/B,IAAI,WAAW,QAAQ,kBAAkB;EACxC,MAAM,WAAW,WAAW,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;EAC1C,IAAI,aAAa,KAAA,GAChB,WAAW,OAAO,QAAQ;CAE5B;CACA,WAAW,IAAI,KAAK,KAAK;CAEzB,OAAO;AACR;;AAGA,SAAgB,uBAAuB,KAAqB;CAC3D,IAAI,CAAC,IAAI,SAAS,MAAM,GAAG,OAAO;CAClC,IAAI,SAAS;CACb,IAAI,IAAI;CACR,OAAO,IAAI,IAAI,QAAQ;EACtB,MAAM,OAAO,gBAAgB,KAAK,CAAC;EACnC,IAAI,MAAM;GACT,KAAK,KAAK;GACV;EACD;EACA,UAAU,IAAI;EACd;CACD;CACA,OAAO;AACR;;AAQA,SAAgB,qBAAqB,MAAc,QAA+C;CACjG,IAAI,aAAa;CACjB,IAAI,IAAI;CACR,OAAO,IAAI,KAAK,QAAQ;EACvB,MAAM,OAAO,gBAAgB,MAAM,CAAC;EACpC,IAAI,MAAM;GACT,KAAK,KAAK;GACV;EACD;EACA,IAAI,UAAU;EACd,OAAO,UAAU,KAAK,UAAU,CAAC,gBAAgB,MAAM,OAAO,GAAG;EACjE,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,KAAK,MAAM,GAAG,OAAO,CAAC,GAAG;GAC5E,MAAM,QAAQ,cAAc,OAAO;GACnC,IAAI,QAAQ,KAAK,UAAU,cAAc,SAAS,aAAa,OAC9D,OAAO;IAAE,OAAO;IAAY,KAAK,aAAa;GAAM;GAErD,cAAc;EACf;EACA,IAAI;CACL;AAED;;AAGA,SAAgB,oBAAoB,MAAc,QAAoC;CACrF,IAAI;CACJ,IAAI,aAAa;CACjB,IAAI,IAAI;CACR,OAAO,IAAI,KAAK,QAAQ;EACvB,MAAM,OAAO,gBAAgB,MAAM,CAAC;EACpC,IAAI,MAAM;GACT,MAAM,YAAY,gDAAgD,KAAK,KAAK,IAAI;GAChF,IAAI,WAAW,YAAY,UAAU,MAAM,KAAA;GAC3C,KAAK,KAAK;GACV;EACD;EACA,IAAI,UAAU;EACd,OAAO,UAAU,KAAK,UAAU,CAAC,gBAAgB,MAAM,OAAO,GAAG;EACjE,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,KAAK,MAAM,GAAG,OAAO,CAAC,GAAG;GAC5E,MAAM,QAAQ,YAAY,MAAO,IAAI,cAAc,OAAO;GAC1D,IAAI,UAAU,cAAc,SAAS,aAAa,OAAO,OAAO;GAChE,cAAc;EACf;EACA,IAAI;CACL;AAED;;;;;;;;;AAUA,MAAM,oBAAoB;AAC1B,MAAM,2BAA2B;AAEjC,SAAgB,wBAAwB,KAAqB;CAC5D,IAAI,aAAa;CACjB,IAAI,kBAAkB,KAAK,UAAU,GACpC,aAAa,WAAW,QAAQ,2BAA2B,SAC1D,SAAS,MAAW,OAAiB,IACtC;CAED,IAAI,CAAC,WAAW,SAAS,GAAI,GAAG,OAAO;CAEvC,IAAI,SAAS;CACb,IAAI,IAAI;CACR,OAAO,IAAI,WAAW,QAAQ;EAC7B,MAAM,OAAO,gBAAgB,YAAY,CAAC;EAC1C,IAAI,MAAM;GACT,UAAU,KAAK;GACf,KAAK,KAAK;GACV;EACD;EACA,UAAU,WAAW,OAAO,MAAO,QAAQ,WAAW;EACtD;CACD;CACA,OAAO;AACR;;;;AAKA,SAAgB,gBAAgB,KAAa,KAAsD;CAClG,IAAI,OAAO,IAAI,UAAU,IAAI,SAAS,QAAQ,OAAO;CAErD,MAAM,OAAO,IAAI,MAAM;CAGvB,IAAI,SAAS,KAAK;EACjB,IAAI,IAAI,MAAM;EACd,OAAO,IAAI,IAAI,UAAU,CAAC,UAAU,KAAK,IAAI,EAAG,GAAG;EACnD,IAAI,IAAI,IAAI,QAAQ,OAAO;GAAE,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC;GAAG,QAAQ,IAAI,IAAI;EAAI;EAClF,OAAO;CACR;CAIA,IAAI,SAAS,KAAK;EACjB,IAAI,IAAI,MAAM;EACd,OAAO,IAAI,IAAI,QAAQ;GACtB,IAAI,IAAI,OAAO,QAAQ,OAAO;IAAE,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC;IAAG,QAAQ,IAAI,IAAI;GAAI;GACrF,IAAI,IAAI,OAAO,UAAU,IAAI,IAAI,OAAO,MAAM,OAAO;IAAE,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC;IAAG,QAAQ,IAAI,IAAI;GAAI;GAC5G;EACD;EACA,OAAO;CACR;CAIA,IAAI,SAAS,KAAK;EACjB,IAAI,IAAI,MAAM;EACd,OAAO,IAAI,IAAI,QAAQ;GACtB,IAAI,IAAI,OAAO,QAAQ,OAAO;IAAE,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC;IAAG,QAAQ,IAAI,IAAI;GAAI;GACrF,IAAI,IAAI,OAAO,UAAU,IAAI,IAAI,OAAO,MAAM,OAAO;IAAE,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC;IAAG,QAAQ,IAAI,IAAI;GAAI;GAC5G;EACD;EACA,OAAO;CACR;CAEA,OAAO;AACR;AAUA,SAAS,mBAAmB,UAAsD;CACjF,IAAI,CAAC,SAAS,WAAW,SAAS,GACjC;CAGD,MAAM,aAA6B,SAAS,SAAS,MAAM,IAAI,SAAS;CACxE,MAAM,OAAO,SAAS,MAAM,GAAG,eAAe,SAAS,KAAK,EAAE;CAC9D,MAAM,iBAAiB,KAAK,QAAQ,GAAG;CACvC,IAAI,mBAAmB,IACtB;CAGD,MAAM,SAAS,KAAK,MAAM,GAAG,cAAc;CAC3C,MAAM,MAAM,KAAK,MAAM,iBAAiB,CAAC;CACzC,IAAI,CAAC,KACJ,OAAO;CAER,OAAO;EAAE;EAAQ;EAAK;CAAW;AAClC;AAEA,SAAS,oBAAoB,WAAoC;CAChE,OAAO,UAAU,UAAU,OAAO,GAAG,UAAU,MAAM,UAAU;AAChE;AAEA,SAAS,gBAAgB,YAAoC;CAC5D,OAAO,WAAW;AACnB;AAEA,SAAS,mBAAmB,QAAwB;CACnD,IAAI,CAAC,OAAO,SAAS,SAAS,GAC7B,OAAO;CAGR,IAAI,kBAA0C;CAC9C,IAAI,IAAI;CACR,OAAO,IAAI,OAAO,QAAQ;EACzB,MAAM,OAAO,gBAAgB,QAAQ,CAAC;EACtC,IAAI,MAAM;GACT,MAAM,YAAY,mBAAmB,KAAK,IAAI;GAC9C,IAAI,cAAc,KAAA,GACjB,kBAAkB;GAEnB,KAAK,KAAK;EACX,OACC;CAEF;CACA,OAAO,kBAAkB,gBAAgB,gBAAgB,UAAU,IAAI;AACxE;;;;AAKA,IAAM,kBAAN,MAAsB;CAErB,OAAe;CACf,MAAc;CACd,SAAiB;CACjB,YAAoB;CACpB,QAAgB;CAChB,UAAkB;CAClB,SAAiB;CACjB,gBAAwB;CACxB,UAAiC;CACjC,UAAiC;CACjC,kBAAkD;CAElD,QAAQ,UAAwB;EAK/B,MAAM,YAAY,mBAAmB,QAAQ;EAC7C,IAAI,cAAc,KAAA,GAAW;GAC5B,KAAK,kBAAkB;GACvB;EACD;EAEA,IAAI,CAAC,SAAS,SAAS,GAAG,GACzB;EAID,MAAM,QAAQ,SAAS,MAAM,iBAAiB;EAC9C,IAAI,CAAC,OAAO;EAEZ,MAAM,SAAS,MAAM;EACrB,IAAI,WAAW,MAAM,WAAW,KAAK;GAEpC,KAAK,MAAM;GACX;EACD;EAGA,MAAM,QAAQ,OAAO,MAAM,GAAG;EAC9B,IAAI,IAAI;EACR,OAAO,IAAI,MAAM,QAAQ;GACxB,MAAM,OAAO,OAAO,SAAS,MAAM,IAAI,EAAE;GAGzC,IAAI,SAAS,MAAM,SAAS,IAAI;IAG/B,IAAI,MAAM,IAAI,OAAO,OAAO,MAAM,IAAI,OAAO,KAAA,GAAW;KAEvD,MAAM,YAAY,GAAG,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI;KAC3D,IAAI,SAAS,IACZ,KAAK,UAAU;UAEf,KAAK,UAAU;KAEhB,KAAK;KACL;IACD,OAAO,IAAI,MAAM,IAAI,OAAO,OAAO,MAAM,IAAI,OAAO,KAAA,GAAW;KAE9D,MAAM,YAAY,GAAG,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI,GAAG,GAAG,MAAM,IAAI;KAC3F,IAAI,SAAS,IACZ,KAAK,UAAU;UAEf,KAAK,UAAU;KAEhB,KAAK;KACL;IACD;GACD;GAGA,QAAQ,MAAR;IACC,KAAK;KACJ,KAAK,MAAM;KACX;IACD,KAAK;KACJ,KAAK,OAAO;KACZ;IACD,KAAK;KACJ,KAAK,MAAM;KACX;IACD,KAAK;KACJ,KAAK,SAAS;KACd;IACD,KAAK;KACJ,KAAK,YAAY;KACjB;IACD,KAAK;KACJ,KAAK,QAAQ;KACb;IACD,KAAK;KACJ,KAAK,UAAU;KACf;IACD,KAAK;KACJ,KAAK,SAAS;KACd;IACD,KAAK;KACJ,KAAK,gBAAgB;KACrB;IACD,KAAK;KACJ,KAAK,OAAO;KACZ;IACD,KAAK;KACJ,KAAK,OAAO;KACZ,KAAK,MAAM;KACX;IACD,KAAK;KACJ,KAAK,SAAS;KACd;IACD,KAAK;KACJ,KAAK,YAAY;KACjB;IACD,KAAK;KACJ,KAAK,QAAQ;KACb;IACD,KAAK;KACJ,KAAK,UAAU;KACf;IACD,KAAK;KACJ,KAAK,SAAS;KACd;IACD,KAAK;KACJ,KAAK,gBAAgB;KACrB;IACD,KAAK;KACJ,KAAK,UAAU;KACf;IACD,KAAK;KACJ,KAAK,UAAU;KACf;IACD,SAEC,IAAK,QAAQ,MAAM,QAAQ,MAAQ,QAAQ,MAAM,QAAQ,IACxD,KAAK,UAAU,OAAO,IAAI;SAGtB,IAAK,QAAQ,MAAM,QAAQ,MAAQ,QAAQ,OAAO,QAAQ,KAC9D,KAAK,UAAU,OAAO,IAAI;GAG7B;GACA;EACD;CACD;CAEA,QAAsB;EACrB,KAAK,OAAO;EACZ,KAAK,MAAM;EACX,KAAK,SAAS;EACd,KAAK,YAAY;EACjB,KAAK,QAAQ;EACb,KAAK,UAAU;EACf,KAAK,SAAS;EACd,KAAK,gBAAgB;EACrB,KAAK,UAAU;EACf,KAAK,UAAU;CAEhB;;CAGA,QAAc;EACb,KAAK,MAAM;EACX,KAAK,kBAAkB;CACxB;CAEA,iBAAyB;EACxB,MAAM,QAAkB,CAAC;EACzB,IAAI,KAAK,MAAM,MAAM,KAAK,GAAG;EAC7B,IAAI,KAAK,KAAK,MAAM,KAAK,GAAG;EAC5B,IAAI,KAAK,QAAQ,MAAM,KAAK,GAAG;EAC/B,IAAI,KAAK,WAAW,MAAM,KAAK,GAAG;EAClC,IAAI,KAAK,OAAO,MAAM,KAAK,GAAG;EAC9B,IAAI,KAAK,SAAS,MAAM,KAAK,GAAG;EAChC,IAAI,KAAK,QAAQ,MAAM,KAAK,GAAG;EAC/B,IAAI,KAAK,eAAe,MAAM,KAAK,GAAG;EACtC,IAAI,KAAK,SAAS,MAAM,KAAK,KAAK,OAAO;EACzC,IAAI,KAAK,SAAS,MAAM,KAAK,KAAK,OAAO;EAEzC,IAAI,SAAS,MAAM,SAAS,IAAI,QAAQ,MAAM,KAAK,GAAG,EAAE,KAAK;EAC7D,IAAI,KAAK,iBACR,UAAU,oBAAoB,KAAK,eAAe;EAEnD,OAAO;CACR;CAEA,iBAA0B;EACzB,OACC,KAAK,QACL,KAAK,OACL,KAAK,UACL,KAAK,aACL,KAAK,SACL,KAAK,WACL,KAAK,UACL,KAAK,iBACL,KAAK,YAAY,QACjB,KAAK,YAAY,QACjB,KAAK,oBAAoB;CAE3B;;;;;;;CAQA,kBAA0B;EACzB,IAAI,SAAS;EACb,IAAI,KAAK,WACR,UAAU;EAEX,IAAI,KAAK,iBACR,UAAU,gBAAgB,KAAK,gBAAgB,UAAU;EAE1D,OAAO;CACR;AACD;AAEA,SAAS,sBAAsB,MAAc,SAAgC;CAC5E,IAAI,IAAI;CACR,OAAO,IAAI,KAAK,QAAQ;EACvB,MAAM,aAAa,gBAAgB,MAAM,CAAC;EAC1C,IAAI,YAAY;GACf,QAAQ,QAAQ,WAAW,IAAI;GAC/B,KAAK,WAAW;EACjB,OACC;CAEF;AACD;;;;AAKA,SAAS,wBAAwB,MAAwB;CACxD,MAAM,SAAmB,CAAC;CAC1B,IAAI,UAAU;CACd,IAAI,cAAc;CAClB,IAAI,cAAuC;CAC3C,IAAI,IAAI;CAER,MAAM,qBAA2B;EAChC,IAAI,CAAC,SACJ;EAED,OAAO,KAAK,OAAO;EACnB,UAAU;EACV,cAAc;CACf;CAEA,OAAO,IAAI,KAAK,QAAQ;EACvB,MAAM,aAAa,gBAAgB,MAAM,CAAC;EAC1C,IAAI,YAAY;GAEf,eAAe,WAAW;GAC1B,KAAK,WAAW;GAChB;EACD;EAEA,IAAI,MAAM;EACV,OAAO,MAAM,KAAK,UAAU,CAAC,gBAAgB,MAAM,GAAG,GACrD;EAGD,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,KAAK,MAAM,GAAG,GAAG,CAAC,GAAG;GACxE,MAAM,iBAAiB,YAAY;GACnC,IAAI,CAAC,kBAAkB,cAAc,KAAK,OAAO,GAAG;IACnD,aAAa;IACb,MAAM,QAAQ,cAAc;IAC5B,cAAc;IACd,OAAO,KAAK,KAAK;IACjB;GACD;GAEA,MAAM,cAAc,iBAAiB,UAAU;GAC/C,IAAI,WAAW,gBAAgB,aAC9B,aAAa;GAId,IAAI,aAAa;IAChB,WAAW;IACX,cAAc;GACf;GAEA,cAAc;GACd,WAAW;EACZ;EAEA,IAAI;CACL;CAGA,IAAI,aAAa;EAChB,IAAI,SACH,WAAW;OACL,IAAI,OAAO,SAAS,GAC1B,OAAO,OAAO,SAAS,MAAM;OAE7B,UAAU;CAEZ;CAEA,IAAI,SACH,OAAO,KAAK,OAAO;CAGpB,OAAO;AACR;;;;;;;;;;;;AAaA,SAAgB,iBAAiB,MAAc,OAAyB;CACvE,IAAI,CAAC,MACJ,OAAO,CAAC,EAAE;CAKX,MAAM,aAAa,KAAK,MAAM,YAAY;CAC1C,MAAM,SAAmB,CAAC;CAC1B,MAAM,UAAU,IAAI,gBAAgB;CAEpC,KAAK,MAAM,aAAa,YAAY;EAGnC,MAAM,eAAe,gBADN,OAAO,SAAS,IAAI,QAAQ,eAAe,IAAI,MACjB,WAAW,KAAK;EAC7D,KAAK,MAAM,eAAe,cACzB,OAAO,KAAK,WAAW;EAGxB,sBAAsB,WAAW,OAAO;CACzC;CAEA,OAAO,OAAO,SAAS,IAAI,SAAS,CAAC,EAAE;AACxC;AAEA,SAAS,eAAe,MAAc,OAAyB;CAC9D,IAAI,CAAC,MACJ,OAAO,CAAC,EAAE;CAIX,IADsB,aAAa,IACnB,KAAK,OACpB,OAAO,CAAC,IAAI;CAGb,MAAM,UAAoB,CAAC;CAC3B,MAAM,UAAU,IAAI,gBAAgB;CACpC,MAAM,SAAS,wBAAwB,IAAI;CAE3C,IAAI,cAAc;CAClB,IAAI,uBAAuB;CAE3B,KAAK,MAAM,SAAS,QAAQ;EAC3B,MAAM,qBAAqB,aAAa,KAAK;EAC7C,MAAM,eAAe,MAAM,KAAK,MAAM;EAGtC,IAAI,qBAAqB,SAAS,CAAC,cAAc;GAChD,IAAI,aAAa;IAEhB,MAAM,eAAe,QAAQ,gBAAgB;IAC7C,IAAI,cACH,eAAe;IAEhB,QAAQ,KAAK,WAAW;IACxB,cAAc;IACd,uBAAuB;GACxB;GAGA,MAAM,SAAS,cAAc,OAAO,OAAO,OAAO;GAClD,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KACtC,QAAQ,KAAK,OAAO,EAAG;GAExB,cAAc,OAAO,OAAO,SAAS;GACrC,uBAAuB,aAAa,WAAW;GAC/C;EACD;EAKA,IAFoB,uBAAuB,qBAEzB,SAAS,uBAAuB,GAAG;GAEpD,IAAI,aAAa,YAAY,QAAQ;GACrC,MAAM,eAAe,QAAQ,gBAAgB;GAC7C,IAAI,cACH,cAAc;GAEf,QAAQ,KAAK,UAAU;GACvB,IAAI,cAAc;IAEjB,cAAc,QAAQ,eAAe;IACrC,uBAAuB;GACxB,OAAO;IACN,cAAc,QAAQ,eAAe,IAAI;IACzC,uBAAuB;GACxB;EACD,OAAO;GAEN,eAAe;GACf,wBAAwB;EACzB;EAEA,sBAAsB,OAAO,OAAO;CACrC;CAEA,IAAI,aAEH,QAAQ,KAAK,WAAW;CAIzB,OAAO,QAAQ,SAAS,IAAI,QAAQ,KAAK,SAAS,KAAK,QAAQ,CAAC,IAAI,CAAC,EAAE;AACxE;AAEA,MAAa,oBAAoB;;;;AAKjC,SAAgB,iBAAiB,MAAuB;CACvD,OAAO,KAAK,KAAK,IAAI;AACtB;;;;AAKA,SAAgB,kBAAkB,MAAuB;CACxD,OAAO,kBAAkB,KAAK,IAAI;AACnC;AAEA,SAAS,cAAc,MAAc,OAAe,SAAoC;CACvF,MAAM,QAAkB,CAAC;CACzB,IAAI,cAAc,QAAQ,eAAe;CACzC,IAAI,eAAe;CAInB,IAAI,IAAI;CACR,MAAM,WAAgE,CAAC;CAEvE,OAAO,IAAI,KAAK,QAAQ;EACvB,MAAM,aAAa,gBAAgB,MAAM,CAAC;EAC1C,IAAI,YAAY;GACf,SAAS,KAAK;IAAE,MAAM;IAAQ,OAAO,WAAW;GAAK,CAAC;GACtD,KAAK,WAAW;EACjB,OAAO;GAEN,IAAI,MAAM;GACV,OAAO,MAAM,KAAK,QAAQ;IAEzB,IADiB,gBAAgB,MAAM,GAC5B,GAAG;IACd;GACD;GAEA,MAAM,cAAc,KAAK,MAAM,GAAG,GAAG;GACrC,KAAK,MAAM,OAAO,kBAAkB,QAAQ,WAAW,GACtD,SAAS,KAAK;IAAE,MAAM;IAAY,OAAO,IAAI;GAAQ,CAAC;GAEvD,IAAI;EACL;CACD;CAGA,KAAK,MAAM,OAAO,UAAU;EAC3B,IAAI,IAAI,SAAS,QAAQ;GACxB,eAAe,IAAI;GACnB,QAAQ,QAAQ,IAAI,KAAK;GACzB;EACD;EAEA,MAAM,WAAW,IAAI;EAErB,IAAI,CAAC,UAAU;EAEf,MAAM,gBAAgB,aAAa,QAAQ;EAE3C,IAAI,eAAe,gBAAgB,OAAO;GAEzC,MAAM,eAAe,QAAQ,gBAAgB;GAC7C,IAAI,cACH,eAAe;GAEhB,MAAM,KAAK,WAAW;GACtB,cAAc,QAAQ,eAAe;GACrC,eAAe;EAChB;EAEA,eAAe;EACf,gBAAgB;CACjB;CAEA,IAAI,aAEH,MAAM,KAAK,WAAW;CAGvB,OAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,EAAE;AACtC;;;;;;;;;AAUA,SAAgB,sBAAsB,MAAc,OAAe,MAAwC;CAE1G,MAAM,aAAa,aAAa,IAAI;CACpC,MAAM,gBAAgB,KAAK,IAAI,GAAG,QAAQ,UAAU;CAKpD,OAAO,KADa,OAHJ,IAAI,OAAO,aAGM,CACV;AACxB;;;;;;;;;;;;AAaA,SAAgB,gBACf,MACA,UACA,WAAmB,OACnB,MAAe,OACN;CACT,IAAI,YAAY,GACf,OAAO;CAGR,IAAI,KAAK,WAAW,GACnB,OAAO,MAAM,IAAI,OAAO,QAAQ,IAAI;CAGrC,MAAM,gBAAgB,aAAa,QAAQ;CAC3C,IAAI,iBAAiB,UAAU;EAC9B,MAAM,YAAY,aAAa,IAAI;EACnC,IAAI,aAAa,UAChB,OAAO,MAAM,OAAO,IAAI,OAAO,WAAW,SAAS,IAAI;EAGxD,MAAM,kBAAkB,wBAAwB,UAAU,QAAQ;EAClE,IAAI,gBAAgB,UAAU,GAC7B,OAAO,MAAM,IAAI,OAAO,QAAQ,IAAI;EAErC,OAAO,wBAAwB,IAAI,GAAG,gBAAgB,MAAM,gBAAgB,OAAO,UAAU,GAAG;CACjG;CAEA,IAAI,iBAAiB,IAAI,GAAG;EAC3B,IAAI,KAAK,UAAU,UAClB,OAAO,MAAM,OAAO,IAAI,OAAO,WAAW,KAAK,MAAM,IAAI;EAE1D,MAAM,cAAc,WAAW;EAC/B,OAAO,wBAAwB,KAAK,MAAM,GAAG,WAAW,GAAG,aAAa,UAAU,eAAe,UAAU,GAAG;CAC/G;CAEA,MAAM,cAAc,WAAW;CAC/B,IAAI,SAAS;CACb,IAAI,cAAc;CAClB,IAAI,eAAe;CACnB,IAAI,YAAY;CAChB,IAAI,uBAAuB;CAC3B,IAAI,aAAa;CACjB,IAAI,iBAAiB;CACrB,MAAM,UAAU,KAAK,SAAS,MAAM;CACpC,MAAM,UAAU,KAAK,SAAS,GAAI;CAElC,IAAI,CAAC,WAAW,CAAC,SAAS;EACzB,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,IAAI,GAAG;GAC1D,MAAM,QAAQ,cAAc,OAAO;GACnC,IAAI,wBAAwB,YAAY,SAAS,aAAa;IAC7D,UAAU;IACV,aAAa;GACd,OACC,uBAAuB;GAExB,gBAAgB;GAChB,IAAI,eAAe,UAAU;IAC5B,aAAa;IACb;GACD;EACD;EACA,iBAAiB,CAAC;CACnB,OAAO;EACN,IAAI,IAAI;EACR,OAAO,IAAI,KAAK,QAAQ;GACvB,MAAM,OAAO,gBAAgB,MAAM,CAAC;GACpC,IAAI,MAAM;IACT,eAAe,KAAK;IACpB,KAAK,KAAK;IACV;GACD;GAEA,IAAI,KAAK,OAAO,KAAM;IACrB,IAAI,wBAAwB,YAAY,KAAK,aAAa;KACzD,IAAI,aAAa;MAChB,UAAU;MACV,cAAc;KACf;KACA,UAAU;KACV,aAAa;IACd,OAAO;KACN,uBAAuB;KACvB,cAAc;IACf;IACA,gBAAgB;IAChB,IAAI,eAAe,UAAU;KAC5B,aAAa;KACb;IACD;IACA;IACA;GACD;GAEA,IAAI,MAAM;GACV,OAAO,MAAM,KAAK,UAAU,KAAK,SAAS,KAAM;IAE/C,IADiB,gBAAgB,MAAM,GAC5B,GACV;IAED;GACD;GAEA,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,KAAK,MAAM,GAAG,GAAG,CAAC,GAAG;IACxE,MAAM,QAAQ,cAAc,OAAO;IACnC,IAAI,wBAAwB,YAAY,SAAS,aAAa;KAC7D,IAAI,aAAa;MAChB,UAAU;MACV,cAAc;KACf;KACA,UAAU;KACV,aAAa;IACd,OAAO;KACN,uBAAuB;KACvB,cAAc;IACf;IAEA,gBAAgB;IAChB,IAAI,eAAe,UAAU;KAC5B,aAAa;KACb;IACD;GACD;GACA,IAAI,YACH;GAED,IAAI;EACL;EACA,iBAAiB,KAAK,KAAK;CAC5B;CAEA,IAAI,CAAC,cAAc,gBAClB,OAAO,MAAM,OAAO,IAAI,OAAO,KAAK,IAAI,GAAG,WAAW,YAAY,CAAC,IAAI;CAGxE,OAAO,wBAAwB,QAAQ,WAAW,UAAU,eAAe,UAAU,GAAG;AACzF;;;;;AAMA,SAAgB,cAAc,MAAc,UAAkB,QAAgB,SAAS,OAAe;CACrG,OAAO,eAAe,MAAM,UAAU,QAAQ,MAAM,CAAC,CAAC;AACvD;;AAGA,SAAgB,eACf,MACA,UACA,QACA,SAAS,OACyB;CAClC,IAAI,UAAU,GAAG,OAAO;EAAE,MAAM;EAAI,OAAO;CAAE;CAC7C,MAAM,SAAS,WAAW;CAC1B,IAAI,SAAS,IACZ,cAAc,GACd,aAAa,GACb,IAAI,GACJ,cAAc;CAEf,OAAO,IAAI,KAAK,QAAQ;EACvB,MAAM,OAAO,gBAAgB,MAAM,CAAC;EACpC,IAAI,MAAM;GACT,IAAI,cAAc,YAAY,aAAa,QAAQ,UAAU,KAAK;QAC7D,IAAI,aAAa,UAAU,eAAe,KAAK;GACpD,KAAK,KAAK;GACV;EACD;EAEA,IAAI,UAAU;EACd,OAAO,UAAU,KAAK,UAAU,CAAC,gBAAgB,MAAM,OAAO,GAAG;EAEjE,KAAK,MAAM,EAAE,aAAa,kBAAkB,QAAQ,KAAK,MAAM,GAAG,OAAO,CAAC,GAAG;GAC5E,MAAM,IAAI,cAAc,OAAO;GAC/B,MAAM,UAAU,cAAc,YAAY,aAAa;GACvD,MAAM,OAAO,CAAC,UAAU,aAAa,KAAK;GAC1C,IAAI,WAAW,MAAM;IACpB,IAAI,aAAa;KAChB,UAAU;KACV,cAAc;IACf;IACA,UAAU;IACV,eAAe;GAChB;GACA,cAAc;GACd,IAAI,cAAc,QAAQ;EAC3B;EACA,IAAI;EACJ,IAAI,cAAc,QAAQ;CAC3B;CACA,OAAO;EAAE,MAAM;EAAQ,OAAO;CAAY;AAC3C;AAG2B,IAAI,gBAAgB;;;ACxtC/C,SAAgB,WAAW,OAAe,MAA0B;CACnE,MAAM,aAAa,MAAM,YAAY;CACrC,MAAM,YAAY,KAAK,YAAY;CAEnC,MAAM,cAAc,oBAAwC;EAC3D,IAAI,gBAAgB,WAAW,GAC9B,OAAO;GAAE,SAAS;GAAM,OAAO;EAAE;EAGlC,IAAI,gBAAgB,SAAS,UAAU,QACtC,OAAO;GAAE,SAAS;GAAO,OAAO;EAAE;EAGnC,IAAI,aAAa;EACjB,IAAI,QAAQ;EACZ,IAAI,iBAAiB;EACrB,IAAI,qBAAqB;EAEzB,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,UAAU,aAAa,gBAAgB,QAAQ,KAC5E,IAAI,UAAU,OAAO,gBAAgB,aAAa;GACjD,MAAM,iBAAiB,MAAM,KAAK,aAAa,KAAK,UAAU,IAAI,EAAG;GAGrE,IAAI,mBAAmB,IAAI,GAAG;IAC7B;IACA,SAAS,qBAAqB;GAC/B,OAAO;IACN,qBAAqB;IAErB,IAAI,kBAAkB,GACrB,UAAU,IAAI,iBAAiB,KAAK;GAEtC;GAGA,IAAI,gBACH,SAAS;GAIV,SAAS,IAAI;GAEb,iBAAiB;GACjB;EACD;EAGD,IAAI,aAAa,gBAAgB,QAChC,OAAO;GAAE,SAAS;GAAO,OAAO;EAAE;EAGnC,IAAI,oBAAoB,WACvB,SAAS;EAGV,OAAO;GAAE,SAAS;GAAM;EAAM;CAC/B;CAEA,MAAM,eAAe,WAAW,UAAU;CAC1C,IAAI,aAAa,SAChB,OAAO;CAGR,MAAM,oBAAoB,WAAW,MAAM,uCAAuC;CAClF,MAAM,oBAAoB,WAAW,MAAM,uCAAuC;CAClF,MAAM,eAAe,oBAClB,GAAG,kBAAkB,QAAQ,UAAU,KAAK,kBAAkB,QAAQ,WAAW,OACjF,oBACC,GAAG,kBAAkB,QAAQ,WAAW,KAAK,kBAAkB,QAAQ,UAAU,OACjF;CAEJ,IAAI,CAAC,cACJ,OAAO;CAGR,MAAM,eAAe,WAAW,YAAY;CAC5C,IAAI,CAAC,aAAa,SACjB,OAAO;CAGR,OAAO;EAAE,SAAS;EAAM,OAAO,aAAa,QAAQ;CAAE;AACvD;;;;;AAMA,SAAgB,YAAe,OAAY,OAAe,SAAmC;CAC5F,IAAI,CAAC,MAAM,KAAK,GACf,OAAO;CAGR,MAAM,SAAS,MACb,KAAK,CAAC,CACN,MAAM,QAAQ,CAAC,CACf,QAAQ,MAAM,EAAE,SAAS,CAAC;CAE5B,IAAI,OAAO,WAAW,GACrB,OAAO;CAGR,MAAM,UAA6C,CAAC;CAEpD,KAAK,MAAM,QAAQ,OAAO;EACzB,MAAM,OAAO,QAAQ,IAAI;EACzB,IAAI,aAAa;EACjB,IAAI,WAAW;EAEf,KAAK,MAAM,SAAS,QAAQ;GAC3B,MAAM,QAAQ,WAAW,OAAO,IAAI;GACpC,IAAI,MAAM,SACT,cAAc,MAAM;QACd;IACN,WAAW;IACX;GACD;EACD;EAEA,IAAI,UACH,QAAQ,KAAK;GAAE;GAAM;EAAW,CAAC;CAEnC;CAEA,QAAQ,MAAM,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;CAClD,OAAO,QAAQ,KAAK,MAAM,EAAE,IAAI;AACjC;;;;;;;;;;;;;;;;;;;;;;AChHA,IAAI,uBAAuB;;;;;AAM3B,SAAgB,uBAAuB,QAAuB;CAC7D,uBAAuB;AACxB;;;;AAKA,SAAgB,wBAAiC;CAChD,OAAO;AACR;;;;;;;;;;AA2HA,MAAa,MAAM;CAElB,QAAQ;CACR,KAAK;CACL,OAAO;CACP,QAAQ;CACR,KAAK;CACL,OAAO;CACP,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,MAAM;CACN,KAAK;CACL,QAAQ;CACR,UAAU;CACV,IAAI;CACJ,MAAM;CACN,MAAM;CACN,OAAO;CACP,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,KAAK;CACL,KAAK;CAGL,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,aAAa;CACb,cAAc;CACd,WAAW;CACX,WAAW;CACX,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,aAAa;CACb,IAAI;CACJ,MAAM;CACN,QAAQ;CACR,SAAS;CACT,OAAO;CACP,WAAW;CACX,UAAU;CACV,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,MAAM;CACN,MAAM;CACN,OAAO;CACP,WAAW;CACX,YAAY;CACZ,OAAO;CACP,UAAU;CACV,aAAa;CACb,UAAU;CAGV,OAA0B,QAAwB,QAAQ;CAC1D,QAA2B,QAAyB,SAAS;CAC7D,MAAyB,QAAuB,OAAO;CACvD,QAA2B,QAAyB,SAAS;CAG7D,YAA+B,QAA8B,cAAc;CAC3E,YAA+B,QAA8B,cAAc;CAC3E,UAA6B,QAA4B,YAAY;CACrE,UAA6B,QAA4B,YAAY;CACrE,WAA8B,QAA6B,aAAa;CACxE,WAA8B,QAA6B,aAAa;CACxE,YAA+B,QAA8B,cAAc;CAC3E,YAA+B,QAA8B,cAAc;CAC3E,aAAgC,QAA+B,eAAe;CAC9E,aAAgC,QAA+B,eAAe;CAC9E,WAA8B,QAA6B,aAAa;CACxE,WAA8B,QAA6B,aAAa;CAGxE,eAAkC,QAAkC,kBAAkB;CACtF,iBAAoC,QAAoC,oBAAoB;AAC7F;AAMA,MAAM,8BAAc,IAAI,IAAI;CAC3B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAED,MAAM,YAAY;CACjB,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;AACR;AAEA,MAAM,YAAY;AAElB,MAAM,aAAa;CAClB,QAAQ;CACR,KAAK;CACL,OAAO;CACP,OAAO;CACP,WAAW;CACX,SAAS;AACV;AAEA,MAAM,mBAAmB;CACxB,IAAI;CACJ,MAAM;CACN,OAAO;CACP,MAAM;AACP;AAEA,MAAM,wBAAwB;CAC7B,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,MAAM;CACN,KAAK;AACN;AAEA,MAAM,mDAAmC,IAAI,IAAoB;CAChE,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,EAAE;CACV,CAAC,OAAO,iBAAiB,IAAI;CAC7B,CAAC,OAAO,iBAAiB,KAAK;CAC9B,CAAC,OAAO,iBAAiB,EAAE;CAC3B,CAAC,OAAO,iBAAiB,IAAI;CAC7B,CAAC,OAAO,sBAAsB,MAAM;CACpC,CAAC,OAAO,sBAAsB,QAAQ;CACtC,CAAC,OAAO,sBAAsB,IAAI;CAClC,CAAC,OAAO,sBAAsB,GAAG;CACjC,CAAC,OAAO,sBAAsB,MAAM;CACpC,CAAC,OAAO,sBAAsB,MAAM;AACrC,CAAC;AAED,SAAS,kCAAkC,WAA2B;CACrE,OAAO,iCAAiC,IAAI,SAAS,KAAK;AAC3D;AAEA,SAAS,wCAAwC,WAAmB,UAA0B;CAE7F,KAD0B,WAAW,OACZ,UAAU,WAAW,KAAK,aAAa,MAAM,aAAa,IAClF,OAAO,YAAY;CAEpB,OAAO;AACR;AAEA,MAAM,uBAAuB;CAC5B,IAAI,CAAC,UAAU,QAAQ;CACvB,MAAM,CAAC,UAAU,QAAQ;CACzB,OAAO,CAAC,UAAU,QAAQ;CAC1B,MAAM,CAAC,UAAU,QAAQ;CACzB,MAAM;EAAC;EAAU;EAAU;EAAW;CAAS;CAC/C,KAAK;EAAC;EAAU;EAAU;EAAW;CAAS;CAC9C,QAAQ,CAAC,SAAS;CAClB,QAAQ,CAAC,SAAS;CAClB,QAAQ,CAAC,WAAW,UAAU;CAC9B,UAAU,CAAC,WAAW,UAAU;CAChC,OAAO,CAAC,UAAU,QAAQ;CAC1B,IAAI;EAAC;EAAU;EAAY;CAAS;CACpC,IAAI;EAAC;EAAU;EAAY;CAAS;CACpC,IAAI;EAAC;EAAU;EAAY;CAAS;CACpC,IAAI;EAAC;EAAU;EAAY;CAAS;CACpC,IAAI,CAAC,YAAY,SAAS;CAC1B,IAAI,CAAC,UAAU;CACf,IAAI,CAAC,UAAU;CACf,IAAI,CAAC,UAAU;CACf,IAAI,CAAC,UAAU;CACf,KAAK,CAAC,UAAU;CAChB,KAAK,CAAC,UAAU;CAChB,KAAK,CAAC,UAAU;AACjB;AAEA,MAAM,yBAAyB;CAC9B,IAAI,CAAC,QAAQ;CACb,MAAM,CAAC,QAAQ;CACf,OAAO,CAAC,QAAQ;CAChB,MAAM,CAAC,QAAQ;CACf,OAAO,CAAC,QAAQ;CAChB,QAAQ,CAAC,SAAS;CAClB,QAAQ,CAAC,SAAS;CAClB,QAAQ,CAAC,SAAS;CAClB,UAAU,CAAC,SAAS;CACpB,MAAM,CAAC,SAAS;CAChB,KAAK,CAAC,SAAS;AAChB;AAEA,MAAM,wBAAwB;CAC7B,IAAI,CAAC,QAAQ;CACb,MAAM,CAAC,QAAQ;CACf,OAAO,CAAC,QAAQ;CAChB,MAAM,CAAC,QAAQ;CACf,OAAO,CAAC,QAAQ;CAChB,QAAQ,CAAC,SAAS;CAClB,QAAQ,CAAC,SAAS;CAClB,QAAQ,CAAC,SAAS;CAClB,UAAU,CAAC,SAAS;CACpB,MAAM,CAAC,SAAS;CAChB,KAAK,CAAC,SAAS;AAChB;AAEA,MAAM,0BAAiD;CACtD,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,YAAY;CACZ,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;AACV;AAIA,MAAM,yBAAyB,MAAc,cAA0C,UAAU,SAAS,IAAI;AAE9G,MAAM,iCAAiC,MAAc,KAAwB,aAA8B;CAC1G,IAAI,aAAa,UAAU,OAC1B,OAAO,sBAAsB,MAAM,uBAAuB,IAAI;CAE/D,IAAI,aAAa,UAAU,MAC1B,OAAO,sBAAsB,MAAM,sBAAsB,IAAI;CAE9D,OAAO;AACR;;;;;AAgCA,SAAgB,aAAa,MAAuB;CAKnD,IAAI,KAAK,SAAS,WAAW,GAC5B,OAAO;CAKR,IACC,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,GAEnB,OAAO;CAER,OAAO;AACR;;;;;AAMA,SAAgB,YAAY,MAAuB;CAGlD,IAAI,KAAK,SAAS,WAAW,GAC5B,OAAO;CAGR,IACC,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,KACnB,KAAK,SAAS,KAAK,GAEnB,OAAO;CAER,OAAO;AACR;AAEA,SAAS,eAAe,cAAgD;CACvE,IAAI,CAAC,cAAc,OAAO;CAC1B,MAAM,YAAY,SAAS,cAAc,EAAE;CAC3C,IAAI,cAAc,GAAG,OAAO;CAC5B,IAAI,cAAc,GAAG,OAAO;CAC5B,OAAO;AACR;AAEA,SAAS,mBAAmB,MAA0C;CAWrE,MAAM,YAAY,KAAK,MAAM,4DAA4D;CACzF,IAAI,WAAW;EACd,MAAM,YAAY,SAAS,UAAU,IAAK,EAAE;EAC5C,MAAM,aAAa,UAAU,MAAM,UAAU,EAAE,CAAC,SAAS,IAAI,SAAS,UAAU,IAAI,EAAE,IAAI,KAAA;EAC1F,MAAM,gBAAgB,UAAU,KAAK,SAAS,UAAU,IAAI,EAAE,IAAI,KAAA;EAClE,MAAM,WAAW,UAAU,KAAK,SAAS,UAAU,IAAI,EAAE,IAAI;EAC7D,MAAM,YAAY,eAAe,UAAU,EAAE;EAE7C,OAAO;GAAE;GAAW;GAAY;GAAe,UAAU,WAAW;GAAG;EAAU;CAClF;CAGA,MAAM,aAAa,KAAK,MAAM,oCAAoC;CAClE,IAAI,YAAY;EACf,MAAM,WAAW,SAAS,WAAW,IAAK,EAAE;EAC5C,MAAM,YAAY,eAAe,WAAW,EAAE;EAG9C,OAAO;GAAE,WAAW;IAFyB,GAAG;IAAI,GAAG;IAAI,GAAG;IAAI,GAAG;GAExC,EAAE,WAAW;GAAO,UAAU,WAAW;GAAG;EAAU;CACpF;CAGA,MAAM,YAAY,KAAK,MAAM,sCAAsC;CACnE,IAAI,WAAW;EACd,MAAM,SAAS,SAAS,UAAU,IAAK,EAAE;EACzC,MAAM,WAAW,UAAU,KAAK,SAAS,UAAU,IAAI,EAAE,IAAI;EAC7D,MAAM,YAAY,eAAe,UAAU,EAAE;EAS7C,MAAM,YAAY;GAPjB,GAAG,sBAAsB;GACzB,GAAG,sBAAsB;GACzB,GAAG,sBAAsB;GACzB,GAAG,sBAAsB;GACzB,GAAG,sBAAsB;GACzB,GAAG,sBAAsB;EAEA,EAAE;EAC5B,IAAI,cAAc,KAAA,GAEjB,OAAO;GAAE;GAAW,UAAU,WAAW;GAAG;EAAU;CAExD;CAGA,MAAM,eAAe,KAAK,MAAM,kCAAkC;CAClE,IAAI,cAAc;EACjB,MAAM,WAAW,SAAS,aAAa,IAAK,EAAE;EAC9C,MAAM,YAAY,eAAe,aAAa,EAAE;EAGhD,OAAO;GAAE,WAFS,aAAa,OAAO,MAAM,sBAAsB,OAAO,sBAAsB;GAE3E,UAAU,WAAW;GAAG;EAAU;CACvD;CAEA,OAAO;AACR;AAEA,SAAS,qBAAqB,MAAc,mBAA2B,kBAAmC;CACzG,MAAM,SAAS,mBAAmB,IAAI;CACtC,IAAI,CAAC,QAAQ,OAAO;CAKpB,KAJkB,OAAO,WAAW,WAChB,mBAAmB,OAGR,OAAO;CAEtC,MAAM,sBAAsB,wCAC3B,kCAAkC,OAAO,SAAS,GAClD,OAAO,QACR;CAOA,IAAI,wBANgC,wCACnC,kCAAkC,iBAAiB,GACnD,gBAIqD,GAAG,OAAO;CAchE,IAAI,OAAO,kBAAkB,KAAA,KAAa,OAAO,kBAAkB,mBAAmB;EACrF,MAAM,KAAK;EACX,MAAM,gBAAgB,MAAM,MAAM,MAAM;EACxC,MAAM,gBAAgB,YAAY,IAAI,OAAO,aAAa,EAAE,CAAC;EAC7D,IAAI,CAAC,iBAAiB,CAAC,eAAe,OAAO;CAC9C;CAEA,OAAO;AACR;AAEA,SAAS,6BAA6B,MAAoD;CACzF,MAAM,QAAQ,KAAK,MAAM,yBAAyB;CAClD,IAAI,CAAC,OAAO,OAAO;CACnB,MAAM,WAAW,SAAS,MAAM,IAAK,EAAE;CAEvC,OAAO;EAAE,WADS,SAAS,MAAM,IAAK,EACrB;EAAG,UAAU,WAAW;CAAE;AAC5C;;;;;;AAOA,SAAS,uBAAuB,MAAc,iBAAyB,kBAAmC;CACzG,MAAM,SAAS,6BAA6B,IAAI;CAChD,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO,OAAO,cAAc,mBAAmB,OAAO,aAAa;AACpE;AAEA,SAAS,2BAAoC;CAC5C,OACC,QAAQ,QAAQ,IAAI,UAAU,KAAK,CAAC,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,IAAI;AAE5G;;;;;;;;;;AAWA,SAAS,oBAAoB,MAAc,kBAAmC;CAC7E,IAAI,SAAS,KAAQ,OAAO,qBAAqB;CACjD,IAAI,SAAS,MAAQ,OAAO;CAC5B,OAAO,yBAAyB,IAAI,qBAAqB,UAAU,OAAO,qBAAqB;AAChG;;;;;;;;;;AAeA,SAAS,YAAY,KAA4B;CAChD,MAAM,OAAO,IAAI,YAAY;CAC7B,MAAM,OAAO,KAAK,WAAW,CAAC;CAC9B,IAAK,QAAQ,MAAM,QAAQ,OAAQ,SAAS,OAAO,SAAS,QAAQ,SAAS,OAAO,SAAS,KAC5F,OAAO,OAAO,aAAa,OAAO,EAAI;CAGvC,IAAI,SAAS,KACZ,OAAO,OAAO,aAAa,EAAE;CAE9B,OAAO;AACR;AAEA,SAAS,WAAW,KAAsB;CACzC,OAAO,OAAO,OAAO,OAAO;AAC7B;AAEA,SAAS,gCAAgC,MAAc,iBAAyB,kBAAmC;CAClH,IAAI,qBAAqB,GAAG,OAAO;CACnC,MAAM,SAAS,6BAA6B,IAAI;CAChD,IAAI,CAAC,UAAU,OAAO,aAAa,kBAAkB,OAAO;CAC5D,OACC,wCAAwC,OAAO,WAAW,OAAO,QAAQ,MACzE,wCAAwC,iBAAiB,gBAAgB;AAE3E;AAEA,SAAS,2BAA2B,SAAiB,UAAsC;CAC1F,MAAM,OAAiB,CAAC;CACxB,MAAM,eAAe,WAAW;CAEhC,KAAK,eAAe,EADU,UAAU,QAAQ,UAAU,OAAO,UAAU,MAAM,UAAU,YAC3C,GAAG,OAAO,KAAA;CAC1D,IAAI,eAAe,UAAU,OAAO,KAAK,KAAK,OAAO;CACrD,IAAI,eAAe,UAAU,MAAM,KAAK,KAAK,MAAM;CACnD,IAAI,eAAe,UAAU,KAAK,KAAK,KAAK,KAAK;CACjD,IAAI,eAAe,UAAU,OAAO,KAAK,KAAK,OAAO;CACrD,OAAO,KAAK,SAAS,IAAI,GAAG,KAAK,KAAK,GAAG,EAAE,GAAG,YAAY;AAC3D;AAEA,SAAS,WACR,OACsF;CACtF,MAAM,QAAQ,MAAM,YAAY,CAAC,CAAC,MAAM,GAAG;CAC3C,MAAM,MAAM,MAAM,MAAM,SAAS;CACjC,IAAI,CAAC,KAAK,OAAO;CACjB,OAAO;EACN;EACA,MAAM,MAAM,SAAS,MAAM;EAC3B,OAAO,MAAM,SAAS,OAAO;EAC7B,KAAK,MAAM,SAAS,KAAK;EACzB,OAAO,MAAM,SAAS,OAAO;CAC9B;AACD;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,WAAW,MAAc,OAAuB;CAC/D,MAAM,SAAS,WAAW,KAAK;CAC/B,IAAI,CAAC,QAAQ,OAAO;CAEpB,MAAM,EAAE,KAAK,MAAM,OAAO,KAAK,OAAO,kBAAkB;CACxD,IAAI,WAAW;CACf,IAAI,OAAO,YAAY,UAAU;CACjC,IAAI,KAAK,YAAY,UAAU;CAC/B,IAAI,MAAM,YAAY,UAAU;CAChC,IAAI,eAAe,YAAY,UAAU;CAEzC,QAAQ,KAAR;EACC,KAAK;EACL,KAAK;GACJ,IAAI,aAAa,GAAG,OAAO;GAC3B,OACC,SAAS,UACT,qBAAqB,MAAM,WAAW,QAAQ,CAAC,KAC/C,uBAAuB,MAAM,WAAW,QAAQ,CAAC;EAGnD,KAAK;GACJ,IAAI,CAAC,sBAAsB;IAC1B,IAAI,aAAa,UAAU,QAAQ,SAAS,MAC3C,OAAO;IAER,IAAI,aAAa,UAAU,OAAO,SAAS,SAC1C,OAAO;GAET;GACA,IAAI,aAAa,GAChB,OACC,SAAS,OACT,qBAAqB,MAAM,WAAW,OAAO,CAAC,KAC9C,uBAAuB,MAAM,WAAW,OAAO,CAAC;GAGlD,OACC,qBAAqB,MAAM,WAAW,OAAO,QAAQ,KACrD,uBAAuB,MAAM,WAAW,OAAO,QAAQ;EAGzD,KAAK;GACJ,IAAI,aAAa,UAAU,OAC1B,OACC,SAAS,YACT,qBAAqB,MAAM,WAAW,KAAK,UAAU,KAAK,KAC1D,uBAAuB,MAAM,WAAW,KAAK,UAAU,KAAK;GAG9D,IAAI,aAAa,GAChB,OAAO,SAAS,OAAQ,qBAAqB,MAAM,WAAW,KAAK,CAAC;GAErE,OACC,qBAAqB,MAAM,WAAW,KAAK,QAAQ,KACnD,uBAAuB,MAAM,WAAW,KAAK,QAAQ;EAGvD,KAAK;EACL,KAAK;GACJ,IAAI,aAAa,UAAU,OAAO;IAEjC,IACC,qBAAqB,MAAM,WAAW,OAAO,UAAU,KAAK,KAC5D,qBAAqB,MAAM,WAAW,SAAS,UAAU,KAAK,GAE9D,OAAO;IAGR,IAAI,uBAAuB,MAAM,WAAW,OAAO,UAAU,KAAK,GACjE,OAAO;IAKR,IAAI,sBACH,OAAO,SAAS,YAAY,SAAS;IAEtC,OAAO;GACR;GACA,IAAI,aAAa,UAAU,KAAK;IAE/B,IACC,qBAAqB,MAAM,WAAW,OAAO,UAAU,GAAG,KAC1D,qBAAqB,MAAM,WAAW,SAAS,UAAU,GAAG,GAE5D,OAAO;IAGR,IAAI,uBAAuB,MAAM,WAAW,OAAO,UAAU,GAAG,GAC/D,OAAO;IAIR,IAAI,CAAC,sBACJ,OAAO,SAAS;IAEjB,OAAO;GACR;GACA,IAAI,aAAa,GAChB,OACC,SAAS,QACR,CAAC,wBAAwB,SAAS,QACnC,SAAS,YACT,qBAAqB,MAAM,WAAW,OAAO,CAAC,KAC9C,qBAAqB,MAAM,WAAW,SAAS,CAAC;GAGlD,OACC,qBAAqB,MAAM,WAAW,OAAO,QAAQ,KACrD,qBAAqB,MAAM,WAAW,SAAS,QAAQ,KACvD,uBAAuB,MAAM,WAAW,OAAO,QAAQ;EAGzD,KAAK;GACJ,IAAI,aAAa,UAAU,KAAK;IAC/B,IAAI,SAAS,WAAc,SAAS,UACnC,OAAO;IAER,OACC,qBAAqB,MAAM,WAAW,WAAW,UAAU,GAAG,KAC9D,uBAAuB,MAAM,WAAW,WAAW,UAAU,GAAG;GAElE;GACA,IAAI,aAAa,UAAU,MAAM;IAIhC,IAAI,oBAAoB,MAAM,UAAU,IAAI,GAAG,OAAO;IACtD,OACC,qBAAqB,MAAM,WAAW,WAAW,UAAU,IAAI,KAC/D,uBAAuB,MAAM,WAAW,WAAW,UAAU,IAAI;GAEnE;GACA,IAAI,aAAa,GAChB,OACC,oBAAoB,MAAM,CAAC,KAC3B,qBAAqB,MAAM,WAAW,WAAW,CAAC,KAClD,uBAAuB,MAAM,WAAW,WAAW,CAAC;GAGtD,OACC,qBAAqB,MAAM,WAAW,WAAW,QAAQ,KACzD,uBAAuB,MAAM,WAAW,WAAW,QAAQ;EAG7D,KAAK;GACJ,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,MAAM,KACvD,qBAAqB,MAAM,sBAAsB,QAAQ,CAAC;GAG5D,IAAI,8BAA8B,MAAM,UAAU,QAAQ,GACzD,OAAO;GAER,OAAO,qBAAqB,MAAM,sBAAsB,QAAQ,QAAQ;EAEzE,KAAK;GACJ,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,MAAM,KACvD,qBAAqB,MAAM,sBAAsB,QAAQ,CAAC;GAG5D,IAAI,8BAA8B,MAAM,UAAU,QAAQ,GACzD,OAAO;GAER,OAAO,qBAAqB,MAAM,sBAAsB,QAAQ,QAAQ;EAEzE,KAAK;GACJ,IAAI,aAAa,GAChB,OAAO,sBAAsB,MAAM,qBAAqB,KAAK;GAE9D,OAAO,8BAA8B,MAAM,SAAS,QAAQ;EAE7D,KAAK;GACJ,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,IAAI,KACrD,qBAAqB,MAAM,sBAAsB,MAAM,CAAC;GAG1D,IAAI,8BAA8B,MAAM,QAAQ,QAAQ,GACvD,OAAO;GAER,OAAO,qBAAqB,MAAM,sBAAsB,MAAM,QAAQ;EAEvE,KAAK;GACJ,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,GAAG,KACpD,qBAAqB,MAAM,sBAAsB,KAAK,CAAC;GAGzD,IAAI,8BAA8B,MAAM,OAAO,QAAQ,GACtD,OAAO;GAER,OAAO,qBAAqB,MAAM,sBAAsB,KAAK,QAAQ;EAEtE,KAAK;GACJ,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,MAAM,KACvD,qBAAqB,MAAM,sBAAsB,QAAQ,CAAC;GAG5D,IAAI,8BAA8B,MAAM,UAAU,QAAQ,GACzD,OAAO;GAER,OAAO,qBAAqB,MAAM,sBAAsB,QAAQ,QAAQ;EAEzE,KAAK;GACJ,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,QAAQ,KACzD,qBAAqB,MAAM,sBAAsB,UAAU,CAAC;GAG9D,IAAI,8BAA8B,MAAM,YAAY,QAAQ,GAC3D,OAAO;GAER,OAAO,qBAAqB,MAAM,sBAAsB,UAAU,QAAQ;EAE3E,KAAK;GACJ,IAAI,aAAa,UAAU,KAC1B,OAAO,SAAS,WAAW,qBAAqB,MAAM,iBAAiB,IAAI,UAAU,GAAG;GAEzF,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,EAAE,KACnD,qBAAqB,MAAM,iBAAiB,IAAI,CAAC;GAGnD,IAAI,8BAA8B,MAAM,MAAM,QAAQ,GACrD,OAAO;GAER,OAAO,qBAAqB,MAAM,iBAAiB,IAAI,QAAQ;EAEhE,KAAK;GACJ,IAAI,aAAa,UAAU,KAC1B,OAAO,SAAS,WAAW,qBAAqB,MAAM,iBAAiB,MAAM,UAAU,GAAG;GAE3F,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,IAAI,KACrD,qBAAqB,MAAM,iBAAiB,MAAM,CAAC;GAGrD,IAAI,8BAA8B,MAAM,QAAQ,QAAQ,GACvD,OAAO;GAER,OAAO,qBAAqB,MAAM,iBAAiB,MAAM,QAAQ;EAElE,KAAK;GACJ,IAAI,aAAa,UAAU,KAC1B,OACC,SAAS,eACR,CAAC,wBAAwB,SAAS,WACnC,SAAS,WACT,qBAAqB,MAAM,iBAAiB,MAAM,UAAU,GAAG;GAGjE,IAAI,aAAa,UAAU,MAC1B,OACC,SAAS,eACT,8BAA8B,MAAM,QAAQ,UAAU,IAAI,KAC1D,qBAAqB,MAAM,iBAAiB,MAAM,UAAU,IAAI;GAGlE,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,IAAI,KACrD,qBAAqB,MAAM,iBAAiB,MAAM,CAAC;GAGrD,IAAI,8BAA8B,MAAM,QAAQ,QAAQ,GACvD,OAAO;GAER,OAAO,qBAAqB,MAAM,iBAAiB,MAAM,QAAQ;EAElE,KAAK;GACJ,IAAI,aAAa,UAAU,KAC1B,OACC,SAAS,eACR,CAAC,wBAAwB,SAAS,WACnC,SAAS,WACT,qBAAqB,MAAM,iBAAiB,OAAO,UAAU,GAAG;GAGlE,IAAI,aAAa,UAAU,MAC1B,OACC,SAAS,eACT,8BAA8B,MAAM,SAAS,UAAU,IAAI,KAC3D,qBAAqB,MAAM,iBAAiB,OAAO,UAAU,IAAI;GAGnE,IAAI,aAAa,GAChB,OACC,sBAAsB,MAAM,qBAAqB,KAAK,KACtD,qBAAqB,MAAM,iBAAiB,OAAO,CAAC;GAGtD,IAAI,8BAA8B,MAAM,SAAS,QAAQ,GACxD,OAAO;GAER,OAAO,qBAAqB,MAAM,iBAAiB,OAAO,QAAQ;EAEnE,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;GACJ,IAAI,aAAa,GAChB,OAAO;GAGR,OAAO,sBAAsB,MAAM,qBAAqBA,IAAY;CAEtE;CAGA,IAAI,IAAI,WAAW,MAAO,OAAO,OAAO,OAAO,OAAQ,WAAW,GAAG,KAAK,YAAY,IAAI,GAAG,IAAI;EAChG,MAAM,YAAY,IAAI,WAAW,CAAC;EAClC,MAAM,UAAU,YAAY,GAAG;EAC/B,MAAM,WAAW,OAAO,OAAO,OAAO;EACtC,MAAM,UAAU,WAAW,GAAG;EAE9B,IAAI,aAAa,UAAU,OAAO,UAAU,OAAO,CAAC,wBAAwB,SAIvE;OAAA,SAAS,OAAO,WAAW,OAAO;EAAA;EAGvC,IAAI,aAAa,UAAU,OAAO,CAAC,yBAAyB,YAAY,WAAW,YAAY,IAAI,GAAG,IAEjG;OAAA,SAAS,OAAO,OAAO,OAAO;EAAA;EAGnC,IAAI,aAAa,UAAU,MAAM;GAEhC,IAAI,WAAW,SAAS,SAAS,OAAO;GACxC,OACC,qBAAqB,MAAM,WAAW,UAAU,IAAI,KACpD,gCAAgC,MAAM,WAAW,UAAU,IAAI;EAEjE;EAEA,IAAI,aAAa,UAAU,QAAQ,UAAU,MAC5C,OACC,qBAAqB,MAAM,WAAW,UAAU,QAAQ,UAAU,IAAI,KACtE,gCAAgC,MAAM,WAAW,UAAU,QAAQ,UAAU,IAAI;EAInF,IAAI,aAAa,UAAU,OAAO;GAEjC,IAAI,YAAY,SAAS,IAAI,YAAY,GAAG,OAAO;GACnD,OACC,qBAAqB,MAAM,WAAW,UAAU,KAAK,KACrD,gCAAgC,MAAM,WAAW,UAAU,KAAK;EAElE;EAEA,IAAI,aAAa,GAChB,OACC,qBAAqB,MAAM,WAAW,QAAQ,KAC9C,gCAAgC,MAAM,WAAW,QAAQ;EAK3D,OAAO,SAAS,OAAO,qBAAqB,MAAM,WAAW,CAAC;CAC/D;CAEA,OAAO;AACR;;;;;;;AAQA,SAAS,gBAAgB,WAAmB,UAAkB,eAA4C;CAEzG,MAAM,oBAAoB,wCADE,kCAAkC,SACsB,GAAG,QAAQ;CAO/F,MAAM,gBAAgB,qBAAqB,MAAM,qBAAqB;CACtE,MAAM,UAAU,qBAAqB,MAAM,qBAAqB;CAChE,MAAM,gBAAgB,YAAY,IAAI,OAAO,aAAa,iBAAiB,CAAC;CAC5E,MAAM,qBACL,iBAAiB,WAAW,gBAAgB,oBAAqB,iBAAiB;CAEnF,IAAI;CACJ,IAAI,uBAAuB,WAAW,QAAQ,UAAU;MACnD,IAAI,uBAAuB,WAAW,KAAK,UAAU;MACrD,IAAI,uBAAuB,WAAW,SAAS,uBAAuB,WAAW,SAAS,UAAU;MACpG,IAAI,uBAAuB,WAAW,OAAO,UAAU;MACvD,IAAI,uBAAuB,WAAW,WAAW,UAAU;MAC3D,IAAI,uBAAuB,sBAAsB,QAAQ,UAAU;MACnE,IAAI,uBAAuB,sBAAsB,QAAQ,UAAU;MACnE,IAAI,uBAAuB,sBAAsB,MAAM,UAAU;MACjE,IAAI,uBAAuB,sBAAsB,KAAK,UAAU;MAChE,IAAI,uBAAuB,sBAAsB,QAAQ,UAAU;MACnE,IAAI,uBAAuB,sBAAsB,UAAU,UAAU;MACrE,IAAI,uBAAuB,iBAAiB,IAAI,UAAU;MAC1D,IAAI,uBAAuB,iBAAiB,MAAM,UAAU;MAC5D,IAAI,uBAAuB,iBAAiB,MAAM,UAAU;MAC5D,IAAI,uBAAuB,iBAAiB,OAAO,UAAU;MAC7D,IAAI,sBAAsB,MAAM,sBAAsB,IAAI,UAAU,OAAO,aAAa,kBAAkB;MAC1G,IAAI,sBAAsB,MAAM,sBAAsB,KAAK,UAAU,OAAO,aAAa,kBAAkB;MAC3G,IAAI,YAAY,IAAI,OAAO,aAAa,kBAAkB,CAAC,GAAG,UAAU,OAAO,aAAa,kBAAkB;CAEnH,IAAI,CAAC,SAAS,OAAO,KAAA;CACrB,OAAO,2BAA2B,SAAS,QAAQ;AACpD;AAEA,SAAgB,SAAS,MAAkC;CAC1D,MAAM,QAAQ,mBAAmB,IAAI;CACrC,IAAI,OACH,OAAO,gBAAgB,MAAM,WAAW,MAAM,UAAU,MAAM,aAAa;CAG5E,MAAM,kBAAkB,6BAA6B,IAAI;CACzD,IAAI,iBACH,OAAO,gBAAgB,gBAAgB,WAAW,gBAAgB,QAAQ;CAO3E,IAAI,sBACC;MAAA,SAAS,YAAY,SAAS,MAAM,OAAO;CAAA;CAGhD,MAAM,sBAAsB,wBAAwB;CACpD,IAAI,qBAAqB,OAAO;CAGhC,IAAI,SAAS,QAAQ,OAAO;CAC5B,IAAI,SAAS,KAAQ,OAAO;CAC5B,IAAI,SAAS,KAAQ,OAAO;CAC5B,IAAI,SAAS,KAAQ,OAAO;CAC5B,IAAI,SAAS,YAAY,OAAO;CAChC,IAAI,SAAS,SAAY,OAAO;CAChC,IAAI,SAAS,SAAY,OAAO;CAChC,IAAI,SAAS,SAAY,OAAO;CAChC,IAAI,SAAS,KAAM,OAAO;CAC1B,IAAI,SAAS,QAAS,CAAC,wBAAwB,SAAS,QAAS,SAAS,UAAU,OAAO;CAC3F,IAAI,SAAS,MAAQ,OAAO;CAC5B,IAAI,SAAS,KAAK,OAAO;CACzB,IAAI,SAAS,KAAQ,OAAO;CAC5B,IAAI,SAAS,MAAQ,OAAO,yBAAyB,IAAI,mBAAmB;CAC5E,IAAI,SAAS,UAAU,OAAO;CAC9B,IAAI,CAAC,wBAAwB,SAAS,UAAU,OAAO;CACvD,IAAI,CAAC,wBAAwB,SAAS,SAAS,OAAO;CACtD,IAAI,SAAS,WAAc,SAAS,UAAU,OAAO;CACrD,IAAI,CAAC,wBAAwB,SAAS,SAAS,OAAO;CACtD,IAAI,CAAC,wBAAwB,SAAS,SAAS,OAAO;CACtD,IAAI,CAAC,wBAAwB,KAAK,WAAW,KAAK,KAAK,OAAO,QAAQ;EACrE,MAAM,OAAO,KAAK,WAAW,CAAC;EAC9B,IAAI,QAAQ,KAAK,QAAQ,IACxB,OAAO,YAAY,OAAO,aAAa,OAAO,EAAE;EAGjD,MAAM,MAAM,OAAO,aAAa,IAAI;EACpC,IAAK,QAAQ,MAAM,QAAQ,OAAS,QAAQ,MAAM,QAAQ,MAAO,YAAY,IAAI,GAAG,GACnF,OAAO,OAAO;CAEhB;CACA,IAAI,SAAS,UAAU,OAAO;CAC9B,IAAI,SAAS,UAAU,OAAO;CAC9B,IAAI,SAAS,UAAU,OAAO;CAC9B,IAAI,SAAS,UAAU,OAAO;CAC9B,IAAI,SAAS,YAAY,SAAS,UAAU,OAAO;CACnD,IAAI,SAAS,YAAY,SAAS,UAAU,OAAO;CACnD,IAAI,SAAS,WAAW,OAAO;CAC/B,IAAI,SAAS,WAAW,OAAO;CAC/B,IAAI,SAAS,WAAW,OAAO;CAG/B,IAAI,KAAK,WAAW,GAAG;EACtB,MAAM,OAAO,KAAK,WAAW,CAAC;EAC9B,IAAI,QAAQ,KAAK,QAAQ,IACxB,OAAO,QAAQ,OAAO,aAAa,OAAO,EAAE;EAE7C,IAAI,QAAQ,MAAM,QAAQ,KACzB,OAAO;CAET;AAGD;AAMA,MAAM,oBAAoB;AAC1B,MAAM,oCAAoC,UAAU,QAAQ;;;;;;;;;;;;;;;AAgB5D,SAAgB,qBAAqB,MAAkC;CACtE,MAAM,QAAQ,KAAK,MAAM,iBAAiB;CAC1C,IAAI,CAAC,OAAO,OAAO,KAAA;CAGnB,MAAM,YAAY,OAAO,SAAS,MAAM,MAAM,IAAI,EAAE;CACpD,IAAI,CAAC,OAAO,SAAS,SAAS,GAAG,OAAO,KAAA;CAExC,MAAM,aAAa,MAAM,MAAM,MAAM,EAAE,CAAC,SAAS,IAAI,OAAO,SAAS,MAAM,IAAI,EAAE,IAAI,KAAA;CACrF,MAAM,WAAW,MAAM,KAAK,OAAO,SAAS,MAAM,IAAI,EAAE,IAAI;CAE5D,MAAM,WAAW,OAAO,SAAS,QAAQ,IAAI,WAAW,IAAI;CAK5D,KAAK,WAAW,CAAC,uCAAuC,GAAG,OAAO,KAAA;CAClE,IAAI,YAAY,UAAU,MAAM,UAAU,OAAO,OAAO,KAAA;CAGxD,IAAI,qBAAqB;CACzB,IAAI,WAAW,UAAU,SAAS,OAAO,eAAe,UACvD,qBAAqB;CAEtB,qBAAqB,kCAAkC,kBAAkB;CAEzE,IAAI,CAAC,OAAO,SAAS,kBAAkB,KAAK,qBAAqB,IAAI,OAAO,KAAA;CAE5E,IAAI;EACH,OAAO,OAAO,cAAc,kBAAkB;CAC/C,QAAQ;EACP;CACD;AACD;;;AC91CA,SAAS,SAAS,KAAuB;CACxC,MAAM,aAAa,IAAI,WAAW,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI;CAIxD,OAAO;EAAE,GAHC,SAAS,WAAW,MAAM,GAAG,CAAC,GAAG,EAGlC;EAAG,GAFF,SAAS,WAAW,MAAM,GAAG,CAAC,GAAG,EAE/B;EAAG,GADL,SAAS,WAAW,MAAM,GAAG,CAAC,GAAG,EAC5B;CAAE;AAClB;AAEA,SAAS,mBAAmB,SAAqC;CAChE,IAAI,CAAC,eAAe,KAAK,OAAO,GAC/B;CAED,MAAM,MAAM,MAAM,QAAQ,SAAS;CACnC,IAAI,OAAO,GACV;CAED,OAAO,KAAK,MAAO,SAAS,SAAS,EAAE,IAAI,MAAO,GAAG;AACtD;AAEA,MAAM,0CAA0C;AAChD,MAAM,8BAA8B;AAMpC,SAAgB,0BAA0B,MAAoC;CAC7E,MAAM,QAAQ,KAAK,MAAM,uCAAuC;CAChE,IAAI,CAAC,OACJ;CAGD,MAAM,QAAQ,MAAM,EAAE,CAAC,KAAK;CAC5B,IAAI,MAAM,WAAW,GAAG,GAAG;EAC1B,MAAM,MAAM,MAAM,MAAM,CAAC;EACzB,IAAI,iBAAiB,KAAK,GAAG,GAC5B,OAAO,SAAS,KAAK;EAEtB,IAAI,kBAAkB,KAAK,GAAG,GAAG;GAChC,MAAM,IAAI,mBAAmB,IAAI,MAAM,GAAG,CAAC,CAAC;GAC5C,MAAM,IAAI,mBAAmB,IAAI,MAAM,GAAG,CAAC,CAAC;GAC5C,MAAM,IAAI,mBAAmB,IAAI,MAAM,GAAG,EAAE,CAAC;GAC7C,OAAO,MAAM,KAAA,KAAa,MAAM,KAAA,KAAa,MAAM,KAAA,IAAY;IAAE;IAAG;IAAG;GAAE,IAAI,KAAA;EAC9E;EACA;CACD;CAGA,MAAM,CAAC,KAAK,OAAO,QADF,MAAM,QAAQ,YAAY,EACT,CAAC,CAAC,MAAM,GAAG;CAC7C,IAAI,QAAQ,KAAA,KAAa,UAAU,KAAA,KAAa,SAAS,KAAA,GACxD;CAED,MAAM,IAAI,mBAAmB,GAAG;CAChC,MAAM,IAAI,mBAAmB,KAAK;CAClC,MAAM,IAAI,mBAAmB,IAAI;CACjC,OAAO,MAAM,KAAA,KAAa,MAAM,KAAA,KAAa,MAAM,KAAA,IAAY;EAAE;EAAG;EAAG;CAAE,IAAI,KAAA;AAC9E;AAEA,SAAgB,+BAA+B,MAA+C;CAC7F,MAAM,QAAQ,KAAK,MAAM,2BAA2B;CACpD,IAAI,CAAC,OACJ;CAED,OAAO,MAAM,OAAO,MAAM,UAAU;AACrC;;;ACFA,MAAa,kBAAkB;CAC9B,uBAAuB;EAAE,aAAa;EAAM,aAAa;CAAiB;CAC1E,yBAAyB;EAAE,aAAa;EAAQ,aAAa;CAAmB;CAChF,8BAA8B;EAC7B,aAAa,CAAC;EACd,aAAa;CACd;CACA,0BAA0B;EACzB,aAAa,CAAC;EACd,aAAa;CACd;CACA,yBAAyB;EACxB,aAAa,CAAC,QAAQ,QAAQ;EAC9B,aAAa;CACd;CACA,0BAA0B;EACzB,aAAa,CAAC,SAAS,QAAQ;EAC/B,aAAa;CACd;CACA,6BAA6B;EAC5B,aAAa;GAAC;GAAY;GAAa;EAAO;EAC9C,aAAa;CACd;CACA,8BAA8B;EAC7B,aAAa;GAAC;GAAa;GAAc;EAAO;EAChD,aAAa;CACd;CACA,8BAA8B;EAC7B,aAAa;GAAC;GAAQ;GAAa;EAAQ;EAC3C,aAAa;CACd;CACA,4BAA4B;EAC3B,aAAa;GAAC;GAAO;GAAY;EAAQ;EACzC,aAAa;CACd;CACA,0BAA0B;EACzB,aAAa;EACb,aAAa;CACd;CACA,2BAA2B;EAC1B,aAAa;EACb,aAAa;CACd;CACA,qBAAqB;EAAE,aAAa,CAAC,UAAU,aAAa;EAAG,aAAa;CAAU;CACtF,uBAAuB;EAAE,aAAa,CAAC,YAAY,eAAe;EAAG,aAAa;CAAY;CAC9F,iCAAiC;EAChC,aAAa;EACb,aAAa;CACd;CACA,gCAAgC;EAC/B,aAAa,CAAC,UAAU,QAAQ;EAChC,aAAa;CACd;CACA,iCAAiC;EAChC,aAAa,CAAC,UAAU,eAAe;EACvC,aAAa;CACd;CACA,gCAAgC;EAC/B,aAAa,CAAC,SAAS,YAAY;EACnC,aAAa;CACd;CACA,gCAAgC;EAC/B,aAAa;EACb,aAAa;CACd;CACA,8BAA8B;EAC7B,aAAa;EACb,aAAa;CACd;CACA,mBAAmB;EAAE,aAAa;EAAU,aAAa;CAAO;CAChE,sBAAsB;EAAE,aAAa;EAAS,aAAa;CAAW;CACtE,mBAAmB;EAAE,aAAa;EAAU,aAAa;CAAO;CAChE,qBAAqB;EAAE,aAAa,CAAC,eAAe,QAAQ;EAAG,aAAa;CAAiB;CAC7F,oBAAoB;EAAE,aAAa;EAAS,aAAa;CAAe;CACxE,iBAAiB;EAAE,aAAa;EAAO,aAAa;CAAqB;CACzE,kBAAkB;EAAE,aAAa;EAAU,aAAa;CAAiB;CACzE,iBAAiB;EAAE,aAAa;EAAM,aAAa;CAAoB;CACvE,mBAAmB;EAAE,aAAa;EAAQ,aAAa;CAAsB;CAC7E,qBAAqB;EAAE,aAAa;EAAU,aAAa;CAAoB;CAC/E,uBAAuB;EACtB,aAAa;EACb,aAAa;CACd;CACA,sBAAsB;EAAE,aAAa;EAAS,aAAa;CAAoB;CAC/E,qBAAqB;EACpB,aAAa,CAAC,UAAU,QAAQ;EAChC,aAAa;CACd;CAEA,wBAAwB;EACvB,aAAa;EACb,aAAa;CACd;CACA,0BAA0B;EACzB,aAAa;EACb,aAAa;CACd;CACA,4BAA4B;EAC3B,aAAa,CAAC;EACd,aAAa;CACd;CACA,8BAA8B;EAC7B,aAAa,CAAC;EACd,aAAa;CACd;CACA,wBAAwB;EACvB,aAAa,CAAC;EACd,aAAa;CACd;CACA,0BAA0B;EACzB,aAAa,CAAC;EACd,aAAa;CACd;CACA,gCAAgC;EAC/B,aAAa;EACb,aAAa;CACd;CACA,4BAA4B;EAC3B,aAAa;EACb,aAAa;CACd;CACA,wBAAwB;EACvB,aAAa;EACb,aAAa;CACd;CACA,4BAA4B;EAC3B,aAAa,CAAC,SAAS,QAAQ;EAC/B,aAAa;CACd;CACA,gCAAgC;EAC/B,aAAa,CAAC,eAAe,cAAc;EAC3C,aAAa;CACd;CACA,6BAA6B;EAC5B,aAAa;EACb,aAAa;CACd;CACA,qBAAqB;EAAE,aAAa;EAAQ,aAAa;CAAyB;CAClF,wBAAwB;EAAE,aAAa;EAAO,aAAa;CAA4B;AACxF;AAOA,SAAS,cAAc,MAA4C;CAClE,IAAI,SAAS,KAAA,GAAW,OAAO,CAAC;CAChC,MAAM,UAAU,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;CAClD,MAAM,uBAAO,IAAI,IAAW;CAC5B,MAAM,SAAkB,CAAC;CACzB,KAAK,MAAM,OAAO,SACjB,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG;EACnB,KAAK,IAAI,GAAG;EACZ,OAAO,KAAK,GAAG;CAChB;CAED,OAAO;AACR;AAEA,IAAa,qBAAb,MAAgC;CAC/B;CACA;CACA,2BAAmB,IAAI,IAAyB;CAChD,YAA0C,CAAC;CAE3C,YAAY,aAAoC,eAAkC,CAAC,GAAG;EACrF,KAAK,cAAc;EACnB,KAAK,eAAe;EACpB,KAAK,QAAQ;CACd;CAEA,UAAwB;EACvB,KAAK,SAAS,MAAM;EACpB,KAAK,YAAY,CAAC;EAElB,MAAM,6BAAa,IAAI,IAA4B;EACnD,KAAK,MAAM,CAAC,YAAY,SAAS,OAAO,QAAQ,KAAK,YAAY,GAAG;GACnE,IAAI,EAAE,cAAc,KAAK,cAAc;GACvC,KAAK,MAAM,OAAO,cAAc,IAAI,GAAG;IACtC,MAAM,YAAY,WAAW,IAAI,GAAG,qBAAK,IAAI,IAAgB;IAC7D,UAAU,IAAI,UAAwB;IACtC,WAAW,IAAI,KAAK,SAAS;GAC9B;EACD;EAEA,KAAK,MAAM,CAAC,KAAK,gBAAgB,YAChC,IAAI,YAAY,OAAO,GACtB,KAAK,UAAU,KAAK;GAAE;GAAK,aAAa,CAAC,GAAG,WAAW;EAAE,CAAC;EAI5D,KAAK,MAAM,CAAC,IAAI,eAAe,OAAO,QAAQ,KAAK,WAAW,GAAG;GAChE,MAAM,WAAW,KAAK,aAAa;GACnC,MAAM,OAAO,aAAa,KAAA,IAAY,cAAc,WAAW,WAAW,IAAI,cAAc,QAAQ;GACpG,KAAK,SAAS,IAAI,IAAkB,IAAI;EACzC;CACD;CAEA,QAAQ,MAAc,YAAiC;EACtD,MAAM,OAAO,KAAK,SAAS,IAAI,UAAU,KAAK,CAAC;EAC/C,KAAK,MAAM,OAAO,MACjB,IAAI,WAAW,MAAM,GAAG,GAAG,OAAO;EAEnC,OAAO;CACR;CAEA,QAAQ,YAAiC;EACxC,OAAO,CAAC,GAAI,KAAK,SAAS,IAAI,UAAU,KAAK,CAAC,CAAE;CACjD;CAEA,cAAc,YAA8C;EAC3D,OAAO,KAAK,YAAY;CACzB;CAEA,eAAqC;EACpC,OAAO,KAAK,UAAU,KAAK,cAAc;GAAE,GAAG;GAAU,aAAa,CAAC,GAAG,SAAS,WAAW;EAAE,EAAE;CAClG;CAEA,gBAAgB,cAAuC;EACtD,KAAK,eAAe;EACpB,KAAK,QAAQ;CACd;CAEA,kBAAqC;EACpC,OAAO,EAAE,GAAG,KAAK,aAAa;CAC/B;CAEA,sBAAyC;EACxC,MAAM,WAA8B,CAAC;EACrC,KAAK,MAAM,MAAM,OAAO,KAAK,KAAK,WAAW,GAAG;GAC/C,MAAM,OAAO,KAAK,SAAS,IAAI,EAAgB,KAAK,CAAC;GACrD,SAAS,MAAM,KAAK,WAAW,IAAI,KAAK,KAAM,CAAC,GAAG,IAAI;EACvD;EACA,OAAO;CACR;AACD;AAEA,IAAI,oBAA+C;AAEnD,SAAgB,eAAe,aAAuC;CACrE,oBAAoB;AACrB;AAEA,SAAgB,iBAAqC;CACpD,IAAI,CAAC,mBACJ,oBAAoB,IAAI,mBAAmB,eAAe;CAE3D,OAAO;AACR;;;AC7TA,MAAM,UAA4C;CACjD,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,SAAS;CACT,YAAY;CACZ,MAAM;CACN,KAAK;CACL,OAAO;CACP,UAAU;CACV,MAAM;CACN,OAAO;CACP,UAAU;CACV,QAAQ;CACR,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,KAAK;CACL,QAAQ;CACR,OAAO;CACP,UAAU;CACV,KAAK;CACL,SAAS;CACT,KAAK;CACL,QAAQ;CACR,KAAK;CACL,KAAK;CACL,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,SAAS;CACT,KAAK;CACL,KAAK;CACL,OAAO;CACP,IAAI;CACJ,IAAI;CACJ,OAAO;CACP,KAAK;CACL,MAAM;CACN,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,SAAS;CACT,QAAQ;CACR,SAAS;CACT,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,cAAc;CACd,eAAe;CACf,IAAI;CACJ,KAAK;CACL,KAAK;CACL,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,QAAQ;CACR,UAAU;CACV,UAAU;CACV,UAAU;CACV,WAAW;CACX,SAAS;CACT,UAAU;CACV,IAAI;CACJ,OAAO;CACP,IAAI;CACJ,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,UAAU;CACV,UAAU;CACV,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,MAAM;CACN,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,KAAK;CACL,UAAU;CACV,IAAI;CACJ,KAAK;CACL,UAAU;CACV,IAAI;CACJ,KAAK;CACL,OAAO;CACP,QAAQ;CACR,KAAK;CACL,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,QAAQ;CACR,UAAU;CACV,MAAM;CACN,KAAK;CACL,OAAO;CACP,OAAO;CACP,QAAQ;CACR,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,KAAK;CACL,MAAM;CACN,OAAO;CACP,KAAK;CACL,KAAK;CACL,IAAI;CACJ,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,eAAe;CACf,MAAM;CACN,gBAAgB;CAChB,oBAAoB;CACpB,eAAe;CACf,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACnB,eAAe;CACf,iBAAiB;CACjB,gBAAgB;CAChB,kBAAkB;CAClB,mBAAmB;CACnB,mBAAmB;CACnB,SAAS;CACT,SAAS;CACT,SAAS;CACT,SAAS;CACT,iBAAiB;CACjB,SAAS;CACT,YAAY;CACZ,gBAAgB;CAChB,WAAW;CACX,eAAe;CACf,gBAAgB;CAChB,oBAAoB;CACpB,SAAS;CACT,KAAK;CACL,QAAQ;CACR,YAAY;CACZ,SAAS;CACT,WAAW;CACX,SAAS;CACT,OAAO;CACP,KAAK;CACL,MAAM;CACN,OAAO;CACP,MAAM;CACN,KAAK;CACL,MAAM;CACN,QAAQ;CACR,OAAO;CACP,UAAU;CACV,YAAY;CACZ,OAAO;CACP,WAAW;CACX,SAAS;CACT,OAAO;CACP,MAAM;CACN,OAAO;CACP,QAAQ;CACR,KAAK;CACL,KAAK;CACL,UAAU;CACV,QAAQ;CACR,SAAS;CACT,WAAW;CACX,YAAY;CACZ,IAAI;CACJ,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,OAAO;CACP,KAAK;CACL,MAAM;CACN,IAAI;CACJ,IAAI;CACJ,QAAQ;CACR,QAAQ;CACR,MAAM;CACN,OAAO;CACP,OAAO;CACP,MAAM;CACN,OAAO;CACP,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,OAAO;AACR;AAEA,MAAM,kCAAkB,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAED,MAAM,kCAAkB,IAAI,IAAI;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAED,MAAM,wCAAwB,IAAI,IAAI;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAED,MAAM,oCAAoB,IAAI,IAAI;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAED,MAAM,kBAAoD;CACzD,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;AACN;AAEA,MAAM,aAA+C;CACpD,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACJ;AAEA,MAAM,eAAiD;CACtD,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACJ;AAEA,MAAM,aAA+C;CACpD,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,KAAK;CACL,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACJ;AAEA,MAAM,mCAAmB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AACD,MAAM,4CAA4B,IAAI,IAAI;CAAC;CAAK;CAAe;CAAiB;AAAc,CAAC;AAC/F,MAAM,iBAAiB;AACvB,MAAM,mCAAmB,IAAI,IAAI;CAChC;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AACD,MAAM,gCAAgB,IAAI,IAAI;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AACD,MAAM,iCAAiB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA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"}